之于我, vi即禅.
用vi如修禅,
vi命令如禅之心印.
用者不可窥其堂奥,
门外汉视其晦涩如天书.
常用之, 实可知其道.
一般情况下, 你应该尽量少把时间花在插入模式, 因为在这种模式下vi和其它sb编辑器区别不大. 这也是大部分vim新手把大部分时间花在插入模式的原因 -- 插入模式很易用. 但是vim真正的优势在命令模式. 你会发现越了解vim, 你花在插入模式的时间越少.
使用h,j,k, l
高效率用vim编辑的第一步是绝了你用方向键(上下左右)的念头. vim设计出"模式"操作方式的一大优势就是可以让你不需要老是把手从方向键和字母键之间移来移去. 当你在命令模式下, 用字母h, j, k, l对应方向左, 下, 上, 右. 这个需要练习一下才能习惯, 但是你会发现一旦你习惯了它们, 比用方向键快多了. (译注: 这几个移动键一定要动手试, 然后反复用, 靠记忆忒艰难了)
在你编辑电子邮件或其他段落式文本的时候, 你可能注意到移动方向跳的行数比你料想的多. 这是因为你的段落对vim来说在很长的同一个行里. 用h, j, k, l移动前输入g可以让移动相对于屏幕看上去的行数而不是vim内部的行数.
用motion在当前行移动
(译注: 没想到特别合适的词翻译motion, 可以理解为"高级移动", 另请注意, motion仅在当前行移动)
大部分编辑器只有简单的光标移动功能(上下左右, 行首行尾等等). vim有非常高级的光标移动命令, 这些命令叫做Motion. 当用motion把光标从文本中的一个点移动到另一个点的时候, 两点间的文本(包括两个点本身)被motion"掠过". (这个概念在接下来的教程中非常重要.) (译注: 举例说明一下"掠过"概念, 比如你有一行文本, 内容是abcdefg, 当前光标在c上, 如果你用motion $, 光标移动到了g上, 那么从c到g这段文本就被motion $"掠过"了).
以下是一些有用的motion:
fx | 在当前行向前移动光标到下一个字符x (很明显, x可以是任意你想要移动到的字符). 这是一个超级有用的命令. 你可以输入;来重复前一个f命令. |
tx | 和上面的命令基本相同, 除了移动光标到字符x之前而不是x字符本身. (这个真的很有用) |
Fx | 在当前行向后移动光标到上一个字符x. |
w | 将光标向前移动一个词. |
b | 将光标向后移动一个词. |
0 | 将光标移动到当前行首. |
^ | 将光标移动到当前行的第一个字符. (译注: 第一个字符可能不是行首, 比如行首有space, tab等不可见符号, 0会把光标停在这些符号之前, 而^会把光jk标停在这些符号之后的第一个可见字符.) |
$ | 将光标移动到当前行尾. |
) | 将光标移动到下一个句子. (写电子邮件或者文本文档的时候很有用.) |
( | 将光标移动到上一个句子. |
在文件中高效移动
vim有很多命令可以让你在文件中任意移动光标 -- 很少需要手工一页一页滚动. 以下按键技术上说不算motion, 因为它们是在文件中移动, 而不是在某一特定的行.
高效输入
使用关键字自动完成(补全)
vim 有个非常好的关键字自动完成系统. 就是说你可以只输入很长的词的一部分, 按一个键, vim帮你把这个词自动补全. 比如说在你的代码中有一个变量叫iAmALongAndAwkwardVarName, 你可能不愿意每次用这个变量都把整个词打一遍, 这时候就可以用自动完成功能.
要使用关键字自动完成, 只要输入一个字串的前几个字母 (比如 iAmAL) 然后按 <C-N> (按住Ctrl然后按N>)或者<C-P>. 如果vim没有选择你需要的字串, 继续按<C-N>或<C-P> -- vim会遍历所有和你输入的前几个字母匹配的字串.
用点脑子开始插入模式
大部分新用户输入i来进入插入模式. 这种方法有时候相当低效, vi有一堆可以高效进入插入模式的命令. 这里是最常用的一些:
高效移动成块的的文本
用可视化选择, 用合适的选中模式
和最早的vi不同, vim可以让你把文本置为高亮然后对高亮的文本操作. 以下是主要的3个可视化选中模式 (即文本高亮模式).
v | 字符选中模式. 大部分人习惯用这个, 所以玩其他模式之前先把这个练熟. |
V | 行选中模式. 选中整行. 当你需要复制或移动几行的时候, 这个比字符选中模式要好. |
<C-V> | 块选中模式. 超级nb而且很少有其他的编辑器支持(译注: 还是有一些支持的, 比如ultraedit, 但是得付钱...). 你可以在任何文本中选择一个矩形块来操作. (译注: 在windows版本的vim中<C-V>默认被映射为粘贴, 可以通过更改键盘映射或者使用<C-Q>来进行块操作) |
所有常用的光标移动键都可以在可视模式使用, 比如vwww会进入字符选中模式并且选中光标之后的3个词. Vjj将会进入行选中模式并且选中当前行及之后的两行.
在可视化选中模式下进行剪切和复制
一旦你有了高亮选择, 你可能想要干点啥. 以下是对选中的高亮文本最有用的命令:
d | 剪切(删除)高亮选中的文本到剪切板. (译注: 据本人所知, vim所有的删除其实都是剪切) |
y | 复制 (或者说"拽"(yank), vim用"拽"来表示复制...)高亮选中的文本到剪切板. |
c | 剪切高亮选中的文本到剪切板. 和d很相似, 只是c会进入插入模式. |
在非可视化选择模式进行剪切和复制
如果你确知你想要复制或者剪切什么, 你可以不进入可视化选择模式就完成这些操作. 这样速度更快.
粘贴
粘贴很简单. 把光标移动到你想要粘贴的位置输入p. (译注: 粘贴操作需要在命令模式下, 另外P(大写)命令把剪切板的内容粘贴到光标当前位置之前, 对用惯其它编辑器的人来说, P命令可能更符合习惯)
使用多个剪切板
大部分编辑器只有一个剪切板. (译注: 貌似不算太'大部分') vim有多个. 在vim里剪切板叫做寄存器(regiseter). 你可以输入:reg列出所有当前定义过的寄存器和它们的内容. 大多数情况下你会使用以小写字母命名寄存器, 其他的有各自不同的vim内部用途, 偶尔可能会有用.
要使用指定的某个寄存器来完成复制和粘贴, 很简单, 在复制粘贴操作之前输入"a, a表示你希望用的寄存器.
举个例子, 复制当前行到寄存器k, 输入"kyy. (也可以用V"ky. 想想为啥这个也成). 那一行就会被存放在寄存器k里, 直到有其他的东西被复制到到寄存器k覆盖它. 复制之后可以用"kp来把寄存器k里存放的内容粘贴到到文本中.
不干机械劳动
给你惊喜的.命令
在vi中, 输入.(英文的句号)可以重复上一个你执行过的命令. 比如你上一个命令是dw, 当你输入.命令, vi会删除下一个词.
使用计数器执行重复操作
计数器是vim最nb的提速功能. 任何命令之前都可以加一个数. 这个数告诉vim你想把命令执行多少次. 例如:
3j会把光标向下移动3行.
10dd会删除10行文本.
y3"在当前行, 把光标当前位置到第三个双引号之间的文本复制到剪切板. 这种计数器用法可以大大扩展motion的操作范围. (译注: 本人认为y3"不能完成这样的功能, 对应的命令应该是y3f", 可能原作者漏写了f命令, 有空的时候问问原作者)
录制宏
你可能偶然会发现你对一个文档中的某块文本反反复复的进行相同的操作. vim可以录制一个特定的宏来完成这些操作.
qregister | 开始录制一个宏并保存在某个有名字的寄存器. 比如qa开始录制一个宏并把这个宏存放在寄存器a中. |
q | 结束录制 |
@register | 回放存放在某个寄存器的宏. 比如@a播放寄存器a中的宏. |
请注意宏只是记录你的按键并且回放; 不是神奇的魔法. 因为在vim中可以用多个命令执行某个任务, 录制宏几乎成了一种艺术形式, 你必须非常小心的选择要用的命令才能用宏达到你想要的效果.
用vim写程序代码
vim是优秀的源代码编辑器, 有很多的功能是专门为写程序设计的. 这里是一些常用的:
(译注: 结合ctags, cscope之类的辅助工具, vim可以提供更强大的程序代码编写功能)