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.

Raspunde prin e-mail lui