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 <cb@256bit.org>
This commit is contained in:
Christian Brabandt
2024-05-19 09:11:09 +02:00
parent 4776e64e72
commit 0b0f7d6be0
4 changed files with 66 additions and 2 deletions

View File

@ -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_#<|.

View File

@ -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)
{

View File

@ -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",
\ "\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

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
420,
/**/
419,
/**/