vim-patch:9.2.0676: MS-Windows: cannot switch to a buffer with '%' in its name (#40315)

Problem:  On MS-Windows it is not possible to switch to a buffer by name
          with ":b" (including via command-line completion) when the
          buffer name contains '%'.
Solution: Do not escape '%' and '#' for the ":buffer" command on
          MS-Windows.  Since ":buffer" has no EX_XFILE these are not
          expanded, and escaping them as "\%"/"\#" makes buffer name
          matching fail when '%'/'#' is in 'isfname' (the backslash is
          treated as a path separator).

fixes:  vim/vim#20529
closes: vim/vim#20548

1a96e07bf6

Co-authored-by: Hirohito Higashi <h.east.727@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
zeertzjq
2026-06-19 08:57:03 +08:00
committed by GitHub
parent 2370fc1d91
commit 1cfbf104f5
2 changed files with 19 additions and 1 deletions

View File

@@ -4192,7 +4192,10 @@ char *vim_strsave_fnameescape(const char *const fname, const int what)
{
#ifdef BACKSLASH_IN_FILENAME
# define PATH_ESC_CHARS " \t\n*?[{`%#'\"|!<"
# define BUFFER_ESC_CHARS (" \t\n*?[`%#'\"|!<")
// '%' and '#' are not escaped for ":buffer": it has no EX_XFILE, so they are
// not expanded, and escaping them as "\%"/"\#" breaks buffer name matching
// when '%'/'#' is in 'isfname' (backslash treated as a path separator).
# define BUFFER_ESC_CHARS (" \t\n*?[`'\"|!<")
char buf[sizeof(PATH_ESC_CHARS)];
int j = 0;

View File

@@ -937,4 +937,19 @@ func Test_split_window_in_BufLeave_from_switching_buffer()
bwipe! Xb
endfunc
" Switch to a buffer whose name contains '%' via completion (#20529).
func Test_buffer_switch_to_name_with_percent()
CheckMSWindows
let bufnr = bufadd('Xpercent%name')
call setbufvar(bufnr, '&buflisted', 1)
call bufload(bufnr)
enew
call feedkeys(":b Xpercent\<Tab>\<CR>", 'xt')
call assert_equal(bufnr, bufnr('%'))
exe 'bwipe! ' .. bufnr
endfunc
" vim: shiftwidth=2 sts=2 expandtab