summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSean Dewar <seandewar@users.noreply.github.com>2023-08-16 17:15:05 +0100
committerChristian Brabandt <cb@256bit.org>2024-01-23 22:37:39 +0100
commit1fb41032060df09ca2640dc49541f11062f6dfaa (patch)
tree47869301c90c7b3e0bf016b4c29d4b857ac0e74f /src
parent43b395ec2e7d24a067d7cb00109818b64da144a5 (diff)
patch 9.1.0049: Make "[Command Line]" a special buffer namev9.1.0049
Problem: E95 is possible if a buffer called "[Command Line]" already exists when opening the cmdwin. This can also happen if the cmdwin's buffer could not be deleted when closing. Solution: Un-name the cmdwin buffer, and give it a special name instead, similar to what's done for quickfix buffers and for unnamed prompt and scratch buffers. As a result, BufFilePre/Post are no longer fired when opening the cmdwin. Add a "command" key to the dictionary returned by getbufinfo() to differentiate the cmdwin buffer instead. (Sean Dewar) NOTE: This is technically a breaking change... maybe this needs a different solution? (Or maybe this issue can be ignored...) A GitHub search reveals some plugins expect the old behaviour. However, many of those plugins also do not seem to account for the string being translated, so they are subtly broken anyway (not withstanding the fact that you can call any old buffer "[Command Line]" too...) closes: #12819 Signed-off-by: Sean Dewar <seandewar@users.noreply.github.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c2
-rw-r--r--src/evalbuffer.c1
-rw-r--r--src/ex_getln.c3
-rw-r--r--src/testdir/test_cmdwin.vim14
-rw-r--r--src/testdir/test_normal.vim2
-rw-r--r--src/version.c2
6 files changed, 20 insertions, 4 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 64e4926475..62c396a531 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -5936,6 +5936,8 @@ buf_spname(buf_T *buf)
#endif
if (buf->b_fname != NULL)
return buf->b_fname;
+ if (buf == cmdwin_buf)
+ return (char_u *)_("[Command Line]");
#ifdef FEAT_JOB_CHANNEL
if (bt_prompt(buf))
return (char_u *)_("[Prompt]");
diff --git a/src/evalbuffer.c b/src/evalbuffer.c
index e611c52e4c..6ec734d370 100644
--- a/src/evalbuffer.c
+++ b/src/evalbuffer.c
@@ -653,6 +653,7 @@ get_buffer_info(buf_T *buf)
dict_add_number(dict, "changedtick", CHANGEDTICK(buf));
dict_add_number(dict, "hidden",
buf->b_ml.ml_mfp != NULL && buf->b_nwindows == 0);
+ dict_add_number(dict, "command", buf == cmdwin_buf);
// Get a reference to buffer variables
dict_add_dict(dict, "variables", buf->b_vars);
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 139bb6fa20..1731d2952c 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -4537,9 +4537,6 @@ open_cmdwin(void)
}
cmdwin_buf = curbuf;
- apply_autocmds(EVENT_BUFFILEPRE, NULL, NULL, FALSE, curbuf);
- (void)setfname(curbuf, (char_u *)_("[Command Line]"), NULL, TRUE);
- apply_autocmds(EVENT_BUFFILEPOST, NULL, NULL, FALSE, curbuf);
set_option_value_give_err((char_u *)"bt",
0L, (char_u *)"nofile", OPT_LOCAL);
curbuf->b_p_ma = TRUE;
diff --git a/src/testdir/test_cmdwin.vim b/src/testdir/test_cmdwin.vim
index 494c8065f2..33a2662629 100644
--- a/src/testdir/test_cmdwin.vim
+++ b/src/testdir/test_cmdwin.vim
@@ -569,4 +569,18 @@ func Test_cmdwin_interrupted()
delfunc CheckInterrupted
endfunc
+func Test_cmdwin_existing_bufname()
+ func CheckName()
+ call assert_equal(1, getbufinfo('')[0].command)
+ call assert_equal(0, getbufinfo('[Command Line]')[0].command)
+ call assert_match('#a\s*"\[Command Line\]"', execute('ls'))
+ call assert_match('%a\s*"\[Command Line\]"', execute('ls'))
+ endfunc
+
+ file [Command Line]
+ call feedkeys("q::call CheckName()\<CR>:q\<CR>", 'ntx')
+ 0file
+ delfunc CheckName
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim
index 0fd53b501e..fb9c3ded53 100644
--- a/src/testdir/test_normal.vim
+++ b/src/testdir/test_normal.vim
@@ -3158,7 +3158,7 @@ func Test_normal50_commandline()
CheckFeature cmdline_hist
func! DoTimerWork(id)
- call assert_equal('[Command Line]', bufname(''))
+ call assert_equal(1, getbufinfo('')[0].command)
" should fail, with E11, but does fail with E23?
"call feedkeys("\<c-^>", 'tm')
diff --git a/src/version.c b/src/version.c
index 63ef3632fe..2a54c47940 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 49,
+/**/
48,
/**/
47,