0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.2.0577: not all modifiers supported for :options

Problem:    Not all modifiers supported for :options.
Solution:   Use all cmdmod.split flags. (closes #4401)
This commit is contained in:
Bram Moolenaar
2020-04-13 21:16:21 +02:00
parent 067297e16a
commit 7a1637f4c0
6 changed files with 98 additions and 33 deletions

View File

@@ -14,5 +14,6 @@ void ex_command(exarg_T *eap);
void ex_comclear(exarg_T *eap); void ex_comclear(exarg_T *eap);
void uc_clear(garray_T *gap); void uc_clear(garray_T *gap);
void ex_delcommand(exarg_T *eap); void ex_delcommand(exarg_T *eap);
size_t add_win_cmd_modifers(char_u *buf, int *multi_mods);
void do_ucmd(exarg_T *eap); void do_ucmd(exarg_T *eap);
/* vim: set ft=c : */ /* vim: set ft=c : */

View File

@@ -967,9 +967,13 @@ ex_source(exarg_T *eap)
ex_options( ex_options(
exarg_T *eap UNUSED) exarg_T *eap UNUSED)
{ {
vim_setenv((char_u *)"OPTWIN_CMD", char_u buf[500];
(char_u *)(cmdmod.tab ? "tab" int multi_mods = 0;
: (cmdmod.split & WSP_VERT) ? "vert" : ""));
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); cmd_source((char_u *)SYS_OPTWIN_FILE, NULL);
} }
#endif #endif

View File

@@ -87,6 +87,19 @@ func Test_options_command()
" close option-window " close option-window
close 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. " Open the option-window in a new tab.
tab options tab options
" Check if the option-window is opened in a tab. " Check if the option-window is opened in a tab.
@@ -94,7 +107,6 @@ func Test_options_command()
call assert_notequal('option-window', bufname('')) call assert_notequal('option-window', bufname(''))
normal gt normal gt
call assert_equal('option-window', bufname('')) call assert_equal('option-window', bufname(''))
" close option-window " close option-window
close close

View File

@@ -4,63 +4,95 @@
function Test_cmdmods() function Test_cmdmods()
let g:mods = '' let g:mods = ''
command! -nargs=* MyCmd let g:mods .= '<mods> ' command! -nargs=* MyCmd let g:mods = '<mods>'
MyCmd MyCmd
call assert_equal('', g:mods)
aboveleft MyCmd aboveleft MyCmd
call assert_equal('aboveleft', g:mods)
abo MyCmd abo MyCmd
call assert_equal('aboveleft', g:mods)
belowright MyCmd belowright MyCmd
call assert_equal('belowright', g:mods)
bel MyCmd bel MyCmd
call assert_equal('belowright', g:mods)
botright MyCmd botright MyCmd
call assert_equal('botright', g:mods)
bo MyCmd bo MyCmd
call assert_equal('botright', g:mods)
browse MyCmd browse MyCmd
call assert_equal('browse', g:mods)
bro MyCmd bro MyCmd
call assert_equal('browse', g:mods)
confirm MyCmd confirm MyCmd
call assert_equal('confirm', g:mods)
conf MyCmd conf MyCmd
call assert_equal('confirm', g:mods)
hide MyCmd hide MyCmd
call assert_equal('hide', g:mods)
hid MyCmd hid MyCmd
call assert_equal('hide', g:mods)
keepalt MyCmd keepalt MyCmd
call assert_equal('keepalt', g:mods)
keepa MyCmd keepa MyCmd
call assert_equal('keepalt', g:mods)
keepjumps MyCmd keepjumps MyCmd
call assert_equal('keepjumps', g:mods)
keepj MyCmd keepj MyCmd
call assert_equal('keepjumps', g:mods)
keepmarks MyCmd keepmarks MyCmd
call assert_equal('keepmarks', g:mods)
kee MyCmd kee MyCmd
call assert_equal('keepmarks', g:mods)
keeppatterns MyCmd keeppatterns MyCmd
call assert_equal('keeppatterns', g:mods)
keepp MyCmd keepp MyCmd
call assert_equal('keeppatterns', g:mods)
leftabove MyCmd " results in :aboveleft leftabove MyCmd " results in :aboveleft
call assert_equal('aboveleft', g:mods)
lefta MyCmd lefta MyCmd
call assert_equal('aboveleft', g:mods)
lockmarks MyCmd lockmarks MyCmd
call assert_equal('lockmarks', g:mods)
loc MyCmd loc MyCmd
call assert_equal('lockmarks', g:mods)
" noautocmd MyCmd " noautocmd MyCmd
noswapfile MyCmd noswapfile MyCmd
call assert_equal('noswapfile', g:mods)
nos MyCmd nos MyCmd
call assert_equal('noswapfile', g:mods)
rightbelow MyCmd " results in :belowright rightbelow MyCmd " results in :belowright
call assert_equal('belowright', g:mods)
rightb MyCmd rightb MyCmd
call assert_equal('belowright', g:mods)
" sandbox MyCmd " sandbox MyCmd
silent MyCmd silent MyCmd
call assert_equal('silent', g:mods)
sil MyCmd sil MyCmd
call assert_equal('silent', g:mods)
tab MyCmd tab MyCmd
call assert_equal('tab', g:mods)
topleft MyCmd topleft MyCmd
call assert_equal('topleft', g:mods)
to MyCmd to MyCmd
call assert_equal('topleft', g:mods)
" unsilent MyCmd " unsilent MyCmd
verbose MyCmd verbose MyCmd
call assert_equal('verbose', g:mods)
verb MyCmd verb MyCmd
call assert_equal('verbose', g:mods)
vertical MyCmd vertical MyCmd
call assert_equal('vertical', g:mods)
vert MyCmd vert MyCmd
call assert_equal('vertical', g:mods)
aboveleft belowright botright browse confirm hide keepalt keepjumps aboveleft belowright botright browse confirm hide keepalt keepjumps
\ keepmarks keeppatterns lockmarks noswapfile silent tab \ keepmarks keeppatterns lockmarks noswapfile silent tab
\ topleft verbose vertical MyCmd \ topleft verbose vertical MyCmd
call assert_equal(' aboveleft aboveleft belowright belowright botright ' . call assert_equal('browse confirm hide keepalt keepjumps ' .
\ 'botright browse browse confirm confirm hide hide ' . \ 'keepmarks keeppatterns lockmarks noswapfile silent ' .
\ 'keepalt keepalt keepjumps keepjumps keepmarks keepmarks ' . \ 'verbose aboveleft belowright botright tab topleft vertical', g:mods)
\ '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)
let g:mods = '' let g:mods = ''
command! -nargs=* MyQCmd let g:mods .= '<q-mods> ' command! -nargs=* MyQCmd let g:mods .= '<q-mods> '

View File

@@ -1233,6 +1233,37 @@ add_cmd_modifier(char_u *buf, char *mod_str, int *multi_mods)
return result; 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. * Check for a <> code in a user command.
* "code" points to the '<'. "len" the length of the <> (inclusive). * "code" points to the '<'. "len" the length of the <> (inclusive).
@@ -1451,16 +1482,6 @@ uc_check_code(
*buf = '\0'; *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 // the modifiers that are simple flags
for (i = 0; mod_entries[i].varp != NULL; ++i) for (i = 0; mod_entries[i].varp != NULL; ++i)
if (*mod_entries[i].varp) if (*mod_entries[i].varp)
@@ -1475,19 +1496,12 @@ uc_check_code(
if (msg_silent > 0) if (msg_silent > 0)
result += add_cmd_modifier(buf, result += add_cmd_modifier(buf,
emsg_silent > 0 ? "silent!" : "silent", &multi_mods); 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? // TODO: How to support :unsilent?
// :verbose // :verbose
if (p_verbose > 0) if (p_verbose > 0)
result += add_cmd_modifier(buf, "verbose", &multi_mods); result += add_cmd_modifier(buf, "verbose", &multi_mods);
// :vertical // flags from cmdmod.split
if (cmdmod.split & WSP_VERT) result += add_win_cmd_modifers(buf, &multi_mods);
result += add_cmd_modifier(buf, "vertical", &multi_mods);
if (quote && buf != NULL) if (quote && buf != NULL)
{ {
buf += result - 2; buf += result - 2;

View File

@@ -746,6 +746,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
577,
/**/ /**/
576, 576,
/**/ /**/