第2章:普通模式
技巧 7 停顿时请移开画笔
就像画家只花一小部分时间涂色一样,程序员也只花一小部分时间编写代码。绝大多数时间用来思考、阅读,以及在代码中穿梭浏览。而且,当确实需要做修改时,谁说一定要切换到插入模式才行?我们可以重新调整已有代码的格式,复制它们,移动其位置,或是删除它们。在普通模式中,我们有众多的工具可以利用。
技巧 8 把撤销单元切成块
在 Vim 中,我们自己可以控制撤销的粒度。
u键会触发撤销命令,它会撤销最新的修改。 |
---|
i{insert some text}<Esc> 是一次修改。 | 输入模式下换行操作<CR> 和<Esc>o 。 |
在插入模式中移动光标会重置修改状态
当我提到撤销命令会回退从进入插入模式到退出此模式期间输入(或删除)的全部字符时,我略过了一个小细节。如果在插入模式中使用了 <Up> 、<Down> 、<Left> 或 <Right> 这些光标键,将会产生一个新的撤销块。你可以把这想象为先切换回普通模式,然后用 h 、j 、k 或l 命令对光标进行了移动,唯一区别是我们并没有退出插入模式。这也会对 . 命令的操作产生影响。
技巧 9 构造可重复的修改
Vim 对重复操作进行了优化,要利用这一点,我们必须考虑该如何构造修改。
反向删除{start}dbx : 按db 命令删除从光标起始位置到单词开头的内容,但会原封未动地留下最后一个字符 “h”,再按一下 x 键就可以删除这个捣乱的字符。
正向删除{start}bdw :我们先用 b 命令把光标移到单词的开头,移动好后,就可以用一个 dw 命令删掉整个单词。
删除整个单词{start}daw : aw 文本对象(text object),你可以把 daw 命令解读为“delete a word”。
技巧 10 用次数做简单的算术运算
大多数普通模式命令可以在执行时指定次数,我们可以利用这个功能来做简单的算术运算。
很多普通模式命令都可以带一个次数前缀,这样 Vim 就会尝试把该命令执行指定的次数,而不是只执行一次 |
---|
<C-a> 和<C-x> 命令分别对数字执行加和减操作。 | 行 yyp 来复制一行。 |
技巧 11 能够重复,就别用次数
在处理某些特定工作时,使用次数可以使按键次数变得最少,不过我们并不是非得这样不可。我们需要认真考虑次数与重复各自的优缺点。
删除两个单词:
方法三颗力度更高,可重复性更强,所以选择第三种方法。
只在必要时使用次数
技巧 12 双剑合璧,天下无敌
Vim 的强大很大程度上源自操作符与动作命令相结合。
操作符 + 动作命令 = 操作
d{motion} 命令可以对一个字符(dl )、一个完整单词(daw )或一整个段落(dap )进行操作,它作用的范围由动作命令决定。c{motion} 、y{motion} 以及其他一些命令也类似,它们被统称为操作符(operator )。
g~ 、gu 和 gU 命令要用两次按键来调用,我们可以把上述命令中的 g 当做一个前缀字符,用以改变其后面的按键行为。
操作符与动作命令的结合形成了一种语法,即一个操作由一个操作符,后面跟一个动作命令组成。
命令 | 用途 |
---|
C | 修改 | d | 删除 | y | 复制到寄存器 | g~ | 反转大小写 | gu | 转换为小写 | gU | 转换为大写 | > | 增加缩进 | < | 减小缩进 | = | 自动缩进 | ! | 使用外部程序过滤{motion}所跨越的行 |
注释命令以 \\{motion } 触发,它会切换指定行的注释状态。它是一个操作符命令,因此可以把它和所有动作命令结合在一起。\\ap 将切换当前段落的注释状态,\\G 会把从当前行到文件结尾间的所有内容注释掉,而 \\\ 则注释当前行。
|