]> granicus.if.org Git - vim/commitdiff
patch 8.2.0577: not all modifiers supported for :options v8.2.0577
authorBram Moolenaar <Bram@vim.org>
Mon, 13 Apr 2020 19:16:21 +0000 (21:16 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 13 Apr 2020 19:16:21 +0000 (21:16 +0200)
Problem:    Not all modifiers supported for :options.
Solution:   Use all cmdmod.split flags. (closes #4401)

src/proto/usercmd.pro
src/scriptfile.c
src/testdir/test_options.vim
src/testdir/test_usercommands.vim
src/usercmd.c
src/version.c

index a7d0cccccb89f1d41a226472312d39ddaa32077b..d7a2a6ad1b708b808ca9ecd349057e181a29cc5c 100644 (file)
@@ -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 : */
index a7af4e95bfd012416b2d97549a7b35a7b9ae87ab..3b7652d1fb3127458d0e864ee37142afcfe80cec 100644 (file)
@@ -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
index f9a424ff1fe09e0e8b850a984e1f3a8e50e419ce..e03d7e99cc95df67f098b4f63962441ef84c0083 100644 (file)
@@ -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
 
index e09dca5f10c706eb39e70ff4d9892a565ce880ea..0f0049569bdb68ac4d4b171145eabb487bb3280b 100644 (file)
@@ -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> '
index 7ff7f02d7eb5143ff83f38c3178c5fd4b5ea7da7..e903e6b4c3132fd033cad4549e945b31dfe088eb 100644 (file)
@@ -1233,6 +1233,37 @@ add_cmd_modifier(char_u *buf, char *mod_str, int *multi_mods)
     return result;
 }
 
+/*
+ * 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).
@@ -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;
index d5b6a05d1380cf4613a48698739e1646d9a84630..15a93938942d82a13b8361818d4d63a6a2d17238 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    577,
 /**/
     576,
 /**/