为什么这个功能非常简单:
function! ParseAllEvents()
let i = 1
while i > 0
exec 'ParseEvent('.i.')'
let i -= 1
endwhile
endfunction
和/或:
function! ParseAllEvents()
let i = 1
while i > 0
ParseEvent(i)
let i -= 1
endwhile
endfunction
生成此错误?
E488:尾随字符:ParseEvent(1)
在命令行中调用ParseEvent(i)
函数时工作正常
答案 0 :(得分:1)
所以,正如我们在评论中讨论的那样,这是一个“召唤”的问题
通过预先加:call
。
通常,在期望表达式的任何地方都会计算函数, 但这并不意味着它们会直接在您的脚本中进行评估, 因为Vim脚本只是一系列ex命令(以a开头的命令) 结肠)。函数不是ex命令。
让我们来实际,看看用户手册中的内容 第41章:
41.3表达式
Vim有一种丰富而简单的方法来处理表达式。你可以看看 这里定义:| expression-syntax |。在这里我们将展示最常见的 项目
上面提到的数字,字符串和变量是表达式 他们自己。因此,无论在哪里都有表达,你可以使用一个数字, 字符串或变量。表达式中的其他基本项是:
$NAME environment variable &name option @r register
这里提到的表达式不是ex命令。大多数时候 表达式在命令参数中计算。这是一个Vim表达式:
i+=1
但你不能直接在Vim脚本中使用它,因为它不是ex命令。您 需要类似的东西:
:let i+=1
现在查看:let
的帮助:
:let {var-name} = {expr1} :let E18 Set internal variable {var-name} to the result of the expression {expr1}. The variable will get the type from the {expr}. If {var-name} didn't exist yet, it is created.
我们正在寻找{expr1}
。这意味着表达是预期的 - 那就是
在使用ex命令之前需要检查的内容。
返回功能,请注意:call
命令允许您调用
在前环境中的一个功能。
因此,如果正在使用的命令需要表达式参数,请继续
包括你的功能和其他常规的东西。他们将被评估,
变量的值将“屈服”等等。 :execute
来了
如果命令接受文本参数,则很方便。例如,如果您需要移动
当前行到存储在变量中的行号,可以使用:m
命令。帮助:
:[range]m[ove] {address} :m :mo :move E134 Move the lines given by [range] to below the line given by {address}.
如您所见,地址是直接的,而不是表达式。如果你
将数字放在名为line
的变量中并执行此操作:
:m line
这是一个错误,因为没有编号为line
的行。那你需要
:exec
在执行之前评估表达式 - 这就是它的作用,
将表达式作为参数,对其进行评估并作为ex命令执行。
:exec "m " . line
" ^^^^^^^^^^^
" This expression evaluates to, say, "m 14" which is then executed