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

dot*_*hen 16 vim function

在研究VIM函数以学习编写自己的函数时,我发现命令有时会normal写入关键字:

normal mz
Run Code Online (Sandbox Code Playgroud)

有时normal 包裹在exec:

exec "normal mk"
Run Code Online (Sandbox Code Playgroud)

或者有时单独上线 ;

0d
Run Code Online (Sandbox Code Playgroud)

在精细手册中的哪个地址?

sid*_*yll 24

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

命令模式是应用ex命令的位置,以冒号开头的命令.VimScript文件只是一系列ex命令.

当您在ex模式(命令模式)下需要执行普通模式命令时,可以使用 :normalex命令,该命令执行正常模式下的参数.

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

:execute命令构建为字符串并将其作为ex命令执行非常有用.在你的例子中,它没用.但是在其他情况下它会变得很方便,例如当你有一个变量持有行号并希望在命令中使用它的值时:

:let i=4
:exec "2," . i . "d"
Run Code Online (Sandbox Code Playgroud)

这是一样的

:2,4d
Run Code Online (Sandbox Code Playgroud)

  • 你可能喜欢阅读Steve Losh的书中的第28,29和30章:http://learnvimscriptthehardway.stevelosh.com/ (2认同)
  • @sidyll在命令模式下没有单独的搜索.有些东西看起来像"空命令":"转到范围内的最后一行".你所引用的搜索是范围的一部分,但是执行`:1 <CR>`,`:'<< CR>`和`:$ <CR>`按预期行事:转到第一行,转到开始视觉选择并转到最后一行.同样适用于filter命令:`:!`只是一个奇怪的命令名.如果你正在谈论启动命令行模式的不同方法,那么你错过了表达式寄存器的各种用法(主要是`<Cr> =`),`input()`,`<C - \> e`(主要用于映射) ),可能还有别的东西. (2认同)

Jor*_*ing 7

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

:h norm

:norm[al][!] {commands}

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

换句话说,normal mz在脚本中等同于mz在普通模式下键入.

:h exec

:exe[cute] {expr1} ..

执行{expr1}作为Ex命令评估得到的字符串....

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

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

:execute "normal ixxx\<Esc>"
Run Code Online (Sandbox Code Playgroud)

这有一个<Esc>角色,请参阅|expr-string|.

至于0d一些Ex(命令行)命令可以给出一系列行号来执行.0通常被解释为1,因为Vim行编号从1开始,而不是0,所以:0d(和:1d)只是删除第一行.:2,4d会删除第二行,第三行和第四行.有关:h cmdline-ranges详细信息,请参阅