vim实用命令
什么是vim
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具
vim键盘图:
vi/vim 的使用
基本上 vi/vim
共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:
1. 命令模式:
用户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。
常用命令
u
撤销上一步操作,类似【Ctrl + z】v
进入可视模式(常用)- 进入可视模式选择文本后,可用
y
复制到0号粘贴板,可用"+y
复制到系统粘贴板(未验证)
- 进入可视模式选择文本后,可用
Ctrl + r
重做上个撤销的动作,类似【Ctrl + y】.
小数点,重复前一个动作:
切换到底线命令模式,以在最底一行输入命令- 切换到输入模式
i
光标前
插入字符a
光标后
插入字符o
光标下一行
插入字符
- 移动光标
j
、↓
光标下移
一行k
、↑
光标上移
一行h
、←
光标左移
一格l
、→
光标右移
一格
- 搜索
/word1
+ENTER
向下
搜索word1,配合n
/N
继续向下
/上
搜索?word1
+ENTER
向上
搜索word1,配合n
/N
继续向上
/下
搜索
x
字符删除/剪切x
删除/剪切当前光标所在处的字符3x
删除/剪切当前光标所在处往后3
个字符
dd
行删除/剪切dd
删除/剪切当前行3dd
删除/剪切当前行开始的3
行
yy
行复制yy
复制当前行3yy
复制当前行开始的3
行
p
光标下一行
粘贴数据- 如果要粘贴系统粘贴板的数据,则使用
"+p
(未验证)
- 如果要粘贴系统粘贴板的数据,则使用
2. 输入模式
在命令模式下按下i就进入了输入模式。
常用命令
HOME/END
,移动光标到行首/行尾ESC
,退出输入模式,切换到命令模式
3. 底线命令模式
在命令模式下按下:
(英文冒号)就进入了底线命令模式。
底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
常用命令
ESC
,退出输入模式,切换到命令模式:w
,将编辑的数据写入硬盘档案中,若为:w!
则为强制储存(常用):wq
, 储存后离开,若为:wq!
则为强制储存后离开 (常用):w [filename]
将编辑的数据储存成另一个档案(类似另存新档):n1,n2 w [filename]
将n1
到n2
行的内容储存成filename
这个档案
:q
,离开 vi (常用):q!
,若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
:r [filename]
读取filename
的内容到光标所在行的下一行:e [filename]
编辑filename
这个文档:set nu
或:set number
设置行号- 搜索替换
:%s/word1/word2/g
全局搜索word1替换为word2:%s/word1/word2/gc
全局搜索word1,用户确认是否替换为word2,y
替换,n
跳过
- 复制
copy
5,7 copy 16
或5,7 co 16
将第5-7
行复制到16
行后
- 移动
move
5,7 move 16
或5,7 mo 16
将第5-7
行复制到16
行后
4. 扩展使用
vim 中批量添加注释
方法一:块选择模式
注释:
Ctrl + v
进入块选择模式,然后移动光标选中你要注释的行,再按大写的 I
进入行首插入模式输入注释符号如//
或 #
,输入完毕之后,按两下 ESC
,Vim 会自动将你选中的所有行首都加上注释,保存退出完成注释。
取消注释
Ctrl + v
进入块选择模式,选中你要删除的行首的注释符号,注意 //
要选中两个,选好之后按 d
即可删除注释,ESC
保存退出。
方法二:替换命令
注释:
:起始行号,结束行号s /^/注释符/g
,无需确认:起始行号,结束行号s /^/注释符/gc
,需要确认
取消注释
:起始行号,结束行号s /^[注释符]\s//g
,无需确认
例:3,11s /^#\s//g
global命令
global命令是Vim最强大的命令之一,将其摸透用熟可以事半功倍
global命令形式
:[range]global/{pattern}/{command}
global
命令在[range]
指定的文本范围内(缺省为整个文件)查找{pattern}
,然后对匹
配到的行执行命令{command}
,如果希望对没匹配上的行执行命令,则使用global!
或vg lobal
命令。
global
命令实际上是分成两步执行:
- 首先扫描
[range]
指定范围内的所有行,给匹配{pattern}
的行打上标记(标记的概念很重要); - 然后依次对打有标记的行执行
{command}
命令; - 如果被标记的行在对之前匹配行的命令操作中被
删除
、移动
或合并
,则其标记自动消失
,而不对该行执行{command}
命令。
global命令使用
- 倒序文件行
:g/^/m 0
这条命令用行首标记/^
匹配文件的所有行(这是查找的一个常用技巧),然后用move命令依次将每行移到第一行(第0行的下一
行),从而实现了倒序功能。
- 删除偶数行
:g/^/+1 d
这条命令也是匹配所有行,然后隔行删除(其中+1用以定位于当前行的下一行),为什
么是隔行呢?因为在对第一行执行+1 d命令时删除的是第二行,而第二行虽然也被标记
了,但已不存在了,因此不会执行删除第三行的命令。
- 删除奇数行
:g/^/d|m.
光是:g/^/d
显然不行,这会删除所有行,我们需要用move命令把偶数行的标记去掉。
- 删除空行
:g/^\s*$/d
^\s*$
,匹配空行,其中^
表示行首,\s
表示空字符,包括空格和制表符,*
重复0到n个前面的字符,$
表示行尾。连起来就是匹配只有空字符的行,也就是空行。
References: