Skip to content

Commit 6b49fba

Browse files
girishjichrisbra
authored andcommitted
patch 9.1.1490: 'wildchar' does not work in search contexts
Problem: 'wildchar' does not work in search contexts Solution: implement search completion when 'wildchar' is typed (Girish Palya). This change enhances Vim's command-line completion by extending 'wildmode' behavior to search pattern contexts, including: - '/' and '?' search commands - ':s', ':g', ':v', and ':vim' commands Completions preserve the exact regex pattern typed by the user, appending the completed word directly to the original input. This ensures that all regex elements — such as '<', '^', grouping brackets '()', wildcards '\*', '.', and other special characters — remain intact and in their original positions. --- **Use Case** While searching (using `/` or `?`) for lines containing a pattern like `"foobar"`, you can now type a partial pattern (e.g., `/f`) followed by a trigger key (`wildchar`) to open a **popup completion menu** showing all matching words. This offers two key benefits: 1. **Precision**: Select the exact word you're looking for without typing it fully. 2. **Memory aid**: When you can’t recall a full function or variable name, typing a few letters helps you visually identify and complete the correct symbol. --- **What’s New** Completion is now supported in the following contexts: - `/` and `?` search commands - `:s`, `:g`, `:v`, and `:vimgrep` ex-commands --- **Design Notes** - While `'wildchar'` (usually `<Tab>`) triggers completion, you'll have to use `<CTRL-V><Tab>` or "\t" to search for a literal tab. - **Responsiveness**: Search remains responsive because it checks for user input frequently. --- **Try It Out** Basic setup using the default `<Tab>` as the completion trigger: ```vim set wim=noselect,full wop=pum wmnu ``` Now type: ``` /foo<Tab> ``` This opens a completion popup for matches containing "foo". For matches beginning with "foo" type `/\<foo<Tab>`. --- **Optional: Autocompletion** For automatic popup menu completion as you type in search or `:` commands, include this in your `.vimrc`: ```vim vim9script set wim=noselect:lastused,full wop=pum wcm=<C-@> wmnu autocmd CmdlineChanged [:/?] CmdComplete() def CmdComplete() var [cmdline, curpos, cmdmode] = [getcmdline(), getcmdpos(), expand('<afile>') == ':'] var trigger_char = '\%(\w\|[*/:.-]\)$' var not_trigger_char = '^\%(\d\|,\|+\|-\)\+$' # Exclude numeric range if getchar(1, {number: true}) == 0 # Typehead is empty, no more pasted input && !wildmenumode() && curpos == cmdline->len() + 1 && (!cmdmode || (cmdline =~ trigger_char && cmdline !~ not_trigger_char)) SkipCmdlineChanged() feedkeys("\<C-@>", "t") timer_start(0, (_) => getcmdline()->substitute('\%x00', '', 'ge')->setcmdline()) # Remove <C-@> endif enddef def SkipCmdlineChanged(key = ''): string set ei+=CmdlineChanged timer_start(0, (_) => execute('set ei-=CmdlineChanged')) return key == '' ? '' : ((wildmenumode() ? "\<C-E>" : '') .. key) enddef **Optional: Preserve history recall behavior** cnoremap <expr> <Up> SkipCmdlineChanged("\<Up>") cnoremap <expr> <Down> SkipCmdlineChanged("\<Down>") **Optional: Customize popup height** autocmd CmdlineEnter : set bo+=error | exec $'set ph={max([10, winheight(0) - 4])}' autocmd CmdlineEnter [/?] set bo+=error | set ph=8 autocmd CmdlineLeave [:/?] set bo-=error ph& ``` closes: #17570 Signed-off-by: Girish Palya <[email protected]> Signed-off-by: Christian Brabandt <[email protected]>
1 parent 1fa3f0c commit 6b49fba

16 files changed

+753
-89
lines changed

runtime/doc/cmdline.txt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
*cmdline.txt* For Vim version 9.1. Last change: 2025 Mar 08
1+
*cmdline.txt* For Vim version 9.1. Last change: 2025 Jun 28
22

33

44
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -415,7 +415,7 @@ CTRL-D List names that match the pattern in front of the cursor.
415415
to the end.
416416
The 'wildoptions' option can be set to "tagfile" to list the
417417
file of matching tags.
418-
*c_CTRL-I* *c_wildchar* *c_<Tab>*
418+
*c_CTRL-I* *c_wildchar* *c_<Tab>* */_<Tab>*
419419
'wildchar' option
420420
A match is done on the pattern in front of the cursor. The
421421
match (if there are several, the first match) is inserted
@@ -425,6 +425,10 @@ CTRL-D List names that match the pattern in front of the cursor.
425425
again and there were multiple matches, the next
426426
match is inserted. After the last match, the first is used
427427
again (wrap around).
428+
429+
In search context use <CTRL-V><Tab> or "\t" to search for a
430+
literal <Tab> instead of triggering completion.
431+
428432
The behavior can be changed with the 'wildmode' option.
429433
*c_<S-Tab>*
430434
<S-Tab> Like 'wildchar' or <Tab>, but begin with the last match and
@@ -458,7 +462,7 @@ CTRL-G When 'incsearch' is set, entering a search pattern for "/" or
458462
"?" and the current match is displayed then CTRL-G will move
459463
to the next match (does not take |search-offset| into account)
460464
Use CTRL-T to move to the previous match. Hint: on a regular
461-
keyboard T is above G.
465+
keyboard G is below T.
462466
*c_CTRL-T* */_CTRL-T*
463467
CTRL-T When 'incsearch' is set, entering a search pattern for "/" or
464468
"?" and the current match is displayed then CTRL-T will move

runtime/doc/options.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9752,7 +9752,10 @@ A jump table for the options with a short description can be found at |Q_op|.
97529752
:set wc=X
97539753
:set wc=^I
97549754
:set wc=<Tab>
9755-
< NOTE: This option is set to the Vi default value when 'compatible' is
9755+
< 'wildchar' also enables completion in search pattern contexts such as
9756+
|/|, |?|, |:s|, |:g|, |:v|, and |:vim|. To insert a literal <Tab>
9757+
instead of triggering completion, type <C-V><Tab> or "\t".
9758+
NOTE: This option is set to the Vi default value when 'compatible' is
97569759
set and to the Vim default value when 'compatible' is reset.
97579760

97589761
*'wildcharm'* *'wcm'*

runtime/doc/tags

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1815,6 +1815,7 @@ $quote eval.txt /*$quote*
18151815
/\{- pattern.txt /*\/\\{-*
18161816
/\~ pattern.txt /*\/\\~*
18171817
/^ pattern.txt /*\/^*
1818+
/_<Tab> cmdline.txt /*\/_<Tab>*
18181819
/_CTRL-G cmdline.txt /*\/_CTRL-G*
18191820
/_CTRL-L cmdline.txt /*\/_CTRL-L*
18201821
/_CTRL-T cmdline.txt /*\/_CTRL-T*

runtime/doc/version9.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
*version9.txt* For Vim version 9.1. Last change: 2025 Jun 27
1+
*version9.txt* For Vim version 9.1. Last change: 2025 Jun 28
22

33

44
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -41632,6 +41632,8 @@ Completion: ~
4163241632
- add ":filetype" command completion
4163341633
- add "filetypecmd" completion type for |getcompletion()|
4163441634
- 'smartcase' applies to completion filtering
41635+
- 'wildchar' enables completion in search contexts using |/|, |?|, |:g|, |:v|
41636+
and |:vimgrep| commands
4163541637

4163641638
Options: ~
4163741639
- the default for 'commentstring' contains whitespace padding to have

0 commit comments

Comments
 (0)