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