Skip to content

Vim

Mode of Vim

  • Normal mode [ESC]<default>
  • Insert mode [iI aA oO]
  • Visual mode [v]
  • Command-line mode [:]
  • Ex mode [Q]

Ex模式需输入visual退出外,其它任何模式都可以通过按下两次ESC键返回至Normal模式。

Common cmds

basic

指令 说明
u 撤销上一次修改操作
<Ctrl-R> 重做上一次撤销的修改
. 重复上一次修改操作
:q 未修改内容的情况下退出
:q! 强制退出,已修改部分不生效
:w 保存修改内容
:wq 保存文件并退出
:wq! 强制保存文件并退出

insert

指令 说明
i 在光标前插入
I 在行首插入
a 在光标后插入
A 在行尾插入
o 向下插入一行
O 向上插入一行
s 删除当前字符并插入
cc 删除当前行并插入
ch 删除前一个字符并插入
cw 删除当前单词并插入

**说明:**以上指令中的c代表cut,对应剪切操作。

delete

指令 说明
dd 删除当前行
dw 删除当前所在的单词
d$ 删除当前位置到行末的所有字符
d0 删除当前位置到行首的所有字符
d^ 删除当前位置到当前行首个非空字符的所有字符
x 删除当前单个字符
ndd 删除包括当前行往后的n行内容,n=1,2,3...,如: 4dd
ndw 删除包括当前单词往后的n个单词,n=1,2,3...,如: 4dw
nd$ 删除当前位置到往后n行末尾的所有内容,n=1,2,3...,如: 4d$
nx 删除包括当前字符往后的n个字符,n=1,2,3...,如: 4x

**说明:**下文中的n除非特殊说明,否则均代表数字(n=1,2,3,...)

copy

copy的指令与delete格式完全一致,只是将d改成了y

指令 说明
yy 复制当前行
yw 复制当前所在的单词
y$ 复制当前位置到行末的所有字符
y0 复制当前位置到行首的所有字符
y^ 复制当前位置到当前行首个非空字符的所有字符
nyy 复制包括当前行往后的n行内容,n=1,2,3...,如: 4yy
nyw 复制包括当前单词往后的n个单词,n=1,2,3...,如: 4yw
ny$ 复制当前位置到往后n行末尾的所有内容,n=1,2,3...,如: 4y$

paste

指令 说明
p 粘贴到当前位置后面或下一行
P 粘贴到当前位置前面或上一行
np 向后复制n次
nP 向前复制n次

find/replace

指令 说明
/<PATTERN> 向下查找首个匹配项
?<PATTERN> 向上查找首个匹配项
n 向下查找匹配项
N 向上查找匹配项
* 向上查找与光标所在单词相同的单词
R 进入替换模式

jump

指令 说明
h 左移一个字符
j 下移一行
k 上移一行
l 右移一个字符
gj 下移一个逻辑行
gk 上移一个逻辑行
gg 跳至首行
G 跳至尾行
w 跳至下一个单词的首字符
b 跳至上一个单词的首字符
e 跳至下一个单词的尾字符
ge 跳至上一个单词的尾字符
0 跳至当前行首个字符
^ 跳至当前行首个非空字符
$ 跳至当前行末尾
nG 跳至第n行
:n 跳至第n行

**说明:**在vim中,存在**逻辑行**和**物理行**两个概念,**物理行**指的是:set number后显示行号对应的行,**逻辑行**是单行显示不了后自动回绕自下一行产生的。

1 test information;
2 test information;test information;<tag21>test information;test information;
  test information;test information;<tag22>test information;
3 test information;test information;<tag31>test information;test information;
  test information;test information;<tag32>test information;test information;
  test information;test information;<tag33>test information;
4 test information;test information;<tag41>
5
6 test information;

上面显示的第2,3行由于单行无法显示完整内容所以回绕至下一行,逻辑行是包括所有回绕行的,而物理行是按左侧编号对应的行进行操作的。

若当前光标在<tag21>的位置,那么物理行操作j将会把光标移至<tag31>,继续j会移至<tag41>;但若是换成逻辑行操作gj,则会将光标移至<tag22>,连续执行5次才会移至<tag41>。这些就是逻辑行与物理行的区别了。

edit binary

编辑二进制文件

  1. 使用 vi -b file 打开文件
  2. 命令模式 :%!xxd 让文件以16进制形式与ASCII形式显示,类似于hexdump -C
  3. 编辑文件结束后,设置 :%!xxd -r

add line number

添加当前行行号

:%s/^/\=line('.')/

添加所选行行号,'<代表所选行首行,'>代表所选行尾行

:'<,'>s/^/\=(line('.')-line("'<")+1).'. '/

其它方法

  1. :%!cat -n
  2. :'<,'>!cat -n
  3. %!nl