-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathchapter04_深入了解4种模式
264 lines (159 loc) · 5.4 KB
/
chapter04_深入了解4种模式
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
下面我们分别在4种模式中探讨vim里面的高效操作。
# 普通模式
4.1 构造可重复的修改
[lab]
删除下面任一单词
What are you doing?
继续发挥vim里面语义化指令的特点,执行指令daw[delete a word],
即可删除光标所在单词,同时该修改可以很好地配合.命令。
dap表示delete a paragraph
4.2 用次数做简单算术运算
- {n}<C-a> : 加1(n)
- {n}<C-x> : 减1(n)
[lab]
试试操作下面的数字吧
123
10
9
8
4.3 操作符 + 动作命令 = 操作
操作符
命令 | 用途
c | 修改
d | 删除
y | 复制到寄存器
g~ | ~ | 反转大小写
gu | 转换为小写
gU | 转换为大写
> | 增加缩进
< | 减小缩进
= | 自动缩进
思考下列指令的特点
dap, gUap, caw, y2w
# 插入模式
4.4 在插入模式中即时更正错误
按键操作 | 用途
<C-h> | 删除前一个字符
<C-w> | 删除前一个单词
<C-u> | 删至行首
[lab]
试试吧
I have an apple.
I have two apple.
I have three apple.
4.5 插入模式下做运算
- <C-r>= : 使用表达式寄存器,在插入模式下按<C-r>=试试看,再随意输入
一个运算式子,如123-23
4.6 用替换模式替换已有文本
- R : 由普通模式进入替换模式
[lab]
试试在替换模式下进行编辑。
I'm fine. Are you?
改为
I'm fine, are you?
# 可视模式
4.7 重复执行面向行的可视命令
前面已经见识了daw, dap这种操作,其中w、p这些表示一种动作命令,
类似于一种操作范围。同样在可视模式中选择的高亮区域同样可以作为
一种范围表示。
[lab]
将下面的代码段正确缩进
"""
def fib(n):
a, b = 0, 1
while a < n:
print a,
a, b = b, a+b
fib(42)
def fib(n):
a, b = 0, 1
while a < n:
print a,
a, b = b, a+b
fib(42)
"""
**提示**
先使用<Shift-v>命令选择需要缩进的行,再使用命令>
建议使用操作符命令而不是可视命令
4.8 在长短不一的高亮块后添加文本
[lab]
给下面的语句末尾添加分号;
int a = 1
int numOfCars = 100
int c = a - b
**提示**
首先需要进入列块可视模式,<C-v>。
之后将三行都高亮选择,再按下命令$。
最后键入命令A,编辑;再退回普通模式。
# 命令行模式
Ex命令影响范围广且距离远,能处理更加复杂的情况。
4.9 操作缓冲区文本的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}/{flag}
| 替换
:[range]global/{pattern}/[cmd] | 对指定范围匹配{pattern}的所有行执行Ex命令{cmd}
range可以用行数表示,也可以用可视模式下的高亮选区表示
**注意**
使用的时候可以简写为开头第一个字母,注意copy的简写的t
同时还可以使用偏移地址, .表示当前行, .+n表示在当前行下方的第n行。
例如命令 .,.+3 d
下面是其它表示范围的符号
符号 | 地址
$ | 文件最后一行
. | 光标所在行
'm | 包含位置标记m的行
'< | 高亮选区的起始行
'> | 高亮选区的结束行
% | 整个文件,等同于 1,$
4.10 使用“:t”和“:m”命令复制和移动行
对于远距离的操作,使用Ex命令,如:t与:m
[lab]
先思考再尝试下面的命令
:196t.
:t198
:t.
:t$
:'<,'>t199 #注意这里是可视模式的选区
"""
hello hi how are you
abc abc abc
eee eee pop
kkk kkk zzz
"""
4.11 在指定范围内执行普通模式命令
[lab]
注释下面语句
"""
int a = 1;
int b = 2;
int c = a + b;
"""
**提示**
将光标移动到第一行语句上,尝试指令:.,.+2 normal I//
4.12 重复上次的Ex命令
.命令可以重复上次的普通模式命令,而@:可以重复执行上次的Ex命令。
在执行一次@:之后,后面还可以直接通过@@命令来重复它。
vim对打开过的文件会管理一个列表,通过:bn[ext]和:bp[revious]命令
可以正向和反向地去遍历这些文件条目。此时可以配合@:命令在不同的文件
之间进行切换。
但是这种切换比较容易搞混,更一般地,我们只使用:bn[ext]命令进行正向
遍历(后续可以使用@@命令来代替),使用<C-o>命令来反向遍历。
4.13 自动补全Ex命令
尝试Tab, <C-n>, <C-p>
4.14 把当前单词插入到命令行
- <C-r><C-w><Enter>
特别是在输入一些查找或者替换的Ex命令的时候,如果目标单词比较复杂,
这个功能就很实用。
4.15 运行shell命令
- :!{cmd} 例如:!ls
<C-z> : 可以将vim挂在后台,输入fg可将vim切换回前台
- :read !{cmd} 在shell中执行{cmd}, 并把其标准输出插入到光标下方
- :[range]write !{cmd} 在shell中执行{cmd},以range的内容作为其标准输入
- :[range]!{filter} 使用外部程序{filter}过滤指定的range的内容