]> granicus.if.org Git - vim/commitdiff
patch 8.2.4379: an empty change is reported to a listener v8.2.4379
authorBram Moolenaar <Bram@vim.org>
Mon, 14 Feb 2022 14:51:22 +0000 (14:51 +0000)
committerBram Moolenaar <Bram@vim.org>
Mon, 14 Feb 2022 14:51:22 +0000 (14:51 +0000)
Problem:    An empty change is reported to a listener.
Solution:   Do not report an empty change. (closes #9768)  Remove unused
            return value.

src/change.c
src/testdir/test_listener.vim
src/undo.c
src/version.c

index 25a0841909b978abf6fc12aeb9f274d9b0c972e1..771f7675b6790c44b4c237d1c72d07984735c58d 100644 (file)
@@ -155,9 +155,8 @@ static long next_listener_id = 0;
 /*
  * Check if the change at "lnum" is above or overlaps with an existing
  * change. If above then flush changes and invoke listeners.
- * Returns TRUE if the change was merged.
  */
-    static int
+    static void
 check_recorded_changes(
        buf_T           *buf,
        linenr_T        lnum,
@@ -185,7 +184,6 @@ check_recorded_changes(
            }
        }
     }
-    return FALSE;
 }
 
 /*
@@ -206,8 +204,7 @@ may_record_change(
 
     // If the new change is going to change the line numbers in already listed
     // changes, then flush.
-    if (check_recorded_changes(curbuf, lnum, lnume, xtra))
-       return;
+    check_recorded_changes(curbuf, lnum, lnume, xtra);
 
     if (curbuf->b_recorded_changes == NULL)
     {
index 343fb98e3cc0fd83a7e75285058ef93bd1c633b6..82b5ff03c9cfd002838fb58bbb2f2d20c4f36ad0 100644 (file)
@@ -387,5 +387,36 @@ func Test_remove_listener_in_callback()
   unlet g:listener_called
 endfunc
 
+func Test_no_change_for_empty_undo()
+  new
+  let text = ['some word here', 'second line']
+  call setline(1, text)
+  let g:entries = []
+  func Listener(bufnr, start, end, added, changes)
+    for change in a:changes
+      call add(g:entries, [change.lnum, change.end, change.added])
+    endfor
+  endfunc
+  let s:ID = listener_add('Listener')
+  let @a = "one line\ntwo line\nthree line"
+  set undolevels&  " start new undo block
+  call feedkeys('fwviw"ap', 'xt')
+  call listener_flush(bufnr())
+  " first change deletes "word", second change inserts the register
+  call assert_equal([[1, 2, 0], [1, 2, 2]], g:entries)
+  let g:entries = []
+
+  set undolevels&  " start new undo block
+  undo
+  call listener_flush(bufnr())
+  call assert_equal([[1, 4, -2]], g:entries)
+  call assert_equal(text, getline(1, 2))
+
+  call listener_remove(s:ID)
+  bwipe!
+  unlet g:entries
+  delfunc Listener
+endfunc
+
 
 " vim: shiftwidth=2 sts=2 expandtab
index 1ed720c5bfe8f2041ac785753f02b6292d3d83bd..1a4f6d06438525bc6400ac683a40f0ff9c679d12 100644 (file)
@@ -2828,8 +2828,8 @@ u_undoredo(int undo)
            if (curbuf->b_op_end.lnum > top + oldsize)
                curbuf->b_op_end.lnum += newsize - oldsize;
        }
-
-       changed_lines(top + 1, 0, bot, newsize - oldsize);
+       if (oldsize > 0 || newsize > 0)
+           changed_lines(top + 1, 0, bot, newsize - oldsize);
 
        // set '[ and '] mark
        if (top + 1 < curbuf->b_op_start.lnum)
index 4b2ac38bbc823515bf377545e371aafb30c47566..22f0a5a539546712fdbdb70c9df98a2dd1995e07 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4379,
 /**/
     4378,
 /**/