mirror of
https://github.com/neovim/neovim.git
synced 2025-10-06 01:46:29 +00:00
vim-patch:8.2.3517: TextChanged does not trigger after TextChangedI (#25384)
Problem: TextChanged does not trigger after TextChangedI.
Solution: Store the tick separately for TextChangedI. (Christian Brabandt,
closes vim/vim#8968, closes vim/vim#8932)
db3b44640d
Co-authored-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
@@ -354,6 +354,7 @@ int open_buffer(int read_stdin, exarg_T *eap, int flags_arg)
|
||||
// Set last_changedtick to avoid triggering a TextChanged autocommand right
|
||||
// after it was added.
|
||||
curbuf->b_last_changedtick = buf_get_changedtick(curbuf);
|
||||
curbuf->b_last_changedtick_i = buf_get_changedtick(curbuf);
|
||||
curbuf->b_last_changedtick_pum = buf_get_changedtick(curbuf);
|
||||
|
||||
// require "!" to overwrite the file, because it wasn't read completely
|
||||
|
@@ -418,10 +418,10 @@ struct file_buffer {
|
||||
/// This is a dictionary item used to store b:changedtick.
|
||||
ChangedtickDictItem changedtick_di;
|
||||
|
||||
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_i; // b:changedtick for TextChangedI
|
||||
varnumber_T b_last_changedtick_pum; // b:changedtick for TextChangedP
|
||||
|
||||
bool b_saving; // Set to true if we are in the middle of
|
||||
// saving the buffer.
|
||||
|
@@ -1797,8 +1797,8 @@ restore_backup:
|
||||
unchanged(buf, true, false);
|
||||
const varnumber_T changedtick = buf_get_changedtick(buf);
|
||||
if (buf->b_last_changedtick + 1 == changedtick) {
|
||||
// b:changedtick 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.
|
||||
buf->b_last_changedtick = changedtick;
|
||||
}
|
||||
u_unchanged(buf);
|
||||
|
@@ -1306,9 +1306,9 @@ void ins_redraw(bool ready)
|
||||
last_cursormoved = curwin->w_cursor;
|
||||
}
|
||||
|
||||
// Trigger TextChangedI if changedtick differs.
|
||||
// Trigger TextChangedI if changedtick_i differs.
|
||||
if (ready && has_event(EVENT_TEXTCHANGEDI)
|
||||
&& curbuf->b_last_changedtick != buf_get_changedtick(curbuf)
|
||||
&& curbuf->b_last_changedtick_i != buf_get_changedtick(curbuf)
|
||||
&& !pum_visible()) {
|
||||
aco_save_T aco;
|
||||
varnumber_T tick = buf_get_changedtick(curbuf);
|
||||
@@ -1317,16 +1317,16 @@ void ins_redraw(bool ready)
|
||||
aucmd_prepbuf(&aco, curbuf);
|
||||
apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, false, curbuf);
|
||||
aucmd_restbuf(&aco);
|
||||
curbuf->b_last_changedtick = buf_get_changedtick(curbuf);
|
||||
curbuf->b_last_changedtick_i = buf_get_changedtick(curbuf);
|
||||
if (tick != buf_get_changedtick(curbuf)) { // see ins_apply_autocmds()
|
||||
u_save(curwin->w_cursor.lnum,
|
||||
(linenr_T)(curwin->w_cursor.lnum + 1));
|
||||
}
|
||||
}
|
||||
|
||||
// Trigger TextChangedP if changedtick differs. When the popupmenu closes
|
||||
// TextChangedI will need to trigger for backwards compatibility, thus use
|
||||
// different b_last_changedtick* variables.
|
||||
// Trigger TextChangedP if 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_event(EVENT_TEXTCHANGEDP)
|
||||
&& curbuf->b_last_changedtick_pum != buf_get_changedtick(curbuf)
|
||||
&& pum_visible()) {
|
||||
|
Reference in New Issue
Block a user