post

Vim zh-cn:模式

Contents

简介

我们在上一章中初次结识了模式,现在,让我们了解一下模式的概念,以及在每个模式中能做什么。

模式的类型

Vim中有三类模式,正常模式(normal),插入模式(insert)和可视模式(visual)。

  • 正常模式中可以执行命令。默认情况下,Vim启动后会进入这个模式。
  • 插入模式中可以插入文本。
  • 可视模式中可以可视化地选择一段文本,然后仅针对这段文本执行命令或操作。

正常模式

正常模式是Vim的默认模式。让我们看看这个模式中能做什么。

键入:echo "hello world"然后按下回车键。应该会看到那句著名的hello world回显给你。刚才在Vim中执行的是:echo命令,传给它的文本会回显在屏幕上。

键入/hello然后按下回车键。Vim会搜索这个词,并跳转到第一次出现的地方。

这是两个简单的例子,在后续的章节中会看到,正常模式中可以执行很多类似的命令。

如何使用帮助

学习正常模式过程中,重要的是要学会使用:help命令。通过Vim的帮助,能了解这些命令的详情。

切记,你并不需要记住Vim中所有的命令,只需在用到之时能找到它即可。例如,查看:help usr_toc会得到参考手册的目录。在:help index中可以搜索你感兴趣的特定的话题,例如,执行/insert mode可以找到插入模式的相关信息。

如果起先你没有记住这个两个帮助主题的名字,按下F1或执行:help即可。

插入模式

当Vim启动后进入了正常模式,我们已经知道,使用i可以进入插入模式。从正常模式切换到插入模式也有其他的办法:

  • 执行:e dapping.txt
  • 按下i
  • 输入以下的文字(包含所有的拼写错误,稍后会修正)

means being determined about being determined and being passionate about being passionate

  • 按下<Esc>键切换回正常模式
  • 执行:w

哎呀,这一行的开头少了一个词,但是光标在行尾,怎么办呢?

需要把光标移动到行首并且插入一个词,什么办法最高效呢?是使用鼠标?使用箭头键?还是按home键后再按下i切换到插入模式呢?

最高效的办法是按下I(大写的i):

  • 按下I
  • 键入Dappin
  • 按下<Esc>键切换回正常模式

注意到我们用了一个不同的办法切换到插入模式。它的特别之处在于,既移动光标到了行首,又切换到了插入模式。

同时,也主要到输入完毕后及时切换回正常模式是多么重要了。养成这个习惯会很有好处,因为在你输入完初稿之后,大部分工作(改写、编辑、润色)都在正常模式中完成。

现在,来看看i系列的其他命令。注意到按下i会把光标置于当前位置之前,并切换到插入模式。要把光标置于当前位置之后的话,按a.

  • a
  • 键入g(”Dapping”现在完整了)
  • 按下<Esc>切换回正常模式

aA键之间的关系同iI键之间的关系类似。如果你要在行尾附加文字,按A键。

  • A
  • 键入.(在句子后面补上一个句号)
  • 按下<Esc>切换回正常模式

总结一下刚学的四个按键:

命令 行为
i 在光标之前插入文本
I 在行首插入文本
a 在光标之后插入文本
A 在行尾插入文本

注意到大写命令是怎么比小写命令更’大一点’。

现在可以在当前行内熟练地移动光标了,让我们看看怎么移动到新的一行。如果想要新开一行,按o键。

  • o
  • 键入I'm a rapper.
  • <Esc>返回到正常模式

嗯,如果刚写的这一行之前再插入一空行就更好了。

  • O (upper case ‘O’)
  • <Esc>返回到正常模式

总结一下刚学的两个新按键:

命令 行为
o 在当前行之下开始一新行
O 在当前行之上开始一新行

注意到大小写的’o’命令在新行的方向上是相反的。

刚写的那段文字有啥问题么?呃,应该是’dapper’不是’rapper’。要换掉一个字符,怎么做最高效呢?

我们可以按i切换到插入模式,按<Del>键删除掉r,键入d然后按<Esc>返回到正常模式。但这么简单一个修改需要四个步骤。有更好的办法么?可以试试s键(’s’ubstitute)。

  • 移动光标到字符r下面(或者按b移动到单词的开头)
  • s
  • 键入d
  • <Esc>返回到正常模式

确实,这没省多少事,想象一下,假如一天里需要一遍又一遍地重复呢?这种平常的操作越快越好,使得我们把精力集中在更具创造性和有趣的地方。如Linus Torvalds所说,“不只是做事更快了,而是因为快捷使得做事的方式产生了巨大的变革”“it’s not just doing things faster, but because it is so fast, the way you work dramatically changes.”

同样,也有一个大写版的s键,S键会把整行都替换掉。

  • S
  • 键入Be a sinner.
  • <Esc>返回到正常模式
命令 行为
s 替换当前字符
S 替换当前行

让我们回到上一个动作操作。因为我们只用替换一个字符,能更高效点么?有,使用r键。

  • 移动光标到单词sinner的首字符
  • r
  • 键入d

注意我们已经回到正常模式了,所以不需要再按<Esc>了。

大写版的rR,会替换后续的字符。

  • 移动光标到单词dinner的’i’下面
  • R
  • 键入app(完成单词’dapper’)
  • <Esc>返回到正常模式
命令 行为
r 替换当前字符
R 替换后续字符

现在文本是这个样子:

Dapping means being determined about being determined and being passionate about being passionate.

Be a dapper.

本章已经涵盖了不少内容了,但是我保证这是唯一一个最困难的阶段。一旦你理解了这些内容,就能理解Vim的精神,以及Vim里所有其他的功能,如同锦上添花一般。

重复一遍,理解模式的作用以及在模式之间切换的方式,对于成为一个Vimmer至关重要。如果你还没有消化以上内容,就再看一遍吧。

如果你希望阅读这些命令更多的详情,参考:help inserting:help replacing

可视模式

假如,你想选中一段文字,然后把它们统统都替换为新的文字,应该怎么做呢?

一个办法是,使用鼠标点在相关文字的开头,按住鼠标左键不放,拖动鼠标到相关文字的结尾,然后释放鼠标左键。听上去似乎有点麻烦。

可以用<Del><Backspace>键删除所有字符,这样效率并不怎么高。

最高效的办法应该是,把光标置于相关文字的开头,按下v启动可视模式,使用箭头键或者任何移动命令,移动到相关文字的结尾(例如按5e移动到从当前光标起第五个单词的结尾),然后按下c来修改文字。留意到效率上的提高。

这个c命令中,结束后会停留在插入模式,所以需要按 <Esc>返回到正常模式。

这个v命令以字符为最小选中单位,如果希望以行为最小选择单位,使用大写的V命令。

总结

这里是这些模式之间的关系图:


               +---------+  i,I,a,A,o,O,r,R,s,S  +----------+
               | Normal  +---------->------------+ Insert   |
               | mode    |                       | mode     |
               |         +----------<------------+          |
               +-+---+---+        <Esc>          +----------+
                 |   |
                 |   |
                 |   |
                 |   |
                 |   |
           v,V   V   ^  <Esc>
                 |   |
                 |   |
                 |   |
                 |   |
             +---+---+----+
             | Visual     |
             | mode       |
             +------------+

(这张图是使用Vim和 Dr.Chip’s DrawIt plugin制作的)

参考:help vim-modes-intro:help mode-switching获取更多关于不同模式和在模式之间切换的详情。

如果你现在还不了解为什么模式的概念是Vim强大性和简易性的核心的话,请读一下这篇文章“为什么选择Vim”以及Vi的输入模型中解释的原因。