cmdline: Redraw the cmdline after processing events

vim-patch:7.4.1603

TODO(bfredl): if we allow events in HITRETURN and ASKMORE states,
we need to add the necessary redraws as well.
This commit is contained in:
Björn Linse
2016-05-22 21:53:43 +02:00
parent 61e8adb25e
commit 5cc87d4dab
5 changed files with 56 additions and 7 deletions

View File

@@ -359,6 +359,7 @@ static int command_line_execute(VimState *state, int key)
if (s->c == K_EVENT) { if (s->c == K_EVENT) {
queue_process_events(loop.events); queue_process_events(loop.events);
redrawcmdline();
return 1; return 1;
} }

View File

@@ -785,11 +785,13 @@ void wait_return(int redraw)
State = HITRETURN; State = HITRETURN;
setmouse(); setmouse();
/* Avoid the sequence that the user types ":" at the hit-return prompt cmdline_row = msg_row;
* to start an Ex command, but the file-changed dialog gets in the // Avoid the sequence that the user types ":" at the hit-return prompt
* way. */ // to start an Ex command, but the file-changed dialog gets in the
if (need_check_timestamps) // way.
check_timestamps(FALSE); if (need_check_timestamps) {
check_timestamps(false);
}
hit_return_msg(); hit_return_msg();
@@ -1970,6 +1972,7 @@ static void msg_puts_printf(char *str, int maxlen)
*/ */
static int do_more_prompt(int typed_char) static int do_more_prompt(int typed_char)
{ {
static bool entered = false;
int used_typed_char = typed_char; int used_typed_char = typed_char;
int oldState = State; int oldState = State;
int c; int c;
@@ -1979,6 +1982,13 @@ static int do_more_prompt(int typed_char)
msgchunk_T *mp; msgchunk_T *mp;
int i; int i;
// We get called recursively when a timer callback outputs a message. In
// that case don't show another prompt. Also when at the hit-Enter prompt.
if (entered || State == HITRETURN) {
return false;
}
entered = true;
if (typed_char == 'G') { if (typed_char == 'G') {
/* "g<": Find first line on the last page. */ /* "g<": Find first line on the last page. */
mp_last = msg_sb_start(last_msgchunk); mp_last = msg_sb_start(last_msgchunk);
@@ -2153,9 +2163,11 @@ static int do_more_prompt(int typed_char)
if (quit_more) { if (quit_more) {
msg_row = Rows - 1; msg_row = Rows - 1;
msg_col = 0; msg_col = 0;
} else if (cmdmsg_rl) } else if (cmdmsg_rl) {
msg_col = Columns - 1; msg_col = Columns - 1;
}
entered = false;
return retval; return retval;
} }

View File

@@ -1,4 +1,5 @@
local helpers = require('test.functional.helpers') local helpers = require('test.functional.helpers')
local Screen = require('test.functional.ui.screen')
local ok, feed, eq, eval = helpers.ok, helpers.feed, helpers.eq, helpers.eval local ok, feed, eq, eval = helpers.ok, helpers.feed, helpers.eq, helpers.eval
local source, nvim_async, run = helpers.source, helpers.nvim_async, helpers.run local source, nvim_async, run = helpers.source, helpers.nvim_async, helpers.run
local clear, execute, funcs = helpers.clear, helpers.execute, helpers.funcs local clear, execute, funcs = helpers.clear, helpers.execute, helpers.funcs
@@ -103,4 +104,26 @@ describe('timers', function()
eq(2,eval("g:val2")) eq(2,eval("g:val2"))
end) end)
it("doesn't mess up the cmdline", function()
local screen = Screen.new(40, 6)
screen:attach()
screen:set_default_attr_ignore({{bold=true, foreground=Screen.colors.Blue}})
source([[
func! MyHandler(timer)
echo "evil"
endfunc
]])
execute("call timer_start(100, 'MyHandler', {'repeat': 1})")
feed(":good")
screen:sleep(200)
screen:expect([[
|
~ |
~ |
~ |
~ |
:good^ |
]])
end)
end) end)

View File

@@ -290,6 +290,10 @@ If everything else fails, use Screen:redraw_debug to help investigate what is
end end
end end
function Screen:sleep(ms)
pcall(function() self:wait(function() return "error" end, ms) end)
end
function Screen:_redraw(updates) function Screen:_redraw(updates)
for _, update in ipairs(updates) do for _, update in ipairs(updates) do
-- print('--') -- print('--')
@@ -501,7 +505,7 @@ end
function Screen:snapshot_util(attrs, ignore) function Screen:snapshot_util(attrs, ignore)
-- util to generate screen test -- util to generate screen test
pcall(function() self:wait(function() return "error" end, 250) end) self:sleep(250)
self:print_snapshot(attrs, ignore) self:print_snapshot(attrs, ignore)
end end

View File

@@ -114,6 +114,15 @@ add_custom_target(lpeg
list(APPEND THIRD_PARTY_DEPS lpeg) list(APPEND THIRD_PARTY_DEPS lpeg)
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/inspect
COMMAND ${LUAROCKS_BINARY}
ARGS build inspect ${LUAROCKS_BUILDARGS}
DEPENDS mpack)
add_custom_target(inspect
DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/inspect)
list(APPEND THIRD_PARTY_DEPS inspect)
if(USE_BUNDLED_BUSTED) if(USE_BUNDLED_BUSTED)
add_custom_command(OUTPUT ${HOSTDEPS_BIN_DIR}/busted add_custom_command(OUTPUT ${HOSTDEPS_BIN_DIR}/busted
COMMAND ${LUAROCKS_BINARY} COMMAND ${LUAROCKS_BINARY}