mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
fix(event-loop): duplicate display updating logic in vgetorpeek() (#17913)
This commit is contained in:
parent
29aa08a09d
commit
a9665bb12c
@ -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]]=])
|
||||
|
Loading…
Reference in New Issue
Block a user