forked from hackerlank/note
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVim_keys
1256 lines (977 loc) · 56.3 KB
/
Vim_keys
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
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
centOS 设置vim
vim /etc/vimrc
"显示行号
kjset number
"设置制表符为4个空格
set ts=4
set expandtab
set autoindent
"传说中的去掉边框用下边这一句
set go=
"设置配色,这里选择的是desert,也有其他方案,在vim中输入:color 在敲tab键可以查看
color desert
"打开语法高亮
syntax on
"增量式搜索
set incsearch
"高亮搜索
set hlsearch
"有时中文会显示乱码,用一下几条命令解决
let &termencoding=&encoding
set fileencodings=utf-8,gbk
### 编辑指令 (edit)
a -> 在光表后插入 (append after cursor)
A -> 在一行的结尾插入 (append at end of the line)
i -> 在光标前插入 (insert before cursor)
I -> 在第一个非空白字符前插入 (insert before first non-blank)
o -> 光标下面插入一个新行 (open line below)
O -> 光标上面插入一个新行 (open line above)
x -> 删除光标下(或者之后)的东西 (delete under and after cursor)
例如x就是删除当前光标下,3x就是删除光标下+光标后2位字符
X -> 删除光标前的字符 (delete before cursor)
d -> 删除 (delete)
可以用dd删除一行,或者3dw删除3个词等等
J -> 将下一行提到这行来 (join line)
r -> 替换个字符 (replace characters)
R -> 替换多个字符 (replace mode – continue replace)
gr -> 不影响格局布置的替换 (replace without affecting layout)
c -> 跟d键一样,但是删除后进入输入模式 (same as “d” but after delete, in insert mode)
S -> 删除一行(好像dd一样)但是删除后进入输入模式 (same as “dd” but after delete, in insert mode)
s -> 删除字符,跟(d)一样,但是删除后进入输入模式 (same as “d” but after delete, in insert mode)
s4s 会删除4个字符,进入输入模式 (delete 4 char and put in insert mode)
~ -> 更改大小写,大变小,小变大 (change case upper-> lower or lower->upper)
gu -> 变成小写 (change to lower case)
例如 guG 会把光标当前到文件结尾全部变成小写 (change lower case all the way to the end)
gU -> 变成大写 (change to upper case)
例如 gUG 会把光标当前到文件结尾全部变成大写 (change upper case all the way to the end)
:w 对编辑后的文档进行保存
:q 退出vi编辑器
:wq 保存并退出编辑器
:q! 强制退出不保存
:w! 强制保存
:wq! 强制保存并退出
:n(数字) 光标定位到第n行
:set number 或 nu 给编辑器设置行号
:set nonumber 或 nonu 取消行号
:e!:放弃更改,然后相当于重新打开
:help:帮助,可用ZZ退出帮助窗口
编辑命令
文本对象 更改 删除 复制 选中
单个字符 r 后:x 前X yl或yh
?个字符 ?s ?x ?yl
一个单词 cw dw yw或yaw vw
?个单词,不包括标点括号 ?cW或c?W ?dW或d?W ?yW或y?W v3W
后退?个单词 ?cb或c?b ?db或d?b ?yb或y?b
到一行的结尾 c$或C d$或D y$
到一行的开头 c0 d0 y0
一整行 cc dd yy或Y
?行 ?S 下:?dd 下:y?j nyy 上:y?k
匹配标点符号中的文本 ci符号 di符号 yi符号 vi符号
ab:包括括号和()内的区域。
aB:包括括号和{}内的区域。
ib:括号()内的区域。
iB:括号{}内的区域。
aw:标记一个单词。
daB: 删除{}及其内的内容。
diB: 删除{}中的内容。
n1,n2 d:将n1,n2行之间的内容删除。
R 替换光标所到之处的字符。
p 对复制(删除)后的内容进行粘贴
]p 粘贴到合适的缩进处。
n1,n2 co n3:复制第n1行到第n2行之间的内容到第n3行后面。
u 撤销
U:撤销当前行的所有修改
ctrl+r:对撤消的撤消
m 移动:
n1,n2 m n3:将n1行到n2行之间的内容移至n3行下
. 重复执行上一次命令
J:删除换行符,使下一行并上来。
nJ:连接后面的n行
cw 删除光标所在的位置到单词结尾 进入编辑模式
. 大小写转换:
gUU: 将当前行的字母改为大写。
guu: 将当前行的字母改为小写。
gUw: 将当前光标下的单词改为大写。
guw: 将当前光标下的单词改为小写。
a. 整篇大写:
ggguG
gg: 光标到文件第一个字符。
gu: 把选择范围全部小写。
G: 到文件结束。
b. 整篇小写:gggUG
选择
v: 开启可视模式。 V: 开启逐行可视模式。
^V: 矩形选择。
替换
:/内容/ 或 /内容 内容查找 n下一个 N上一个
:s/cont1/cont2/ cont1替换为cont2 替换光标所在行第一个
:s/cont1/cont2/g cont1替换为cont2 替换光标所在行全部
:%s/cont1/cont2/g cont1替换为cont2 替换整个文档的全部目标
1、vim ~/.vimrc 进入配置文件
如果不知道vimrc文件在哪,可使用 :scriptnames 来查看
set nu #行号
set tabstop=4 #一个tab为4个空格长度
set ai #设置自动缩进
syntax on #高亮
4. 查找:
/: 输入关键字,发现不是要找的,直接在按n,向后查找直到找到为止。
?: 输入关键字,发现不是要找的,直接在按n,向前查找直到找到为止。
*: 在当前页向后查找同一字。
#: 在当前页向前查找同一字。
进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename....filename :打开多个文件,依次进行编辑
vi编辑器 vi filename
命令模式(默认)
选择
一. 移动:
zz: 当前编辑行置为屏中。
zb: 当前编辑行置为屏底。
G:直接跳转到文件的底部。
gg: 跳转到文件首。
gd: 跳转到光标所在函数和变量的定义。
():跳转到当前的行首、行尾。
{}:向上、向下跳转到最近的空行。
[{:跳转到目前区块开头。
]}:跳转到目前区块结尾。
0: 跳转到行首。
$: 跳转到行尾。
2$: 跳转到下一行的行尾。
#:跳转到该行的第#个位置。
#G: 15G,跳转到15行。
:#:跳转到#行。
h← j↓ k↑ l→
w: 下一个词的词首。W:下一个单词(不含标点)。
e:下一个词的词尾。E:不含标点。
b 上个单词首字母 before
B 左移一个以空格分隔的词
b、3b、w、3w:向前\后移动几个单词,标点也算一个单词
$ 定位到行尾
0 定位到行首
。相应的大写状态为不含标点,即只把空格和换行符作为单词间隔符。
$:移动到行尾 3$:移动到3行后的行尾
^:移动到行首,0也是
+:移到下一行的行首
-: 移到上一行的行首
{ 上个段落首部
} 下个段落尾部
H 当前屏幕首部 不翻屏
L 当前屏幕尾部 不翻屏
G 文档尾部
gg 文档首部
1G 文档首部
nG 文档的第n行
Ctrl-F 向前翻页
Ctrl-B 向后翻页
Ctrl+G:显示当前位置
空格键 向右移动一格
caw:改写单词 c 相当于 d 变为编辑模式
Ctrl+o:临时变成命令模式(一次而已)
f:搜索命令,小写时向后搜索(用来定位)如 fx:定位到下一个x上。 Fx:定位到上一个x上,重复时,可用;或, 不过 , 表示反方向
%:跳到相对应的括号上,编程时常用
33G:跳转到33行 此时按``可以返回到原来行
gg:文件头 G: 文件尾
30%:跳转到文件的30%处
"H"意为Home, "M"为Middle, "L"为Last. 当前屏幕的上中下位置,大小写皆可
vim中Nyy可以复制光标后的N行。有时我们不容易得出行数,这时可以用做标记的方法来制定复制范围:
1. 在开始行上输入ma作一个标记a
2. 移动到结束行,输入y'a会复制当前行到标记a之间的文本。d'a会删除。
或者是v进入可视模式,再13G跳转到相应行,y即可。
:10,20y 回车即可,相应的删除也是如此 :10,20d (此方法比上面两种方法更简单)
:10,20 m 30 把10行到20行的内容,剪切到30行之后
:10,20 co 30 把10行到20行的内容,复制到30行之后
将光标放在 { 处,然后输入v%就可以把大括号中内容选定
如果光标放在第一个s上,想删除到“(”为止,则输入dt(就可以了,t(的作用是跳到下一个"("前。
ctrl +n 自动补全 ctrl + p 也一样
:ab hw hello world 用一个缩写字符串代替一个长的字符串,此处用 hw 代替 hello world
%: 移动到与制匹配的括号上去(),{},[],<>等
' 移动到上一次的修改行
fx 向右跳到本行字符x处(x可以是任何字符)
Fx 向左跳到本行字符x处(x可以是任何字符)
tx 和fx相同,区别是跳到字符x前
Tx 和Fx相同,区别是跳到字符x后
# 到与当前单词相同的上一个单词上, * 到与当前单词相同的下一个单词上
如果你要重复键入一个短语或一个句子, 也有一种快捷的方法。Vim有一种记录宏的机制。你键入"qa"开始把一段宏记录入寄存器变量`a'中。
按下来你可以象平常一样键入你要的操作, 只是这些操作都会被Vim记录进它命名为`a'的宏中, 再次再下"q"键, 就结束了宏`a'的录制。当你要重复执行你刚才记录的那些操作时只要使用"@a"命令。共有26个可用的寄存器供你记录宏。 使用宏你可以重复多个不同的操作。而不仅仅是插入文本了。如果你要进行某种重复的操作, 记着要用这一招呀。
:abbr hte the
:abbr hw Hello World
输入先面的单词时,自动用后面的替换。
3、移动:
:set number:设置显示行号,set nonumber:关闭显示
:set ruler 设置在窗口右下角显示行号,与上面的好处是,节省空间
ctrl+u\d 向上\下滚动半屏
ctrl+e\y 向上\下滚动一行
ctrl+b\f 向上\下滚动一屏 这个比较实用,记住。
zz:将当前行滚动于屏幕中间,方便查看上下文 zt置顶,zb置尾
/string 查找string,回车后,按n键可以跳到下一个,N上一个,另外按/键后,按上下键可以找到以前查找的记录,同样的 :也有记录
?/string 同上,默认向上查找
:set ignorecase 大小写无关
:set noignorecase 大小写敏感
* :查找下一个光标所在单词 #是查找上一个
:set hlsearch 高亮显示查找结果
:set nohlsearch 取消高亮
:nohlsearch 去掉当前显示的高完(一次性)
`` 上次光标停靠的行
% 匹配到相应括号处
>> 向右移动本行一段距离 << 向左移动本行一段距离 3<< 把下面3行(包括本行),向左移动一段距离 :20,30>> 把20行到30行向右移动一段距离
4、小幅改动:
:%s/str1/str2/g 替换每一行的 str1为 str2
:10,20s/str1/str2/g 替换从行10到行20之间的 str1为 str2
:10,$s/str1/str2/g 替换从行10到最后一行之间的 str1为 str2
:s/str1/str2/g 替换当前行的 str1为 str2
. 重复执行命令
:10,$ w test2.cpp 取行10到最后一行内容,保存到test2.cpp
:r class/User.hpp 读取文件中的内容,插入到当前行的后面
dw:删除一个单词(光标后部分) 不如:daw实用 d4w:删除4个单词 d$:删除当前光标到行尾 d^:删除当前光标至行首 d换成c效果是一样的,只是操作完会变成insert模式 dnw: 删除N个单词 dnj: 向下删除n行 dnk: 向上删除n行
X:删除左边的字符,相当于<-键,x删除当前字符 D:相当于d$ C:相当于c$ s:相当于c1 S:相当于cc
r:替换当前字符,但不会进入insert模式 3r:把后面3个字符替换掉 R:替换模式
.:重复上一次操作
v:进入Visual模式 V:进入可视行模式,比如 Vjjd 删除3行 Ctrl+v:可视块模式
P:粘贴至光标前 p:粘贴至光标后 3P:粘贴3次 "2p 粘贴最后第二次的删除的内容
自动缩进:
:set cindent(所有的set都可以简写为se,虽然只节省了一个字符, 译者注) 需要注意的是cindent控制缩进量是通过shiftwidth选项的值, 而不是通过tabstop 的值, shiftwidth的默认值是8(也就是说, 一个缩进为8个空格, 译者注), 要改变默认的设置, 可以使用":set shiftwidth=x"命令, 其中x是你希望一个缩进量代表的空格的数目.
{ = 到前一个空行上
} = 到下一个空行上
5、VIM的一些插件:
c.vim :如果是用root账号的,把文件复制到/usr/share/vim/vim70中解压没有用的,不存在 $HOME/.vim 这个目录,没办法,只能新建个目录,然后把压缩包cp到这个目录,再unzip即可。在 ~/.vimrc 中 写入 filetype plugin on
:e! 返回上次保存后的状态
Ctrl+z:暂停vi,回到Unix提示符,再输入fg即可回到vi。
^回到行首,光标位于行首字母处;0回到行首,光标位于行首字母前。$回到行尾,光标位于行尾字母处。
nb:向前移动n个单词,nw:向后移动n个单词。光标位于单词的第一个字母处。 nw这个操作很慢,不知何故。 以空格、标点符号与单词的分界为分隔符。(几个连续的标点视为一个单词)
同样的,也可以使用nB,nW,只是这里只使用空格做为分隔符。
相换两个相邻字母的位置:x、p
s:删除一个字符,并进入编辑模式。 S:删除一整行,进入编辑模式,相当于cc。 ns:删除后面n个字符,并进入编辑模式。
~:更改字母的大小写,同时光标进入到下一个字符。 n~:把后面n个字母的大小写状态改变。
dw:删除单词后面部分 db:删除单词前面部分。 如果要删除整个单词(光标位于单词中间的话),可以 dbw\wdb
de:类似于dw,删除单词后面的部分(只删除到本单词结尾,dw会删除掉单词后面的空格) dE:删除的范围包括标号在内的单词结尾。
e:相当于w,向后移动一个单词。不同的是,w移动到单词第一个字符上,e移动到单词最后一个字符上。 所以ea,可以给本单词追加内容。
D:d$ 的简写,同样的,C:c$的简写。
U:会恢复一整行原先的面貌,即最原始的样子。
Y:相当于yy,不同于D与C的操作方法。
.:重复上一个命令。
除了O/o,插入命令(A,a,I,i)接受数值参数,如:5Ihello,然后按ESE键。会在行首输入5个连接的hello
nr:替换后面n个字符。
nJ:合并下面的n行(从本行算起)。
ynl:向后复制n个字符。
e/E:到单词的结尾。
滚动整屏:
^f:向前(下)一整屏
^b:向后(上)一整屏
^d:向前(下)一半屏
^u:向后(上)一半屏
z,Enter:将光标所在行移动到屏幕顶部(同于zz)
z.:将光标所在行移动到屏幕中间
z-:将光标所在行移动到屏幕尾部
nz,Enter:将第n行移动到屏幕顶部,同样的,z. 与 z- 前也可以加数字。
在屏幕中移动:
H、M、L分别移动到屏幕的顶部、中间和尾部。
nH、nL 移动到距离屏幕顶部和顶部n行的位置。
Enter:到下一行的第一个字符。
+:到下一行的第一个字符。
-:到上一行的第一个字符。
n|:移动到当前行的第n列
e:移到单词的结尾
E:移到单词的结尾(忽略标点符号)
( ) { } [[ ]] 这几个对编程作用不大,可忽略。
d/it:向后删除到it之前的位置(不删it)。 d?it:向前删除到it之前的位置(删除it)。
fx:本行中向右搜索x,光标置于x上。 Fx:向左搜索。; 重复上一个搜索命令,方向相同。 ,重复上一个搜索命令,方向相反。
tx:同fx,只是光标置于x之前。 Tx类似。
dfi:向右删除第一个i的位置(包括i) dti:同dfi,只是不包括i
Ctrl+G 查看当前行信息
nG跳转后,可使用``回到上一次的位置,''功能一样,不过只是回到前次位置所在行的开头,而不是确定的位置上。
删除包含keyword字符串的行: :g/keyword/d
删除空行::%s/^\n$//g
移动光标类命令
h :光标左移一个字符
l :光标右移一个字符
space:光标右移一个字符
Backspace:光标左移一个字符
k或Ctrl+p:光标上移一行
j或Ctrl+n :光标下移一行
Enter :光标下移一行
w或W :光标右移一个字至字首
b或B :光标左移一个字至字首
e或E :光标右移一个字至字尾
) :光标移至句尾
( :光标移至句首
}:光标移至段落开头
{:光标移至段落结尾
nG:光标移至第n行首
n+:光标下移n行
n-:光标上移n行
n$:光标移至第n行尾
H :光标移至屏幕顶行
M :光标移至屏幕中间行
L :光标移至屏幕最后行
0:(注意是数字零)光标移至当前行首
$:光标移至当前行尾
屏幕翻滚类命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
ncw或nCW:修改指定数目的字
nCC:修改指定数目的行
删除命令
ndw或ndW:删除光标处开始及其后的n-1个字
do:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:删除输入方式下所输入的文本
搜索及替换命令
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换
选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息
最后行方式命令
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:w :保存当前文件
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:执行shell命令command
:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行
寄存器操作
"?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
"?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。
三、替换文本
│命令 │描述 │
│$ │到行尾 │
│( │到句子的开头│
│) │到句子的末尾│
│{ │到段落的开头│
│} │到段落的末尾│
四、删除文本
│命令 │描述 │
│r │替换一个字符 │
│c │修改文本直到按下Esc健 │
│cw │修改下一个词 │
│cnw │修改接下来的n个词 │
五、文本编辑
│命寺│描述 │
│yy │将一行文本移到缺省缓冲区中 │
│yn │将下一个词移到缺省缓冲区中 │
│ynw │将后面的n个词移到缺省缓冲区中 │
│p │如果缺省缓冲区中包含一行文本,则在当前 │
│ │行后面插入一个空行井将缺省缓冲区中的声 │
│ │容粘贴到这一行中;如果缺省缓冲区中包含 │
│ │多个词,把这些词粘贴到光标的右边. │
│P │如果缺省缓冲区中包含一行文本,则正当前 │
│ │行前面插入一个空行井将缺省缓冲区中的内 │
│ │容粘贴到这一行中;如果缺省缓冲区中包含 │
│ │多个词,把这些词粘贴到光标的左边
六、保存退出
│命令 │描述 │
│zz │保存并退出 │
│:w filename │写入文件 │
│:W │写入文件 │
│:x │保存(如果当前文件修改过)并退出│
│:q! │不保存文件,直接退出 │
│:q │退出vi │
END
### 键盘移动 (Move)
一切都从键盘的移动
k -> 上 up
j -> 下 down
h -> 左 left
l -> 右 right
z -> 重画屏幕,当前光标变成屏幕的第一行 (redraw current line at top of window)
CTRL-f -> 跳到下一页 (page down)
CTRL-b -> 跳到上一页 (page up)
### 跳跃指令 (jumps)
跳跃指令类似于游览器中的<前进><后退>按钮
CTRL-] -> 跟着link/tag转入 (follow link/tag)
CTRL-o -> 回到上一次的jump (go back)
CTRL-i -> 跳回下一个 (go forward)
:ju -> 显示所有的可以跳跃的地方 (print jump list)
### 重做/回复
u -> undo
CTRL-r -> redo
vim的undo是树结构的,你可以回到这个结构中的任何地方
:undo 2 -> undo 到结构的2层 (undo to tree 2)
:undolist -> 显示所有的undo列表 (show undo list)
:earlier 10s -> undo到10秒前的编辑 (undo to 10 seconds ago)
:earlier 10h -> undo到10小时前的编辑 (back to 10 hours ago)
:earlier 1m -> undo到1分钟前 (back to 1 minutes ago)
下面是undo的tree结构的解释
………..one
…………. |
……..change 1
…………. |
………one too
………. /……..\
…..change 2 ……. change 3
………… | ………………… |
…….one two ………. me too
……….. |
….. change 4
………..|
…… not two
### 视觉模式 (visual)
v -> 进入视觉模式
在视觉模式内可以作block的编辑
CTRL-v -> visual block
### 打印 (print)
:hardcopy -> 打印vim中的内容 (print text)
混合视觉模式 (visual) 可以选择打印的区域
没试过是否可以直接给值打印(应该可以)例如 :1,15hardcopy 打印前15行
将文件写成网页格式 (html)
:source $VIMRUNTIME/syntax/2html.vim -> change current open file to html
格式 (format)
dos/windows跟unix/linux对于文件的结束是不一样的。vim可以直接设定/更改格式
用纸令:set fileformats=unix,dos 可以改变文件的格式 (change format)
:set ff=unix -> 设定文件成unix格式 (set file in unix format)
:set ff=dos -> 设定文件成dos格式 (set file in dos format)
:set ff? -> 检查当前文件格式 (check the format of current file)
如果改变格式,直接:w存档就会存成新的格式了。
加密 (encryption)
vim可以给文件加密码
vim -x 文件名 (filename) -> 输入2次密码,保存后文件每次都会要密码才能进入 (encrypt the file with password)
vim 处理加密文件的时候,并不会作密码验证,也就是说,当你打开文件的时候,vim不管你输入的密码是否正确,直接用密码对本文进行解密。如果密码错误,你看 到的就会是乱码,而不会提醒你密码错误(这样增加了安全性,没有地方可以得知密码是否正确)当然了,如果用一个够快的机器作穷举破解,vim还是可以揭开 的
vim 语法显示 (syntax)
:syntax enable -> 打开语法的颜色显示 (turn on syntax color)
:syntax clear -> 关闭语法颜色 (remove syntax color)
:syntax off -> 完全关闭全部语法功能 (turn off syntax)
:syntax manual -> 手动设定语法 (set the syntax manual, when need syntax use :set syntax=ON)
输入特殊字符 (special character)
CTRL-v 编码就可以了
例如 CTRL-v 273 -> ÿ 得到 ÿ
二进 制文件 (binary file)
vim可以显示,编辑2进位文件
vim -b datafile
:set display=uhex -> 这样会以uhex显示。用来显示一些无法显示的字符(控制字符之类)(display in uhex play non-display char)
:%!xxd -> 更改当前文件显示为2进位 (change display to binary)
:%!xxd -r -> 更改二进位为text格式 (convert back to text)
自动完成 (auto-completion)
vim本身有自动完成功能(这里不是说ctag,而是vim内建的)
CTRL-p -> 向后搜索自动完成 (search backward)
CTRL-n -> 向前搜索自动完成 (search forward)
CTRL-x+CTRL-o -> 代码自动补全 (code completion)
自动备份 (backup)
vim可以帮你自动备份文件(储存的时候,之前的文件备份出来)
:set backup -> 开启备份,内建设定备份文件的名字是 源文件名加一个 ‘~’ (enable backup default filename+~)
:set backupext=.bak -> 设定备份文件名为源文件名.bak (change backup as filename.bak)
自动备份有个问题就是,如果你多次储存一个文件,那么这个你的备份文件会被不断覆盖,你只能有最后一次存文件之前的那个备份。没关系,vim还提 供了patchmode,这个会把你第一次的原始文件备份下来,不会改动
:set patchmode=.orig -> 保存原始文件为 文件名.orig (keep orignal file as filename.orig)
开启,保存与退出 (save & exit)
:w -> 保存文件 (write file)
:w! -> 强制保存 (force write)
:q -> 退出文件 (exit file without save)
:q! -> 强制退出 (force quite without save)
:e filename -> 打开一个文件名为filename的文件 (open file to edit)
:e! filename -> 强制打开一个文件,所有未保存的东西会丢失 (force open, drop dirty buffer)
:saveas filename -> 另存为 filename (save file as filename)
### 复制与粘贴 (copy & paste)
y -> 复制 (yank line)
yy -> 复制当前行 (yank current line)
“{a-zA-Z}y -> 把信息复制到某个寄存中 (yank the link into register {a-zA-Z})
例如我用 “ayy 那么在寄存a,就复制了一行,然后我再用“byw复制一个词在寄存b
粘贴的时候,我可以就可以选择贴a里面的东西还是b里面的,这个就好像是多个复制版一样
“*y -> 这个是把信息复制进系统的复制版(可以在其他程序中贴出来)(yank to OS buffer)
p -> 当前光标下粘贴 (paste below)
P -> 当前光标上粘贴 (paste above)
“{a-zA-Z}p -> 将某个寄存的内容贴出来 (paste from register)
例如“ap那么就在当前光标下贴出我之前在寄存a中 的内容。“bP就在当前光标上贴出我之前寄存b的内容
“*p -> 从系统的剪贴板中读取信息贴入vim (paste from OS buffer to vim)
reg -> 显示所有寄存中的内容 (list all registers)
书签 (Mark)
书签是vim中非常强大的一个功能,书签分为文件书签跟全局书签。文件书签是你标记文件中的不同位置,然后可以在文件内快速跳转到你想要的位置。 而全局书签是标记不同文件中的位置。也就是说你可以在不同的文件中快速跳转
m{a-zA-Z} -> 保存书签,小写的是文件书签,可以用(a-z)中的任何字母标记。大写的是全局 书签,用大写的(A-Z)中任意字母标记。(mark position as bookmark. when lower, only stay in file. when upper, stay in global)
‘{a-zA-Z} -> 跳转到某个书签。如果是全局书签,则会开启被书签标记的文件跳转至标记的行 (go to mark. in file {a-z} or global {A-Z}. in global, it will open the file)
’0 -> 跳转入现在编辑的文件中上次退出的位置 (go to last exit in file)
” -> 跳转如最后一次跳转的位置 (go to last jump -> go back to last jump)
‘” -> 跳转至最后一次编辑的位置 (go to last edit)
g’{mark} -> 跳转到书签 (jump to {mark})
:delm{marks} -> 删除一个书签 (delete a mark) 例如:delma那么就删除了书签a
:delm! -> 删除全部书签 (delete all marks)
:marks -> 显示系统全部书签 (show all bookmarks)
标志 (tag)
:ta -> 跳转入标志 (jump to tag)
:ts -> 显示匹配标志,并且跳转入某个标志 (list matching tags and select one to jump)
:tags -> 显示所有标志 (print tag list)
运行外部命令 (using an external program)
:! -> 直接运行shell中的一个外部命令 (call any external program)
:!make -> 就直接在当前目录下运行make指令了 (run make on current path)
:r !ls -> 读取外部运行的命令的输入,写入当然vim中。这里读取ls的输出 (read the output of ls and append the result to file)
:3r !date -u -> 将外部命令date -u的结果输入在vim的第三行中 (read the date -u, and append result to 3rd line of file)
:w !wc -> 将vim的内容交给外部指令来处理。这里让wc来处理vim的内容 (send vim’s file to external command. this will send the current file to wc command)
vim对于常用指令有一些内建,例如wc (算字数)(vim has some buildin functions, such like wc)
g CTRL-G -> 计算当前编译的文件的字数等信息 (word count on current buffer)
!!date -> 插入当前时间 (insert current date)
多个文件的编辑 (edit multifiles)
vim可以编辑多个文件,例如
vim a.txt b.txt c.txt 就打开了3个文件
:next -> 编辑下一个文件 (next file in buffer)
:next! -> 强制编辑下个文件,这里指如果更改了第一个文件 (force to next file in buffer if current buffer changed)
:wnext -> 保存文件,编辑下一个 (save the file and goto next)
:args -> 查找目前正在编辑的文件名 (find out which buffer is editing now)
:previous -> 编辑上个文件 (previous buffer)
:previous! -> 强制编辑上个文件,同 :next! (force to previous buffer, same as :next!)
:last -> 编辑最后一个文件 (last buffer)
:first -> 编辑最前面的文件 (first buffer)
:set autowrite -> 设定自动保存,当你编辑下一个文件的时候,目前正在编辑的文件如果改动,将会自动保存 (automatic write the buffer when you switch to next buffer)
:set noautowrite -> 关闭自动保存 (turn autowrite off)
:hide e abc.txt -> 隐藏当前文件,打开一个新文件 abc.txt进行编辑 (hide the current buffer and edit abc.txt)
:buffers -> 显示所有vim中的文件 (display all buffers)
:buffer2 -> 编辑文件中的第二个 (edit buffer 2)
vim中很多东西可以用简称来写,就不用打字那么麻烦了,例如 :edit=:e, :next=:n 这样.
分屏 (split)
vim提供了分屏功能(跟screen里面的split一样)
:split -> 将屏幕分成2个 (split screen)
:split abc.txt -> 将屏幕分成两个,第二个新的屏幕中显示abc.txt的内容 (split the windows, on new window, display abc.txt)
:vsplit -> 竖着分屏 (split vertically)
:{d}split -> 设定分屏的行数,例如我要一个屏幕只有20行,就可以下:20split (split the windows with {d} line. 20split: open new windows with 3 lines)
:new -> 分屏并且在新屏中建立一个空白文件 (split windows with a new blank file)
CTRL-w+j/k/h/l -> 利用CTRL加w加上j/k/h/l在不同的屏内切换 (switch, move between split screens)
CTRL-w+ -/+ -> 增减分屏的大小 (change split size)
CTRL-w+t -> 移动到最顶端的那个屏 (move to the top windows)
CTRL-w+b -> 移动到最下面的屏 (move to bottom window)
:close -> 关闭一个分出来的屏 (close splited screen)
: only -> 只显示光标当前屏 ,其他将会关闭(only display current active screen, close all others )
:qall -> 退出所有屏 (quite all windows)
:wall -> 保存所有屏 (write to all windows)
:wqall -> 保存并退出所有屏 (write and quite all windows)
:qall! -> 退出所有屏,不保存任何变动 (quite all windows without save)
开启文件的时候,利用 -o选项,就可以直接开启多个文件在分屏中 (with -o option from command line, it will open files and display in split mode)
vim -o a.txt b.txt
今天有人说不会看diff,其实vim也可以用来看diff,这个也是属于分屏的部分,这里也写一下。
vimdiff a.txt b.txt 如果直接给 -d选项是一样的 vim -d a.txt b.txt
:diffsplit abc.txt 如果你现在已经开启了一个文件,想vim帮你区分你的文件跟abc.txt有什么区别,可以在vim中用diffsplit的方式打开第二个文件,这个时 候vim会用split的方式开启第二个文件,并且通过颜色,fold来显示两个文件的区别
这样vim就会用颜色帮你区分开2个文件的区别。如果文件比较大(源码)重复的部分会帮你折叠起来(折叠后面会说)
现在来说patch
:diffpatch filename 通过:diffpatch 你的patch的文件名,就可以以当前文件加上你的patch来显示。vim会split一个新的屏,显示patch后的信息并且用颜色标明区别。
如果不喜欢上下对比,喜欢左右(比较符合视觉)可以在前面加vert,例如:
:vert diffsplit abc.txt
:vert diffpatch abc.txt
看完diff,用: only回到原本编辑的文件,觉 得diff的讨厌颜色还是在哪里,只要用:diffoff关闭就好了。
还有个常用的diff中的就是 :diffu 这个是 :diffupdate 的简写,更新用
TAB
除了split之外, vim还可以用 tab
:tab split filename -> 这个就用tab的方式来显示多个文件 (use tab to display buffers)
gt -> 到下一个tab (go to next tab)
gT -> 到上一个tab (go to previous tab)
vim大多数东西都是可一给数字来执行的,tab也是一样
0gt ->跳到第一个tab (switch to 1st tab)
5gt -> 跳到第五个tab (switch to 5th tab)
关闭所有的tab可以使用qall的指令。另外让vim在启动的时候就自动用tabnew的方式来开启多个文件,可以用alias
linux: 添加 alias vim=’vim -p’ 到 ~/.bashrc
windows: 自己写个vim.bat的文件,然后放在path中,文件内容:
@echo off
vim -p %*
当需要更改多个tab中的文件的时候,可以用 :tabdo 这个指令 这个就相当于 loop 到你的所有的 tab 中然后运行指令。
例如有5个文件都在tab里面,需要更改一个变量名称:abc 到 def, 就可以用 :tabdo %s/abc/def/g 这样所有的5个tab里面的abc就都变成def了
折叠 (folding)
vim的折叠功能。。。我记得应该是6版出来的时候才推出的吧。这个对于写程序的人来说,非常有用。
zfap -> 按照段落折叠 (fold by paragraph)
zo -> 打开一个折叠 (open fold)
zc -> 关闭一个折叠 (close fold)
zf -> 创建折叠 (create fold) 这个可以用v视觉模式,可以直接给行数等等
zr -> 打开一定数量的折叠,例如3rz (reduce the folding by number like 3zr)
zm -> 折叠一定数量(之前你定义好的折叠) (fold by number)
zR -> 打开所有的折叠 (open all fold)
zM -> 关闭所有的摺叠 (close all fold)
zn -> 关闭折叠功能 (disable fold)
zN -> 开启折叠功能 (enable fold)
zO -> 将光标下所有折叠打开 (open all folds at the cursor line)
zC -> 将光标下所有折叠关闭 (close all fold at cursor line)
zd -> 将光标下的折叠删除,这里不是删除内容,只是删除折叠标记 (delete fold at cursor line)
zD -> 将光标下所有折叠删除 (delete all folds at the cursor line)
按照tab来折叠,python最好用的 (ford by indent, very useful for python)
:set foldmethod=indent -> 设定后用zm 跟 zr 就可以的开关关闭了 (use zm zr)
### 保存 (save view)
对于vim来说,如果你设定了折叠,但是退出文件,不管是否保持文件,折叠部分会自动消失的。这样来说非常不方便。所以vim给你方法去保存折 叠,标签,书签等等记录。最厉害的是,vim对于每个文件可以保存最多10个view,也就是说你可以对同一个文件有10种不同的标记方法,根据你的需 要,这些东西都会保存下来。
:mkview -> 保存记录 (save setting)
:loadview -> 读取记录 (load setting)
:mkview 2 -> 保存记录在寄存2 (save view to register 2)
:loadview 3 -> 从寄存3中读取记录 (load view from register 3)
### 常用指令 (commands)
:set ic ->设定为搜索时不区分大小 写 (search case insensitive)
:set noic ->搜索时区分大小写。 vim内定是这个(case sensitive )
& -> 重复上次的”:s” (repeat previous “:s”)
. -> 重复上次的指令 (repeat last command)
K -> 在man中搜索当前光标下的词 (search man page under cursor)
{0-9}K -> 查找当前光标下man中的章节,例如5K就是同等于man 5 (search section of man. 5K search for man 5)
:history -> 查看命令历史记录 (see command line history)
q: -> 打开vim指令窗口 (open vim command windows)
:e -> 打开一个文件,vim可以开启http/ftp/scp的文件 (open file. also works with http/ftp/scp)
:e http://www.google.com/index.html -> 这里就在vim中打开google的index.html (open google’s index.html)
:cd -> 更换vim中的目录 (change current directory in vim)
:pwd -> 显示vim当前目录 (display pwd in vim)
gf -> 打开文件。例如你在vim中有一行写了#include 那么在abc.h上面按gf,vim就会把abc.h这个文件打开 (look for file. if you have a file with #include , then the cursor is on abc.h press gf, it will open the file abc.h in vim )
记录指令 (record)
q{a-z} -> 在某个寄存中记录指令 (record typed char into register)
q{A-Z} -> 将指令插入之前的寄存器 (append typed char into register{a-z})
q -> 结束记录 (stop recording)
@{a-z} -> 执行寄存中的指令 (execute recording)
@@ -> 重复上次的指令 (repeat previours :@{a-z})
还是给个例子来说明比较容易明白
我现在在一个文件中下qa指令,然后输入itest然后ESC然后q
这里qa就是说把我的指令记录进a寄存,itest实际是分2步,i 是插入 (insert) 写入的文字是 text 然后用ESC退回指令模式q结束记录。这样我就把itest记录再一个寄存了。
下面我执行@a那么就会自动插入test这个词。@@就重复前一个动作,所以还是等于@a
### 搜索 (search)
vim超级强大的一个功能就是搜索跟替换了。要是熟悉正表达(regular expressions)这个搜索跟后面的替换将会是无敌利器(支持RE的编辑器不多吧)
从简单的说起
# -> 光标下反向搜索关键词 (search the word under cursor backward)
* -> 光标下正向搜索关键词 (search the word under cursor forward)
/ -> 向下搜索 (search forward)
? -> 向上搜索 (search back)
这里可以用 /abc 或 ?abc的方式向上,向下搜索abc
% -> 查找下一个结束,例如在”(“下查找下一个”)”,可以找”()”, “[]” 还有shell中常用的 if, else这些 (find next brace, bracket, comment or #if/#else/#endif)
下面直接用几个例子说话
/a* -> 这个会搜到 a aa aaa
/\(ab\)* -> 这个会搜到 ab abab ababab
/ab\+ -> 这个会搜到 ab abb abbb
/folers\= -> 这个会搜到 folder folders
/ab\{3,5} -> 这个会搜到 abbb abbbb abbbbb
/ab\{-1,3} -> 这个会在abbb中搜到ab (will match ab in abbb)
/a.\{-}b -> 这个会在axbxb中搜到axb (match ‘axb’ in ‘axbxb’)
/a.*b -> 会搜索到任何a开头后面有b的 (match a*b any)
/foo\|bar -> 搜索foo或者bar,就是同时搜索2个词 (match ‘foo’ or ‘bar’)
/one\|two\|three -> 搜索3个词 (match ‘one’, ‘two’ or ‘three’)
/\(foo\|bar\)\+ -> 搜索foo, foobar, foofoo, barfoobar等等 (match ‘foo’, ‘foobar’, ‘foofoo’, ‘barfoobar’ … )
/end\(if\|while\|for\) -> 搜索endif, endwhile endfor (match ‘endif’, ‘endwhile’, ‘endfor’)
/forever\&… -> 这个会在forever中搜索到”for”但是不会在fortuin中搜索到”for” 因为我们这里给了&…的限制 (match ‘for’ in ‘forever’ will not match ‘fortuin’)
特殊字符前面加^就可以 (for special character, user “^” at the start of range)
/”[^"]*”
这里解释一下
” 双引号先引起来 (double quote)
[^"] 任何不是双引号的东西(any character that is not a double quote)
* 所有的其他 (as many as possible)
” 结束最前面的引号 (double quote close)
上面那个会搜到“foo” “3!x”这样的包括引号 (match “foo” -> and “3!x” include double quote)
更多例子,例如搜索车牌规则,假设车牌是 “1MGU103” 也就是说,第一个是数字,3个大写字幕,3个数字的格式。那么我们可以直接搜索所有符合这个规则的字符
(A sample license plate number is “1MGU103″. It has one digit, three upper case
letters and three digits. Directly putting this into a search pattern)
这个应该很好懂,我们搜索
\数字\大写字母\大写字母\大写字母\数字\数字\数字
/\d\u\u\u\d\d\d
另外一个方法,是直接定义几位数字(不然要是30位,难道打30个\u去?)
(specify there are three digits and letters with a count)
/\d\u\{3}\d\{3}
也可以用范围来搜索 (Using [] ranges)
/[0-9][A-Z]\{3}[0-9]\{3}
用到范围搜索,列出一些范围(range)
这个没什么好说了,看一下就都明白了,要全部记住。。。用的多了就记住了,用的少了就忘记了。每次看帮助,呵呵
/[a-z]
/[0123456789abcdef] = /[0-9a-f]
\e
\t
\r
\b
简写 (item matches equivalent)
\d digit [0-9]
\D non-digit [^0-9]
\x hex digit [0-9a-fA-F]
\X non-hex digit [^0-9a-fA-F]
\s white space [ ] ( and )
\S non-white characters [^ ] (not and )
\l lowercase alpha [a-z]
\L non-lowercase alpha [^a-z]
\u uppercase alpha [A-Z]
\U non-uppercase alpha [^A-Z]
:help /[] –> 特殊的定义的,可以在vim中用用help来看 (everything about special)
:help /\s –> 普通的也可以直接看一下 (everything about normal)
替换 (string substitute) – RX
替换其实跟搜索是一样的。只不过替换是2个值,一个是你搜索的东西,一个是搜索到之后要替换的 string substitute (use rx)
%s/abc/def/ -> 替换abc到def (substitute abc to def)
%s/abc/def/c -> 替换abc到def,会每次都问你确定(substitute on all text with confirmation (y,n,a,q,l))
1,5s/abc/def/g -> 只替换第一行到第15行之间的abc到def (substitute abc to def only between line 1 to 5)
54s/abc/def/ -> 只替换第54行的abc到def (only substitute abc to def on line 54)
结合上面的搜索正表达式,这个替换功能。。。就十分只强大。linux中很多地方都是用正表达来做事请的,所以学会了受益无穷。
全局 (global)
这个不知道怎么翻译,反正vim是叫做global,可以对搜索到的东西执行一些vim的命令。我也是2-3个星期前因为读log中一些特殊的东 西,才学会用的。 (find the match pater and execute a command)
global具体自行方法是 g/pattern/command
:g/abc/p -> 查找并显示出只有abc的行 (only print line with “abc” )
:g/abc/d -> 删除所有有abc的行 (delete all line with “abc”)
:v/abc/d -> 这个会把凡是不是行里没有abc的都删掉 (delete all line without “abc”)
信息过滤 (filter)
vim又一强大功能
! -> 用!就是告诉vim,执行过滤流程 (tell vim to performing a filter operation)
!5G -> 从光标下向下5行执行过滤程序 (tell vim to start filter under cursor and go down 5 lines)
正式指令开始,这里用sort来做例子:
!5Gsort -> 从光标下开始执行sort,一共执行5行,就是说我只要sort5行而已 (this will sort the text from cursor line down to 5 lines)
!Gsort -k3 -> 可以直接代sort的参数,我要sort文字中的第三段 (sort to the end of file by column 3)
!! -> 值过滤当前的这行 (filter the current line)
如果觉得!这样的方法5G这样的方法用起来别扭(我是这么觉得),可以用标准的命令模式来做
!其实就是个:.,而已 (to type the command)
:.,start,end!sort 这里定义:.,起始行,结束行!运行指令
:.,$!sort -> 从当前这行一直执行至文件结束 (sort from current line to end)
:.0,$!sort -> 从文件的开始第一个行一直执行到文件结束 (sort from start of file to end)
:.10,15!sort -> 只在文件的第10行到第15行之间执行 (sort between line 10 to 15)
跳跃指令 (jumps)
跳跃指令类似于游览器中的<前进><后退>按钮
CTRL-] -> 跟着link/tag转入 (follow link/tag)
CTRL-o -> 回到上一次的jump (go back)
CTRL-i -> 跳回下一个 (go forward)
:ju -> 显示所有的可以跳跃的地方 (print jump list)
重做/回复
u -> undo
CTRL-r -> redo
vim的undo是树结构的,你可以回到这个结构中的任何地方
:undo 2 -> undo 到结构的2层 (undo to tree 2)
:undolist -> 显示所有的undo列表 (show undo list)
:earlier 10s -> undo到10秒前的编辑 (undo to 10 seconds ago)
:earlier 10h -> undo到10小时前的编辑 (back to 10 hours ago)
:earlier 1m -> undo到1分钟前 (back to 1 minutes ago)
下面是undo的tree结构的解释
………..one
…………. |
……..change 1
…………. |
………one too
………. /……..\
…..change 2 ……. change 3
………… | ………………… |
…….one two ………. me too
……….. |
….. change 4
………..|
…… not two
代码折叠
1. 折叠方式
可用选项 'foldmethod' 来设定折叠方式:set fdm=*****。
有 6 种方法来选定折叠:
manual 手工定义折叠
indent 更多的缩进表示更高级别的折叠
expr 用表达式来定义折叠
syntax 用语法高亮来定义折叠
diff 对没有更改的文本进行折叠
marker 对文中的标志折叠
注意,每一种折叠方式不兼容,如不能即用expr又用marker方式,我主要轮流使用indent和marker方式进行折叠。
使用时,用:set fdm=marker 命令来设置成marker折叠方式(fdm是foldmethod的缩写)。
要使每次打开vim时折叠都生效,则在.vimrc文件中添加设置,如添加:set fdm=syntax,就像添加其它的初始化设置一样。
2. 折叠命令
选取了折叠方式后,我们就可以对某些代码实施我们需要的折叠了,由于我使用indent和marker稍微多一些,故以它们的使用为例:
如果使用了indent方式,vim会自动的对大括号的中间部分进行折叠,我们可以直接使用这些现成的折叠成果。
在可折叠处(大括号中间):
zc 折叠
zC 对所在范围内所有嵌套的折叠点进行折叠
zo 展开折叠
zO 对所在范围内所有嵌套的折叠点展开
[z 到当前打开的折叠的开始处。
]z 到当前打开的折叠的末尾处。
zj 向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
zk 向上移动到前一折叠的结束处。关闭的折叠也被计入。
当使用marker方式时,需要用标计来标识代码的折叠,系统默认是{{{和}}},最好不要改动之:)
我们可以使用下面的命令来创建和删除折叠:
zf 创建折叠,比如在marker方式下:
zf56G,创建从当前行起到56行的代码折叠;
10zf或10zf+或zf10↓,创建从当前行起到后10行的代码折叠。
10zf-或zf10↑,创建从当前行起到之前10行的代码折叠。
在括号处zf%,创建从当前行起到对应的匹配的括号上去((),{},[],<>等)。
zd 删除 (delete) 在光标下的折叠。仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
zD 循环删除 (Delete) 光标下的折叠,即嵌套删除折叠。
仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
zE 除去 (Eliminate) 窗口里“所有”的折叠。
仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
关于vim的代码折叠,小弟也是初学,仅做参考。
* zo 将当前折叠打开
* zc 折叠光标所在处
* zr 打开所有折叠层次(依层次打开)
* zm 折叠所有层次(依层次折叠)
* zR 打开所有折叠 zn
* zM 折叠所有 zN
* zi 切换折叠与不折叠指令
缓冲区
* vim file1 file2 多个文件调入缓冲
* :e filename 在vim中再打开文件
* :ls 列出所有的缓冲区
* :n 编辑下一个文件
* :bp 跳转到上一个缓冲区
* :bn 跳转到下一个缓冲区
* :bN 跳转到指定编号的缓冲区:b3
* :bd1 删除编号为1的缓冲区
标签
* :tabnew 打开新标签页.
* :tabe <file> 在新标签页打开文件.
* <ctrl> + PageUp, PageDown 切换标签页.
* :tabnext, tabprev 切换标签页,Putty 下只能用这个.
文件打开保存
* :e <file> 打开文件.
* :enew 新文件.
* :w 保存.
* :wa 全部保存.
* :w <file> 另存为.
* :wq 保存并退出.