返回

Vim Common Commands

Vim常用命令总结。


简介

Vim是一个高度可配置的文本编辑器,主要用于编写和编辑文本和源代码。它最初由Bram Moolenaar在1991年发布,至今已经成为了许多程序员和系统管理员的首选工具。

Vim的特点包括:

  1. 高度可配置:Vim具有大量的命令和选项,可以根据用户的需求进行定制。

  2. 命令模式(COMMAND):Vim在默认情况下处于命令模式,用户需要通过键盘输入命令来进行文本编辑。

  3. 插入模式(INSERT):在插入模式下,用户可以输入文本内容。

  4. 普通模式(NORMAL):普通模式是Vim的默认模式,可以进行光标移动、删除字符等操作。

  5. 补充)可视模式(VISUAL):允许用户以可视方式选择和操作文本。Visual 模式有三种类型:

    1. 字符模式(Visual mode):用于选择字符。v命令进入。
    2. 行模式(Visual Line mode):用于选择整行。V命令进入。
    3. 块模式(Visual Block mode):用于选择文本块(矩形区域)。ctrl+v命令进入。
    4. 可以与p, y, d, c, r, <, >, ~, gU, gu等命令组合使用。
  6. 大量快捷键:Vim具有大量的快捷键,可以提高编辑效率。

  7. 宏记录:Vim支持宏记录,可以录制一系列键盘操作并重复执行。

  8. 插件支持:Vim支持大量的插件,可以扩展其功能。

在Linux和Unix系统中,Vim通常已经预装。Windows系统则需要手动安装。对于初次使用Vim的用户,建议先学习一些基础操作命令,并通过互联网上的资源来深入了解它的使用方法和高级功能。

提示:

  • 阅读本文需要有一定的vim了解,还要拥有vim环境,并且你应该一边阅读,一边实操

  • 如果你觉得本教程啰嗦,你可以运行vimtutor学习官方提供的tutor教程。有的vim版本是中文教程。如果你的不是可以网上搜索。备用(1.7中文版)(下载之后用vim打开阅读)。

  • 当然强烈建议你学习完本教程之后去过一边vimtutor,它可以让你边学边练。

史上最好用的文本编辑器VIM

对于vi/vim只是点评一点:这是一个你不需要使用鼠标,不需使用小键盘,只需要使用大键盘就可以完成很多复杂功能文本编辑的编辑器。不然主流IDE也不会有vim插件,如:jetbrains全系列都支持的ideavim插件

  • 学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用。

  • vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的。

  • 下面的文章翻译自《Learn Vim Progressively》,我觉得这是给新手最好的VIM的升级教程了,没有列举所有的命令,只是列举了那些最有用的命令。非常不错。

  • 警告:

    • 学习vim在开始时是痛苦的。
    • 需要时间
    • 需要不断地练习,就像你学习一个乐器一样。
    • 不要期望你能在3天内把vim练得比别的编辑器更有效率。
    • 事实上,你需要2周时间的苦练,而不是3天。
  • 将常用命令总结为四个步骤:

    1. 存活
    2. 感觉良好
    3. 觉得更好,更强,更快
    4. 使用VIM的超能力

    当你走完这篇文章,你会成为一个vim的 superstar。


——————————正文开始——————————

vim常用命令总结

第一级 – 存活

在Normal模式下【用vim正常打开的文件都会进入该普通模式】的常用命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
i #进入Insert 模式,按 ESC 回到 Normal 模式,光标处插入
	# I: 行首插入

a #进入Insert 模式,按 ESC 回到 Normal 模式,光标后插入
	# A:行尾插入

x #删除光标后的一个字符,并将删除的存到剪切板里
	# X:删除光标前的一个字符,并将删除的存到剪切板里

dd #删除光标所在行,并将删除的存到剪切板里
	# D:删除光标后面的所有字符,并将删除的存到剪切板里

p #粘贴剪切板,在光标后粘贴,P:光标处粘贴。

:q! # 强制退出vim。

esc # 退出命令、回到normal模式。输入的命令没效果,就点它,直到起作用为止。与ctrl+c等效。

#推荐
hjkl #强例推荐使用其移动光标,但不必需,你也可以使用光标键 (←↓↑→). 注: j 就像下箭头。

注意:

  • 块光标,所在的位置由头部决定。头部就是光标所在位置。

  • 光标后是指隔一个字符,就是块光标的尾部。

  • 删除命令都会将删除的存到剪切板里,但只有vim命令删除的,粘贴p命令才能粘贴(与vim版本有关)。

    • 如果要粘贴系统的剪切板内容用shift+insert:将在光标处粘贴系统剪切板内容。
      • 其他可能终端需要进入INSERT模式。
      • 注意不同的终端启动不同的vim版本,p粘贴命令效果可能不一样。删除命令有的会进剪切板,有的不会,但是p能粘贴。
    • 我的环境:ideavim插件。
    • 补充:(后面学习之后知道:粘贴效果是与默认寄存器有关系)
  • 粘贴命令在粘贴一行内容时(ideavim):

    • 如果光标所在位置是空行,将粘贴到该行。p与P效果一样
    • 如果光标所以位置不为空行,p将粘贴到下一行,P将粘贴到上一行。
    • 也就是以行为单位:p:在光标后粘贴,P:光标处粘贴。
  • Windows版本vim粘贴命令行,无论是不是空行,p会粘贴到下一行,P会粘贴到上一行。

你能在vim幸存下来只需要上述的那几个命令,你就可以编辑文本了,你一定要把这些命令练成一种下意识的状态。于是你就可以开始进阶到第二级了。

在命令模式【输入:进入该模式,输入的命令都需要敲回车】下的常用命令(扩展):

1
2
3
4
5
6
# 使用vim提供的在线帮助系统
:help <command> # 显示相关命令的帮助。你也可以就输入 :help 而不跟命令。或者键盘上的HELP。或者F1。
# 如果打开的是vim内置的帮助文档,可以用ctrl+w w在文档和vim编辑窗口之间跳转。不起作用多点几下。其实是分屏切换快捷键。后续介绍。
# 选中帮助文档:q退出。选择编辑窗口:q!将会关闭所有窗口

:q # 只退出命令,可以退出未修改的文件、退出帮助等退出作用。

第二级 – 感觉良好

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
#1.各种插入模式
	o #在光标所在行后插入一个空行,从Normal模式进入Insert模式。

	O #在光标所在行前插入一个空行,从Normal模式进入Insert模式。

	cw #向后剪切光标所在字符的同类型字符。可以是一个字符串,或者一串标点符号,并从Normal模式进入Insert模式。
	s # 该命令与x命令功能一样,区别:会进入insert模式
	

#2.简单的移动光标
	0 #数字0到所在行头
	
	$ #到所在行尾
	
	^ #到所在行首不是空白的地方
	
	g_ #到所在行尾不是空白的地方
	
	
# 匹配搜索跳转	
	/pattern #回车搜索 pattern 的字符串,如果搜索出多个匹配,可按n键到下一个,N上一个。匹配之后一直存在。
	?pattern # 逆向搜索跳转到指定字符,ctrl+o相对于大写的N
	:set hls # 开启高亮显示:have light search。默认关闭
	:set hlsearch # 开启高亮显示
	:set nohls # 关闭高亮显示
	:nohlsearch # 临时关闭高亮显示
	:nohls #临时关闭高亮显示,在次搜索或者n会出现高亮显示
	:set incsearch # 动态显示搜索结果,通常配合高亮使用。默认关闭
	:set is # 动态显示搜索结果,通常配合高亮使用。
	:set noincsearch # 关闭动态显示搜索结果,通常配合高亮使用。
	:set nois # 关闭动态显示搜索结果,通常配合高亮使用。
	:set hls is
    :set nohls nois
    # 可以将set命令保存到vim的配置文件中让其永久生效。
	
	# 匹配的时候:默认没有有忽略大小写。
	:set ic # ignore case
	:set noic # no ignore case 不忽略大小写
	/搜索的字符\c # 临时忽略大小写
	
	
#3.拷贝/粘贴
	p #光标后粘贴
	
	P #光标出粘贴
	
	yy #复制光标所在行
	Y # 与yy等效。
	

#4.撤销/恢复
	u #撤销 相对于ctrl+z
	ctrl+r # 恢复撤销,相对于ctrl+shift+z
	
	
#5.打开/保存/退出/另存为/清空
	:e <path/to/file> #打开指定文件,不存在会创建,e是edit的缩写。ideavim版本不存在打不开。
	:e! # 放弃所有的更改,重新加载当前文件。
	
	:bn #你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件
    	
    	:bp #上一个文件
    		#冒号后可以加数字,:2bn表示下2个文件
    		
    		
	
	:w #保存,w死write的缩写
		#指定文件名就是另存为,后面加!: 强制保存
	
		:sav <path/to/file>
		#二者区别:后者将修改保存到指定文件,并打开指定文件,可以继续编辑
		# 旧文件的修改会被抛弃掉,sav是saveas的缩写。
	
	:wq #保存退出,随便那个都行。
	:wq! # 强制保存并退出
	:wa # 保存所有打开的文件
	:wqa # 保存所有打开的文件并退出
	# 后面加!都是强制
	
		:x #保存退出
		ZZ #保存退出,效果一样
		zz # 如果可能,将该行水平居中。等于与M。m是标记。
			
	
    :q #退出
    
    :q! #强制退出
    
    	:qa! #强行退出所有的正在编辑的文件,就算别的文件有更改。
    	
    	
  	

	:%d #删除文件所有内容

很好,花点时间熟悉一下上面的命令,一旦你掌握他们了,你就几乎可以干其它编辑器都能干的事了。但是到现在为止,你还是觉得使用vim还是有点笨拙,不过没关系,你可以进阶到第三级了。

注意:

  1. c命令是一个组合命令,与d命令类似,都是删除命令,区别是c命令使用之后会进入insert模式

    • CD命令一样,从光标位置删除到行尾部,区别D不会进入insert模式。
    • cc清空光标所在行并进入insert,与dd区别:不会删除该行,只是清空到剪切板。
    • w光标移动到不同类字符的头部(对空格字符会忽略,就是移动到下一个单词的开头),
      • 有大写命令,移动字符范围更广。就是对同类型字符判断更广。
      • cw从光标处删除到不同类字符的头部(不会忽略空格字符)。dw会忽略空格。
        • 推荐使用de
      • ciw删除光标所在的同类字符,并进入insert模式。diw不会进入insert模式。
        • caw删除光标所在的同类字符,并删除后面的所以空格。
        • 这种类型,都是删除一个单词,但是不能与e组合。如cae。三个的不能与e组合,用w。
    • e移动到不同类字符的尾部(忽略空格字符),如果自身不在同类字符的尾部会先移动到尾部,在往下跳转。
      • 注意:尾部是指光标在同类字符的最后一个单词前面。
      • ce删除单词并进入insert模式。
    • c0从光标位置删除到行头部。
    • c$从光标位置删除到行尾部。
      • 当然也可以组合c^, cg_
    • ct字符删除光标到第一个指定字符之间的字符(删除到指定的字符),并进入insert模式。
    • %会在最近括号之间来回跳转。
      • d%光标在括号上,会删除括号及括号内的内容。
    • 意味着d命令也可以和上面组合,区别就是不会进入insert模式。
      • 前面加数字表示重复几次。
        • 2w光标移动两次不同类字符。注意w命令没有其他命令组合时会忽略空格。加数字也会忽略。
        • 2dd类型删除两行。2cc删除之后进入insert模式。
  2. y命令也是一个组合命令,用于与复制相关的命令。需要配合其他命令使用,如::

    • yy复制光标所在行。
      • 3yy表示连续复制三行。
    • yw复制到不同类字符的前面,不会忽略空格。空格属于字符(就是复制一个单词)。
      • yiw复制所在的字符,就是复制完整单词。
      • yaw复制完整单词包括单词后面的空格,不包括前面的,不能与e组合。
    • y0: 从光标位置复制到行头,y^不包括空格。
    • y$: 从光标位置复制到行尾,yg_不包括空格。
    • v进入可视模式之后移动光标,选择文本之后,y命令可以复制选中的文本,自动返回normal。c会进入insert模式。
      • 意味着前面的组合命令都可以与visual模式配合使用。
    • yt字符从光标位置复制到指定字符之间的字符。
    • y%如果光标在括号上,将复制括号及括号内的内容。
  3. u命令相对于ctrl+z撤销命令:

    • u命令会将光标移动到最近修改的地方,如果光标所在位置正是最近修改的地方,将执行撤销操作。(与vim版本有关,有的直接撤销)

    • U撤销对当前行的所有更改,以行为单位,撤销到insert之前的状态。部分vim版本不能使用。

    • ctrl+u

      • normal模式下:光标向上移动半页。
      • insert模式下:与Emacs模式一样。
      • command模式下:与Emacs模式一样,但是不会删除:

第三级 – 更好,更强,更快

先恭喜你!你干的很不错。我们可以开始一些更为有趣的事了。

这里你将会学到以下常用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
#1.重复命令【更好】
	. #重复上一次命令
	
	N<command> #数字N重复后面的命令N词
		
	#演示:
		2dd #删除两行
		3p #粘贴剪切板3次
		10iide [Esc] #光标所在字符前插入10个ide字符串,可以换成a就是后面,效果更好
		. #重复上一次插入10ide命令
		3. #插入3个ide,这里不是30个ide,要注意。
		

#2.光标移动【更强】:你要让你的光标移动更有效率,你一定要了解下面的这些命令,千万别跳过。
	:N #光标到数字N行
		NG #同理光标到数字N行,等同于Ngg
		ctrl+g # 显示文件的信息,包括行号,百分比,部分vim版本起作用。
    gg #光标到第一行
    G #光标到最后一行
    w #光标移动到下一个不同类型的字符的开头,就是移动到不同类型的字符前,忽略空格字符。就是跳转到下一个单词前。
    e #光标移动到 当前 或者 下一个 不同类型的最后一个字符上。效果:移动到当前同类型字符的末尾 或者 移动到下一个不同类型字符的末尾。【跳过单词】忽略空格字符。就是跳转到本单词或下一个单词末尾。
    # 他们的大写命令,移动范围更广,就是对同类型字符判断更广。
    
    #最强的光标移动
    
    % #匹配括号移动,自己体会,超级好用。支持(, {, [。
    
    * # 匹配光标当前所在的单词,移动到下一个单词
    \# # 匹配光标当前所在的单词,移动到上一个单词,实际\没有,这里是转义作用。
    	#二者匹配之后都可以重复使用,起到切换的作用,n下一个同理
    
    
#更快
<start position><command><end position> #光标的移动与命令的联动,组合命令通常与光标移动命令组合使用,官方解释是操作加动作。
	#演示
		0y$ #拷贝当前行,一般用yy,0行首,y拷贝,$行尾
		ye #拷贝当前同类型字符的末尾,y拷贝,e跳到同类型字符末尾,与yw效果一样
			# 注意这两个要考虑光标的位置,光标必须在单词的头部。
			# 用yiw,无论光标在哪里,只要在单词上,就能复制整个单词。
			# yaw复制完整单词包括单词后面的空格,不包括前面的,不能与e组合。
		dw #删除当前同类型字符
		d$ #从当前删除到行尾
		d0 #从当前删除到行首
		dgg #从当前删除到文件开头
		dG #从当前删除到文件末尾
		:%d # 清空整个文件内容。
		:e! # 忽略所有修改,重新加载当前文件。
		
		
	#更多可组合命令d (删除 )、v (可视化的选择)、gU (变大写)、gu (变小写)、y(复制)、c(删除进入insert)等等
	# 示例:
	y2/apple # 复制两个apple之间的内容,不包括最后一个apple。
	gUiw # 将光标所在单词转大写。
	diw # 删除当前光标所在单词
	#d上面演示了
	#可视化选择是一个很有意思的命令,你可以先按v,然后移动光标,你就会看到文本被选择,然后,你可能d,也可y,也可以变大写等
    #注意变大小写要有对象才能变,不然出错。
  
	

补充(这部分可以最后在看,或看vimtutor在来):

  1. r字符:替换光标后的字符为指定字符。

    1. R连续替换光标后的字符。esc退出。
    2. :r 输入流可以提取文件(指定路径),或者输入流的内容到光标位置后面,如::r !ls:将在光标后插入ls命令的输出。
      1. 用于提取文件内容到光标后
  2. 输入 :s/old/new/g 可以替换光标所在行的old字符串为new字符串。g表示替换区全部,没有只替换第一个

    要替换两行之间出现的每个匹配串,请 输入 :#,#s/old/new/g 其中 #,# 代表的是替换操作的若干行中首尾两行的行号。 输入 :%s/old/new/g 则是替换整个文件中的每个匹配串。 输入 :%s/old/new/gc 会找到整个文件中的每个匹配串,并且对每个匹配串提示是否进行替换。

  3. :!外部命令执行外部命令,如:!ls,支持所有的外部命令。

  4. vim支持保存一个文件的部分内容:

    1. 进入可视模式之后,选中要保存的部分,然后按 : 字符。将看到屏幕底部会出现 :’<,’> 。在后面输入另存为文件命令即可w 文件名
  5. 在命令模式下,可以使用tab键补全命令,ctrl+d显示能补全的命令。

    1. ctrl+u清空光标前的字符,除了:
  6. f字符光标向前移动到指定字符前。F字符反向。

    1. t字符光标向前移动到指定字符的前一个字符前。T字符反向。
    2. 在使用这个两个命令之后;光标跳转到下一个相同字符,,上一个。
  7. gf将光标所在行文本内容作为文件打开,会自动光标当前文件(前提已经保存)。

  8. H光标移动到光标去过的屏幕最高行,L屏幕的最低行。(与版本有关)

    1. J删除末尾的换行符,ctrl-j换行、回车的意思,(重要)寄存器中用^J表示。
    2. K查看光标所在单词的man页面。(ideavim不支持)
  9. bw命令反向。B范围更广。

    1. gee命令反向。
  10. ctrl+unormal模式下光标向上移动半页

  11. ctrl+b光标向上移动差不多一页

  12. ctrl+f向下移动一页

  13. ctrl+d向下移动半页

  14. M光标移动到屏幕中间。

  15. (向上移动到句子的开头

    1. )向下移动到句子的开头
  16. {向上移动到段落的开头。

    1. }向下移动到段落的开头。
  17. da(删除括号及括号内的内容。括号可以换成", ', (, ), {, }, [, ].中的一个,删除对应的括号。

    1. di(删除不包括括号。括号可以换成", ', (, ), {, }, [, ].中的一个,删除对应的括号内容。

    2. i不包括括号,a包括括号。

  18. >>向后缩进光标所在行。

    1. <<反向缩进
    2. .命令重复上一次命令。(部分命令不可重复:如2j)
  19. gU移动光标命令选中的字符转大写。

    1. gu移动光标命令选中的字符转小写
    2. ~将光标后的字符大小写互转,可以选中多个互转。
  20. 在insert模式下ctrl-o会临时进入Normal模式,执行别的命令之后会,自动返回insert模式。

    1. 可用于删除光标后的单词继续编辑:如:ctrl-o de
    2. vi模式中不可以使用。
  21. 在insert模式下:

    1. ctrl-w向光标前删除到同类字符。忽略空格,就是删除一个单词。

      1. ctrl-u全部删除。
    2. ctrl-h等同于退格键。

    3. vim在insert模式下没有提供向后删除字符的命令

第四级 – Vim 超能力

你只需要掌握前面的命令,你就可以很舒服的使用VIM了。但是,现在,我们向你介绍的是VIM杀手级的功能。下面这些功能是我只用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
0
^
$
g_

f= # F
, or ;
t, # T
, or ;
3f,

dt,
ct,
df;
cf;

ye
yy
yt;
yf;

dw
dd
dt;
df;

cc
ce
cf;
ct;

p
P
diw
daw
ciw
caw
yiw
yaw
# 如果你搞不明白上面的复杂组合命令,可以看v模式选择的是那个部分。
viw
vaw

补充

  1. <motion>i<option><motion>a<object>根据动作(motion)、范围(i、a)操作对象(object)。

    • motion动作:常用:d, c, v, y,

      • i与a的区别:

        • 对于空格i会忽略,a会保留后面的使用空格。
        • 其他字符:i不包括,a包括。
      • object:操作对象,常用:

        • w:一个单词。
        • s:一个句子(不包括缩进、前后空白)。
        • p:一个段落(包括缩进,前后空白)。
        • 其他字符:", ', (, ), {, }, [, ].
    • 注意:是向后搜索包裹光标的对象。没有,只有"对象会向内查找。

    1. 示例:假设你有一个字符串 (map (+) ("foo")).

      • 而光标键在第一个 o 的位置:

        • vi" → 会选择 foo.

          • va" → 会选择 "foo".
        • vi) → 会选择 "foo".

          • va( → 会选择("foo").
        • v2i) → 会选择 map (+) ("foo").

          • v2a) → 会选择 (map (+) ("foo")).
      • 光标在a位置:

        • vi" → 会选择 foo.

        • va" → 会选择 "foo".

        • vi) → 会选择 map (+) ("foo").

        • va( → 会选择 (map (+) ("foo")).

        • v2i)v2a)两个无法选中,不会向内查找。

          • 只有"会。并不考虑数量。v2i"→ 会选择 foo, 与vi"等效。
    2. 可视(VISUAL)模式操作:

      • ctrl+v进入可视模式的块模式(Windows占用,用ctrl+q代替)。v字符模式,V行模式。
      • 以上模式可以配合其他移动动作使用,如0, ctrl+f , $方便选择。如:
        • 选择多行,J命令批量移除选择行的换行符
        • 向后缩进>选中的文本,<向前。
          • 选中之后=自动给缩进。
      • 块模式还可以批量修改多行。典型的操作,如:
        • 添加注释0 ctrl+v ctrl+d 选中要注释的 I # ESC
          • 注释只能用行首插入。
        • 末尾添加分号:$ ctrl+v ctrl+d 选择要修改的 A ; esc
      • 注意:只有块模式可以批量修改。并且只有在块头或者块尾可以修改。
    3. 自动补全

      • 在insert模式下,输入一个词的开头,然后按ctrl+norctrl+p自动补全就出现了。
      • 如果有多个,n是下一个,p是上一个。
      • 在ideavim中是代码提示。
      • 选中之后,继续输入,不用回车确定。ideavim代码中需要回车确定。
      • 具体看情况。

标记

在 Vim 中,m 命令用于设置标记(mark)。标记是 Vim 提供的一种功能,用于在文件中记住特定的位置,以便以后快速跳转到这些位置。标记可以是局部标记(仅在当前文件中有效)或全局标记(在所有文件中有效)。以下是 m 命令的详细使用方法:

设置标记

  1. 设置局部标记
    • 操作:在普通模式下,按 m 然后按一个小写字母(例如 a)。
    • 例子:按 ma 在当前光标位置设置标记 a
  2. 设置全局标记
    • 操作:在普通模式下,按 m 然后按一个大写字母(例如 A)。
    • 例子:按 mA 在当前光标位置设置全局标记 A
    • 在ideavim中会有高亮。
    • 0-9字符也表示全局标记。
  3. m命令是:mark 标记字符的快捷键。
    1. 区别是m会记录光标的列位置,:mark不会,它的列号始终为0。
    2. 所以:mark跳转只会到标记行的头部。不会跳转到标记行光标的位置。
    3. 一般使用m
  4. 注意:
    1. 标记字符只有一个。
      1. 标记字符常用的字母、数字。其他的部分能用。不用考虑。
    2. 标记信息包括标记字符、光标的行号、列号以及行的文本内容。
    3. 后续设置存在的标记会覆盖。

跳转到标记

  • ' 标记字符:自动跳转到标记行的行头。

  • `` 标记字符`:自动跳转到标记行的光标位置。

  • 'a:跳转到局部标记a的行头。

  • ``A`跳转到全局标记A所在行光标的位置。

  • 跳转标记的开头如何有空格,都会忽略。

查看标记

  • :marks:显示所有已设置的标记及其光标位置、行文本内容。
  • 使用:mark标记的行,光标的列号为0。所以`` `也只能跳到标记行头。

删除标记

  1. 删除指定标记::delmarks ...标记字符

    1. 后面可以跟多个标记字符,用不用空格隔开都行。如: :delmarks ab 删除标记 ab
    2. 还可以删除范围内标记:如: :delmarks a-d 删除标记 ad
  2. 删除所有标记::delmarks!

    1. 注意该命令只能删除用户设置的所有本地标记,并且内置的特殊标记、全局标记不能删除。如', <, >。(我快崩溃了😭)

      1. 上面的三个内置特殊标记,不建议用来做标记。他们具有特殊的含义。

      2. 他们是动态生成的内置特殊标记,无法删除。

      3. 含义如下:

         1
         2
         3
         4
         5
         6
         7
         8
         9
        10
        11
        12
        13
        14
        15
        
        '< # 可表示上次visual模式选择的行头。还可表示标记的行头。
        '> # 可表示上次visual模式选择的末尾的行头。还可以表示标记的行头。
        `< # 可表示上次visual模式选择开始的位置。还可表示标记行鼠标的位置。
        `> # 可表示上次visual模式选择的末尾。还可表示标记行鼠标的位置。
        不用他们做标记。通常用在visual模式中,会动态自动生成。
        
        例子:
        :'<,'>y 复制上次选择的内容。
        :'<,'>d 删除上次选择的内容。
        
        '' # 跳到光标上次所在的行头。
        配合标记可以实现来回两个标记行头之间跳转
        `` # 跳转到光标上次所在的确切位置(行和列)。
        配合标记可以实现来回两个标记光标确切位置之间跳转
        意味着:` ' 做的标记会随时改变。不用他们做标记,会动态自动生成。
        

        类似命令:

        • Ctrl-o:跳转到上一个位置。
        • Ctrl-i:跳转到下一个位置。
    2. 全局标记需要指定标记字符才能删除。

  3. Vim 内置的特殊标记是 Vim 自动管理的,用于记录特定的编辑位置和选择范围。这些标记不能手动删除,因为它们是为特定功能设计的,并且在相应操作时会动态更新。用户可以删除自己设置的标记,但不能删除这些内置特殊标记。

寄存器

在 Vim 中,寄存器(register)是一个临时存储位置,用于存储和检索文本、命令、宏等。寄存器的使用可以大大提高编辑效率。以下是对寄存器的详细介绍和使用方法:

寄存器的分类

Vim 中有多种类型的寄存器,每种类型都有特定的用途:

  1. 无名寄存器")Unnamed Register:
    • 默认寄存器,所有的删除(d)、复制(y)、粘贴(p)操作都与此寄存器关联。缓存最后一次操作内容
  2. 具名寄存器azAZ)Named Register:
    • 用于存储用户指定的文本或宏。
    • 小写字母(az):覆盖存储
    • 大写字母(AZ):追加存储
  3. 剪贴板寄存器*+)selection and drop:
    • 用于与系统剪贴板交互。二者可以画等号,区别:
    • *:与选择剪贴板(primary selection)交互(在 X Window 系统中)。
    • +:与系统剪贴板(clipboard)交互。
  4. 数字寄存器09)numbered:
    • 自动存储最近的删除文本。
    • 0:最近的复制(yank)操作。
    • 19:最近的删除(delete)操作,1 是最新的,9 是最旧的。
  5. 读取(命令)寄存器:):
    • 存储最近的命令行输入。
  6. 搜索寄存器/)last search pattern:
    • 存储最近的搜索模式。
  7. 小删除寄存器-)small delete:
    • 用于存储小于一行的删除操作。
  8. 黑洞寄存器_)black hole:
    • 丢弃写入其中的任何内容,不对其进行存储。
  9. 表达式寄存器=)expression:
    • 允许你输入数学运算进行计算。
    • 只能在Insert和Command模式使用,且部分版本不支持。
    • 如:insert模式下:ctrl-r =2+2 enter结果为4。
  10. 只读寄存器read only:
    • 命令寄存器:
    • 点寄存器.:上次insert模式插入的文本内容。
    • 搜索寄存器/
    • 当前文件名寄存器%
    • 上一个文件名寄存器#
    • 这些寄存器都只能读。

使用寄存器

  1. 查看寄存器内容

    • :reg:registers:查看所有寄存器的内容。
      • 例子:输入 :reg 查看所有寄存器的内容。
    • :reg {register}:查看指定寄存器的内容。
      • 寄存器可以有多个,用不用空格隔开都行。:reg 01 2查看寄存器0, 1, 2的内容。
      • 例子:输入 :reg a 查看寄存器 a 的内容。
  2. 引用寄存器

    • 在Nomal模式下寄存器可以通过在名字前加双引号来引用。例如,我们可以通过 "a 来访问在 a 寄存器中的内容。
    • 在Command或Insert模式下寄存器可以通过ctrl-r 名字来引用。
      • 注意在这两个模式下引用的寄存器会立即输出其存储的内容
  3. 复制到寄存器:

    • "{register}y{motion}:复制文本到指定寄存器。
      • 例子:输入 "ayiw 将当前单词复制到寄存器 a 中。
  4. 粘贴寄存器内容

    • "{register}p"{register}P:粘贴寄存器内容。
      • p 在光标后粘贴,P 在光标前粘贴。
      • 例子:输入 "ap 将寄存器 a 的内容粘贴到光标后。
  5. 删除到寄存器

    • "{register}d{motion}:删除文本并存储到指定寄存器。
      • 例子:输入 "adiw 删除当前单词并将其存储到寄存器 a 中。
  6. 录制宏

注意事项:

  1. 无名寄存器:是默认的寄存器。d、c、s、x,y,p这些操作的文本,都在""无名寄存器中(存储最后一次操作内容)。除非修改默认寄存器。

    1. 意味着删除的可以使用p命令粘贴,因为默认从无名寄存器取值。
    2. 默认寄存器如果是无名寄存器,p粘贴命令不能粘贴剪切板内容。要引用剪切板寄存器*+才能粘贴。
    3. 自然在vim中复制、删除的也就不能进剪切板。需要指定剪切板寄存器。
  2. 数字寄存器:用于存储最近复制、删除的内容,删除的要以行为单位才会存储,否则删除的存储到-寄存器。复制的不影响。

    • 复制用0存储。复制的只有0和无名寄存器存储。后者很快失效。

    • 删除用1-9存储。数字越大,删除的时间越久。

      • 意味着指定寄存器,可以访问删除的内容:
      1
      
      "2p  # 粘贴第二条删除的内容。
      
    • 数字寄存器不可以被自定义的具名也就是字母寄存器替代。

    • 具名也就是字母寄存器存在的意义是固化需要频繁剪切的内容,不会因为操作频繁被覆盖。

  3. 我们一般操作具名寄存器:复制,粘贴,删除。

  4. 寄存器只可以覆盖,不可以删除,由vim自身管理生命周期。不是永久存在。

  5. 可跨文件使用。

寄存器的意义

首先,寄存器是可以跨文本文件使用的,只有有删除动作都会自动记录到1-9数字寄存器0存储复制动作,而这些寄存器是动态的,会变化的,如果操作动作很多,有一些操作是需要频繁使用的,那么,使用自定义具名寄存器会大大的提高我们的效率,因为字母寄存器是不会改变的,除非你删除了这个寄存器。

再次,我们如果有某些文件误修改了,或者有非法入侵,如果恶意闯入者没有删除所有寄存器的内容,我们有可能追踪到它的修改轨迹。

最后,多说一句,寄存器的生命周期是很长的,即使服务器重启什么的,只要能正常进入系统,寄存器里的内容都是一直存在的。

Vim 的寄存器功能强大而灵活,通过熟练掌握寄存器的使用,可以极大地提升编辑效率。寄存器不仅可以用于基本的复制和粘贴,还可以存储宏、命令等,更好地管理和重用编辑内容。

宏录制

在 Vim 中,宏是一组记录的按键序列,可以重复执行以自动化重复性的任务。以下是使用宏的详细步骤和相关命令:

宏录制其实就是记录宏到寄存器(都是在普通模式下开始、结束):

  1. q{register}:在Normal模式下,开始录制宏到指定寄存器。

    • 例子:按 qa 开始录制宏到寄存器 a 中。
  2. 开始录制之后可以任意执行vim命令。进行你希望录制的所有按键操作。Vim 会记录这些按键。

    • 例子:输入一系列编辑命令,如插入文本、删除文本、移动光标等。
  3. q:结束录制宏。

  4. @{register}:执行存储在寄存器中的宏。

    • 例子:按 @a 执行寄存器 a 中的宏。
    • (ideavim目前不支持执行宏)
  5. @@:重复执行上一次执行的宏。

  6. 多次执行宏:

    • 操作:在普通模式下,输入一个数字,然后按 @ 和寄存器字母键。
      • 10@@执行10上次执行的宏。
    • 例子:按 10@a 将宏 a 执行 10 次。

编辑和查看宏

  1. 查看宏内容
    • 操作:在普通模式下,输入 :reg 查看所有寄存器的内容,包括宏。
    • 例子:输入 :reg a 查看寄存器 a 的内容。
  2. 编辑宏内容
    • 操作:将宏内容复制到一个缓冲区进行编辑,然后将其粘贴回寄存器。
    • 例子:
      1. 输入 :let @a='your edited macro',将 'your edited macro' 替换为编辑后的宏内容。
      2. 或者,先用 :put a 将寄存器内容粘贴到缓冲区,编辑后用 :let @a=join(getline(1, "$"), "\n") 保存修改。

实例1

假设你想录制一个宏,用于在每行的末尾添加一个分号:

  1. 开始录制
    • qa 开始录制宏到寄存器 a
  2. 进行操作
    • $ 移动到行尾。
    • a; 在行尾插入分号。
    • Esc 退出插入模式。
    • j 移动到下一行。
  3. 结束录制
    • q 结束宏录制。
  4. 执行宏
    • @a 执行宏,在当前行末尾添加分号并移动到下一行。
  5. 多次执行宏
    • 10@a 执行宏 10 次,每次在行末尾添加分号并移动到下一行。

ctrl-a会对光标所在数字加1.

示例2:

在一个只有一行且这一行只有“1”的文本中,键入如下命令:

qaYp<C-a>q

解释:

  • qa 开始录制。
  • Yp 复制行并粘贴。
  • <C-a> 增加1。
  • q 停止录制。

@a → 在1下面写下 2

@@ → 在2 正面写下3

现在做 100@@ 会创建新的100行,并把数据增加到 103.

通过使用宏,你可以在 Vim 中有效地自动化重复性任务,提高编辑效率。录制、执行和编辑宏的灵活性使得它们成为强大的工具,适用于各种编辑场景。

分屏

在 Vim 中,分屏(split screen)功能非常强大,允许你在同一个 Vim 会话中同时查看和编辑多个文件或同一个文件的不同部分。以下是 Vim 分屏操作的详细介绍:

分类

  • 水平分屏:命令::sp [file]or:split [file]
    • 指定文件水平分屏,没有指定为当前文件。
    • 快捷键:ctrl+w s
  • 垂直分屏:命令::vsp [file]or :vsplit [file]
    • 指定文件重置分屏,没有指定默认为当前文件。
    • 快捷键:ctrl+w v

操作(最后一个快捷键可以分开按):

  • 分屏窗口跟普通窗口一模一样,可以执行vim的所有的命令。
    • 分屏的窗口还可以继续分屏。
  • 切换到其他窗口
    • ctrl+w w不同分屏窗口之间来回切换。
    • Ctrl-w h:切换到左边的窗口。
    • Ctrl-w j:切换到下面的窗口。
    • Ctrl-w k:切换到上面的窗口。
    • Ctrl-w l:切换到右边的窗口。
  • 调整窗口高度(部分vim版本不起作用):
    • Ctrl-w +:增加当前窗口高度。
    • Ctrl-w -:减少当前窗口高度。
    • Ctrl-w =:使所有窗口等高。
    • ctrl-w _:最大化当前水平窗口。
    • ctrl-w |:最大化当前垂直窗口。
  • 调整窗口宽度
    • Ctrl-w >:增加当前窗口宽度。
    • Ctrl-w <:减少当前窗口宽度。
  • 关闭当前窗口
    • :q:quit:关闭当前窗口。
    • 快捷键Ctrl-w cCtrl-w q
  • 关闭其他窗口
    • :only:关闭除了当前窗口之外的所有窗口。
    • 快捷键Ctrl-w o
  • 交换窗口位置
    • Ctrl-w r:旋转窗口布局。
  • 拆分到标签页
    • :tab split:在新标签页中水平分屏当前文件。
    • :tab vsplit:在新标签页中垂直分屏当前文件。
    • 我测试二者效果一样,就是将指定文件,默认当前文件拆分到标签页中。跟浏览器标签页类似。
  • vim打开多个文件,默认不会分屏,是以多窗口的方式打开,可以使用bn, bp切换。
    • -o[n]选项:指定打开的分屏窗口数量,默认n为1个,默认水平分屏。
      • 可以不用指定n,根据后面的文件数来确定分屏。
      • 如果n与文件数不等,n有几个就分几屏,多出的文件到分别一个完整的窗口中。
      • -O垂直分屏。后面有几个文件,就几个垂直分屏。(n与文件数相等的情况)。不等分屏数由n决定,多的文件分别单独一个窗口。

结束语

  • 上面是作者最常用的90%的命令。

  • 我建议你每天都学1到2个新的命令。

  • 在两到三周后,你会感到vim的强大的。

  • 有时候,学习VIM就像是在死背一些东西。

    • 官方建议:要在使用中学习,而不是在记忆中学习。
  • 幸运的是,vim有很多很不错的工具和优秀的文档。

  • 运行vimtutor直到你熟悉了那些基本命令。

  • 其实在线帮助文档中你应该要仔细阅读的是 :help usr_02.txt.

  • 你会学习到诸如 !, 目录,寄存器,插件等很多其它的功能。

学习vim就像学弹钢琴一样,一旦学会,受益无穷。

——————————正文结束——————————

扩展

更多内容参考vim-introduction

目录操作

Vim 自带的 netrw 插件提供了文件浏览器功能,可以用来浏览、操作目录和文件

  • 打开目录浏览

    1
    2
    3
    
    :Explore
    
    :Ex # 简写
    
    • 会关闭当前文件。
    • 用vim移动命令移动,回车打开文件或命令。
    • :q退出浏览。
  • 在垂直分屏窗口中打开目录浏览器

    1
    2
    3
    
    :Vexplore
    
    :Vex # 简写
    
    • 分屏命令都可以用。
  • 在水平分屏窗口中打开目录浏览器

    1
    2
    3
    
    :Sexplore
    
    :Sex # 简写
    
  • 浏览指定目录

    1
    2
    3
    
    :Explore /path/to/directory
    
    :Vex /path/to/directory
    

部分vim版本不带该目录浏览插件。


参考

  1. 原文地址Vim简明教程【CoolShell】
  2. vim的寄存器详解
  3. (译)Vim 寄存器:由浅入深
Licensed under CC BY-NC-SA 4.0
最后更新于 Jun 03, 2024 10:43 +0800