# HG changeset patch # User Christian Brabandt # Date 1706047207 -3600 # Node ID 08e6a44e5c77cfa3c2103522e15dc38c52dc2fa4 # Parent 743d5d79c489fd4d57ce38df5708f2604cd9f8cb patch 9.1.0049: Make "[Command Line]" a special buffer name Commit: https://github.com/vim/vim/commit/1fb41032060df09ca2640dc49541f11062f6dfaa Author: Sean Dewar Date: Wed Aug 16 17:15:05 2023 +0100 patch 9.1.0049: Make "[Command Line]" a special buffer name 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 Signed-off-by: Christian Brabandt diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.1. Last change: 2024 Jan 13 +*builtin.txt* For Vim version 9.1. Last change: 2024 Jan 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -3244,6 +3244,8 @@ getbufinfo([{dict}]) bufnr Buffer number. changed TRUE if the buffer is modified. changedtick Number of changes made to the buffer. + command TRUE if the buffer belongs to the + command-line window |cmdwin|. hidden TRUE if the buffer is hidden. lastused Timestamp in seconds, like |localtime()|, when the buffer was diff --git a/src/buffer.c b/src/buffer.c --- 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 --- 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 --- 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 --- 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()\:q\", '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 --- 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("\", 'tm') diff --git a/src/version.c b/src/version.c --- 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,