normal命令

到目前为止,我们已经涵盖了大部分有用的 Vimscript 命令,但那些平时在普通模式下使用的命令又如何呢? 我们可否以某种方式把所有编辑文本的知识点运用到脚本中呢?

答案是:“当然了”。我们之前已经看到过了 normal 命令,那么现在是时候来更进一步地学习它了。 运行以下命令:

:normal G

Vim 会把光标移到当前文件的最后一行,就像在普通模式下按下了 G 。 现在运行以下命令:

:normal ggdd

Vim 会移动到文件的第一行(gg),然后删除它(dd)。

normal 命令仅仅接受一序列的按键,并把它们伪装成是在普通模式下键入的。这看起来很简单。

避开映射

运行以下命令,把 G 键映射为其他的东西:

:nnoremap G dd

现在在普通模式下按下 G 会删除一行。试试这个命令:

:normal G

Vim 会删除当前行。normal 命令会把任何存在的映射都考虑在内。

这意味着我们需要 normal 有某种东西,类似于 nmapnnoremap 版本, 否则我们根本没法使用它,因为我们不知道哪些按键被用户映射过了。

幸运的是 Vimscript 有 normal! 命令,它就是我们要找的。运行命令:

:normal! G

这次 Vim 移动到文件的底部,即使 G 已经被映射了。

在写 Vimscript 时,你应该总是使用 normal!,并且决不使用普通的 normal'。 你不能信任用户可能已经在~/.vimrc` 文件中映射过的键。

特殊字符

如果你已经使用过 normal! 足够长时间,你可能会注意到一个问题。试下以下命令:

:normal! /foo<cr>

乍看起来,这似乎会执行一个查询 foo 的搜索,但是你会发现并不是这样的。 问题在于 normal! 不能解析类似 <cr> 的特殊字符。

在这个例子中,Vim 认为你想搜索“f,o,o,<,c,r,>”,甚至没有意识到你按下回车键来执行搜索! 我们会在下一章节中讨论如何处理这问题。

练习

阅读 :help normal。结尾处会提到下一章节的主题。

友情提醒

如果你不太想挑战,就跳过这一部分。如果想,祝你好运!

重新调用 :help normal 中讲的撤销。尝试创建一个映射,使其可以删除两行,但是可以分别撤销删除的每一行。 nnoremap <leader>ddddd 是个不错的起点。

实际上,你在这儿并不需要 normal!nnoremap 就足够了),但这说明了一个重要信息: 有时候阅读一个 Vim 命令能触发一个完全无关的有意思的事情。

如果你从来没有用过 helpgrep 命令,你可能现在就需要它了。 阅读 :help helpgrep。注意有关如何浏览匹配到的内容的部分。

暂时不用担心模式,我们马上会讲到。现在只要知道你可以用类似 foo*bar 的东西来在文档中找到包含这个正则表达式的行就行了。

不幸的是,helpgrep 有时候会令人沮丧,因为在你能找到它们之前,需要知道应该搜索什么单词! 我会暂时放你一马,让你获知,在这个例子中,需要寻找一个方法来手动打破 Vim 的撤销序列, 以致映射中删除的两行可以被分别撤销。

在以后,必须注意实效。有时候,当你不能精确的知道要找什么的话, Google 能更快、更轻松的找到。

原文地址:http://learnvimscriptthehardway.stevelosh.com/chapters/29.html