# HG changeset patch # User Bram Moolenaar # Date 1586806236 -7200 # Node ID d13f8ae3b1de7c8ff3bffb6c6ebc3cf2cc7c9044 # Parent 7573d650a98369f63581bd193f1250b0ce42091f patch 8.2.0577: not all modifiers supported for :options Commit: https://github.com/vim/vim/commit/7a1637f4c00ac3d0cbf894803ada1586a1717470 Author: Bram Moolenaar 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) diff --git a/src/proto/usercmd.pro b/src/proto/usercmd.pro --- 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 --- 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 --- 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 --- 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 .= ' ' + command! -nargs=* MyCmd let g: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 .= ' ' diff --git a/src/usercmd.c b/src/usercmd.c --- 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; diff --git a/src/version.c b/src/version.c --- 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,