changeset 20043:d13f8ae3b1de v8.2.0577

patch 8.2.0577: not all modifiers supported for :options Commit: https://github.com/vim/vim/commit/7a1637f4c00ac3d0cbf894803ada1586a1717470 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Apr 13 21:16:21 2020 +0200 patch 8.2.0577: not all modifiers supported for :options Problem: Not all modifiers supported for :options. Solution: Use all cmdmod.split flags. (closes https://github.com/vim/vim/issues/4401)
author Bram Moolenaar <Bram@vim.org>
date Mon, 13 Apr 2020 21:30:36 +0200
parents 7573d650a983
children a5dca21836a2
files src/proto/usercmd.pro src/scriptfile.c src/testdir/test_options.vim src/testdir/test_usercommands.vim src/usercmd.c src/version.c
diffstat 6 files changed, 98 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/src/proto/usercmd.pro
+++ b/src/proto/usercmd.pro
@@ -14,5 +14,6 @@ void ex_command(exarg_T *eap);
 void ex_comclear(exarg_T *eap);
 void uc_clear(garray_T *gap);
 void ex_delcommand(exarg_T *eap);
+size_t add_win_cmd_modifers(char_u *buf, int *multi_mods);
 void do_ucmd(exarg_T *eap);
 /* vim: set ft=c : */
--- a/src/scriptfile.c
+++ b/src/scriptfile.c
@@ -967,9 +967,13 @@ ex_source(exarg_T *eap)
 ex_options(
     exarg_T	*eap UNUSED)
 {
-    vim_setenv((char_u *)"OPTWIN_CMD",
-	    (char_u *)(cmdmod.tab ? "tab"
-		: (cmdmod.split & WSP_VERT) ? "vert" : ""));
+    char_u  buf[500];
+    int	    multi_mods = 0;
+
+    buf[0] = NUL;
+    (void)add_win_cmd_modifers(buf, &multi_mods);
+
+    vim_setenv((char_u *)"OPTWIN_CMD", buf);
     cmd_source((char_u *)SYS_OPTWIN_FILE, NULL);
 }
 #endif
--- a/src/testdir/test_options.vim
+++ b/src/testdir/test_options.vim
@@ -87,6 +87,19 @@ func Test_options_command()
   " close option-window
   close
 
+  " Open the option-window at the top.
+  set splitbelow
+  topleft options
+  call assert_equal(1, winnr())
+  close
+
+  " Open the option-window at the bottom.
+  set nosplitbelow
+  botright options
+  call assert_equal(winnr('$'), winnr())
+  close
+  set splitbelow&
+
   " Open the option-window in a new tab.
   tab options
   " Check if the option-window is opened in a tab.
@@ -94,7 +107,6 @@ func Test_options_command()
   call assert_notequal('option-window', bufname(''))
   normal gt
   call assert_equal('option-window', bufname(''))
-
   " close option-window
   close
 
--- a/src/testdir/test_usercommands.vim
+++ b/src/testdir/test_usercommands.vim
@@ -4,63 +4,95 @@
 function Test_cmdmods()
   let g:mods = ''
 
-  command! -nargs=* MyCmd let g:mods .= '<mods> '
+  command! -nargs=* MyCmd let g:mods = '<mods>'
 
   MyCmd
+  call assert_equal('', g:mods)
   aboveleft MyCmd
+  call assert_equal('aboveleft', g:mods)
   abo MyCmd
+  call assert_equal('aboveleft', g:mods)
   belowright MyCmd
+  call assert_equal('belowright', g:mods)
   bel MyCmd
+  call assert_equal('belowright', g:mods)
   botright MyCmd
+  call assert_equal('botright', g:mods)
   bo MyCmd
+  call assert_equal('botright', g:mods)
   browse MyCmd
+  call assert_equal('browse', g:mods)
   bro MyCmd
+  call assert_equal('browse', g:mods)
   confirm MyCmd
+  call assert_equal('confirm', g:mods)
   conf MyCmd
+  call assert_equal('confirm', g:mods)
   hide MyCmd
+  call assert_equal('hide', g:mods)
   hid MyCmd
+  call assert_equal('hide', g:mods)
   keepalt MyCmd
+  call assert_equal('keepalt', g:mods)
   keepa MyCmd
+  call assert_equal('keepalt', g:mods)
   keepjumps MyCmd
+  call assert_equal('keepjumps', g:mods)
   keepj MyCmd
+  call assert_equal('keepjumps', g:mods)
   keepmarks MyCmd
+  call assert_equal('keepmarks', g:mods)
   kee MyCmd
+  call assert_equal('keepmarks', g:mods)
   keeppatterns MyCmd
+  call assert_equal('keeppatterns', g:mods)
   keepp MyCmd
+  call assert_equal('keeppatterns', g:mods)
   leftabove MyCmd  " results in :aboveleft
+  call assert_equal('aboveleft', g:mods)
   lefta MyCmd
+  call assert_equal('aboveleft', g:mods)
   lockmarks MyCmd
+  call assert_equal('lockmarks', g:mods)
   loc MyCmd
+  call assert_equal('lockmarks', g:mods)
   " noautocmd MyCmd
   noswapfile MyCmd
+  call assert_equal('noswapfile', g:mods)
   nos MyCmd
+  call assert_equal('noswapfile', g:mods)
   rightbelow MyCmd " results in :belowright
+  call assert_equal('belowright', g:mods)
   rightb MyCmd
+  call assert_equal('belowright', g:mods)
   " sandbox MyCmd
   silent MyCmd
+  call assert_equal('silent', g:mods)
   sil MyCmd
+  call assert_equal('silent', g:mods)
   tab MyCmd
+  call assert_equal('tab', g:mods)
   topleft MyCmd
+  call assert_equal('topleft', g:mods)
   to MyCmd
+  call assert_equal('topleft', g:mods)
   " unsilent MyCmd
   verbose MyCmd
+  call assert_equal('verbose', g:mods)
   verb MyCmd
+  call assert_equal('verbose', g:mods)
   vertical MyCmd
+  call assert_equal('vertical', g:mods)
   vert MyCmd
+  call assert_equal('vertical', g:mods)
 
   aboveleft belowright botright browse confirm hide keepalt keepjumps
 	      \ keepmarks keeppatterns lockmarks noswapfile silent tab
 	      \ topleft verbose vertical MyCmd
 
-  call assert_equal(' aboveleft aboveleft belowright belowright botright ' .
-      \ 'botright browse browse confirm confirm hide hide ' .
-      \ 'keepalt keepalt keepjumps keepjumps keepmarks keepmarks ' .
-      \ 'keeppatterns keeppatterns aboveleft aboveleft lockmarks lockmarks noswapfile ' .
-      \ 'noswapfile belowright belowright silent silent tab topleft topleft verbose verbose ' .
-      \ 'vertical vertical ' .
-      \ 'aboveleft belowright botright browse confirm hide keepalt keepjumps ' .
-      \ 'keepmarks keeppatterns lockmarks noswapfile silent tab topleft ' .
-      \ 'verbose vertical ', g:mods)
+  call assert_equal('browse confirm hide keepalt keepjumps ' .
+      \ 'keepmarks keeppatterns lockmarks noswapfile silent ' .
+      \ 'verbose aboveleft belowright botright tab topleft vertical', g:mods)
 
   let g:mods = ''
   command! -nargs=* MyQCmd let g:mods .= '<q-mods> '
--- a/src/usercmd.c
+++ b/src/usercmd.c
@@ -1234,6 +1234,37 @@ add_cmd_modifier(char_u *buf, char *mod_
 }
 
 /*
+ * Add modifiers from "cmdmod.split" to "buf".  Set "multi_mods" when one was
+ * added.  Return the number of bytes added.
+ */
+    size_t
+add_win_cmd_modifers(char_u *buf, int *multi_mods)
+{
+    size_t result = 0;
+
+    // :aboveleft and :leftabove
+    if (cmdmod.split & WSP_ABOVE)
+	result += add_cmd_modifier(buf, "aboveleft", multi_mods);
+    // :belowright and :rightbelow
+    if (cmdmod.split & WSP_BELOW)
+	result += add_cmd_modifier(buf, "belowright", multi_mods);
+    // :botright
+    if (cmdmod.split & WSP_BOT)
+	result += add_cmd_modifier(buf, "botright", multi_mods);
+
+    // :tab
+    if (cmdmod.tab > 0)
+	result += add_cmd_modifier(buf, "tab", multi_mods);
+    // :topleft
+    if (cmdmod.split & WSP_TOP)
+	result += add_cmd_modifier(buf, "topleft", multi_mods);
+    // :vertical
+    if (cmdmod.split & WSP_VERT)
+	result += add_cmd_modifier(buf, "vertical", multi_mods);
+    return result;
+}
+
+/*
  * Check for a <> code in a user command.
  * "code" points to the '<'.  "len" the length of the <> (inclusive).
  * "buf" is where the result is to be added.
@@ -1451,16 +1482,6 @@ uc_check_code(
 	    *buf = '\0';
 	}
 
-	// :aboveleft and :leftabove
-	if (cmdmod.split & WSP_ABOVE)
-	    result += add_cmd_modifier(buf, "aboveleft", &multi_mods);
-	// :belowright and :rightbelow
-	if (cmdmod.split & WSP_BELOW)
-	    result += add_cmd_modifier(buf, "belowright", &multi_mods);
-	// :botright
-	if (cmdmod.split & WSP_BOT)
-	    result += add_cmd_modifier(buf, "botright", &multi_mods);
-
 	// the modifiers that are simple flags
 	for (i = 0; mod_entries[i].varp != NULL; ++i)
 	    if (*mod_entries[i].varp)
@@ -1475,19 +1496,12 @@ uc_check_code(
 	if (msg_silent > 0)
 	    result += add_cmd_modifier(buf,
 		    emsg_silent > 0 ? "silent!" : "silent", &multi_mods);
-	// :tab
-	if (cmdmod.tab > 0)
-	    result += add_cmd_modifier(buf, "tab", &multi_mods);
-	// :topleft
-	if (cmdmod.split & WSP_TOP)
-	    result += add_cmd_modifier(buf, "topleft", &multi_mods);
 	// TODO: How to support :unsilent?
 	// :verbose
 	if (p_verbose > 0)
 	    result += add_cmd_modifier(buf, "verbose", &multi_mods);
-	// :vertical
-	if (cmdmod.split & WSP_VERT)
-	    result += add_cmd_modifier(buf, "vertical", &multi_mods);
+	// flags from cmdmod.split
+	result += add_win_cmd_modifers(buf, &multi_mods);
 	if (quote && buf != NULL)
 	{
 	    buf += result - 2;
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    577,
+/**/
     576,
 /**/
     575,