fix(event-loop): duplicate display updating logic in vgetorpeek() (#17913)

This commit is contained in:
zeertzjq 2022-03-30 05:25:00 +08:00 committed by GitHub
parent 29aa08a09d
commit a9665bb12c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 64 additions and 1 deletions

View File

@ -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

View File

@ -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()

View File

@ -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)

View File

@ -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]]=])