]> granicus.if.org Git - vim/commitdiff
patch 8.2.3517: TextChanged does not trigger after TextChangedI v8.2.3517
authorChristian Brabandt <cb@256bit.org>
Sat, 16 Oct 2021 10:58:55 +0000 (11:58 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 16 Oct 2021 10:58:55 +0000 (11:58 +0100)
Problem:    TextChanged does not trigger after TextChangedI.
Solution:   Store the tick separately for TextChangedI. (Christian Brabandt,
            closes #8968, closes #8932)

src/buffer.c
src/bufwrite.c
src/edit.c
src/structs.h
src/testdir/test_autocmd.vim
src/version.c

index 56c1bf2f404dce8ae49702fbe02df0b00f30a5f2..86dc88687a596334b02732d61c2de80276b9cf0a 100644 (file)
@@ -327,6 +327,7 @@ open_buffer(
     // Set last_changedtick to avoid triggering a TextChanged autocommand right
     // after it was added.
     curbuf->b_last_changedtick = CHANGEDTICK(curbuf);
+    curbuf->b_last_changedtick_i = CHANGEDTICK(curbuf);
     curbuf->b_last_changedtick_pum = CHANGEDTICK(curbuf);
 
     // require "!" to overwrite the file, because it wasn't read completely
index 772d707673a9ccff429454d756d1227c6dc6d94e..0313e0ce3762df919fcafd6686e8788ac9ea7a60 100644 (file)
@@ -2422,8 +2422,8 @@ restore_backup:
            && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL))
     {
        unchanged(buf, TRUE, FALSE);
-       // b:changedtick is may be incremented in unchanged() but that
-       // should not trigger a TextChanged event.
+       // b:changedtick may be incremented in unchanged() but that should not
+       // trigger a TextChanged event.
        if (buf->b_last_changedtick + 1 == CHANGEDTICK(buf))
            buf->b_last_changedtick = CHANGEDTICK(buf);
        u_unchanged(buf);
index 4f8e3740177688414575602abb2aaeceab08efa9..686c6d429af382303489b4739fbae41c75a83539 100644 (file)
@@ -1477,9 +1477,9 @@ ins_redraw(int ready)         // not busy with something
        last_cursormoved = curwin->w_cursor;
     }
 
-    // Trigger TextChangedI if b_changedtick differs.
+    // Trigger TextChangedI if b_changedtick_i differs.
     if (ready && has_textchangedI()
-           && curbuf->b_last_changedtick != CHANGEDTICK(curbuf)
+           && curbuf->b_last_changedtick_i != CHANGEDTICK(curbuf)
            && !pum_visible())
     {
        aco_save_T      aco;
@@ -1489,15 +1489,15 @@ ins_redraw(int ready)       // not busy with something
        aucmd_prepbuf(&aco, curbuf);
        apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
        aucmd_restbuf(&aco);
-       curbuf->b_last_changedtick = CHANGEDTICK(curbuf);
+       curbuf->b_last_changedtick_i = CHANGEDTICK(curbuf);
        if (tick != CHANGEDTICK(curbuf))  // see ins_apply_autocmds()
            u_save(curwin->w_cursor.lnum,
                                        (linenr_T)(curwin->w_cursor.lnum + 1));
     }
 
-    // Trigger TextChangedP if b_changedtick differs. When the popupmenu closes
-    // TextChangedI will need to trigger for backwards compatibility, thus use
-    // different b_last_changedtick* variables.
+    // Trigger TextChangedP if b_changedtick_pum differs. When the popupmenu
+    // closes TextChangedI will need to trigger for backwards compatibility,
+    // thus use different b_last_changedtick* variables.
     if (ready && has_textchangedP()
            && curbuf->b_last_changedtick_pum != CHANGEDTICK(curbuf)
            && pum_visible())
index 7dac95b30e74e17dd0e8d1f012dd0037e50cefc8..83a13a76514410f9945fff5533a56c8e337391e8 100644 (file)
@@ -2701,10 +2701,10 @@ struct file_buffer
                                // incremented for each change, also for undo
 #define CHANGEDTICK(buf) ((buf)->b_ct_di.di_tv.vval.v_number)
 
-    varnumber_T        b_last_changedtick; // b:changedtick when TextChanged or
-                                   // TextChangedI was last triggered.
-    varnumber_T        b_last_changedtick_pum; // b:changedtick when TextChangedP was
+    varnumber_T        b_last_changedtick;     // b:changedtick when TextChanged was
                                        // last triggered.
+    varnumber_T        b_last_changedtick_pum; // b:changedtick for TextChangedP
+    varnumber_T        b_last_changedtick_i;   // b:changedtick for TextChangedI
 
     int                b_saving;       // Set to TRUE if we are in the middle of
                                // saving the buffer.
index db1efba12db6f369d75e557d954da73747003ed7..7faa4551d17afe35cbf889618879b2b35d4f0326 100644 (file)
@@ -1929,6 +1929,7 @@ func Test_ChangedP()
     let g:autocmd .= a:char
   endfunc
 
+  " TextChanged will not be triggered, only check that it isn't.
   au! TextChanged <buffer> :call TextChangedAutocmd('N')
   au! TextChangedI <buffer> :call TextChangedAutocmd('I')
   au! TextChangedP <buffer> :call TextChangedAutocmd('P')
@@ -2863,5 +2864,42 @@ func Test_autocmd_with_block()
   augroup END
 endfunc
 
+" Test TextChangedI and TextChanged
+func Test_Changed_ChangedI()
+  new
+  call test_override("char_avail", 1)
+  let [g:autocmd_i, g:autocmd_n] = ['','']
+
+  func! TextChangedAutocmdI(char)
+    let g:autocmd_{tolower(a:char)} = a:char .. b:changedtick
+  endfunc
+
+  augroup Test_TextChanged
+    au!
+    au TextChanged  <buffer> :call TextChangedAutocmdI('N')
+    au TextChangedI <buffer> :call TextChangedAutocmdI('I')
+  augroup END
+
+  call feedkeys("ifoo\<esc>", 'tnix')
+  " TODO: Test test does not seem to trigger TextChanged autocommand, this
+  " requires running Vim in a terminal window.
+  " call assert_equal('N3', g:autocmd_n)
+  call assert_equal('I3', g:autocmd_i)
+
+  call feedkeys("yyp", 'tnix')
+  " TODO: Test test does not seem to trigger TextChanged autocommand.
+  " call assert_equal('N4', g:autocmd_n)
+  call assert_equal('I3', g:autocmd_i)
+
+  " CleanUp
+  call test_override("char_avail", 0)
+  au! TextChanged  <buffer>
+  au! TextChangedI <buffer>
+  augroup! Test_TextChanged
+  delfu TextChangedAutocmdI
+  unlet! g:autocmd_i g:autocmd_n
+
+  bw!
+endfunc
 
 " vim: shiftwidth=2 sts=2 expandtab
index dfe5139a9c9e27c7b65ad2419745e43464cab8fc..d142759e5653b53d87ad8801c27fb85ed7c8ea44 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3517,
 /**/
     3516,
 /**/