diff options
-rw-r--r-- | runtime/plugin/matchparen.vim | 3 | ||||
-rw-r--r-- | src/edit.c | 15 | ||||
-rw-r--r-- | src/fileio.c | 20 | ||||
-rw-r--r-- | src/globals.h | 4 | ||||
-rw-r--r-- | src/main.c | 13 | ||||
-rw-r--r-- | src/proto/fileio.pro | 2 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim.h | 2 |
8 files changed, 60 insertions, 1 deletions
diff --git a/runtime/plugin/matchparen.vim b/runtime/plugin/matchparen.vim index 03a428d6a..32f0a8349 100644 --- a/runtime/plugin/matchparen.vim +++ b/runtime/plugin/matchparen.vim @@ -14,6 +14,9 @@ let g:loaded_matchparen = 1 augroup matchparen " Replace all matchparen autocommands autocmd! CursorMoved,CursorMovedI,WinEnter * call s:Highlight_Matching_Pair() + if exists('##TextChanged') + autocmd! TextChanged,TextChangedI * call s:Highlight_Matching_Pair() + endif augroup END " Skip the rest if it was already done. diff --git a/src/edit.c b/src/edit.c index 88fd18af1..5d609519a 100644 --- a/src/edit.c +++ b/src/edit.c @@ -1593,6 +1593,21 @@ ins_redraw(ready) last_cursormoved = curwin->w_cursor; } #endif +#ifdef FEAT_AUTOCMD + /* Trigger TextChangedI if b_changedtick differs. */ + if (!ready && has_textchangedI() + && last_changedtick != curbuf->b_changedtick +# 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 = curbuf->b_changedtick; + } +#endif if (must_redraw) update_screen(0); else if (clear_cmdline || redraw_cmdline) diff --git a/src/fileio.c b/src/fileio.c index c177e633c..b5a49b874 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -7713,6 +7713,8 @@ static struct event_name {"TabLeave", EVENT_TABLEAVE}, {"TermChanged", EVENT_TERMCHANGED}, {"TermResponse", EVENT_TERMRESPONSE}, + {"TextChanged", EVENT_TEXTCHANGED}, + {"TextChangedI", EVENT_TEXTCHANGEDI}, {"User", EVENT_USER}, {"VimEnter", EVENT_VIMENTER}, {"VimLeave", EVENT_VIMLEAVE}, @@ -9138,6 +9140,24 @@ has_cursormovedI() } /* + * Return TRUE when there is a TextChanged autocommand defined. + */ + int +has_textchanged() +{ + return (first_autopat[(int)EVENT_TEXTCHANGED] != NULL); +} + +/* + * Return TRUE when there is a TextChangedI autocommand defined. + */ + int +has_textchangedI() +{ + return (first_autopat[(int)EVENT_TEXTCHANGEDI] != NULL); +} + +/* * Return TRUE when there is an InsertCharPre autocommand defined. */ int diff --git a/src/globals.h b/src/globals.h index 332fedca9..ac0eb18e0 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1057,11 +1057,13 @@ EXTERN int autocmd_fname_full; /* autocmd_fname is full path */ EXTERN int autocmd_bufnr INIT(= 0); /* fnum for <abuf> on cmdline */ EXTERN char_u *autocmd_match INIT(= NULL); /* name for <amatch> on cmdline */ EXTERN int did_cursorhold INIT(= FALSE); /* set when CursorHold t'gerd */ -EXTERN pos_T last_cursormoved /* for CursorMoved event */ +EXTERN pos_T last_cursormoved /* for CursorMoved event */ # ifdef DO_INIT = INIT_POS_T(0, 0, 0) # endif ; +EXTERN int last_changedtick INIT(= 0); /* for TextChanged event */ +EXTERN buf_T *last_changedtick_buf INIT(= NULL); #endif #ifdef FEAT_WINDOWS diff --git a/src/main.c b/src/main.c index 6c4f8ecee..cba8dce75 100644 --- a/src/main.c +++ b/src/main.c @@ -1168,6 +1168,19 @@ main_loop(cmdwin, noexmode) } #endif +#ifdef FEAT_AUTOCMD + /* Trigger TextChanged if b_changedtick differs. */ + if (!finish_op && has_textchanged() + && last_changedtick != curbuf->b_changedtick) + { + if (last_changedtick_buf == curbuf) + apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL, + FALSE, curbuf); + last_changedtick_buf = curbuf; + last_changedtick = curbuf->b_changedtick; + } +#endif + #if defined(FEAT_DIFF) && defined(FEAT_SCROLLBIND) /* Scroll-binding for diff mode may have been postponed until * here. Avoids doing it for every change. */ diff --git a/src/proto/fileio.pro b/src/proto/fileio.pro index 113b668bd..61eb71251 100644 --- a/src/proto/fileio.pro +++ b/src/proto/fileio.pro @@ -44,6 +44,8 @@ int has_cursorhold __ARGS((void)); int trigger_cursorhold __ARGS((void)); int has_cursormoved __ARGS((void)); int has_cursormovedI __ARGS((void)); +int has_textchanged __ARGS((void)); +int has_textchangedI __ARGS((void)); int has_insertcharpre __ARGS((void)); void block_autocmds __ARGS((void)); void unblock_autocmds __ARGS((void)); diff --git a/src/version.c b/src/version.c index c3e8f3773..70a04379e 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 867, +/**/ 866, /**/ 865, @@ -1300,6 +1300,8 @@ enum auto_event EVENT_TABENTER, /* after entering 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*/ NUM_EVENTS /* MUST be the last one */ }; |