mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.1934: Vim9: command modifiers in :def function not tested
Problem: Vim9: command modifiers in :def function not tested. Solution: Add tests. Fix using modifier before filter command.
This commit is contained in:
@@ -1782,14 +1782,27 @@ do_one_cmd(
|
|||||||
*/
|
*/
|
||||||
cmd = ea.cmd;
|
cmd = ea.cmd;
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
// In Vim9 script a colon is required before the range.
|
// In Vim9 script a colon is required before the range. This may also be
|
||||||
may_have_range = !vim9script || starts_with_colon;
|
// after command modifiers.
|
||||||
|
if (vim9script)
|
||||||
|
{
|
||||||
|
may_have_range = FALSE;
|
||||||
|
for (p = ea.cmd; p >= *cmdlinep; --p)
|
||||||
|
{
|
||||||
|
if (*p == ':')
|
||||||
|
may_have_range = TRUE;
|
||||||
|
if (p < ea.cmd && !VIM_ISWHITE(*p))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
may_have_range = TRUE;
|
||||||
if (may_have_range)
|
if (may_have_range)
|
||||||
#endif
|
#endif
|
||||||
ea.cmd = skip_range(ea.cmd, TRUE, NULL);
|
ea.cmd = skip_range(ea.cmd, TRUE, NULL);
|
||||||
|
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
if (vim9script && !starts_with_colon)
|
if (vim9script && !may_have_range)
|
||||||
{
|
{
|
||||||
if (ea.cmd == cmd + 1 && *cmd == '$')
|
if (ea.cmd == cmd + 1 && *cmd == '$')
|
||||||
// should be "$VAR = val"
|
// should be "$VAR = val"
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
source check.vim
|
source check.vim
|
||||||
source vim9.vim
|
source vim9.vim
|
||||||
|
source term_util.vim
|
||||||
source view_util.vim
|
source view_util.vim
|
||||||
|
|
||||||
def Test_edit_wildcards()
|
def Test_edit_wildcards()
|
||||||
@@ -312,7 +313,7 @@ def Test_filter_is_not_modifier()
|
|||||||
assert_equal([#{x: 3, y: 4}], tags)
|
assert_equal([#{x: 3, y: 4}], tags)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
def Test_filter_is_recognized()
|
def Test_command_modifier_filter()
|
||||||
var lines =<< trim END
|
var lines =<< trim END
|
||||||
final expected = "\nType Name Content\n c \"c piyo"
|
final expected = "\nType Name Content\n c \"c piyo"
|
||||||
@a = 'hoge'
|
@a = 'hoge'
|
||||||
@@ -324,6 +325,135 @@ def Test_filter_is_recognized()
|
|||||||
CheckDefAndScriptSuccess(lines)
|
CheckDefAndScriptSuccess(lines)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
def Test_win_command_modifiers()
|
||||||
|
assert_equal(1, winnr('$'))
|
||||||
|
|
||||||
|
set splitright
|
||||||
|
vsplit
|
||||||
|
assert_equal(2, winnr())
|
||||||
|
close
|
||||||
|
aboveleft vsplit
|
||||||
|
assert_equal(1, winnr())
|
||||||
|
close
|
||||||
|
set splitright&
|
||||||
|
|
||||||
|
vsplit
|
||||||
|
assert_equal(1, winnr())
|
||||||
|
close
|
||||||
|
belowright vsplit
|
||||||
|
assert_equal(2, winnr())
|
||||||
|
close
|
||||||
|
rightbelow vsplit
|
||||||
|
assert_equal(2, winnr())
|
||||||
|
close
|
||||||
|
|
||||||
|
browse set
|
||||||
|
assert_equal('option-window', expand('%'))
|
||||||
|
close
|
||||||
|
|
||||||
|
vsplit
|
||||||
|
botright split
|
||||||
|
assert_equal(3, winnr())
|
||||||
|
assert_equal(&columns, winwidth(0))
|
||||||
|
close
|
||||||
|
close
|
||||||
|
|
||||||
|
vsplit
|
||||||
|
topleft split
|
||||||
|
assert_equal(1, winnr())
|
||||||
|
assert_equal(&columns, winwidth(0))
|
||||||
|
close
|
||||||
|
close
|
||||||
|
|
||||||
|
gettabinfo()->len()->assert_equal(1)
|
||||||
|
tab split
|
||||||
|
gettabinfo()->len()->assert_equal(2)
|
||||||
|
tabclose
|
||||||
|
|
||||||
|
vertical new
|
||||||
|
assert_inrange(&columns / 2 - 2, &columns / 2 + 1, winwidth(0))
|
||||||
|
close
|
||||||
|
enddef
|
||||||
|
|
||||||
|
func Test_command_modifier_confirm()
|
||||||
|
CheckNotGui
|
||||||
|
CheckRunVimInTerminal
|
||||||
|
|
||||||
|
" Test for saving all the modified buffers
|
||||||
|
let lines =<< trim END
|
||||||
|
call setline(1, 'changed')
|
||||||
|
def Getout()
|
||||||
|
confirm write Xfile
|
||||||
|
enddef
|
||||||
|
END
|
||||||
|
call writefile(lines, 'Xconfirmscript')
|
||||||
|
call writefile(['empty'], 'Xfile')
|
||||||
|
let buf = RunVimInTerminal('-S Xconfirmscript', {'rows': 8})
|
||||||
|
call term_sendkeys(buf, ":call Getout()\n")
|
||||||
|
call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
|
||||||
|
call term_sendkeys(buf, "y")
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
|
||||||
|
call assert_equal(['changed'], readfile('Xfile'))
|
||||||
|
call delete('Xfile')
|
||||||
|
call delete('Xconfirmscript')
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
def Test_command_modifiers_keep()
|
||||||
|
if has('unix')
|
||||||
|
def DoTest(addRflag: bool, keepMarks: bool, hasMarks: bool)
|
||||||
|
new
|
||||||
|
setline(1, ['one', 'two', 'three'])
|
||||||
|
normal 1Gma
|
||||||
|
normal 2Gmb
|
||||||
|
normal 3Gmc
|
||||||
|
if addRflag
|
||||||
|
set cpo+=R
|
||||||
|
else
|
||||||
|
set cpo-=R
|
||||||
|
endif
|
||||||
|
if keepMarks
|
||||||
|
keepmarks :%!cat
|
||||||
|
else
|
||||||
|
:%!cat
|
||||||
|
endif
|
||||||
|
if hasMarks
|
||||||
|
assert_equal(1, line("'a"))
|
||||||
|
assert_equal(2, line("'b"))
|
||||||
|
assert_equal(3, line("'c"))
|
||||||
|
else
|
||||||
|
assert_equal(0, line("'a"))
|
||||||
|
assert_equal(0, line("'b"))
|
||||||
|
assert_equal(0, line("'c"))
|
||||||
|
endif
|
||||||
|
quit!
|
||||||
|
enddef
|
||||||
|
DoTest(false, false, true)
|
||||||
|
DoTest(true, false, false)
|
||||||
|
DoTest(false, true, true)
|
||||||
|
DoTest(true, true, true)
|
||||||
|
set cpo&vim
|
||||||
|
endif
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
# lockmarks
|
||||||
|
# keepalt
|
||||||
|
# keeppatterns
|
||||||
|
# keepjumps
|
||||||
|
enddef
|
||||||
|
|
||||||
|
def Test_command_modifier_other()
|
||||||
|
# TODO
|
||||||
|
# hide
|
||||||
|
# noautocmd
|
||||||
|
# noswapfile
|
||||||
|
# sandbox
|
||||||
|
# silent
|
||||||
|
# silent!
|
||||||
|
# unsilent
|
||||||
|
# verbose
|
||||||
|
enddef
|
||||||
|
|
||||||
def Test_eval_command()
|
def Test_eval_command()
|
||||||
var from = 3
|
var from = 3
|
||||||
var to = 5
|
var to = 5
|
||||||
|
@@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
1934,
|
||||||
/**/
|
/**/
|
||||||
1933,
|
1933,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -2642,6 +2642,7 @@ compile_call(
|
|||||||
type_T *type = ((type_T **)stack->ga_data)[
|
type_T *type = ((type_T **)stack->ga_data)[
|
||||||
stack->ga_len - 2];
|
stack->ga_len - 2];
|
||||||
|
|
||||||
|
// add() can be compiled to instructions if we know the type
|
||||||
if (type->tt_type == VAR_LIST)
|
if (type->tt_type == VAR_LIST)
|
||||||
{
|
{
|
||||||
// inline "add(list, item)" so that the type can be checked
|
// inline "add(list, item)" so that the type can be checked
|
||||||
@@ -7173,10 +7174,6 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ':':
|
|
||||||
starts_with_colon = TRUE;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -7195,6 +7192,16 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
|
|||||||
generate_cmdmods(&cctx, &local_cmdmod);
|
generate_cmdmods(&cctx, &local_cmdmod);
|
||||||
undo_cmdmod(&local_cmdmod);
|
undo_cmdmod(&local_cmdmod);
|
||||||
|
|
||||||
|
// Check if there was a colon after the last command modifier or before
|
||||||
|
// the current position.
|
||||||
|
for (p = ea.cmd; p >= line; --p)
|
||||||
|
{
|
||||||
|
if (*p == ':')
|
||||||
|
starts_with_colon = TRUE;
|
||||||
|
if (p < ea.cmd && !VIM_ISWHITE(*p))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Skip ":call" to get to the function name.
|
// Skip ":call" to get to the function name.
|
||||||
p = ea.cmd;
|
p = ea.cmd;
|
||||||
if (checkforcmd(&ea.cmd, "call", 3))
|
if (checkforcmd(&ea.cmd, "call", 3))
|
||||||
|
Reference in New Issue
Block a user