Vim 常用命令总结

先申明,如果你不是非常需要和服务器以及服务器上的日志打交道,其实vim只会简单的光标移动以及插入,删除,复制,粘贴,保存即可。学习Vim和学习乐器很像,需要很长时间的练习,如果你平时很少用到vim,我建议是不用学的太深入,懂一些简单的即可。如果需要经常和日志打交道,那么,好好学学Vim,这可以很大的提升你的工作效率,当然学习成本很大。

初级命令

Ubuntu系统都自带了vi,你可以把Vim看成是Vi的升级版,Vim兼容Vi的所有命令,虽然vi
也可以用,但是有个不太好的地方,当你想在Vi打开的文件中插入东西时,它并没有提示,也就是不太好分清Normal模式和Insert模式,这个很容易搞混,一般就是多按几下Esc来确保是在Normal模式。所以我还是建议安装一个Vim。

简单认识vim

当你安装好Vim之后,一定项输入点东西,很多新手也就在这里止步了,很多人都不知道如何在Vim中插入字符,所以Vim给很多人的第一印象是难用,甚至不如记事本好用,其实Vim不是这样的,安装好之后,请按照下面的命令操作:

  1. 启动Vim后,Vim在Normal模式下
  2. 按下i,进入Insert模式,这时Vim左下角会出现-- INSERT --,这个时候你可以像使用记事本那样,输入你想要输入的东西
  3. Esc,可以从Insert模式返回到Normal模式

现在你已经掌握了基本的在Normal和Insert模式的切换了,下面是一些比较常用的命令:

1
2
3
4
5
i    # Insert 模式,按Esc返回Normal模式
x # 删除当前光标所在的一个字符,你也可以试试delete键,效果是一样的
:wq # 保存并且退出
dd # 删除光标所在那一行
p # 粘贴剪贴板

注意: :w存盘,后面也可以跟文件名 空格隔开。:q退出

移动光标

Vim里移动光标有三种方式

  • 第一种:当然是用鼠标了,还可以用滚轮就不说了
  • 第二种:←↓↑→,最简单易记的移动光标方式
  • 第三种:hjkl,最常用的使用方式

但是,最常用的其实是第三种,想想你为什么要放弃那么多好用的编辑器甚至IDE,其实很重要的一个理由是,用Vim可以做到基本不用鼠标,毕竟程序员需要频繁的在键盘和鼠标之间切换,有时候如果键盘可以完成的事,都是懒得去用鼠标点的,所以日常操作也会记一些经常用到的系统快捷键,所以,这里道理一样,并且使用←↓↑→,手指并不是很方便,所以大家习惯了使用hjkl。确实有点不好记,不过熟了就习惯了,有个技巧就是:j看上去像一个向下的箭头。

建议:如果你不长用Vim,或者写代码的机会不是那么多,那么你只需要记住上面的几个命令就足够了,这几个命令可以让你能基本使用Vim来编辑文件,做简单的修改。再说个题外话,一般的编辑器,如果你需要拷贝一段文字的时候,一般是Ctrl-c配合Ctrl-v,Ctrl扮演的就是功能键的作用,即当功能键被按下,c便不再是c,变成了一个命令或者快捷键,在Vim的Normal模式下,所有的键都是功能键

中级命令

下面在介绍的时候,多半是一些快捷键,如果是Ctrl-key,统一写成<C-key>。并且以:开始的命令需要输入回车,例如退出命令::q<enter>
为了更高效的使用Vim,一些简单的命令还是不行的,拿还不如使用IDE和其他文本编辑器更加方便,以下所有的命令都是在Normal模式下输入的,如果不确定是不是在Normal下,多敲几下Esc键。

  • 各种插入模式
1
2
3
4
a	# 在光标后插入
o # 在光标所在行后免插入一个新行
O # 大写字母o,表示在光标所在行前插入一个新行
cw # 替换光标所在位置后一直到光标所在单词结尾的字符,就是删除掉
  • 各种移动光标
1
2
3
4
5
0		# 数字0,到行头
^ # 到本行第一个不是空白的位置,空白包括空格,tab,换行,回车等
$ # 到本行行尾
g_ # 到本行最后一个不是空白的位置
/pattern # 搜索pattern的字符串,多个匹配可以按n跳到下一个
  • 拷贝/粘贴
1
2
3
p		# 粘贴,在当前位置之后粘贴
P # 粘贴,在当前位置之前粘贴
yy # 拷贝当前行
  • 撤销/重做
1
2
u		# undo 撤销
<C-r> # redo 重做
  • 打开/保存/退出/改变文件
1
2
3
4
5
6
7
8
9
10
:e <path/to/file>		# 打开一个文件,空格隔开
:w # 存盘
:saveas <path/to/file> # 另存为<path/to/file> 空格隔开
:x # 保存并退出
ZZ # 保存并退出
:wq # 保存并退出
:q! # 退出,但不保存
:qa! # 强行退出所有正在编辑的文件
:bn # 切换到打开的下一个文件
:bp # 切换到挡开的上一个文件

注意: 其实只是切换文件可以用:n,表示到下一个文件。

高效命令

在处理文本的时候,有时候需要做很多重复的动作,下面来看看Vim如何重复自己

  • 重复命令
1
2
.		# 小数点,可以重复上一次命令,当然你要记住上次你干了啥
N<command> # 重复某个命令N次,N为数字,命令要是有效的vim命令

看看示例:

1
2
3
4
dd			# 删除一行,并且删除的内容会存放到剪贴板
2dd # 2dd表示删除从光标开始的两行
3p # 粘贴文本3次,内容是剪贴板的内容,假设先执行了2dd,再3p,则会粘贴6行新内容
100icontent [Esc] # 中间有个空格 插入100遍content<space>

注意: 如果在100icontent [Esc]之后在输入小数点.。那么会再插入100遍content<space>,即重复上条命令。如果再输入3.`,会再输入3个content

  • 更快的移动光标
1
2
3
4
5
NG		# 到第N行,G必须大写
gg # 到第一行
G # 到最后一行
w # 到下一个单词的开头
e # 到下一个单词的结尾

注意: 默认情况,单词是由字母,数字,下划线组成,如果认为是blank字符分隔,则需要使用EW,如下如所示:
e,w和E,W区别

其实这并不是最强的光标移动,下面来看看最快的光标如何移动:

1
2
3
%		# 匹配括号移动,包括(,{,[,这个对于编程来匹配括号非常好用,记住你需要把光标先移到括号上,然后就可以匹配到与之对应的反括号
* # 匹配光标当前所在单词,移动到下一个,以blank字符为分隔符
# # 匹配光标当前所在单词,移动到上一个,以blank字符为分隔符
  • 选中

一定要记住光标的移动快捷键,很多命令可以通过光标的移动来实现联动,比如从某个地方拷贝到某个地方,删除从某个位置到另一个位置,语法类似下面

command

例如:0y$命令意味着:

0 # 先到行头
y # 从光标处开始拷贝
$ # 拷贝到本行最后一个字符

类似这样的命令还有:ye,从当前位置拷贝到本单词的最后一个字符。y2/foo,拷贝两个foo之间的字符串。不一定按y才会拷贝,下面的命令也会拷贝:

1
d		# 删除

常用命令

1
2
3
:g/^$/de		# 删除空白行
:set encoding # 查看文件编码
:set list # 显示不可见字符,一般来看每一行结尾是否有空格