mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	Merge #9807 from mhinz/window-local-last-cursormoved
This commit is contained in:
		| @@ -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) | ||||||
		Reference in New Issue
	
	Block a user
	 Marco Hinz
					Marco Hinz