mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge #9807 from mhinz/window-local-last-cursormoved
This commit is contained in:
commit
4c4a570156
@ -1035,6 +1035,7 @@ struct window_S {
|
|||||||
// current virtual column
|
// current virtual column
|
||||||
|
|
||||||
linenr_T w_last_cursorline; ///< where last 'cursorline' was drawn
|
linenr_T w_last_cursorline; ///< where last 'cursorline' was drawn
|
||||||
|
pos_T w_last_cursormoved; ///< for CursorMoved event
|
||||||
|
|
||||||
// the next seven are used to update the visual part
|
// the next seven are used to update the visual part
|
||||||
char w_old_visual_mode; ///< last known VIsual_mode
|
char w_old_visual_mode; ///< last known VIsual_mode
|
||||||
|
@ -1398,7 +1398,7 @@ ins_redraw (
|
|||||||
// Trigger CursorMoved if the cursor moved. Not when the popup menu is
|
// Trigger CursorMoved if the cursor moved. Not when the popup menu is
|
||||||
// visible, the command might delete it.
|
// visible, the command might delete it.
|
||||||
if (ready && (has_event(EVENT_CURSORMOVEDI) || curwin->w_p_cole > 0)
|
if (ready && (has_event(EVENT_CURSORMOVEDI) || curwin->w_p_cole > 0)
|
||||||
&& !equalpos(last_cursormoved, curwin->w_cursor)
|
&& !equalpos(curwin->w_last_cursormoved, curwin->w_cursor)
|
||||||
&& !pum_visible()) {
|
&& !pum_visible()) {
|
||||||
// Need to update the screen first, to make sure syntax
|
// Need to update the screen first, to make sure syntax
|
||||||
// highlighting is correct after making a change (e.g., inserting
|
// highlighting is correct after making a change (e.g., inserting
|
||||||
@ -1414,7 +1414,7 @@ ins_redraw (
|
|||||||
ins_apply_autocmds(EVENT_CURSORMOVEDI);
|
ins_apply_autocmds(EVENT_CURSORMOVEDI);
|
||||||
}
|
}
|
||||||
conceal_cursor_moved = true;
|
conceal_cursor_moved = true;
|
||||||
last_cursormoved = curwin->w_cursor;
|
curwin->w_last_cursormoved = curwin->w_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Trigger TextChangedI if changedtick differs.
|
// Trigger TextChangedI if changedtick differs.
|
||||||
|
@ -788,8 +788,6 @@ EXTERN char_u *autocmd_fname INIT(= NULL); // fname for <afile> on cmdline
|
|||||||
EXTERN int autocmd_bufnr INIT(= 0); // fnum for <abuf> on cmdline
|
EXTERN int autocmd_bufnr INIT(= 0); // fnum for <abuf> on cmdline
|
||||||
EXTERN char_u *autocmd_match INIT(= NULL); // name for <amatch> 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 int did_cursorhold INIT(= false); // set when CursorHold t'gerd
|
||||||
// for CursorMoved event
|
|
||||||
EXTERN pos_T last_cursormoved INIT(= { 0, 0, 0 });
|
|
||||||
|
|
||||||
EXTERN int postponed_split INIT(= 0); /* for CTRL-W CTRL-] command */
|
EXTERN int postponed_split INIT(= 0); /* for CTRL-W CTRL-] command */
|
||||||
EXTERN int postponed_split_flags INIT(= 0); /* args for win_split() */
|
EXTERN int postponed_split_flags INIT(= 0); /* args for win_split() */
|
||||||
|
@ -2175,7 +2175,7 @@ static void changed_common(linenr_T lnum, colnr_T col, linenr_T lnume, long xtra
|
|||||||
/* when the cursor line is changed always trigger CursorMoved */
|
/* when the cursor line is changed always trigger CursorMoved */
|
||||||
if (lnum <= curwin->w_cursor.lnum
|
if (lnum <= curwin->w_cursor.lnum
|
||||||
&& lnume + (xtra < 0 ? -xtra : xtra) > curwin->w_cursor.lnum)
|
&& lnume + (xtra < 0 ? -xtra : xtra) > curwin->w_cursor.lnum)
|
||||||
last_cursormoved.lnum = 0;
|
curwin->w_last_cursormoved.lnum = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1187,12 +1187,12 @@ static void normal_check_cursor_moved(NormalState *s)
|
|||||||
{
|
{
|
||||||
// Trigger CursorMoved if the cursor moved.
|
// Trigger CursorMoved if the cursor moved.
|
||||||
if (!finish_op && (has_event(EVENT_CURSORMOVED) || curwin->w_p_cole > 0)
|
if (!finish_op && (has_event(EVENT_CURSORMOVED) || curwin->w_p_cole > 0)
|
||||||
&& !equalpos(last_cursormoved, curwin->w_cursor)) {
|
&& !equalpos(curwin->w_last_cursormoved, curwin->w_cursor)) {
|
||||||
if (has_event(EVENT_CURSORMOVED)) {
|
if (has_event(EVENT_CURSORMOVED)) {
|
||||||
apply_autocmds(EVENT_CURSORMOVED, NULL, NULL, false, curbuf);
|
apply_autocmds(EVENT_CURSORMOVED, NULL, NULL, false, curbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
last_cursormoved = curwin->w_cursor;
|
curwin->w_last_cursormoved = curwin->w_cursor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4256,9 +4256,12 @@ static void win_enter_ext(win_T *wp, bool undo_sync, int curwin_invalid,
|
|||||||
apply_autocmds(EVENT_WINNEW, NULL, NULL, false, curbuf);
|
apply_autocmds(EVENT_WINNEW, NULL, NULL, false, curbuf);
|
||||||
}
|
}
|
||||||
if (trigger_enter_autocmds) {
|
if (trigger_enter_autocmds) {
|
||||||
apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf);
|
apply_autocmds(EVENT_WINENTER, NULL, NULL, false, curbuf);
|
||||||
if (other_buffer)
|
if (other_buffer) {
|
||||||
apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
|
apply_autocmds(EVENT_BUFENTER, NULL, NULL, false, curbuf);
|
||||||
|
}
|
||||||
|
apply_autocmds(EVENT_CURSORMOVED, NULL, NULL, false, curbuf);
|
||||||
|
curwin->w_last_cursormoved = curwin->w_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
maketitle();
|
maketitle();
|
||||||
|
34
test/functional/autocmd/cursormoved_spec.lua
Normal file
34
test/functional/autocmd/cursormoved_spec.lua
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
local helpers = require('test.functional.helpers')(after_each)
|
||||||
|
|
||||||
|
local clear = helpers.clear
|
||||||
|
local eq = helpers.eq
|
||||||
|
local eval = helpers.eval
|
||||||
|
local funcs = helpers.funcs
|
||||||
|
local source = helpers.source
|
||||||
|
|
||||||
|
describe('CursorMoved', function()
|
||||||
|
before_each(clear)
|
||||||
|
|
||||||
|
it('is triggered by changing windows', function()
|
||||||
|
source([[
|
||||||
|
let g:cursormoved = 0
|
||||||
|
vsplit
|
||||||
|
autocmd CursorMoved * let g:cursormoved += 1
|
||||||
|
wincmd w
|
||||||
|
wincmd w
|
||||||
|
]])
|
||||||
|
eq(2, eval('g:cursormoved'))
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("is not triggered by functions that don't change the window", function()
|
||||||
|
source([[
|
||||||
|
let g:cursormoved = 0
|
||||||
|
let g:buf = bufnr('%')
|
||||||
|
vsplit foo
|
||||||
|
autocmd CursorMoved * let g:cursormoved += 1
|
||||||
|
call nvim_buf_set_lines(g:buf, 0, -1, v:true, ['aaa'])
|
||||||
|
]])
|
||||||
|
eq({'aaa'}, funcs.nvim_buf_get_lines(eval('g:buf'), 0, -1, true))
|
||||||
|
eq(0, eval('g:cursormoved'))
|
||||||
|
end)
|
||||||
|
end)
|
Loading…
Reference in New Issue
Block a user