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 | ||||
|  | ||||
|   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) | ||||
		Reference in New Issue
	
	Block a user
	 Marco Hinz
					Marco Hinz