-*usr_21.txt* For Vim version 9.1. Last change: 2019 Apr 25
+*usr_21.txt* For Vim version 9.1. Last change: 2024 May 17
VIM USER MANUAL - by Bram Moolenaar
Type "2" and press <Enter> to edit the second file.
+If you know that the filename contains a pattern, you can also |:filter| the
+list of files: >
+
+ :filter /resume/ :browse oldfiles
+<
+Since there is only one single matching filename, Vim will directly edit that
+file without prompting. If the filter matches several files, you'll get
+prompted for the list of matching files instead: >
+
+ :filter! /resume/ browse oldfiles
+< 1: ~/.viminfo ~
+ 3: /tmp/draft ~
+ Type number and <Enter> (q or empty cancels): ~
+
+Note: this time we filtered out all files NOT matching resume.
+
+
More info at |:oldfiles|, |v:oldfiles| and |c_#<|.
listitem_T *li;
int nr = 0;
char_u *fname;
+ // for a single filtered match, remember the number
+ // so we can jump directly to it without prompting
+ int matches = -1;
if (l == NULL)
{
fname = tv_get_string(&li->li_tv);
if (!message_filtered(fname))
{
+ if (matches < 0)
+ matches = nr;
+ else
+ matches = 0;
msg_outnum((long)nr);
msg_puts(": ");
msg_outtrans(fname);
if (cmdmod.cmod_flags & CMOD_BROWSE)
{
quit_more = FALSE;
- nr = prompt_for_number(FALSE);
+ // we only need to prompt if there is more than 1 match
+ if (matches > 0)
+ {
+ nr = matches;
+ // msg_putchar above sets needs_wait_return
+ need_wait_return = FALSE;
+ }
+ else
+ nr = prompt_for_number(FALSE);
msg_starthere();
if (nr > 0)
{
bw!
endfunc
+func Test_viminfo_oldfiles_filter()
+ let v:oldfiles = []
+ let _viminfofile = &viminfofile
+ let &viminfofile=''
+ let lines = [
+ \ '# comment line',
+ \ '*encoding=utf-8',
+ \ "> /tmp/vimrc_one.vim",
+ \ "\t\"\t11\t0",
+ \ "",
+ \ "> /tmp/foobar.txt",
+ \ "\t\"\t11\t0",
+ \ "",
+ \ ]
+ call writefile(lines, 'Xviminfo1', 'D')
+ rviminfo! Xviminfo1
+ new
+ " filter returns a single item
+ let a = execute('filter /vim/ oldfiles')->split('\n')
+ call assert_equal(1, len(a))
+ " filter returns more than a single match
+ let a = execute('filter #tmp# oldfiles')->split('\n')
+ call assert_equal(2, len(a))
+ " don't get prompted for the file, but directly open it
+ filter /vim/ browse oldfiles
+ call assert_equal("/tmp/vimrc_one.vim", expand("%"))
+ bw
+ let &viminfofile = _viminfofile
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 420,
/**/
419,
/**/