something about vim
tricks
移动选中文本
1
vnoremap J :m '>+1<CR>gv=gv
1
vnoremap K :m '<-2<CR>gv=gv
使用正则排序
1
:sort r /reg/
将外部命令的输出读入缓冲区
1
:r !cmd
将缓冲区内容作为外部命令输入
1
:w !cmd
运行选中代码
1
:'<,'>!python
将当前文件转换为html文件
1
:%TOhtml
统计文件字节数,支持visual模式
1
g<C-g>
在insert模式下删除行首方向一个单词
1
<C-w>
在insert模式下删除到行首
1
<C-u>
在insert模式中重复上一行内容 / 下一行内容
1
<C-y> / <C-e>
在insert模式下执行一个normal命令
1
<C-o>{cmd}
底部命令行中输入当前光标单词
1
<C-r><C-w>
底部命令行中输入当前光标所在行内容
1
<C-r><C-a>
shell中挂起vim任务
1
<C-z>
shell中查看挂起的任务
1
jobs
shell中返回挂起的vim 任务
1
fg [n]
向文件尾方向移动30行 / 向文件头方向移动30行
1
30+ / 30-
跳转至上次关闭文件时,normal模式下光标所在行
1
'"
跳转至上次关闭文件时,insert模式下光标所在行
1
'^
insert模式中,重复上次insert模式中所作的所有操作
1
<C-a>
逆转文档内容
1
:g/^/m0
调试配置项
1
2# help :verbose
:verbose set background
正则
环视
顺序肯定环视
very magic
模式公式\vXYZ%(regexp)@=
1
2
3
4# magic 模式 匹配后面是`world`的`hello`
/hello\%\(world\)\@=
# very magic 模式 匹配后面是`world`的`hello`
/\vhello%(world)@=顺序否定环视
very magic
模式公式\vXYZ%(regexp)@!
1
2
3
4# magic 模式 匹配后面不是`world`的`hello`
/hello\%\(world\)\@!
# very magic 模式匹配后面不是`world`的`hello`
/\vhello%(world)@!逆序肯定环视
very magic
模式公式\v%(regexp)@<=XYZ
1
2
3
4# magic 模式 匹配前面是`hello`的`world`
/\%\(hello\)\@<=world
# very magic 模式 匹配前面是`hello`的`world`
/\v%(hello)@<=world逆序否定环视
very magic
模式公式\v%(regexp)@<!XYZ
1
2
3
4# magic 模式 匹配前面不是`hello`的`world`
/\%\(hello\)\@<!world
# very magic 模式 匹配前面不是`hello`的`world`
/\v%(hello)@<!world标记匹配起始/结束
\zs
,\ze
1
/\vhello\zsworld\ze
窗口管理
移动当前窗口位置
1
2
3
4
5
6
7" 将当前窗口移动到左边
<C-w>H
" 下/上/右
<C-w>J
<C-w>K
<C-w>L进入指定窗口
1
2
3
4
5" 进入最顶部窗口
<C-w>t
" 进入最底部窗口
<C-w>b旋转窗口
1
2
3
4
5" 第一个窗口 -> 第二个 -> 第三个 -> ... -> 第一个
<C-w>r
" 第一个窗口 -> 第n个窗口 -> 第n-1个 -> ... -> 第一个
<C-w>R将轮转文件拆分到另一个窗口
1
<C-w>^
创建一个新窗口,编辑新文件
1
<C-w>n
diff模式
指定两个文件
diff
在拆分的两个窗口中分别使用
:diffthis
,指定对两个窗口中的文件进行diff
。1
:diffthis
指定当前buff文件与某个新文件
diff
1
:diffsplit /path/to/newfile
关闭diff模式
1
:diffoff
冲突间移动
1
2
3
4" 移动至下一个冲突(文件尾部方向)
]c
" 移动至上一个冲突(文件首部方向)
[c冲突合并
1
2
3
4
5
6
7" 另一个文件 ---> 当前文件
" 意为`obtain`
do
" 当前文件 ---> 另一个文件
" 意为`put`
dpdiff
窗口管理与普通窗口管理相同
补全
退出补全
1
2" 退出补全菜单,恢复当次已补全内容
C-e确定补全
1
2" 选中补全菜单中当前条目,并接受
C-y
排版
居中
1
2
3
4" 居中当前文本行
:center
" 简写 :ce
:ce居左
1
2
3
4" 居左当前文本行
:left
" 简写 :le
:le居右
1
2
3
4" 居右当前文本行
:right
" 简写 :ri
:ri重排
1
2
3
4"对选中的文字重排,即对过长的文本行断行
gq
"重排当前行
gqq
编辑二进制
编辑二进制文件
1
2# 以-b模式启动,可以将文件认为是二进制的方式进行编辑打开
vim -b filename将当前缓冲区内容转为十六进制
比较大的问题是,由于是死板的转换,文末的
换行符
也会被转换为0a
。1
2" 借助于vim的外部工具xxd将内容转为十六进制
:%!xxd编辑好的十六进制内容转换为正常文本
1
:%!xxd -r
外部命令
调用外部命令
普通调用外部命令
1
:! ls
调用外部命令,输出追加到buffer
1
2" help read
:r ! ls调用外部命令处理缓冲区内容
buffer内容作为命令的
stdin
,处理结果输出回buffer1
:% ! sort
buffer
光标行居顶
可见区下移
1
zt
光标行居中
1
zz
光标行居底
可见区上移
1
zb
光标列居左
可见区右移
1
zL
光标列居右
可见区左移
1
zH
选项
modeline
在文件首/尾写入vim局部配置, 以注释方式如
1
# vim: set tabstop=2 shiftwidth=2 textwidth=120 expandtab :
scrolloff
设置vim渲染时,buffer顶部/底部预留行数