diff options
| -rw-r--r-- | src/nvim/ex_getln.c | 9 | ||||
| -rw-r--r-- | src/nvim/globals.h | 7 | ||||
| -rw-r--r-- | src/nvim/state.c | 1 | ||||
| -rw-r--r-- | src/nvim/terminal.c | 6 | ||||
| -rw-r--r-- | test/functional/ui/wildmode_spec.lua | 26 | 
5 files changed, 41 insertions, 8 deletions
| diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 1d81a39dfe..a41e78d44a 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -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) { -    (void)ExpandOne(&s->xpc, NULL, NULL, 0, WILD_FREE); +    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 diff --git a/src/nvim/globals.h b/src/nvim/globals.h index f08812600f..13ecafcbe3 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -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' */ diff --git a/src/nvim/state.c b/src/nvim/state.c index be6aa21664..eb0b590a9b 100644 --- a/src/nvim/state.c +++ b/src/nvim/state.c @@ -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" diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index 099f49f09b..deec930ebd 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -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; diff --git a/test/functional/ui/wildmode_spec.lua b/test/functional/ui/wildmode_spec.lua index 154f508924..42c92c4c2c 100644 --- a/test/functional/ui/wildmode_spec.lua +++ b/test/functional/ui/wildmode_spec.lua @@ -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() | 
