]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0049: Make "[Command Line]" a special buffer name v9.1.0049
authorSean Dewar <seandewar@users.noreply.github.com>
Wed, 16 Aug 2023 16:15:05 +0000 (17:15 +0100)
committerChristian Brabandt <cb@256bit.org>
Tue, 23 Jan 2024 21:37:39 +0000 (22:37 +0100)
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>
runtime/doc/builtin.txt
src/buffer.c
src/evalbuffer.c
src/ex_getln.c
src/testdir/test_cmdwin.vim
src/testdir/test_normal.vim
src/version.c

index 1236703fccb30df0d12fd45b281391652f998066..9b706ba20030fe9a3c0df7b85ec28da3a164ac86 100644 (file)
@@ -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
index 64e49264754fae3e4616ced311014140767b3721..62c396a5317e90613a42c774065fad83055da379 100644 (file)
@@ -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]");
index e611c52e4ccb27ea6f99ddf95c30cfbddb75c659..6ec734d3706d21040f993f4a98c00b579f71c867 100644 (file)
@@ -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);
index 139bb6fa20d67ebca320d7935a0c6783ba2b53ca..1731d2952c011f902070d7050f90ed690c258684 100644 (file)
@@ -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;
index 494c8065f266a8b6fc1f04d88a7d4bee3be6abe5..33a2662629028f8c2a993f3969be1488cfe60b4e 100644 (file)
@@ -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
index 0fd53b501e474119fa7f33fb7398de92aefbd101..fb9c3ded53c0a3118a1ab8ae0582dc6ac55a277a 100644 (file)
@@ -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')
index 63ef3632fef38bbd0d387d2d31b1ea330e1c5088..2a54c4794018fb6b58da5b04eaa48ca2d18cfea5 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    49,
 /**/
     48,
 /**/