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: 删除当前单词并插入
delete¶
dd: 删除当前行dw: 删除当前所在的单词d$: 删除当前位置到行末的所有字符d0: 删除当前位置到行首的所有字符d^: 删除当前位置到当前行首个非空字符的所有字符x: 删除当前单个字符ndd: 删除包括当前行往后的n行内容,n=1,2,3...,如: 4ddndw: 删除包括当前单词往后的n个单词,n=1,2,3...,如: 4dwnd$: 删除当前位置到往后n行末尾的所有内容,n=1,2,3...,如: 4d$nx: 删除包括当前字符往后的n个字符,n=1,2,3...,如: 4x
说明
下文中的 n 除非特殊说明,否则均代表数字(n=1,2,3,...)
copy¶
yy:复制当前行yw:复制当前所在的单词y$:复制当前位置到行末的所有字符y0:复制当前位置到行首的所有字符y^:复制当前位置到当前行首个非空字符的所有字符nyy:复制包括当前行往后的n行内容,n=1,2,3...,如: 4yynyw:复制包括当前单词往后的n个单词,n=1,2,3...,如: 4ywny$:复制当前位置到往后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>。这些就是逻辑行与物理行的区别了。
Window cmds¶
open multi-window¶
vi -o file1 file2: 打开两个纵向分隔的窗口vi -O file1 file2: 打开两个横向分隔的窗口vi -o4: 打开4个纵向分隔的窗口vi -O4: 打开4个横向分隔的窗口
edit multi-window¶
:sp file: 在当前窗口下方打开新的窗口:vsp file: 在当前窗口右侧打开新的窗口ctrl w s: 在当前窗口下方打开新的窗口,打开当前窗口副本ctrl w v: 在当前窗口右侧打开新的窗口,打开当前窗口副本
Tip
当 sp vsp 不指定文件时,默认打开当前所在窗口文件的副本
romaing¶
ctrl w h: 切到左侧窗口ctrl w j: 切到下测窗口ctrl w k: 切到上测窗口ctrl w l: 切到右侧窗口ctrl w w: 循环切换窗口,从上到下,从左到右ctrl w p: 切到上一次访问的窗口ctrl w t: 切到最左上角的窗口ctrl w b: 切到最右下角的窗口
layout¶
改变窗口布局
ctrl w H: 移动窗口至屏幕左侧,占用全部高度ctrl w J: 移动窗口至屏幕底部,占用全部宽度ctrl w K: 移动窗口至屏幕顶部,占用全部宽度ctrl w L: 移动窗口至屏幕右侧,占用全部高度ctrl w T: 移动窗口至新的分页,之后可通过gf切换分页ctrl w r: 向右或向下交换窗口ctrl w R: 向右或向下交换窗口ctrl w x: 交换同列或同行窗口位置
resize¶
ctrl w =: 平均分布窗口大小ctrl w |: 单独占用整个屏幕ctrl w -: 当前窗口高度减少一行ctrl w +: 当前窗口高度增加一行ctrl w >: 当前窗口宽度减少一列ctrl w <: 当前窗口宽度增加一列
useful cmds¶
:g/pattern/d: 删除全局匹配行:%s/pattern/replace/g: 全局替换匹配项,gc可以单独控制每个匹配项
edit binary¶
编辑二进制文件
- 使用
vi -b file打开文件 - 命令模式
:%!xxd让文件以16进制形式与ASCII形式显示,类似于hexdump -C - 编辑文件结束后,设置
:%!xxd -r
add line number¶
添加当前行行号
:%s/^/\=line('.')/
添加所选行行号,'<代表所选行首行,'>代表所选行尾行
:'<,'>s/^/\=(line('.')-line("'<")+1).'. '/
其它方法
:%!cat -n:'<,'>!cat -n%!nl