Tip 10 使用计数做一些简单的计算
大多数命令模式下的指令能够和计数搭配使用.我们可以利用这个特性做一些简单的运算.
1 | this character is 5 |
<C-a>
增加计数 (Ctrl+a)<C-x>
减少计数 (Ctrl+x)
他们可以可数字搭配使用,例如:
1 | this character is 16 " 10<C-a> |
这个
例如下面有一段 css 代码:1
2.blog, .news { background-image: url(/sprite.png); }
.blog { background-position: 0px 0px }
我们要复制最后一行,然后做一些改变:
- 把单词
blog
换成news
- 把
0px
换成-180px
实现1,可以使用 yyp
然后使用 cw
修改单词.
那么2怎么实现呢?
第一种方式是: f0
, 然后 i
进入插入模式,输入-18
,然后<Esc>
但是我们的光标不在数字上,那么需要额外的跳转.而 <C-x>
可以自动给我们找到数字.
所以,直接 180<C-x>
更快
1 | .blog { background-position: -180px 0px } "180<C-x> |
Tip 11 如果可以重复,就别计数
我们可以通过提供个数字来减少完成特定任务所需要的按键.但是这不代表我们就该这么做.还是应该思考下到底该重复还是该计数.
假设我们有下面的文字:
1 | Delete more than one word |
d2w
和 2dw
都能完成任务.
d2w
是d
, 然后加上2w
的motion
,理解为: 删除两个单词2dw
是2次执行dw
,理解为: 删除一个单词,执行两次
现在让我们想想一个替换方案: dw.
删除一个单词,然后重复之.
讨论几种方式.
其实d2w
和2dw
没有区别,如果执行之后,按 u
,都会恢复两个单词.如果按dot
,将重复删除后两个单词.
如果我们要删除下一个单词(总共三个)那我们就需要先u
(恢复两个单词),然后d3w
.这还是比较麻烦的.dw.
按u
,会恢复一个单词,如果删除下个单词,只需要重新按dot
即可.
在这种情况下,重复的优势更明显.
如果我要删除6个单词呢? 我可以 d6w
或者6dw
.或者 dw.....
,当然,前者有更少的按键.但是有个问题在这:我们需要数一下单词的数量,而且如果错误了,u
会恢复6
个单词.而dw.....
如果出现错误,u
一下,只是恢复一个单词.我们可以更好的控制这个过程.
记住我们的”咒语”: 操作,重复,撤销.
必要时使用计数
下面的文字,如果我要把 a couple of
换成 some more.
1
2I have a couple of questions.
I have some more questions. "按键依次是 c3wsome more
在这个场景下,使用dot命令没有什么意义.即使重复了,最后还要按i
进入插入模式.这样太笨拙了,所以我还是愿意使用计数.
计数还有个好处,就是能够有个条理清楚的恢复操作.比如我d3w
,u
就会恢复3个单词
Tip 12 征服结合命令
Vim的强大源于操作符和移动命令的结合.
操作符+移动=操作
d{motion}
可以使用dl
删除一个字符,daw
删除整个单词,dap
删除整段.c{motion}
和 y{motion}
和上面类似
操作符和移动的结合,可以认为是一种语法.第一条规则很简单:一个动作由一个操作符和一个移动组成.学习新的操作符就像学习Vim的词汇表.只要我们遵循简单的语法,随着词汇量增加,我们就能表达更多想法.
假设我们已经知道了通过 daw 删除一整个单词.然后,我们学到了 gU
,这也是一个操作符.所以,我们就能通过gUaw把当前单词转换成大写.
再假设我们知道了ap
(一整段motion},然后我们就能合成新的操作:dap
删除一整段 gUap
让一整段大写.
Vim
的语法还有个规则:如果一个操作符被重复输入,那么motion
就等于当前行.例如:
-dd
删除当前行
->>
缩进当前行
-gUgU
或者 gUU
大写当前行 g是后面操作符的一个前缀
Vim的操作符命令
1 | 操作符 效果 |
拓展Vim整合的力量
Vim标准的操作符相对来说比较少,但是我们可以定义新的.
使用现有的操作符自定义移动
Vim标准的移动命令已经很全面,但是我们还可以增加新的移动和文本对象.
待决模式
除了明显的插入,命令和底行模式.Vim还有些容易被忽略的模式.待决模式( Operator-Pending mode )就是其中的一个.我们每天都大量使用它,但是每次都持续一小段时间.例如dw
,这个模式仅仅持续了你按下d
到按下w
这中间的这个时间.
如果我们把Vim看做是一个有限状态机.那么待决模式就是仅接受移动命令的状态.当一个操作符被触发的时候,这个状态被激活,在输入移动命令之前,Vim不会做任何操作.当待决模式被激活后,我们可以通过