vi/vim 常用命令
Vim 是从 vi 发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。
vi/vim 常用命令
简介
vi 是 Unix 和 Linux 操作系统使用的终端文本编辑器,任何一台安装了 Unix 或 Linux 的机器都会提供这套软件,它是系统管理员手中的得力工具。vim 是 vi 的升级版,它不仅兼容 vi 的所有指令(命令),而且还具有一些新特性。
操作模式
vi 有三种操作状态:
- 命令模式(command mode)
- 插入模式(insert mode)
- 末行模式(last line mode)
它们的功能如下:
命令模式:当执行 vi 后,首先会进入命令模式(指令模式),此时输入的任何字符都被视为命令。命令模式用于控制屏幕光标的移动,文本的删除,移动复制某区段,进入插入模式下,或者进入末行模式。
插入模式:在命令模式下输入相应的插入命令进入该模式。只有在插入模式下,才可做文字数据输入和其它编辑操作,按 ESC 键可回到命令模式。
末行模式:在命令模式输入某些特殊字符,如 "/"、"?" 和 ":",可进入末行模式。在该模式下可存储文件或离开编辑器,也可以设置编辑环境,如寻找字符串、列出行号等。
vi 三种工作模式的转换如图:
进入与退出
进入 vi
若要编辑文件 myfile,执行如下执行即可:
1 | vi myfile |
终端显示 vi 的编辑窗口,进入命令模式。也可以直接输入 vi 创建一个新文件,然后在退出时保存文件或者丢弃。
退出 vi
如果在插入模式下,则先利用 ESC 键返回命令模式,然后可选用下列指令退出 vi。
:q!
离开 vi,并放弃刚才的修改。:wq
保存退出。:ZZ
保存退出。:x
同:wq
:w
保存但不退出。:q
退出 vi,若文件被修改过,则会被要求确认是否放弃修改。此指令可以 w 配合使用。
注意:如果不知道当前处于何种模式,可以多按几次 ESC 键,以便确认进入命令模式。
常用命令
命令模式
在命令模式下可以进行文本的编辑工作。使用下列命令,配合一般键盘上的功能键,如方向键、Insert 键、Delete 键等,就可以利用 vi 来处理文本数据了。
光标的移动
命令 | 说明 | 功能键 |
---|---|---|
h |
向左移一个字符 | \(\leftarrow\) |
l |
向右移一个字符 | \(\rightarrow\) |
j |
向上移一个字符 | \(\uparrow\) |
k |
向下移一个字符 | \(\downarrow\) |
0 |
移至该行之首 | Home |
$ |
移至该行之末 | End |
^ |
移至该行的第一个非空白字符处 | |
H |
移至窗口的第一行 | |
M |
移至窗口的中间那行 | |
L |
移至窗口的最后一行 | |
G |
移至该文件的最后一行 | |
nG |
移至该文件的第 n 行 | |
gg |
移至该文件的第一行 | |
w |
跳到下一个单词 | |
b |
跳到上一个单词 | |
{ |
按段移动,上移 | |
} |
按段移动,下移 |
翻屏与滚屏
命令 | 说明 | 功能键 |
---|---|---|
Ctrl+f |
向后翻一屏 | PageDown |
Ctrl+b |
向前翻一屏 | PageUp |
Ctrl+d |
向后翻半屏 | |
Ctrl+u |
向前翻半屏 | |
zt |
光标所在行移动到窗口顶端 | |
zz |
光标所在行移动到窗口中间 | |
zb |
光标所在行移动到窗口底部 |
删除(剪切)与修改
命令 | 说明 | 功能键 |
---|---|---|
x |
删除光标所在的字符 | Delete |
X |
删除光标的前一个字符 | |
dd |
删除光标所在的行 | |
ndd |
删除包括光标所在行的 n 行文本 | |
d0 |
删除从光标前一个字符开始一直到行首的文本 | |
dw |
删除从光标开始的一个单词 | |
D |
删除从光标开始一直到行末的文本 | |
s |
删除光标所在字符并进入插入模式 | |
S |
删除光标所在行并进入插入模式 | |
r |
替换光标所在字符 | |
R |
进入替换状态,替换光标所在字符及以后的字符,按 ESC 退出替换状态 |
复制粘贴
命令 | 说明 |
---|---|
yy 或 Y |
复制光标所在行 |
nyy 或 nY |
复制包括光标所在行开始的 n 行 |
p (小写) |
粘贴到光标的下一行 |
P (大写) |
粘贴到光标的上一行 |
撤销与反撤销
命令 | 说明 |
---|---|
u |
撤销 |
Ctrl+r |
反撤销 |
文本行移动(缩进)
命令 | 说明 |
---|---|
>> |
向右移动(缩进) |
<< |
向左移动(缩进) |
> (vim 支持) |
向右移动(缩进) |
< (vim 支持) |
向左移动(缩进) |
重复命令
命令 | 说明 |
---|---|
. |
重复执行上一次的命令 |
退出命令
命令 | 说明 |
---|---|
ZZ |
退出保存,相当于末行模式下的 :wq |
插入模式
所有以下命令都能从命令模式进入插入模式。
命令 | 说明 |
---|---|
i |
从光标所在字符前面开始插入字符 |
I |
从光标所在行的行首开始插入字符 |
a |
从光标所在字符后面开始插入字符 |
A |
从光标所在行的行末开始插入字符 |
o |
光标所在行向下新增一行 |
O |
光标所在行向上新增一行 |
末行模式
查找命令
命令 | 说明 |
---|---|
/exp |
往前查找字符串 exp,n 下一个,N 上一个 |
?exp |
往后查找字符串 exp,n 下一个,N 上一个 |
替换命令
命令 | 说明 |
---|---|
:%s/abc/123/g |
将当前文件中所有的 abc 替换成 123 |
:1,10s/abc/123/g |
将 1 到 10 行的 abc 全部替换成 123 |
退出命令
命令 | 说明 |
---|---|
:q |
退出程序 |
:q! |
强制退出,不保存修改 |
:w |
保存修改 |
:w filename |
将编辑内容存为名为 filename 的文件 |
:wq |
保存退出 |
:x |
若有修改保存,退出程序 |
:wq
强制性 写入文件并退出。即使文件没有被修改也强制写入,并更新文件的修改时间。
:x
写入文件并退出。仅当文件被修改时才写入,并更新文件修改时间,否则不会更新文件修改时间。
其它命令
命令 | 说明 |
---|---|
:set nu |
显示行号 |
:set nonu |
不显示行号 |
:set ff |
查看文件格式 |
:set ff=unix |
修改文件格式为 unix |
:noh |
取消搜索结果高亮 |
可视模式
命令 | 说明 |
---|---|
v |
选中文本(按字符移动) |
V |
选中文本(按行移动) |
可视模式可以配合 d
,y
实现对文本块的删除(剪切),复制。
vim 下还支持配合 <
,>
实现对文本块的左右移动,首先使用 v
或 V
选择要移动的部分,然后按 Ctrl+v
选中该文本块,接着可根据需要左移 <
或 右移 >
。
进阶命令
快速纠错
进入 vim 之后首先使用 a/i/o
之一进入插入模式:
Ctrl+h
删除上一个字符Ctrl+w
删除上一个单词Ctrl+u
删除当前行
快速切换模式
快速切换 normal 模式
- 使用
Ctrl+c
代替Esc
(但是可能会中断某些插件) - 或者
Ctrl+[
快速切换 insert 模式
gi
快速跳转到你最后一次编辑的地方并进入插入模式
快速移动
单词之间移动
w/W
移动到下一个单词 word/WORD 开头e/E
移动到下一个单词 word/WORD 结尾b/B
移动到上一个单词 word/WORD 开头
注意:
- word 指的是以非空白符分割的单词
- WORD 指的是以空白符分割的单词
行间搜索移动
同一行快速移动的方式其实是搜索一个字符并且移动到该字符。
- 使用
f{char}
可移动到 char 字符上,从左往右搜索 - 使用
F{char}
可移动到 char 字符上,从右往左搜索 t{char}
移动到 char 的前一个字符,从左往右搜索- T{char}` 移动到 char 的后一个字符,从右往左搜索
- 可以用分号
;
继续搜索该行下一个 - 可以用分号
,
继续搜索该行上一个
水平移动
0
移动到行首^
移动到行首非空白字符$
移动到行尾g_
移动到行尾非空白字符
垂直移动
- 使用
(
和)
在句子 sentence 间移动,你可以使用:help (
查看 sentence 的定义 - 使用
{
和}
在段落 paragraph 间移动,你可以使用:help {
查看 paragraph 的定义
页面移动
gg
移动到文件开头G
移动文件结尾Ctrl+o
快速返回H
跳转到屏幕的开头(Head)M
跳转到屏幕的中间(Middle)L
跳转到屏幕的结尾(Lower)zz
把屏幕置为中间
快速增删改查
快速删除
- vim 在 normal 模式下使用
x
快速删除一个字符 - 使用
d
(delete)配合文本对象快速删除一个单词daw
(d around word)dw
表示删除光标后面的单词daw
表示删除光标所在的单词,包括单词旁边的空格diw
表示删除光标所在的单词,但不包括单词旁边的空格dt{char}
表示从光标位置删除到 char 之前的字符
d
和x
都可以配合数字来执行多次
快速修改
常用的有三个,r
(replace),c
(change),s
(substitute)。
r
可以替换一个字符s
删除当前字符并且进入插入模式c
可以配合文本对象快速修改一个单词cw
,ciw
,caw
,ct{char}
只不过是在dw
,diw
,daw
,dt{char}
删除的基础上同时进入插入模式