summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/cmdexpand.c7
-rw-r--r--src/evalfunc.c2
-rw-r--r--src/ex_getln.c19
-rw-r--r--src/normal.c2
-rw-r--r--src/proto/ex_getln.pro2
-rw-r--r--src/session.c2
-rw-r--r--src/terminal.c2
-rw-r--r--src/testdir/test_cmdline.vim6
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h6
-rw-r--r--src/vim9execute.c3
11 files changed, 38 insertions, 15 deletions
diff --git a/src/cmdexpand.c b/src/cmdexpand.c
index c36c21a3d8..c98e126a5c 100644
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -48,6 +48,8 @@ ExpandEscape(
{
int i;
char_u *p;
+ int vse_what = xp->xp_context == EXPAND_BUFFERS
+ ? VSE_BUFFER : VSE_NONE;
// May change home directory back to "~"
if (options & WILD_HOME_REPLACE)
@@ -84,9 +86,10 @@ ExpandEscape(
}
}
#ifdef BACKSLASH_IN_FILENAME
- p = vim_strsave_fnameescape(files[i], FALSE);
+ p = vim_strsave_fnameescape(files[i], vse_what);
#else
- p = vim_strsave_fnameescape(files[i], xp->xp_shell);
+ p = vim_strsave_fnameescape(files[i],
+ xp->xp_shell ? VSE_SHELL : vse_what);
#endif
if (p != NULL)
{
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 4abbdb90f6..08438242b6 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -3886,7 +3886,7 @@ f_fnameescape(typval_T *argvars, typval_T *rettv)
return;
rettv->vval.v_string = vim_strsave_fnameescape(
- tv_get_string(&argvars[0]), FALSE);
+ tv_get_string(&argvars[0]), VSE_NONE);
rettv->v_type = VAR_STRING;
}
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 07eac90863..258548ed8a 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -3894,27 +3894,32 @@ ccheck_abbr(int c)
}
/*
- * Escape special characters in "fname" for when used as a file name argument
- * after a Vim command, or, when "shell" is non-zero, a shell command.
+ * Escape special characters in "fname", depending on "what":
+ * VSE_NONE: for when used as a file name argument after a Vim command.
+ * VSE_SHELL: for a shell command.
+ * VSE_BUFFER: for the ":buffer" command.
* Returns the result in allocated memory.
*/
char_u *
-vim_strsave_fnameescape(char_u *fname, int shell UNUSED)
+vim_strsave_fnameescape(char_u *fname, int what)
{
char_u *p;
#ifdef BACKSLASH_IN_FILENAME
char_u buf[20];
int j = 0;
- // Don't escape '[', '{' and '!' if they are in 'isfname'.
- for (p = PATH_ESC_CHARS; *p != NUL; ++p)
+ // Don't escape '[', '{' and '!' if they are in 'isfname' and for the
+ // ":buffer" command.
+ for (p = what == VSE_BUFFER ? BUFFER_ESC_CHARS : PATH_ESC_CHARS;
+ *p != NUL; ++p)
if ((*p != '[' && *p != '{' && *p != '!') || !vim_isfilec(*p))
buf[j++] = *p;
buf[j] = NUL;
p = vim_strsave_escaped(fname, buf);
#else
- p = vim_strsave_escaped(fname, shell ? SHELL_ESC_CHARS : PATH_ESC_CHARS);
- if (shell && csh_like_shell() && p != NULL)
+ p = vim_strsave_escaped(fname, what == VSE_SHELL ? SHELL_ESC_CHARS
+ : what == VSE_BUFFER ? BUFFER_ESC_CHARS : PATH_ESC_CHARS);
+ if (what == VSE_SHELL && csh_like_shell() && p != NULL)
{
char_u *s;
diff --git a/src/normal.c b/src/normal.c
index 9cc2ea9248..eafd1fddb6 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -3741,7 +3741,7 @@ nv_ident(cmdarg_T *cap)
ptr = vim_strnsave(ptr, n);
if (kp_ex)
// Escape the argument properly for an Ex command
- p = vim_strsave_fnameescape(ptr, FALSE);
+ p = vim_strsave_fnameescape(ptr, VSE_NONE);
else
// Escape the argument properly for a shell command
p = vim_strsave_shellescape(ptr, TRUE, TRUE);
diff --git a/src/proto/ex_getln.pro b/src/proto/ex_getln.pro
index faecab2a74..d047e39dab 100644
--- a/src/proto/ex_getln.pro
+++ b/src/proto/ex_getln.pro
@@ -26,7 +26,7 @@ void redrawcmd(void);
void compute_cmdrow(void);
void cursorcmd(void);
void gotocmdline(int clr);
-char_u *vim_strsave_fnameescape(char_u *fname, int shell);
+char_u *vim_strsave_fnameescape(char_u *fname, int what);
void escape_fname(char_u **pp);
void tilde_replace(char_u *orig_pat, int num_files, char_u **files);
cmdline_info_T *get_cmdline_info(void);
diff --git a/src/session.c b/src/session.c
index 03b57f0e19..d2b360df89 100644
--- a/src/session.c
+++ b/src/session.c
@@ -43,7 +43,7 @@ ses_put_fname(FILE *fd, char_u *name, unsigned *flagp)
}
// escape special characters
- p = vim_strsave_fnameescape(sname, FALSE);
+ p = vim_strsave_fnameescape(sname, VSE_NONE);
vim_free(sname);
if (p == NULL)
return FAIL;
diff --git a/src/terminal.c b/src/terminal.c
index cabcf9d1b7..e9dd8ea166 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -667,7 +667,7 @@ term_start(
if (s == NULL)
break;
- p = vim_strsave_fnameescape(s, FALSE);
+ p = vim_strsave_fnameescape(s, VSE_NONE);
if (p == NULL)
break;
ga_concat(&ga, p);
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index a0f3ffda42..5975bcdf3a 100644
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -900,6 +900,12 @@ func Test_cmdline_complete_various()
call feedkeys(":unlet one two\<C-A>\<C-B>\"\<CR>", 'xt')
call assert_equal("\"unlet one two", @:)
+ " completion for the :buffer command with curlies
+ edit \{someFile}
+ call feedkeys(":buf someFile\<C-A>\<C-B>\"\<CR>", 'xt')
+ call assert_equal("\"buf {someFile}", @:)
+ bwipe {someFile}
+
" completion for the :bdelete command
call feedkeys(":bdel a b c\<C-A>\<C-B>\"\<CR>", 'xt')
call assert_equal("\"bdel a b c", @:)
diff --git a/src/version.c b/src/version.c
index 77eb6e1d98..5758bf9790 100644
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3530,
+/**/
3529,
/**/
3528,
diff --git a/src/vim.h b/src/vim.h
index b7a6388280..d2e0d9be35 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -291,6 +291,7 @@
#endif
#ifdef BACKSLASH_IN_FILENAME
# define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<")
+# define BUFFER_ESC_CHARS ((char_u *)" \t\n*?[`%#'\"|!<")
#else
# ifdef VMS
// VMS allows a lot of characters in the file name
@@ -300,6 +301,7 @@
# define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<")
# define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&")
# endif
+# define BUFFER_ESC_CHARS ((char_u *)" \t\n*?[`$\\%#'\"|!<")
#endif
// length of a buffer to store a number in ASCII (64 bits binary + NUL)
@@ -2766,5 +2768,9 @@ long elapsed(DWORD start_tick);
#define UC_BUFFER 1 // -buffer: local to current buffer
#define UC_VIM9 2 // {} argument: Vim9 syntax.
+// flags used by vim_strsave_escaped()
+#define VSE_NONE 0
+#define VSE_SHELL 1 // escape for a shell command
+#define VSE_BUFFER 2 // escape for a ":buffer" command
#endif // VIM__H
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 481c94fde6..8a14a856b1 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1147,7 +1147,8 @@ do_2string(typval_T *tv, int is_2string_any, int tolerant)
while ((e = vim_strchr(s, '\n')) != NULL)
{
*e = NUL;
- p = vim_strsave_fnameescape(s, FALSE);
+ p = vim_strsave_fnameescape(s,
+ VSE_NONE);
if (p != NULL)
{
ga_concat(&ga, p);