10

我正在尝试做一些听起来超级简单的事情,但由于某种原因它不起作用。命令:

:m 10

将当前行移动到第 10 行的正下方,并且

:echo line(".") - 2

打印出光标前两行的行号。阅读文档后,我编写了以下命令:

:m line(".") - 2

它导致了这个错误:

M14:地址无效

所以我认为除非我使用=符号,否则不会评估函数,所以我尝试了:

:m =line(".") - 2

这给了我同样的错误。为了确保空格不是原因,我尝试了:

:m =line(".")

这仍然给了我同样的错误!我在这里做错了什么?


我确保它:m接受整数并line()返回整数。

:echo type(5)
0
:echo type(line("."))
0
4

3 回答 3

9

为了评估表达式并将其传递给 ex-mode 命令,您需要使用该execute命令。在您的情况下,这有效:

:execute "m" line(".") - 2

您可以将其execute视为采用单个变量的函数"m" line(".") - 2。该变量被评估,然后在 ex-mode 中作为字符串执行。

如需更多帮助,请参阅:help execute

于 2013-01-15T22:35:17.137 回答
2

我建议你使用这样的相对地址:

:m-2

如需更多帮助,请参阅:

:h range
于 2013-01-15T22:39:46.240 回答
1

实际上,您的原始答案几乎是正确的:

:m <C-R>=line(".") - 2

本来可以的。其他解决方案也是正确的,但是您应该查看有关表达式寄存器 ( :h quote_=) 的 vim 文档,我相信您会发现一些有趣的东西!

于 2013-01-15T23:37:07.747 回答