diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-04-13 21:16:21 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-04-13 21:16:21 +0200 |
commit | 7a1637f4c00ac3d0cbf894803ada1586a1717470 (patch) | |
tree | 34aca94057f424f8fbe5a437c66b23f2fd189647 | |
parent | 067297e16a516838dbc46aaa9d8b1a507afec28d (diff) | |
download | vim-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.pro | 1 | ||||
-rw-r--r-- | src/scriptfile.c | 10 | ||||
-rw-r--r-- | src/testdir/test_options.vim | 14 | ||||
-rw-r--r-- | src/testdir/test_usercommands.vim | 52 | ||||
-rw-r--r-- | src/usercmd.c | 52 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |