Patch 8.0.1494
Problem: No autocmd triggered in Insert mode with visible popup menu.
Solution: Add TextChangedP. (Prabir Shrestha, Christian Brabandt,
closes #2372, closes #1691)
Fix that the TextChanged autocommands are not always triggered
when sourcing a script.
Files: runtime/doc/autocmd.txt, src/edit.c, src/globals.h, src/structs.h,
src/fileio.c, src/proto/fileio.pro, src/vim.h, src/main.c,
src/testdir/test_autocmd.vim
*** ../vim-8.0.1493/runtime/doc/autocmd.txt 2018-02-03 17:36:22.622091925
+0100
--- runtime/doc/autocmd.txt 2018-02-10 16:42:07.957267702 +0100
***************
*** 316,321 ****
--- 332,340 ----
|TextChanged| after a change was made to the text in Normal mode
|TextChangedI| after a change was made to the text in Insert
mode
+ when popup menu is not visible
+ |TextChangedP| after a change was made to the text in Insert
mode
+ when popup menu visible
|TextYankPost| after text is yanked or deleted
|ColorScheme| after loading a color scheme
***************
*** 959,965 ****
current buffer in Insert mode.
Not triggered when the popup menu is visible.
Otherwise the same as TextChanged.
! |TextYankPost|
TextYankPost After text has been yanked or deleted in the
current buffer. The following values of
|v:event| can be used to determine the operation
--- 979,990 ----
current buffer in Insert mode.
Not triggered when the popup menu is visible.
Otherwise the same as TextChanged.
! *TextChangedP*
! TextChangedP After a change was made to the text in the
! current buffer in Insert mode, only when the
! popup menu is visible. Otherwise the same as
! TextChanged.
! *TextYankPost*
TextYankPost After text has been yanked or deleted in the
current buffer. The following values of
|v:event| can be used to determine the operation
*** ../vim-8.0.1493/src/edit.c 2018-02-10 16:19:09.181521235 +0100
--- src/edit.c 2018-02-10 17:48:59.557814185 +0100
***************
*** 1682,1698 ****
#ifdef FEAT_AUTOCMD
/* Trigger TextChangedI if b_changedtick differs. */
if (ready && has_textchangedI()
! && last_changedtick != CHANGEDTICK(curbuf)
# ifdef FEAT_INS_EXPAND
&& !pum_visible()
# endif
)
{
! if (last_changedtick_buf == curbuf)
! apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
! last_changedtick_buf = curbuf;
! last_changedtick = CHANGEDTICK(curbuf);
}
#endif
if (must_redraw)
--- 1682,1709 ----
#ifdef FEAT_AUTOCMD
/* Trigger TextChangedI if b_changedtick differs. */
if (ready && has_textchangedI()
! && curbuf->b_last_changedtick != CHANGEDTICK(curbuf)
# ifdef FEAT_INS_EXPAND
&& !pum_visible()
# endif
)
{
! apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
! curbuf->b_last_changedtick = CHANGEDTICK(curbuf);
}
+
+ # ifdef FEAT_INS_EXPAND
+ /* 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. */
+ if (ready && has_textchangedP()
+ && curbuf->b_last_changedtick_pum != CHANGEDTICK(curbuf)
+ && pum_visible())
+ {
+ apply_autocmds(EVENT_TEXTCHANGEDP, NULL, NULL, FALSE, curbuf);
+ curbuf->b_last_changedtick_pum = CHANGEDTICK(curbuf);
+ }
+ # endif
#endif
if (must_redraw)
*** ../vim-8.0.1493/src/globals.h 2018-02-09 17:50:24.614970413 +0100
--- src/globals.h 2018-02-10 17:50:22.749247057 +0100
***************
*** 1085,1092 ****
= INIT_POS_T(0, 0, 0)
# endif
;
- EXTERN varnumber_T last_changedtick INIT(= 0); /* for TextChanged event */
- EXTERN buf_T *last_changedtick_buf INIT(= NULL);
#endif
EXTERN int postponed_split INIT(= 0); /* for CTRL-W CTRL-] command */
--- 1085,1090 ----
*** ../vim-8.0.1493/src/structs.h 2018-02-10 16:19:09.181521235 +0100
--- src/structs.h 2018-02-10 17:44:49.051523655 +0100
***************
*** 1983,1988 ****
--- 1983,1997 ----
incremented for each change, also for undo */
#define CHANGEDTICK(buf) ((buf)->b_ct_di.di_tv.vval.v_number)
+ #ifdef FEAT_AUTOCMD
+ varnumber_T b_last_changedtick; /* b:changedtick when TextChanged or
+ TextChangedI was last triggered. */
+ # ifdef FEAT_INS_EXPAND
+ varnumber_T b_last_changedtick_pum; /* b:changedtick when
TextChangedP was
+ last triggered. */
+ # endif
+ #endif
+
int b_saving; /* Set to TRUE if we are in the middle
of
saving the buffer. */
*** ../vim-8.0.1493/src/fileio.c 2018-02-03 17:36:22.630091837 +0100
--- src/fileio.c 2018-02-10 17:47:21.134485486 +0100
***************
*** 5037,5045 ****
#ifdef FEAT_AUTOCMD
/* b:changedtick is always incremented in unchanged() but that
* should not trigger a TextChanged event. */
! if (last_changedtick + 1 == CHANGEDTICK(buf)
! && last_changedtick_buf == buf)
! last_changedtick = CHANGEDTICK(buf);
#endif
u_unchanged(buf);
u_update_save_nr(buf);
--- 5037,5044 ----
#ifdef FEAT_AUTOCMD
/* b:changedtick is always 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);
#endif
u_unchanged(buf);
u_update_save_nr(buf);
***************
*** 7851,7856 ****
--- 7850,7856 ----
{"TermResponse", EVENT_TERMRESPONSE},
{"TextChanged", EVENT_TEXTCHANGED},
{"TextChangedI", EVENT_TEXTCHANGEDI},
+ {"TextChangedP", EVENT_TEXTCHANGEDP},
{"User", EVENT_USER},
{"VimEnter", EVENT_VIMENTER},
{"VimLeave", EVENT_VIMLEAVE},
***************
*** 9377,9382 ****
--- 9377,9391 ----
}
/*
+ * Return TRUE when there is a TextChangedP autocommand defined.
+ */
+ int
+ has_textchangedP(void)
+ {
+ return (first_autopat[(int)EVENT_TEXTCHANGEDP] != NULL);
+ }
+
+ /*
* Return TRUE when there is an InsertCharPre autocommand defined.
*/
int
*** ../vim-8.0.1493/src/proto/fileio.pro 2017-12-16 18:26:56.626992497
+0100
--- src/proto/fileio.pro 2018-02-10 17:16:49.399025678 +0100
***************
*** 48,53 ****
--- 48,54 ----
int has_cursormovedI(void);
int has_textchanged(void);
int has_textchangedI(void);
+ int has_textchangedP(void);
int has_insertcharpre(void);
int has_cmdundefined(void);
int has_funcundefined(void);
*** ../vim-8.0.1493/src/vim.h 2018-02-06 22:52:45.706103329 +0100
--- src/vim.h 2018-02-10 16:54:45.144300741 +0100
***************
*** 1337,1344 ****
EVENT_TABCLOSED, /* after closing a tab page */
EVENT_SHELLCMDPOST, /* after ":!cmd" */
EVENT_SHELLFILTERPOST, /* after ":1,2!cmd", ":w !cmd", ":r !cmd". */
! EVENT_TEXTCHANGED, /* text was modified */
! EVENT_TEXTCHANGEDI, /* text was modified in Insert mode*/
EVENT_CMDUNDEFINED, /* command undefined */
EVENT_OPTIONSET, /* option was set */
EVENT_TEXTYANKPOST, /* after some text was yanked */
--- 1337,1347 ----
EVENT_TABCLOSED, /* after closing a tab page */
EVENT_SHELLCMDPOST, /* after ":!cmd" */
EVENT_SHELLFILTERPOST, /* after ":1,2!cmd", ":w !cmd", ":r !cmd". */
! EVENT_TEXTCHANGED, /* text was modified not in Insert mode
*/
! EVENT_TEXTCHANGEDI, /* text was modified in Insert mode without
! popup menu visible */
! EVENT_TEXTCHANGEDP, /* text was modified in Insert mode with popup
! menu visible */
EVENT_CMDUNDEFINED, /* command undefined */
EVENT_OPTIONSET, /* option was set */
EVENT_TEXTYANKPOST, /* after some text was yanked */
*** ../vim-8.0.1493/src/main.c 2018-02-03 17:36:22.630091837 +0100
--- src/main.c 2018-02-10 17:48:02.798201269 +0100
***************
*** 1201,1213 ****
#ifdef FEAT_AUTOCMD
/* Trigger TextChanged if b:changedtick differs. */
if (!finish_op && has_textchanged()
! && last_changedtick != CHANGEDTICK(curbuf))
{
! if (last_changedtick_buf == curbuf)
! apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL,
! FALSE, curbuf);
! last_changedtick_buf = curbuf;
! last_changedtick = CHANGEDTICK(curbuf);
}
#endif
--- 1201,1210 ----
#ifdef FEAT_AUTOCMD
/* Trigger TextChanged if b:changedtick differs. */
if (!finish_op && has_textchanged()
! && curbuf->b_last_changedtick != CHANGEDTICK(curbuf))
{
! apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL, FALSE, curbuf);
! curbuf->b_last_changedtick = CHANGEDTICK(curbuf);
}
#endif
*** ../vim-8.0.1493/src/testdir/test_autocmd.vim 2018-02-03
20:11:36.416891937 +0100
--- src/testdir/test_autocmd.vim 2018-02-10 18:10:06.756442588 +0100
***************
*** 1249,1251 ****
--- 1249,1306 ----
bwipe!
call s:After_test_dirchanged()
endfunc
+
+ " Test TextChangedI and TextChangedP
+ func Test_ChangedP()
+ new
+ call setline(1, ['foo', 'bar', 'foobar'])
+ call test_override("char_avail", 1)
+ set complete=. completeopt=menuone
+
+ func! TextChangedAutocmd(char)
+ let g:autocmd .= a:char
+ endfunc
+
+ au! TextChanged <buffer> :call TextChangedAutocmd('N')
+ au! TextChangedI <buffer> :call TextChangedAutocmd('I')
+ au! TextChangedP <buffer> :call TextChangedAutocmd('P')
+
+ call cursor(3, 1)
+ let g:autocmd = ''
+ call feedkeys("o\<esc>", 'tnix')
+ call assert_equal('I', g:autocmd)
+
+ let g:autocmd = ''
+ call feedkeys("Sf", 'tnix')
+ call assert_equal('II', g:autocmd)
+
+ let g:autocmd = ''
+ call feedkeys("Sf\<C-N>", 'tnix')
+ call assert_equal('IIP', g:autocmd)
+
+ let g:autocmd = ''
+ call feedkeys("Sf\<C-N>\<C-N>", 'tnix')
+ call assert_equal('IIPP', g:autocmd)
+
+ let g:autocmd = ''
+ call feedkeys("Sf\<C-N>\<C-N>\<C-N>", 'tnix')
+ call assert_equal('IIPPP', g:autocmd)
+
+ let g:autocmd = ''
+ call feedkeys("Sf\<C-N>\<C-N>\<C-N>\<C-N>", 'tnix')
+ call assert_equal('IIPPPP', g:autocmd)
+
+ call assert_equal(['foo', 'bar', 'foobar', 'foo'], getline(1, '$'))
+ " TODO: how should it handle completeopt=noinsert,noselect?
+
+ " CleanUp
+ call test_override("char_avail", 0)
+ au! TextChanged
+ au! TextChangedI
+ au! TextChangedP
+ delfu TextChangedAutocmd
+ unlet! g:autocmd
+ set complete&vim completeopt&vim
+
+ bw!
+ endfunc
*** ../vim-8.0.1493/src/version.c 2018-02-10 16:19:09.181521235 +0100
--- src/version.c 2018-02-10 18:12:44.375167925 +0100
***************
*** 773,774 ****
--- 773,776 ----
{ /* Add new patch number below this line */
+ /**/
+ 1494,
/**/
--
[clop clop]
MORTICIAN: Who's that then?
CUSTOMER: I don't know.
MORTICIAN: Must be a king.
CUSTOMER: Why?
MORTICIAN: He hasn't got shit all over him.
The Quest for the Holy Grail (Monty Python)
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.