跟着练习Vim

本着学习apue想练习下Vim的使用方法,越学越怀疑自己是不是走偏了.

这本书确实是手把手教你但是,技巧实在太多了,现在自己用起Vim的心理负担越来越重,很多技巧看过不重复练习真的用不上.

所以我就看了前五章,实在是学不下去了…

Vim实用技巧

Vim的配置文件

系统级配置文件目录:/etc/vim/vimrc
用户级配置文件目录:~/.vim/vimrc

Vim分屏
1
2
3
4
5
6
7
#命令模式下
sp //横屏
vsp //竖屏
Crtl-w //切屏
//切换到命令模式下
qall //不保存
wall //全部保存退出

第一章 Vim解决问题的方式

Vim对重复性的操作进行了优化.它之所以能高效地重复,是因为它会记录我们最近的操作,让我们用一次按键就能重复上次的修改.

技巧1 . 命令

. 命令可以让我们重复上次的修改(一次修改的单位可以是字符、整行,甚至是整个文件)

>G 命令会增加当前行到文档末尾处的缩进层级,如果我们在此命令后使用 . 命令,那么”重复上次修改”会让VIM增加当前行到文档末尾的缩进层级.

.命令是一个微型的宏

技巧2 减少无关操作

1
2
3
Line one
Line two
Line tree

我们想在每行的结尾添加一个分号.先将光标移动到行位,然后切换插入模式进行修改.

$ 命令可以完成光标的移动操作

a 切换至插入模式,键入 ;

由于 . 命令可以重复上次的修改,我们只需要执行 j$.

. 命令在这里相当于(a;)

a 命令是在当前光标之后添加内容,而 A 命令则是在当前行的结尾添加内容.换句话说就是把 $a封装成了一键操作.这样我们就通过 A 来代替 $a 大大提升了 . 效率.

技巧3 以退为进

1
var foo = "method("+argument1+","+argument2+")";

这样变量名之间没有空格看起来并不美观,我们可以在”+”前后各添加一个空格,让肉眼更容易识别:

1
var foo = "method(" + argument1 + ","+argument2+ ")";

s 命令把删除光标下的字符和进入插入模式合二为一.
; 命令会重复查找上次f命令所查找的字符

技巧4 执行、重复、回退

@: 可以用来重复任意Ex命令
& 来重复 substitute命令

对于 . 命令而言,我们可以按 u 键撤销上次的修改.
若使用f{cahr},不小心多按了 ; 键,我们可以按,撤回

技巧5 查找并手动替换

1
2
3
...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...

若我们想将”copy”替换成”content”,
可以使用==>:%s /conten/copy/g
全部替换成copy

单我们想单一的修改呢?
我们可以把光标移动到待选的单词上,然后按 * 键.

星号 * 命令有两个功能:1.光标会调到下一个匹配项上 2.所有出现这个词的地方都会被高亮显示出来

n键可以跳到下一个匹配项

cw命令会删除从光标位置到单词结尾间的字符,并进入插入模式

取消高亮部分可以使用==>:noh

技巧6 结识 . 的范式 (略)

第一部分 模式

第二章 普通模式

技巧7 停顿时请移开画笔 (略)

技巧8 把撤销单元切成块

u 键会触发撤销命令,它会撤销最新的修改.
在Vim中,我们自己可以控制撤销命令的粒度.从进入插入模式开始,知道返回普通模式为止,在此期间输入或删除的任何内容都被当成一次修改.
换行 (按回车键,也写作)

技巧9 构造可重复的修改

删除单词nigh

1
The end is nigh


aw 文本对象
*daw 命令可以解毒为”delete a word”
这个操作不仅仅删除了该单词,而且它还会删除一个空格.
*daw 可以发挥 . 命令的最大威力

技巧10 用次数做简单的算术运算

(ctrl-a)执行+1操作
执行-1操作

在不带次数执行时,它们会逐个的加减
但如果带一个次数前缀,那么就可以用它们加减任意整数

10就会把它+10

技巧11 能够重复,就别用次数

1
Delete more than one word

将这段文字改为”Delete one word”,也就是要删除两个单词
先输入 fm ,光标找到m
然后 d2w2dw 都可以
使用 d2w ,我们先调用删除命令,然后以 2w 作为动作命令,我们可以把它解读为”删除两个单词”;然而 2dw
做的相反,”做两次删除单词的操作”

技巧12 双剑合璧,天下无敌

Vim的强大在很大程度上源自于操作符与动作命令相结合.

操作符 + 动作命令 = 操作

d{motion} 命令

dl 对一个字符

daw 对一个完整的单词

dap 对一个完整的段落

g~ gugU 命令要用两次按键来调用,可以把上述命令中的 g 当做是一个前缀字符,用来改变其后面的按键行为.

gUaw 可以把当前单词转化为大写形式.
guaw 可以把当前单词转化为小写形式.

作用于段落的 ap 动作命令

dap 删除整个段落,用 gUap 把整段文字转化成大写.

Vim的语法只有一条额外的规则,即当一个操作符命令被连续调用两次时,它会作用于当前行.

所以 dd 删除当前行, >>缩进当前行

第三章 插入模式

大部分的Vim命令都在非插入模式中执行,不过有些功能在插入模式中会更好实现些.

技巧13 在插入模式中可即时更正错误

如果在插入模式下撰写文本时出错,我们立刻对它进行更正,而无需切换模式.要迅速更正错误,除了用退格键外,我们还可以用插入模式中的其他一些命令.

在输入错误时,我们可以用退格键删除错误的文本,然后再输入正确的内容.如果出错的地方靠近单词结尾,这或许是最快的修正方式.但是如果出错的位置在单词开头呢?

按键操作 用途
< C-h > 删除前一个字符(同退格键)
< C-w > 删除前一个单词
< C-u > 删至行首

技巧14 返回普通模式

插入模式只专注于做一件事,那就是输入文字,而普通模式确实我们大部分时间所所用的模式,因此能在两种模式间切换是很重要的.

切换回到普通模式的经典方式是使用 键,但键盘上这个键距离似乎有点远.作为代替,我们可以使用 <C-[> ,它的效果与 完全相同.

按键操作 用途
< Esc > 切换到普通模式
< C-[ > 切换到普通模式
< C-o > 切换到插入-普通模式

插入-普通模式是普通模式的一个特例,它能让我们执行一次普通模式命令.在此模式中,我们可以执行一个普通模式命令,执行完后,马上又返回到插入模式.

技巧15 不离开插入模式,粘贴寄存器中的文本

Vim的复制和粘贴操作一般都在普通模式中执行,不过有时我们也许想不离开插入模式,就能往文档里粘贴文本.
(个人感觉不太好用….)

随时随地做运算

表达式寄存器允许我们做一些运算,并把运算结果直接插入到文档中.

我们可以用 = 指明使用表达式寄存器.在插入模式中输入 = 就可以访问这一寄存器.输入表达式后敲下 (Enter键),Vim就会把执行的结果插入到文档的当前位置.

技巧17 用字符编码插入非常用字符

只要知道某个字符的编码就可以让Vim插入该字符,我们可以用这种方式插入任意字符.只需在插入模式中输入 {code} 即可,其中 {code} 是要出入字符的编码.

例如我们想插入 “A” , 我们只需要输入 {C-v}065

按键操作 用途
< C-v >{123} 以十进制字符编码插入字符
< C-v >u{1234} 以十六进制字符编码插入字符
< C-v >{nondigit} 按原意插入非数字字符
< c-k >{char1}{char2} 插入以二合{char1}{char2}表示的字符

技巧18 用二合字母插入非常用字符

(略)

技巧19 用替换模式替换已有文本

1
Typing in Insert mode extends the line.But in Replace mode the line length doesn't change.

把这两个单独的句子合并成一句话,为此,需要把句号改为逗号,并将单词”But”中的”B”改为小写.

R 命令可以有普通模式进入替换模式

第四章 可视模式

Vim具有3中不同的可视模式,分别用于操作字符文本、行文本或块文本。

技巧20 深入理解可视模式

可视模式允许我们选中一个文本区域并在其上操作.

某些可视模式命令执行的基本功能与普通模式相同,但操作上有些细微的变化。例如,这两种模式中, c 命令的功能是一样的,都是删除指定的文本并切换到插入模式.

例如把单词”March”修改为”April”.我们先把光标移动到”March”的某个位置,然后执行 viw 来高亮选择这个词,选择用 c 命令修改所选的内容,把这个单词删掉并进入插入模式,最后就可以输入完整的”April”了.

技巧21 选择高亮选区

v 键是通往可视模式的大门.

在普通模式下,按 v 可激活面向字符的可视模式,按 V 可激活面向行的可视模式,而按 C-v 则可激活面向列块的可视模式.

命令 用途
v 激活面向字符的可视模式
V 激活面向行的可视模式
< C-v > 激活面向列块的可视模式
gv 重选上次的高亮选区
按键操作 用途
< Esc > / <C-[> 回到普通模式
v / V / < C-v > 切换到普通模式(在对应的面向字符(行,块)中使用)
v 切换到面向字符的可视模式
V 切换到面向行的可视模式
< C-v > 切换到面向列块的可视模式
o 切换高亮选区的活动端

高亮选区的范围是由其两个端点界定.其中一端固定,而另一段可随着光标自由移动,我们可以用 o 键来切换其活动的端点.在定义选区时,如果定义到一半时,才发现选区开始的位置不对,我们不用退出可视模式再从头开始,只需要 o ,然后重新调整选区的边界即可.

技巧22 重复执行面向行的可视命令

在可视模式中执行完一条命令后,我们就会返回到普通模式,并且在可视模式里所选中的文本范围也不再高亮显示了.

假设这段Python代码缩进有问题

1
2
3
4
5
6
def fib(n):
a,b = 0,1
while (a < n):
print a,
a, b = b, a+b
fib(42)

这段缩进错误的Python代码中,while关键字下面的两行应该多缩进两级,我们可以高亮选择这两行,然后用 > 命令对它进行缩进,以修正其缩进的错误.

要解决此问题,一个办法是使用 gv 命令重选相同的文本,然后再次调用缩进命令 .

技巧23 只要可能,最好用操作符命令,而不是可视命令

(略)

技巧24 用面向列快的可视模式编辑表格数据

(略)

技巧25 修改列文本

(略)

技巧26 在长短不一的高亮块后添加文本

1
2
3
var foo = 1
var bar = 'a'
var foobar = foo + bar

这段代码有连续的3行,每行的长度各不相同,而我们想在每行结尾加一个分号.

我们可以进进入列块模式后,按 $ 键把选区扩大到每行的行尾.

确定好选区后,用 A 就可以在结尾添加内容了.

第五章 命令行模式

技巧27 结实Vim的命令行模式

出于历史原因,在命令模式中执行的命令又被称为做是Ex命令,Vim为几乎所有功能都提供了相应的Ex命令.(参见:h ex-cmd-index)

我们可以利用Ex命令:

读写文件( :edit:write )

创建新的标签页( :tabnew )

分割窗口( :split )

操作参数列表( :prev/:next )

缓冲区列表( :bprev/:bnext )

操作缓冲区文本的Ex命令
| 命令 | 用途 |
| :———————————————- | :—————————————————— |
| :[range]delete[x] | 删除指定范围内的行[到寄存器x中] |
| :[range]yank[x] | 复制指定范围的行[到寄存器x中] |
| :[line]put[x] | 在指定行后粘贴寄存器x中的内容 |
| :[range]copy{address} | 把指定范围内的行拷贝至{address}所指定的行之下 |
| :[range]move{address} | 把指定范围内的行移动到{address}所指定的行之下 |
| :[range]join | 连接指定范围内的行 |
| :[range]normal{commands} | 对指定范围内的每一行执行普通模式命令{commands} |
| : [range]substitute/{pattern}/{string}/[flags] | 把指定范围内出现{pattern}的地方替换为{string} |
| :[range]glpbal/{pattern}/[cmd] | 对指定范围内匹配{pattern}的所有行,在其上执行Ex命令{cmd} |

技巧28 在一行或多个连续行上执行命令

很多Ex命令可以用[range]指定要操作的范围.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 1 #include "apue.h"
2 #include <fcntl.h>
3
4 int main(int argc, char ** argv)
5 {
6 if(argc != 2)
7 err_quit("usage: a.out <pathname>");
8 if(access(argv[1],R_OK) < 0)
9 err_ret("access error for %s" ,argv[1]);
10 else
11 printf("read access OK");
12 if(open(argv[1],O_RDONLY) < 0)
13 err_ret("open error for %s", argv[1]);
14 else
15 printf("open for reading OK \n");
16 exit(0);
17 }
用行号作为地址

如果输入一条值包含数字的Ex命令,那么Vim会把这个数字解析成一个地址,并把光标移动到该数字所指定的行上.

=>:1
=>:print
《1 #include “apue.h”

:p 是 :print 的简写,可以组合使用 =>:1p

用地址指定一个范围

=>:6,16p

会打印第6行至第16行之间的每一行的内容.并且将光标停留在16行

技巧29 使用 ‘:t’ 和 ‘:m’ 命令复制和移动行

技巧30 自动补全Ex命令

如同在shell中一样,在命令行上也可以使用 键自动补全命令

例如这样输入:
=>:col
《colder colorscheme

命令会让VIM显示可用的补全列表

技巧31 把当前单词插入到命令行

(略)

技巧35 运行shell命令

(略)