Vim实践Tips(三)

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 }

我们要复制最后一行,然后做一些改变:

  1. 把单词 blog 换成 news
  2. 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

d2w2dw 都能完成任务.

  • d2wd, 然后加上2wmotion ,理解为: 删除两个单词
  • 2dw是2次执行 dw ,理解为: 删除一个单词,执行两次

现在让我们想想一个替换方案: dw. 删除一个单词,然后重复之.

讨论几种方式.

其实d2w2dw 没有区别,如果执行之后,按 u ,都会恢复两个单词.如果按dot,将重复删除后两个单词.
如果我们要删除下一个单词(总共三个)那我们就需要先u(恢复两个单词),然后d3w.这还是比较麻烦的.
dw.u,会恢复一个单词,如果删除下个单词,只需要重新按dot即可.
在这种情况下,重复的优势更明显.

如果我要删除6个单词呢? 我可以 d6w 或者6dw.或者 dw..... ,当然,前者有更少的按键.但是有个问题在这:我们需要数一下单词的数量,而且如果错误了,u会恢复6个单词.而dw.....如果出现错误,u一下,只是恢复一个单词.我们可以更好的控制这个过程.

记住我们的”咒语”: 操作,重复,撤销.

必要时使用计数

下面的文字,如果我要把 a couple of 换成 some more.

1
2
I 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
2
3
4
5
6
7
8
9
10
11
操作符        效果
c Change 改变
d Delete 删除
y Yank into register 复制到寄存器
g~ Swap case 切换大小写
gu make lowercase 小写
gU make upppercase 大写
> shift right 右移
< shift left 左移
= autoindent 自动缩进
! Filter {motion} lines through an external program

拓展Vim整合的力量

Vim标准的操作符相对来说比较少,但是我们可以定义新的.

使用现有的操作符自定义移动

Vim标准的移动命令已经很全面,但是我们还可以增加新的移动和文本对象.

待决模式

除了明显的插入,命令和底行模式.Vim还有些容易被忽略的模式.待决模式( Operator-Pending mode )就是其中的一个.我们每天都大量使用它,但是每次都持续一小段时间.例如dw,这个模式仅仅持续了你按下d到按下w这中间的这个时间.

如果我们把Vim看做是一个有限状态机.那么待决模式就是仅接受移动命令的状态.当一个操作符被触发的时候,这个状态被激活,在输入移动命令之前,Vim不会做任何操作.当待决模式被激活后,我们可以通过就可以中断,返回命令模式.