mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 04:17:01 +00:00 
			
		
		
		
	fix(event-loop): duplicate display updating logic in vgetorpeek() (#17913)
This commit is contained in:
		| @@ -15,6 +15,7 @@ | ||||
| #include "nvim/option.h" | ||||
| #include "nvim/option_defs.h" | ||||
| #include "nvim/os/input.h" | ||||
| #include "nvim/screen.h" | ||||
| #include "nvim/state.h" | ||||
| #include "nvim/ui.h" | ||||
| #include "nvim/vim.h" | ||||
| @@ -54,6 +55,12 @@ getkey: | ||||
|       // Event was made available after the last multiqueue_process_events call | ||||
|       key = K_EVENT; | ||||
|     } else { | ||||
|       // Duplicate display updating logic in vgetorpeek() | ||||
|       if (((State & INSERT) != 0 || p_lz) && (State & CMDLINE) == 0 | ||||
|           && must_redraw != 0 && !need_wait_return) { | ||||
|         update_screen(0); | ||||
|         setcursor();  // put cursor back where it belongs | ||||
|       } | ||||
|       // Flush screen updates before blocking | ||||
|       ui_flush(); | ||||
|       // Call `os_inchar` directly to block for events or user input without | ||||
|   | ||||
| @@ -1589,6 +1589,18 @@ describe('API', function() | ||||
|       feed(':digraphs<cr>') | ||||
|       eq({mode='rm', blocking=true}, nvim("get_mode")) | ||||
|     end) | ||||
|  | ||||
|     it('after <Nop> mapping returns blocking=false #17257', function() | ||||
|       command('nnoremap <F2> <Nop>') | ||||
|       feed('<F2>') | ||||
|       eq({mode='n', blocking=false}, nvim("get_mode")) | ||||
|     end) | ||||
|  | ||||
|     it('after empty string <expr> mapping returns blocking=false #17257', function() | ||||
|       command('nnoremap <expr> <F2> ""') | ||||
|       feed('<F2>') | ||||
|       eq({mode='n', blocking=false}, nvim("get_mode")) | ||||
|     end) | ||||
|   end) | ||||
|  | ||||
|   describe('RPC (K_EVENT)', function() | ||||
|   | ||||
| @@ -320,3 +320,47 @@ describe("event processing and input", function() | ||||
|     eq({'notification', 'stop', {}}, next_msg()) | ||||
|   end) | ||||
| end) | ||||
|  | ||||
| describe('display is updated', function() | ||||
|   local screen | ||||
|   before_each(function() | ||||
|     screen = Screen.new(60, 8) | ||||
|     screen:set_default_attr_ids({ | ||||
|       [1] = {bold = true, foreground = Screen.colors.Blue1},  -- NonText | ||||
|       [2] = {bold = true},  -- ModeMsg | ||||
|     }) | ||||
|     screen:attach() | ||||
|   end) | ||||
|  | ||||
|   it('in Insert mode after <Nop> mapping #17911', function() | ||||
|     command('imap <Plug>test <Nop>') | ||||
|     command('imap <F2> abc<CR><Plug>test') | ||||
|     feed('i<F2>') | ||||
|     screen:expect([[ | ||||
|       abc                                                         | | ||||
|       ^                                                            | | ||||
|       {1:~                                                           }| | ||||
|       {1:~                                                           }| | ||||
|       {1:~                                                           }| | ||||
|       {1:~                                                           }| | ||||
|       {1:~                                                           }| | ||||
|       {2:-- INSERT --}                                                | | ||||
|     ]]) | ||||
|   end) | ||||
|  | ||||
|   it('in Insert mode after empty string <expr> mapping #17911', function() | ||||
|     command('imap <expr> <Plug>test ""') | ||||
|     command('imap <F2> abc<CR><Plug>test') | ||||
|     feed('i<F2>') | ||||
|     screen:expect([[ | ||||
|       abc                                                         | | ||||
|       ^                                                            | | ||||
|       {1:~                                                           }| | ||||
|       {1:~                                                           }| | ||||
|       {1:~                                                           }| | ||||
|       {1:~                                                           }| | ||||
|       {1:~                                                           }| | ||||
|       {2:-- INSERT --}                                                | | ||||
|     ]]) | ||||
|   end) | ||||
| end) | ||||
|   | ||||
| @@ -273,7 +273,7 @@ describe('timers', function() | ||||
|     eq("Vim(call):E48: Not allowed in sandbox", exc_exec("sandbox call timer_start(0, 'Scary')")) | ||||
|   end) | ||||
|  | ||||
|   it('can be triggered after an empty string <expr> mapping', function() | ||||
|   it('can be triggered after an empty string <expr> mapping #17257', function() | ||||
|     local screen = Screen.new(40, 6) | ||||
|     screen:attach() | ||||
|     command([=[imap <expr> <F2> [timer_start(0, { _ -> execute("throw 'x'", "") }), ''][-1]]=]) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 zeertzjq
					zeertzjq