跳至内容

Vim 常用命令

Vi 与 Vim 的关系,以及冒号命令、普通模式按键和搜索速查,涵盖全文复制、删除与替换。

  • Vim
  • Vi
  • 命令行

Vi 是 Unix 中的文本编辑器,Vim(Vi IMproved)是兼容 Vi 大部分操作的增强版编辑器,可以独立安装和使用。两者都用 i 输入、:wq 保存退出;日常操作中较直观的差别是:

对比项传统 ViVim
撤销主要支持一级撤销可以连续撤销、重做多步修改
语法高亮不提供可按文件类型高亮代码和配置

系统里的 vi 命令有时实际启动的就是 Vim,因此命令名不一定代表具体实现。

下面只介绍 Vim,按常见默认设置整理。【…】 为待替换参数,速查块右侧为说明,不要整块粘贴执行。

1. 打开文件与基本流程

在终端执行:

代码块 Shell
1
2
3
vim 【文件】                  # 打开文件;不存在时,保存后创建
vim +【行号】 【文件】        # 打开并定位到指定行
vim -R 【文件】               # 只读模式打开,防止误写

路径含空格时,在终端中加引号。一次编辑按下面的顺序操作;这是按键流程,不是脚本:

代码块 Text
1
2
3
4
终端:vim 【文件】 → 回车       打开文件
Vim:按 i → 输入文字            进入插入模式并编辑
     按 Esc                     返回普通模式
     输入 :wq → 回车            保存并退出

后文分为三类:冒号命令输入后回车,普通模式按键直接生效,搜索用 / 或 ? 开头并回车。从插入模式切换到这些操作前,先按 Esc。

2. 冒号命令:输入后回车

下面的 : 都是命令的一部分。例如 :%d,依次输入 :、%、d,再按回车执行。

2.1 保存与退出

代码块 Text
1
2
3
4
5
6
7
8
:w              保存当前文件
:wq             保存并退出
:q              退出;有未保存修改时拒绝退出
:q!             不保存,放弃修改并退出
:x              有修改才写入,然后退出
:w 【新文件】   将当前内容另写一份,继续编辑原文件
:e 【文件】     打开另一文件;当前文件未保存时通常会拒绝
:e!             放弃当前修改,重新载入磁盘内容

:wq 即使未修改也会写入,:x 只在有修改时写入。:q!、:e! 使用前确认不需要保留当前修改;:w! 不能绕过操作系统的文件权限。这里按单文件、单窗口使用理解。

2.2 按行删除与复制

d 表示删除,y 表示复制;前面加行号或范围,就能指定处理哪些行。范围中的 . 表示当前行,$ 表示末行,逗号连接起止行,包含两端。

代码块 Text
1
2
3
4
5
6
:d                        删除当前行
:y                        复制当前行
:【起始行】,【结束行】d     删除指定行范围
:【起始行】,【结束行】y     复制指定行范围
:.,$d                     删除当前行到文件末尾
:1,.d                     删除文件首行到当前行

例如 :10,20d 删除第 10~20 行,:10,20y 复制这 11 行。复制的内容可回到普通模式后用 p 粘贴到当前行下方。

2.3 全文操作(%)与替换

在冒号命令的行范围中,% 等于 1,$,表示从第一行到最后一行。后面接 d 就是删除全文,接 y 就是复制全文,接 s 则进行替换。

代码块 Text
1
2
3
4
5
:%d                                          删除全文
:%y                                          复制全文
:%s/【匹配模式】/【替换内容】/g               替换全文全部匹配
:%s/【匹配模式】/【替换内容】/gc              全文替换,逐项确认
:%s/【匹配模式】//g                           删除全文中匹配到的文本

g 表示每行的全部匹配,c 表示逐项确认;确认时 y 替换、n 跳过、a 替换当前及剩余项、q 停止。最后一条把匹配内容替换为空,不是删除匹配所在的整行。

替换也能缩小范围:

代码块 Text
1
2
3
:s/【匹配模式】/【替换内容】/                 只替换当前行第一个匹配
:s/【匹配模式】/【替换内容】/g                替换当前行全部匹配
:【起始行】,【结束行】s/【匹配模式】/【替换内容】/g   替换指定行范围

匹配模式按正则解析,不额外加引号。使用 / 作分隔符时,内容中的 / 写成 \/;替换内容中的 & 表示整个匹配,字面 & 写成 \&。

:%y 默认复制到 Vim 内部寄存器,供 p、P 粘贴,不等同于复制到系统剪贴板。删除与替换后可按 u 撤销;保存后才会写入磁盘文件。

2.4 行号与显示设置

代码块 Text
1
2
3
4
5
6
7
8
:set nu         显示行号
:set nonu       隐藏行号
:set ic         搜索时忽略大小写
:set noic       搜索时区分大小写
:set hls        高亮搜索结果
:noh            清除当前搜索高亮,下次搜索仍可高亮
:syntax on      开启语法高亮
:syntax off     关闭语法高亮

这些设置只影响当前会话,不会自动写入配置。

3. 普通模式按键:不加冒号

先按 Esc 回到普通模式,以下按键都不需要回车。大小写有区别:dd 是连续按两次小写 d,G 是大写 G;Ctrl+r 表示同时按 Ctrl 和 r。

3.1 移动与定位

代码块 Text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
h / j / k / l   左 / 下 / 上 / 右
0               行首,数字 0
^               本行第一个非空白字符
$               行末
w               下一个词首
b               向前移动到词首
e               当前词的词尾;已在词尾时到下一个词尾
gg              文件首行
G               文件末行
【行号】G       指定行,例如 20G
%               光标在括号上时,跳到配对括号

Ctrl+f          向下翻一屏
Ctrl+b          向上翻一屏
Ctrl+d          向下翻半屏
Ctrl+u          向上翻半屏

j、k 按文件中的实际行移动,不按自动折行后的屏幕行计算。按键前可加次数,例如 5j 向下移动 5 行;跳到第 20 行也可以输入冒号命令 :20 后回车。

这里单独按 % 是跳转配对的 ()、[]、{},与 :%d 中的全文范围不同。

3.2 输入与修改

代码块 Text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
i               在光标前开始输入
a               在光标后开始输入
I               在本行第一个非空白字符前开始输入
A               在行末开始输入
o               在下方新建一行并开始输入
O               在上方新建一行并开始输入

r【字符】       替换光标处的一个字符,不进入插入模式
ciw             删除光标所在的整个词,并进入插入模式
cc              修改整行,进入插入模式
C               修改光标处到行末的内容,进入插入模式

进入插入模式后输入新内容,结束时按 Esc。ciw 是连续按 c、i、w,光标在词中也会修改整个词。

3.3 删除、复制与粘贴

代码块 Text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
x               删除光标处字符
dd              删除当前行
【行数】dd      从当前行起删除指定行数,例如 3dd
dw              删到下一词首前;行末单词只删到当前行末
D               从光标处删除到行末,同 d$
dG              删除当前行到文件末尾

yy              复制当前行
【行数】yy      从当前行起复制指定行数,例如 3yy
p               粘贴到光标后;整行内容放在下一行
P               粘贴到光标前;整行内容放在上一行

dd 与 :d 都删除当前行,yy 与 :y 都复制当前行,但输入方式不同。dG 只处理当前行到末尾,删除全文直接用 :%d。

删除的内容也能粘贴:dd 后移动到目标行,再按 p,就会把这一行剪切到目标行下方。

3.4 撤销与重复

代码块 Text
1
2
3
u               撤销上一次修改,可连续撤销多步
Ctrl+r          重做被撤销的修改
.               重复上一次文本修改,不重复冒号命令

3.5 选中文本后操作

从普通模式开始:

代码块 Text
1
2
3
v               按字符选择
V               按整行选择
ggVG            选中全文:首行 → 按行选择 → 末行

按 v 或 V 后,移动光标扩展选区,再按 y 复制、d 删除、c 删除并开始输入;Esc 取消选择。

4. 搜索:输入后回车

从普通模式输入 / 或 ? 开始搜索,不加冒号。匹配模式按正则解析;例如 /ERROR 后回车,查找后面的 ERROR。

代码块 Text
1
2
/【匹配模式】   向文件末尾方向查找
?【匹配模式】   向文件开头方向查找

搜索结束后回到普通模式,下面的按键直接生效:

代码块 Text
1
2
3
4
n               按上次搜索方向找下一个
N               按相反方向找下一个
*               向文件末尾方向查找光标所在的完整单词
#               向文件开头方向查找光标所在的完整单词

n 不一定向下:上一次用 ? 向前搜索时,n 会继续向文件开头方向查找。

评论

使用 GitHub 登录后参与讨论,评论将公开保存在 GitHub。

阅读到这里时加载评论。