Vim实践Tips(二)

Tip 5 手动查找和替换

下面每一行中都有 content 这个单词

1
2
3
4
5
6

...We're waiting for content before the site can go live...

...If you are content with this, let's go ahead with it...

...We'll launch as soon as we have the content...

如果我们想把所有的 content 替换成 copy, 那么可以很简单的想到替换命令.

1
2

:%s/content/copy/g

但是有时候我们并不想全局替换掉.

懒惰点:不做输入的查找

你也许已经猜到.是我最喜欢的单键Vim命令.第二喜欢的是 *,它可以搜索处于光标下面的单词.

1
2
3
4
5
6

...We're waiting for copy before the site can go live...

...If you are copy with this, let's go ahead with it...

...We'll launch as soon as we have the content...

首先将光标置于 content 上面,然后用*命令去查找它,这时候将发生两个事情:

  1. 光标将跳转到下个匹配处(即下个 content 单词)

  2. 所有出现匹配项的地方将高亮显示 (如果没有,使用 :set hls .

上面两件事情发生之后,我们就可以使用 n 命令跳转到下一个.这时候,使用 *nn 可以循环所有匹配,然后光标转到我们开始进行搜索的地方

让更改变得可重复

当我们的光标置于 content 的开始位置的时候,我们准备去更改它.这包含两个步骤:

  1. 删除单词 content

  2. 输入修改的内容. cw 删除到单词结尾命令,并且进入插入模式.

然后我们输入 copy 这个单词. Vim 将记录我们的键盘点击,直到我们离开插入模式,所以, cwcopy<Esc> 将会被记录为一个单个命令.通过使用.就可以重复上面的操作.

Tip6 Dot公式

在 Tip2中,我们试着将每个句子后面加; 最后,我们通过 j. 进行重复操作.

在 Tip3中,我们将每个+前后添加空格. 最后,我们通过 ;. 进行重复操作

在 Tip5中,我们将 content 替换成 copy,最后,我们通过 n. 进行重复操作.

理想的状态: 一个按键负责移动,一个按键负责执行操作.

在上面所有的操作中 . 重复最后的更改.这不是他们全部的共同点,我们都还用了一个键去移动光标.这已经是一个不能再好的情况了.我们在将来的编辑中,可以反复看到这个编辑模式.为了方便,我们把这个模式成为 Dot公式 (Dot Formula)

Tip7 拿开你的笔刷

Normal Mode (命令模式) 可以类比为一个画家,把笔刷离开画布.这时候,他可以休息,可以构思.同理,程序员也可以在 Normal Mode 中进行思考,组织自己的思路.当我们要改变的时候,也不用非得进入插入模式.在 Normal Mode中,我们可以格式化我们的代码,复制,或者移动他们.

Tip8 强化你的撤销

在其他编辑器中,通过在输入一些东西之后进行撤销,可以撤销我们最后输入的单词或者字符.然后在 Vim 中,我们设置可以调整撤销命令的粒度.

u 这个命令可以触发撤销命令.它可以撤销包括Normal,Visual还有 Command-Line 模式的更改.当然,也包括在插入模式下的文本输入或者删除.所以我们可以说: i{ 插入一些更改}< Esc> 构成了一个改变. 然后一次u 就可以撤销这个改变.

另外,插入模式中,如果使用了上下左右箭头,那么就相当于在 NormalMode下使用了 hjkl.区别就是我们不用离开插入模式,但是这些操作,会被记录到点公式 (Dot Fomula)中.

Tip9 创建可重复的改变

vim将重复操作进行了优化,为了利用这个特性.我们需要留心怎么创建可重复的改变

在 Vim 中,做一件事通常有很多方式.但是衡量”好”的方式的机制就是:更少的键盘敲击.

假设我们的光标在 h 这个字母上,我们想要删除单词 nigh

1
2

The end is nigh

1. 向后删除

1
2
3
4
5
6

The end is nigh "开始

The end is h "db 从光标位置删除单词的前面部分

The end is "x 删除当前光标的字符

2. 向前删除

1
2
3
4
5
6

The end is nigh "开始

The end is nigh "b 向后移动光标一个单词

The end is "dw 向前删除一个单词

3. 删除整个单词

上面两个解决方案都牵涉到了一些准备工作,例如移动.其实,利用aw 命令可以更精准高效的完成我们的需求

1
2
3
4

The end ais nigh "开始

The end is "daw

4. 哪一个是最可重复的

上面我们使用了三种方式进行删除一个单词.每种方式中,我们都是按了三个键,那么那种方式是更好的呢?

记住, Vim 优化了重复.那么检验好坏的标准就是重复.下面使用dot 命令来检验三种方式,通过测试发现:

  • 第一种方式: . 等价于 x (db 是改变操作. x 也是改变操作)

  • 第二种方式: . 等价于 dw (b 是纯移动, dw 是改变操作)

  • 第三种方式: . 等价于 daw (daw是改变操作)

看起来2 3 都是挺有用的,但是有个细节 2删除一个单词,但是不会删除对应的空格,表象上来看就是不会移动光标到下个单词上,那么这时候, .这个命令就没什么意义. 3 会把要删除的单词附带空格删除,同时光标停留在 is 的结尾.那么.这个操作就能继续删除一个单词. (我强烈建议自己动手试试看)