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
|
||||
|
||||
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
|
||||
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
|
||||
// visible, the command might delete it.
|
||||
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()) {
|
||||
// Need to update the screen first, to make sure syntax
|
||||
// highlighting is correct after making a change (e.g., inserting
|
||||
@ -1414,7 +1414,7 @@ ins_redraw (
|
||||
ins_apply_autocmds(EVENT_CURSORMOVEDI);
|
||||
}
|
||||
conceal_cursor_moved = true;
|
||||
last_cursormoved = curwin->w_cursor;
|
||||
curwin->w_last_cursormoved = curwin->w_cursor;
|
||||
}
|
||||
|
||||
// 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 char_u *autocmd_match INIT(= NULL); // name for <amatch> on cmdline
|
||||
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_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 */
|
||||
if (lnum <= 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.
|
||||
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)) {
|
||||
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);
|
||||
}
|
||||
if (trigger_enter_autocmds) {
|
||||
apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf);
|
||||
if (other_buffer)
|
||||
apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
|
||||
apply_autocmds(EVENT_WINENTER, NULL, NULL, false, curbuf);
|
||||
if (other_buffer) {
|
||||
apply_autocmds(EVENT_BUFENTER, NULL, NULL, false, curbuf);
|
||||
}
|
||||
apply_autocmds(EVENT_CURSORMOVED, NULL, NULL, false, curbuf);
|
||||
curwin->w_last_cursormoved = curwin->w_cursor;
|
||||
}
|
||||
|
||||
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