Vim起源
??Vim是从vi发展出来的一个文本编辑器,vi(visual editor)是unix/linux操作系统中最经典的文本编辑器,vim原来的名字叫做vi imitation(vi模拟器),目的是完全复制vi的功能,为开源和在类unix系统中移植而生,在成功被移植到unix之后名字变成了vi improved(vi改进版)。 ??Vim创造了开源世界“协作精神”和“自由软件持续改进”的奇迹。成为了自由软件历史上不朽的“丰碑”。后世为了纪念这场伟大的编辑器开源运动,给vim封了神——“编辑器之神”。
有一款与Vim并称的编辑器Emacs,远古时代诞生的始祖软件很多都是用Emacs编辑器创造的,Emacs被称作“神之编辑器”,为了纪念使用Emacs写C的大神们。
??最近涉及了很多Linux下的工作,使用了一段时间的Vim,虽然Vim的学习曲线陡峭,但是古怪的操作方式在熟悉了之后用起来还是很带感的,虽然快捷键非常多,但很有逻辑性,理解了之后要在Vim下存活并不是很困难,之后就是日常使用增加熟练度。 ??整理了常用的Vim快捷键分类如下。
1 模式切换
- esc:normal常规模式;
- i:insert插入模式;
- v:visual可视模式;
- : ——command命令模式;
- r:replace替换模式。
2 启动vim
- vim + file: 打开文件,从文件的末尾开始;
- vim +num file: 打开文件,从第num行开始;
- vim +/string file: 打开file,并将光标停留在第一个找到的string上。
- vim -c cmd file: 在打开文件前,先执行指定的命令;
- vim -R file: 以只读的方式打开文件,但可以强制保存;
- vim -M file: 以只读的方式打开文件,不可以强制保存;
- vim -r file: 恢复上次异常退出的文件;
3 文档操作
-
:——进入命令模式 -
:!——调用shell命令的前缀“!”,比如:!pwd可以显示当前路径 -
:w ——保存修改; -
:q[uit] ——退出当前窗口(CTRL-w q); -
:q!——强制退出(可在不保存的情况下退出) -
:wq ——保存并退出(ZZ或:x); -
:saveas newfilename ——另存为; -
:e ——重新加载当前文档; -
:f或ctrl+g ——显示文档名,是否修改,和光标位置。 -
:help ——查看帮助
4 移动光标
4.1 基本移动(文档方向=文字输入方向:后->前)
- h,j,k,l:左(退格),上,下,右(空格)移动光标
? - b:移动到上一个单词的开头;
- B:移动到上一个单词的开头(忽略标点);
- w:移动到下一个单词的开头;
- W:移动到下一个单词的开头(忽略标点);
? - e:移动到单词结尾(如果已在结尾则移动到下一单词结尾);
- E:移动到单词结尾(忽略标点);
- ge:移动到上一个单词结尾;
- gE:移动到上一个单词结尾(忽略标点);
? - %:移动到配对的括号
? - (:上移一句;
- ):下移一句;
- {:移动到上一个空行,段落以空行为间隔;
- }:移动到下一个空行;
- [[:将光标移动到上一个代码段(或函数)的行首;
- ]]:将光标移动到下一个代码段(或函数)的行首;
? - +或Enter: 把光标移至下一行第一个非空白字符;
- -: 把光标移至上一行第一个非空白字符;
? - f+“单字符”:行内移动到下一个目标,使用“,”和“;”可以沿上下继续搜索;
- F+“单字符”:行内移动到上一个目标,使用“,”和“;”可以沿上下继续搜索;
- t+“单字符”:行内移动到下一个目标前,使用“,”和“;”可以沿上下继续搜索;
- T+“单字符”:行内移动到上一个目标后,使用“,”和“;”可以沿上下继续搜索;
可以在操作前加上数字,表示操作的重复次数: [n]+“移动操作”——操作前加上“数字”表示重复次数,3h表示左移三次,3fx表示移到后续的第3个x的位置; [n]+“i”+“输入”——重复多次输入,3igo表示输入gogogo。
- 0:移动到行首
- ^:移动到行首(非空白字符)
- $:移动到行尾
? - H:移动到屏幕上方(high)
- M:移动到屏幕中间(middle)
- L:移动到屏幕下方(low)
? - gg:移动到文件开头
- G:移动到文件结尾
? - n| ——移动到第n列
- nG或:n ——移动到第n行
4.2 翻屏(不修改代码)
- ctrl+b: 向上翻一屏;
- ctrl+f:向下翻一屏;
? - ctrl+u:向上翻半屏;
- ctrl+d:向下翻半屏;
? - ctrl+e:向下滚动一行;
- ctrl+y:向上滚动一行;
? - zz:将当前光标所在行居中;
- zt:将当前光标所在行置顶;
- zb:将当前光标所在行置底;
4.3 标记(导航)
可以用Ctrl+o 和Ctrl+i 进行后退和前进。
m{a-z}: 标记光标所在位置,局部标记,只用于当前文件;
m{A-Z}: 标记光标所在位置,全局标记,标记后,退出Vim, 重新启动,标记仍有效;
`{a-z}: 移动到标记位置;
`{0-9}:回到上[1-10]次关闭vim时最后离开的位置;
``: 移动到上次编辑的位置;
`": 移动到上次离开的地方;
`.: 移动到最后改动的地方;
:marks ——显示所有标记;
:delmarks a b ——删除标记a和b;
:delmarks a-c ——删除标记a、b和c;
:delmarks a c-f ——删除标记a、c、d、e、f;
:delmarks! ——删除当前缓冲区的所有标记;
:help mark-motions ——查看更多关于mark的知识。
上述操作中,出现`(点号)的地方也可以使用’(单引号),使用点号可以精确到列,使用单引号只精确到行
5 插入
所有的插入操作都会自动进入i插入模式
5.1 基本插入
- i:光标前插入;
- I:当前行第一个非空字符前插入
- a: 在光标后插入;
- A: 在当前行最后插入;
- o: 在下面新建一行插入;
- O: 在上面新建一行插入;
? - :r filename在当前位置插入另一个文件的内容;
- :[n]r filename在第n行插入另一个文件的内容;
? - :r !date ——在光标处插入当前日期与时间;
- :r !command ——同理,可以将其它shell命令的输出插入当前文档。
5.2 改写插入
- [n]cc:改写光标所在行;
- [n]s: 以输入的文本替代光标之后1(n)个字符,相当于c[n]l;
- [n]S: 删除指定数目的行,并以所输入文本代替之,相当于[n]cc;
c[n]+移动操作:改写对应范围的内容([n]+操作——在第4节的移动操作里已经介绍过了):
- c[n]h:改写光标左边1(n)个字符;
- c[n]l: 改写光标右边1(n)个字符。
- c[n]k: 改写光标上n行(包含当前行)的内容;
- c[n]j:改写光标下n行(包含当前行)的内容;
- c[n]b:改写光标位置到上n个单词的开头位置的内容;
- c[n]w:改写光标位置到下n个单词的开头位置的内容;
- c[n]e:改写光标位置到下n个单词的结尾位置的内容;
- c$: 改写从光标当前位置到行尾;
- c0: 改写从光标当前位置到行首;
- cgg: 改写光标以上的所有行;
- cG: 改写光标以下的所有行。
? - r+“字符”:替换当前位置的字符
- R:进入replace模式,输入的内容会覆盖当前位置
5.3 拼接行
6 删除
d[n]+移动操作:删除对应范围的内容,d操作删除的内容会保存到vim寄存器,相当于剪切:
- d[n]h: 删除光标左边1(n)个字符。
- d[n]l: 删除光标右边1(n)个字符。
- d[n]k: 删除光标上n行(包含当前行)的内容;
- d[n]j: 删除光标下n行(包含当前行)的内容;
- d[n]b:删除光标位置到上n个单词的开头位置的内容;
- d[n]w:删除光标位置到下n个单词的开头位置的内容;
- d[n]e:删除光标位置到下n个单词的结尾位置的内容;
- d$或D: 删除从光标当前位置到行尾的内容;
- d0: 删除从光标当前位置到行首的内容。
- dgg: 删除光标以上的所有行;
- dG: 删除光标以下的所有行;
- :m,nd ——删除m行到n行的内容。
7 剪切
- [n]x: 剪切光标右边n个字符,相当于d[n]l;
- [n]X: 剪切光标左边n个字符,相当于d[n]h。
8 复制
- y: 复制在可视模式下选中的文本;
- yy或Y: 复制整行文本;
y[n]+移动操作:复制对应范围的内容:
- y[n]h: 复制光标左边1(n)个字符。
- y[n]l: 复制光标右边1(n)个字符。
- y[n]k: 复制光标上n行(包含当前行)的内容;
- y[n]j: 复制光标下n行(包含当前行)的内容;
- y[n]b:复制光标位置到上n个单词的开头位置的内容;
- y[n]w:复制光标位置到下n个单词的开头位置的内容;
- y[n]e:复制光标位置到下n个单词的结尾位置的内容;
- y$: 复制从光标当前位置到行尾的内容;
- y0: 复制从光标当前位置到行首的内容;
- ygg: 复制光标以上的所有行;
- yG: 复制光标以下的所有行;
- :m,ny ——复制m行到n行的内容。
9 粘贴
10 选择
- v:进入visual模式,可以执行选择操作
- e+“移动操作”:选择范围,选择完成后可以执行c、d、y、p等操作
11 寄存器
复制粘贴功能需要用到寄存器,使用的是vim自身的寄存器,所有只能在vim中使用 要关联系统剪贴板,需要vim的clipboard功能的支持 使用“vim --version | grep clipboard”查看 clipboard之前是+表示支持,-表示不支持 安装gvim或者vim-gnome可以支持剪贴板
:reg 显示所有寄存器的内容
"" ——不加寄存器索引时,默认使用的寄存器,""yy把当前行的内容放入默认寄存器。
"+ ——系统剪贴板,"+yy把当前行的内容放入系统剪贴板,"+p从系统剪贴板复制到vim。
12 查找与替换
12.1 查找
*——向下查找当前光标所在单词,可继续使用n向后查,N向前查
#——向上查找当前光标所在单词,可继续使用n向后查,N向前查
/+“字符串”:向下查找字符串,可继续使用n向后查,N向前查
?+“字符串”:向上查找字符串,可继续使用n向后查,N向前查
12.2 替换
:s/old/new ———用new替换当前行第一个old。
:s/old/new/g ——用new替换当前行所有的old。
:n1,n2s/old/new/g - 用new替换文件n1行到n2行所有的old。
:%s/old/new/g - 用new替换文件中所有的old。
:%s/^/xxx/g - 在每一行的行首插入xxx,^表示行首。
:%s/$/xxx/g - 在每一行的行尾插入xxx,$表示行尾。
所有替换命令末尾加上c,每个替换都将需要用户确认。
如:%s/old/new/gc,加上i则忽略大小写(ignore)。
13 重复操作
. ————(英文句号)重复执行上一次的操作
例如你想手动将文件中所有的old转换为new,只需要:
进入普通模式,将光标移到old下
- 敲击*查找old
- 敲击cw替换old,输入new
- 按ESC继续进入普通模式
- 敲击n查找下一个old
- 敲击.重复执行替换(重复执行的是步骤2中的输入new操作)
- 重复步骤4、5即可
14 撤销、重做
|