vim 中的一些命令是通过首先输入冒号 (:) 给出的,例如 . :wq 用于保存文件并退出 . 虽然某些命令不需要冒号,例如替换命令 (R)。我想知道这两种方法有什么区别?对于哪些需要冒号,哪些不需要,是否有任何具体规则?
4 回答
您必须查看Vim 的前身vi 的历史以获得解释。很久以前,当文本编辑必须使用键盘和附加的打印机(称为终端)来完成时,除了纸张之外没有鼠标,没有显示器,因此几乎没有交互性。编辑包括通过名为ex的编辑器进行的简短的助记命令。您发出了针对一行或多行的命令(例如:substitute/foo/bar
),而编辑器服从了。如果你不确定命令的效果,你可以写:print
几行。
时间过去了,视频终端出现了,vi 编辑器加入了 ex 命令(因为它们很有用,程序员也习惯了),但引入了更多的交互命令,如 delete( x
)、insert( i
) 等。ex 命令在命令行模式下仍然可用,命令行模式以 开头:
,以 . 结尾Enter。
Vi 和 Vim 在这方面很特别,因为它们有这些不同的模式,其中相同的键意味着不同的东西,具体取决于一个模式。要精通 Vim,您必须了解不同的模式,以及如何最好地使用他们来实现您的编辑目标。
:help vim-modes
让您有一个起点进入优秀而全面的帮助设施。
“不需要”冒号的命令称为“正常(模式)命令”。
“需要”冒号的命令称为“Ex 命令”。
Vim 作为一个模态编辑器,有许多与你所处的模式相关的命令。最明显的效果是在不同的上下文中按下相同的键可能会产生不同的结果。
在插入模式下,键盘上的大多数键都用于将字符实际输入到文档中。
您必须切换到正常模式才能拉出、放置、删除、移动光标……正常模式是您进行激光聚焦编辑的地方,Vim 以使用诸如此类的命令而闻名dcggsi/.*
。
您可以通过在普通/*visual* 模式下点击进入命令行模式。它通常用于两件事::
- 执行管理任务(写入磁盘、切换缓冲区、打开文件……)
- 使用很酷的编辑命令,例如
:m10
or:t1
或:g/foo/d
...</li>
您可以在此模式下使用的许多命令是 Vim 过去的(非常强大的)残余,被称为 Ex 命令。
简而言之,普通模式命令和 Ex 命令都不是以冒号开头的。冒号只是用来改变模式。
最重要的区别(恕我直言)是冒号命令被视为单词,而不是单个字母,并且在您按 Enter 之前不会对其进行解释。
普通模式下的命令被视为单独的字母,每个字母都有定义的含义,一旦 vim 知道如何处理它们,它们就会被执行。
例如,在正常模式下键入“de”,将删除直到单词末尾的所有内容。但是“de”并不是真正的命令;这是两个命令。“e”将您移动到单词的末尾,“d”表示“删除某些内容;等待下一次按键告诉您要删除多少。” 当您键入“d”时,它会等待您完成指令。只要您按下“e”,命令就会执行(无需等待查看是否要输入更多内容)。
这意味着在正常模式下,您不能有像“定义”或“交付”或“描述”这样的指令。只要输入'de',vim 就会执行'de' 指令。当您到达定义中的“f”时,您将开始一条新指令。
但在命令行(冒号)模式下,命令被视为单词。可能有一个名为“define”的命令和另一个名为“describe”的命令。(没有,但可能有)。
'w' could have been created as a normal mode command, if all it did was save the current file under the current filename. But ':w' does more than that. You can also do ":w new_filename", and you get a 'save as' function. That wouldn't work in normal mode. In normal mode "w new_filename" would save the file ('w'), do nothing (space), try to find the next search term ('n'), move to the next end-of-word position ('e')... and so on.