vim for循环“尾随字符”错误

时间:2012-01-12 19:59:54

标签: for-loop vim

为什么这个功能非常简单:

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)函数时工作正常

1 个答案:

答案 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