-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathchapter03_vim高效操作初体验
161 lines (118 loc) · 4.57 KB
/
chapter03_vim高效操作初体验
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
经过前面的chapter01与chapter02的学习,你已经掌握了vim的简单使用,
下面我们就开始探讨怎么更加高效灵活地使用vim。在此之前,先通过本
章体会一下vim的一些使用思想。
3.1 结识 . 命令
. 命令会重复上次"修改"。这是优化重复性操作的利器。即在vim里面,
力求减少重复性操作,减少时间。
[lab]
int main(){
if( flag1 ){
if( flag2 ){
if( flag3 ){
}
}
}
}
修改下面的代码使其显示效果同上
int main(){
if( flag1 ){
if( flag2 ){
if( flag3 ){
}
}
}
}
**提示**
4>> 表示4行向右缩进
j. 光标向下移动一行,再重复上一次修改
3.2 不要自我重复
[lab]
给下面的3个语句末尾添加分号;
int a = 1
int b = 2
int c = a + b
**提示**
命令A可以直接跳转到末尾插入,输入;,再回到普通模式。
此时点击命令.,可以重复前一次修改:“在末尾插入分号”。
这里可以体会到A命令的特殊,它明确指出是末尾插入,此时
配合.指令,可以使得重复的指令也具有可移植性。
类似的还有以下指令
复合指令 | 等效的长指令
C | c$
S | ^c
s | cl
I | ^i
A | $a
o | A<Enter>
O | ko
尽量使用强大的复合指令而不是等效的长指令
3.3 以退为进
注意.命令只能重复上一次的修改,而在修改过程中如果光标通过
方向键发生了移动,之后又进行了修改,那么最后.命令只能重复
第二次修改,因为方向键会刷新修改的备份操作。
[lab]
var foo = "method(" + argument + "," + argument2 + ")";
思考如何通过.命令使得下面的语句达到上面语句的显示效果。
var foo = "method("+argument+","+argument2+")";
**提示**
f{char}是一个很强大的光标移动指令,普通模式下按下f+,光标
会去搜索当前位置前面是否存在符号"+",如果存在,则移动到该
符号位置处。同时命令;表示重复上一次f命令所查找的字符。
为了使得修改可以重复,尝试先删除符号“+”,再重新输入" + "。
3.4 执行、重复、回退
可见vim可以高效灵活地处理各种复杂的重复性操作。它可以让
移动动作和修改动作通过一个指令重复地执行。
对于这种重复性指令出错的概念也很高(比如多按了一次.),因此
掌握对应的撤销执行也很重要。
目的 | 操作 | 重复 | 回退
修改 | {edit} | . | u
在行内查找下一指定字符 | f{char}/t{char} | ; | ,
在行内查找上一指定字符 | F{char}/T{char} | ; | ,
在文档中查找下一处匹配项 | /pattern<Enter> | n | N
在文档中查找上一处匹配项 | ?pattern<Enter> | n | N
执行替换 | :s/target/replacement| & | u
执行一系列修改 | qx{changes}q | @x | u
**注意**
f,t,F,T都是很常用的行内查找指令,可以很快地将光标跳转到指定字符处。
[lab]
将光标移动到字符*处,然后分别执行指令dta, dTa, dfa, dFa观察结果。
I'm from China. * Where are you from ?
I'm from China. * Where are you from ?
I'm from China. * Where are you from ?
I'm from China. * Where are you from ?
f与t的区别就在于光标移动在char的前面还是char本身。
/pattern<Enter>, ?pattern<Enter>与 :s/target/replacement都是命令行指令
3.5 查找并手动替换
在命令行模式里,:s是一个很常用的指令,类似与一般IDE里面的查找并替换。
[lab]
标识符打错是非常常见的事,下面的printf全打成了prinft。现在需要你改正。
输入指令:%s/printf/printf/g
"""
{
prinft("first input");
...
prinft("you get it."); prinft("you success.");
...
prinft("you failed.");
}
"""
其中%表示替换范围是全文本,s是substitute,g是flag的一种,表示全局替换,
即如果一行有多个printf,那么全部替换成printf.
[lab]
但有时候我们需要的不是全部都替换掉。
下面我们只需要把参数是字符串的print改成printf。
"""
void print( int status ){ ... }
int main(){
print( 2 );
print("hello");
print( 2 ); print("hello");
print("hello"); print( 2 );
}
"""
把光标移动到print上,再使用*命令,等同于查找标识符print,
可以通过n/N命令来查找下/上一个。这样就可以重复移动操作了,
再配合.命令便可以重复修改操作。
3.6 结识 . 范式
回顾前面的例子,vim可以将重复性的操作优化为一种理想模式:
用一键移动,另一键执行!