在学习VIM函数以学习编写自己的函数时,我发现命令有时会写成preceded with the keyword normal
:
normal mz
有时使用normal
wrapped in an exec
:
exec "normal mk"
0d
精细手册中的哪个部分已经解决了?
答案 0 :(得分:24)
你对各种模式感到困惑。更具体地说,命令 模式和正常模式。
命令模式是应用ex命令的地方,即开始的命令 用冒号。 VimScript文件只是一系列ex命令。
在ex模式下需要执行普通模式命令时(命令模式)
你使用:normal
ex命令,它执行参数
处于正常模式。
当你直接执行命令时,你正在直接执行它。在你的
例如,:d
命令与范围一起使用。那和那个不一样
正常模式下的d
键,这是另一个完全不同的命令。检查
帮助:d
和d
(正常命令)。
: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 mk
(mk
在正常模式下只设置一个名为“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
。