一、说明

掌握vim的操作技巧能让运维的工作事半功倍,本文将罗列出运维日常使用到的操作技巧,不太常用的操作,本文没有收集,有高要求有兴趣的可以百度查阅vim专题

二、常用技巧

1)普通模式:移动光标的操作

指令 作用
G或者(Shift+g) 光标瞬移到文件的最后一行
gg 光标瞬移到文件的第一行,命令等同于“1G”
0(数字0)或者^ 光标瞬移到当前行的行首
$ 标瞬移到当前行的行尾
b 光标瞬移到当前位置的单词的单词首字母处
e 光标瞬移到当前位置的单词的单词尾字母处
w 光标瞬移到当前位置的单词的下一个单词的单词首字母处
f+字母 光标往右瞬移到指定的“字母处”,如果指定的字母有重复,则默认跳转到从左至右的第一个
F+字母 光标往左瞬移到指定的“字母处”,如果指定的字母有重复,则默认跳转到从右至左的第一个
num+回车键 光标从当前行位置向下移动num行(num是数字)
num+gg 光标移动到文件的第num行,命令等同于“num+G”
H或者(Shift+h) 光标瞬移到当前窗口最上面的那一行
M或者(Shift+m) 光标瞬移到当前窗口中间的那一行
L或者(Shift+l) 光标瞬移到当前窗口最下面的那一行
h或者← 光标向左移动一个字符
j或者↓ 光标向下移动一个字符
k或者↑ 光标向上移动一个字符
l或者→ 光标向右移动一个字符
< 光标所在的一整行向左缩进
> 光标所在的一整行向右缩进

2)普通模式:搜索与替换操作

指令 作用
:/dabiaoge 从光标位置开始,向下搜索名为dabiaoge的字符串
:?dabiaoge 从光标位置开始,向上搜索名为dabiaoge的字符串
r 用光标选中字符,按下“r”,并输入替换的新内容,则可以把选中的字符修改成新内容
n 从光标位置开始,向下重复前一个搜索动作
N 从光标位置开始,向上重复前一个搜索动作
:g/A/s//B/g 把全文符合A的内容全部替换成B,斜线都是分隔符,可用"@"和"#"代替(注意中间s后面是两个斜线)
:%s/A/B/g 把全文符合A的内容全部替换成B,斜线都是分隔符,可用"@"和"#"代替(这个操作和“g/A/s//B/g”一模一样的效果)
:num1,num2s/A/B/gc 在第num1行和第num2行之间寻找A,并且把全部的A替换成B(后面的gc的c表示再次确定,如果确认就输入y,也可以不用c,如果直接就是g,则是不用确定并且立即生效)

3)普通模式:复制、粘贴、删除等操作

指令 作用
yy 复制光标当前所在的一整行
num+yy 复制从光标所在行的这一行起向下的num行(光标所在的行为第一行)
小p、大P 小p表示将已复制的数据粘贴到光标所在行的下一行;而大P表示将已复制的数据粘贴到光标所在行的上一行
dd 删除当前光标所在的一整行
num+dd 删除从光标所在行开始向下的num行(光标所在的行为第一行)
u 撤销(回滚)前一个执行过的操作
. 就一个点号,表示重复前一个执行过的操作

4)普通模式:日常高技巧的操作

指令 作用
daw 删除光标所在单词以及单词前的一个空格(d就是删除的指令,aw就是光标所在单词加上前一个空格)
gUgU 把光标所在行的一整行的小写字母全部转成大写字母(原本就有的大写字母则是忽略)
gugu 把光标所在行的一整行的大写字母全部转成小写字母(原本就有的小写字母则是忽略)
g~g~ 把光标所在行的一整行的字母大小写互相调换,大写变小写,小写变大写
gU+t+字母 gU就是转为大写的操作指令,“t+字母”就是是表示重新定义光标在这一行的位置,而这个字母就是新的光标位置,如果同一行内有多个相同字母,则默认是第一个,表示从光标现在位置开始到“指定字母”这个位置止,之间的凡是小写的字母全部转成大写字母
gu+t+字母 gu就是转为小写的操作指令,“t+字母”就是是表示重新定义光标在这一行的位置,而这个字母就是新的光标位置,如果同一行内有多个相同字母,则默认是第一个,表示从光标现在位置开始到“指定字母”这个位置止,之间的凡是大写的字母全部转成小写字母
g~+t+字母 g~就是转为大小写互掉的操作指令,“t+字母”就是是表示重新定义光标在这一行的位置,而这个字母就是新的光标位置,如果同一行内有多个相同字母,则默认是第一个,表示从光标现在位置开始到“指定字母”这个位置止,之间的所有字母大小写互掉
Ctrl+a(快捷键) 把光标所在的数字加1
num+Ctrl+a 把光标所在的数字加num(num是数字,不能是负数、0还有小数,必须是正整数)

5)进入编辑模式的命令(一共就六种进入编辑模式的命令键)

指令 作用
i 在当前光标所在处开始进入编辑模式
a 在当前光标所在处的下一个字符处开始进入编辑模式
I 在当前光标所在行的行首的第一个非空格符处开始进入编辑模式(与A正好相反)
A 在当前光标所在行的行尾最后一个字符处开始进入编辑模式(与I正好相反)
O 在当前光标所在行的上一行插入新的一行(也就是把当前光标所在的行下移一行,但是光标还在这一行,并且光标移动到行首)
o 不是数字0,是字母o,表示在当前光标所在行的下一行插入新的一行(与O正好相反)
Esc 退出编辑模式,切回到命令模式

6)命令行模式的命令

指令 作用
:wq或者x 退出并保存
:wq!或者x! 退出并强制保存,“!”为强制的意思
:q! 强制退出,但不保存
:num1,num2 w filename 将第num1行到第num2行的内容保存到filename这个文件(filename文件无须提前创建)
:num1,num2 co num3 将第num1行到第num2行的内容复制到第num3行的下面
:num1,num2 m num3 将第num1行到第num2行的内容移动(剪切)到第num3行的下面
:!任意命令 表示暂时离开vim页面,转到执行的那个命令的页面,例如:!ls /root
:set nu 所有行都显示行号
:set nonu 取消行号(与“set nu”相反)
:vs filename 以垂直分屏的方式显示,会左右显示当前文件和filename文件的内容
:sp filename 以水平分屏的方式显示,会上下显示当前文件和filename文件的内容
:,$d 注意最前面有个逗号,表示删除当前光标所在行以及后面的所有行(光标所在的那一行也删除)
:num,.d 注意num和d之间有个逗号和点,表示删除第num行到光标所在行的内容(光标所在的那一行也删除)

7)可视化模式

.......... ..........
可视化模式类型分为三种字符 可视化、行可视化、块可视化
在普通模式下: 按v(小写),进入字符可视化
按V(大写,也可以Shift+v),进入行可视化
按“Ctrl+v”,进入块可视化
什么是可视化? 就是一种控制选择粒度的方案。
字符可视化 选择粒度是一个字符,就是以字符为单位,一次选择一个字符
行可视化 选择粒度是一整行,就是为行为单位,一次选择一行
块可视化 最强大的选择粒度,没有选择单位,可自由选择,选择完的区域形成一个块,所以叫块可视化

下面罗列工作中用到可视化最常用的操作:

把连续的几行代码在行首部注释掉

步骤 指令 作用
num1+gg 把光标定位到需要注释掉的几行代码的首行的行首
Ctrl+v 进入块可视化
num2+gg 把光标定位到需要注释掉的几行代码的末行的行首(如果行数不多,就连续按↓或者j,直到末行为止即可)
Shift+i”或者I 在第一个非空格符处开始进入编辑模式
输入“#” 一般的注释符是“#”号,这里也可以输入其他的注释符
按Esc退出 如果行数比较多,按下Esc不能立即给所选的所有行加上#号,需要等待1~2秒即可

既然有一次性注释的方法,那么也就有一次性取消注释的方法

步骤 指令 作用
num1+gg 把光标定位到需要取消注释掉的几行代码的首行的行首
Ctrl+v 进入块可视化
num2+gg 把光标定位到需要取消注释掉的几行代码的末行的行首 //如果行数不多,就连续按↓或者j,直到末行为止即可
执行d删除 即可删除所有的“#”

把连续的几行代码在行尾部加上相同字符(比如C++代码是在行尾部加“;”才能生效):

步骤 指令 作用
num1+gg 把光标定位到需要加“;”的几行代码的首行的行首
Ctrl+v 进入块可视化
num2+gg 把光标定位到需要注释掉的几行代码的末行的行首 //如果行数不多,就连续按↓或者j,直到末行为止即可
$ 光标瞬移到当前行的行尾
“Shift+a”或者A 在最后一个非空格符处开始进入编辑模式
输入“;” 添加“;”
按Esc退出 如果行数比较多,按下Esc不能立即给所选的所有行加上;号,需要等待1~2秒即可

一次性删除N行代码(我知道可用Ndd完成,这里用行可视化完成)

步骤 指令 作用
num1+gg 把光标定位到需要删除的几行代码的首行的行首
“Shift+v”或者V 进入行可视化
num2+gg 把光标定位到需要删除掉的几行代码的末行的行首 //如果行数不多,就连续按↓或者j,直到末行为止即可
执行d删除 可删除所有的被选中行

一次性删除所选内容(这个用Ndd可完成不了,这里用块可视化完成)

步骤 指令 作用
num1+gg 把光标定位到需要删除内容的起始行的行首
f+字母/数字 跳转到需要删除部分的起始位置
Ctrl+v 进入块可视化
num2+gg 把光标定位到需要删除部分的末尾部分所在行的行首 //如果行数不多,就连续按↓或者j,直到末行为止即可
再次执行“f+字母/数字” 跳转到需要删除部分的结尾位置
说明 如果行数不是太多,需要删除的部分全部在一个窗口内,则不用④和⑤那么麻烦,直接使用“← ↓ ↑→”方向键来选定需要删除的区域即可
执行“d”删除 可删除所有的被选中部分

既然有添加和删除,那么一定也有替换

步骤 指令 作用
num1+gg 把光标定位到需要替换内容的起始行的行首
f+字母/数字 跳转到需要替换部分的起始位置
Ctrl+v 进入块可视化
num2+gg 把光标定位到需要替换部分的末尾部分所在行的行首 //如果行数不多,就连续按↓或者j,直到末行为止即可
再次执行“f+字母/数字” 跳转到需要替换部分的结尾位置
说明 如果行数不是太多,需要替换的部分全部在一个窗口内,则不用④和⑤那么麻烦,直接使用“← ↓ ↑→”方向键来选定需要替换的区域即可
执行“r” 替换命令
输入新的字符 输入完即可