terminal: block redraw during c_CTRL-D

Unlike the normal wildmenu, the CTRL-D wild-list is not restored by
statusline redraw. (Semantics: ^D is controlled by 'wildoptions' option,
so it's in the "wild..." family.)

TODO: externalize the c_CTRL-D wild-list.
This commit is contained in:
Justin M. Keyes
2017-08-05 03:34:38 +02:00
parent c695443727
commit a31482db4d
5 changed files with 41 additions and 8 deletions

View File

@@ -12,6 +12,7 @@
#include <inttypes.h>
#include "nvim/assert.h"
#include "nvim/log.h"
#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/arabic.h"
@@ -472,11 +473,12 @@ static int command_line_execute(VimState *state, int key)
}
// free expanded names when finished walking through matches
if (s->xpc.xp_numfiles != -1
&& !(s->c == p_wc && KeyTyped) && s->c != p_wcm
if (!(s->c == p_wc && KeyTyped) && s->c != p_wcm
&& s->c != Ctrl_N && s->c != Ctrl_P && s->c != Ctrl_A
&& s->c != Ctrl_L) {
if (s->xpc.xp_numfiles != -1) {
(void)ExpandOne(&s->xpc, NULL, NULL, 0, WILD_FREE);
}
s->did_wild_list = false;
if (!p_wmnu || (s->c != K_UP && s->c != K_DOWN)) {
s->xpc.xp_context = EXPAND_NOTHING;
@@ -1222,6 +1224,7 @@ static int command_line_handle_key(CommandLineState *s)
break; // Use ^D as normal char instead
}
wild_menu_showing = WM_LIST;
redrawcmd();
return 1; // don't do incremental search now

View File

@@ -931,8 +931,11 @@ EXTERN char_u langmap_mapchar[256]; /* mapping for language keys */
EXTERN int save_p_ls INIT(= -1); /* Save 'laststatus' setting */
EXTERN int save_p_wmh INIT(= -1); /* Save 'winminheight' setting */
EXTERN int wild_menu_showing INIT(= 0);
# define WM_SHOWN 1 /* wildmenu showing */
# define WM_SCROLLED 2 /* wildmenu showing with scroll */
enum {
WM_SHOWN = 1, ///< wildmenu showing
WM_SCROLLED = 2, ///< wildmenu showing with scroll
WM_LIST = 3, ///< cmdline CTRL-D
};
EXTERN char breakat_flags[256]; /* which characters are in 'breakat' */

View File

@@ -6,6 +6,7 @@
#include "nvim/lib/kvec.h"
#include "nvim/ascii.h"
#include "nvim/log.h"
#include "nvim/state.h"
#include "nvim/vim.h"
#include "nvim/main.h"

View File

@@ -43,6 +43,7 @@
#include <vterm.h>
#include "nvim/log.h"
#include "nvim/vim.h"
#include "nvim/terminal.h"
#include "nvim/message.h"
@@ -1010,7 +1011,10 @@ static void refresh_terminal(Terminal *term)
// Calls refresh_terminal() on all invalidated_terminals.
static void refresh_timer_cb(TimeWatcher *watcher, void *data)
{
if (exiting) { // Cannot redraw (requires event loop) during teardown/exit.
if (exiting // Cannot redraw (requires event loop) during teardown/exit.
// WM_LIST (^D) is not redrawn, unlike the normal wildmenu. So we must
// skip redraws to keep it visible.
|| wild_menu_showing == WM_LIST) {
goto end;
}
Terminal *term;

View File

@@ -66,10 +66,10 @@ describe("'wildmenu'", function()
else
feed([[:terminal for i in $(seq 1 5000); do printf 'foo\nfoo\nfoo\n'; sleep 0.1; done<cr>]])
end
screen:sleep(50) -- Allow some output.
feed([[<C-\><C-N>gg]])
feed([[:sign <Tab>]]) -- Invoke wildmenu.
screen:sleep(50) -- Allow some output.
screen:sleep(50) -- Allow some terminal output.
screen:expect([[
foo |
foo |
@@ -77,6 +77,28 @@ describe("'wildmenu'", function()
define jump list > |
:sign define^ |
]])
-- cmdline CTRL-D display should also be preserved.
feed([[<C-\><C-N>]])
feed([[:sign <C-D>]]) -- Invoke cmdline CTRL-D.
screen:sleep(50) -- Allow some terminal output.
screen:expect([[
:sign |
define place |
jump undefine |
list unplace |
:sign ^ |
]])
-- Exiting cmdline should show the buffer.
feed([[<C-\><C-N>]])
screen:expect([[
^foo |
foo |
foo |
foo |
|
]])
end)
it('ignores :redrawstatus called from a timer #7108', function()