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

Last updated

Was this helpful?