1. 跳转:
CTRL-I 跳转到下一个光标位置,与<TAB>相同
CTRL-O 跳转到上一个光标位置
2. 使用多个寄存器
["x]p
["x]y
使用x号寄存器.x可以是字母或数字.
3. 以Word为单位的移动
w/W ->
b/B <-
e/E ->
ge/gE <-
w与e的区别:w移动到词首,e移动到词尾
大写与小写的区别:大写对于边界的判断更少,移动得更远.
4. 以"行"为单位的移动
^ 移动行首第一个非空格的字符
5. 向上向下滚动半屏
CTRL-D
CTRL-U
6. 将当前行置于屏幕中间/顶部/底部
zz/zt/zb
7. 文本对象
aw iw 光标位置所在的一个单词
as is 光标位置所在的一个句子
aw: A Word 包含单词后的空格
iw: Inner Word 不包含单词后的空格
8. 多窗口编辑
:new 创建一个水平的新窗口
:vnew 创建一个垂直的新窗口
:close 关闭当前窗口
CTRL-W (hjkltb) 在窗口间移动
CTRL-W (HJKL) 移动当前窗口
vim -o 1.txt 2.txt 3.txt 使用多个窗口打开文件
如果已经在vim中,可以用:all 或者:vertical all横向或纵向平铺窗口
9. 寄存器操作
"*与"+ 寄存器代表系统剪贴板, 仅在gvim里有效.
宏也是保存在寄存器中,可以以文本形式编辑它
对大写寄存器的编辑就是对小写寄存器内容的追加
10. 命令作用范围
. 代表当前行, $ 代表最后一行
也可以增加偏移量,比如
:.+3,$-5
如用"mt"来标记一个范围的开始, "mb"标 记它的结束. 然后就可以这样指定这个范围:(包括标记本身所在的行)
:'t,'b
Visual模式的开始与结束也是一个标记,即'<和'>
11. 以数字指定行数
如果你已经知道要使命令使用于几行内容, 可以直接按下这个数字, 然后按":". 比如, 按下"5:", 你会看到:
:.,.+4
12. Visual Block的操作
在多行的行尾追加
选中Visual Block后按下$A
如果只是按下A,则不是行尾而是BLOCK后面
水平移动文本块
选中文本块后按下>,会使文本块右移一个shiftwidth
左移可以按<,但是如果没有空白区域,左移不会成功.
连接多行内容
选中文本块后按下J.如果要保留每行前后的空格,可以用gJ.
13. 读写部分文件
插入一个文件的内容到当前文件
:read a.txt 当前行
:$read a.txt 最后一行
:0read a.txt 第一行
向另一个文件中追加内容
:.write >>a.txt 追加当前行
14. 输入外部程序的结果
:[range]!{program}
将外部程序的运行结果替换到range的位置.
如果是对当前行操作,可以直接输入!!,显示为:
:.!date 在当前行插入时间
15. 重绘屏幕
CTRL-L
16. 使用vimdiff
启动比较:
命令行中: vimdiff 1.txt 2.txt
在vim中: [vertical] diffsplit 2.txt
使用patch: [vertical] diffpatch 1.txt.diff
同步滚动:
:set scrollbind
:set noscrollbind
跳到不同处:
]c 下一个不同,前面可以加数字
[c 上一个不同
同步文本
dp: diff put 复制到另一侧
do: diff obtain 从另一侧复制
折叠
zo: 打开折叠
zc: 关闭折叠
17. 在替换中匹配部分字符
例如:替换ABCDEFG_12345中的12345为54321
:s/ABCDEFG_/zs12345/ze/54321/g
/zs /ze 表示替换内容的开始和结束
18. 忽略搜索结果为空的错误,用于宏中:
:s/a/b/ge 最后的e忽略错误
19. 反序排列几行内容
:'t+1,.g/^/m 't 将标记为t的一行后至当前行的内容反序
20. 显示字数
g CTRL-g