VIM功能:何时使用“正常”,何时使用“exec”以及何时何时使用?

时间:2012-03-15 16:36:46

标签: function vim

在学习VIM函数以学习编写自己的函数时,我发现命令有时会写成preceded with the keyword normal

normal mz

有时使用normal wrapped in an exec

exec "normal mk"

或有时alone on the line;

0d

精细手册中的哪个部分已经解决了?

2 个答案:

答案 0 :(得分:24)

你对各种模式感到困惑。更具体地说,命令 模式和正常模式。

命令模式是应用ex命令的地方,即开始的命令 用冒号。 VimScript文件只是一系列ex命令。

在ex模式下需要执行普通模式命令时(命令模式) 你使用:normal ex命令,它执行参数 处于正常模式。

当你直接执行命令时,你正在直接执行它。在你的 例如,:d命令与范围一起使用。那和那个不一样 正常模式下的d键,这是另一个完全不同的命令。检查 帮助:dd(正常命令)。

:execute对于将命令构建为字符串并将执行作为字符串非常有用 前命令。在你的例子中,它没用。但它在其他方面变得很方便 例如,当您有一个包含行号和想要的变量时 在命令中使用它的值:

:let i=4
:exec "2," . i . "d"

相同
:2,4d

答案 1 :(得分:7)

让我们问一下Vim广泛的内置帮助系统,您可以通过键入:h,然后输入您感兴趣的命令或关键字来访问该系统:

:h norm

  

:norm[al][!] {commands}

     

执行普通模式命令{commands}。这使得可以执行在命令行上键入的正常模式命令。 ......

换句话说,脚本中的normal mz相当于在正常模式下键入mz

:h exec

  

:exe[cute] {expr1} ..

     

执行作为Ex命令评估{expr1}的结果的字符串。 ...

我不清楚为什么链接脚本的作者使用exec "normal mk"代替normal mkmk在正常模式下只设置一个名为“k”的标记。但是,文档确实提供了这个:

  

:execute也是避免在:normal命令的Vim脚本中输入控制字符的好方法:

:execute "normal ixxx\<Esc>"
     

这有一个<Esc>字符,请参阅|expr-string|

对于0d,可以为一些Ex(命令行)命令指定要执行的行号范围。 0通常被解释为1,因为Vim行编号从1开始,而不是0,因此:0d(和:1d)只删除第一行。 :2,4d将删除第二行,第三行和第四行。有关详细信息,请参阅 :h cmdline-ranges