Vim 常用命令总结
先申明,如果你不是非常需要和服务器以及服务器上的日志打交道,其实vim只会简单的光标移动以及插入,删除,复制,粘贴,保存即可。学习Vim和学习乐器很像,需要很长时间的练习,如果你平时很少用到vim,我建议是不用学的太深入,懂一些简单的即可。如果需要经常和日志打交道,那么,好好学学Vim,这可以很大的提升你的工作效率,当然学习成本很大。
初级命令
Ubuntu系统都自带了vi
,你可以把Vim看成是Vi的升级版,Vim兼容Vi的所有命令,虽然vi
也可以用,但是有个不太好的地方,当你想在Vi打开的文件中插入东西时,它并没有提示,也就是不太好分清Normal
模式和Insert
模式,这个很容易搞混,一般就是多按几下Esc
来确保是在Normal
模式。所以我还是建议安装一个Vim。
简单认识vim
当你安装好Vim之后,一定项输入点东西,很多新手也就在这里止步了,很多人都不知道如何在Vim中插入字符,所以Vim给很多人的第一印象是难用,甚至不如记事本好用,其实Vim不是这样的,安装好之后,请按照下面的命令操作:
- 启动Vim后,Vim在
Normal
模式下 - 按下
i
,进入Insert
模式,这时Vim左下角会出现-- INSERT --
,这个时候你可以像使用记事本那样,输入你想要输入的东西 - 按
Esc
,可以从Insert
模式返回到Normal
模式
现在你已经掌握了基本的在Normal和Insert模式的切换了,下面是一些比较常用的命令:
1 | i # Insert 模式,按Esc返回Normal模式 |
注意: :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 | a # 在光标后插入 |
- 各种移动光标
1 | 0 # 数字0,到行头 |
- 拷贝/粘贴
1 | p # 粘贴,在当前位置之后粘贴 |
- 撤销/重做
1 | u # undo 撤销 |
- 打开/保存/退出/改变文件
1 | :e <path/to/file> # 打开一个文件,空格隔开 |
注意: 其实只是切换文件可以用:n
,表示到下一个文件。
高效命令
在处理文本的时候,有时候需要做很多重复的动作,下面来看看Vim
如何重复自己
- 重复命令
1 | . # 小数点,可以重复上一次命令,当然你要记住上次你干了啥 |
看看示例:
1 | dd # 删除一行,并且删除的内容会存放到剪贴板 |
注意: 如果在100icontent [Esc]之后在输入小数点
.。那么会再插入100遍content<space>,即重复上条命令。如果再输入
3.`,会再输入3个content
- 更快的移动光标
1 | NG # 到第N行,G必须大写 |
注意: 默认情况,单词是由字母,数字,下划线组成,如果认为是blank字符分隔,则需要使用E
和W
,如下如所示:
其实这并不是最强的光标移动,下面来看看最快的光标如何移动:
1 | % # 匹配括号移动,包括(,{,[,这个对于编程来匹配括号非常好用,记住你需要把光标先移到括号上,然后就可以匹配到与之对应的反括号 |
- 选中
一定要记住光标的移动快捷键,很多命令可以通过光标的移动来实现联动,比如从某个地方拷贝到某个地方,删除从某个位置到另一个位置,语法类似下面
command
例如:0y$
命令意味着:
0 # 先到行头
y # 从光标处开始拷贝
$ # 拷贝到本行最后一个字符
类似这样的命令还有:ye
,从当前位置拷贝到本单词的最后一个字符。y2/foo
,拷贝两个foo之间的字符串。不一定按y
才会拷贝,下面的命令也会拷贝:
1 | d # 删除 |
常用命令
1 | :g/^$/de # 删除空白行 |