patch 9.1.0420: :browse oldfiles prompts even with single entry Commit: https://github.com/vim/vim/commit/0b0f7d6be08df5411718797043414a6391ebfda5 Author: Christian Brabandt <c...@256bit.org> Date: Sun May 19 09:11:09 2024 +0200
patch 9.1.0420: :browse oldfiles prompts even with single entry Problem: :browse oldfiles prompts even with single entry Solution: Do not prompt, but edit the file directly, also when using :filter /pat/ browse oldfiles closes: #14794 Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/runtime/doc/usr_21.txt b/runtime/doc/usr_21.txt index 95ded58ea..fe3ee3199 100644 --- a/runtime/doc/usr_21.txt +++ b/runtime/doc/usr_21.txt @@ -1,4 +1,4 @@ -*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 @@ -207,6 +207,23 @@ You get the same list of files as with |:oldfiles|. If you want to edit 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_#<|. diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 2a5d842fc..5c34e8645 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -5622,6 +5622,9 @@ ex_oldfiles(exarg_T *eap UNUSED) 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) { @@ -5637,6 +5640,10 @@ ex_oldfiles(exarg_T *eap UNUSED) 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); @@ -5654,7 +5661,15 @@ ex_oldfiles(exarg_T *eap UNUSED) 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) { diff --git a/src/testdir/test_viminfo.vim b/src/testdir/test_viminfo.vim index 1f4a72db1..7aab27133 100644 --- a/src/testdir/test_viminfo.vim +++ b/src/testdir/test_viminfo.vim @@ -1299,4 +1299,34 @@ func Test_viminfo_merge_old_jumplist() 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", + \ " \" 11 0", + \ "", + \ "> /tmp/foobar.txt", + \ " \" 11 0", + \ "", + \ ] + call writefile(lines, 'Xviminfo1', 'D') + rviminfo! Xviminfo1 + new + " filter returns a single item + let a = execute('filter /vim/ oldfiles')->split(' ') + call assert_equal(1, len(a)) + " filter returns more than a single match + let a = execute('filter #tmp# oldfiles')->split(' ') + 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 diff --git a/src/version.c b/src/version.c index 34f474da4..aafbddcd8 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 420, /**/ 419, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/E1s8alA-00AyM4-Vn%40256bit.org.