summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-04-13 21:16:21 +0200
committerBram Moolenaar <Bram@vim.org>2020-04-13 21:16:21 +0200
commit7a1637f4c00ac3d0cbf894803ada1586a1717470 (patch)
tree34aca94057f424f8fbe5a437c66b23f2fd189647
parent067297e16a516838dbc46aaa9d8b1a507afec28d (diff)
downloadvim-git-7a1637f4c00ac3d0cbf894803ada1586a1717470.tar.gz
patch 8.2.0577: not all modifiers supported for :optionsv8.2.0577
Problem: Not all modifiers supported for :options. Solution: Use all cmdmod.split flags. (closes #4401)
-rw-r--r--src/proto/usercmd.pro1
-rw-r--r--src/scriptfile.c10
-rw-r--r--src/testdir/test_options.vim14
-rw-r--r--src/testdir/test_usercommands.vim52
-rw-r--r--src/usercmd.c52
-rw-r--r--src/version.c2
6 files changed, 98 insertions, 33 deletions
diff --git a/src/proto/usercmd.pro b/src/proto/usercmd.pro
index a7d0ccccc..d7a2a6ad1 100644
--- 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 : */
diff --git a/src/scriptfile.c b/src/scriptfile.c
index a7af4e95b..3b7652d1f 100644
--- 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
diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim
index f9a424ff1..e03d7e99c 100644
--- 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
diff --git a/src/testdir/test_usercommands.vim b/src/testdir/test_usercommands.vim
index e09dca5f1..0f0049569 100644
--- 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> '
diff --git a/src/usercmd.c b/src/usercmd.c
index 7ff7f02d7..e903e6b4c 100644
--- a/src/usercmd.c
+++ b/src/usercmd.c
@@ -1234,6 +1234,37 @@ add_cmd_modifier(char_u *buf, char *mod_str, int *multi_mods)
}
/*
+ * 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;
diff --git a/src/version.c b/src/version.c
index d5b6a05d1..15a939389 100644
--- 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,