Vim普通模式
# 普通模式
Vim普通模式的强大,很大程度上源于它可以把操作符与动作命令结合在一起。
# 技巧7 停顿时请移开画笔
程序员与画家
程序员的编程过程和画家的画画过程类比,程序员往往只花一小部分时间编写代码,而绝大多数时间是在思考、阅读,以及在代码中穿梭浏览。而且即使是要修改内容也可以通过普通模式下的各种工具完成修改工作。
# 技巧8 把撤销单元切成块
停顿是自然断点
u
命令可以撤销最近一次修改,而这个修改可以包括普通模式、可视模式以及命令行模式中促发的命令,当命令触发了插入模式时,这次修改也将包括在插入模式中输入的文本内容。这种相对广泛的修改的定义,让我们能够自己控制一次撤销操作的细粒度,在Vim中从插入模式开始到返回普通模式为止,在此期间的修改内容被视为一次修改,因此对撤销操作细粒度的控制在于返回普通模式的<ESC>
键的使用。那么,多久进行一次修改内容保存构成一个撤销块成为一个关键问题。通常,在编写过程中的每次停顿便是一个最好的自然断点,例如每写完一句话,在思考下一句时就可以离开插入模式,当需要继续写的时候A
命令返回插入模式继续编写。
当你想控制更细粒度的撤销操作时,可以考虑使用<ESC>o
完成<Enter>
键完成的另起一行的工作。
# 技巧9 构造可重复的修改
VimGolf
在Vim中完成一件事可以有很多种方式,用于评估这些方式的效率的指标是方式所需按键次数最少(VimGolf)。而最有效率的事件完成方式,很大程度上便于我们构造可重复的修改,可以充分利用.
命令提高效率。
使用示例
例如,想要删除行尾的一个单词时,首先可以想到反向删除,使用db
命令删除从光标开始到单词开头的内容,但是这会留下单词的开头字母还需要使用x
命令删除它。正向删除首先使用b
命令将光标移动到单词开头,然后使用dw
命令删除整个单词。删除整个单词,使用更为精确的aw
命令寻找文本对象,当光标停留在对应单词上时,使用daw
命令删除整个单词。
这三种方式都可以完成删除一个单词的工作,但是存在重复操作情况是,使用.
命令它们效率的差别就会显现,dbx
方式仅会重复x
命令,bdw
方式仅会重复dw
命令且无法移动光标,daw
方式则不需要考虑光标位置使用.
命令可以完全重复删除整个单词的工作。
# 技巧10 用次数做简单的算术运算
指定执行次数
大多数普通模式命令可以在执行时指定次数,可以利用这一功能来做简单的算术运算,使用Ctrl+a/x
命令分别对数字执行加减操作。
# 技巧11 能够重复就不用次数
什么情况下使用次数
使用次数执行命令的特点在于它能够保留一个连贯的撤销历史记录,一个u
命令就可以撤销整个修改。但是这也带来一个问题,它无法提供更加细粒度的操作,降低了修改的灵活性,重复命令.
可以提高操作的灵活性。所以在不需要重复操作的使用场景下次数效率更高。
使用示例
例如,当需要删除一个文本行中的多个单词时,这种场景下可以为dw
命令加上次数前缀3dw
完成从光标开始连续删除3个单词;也可以使用dw
命令触发单词删除操作之后使用3次.
命令重复删除操作。前面已经提到,这两种方式的区别在于后者可以提供更加细粒度的操作,当出现次数判断错误时,撤销次数执行会回到最原始的状态,使用重复操作可以提供更灵活的撤销重复操作。
当需要修改一个文本行中的多个单词时,这种情况下单词内容不同导致使用重复操作的作用很小,而次数操作的优势就得以显现,例如文本行one two three
可以使用3cw
+four three two<Esc>
一次操作完成内容修改。
# 技巧12 操作符 + 动作命令 = 操作
Vim的词汇
操作符和动作命令的结合形成了一种语法,操作符确定执行的操作,动作命令确定操作符作用的范围形成一个完整的操作。例如d{motion}
可以是删除一个字符的dl
命令、可以是删除一个完整单词的daw
命令、也可以是删除一整个段落的dap
命令。一些常见的操作符如下表所示。
命令 | 操作 |
---|---|
c | 修改 |
d | 删除 |
y | 复制 |
g~ | 反转大小写 |
gu | 转换为小写 |
gU | 转换为大写 |
> | 增加缩进 |
< | 减少缩进 |
= | 自动缩进 |
! | 过滤跨越的行 |
Vim的语法只有一条额外的规则,即当一个操作符命令被连续调用两次是,表示该操作的作用范围是当前行。例如dd
是删除当前行,yy
是复制当前行,>>
缩进当前行等。