Vim 是从 Vi 编辑器发展出来的一款极其强大的文本编辑器,它保留了 Vi 编辑器的所有功能,并添加了许多新特性。Vim 具有代码补全、语法高亮、错误跳转、批量化处理等编辑功能,还支持异常丰富的插件扩展,且整个编辑全程可通过键盘完成,无需使用鼠标,以致其成为众多程序员一款高效的编程开发利器。
本节介绍关于 VIM 的一些命令与快捷方式,关于 VIM 获取与安装可以参考最强文本编辑器 VIM 获取与安装。VIM 难就难在复杂的操作命令和脱离鼠标的痛苦,其实只要掌握了技巧并不多难。
VIM 模式
- 命令模式(Command mode)
- 输入模式(Insert mode)
- 视图模式(Visual mode)
- 末行模式(Last line mode)
模式转换
命令 | 描述 |
---|
i, I, a, A, o, O, s, S | command 模式 —> insert 模式 |
esc | insert 模式 --> command 模式 |
v, V | command 模式 --> visual 模式 |
esc | visual 模式 --> command 模式 |
:, / | command 模式 —> 末行模式 |
常用命令
注:带 :
、/
、?
的是在末行命令下使用的命令。
打开文件
命令 | 描述 |
---|
vim filename | 打开或新建文件,并将光标置于第一行的首部 |
vim -r filename | 恢复上次 vim 打开时崩溃的文件 |
vim -R filename | 把文件以只读方式打开 |
vim + filename | 打开文件,并将光标置于最后一行的首部 |
vim +n filename | 打开文件,并将光标置于第 n 行的首部 |
vim +/str filename | 打幵文件,并将光标置于第一个与 str 匹配的位置 |
vim -c command filename | 在对文件进行编辑前,先执行指定的命令 |
vim file1 file2 file3 … | 打开多个文件 |
vim -On file1 file2 … | 打开多个文件并左右分屏 |
vim -on file1 file2 … | 打开多个文件并上下分屏 |
查看文件
命令 | 描述 |
---|
:ls | 列出当前打开的所有文件 |
:bn | 打开多个文件时,切换显示下一个文件 |
:bp | 打开多个文件时,切换显示上一个文件 |
:sp filename | 上下分割,并打开一个新的文件 |
:vsp filename | 左右分割,并打开一个新的文件 |
:next | 切换至下一个文件 |
:prev | 切换至前一个文件 |
:last | 切换至最后一个文件 |
:first | 切换至第一个文件 |
Ctrl + w, s | 按下 ctrl + w,再按下 s,上下分屏打开当前文件 |
Ctrl + w, v | 按下 ctrl + w,再按下 v,左右分屏打开当前文件 |
Ctrl + w, h | 文件左右分屏时,将光标定位到左边屏幕 |
Ctrl + w, l | 文件左右分屏时,将光标定位到右边屏幕 |
Ctrl + w, H | 文件左右分屏时,将当前分屏移动到左边 |
Ctrl + w, L | 文件左右分屏时,将当前分屏移动到右边 |
Ctrl + w, j | 文件上下分屏时,将光标定位到下边屏幕 |
Ctrl + w, k | 文件上下分屏时,将光标定位到上边屏幕 |
Ctrl + w, J | 文件上下分屏时,将当前分屏移动到下边 |
Ctrl + w, K | 文件上下分屏时,将当前分屏移动到上边 |
Ctrl + w, c | 文件分屏显示时,关闭当前分屏 |
Ctrl + w, q | 文件分屏显示时,关闭当前分屏直到退出 VIM |
操作文件
命令 | 描述 |
---|
:q | 不保存仅退出 |
:q! | 不保存仅退出(强制退出) |
:qa | 全部退出 |
:w | 保存 |
:w! | 强制保存 |
:wq | 保存退出 |
:wq! | 强制保存退出 |
:x | 保存退出 |
:w filename | 另存到 filename 文件 |
:saveas filename | 另存到 filename 文件 |
:e filename | 打开或新建一个文件 |
:e! | 放弃所有更改,恢复文件到上次保存 |
功能命令
命令 | 描述 |
---|
:set nu | 显示行号 |
:set nonu | 取消显示行号 |
:set ic | 忽略字符大小写 |
:set noic | 区分字符大小写 |
:syntax on | 语法高亮 |
:syntax off | 取消语法高亮 |
:changes | 查看文件变化 |
光标插入
命令 | 描述 |
---|
i | 光标插在当前字符左侧 |
I | 光标插在当前行的行首 |
a | 光标插在当前字符右侧 |
A | 光标插在当前行的行尾 |
o | 新增下一行,并将光标插在行首 |
O | 新增上一行,并将光标插在行首 |
s | 删除光标所在字符,并将光标插在此处 |
S | 删除光标所在行,并将光标插在行首 |
光标移动
命令 | 描述 |
---|
h | 光标向左移动 1 个字符 |
j | 光标向下移动 1 个行 |
k | 光标向上移动 1 个行 |
l | 光标向右移动 1 个字符 |
nj | 光标向下移动 n 个行 |
nk | 光标向上移动 n 个行 |
H | 光标移动到屏幕最上方一行的第 1 个字符 |
M | 光标移动到屏幕中央一行的第 1 个字符 |
L | 光标移动到屏幕最下方一行的第 1 个字符 |
G | 移动到这个文件的最后一行 |
nG | 移动到这个文件的第 n 行 |
gg | 移动到这个文件的第一行,相当于 1G |
n + [enter] | 光标移动向下移动 n 行 |
n + [space] | 光标移动向右移动 n 个字符 |
+ | 光标移动到非空格符的下一行 |
- | 光标移动到非空格符的上一行 |
w | 光标移动到下个单词首部 |
b | 光标移动到上个单词首部 |
e | 光标移动到下个单词尾部 |
ge | 光标移动到上个单词尾部 |
0 | 光标移动到本行行首 |
$ | 光标移动到本行行尾 |
^ | 移动到行首非空字符位置 |
g_ | 移动到行尾非空字符位置 |
fa | 移动到本行光标处开始向后第一个为 a 的字符处 |
nfa | 移动到本行光标处开始向后第 n 个为 a 的字符处 |
Fa | 移动到本行光标处开始向前第一个为 a 的字符处 |
nFa | 移动到本行光标处开始向前第 n 个为 a 的字符处 |
ta | 移动到本行光标处开始向后第一个为 a 的字符的前一个字符处 |
nta | 移动到本行光标处开始向后第 n 个为 a 的字符的前一个字符处 |
Ta | 移动到本行光标处开始向前第一个为 a 的字符的前一个字符处 |
nTa | 移动到本行光标处开始向前第 n 个为 a 的字符的前一个字符处 |
文件翻页
命令 | 描述 |
---|
Ctrl + f | 屏幕向下移动一页 |
Ctrl + b | 屏幕向上移动一页 |
Ctrl + d | 屏幕向下移动半页 |
Ctrl + u | 屏幕向上移动半页 |
zt | 移动屏幕将当前行移动到屏幕上方 |
zz | 移动屏幕将当前行移动到屏幕中间 |
zb | 移动屏幕将当前行移动到屏幕下方 |
大小写转换
命令 | 描述 |
---|
~ | 将光标下的字母改变大小写 |
n~ | 将光标位置开始的 n 个字母改变其大小写 |
g~~ | 改变当前行字母的大小写 |
guu | 将当前行的字母全改成小写 |
gUU | 将当前行的字母全改成大写 |
guw | 将光标下的单词改成小写 |
gUw | 将光标下的单词改成大写 |
ngUU | 将从光标开始到下面 n 行字母改成大写 |
格式化代码
命令 | 描述 |
---|
== | 将光标所在行代码格式化缩进 |
n== | 将光标所在行到下面共 n 代码格式化缩进 |
gg=G | 将全文代码格式化缩进 |
:set ai | 设定自动缩进 |
:set noai | 取消自动缩进 |
:set expandtab | 将 tab 转换为 space |
:set tabstop=4 | 制表符宽度 tabstop=4 或 ts=4 |
:retab | 按照设定值重新缩进 |
查找替换
命令 | 描述 |
---|
: s/str/abc/ | 将光标所在行的第一个 str 替换成 abc |
:%s/str/abc/ | 将全文中的第一个 str 替换成 abc |
: s/str/abc/g | 将光标所在行的 str 替换成 abc |
:%s/str/abc/g | 将全文中的 str 替换成 abc |
:m,ns/str/abc/g | 将 m 行到 n 行中所有的 str 替换为 abc |
/str | 向后查找 str n 查找下一个,N 查找前一个 |
?str | 向前查找 str n 查找前一个,N 查找下一个 |
:set hlsearch | 打开高亮搜索结果 |
:set nohlsearch | 关闭高亮搜索显示 |
复制命令
命令 | 描述 |
---|
yy | 复制光标所在行 |
nyy | 复制光标所在行,到向下 n 行 |
y1G | 复制光标所在行,到第一行的所有数据 |
yG | 复制光标所在行,到最后一行的所有数据 |
y0 | 复制光标所在字符,到该行行首所有数据 |
y^ | 复制光标所在位置,到该行第一个非空字符之间的所有数据 |
y$ | 复制光标所在字符,到该行行尾的所有数据 |
yw | 复制光标所在位置,到该单词结束 |
粘贴命令
命令 | 描述 |
---|
p | 将复制的数据粘贴到光标的下一行 |
P | 将复制的数据粘贴到光标的上一行 |
np | 粘贴 n 次 |
删除命令
命令 | 描述 |
---|
dd | 删除光标所在行 |
ndd | 删除光标所在行,到向下 n 行 |
d1G | 删除光标所在行,到第一行的所有数据 |
dG | 删除光标所在行,到最后一行的所有数据 |
d0 | 删除光标所在处,到该行行首 |
d^ | 删除光标所在处,到该行的最前面一个非空字符 |
d$ | 删除光标所在处,到该行的最后面一个字符 |
dw | 删除光标所在处,到该单词结束所有字符 |
dt | 删除下一个双引号之前的所有数据 |
x | 向后删除一个字符 |
nx | 向后删除 n 个字符 |
X | 向前删除一个字符 |
ci{ | 删除{}里面的内容 |
:m,nd | 删除 m 行到 n 行 |
修改命令
命令 | 描述 |
---|
cw | 修改光标所在处,到该单词结束所有字符 |
r | 替换光标所在处字符 |
R | 从光标所在处开始替换字符,按 esc 结束 |
其他操作
命令 | 描述 |
---|
. | 重复上次操作 |
u | 撤销上次操作 |
nu | 撤销前 n 次操作 |
Ctrl + r | 恢复上次操作 |
J | 将光标所在行与下一行的数据结合成同一行 |
Ctrl + v | 可视化块 |
Shift + v | 可视化行 |
互动板块
- 问:如何快捷入门 VIM?
- 答:多敲多练,把键盘敲烂!