vim高级使用
1、寄存器
vim提供了几十组寄存器,用于保存文本
为命令添加 "{register} 表示指定要使用的寄存器。若不指定,将缺省用unnamed无名寄存器,即(")
"x 表示引用了寄存器x
a-z: 都可以用作寄存器名。"ayy把当前行的内容放入a寄存器。
A-Z: 用大写字母索引寄存器,可以在寄存器中追加内容。 如"Ayy把当前行的内容追加到a寄存器中。
:reg[ister] 查看{register}中的内容
"0 复制专用寄存器 (复制的时候,不仅会把内容拷贝到无名寄存器中,还会拷贝到此寄存器),来源为yy命令
"1-"9 删除缓存,来源为dd命令
"a-"z 自定义的寄存器,不会被系统自动冲刷,总是存储最后一次使用的值。
"A-"Z : 向"a-"z寄存器中追加新内容而不是覆盖,虽然"A-"Z本身不是寄存器,但是却可以引用。
"ayy 复制当前行并将其存放在"a寄存器中
"_ 黑洞寄存器(实际上并没有存储,如果"_d{motion}会执行真正的删除),只进不出
"" unnamed 无名寄存器,如果没有指定要使用的寄存器,vim会缺省使用此寄存器,文本来源命令d/c/s/x/y
"*: 当前选择缓冲区,"*yy把当前行的内容放入当前选择缓冲区。
"+: 系统剪贴板寄存器 (使用"+p来粘贴系统剪贴板的内容)(X11剪切板,用剪切、复制与粘贴命令操作)。vim安装时需安装clipboard才能使用此功能
"= 表达式寄存器.在插入模式下ctrl+r= ,会进入命令行模式,输入表达式回车之后的结果将插入文本中
"% 存储了当前文件名
"# 存储了轮换文件名 编辑两个文件1.txt 2.txt切换到第二个文件,此时该寄存器标识上一个文件名
". 存储了上次插入的文本
": 存储了上次执行的Ex命令
"/ 存储了上次查找的模式
’%’、’:’ 和 ’.’为只读寄存器。你只能在 "p"、"P"、":put" 命令和 CTRL-R 的时候使用它们
使用示例:
"fyy 将复制的内容存储到f寄存器
"fp 将f寄存器中的内容粘贴出来
"ay2+ 复制当前行及下面2行(共3行)到a寄存器
"ay’a 复制光标所在行到标记a所在行之间的内容,包括光标和标记所在的行
"ap 将a寄存器中的内容粘贴出来
:1,10 y a(将1到10行这几行的内容拷贝到一个名字为a的buffer中)
:put a(将buffer a中的内容拷贝到当前位置)。
在插入模式,当我们按下CTRL + R键,再加上相应的寄存器的名字,可以插入寄存器中的内容,按=时,会在命令行出现=,输入表达式,会将表达式的计算结果插入光标处
2、宏
把命令序列录制成宏,在normal,q键开始/停止录制宏。
开始录制:
q{register} 表示指定将宏录制到哪个寄存器中
停止录制:
再次按q,停止录制
播放:
@{register} 表示执行寄存器中的命令
宏寄存器内容追加:
qa 录制按键操作,并覆盖a寄存器中原有内容
qA 录制按键操作,并追加到a寄存器中
@@ 重复最近调用过的宏
100@@ 重复播放 100 上次的宏
[count]@{register} 执行count次宏,串行方式;遇到错误,就返回
:'<,'>normal @{register} 并行
:reg {register} 查看寄存器中的内容,但不列出用于:redir目的地的寄存器。
在插入模式中,插入寄存器中的内容:
ctrl+r{register} 将寄存器中的内容插入到文本中
编辑宏:宏中使用的是键盘编码,如果使用ctrl-r{register}的方式获取的寄存器内容不一样。不过,可以使用将寄存器中的内容粘贴出来的方式。
输出到文本中编辑
"{register}p 会粘贴到光标后,所以要用:put 输出到下一行
:put {register}将寄存器内容输入到文本中,编辑完成之后,跳到行首,通过"{register}y$,复制到寄存器中,或进入可视模式,选中需要的内容,再输入d,将内容添加到寄存器中。
:let @{register}=...... 使用函数编辑寄存器内容
如果我们希望创建一个以插入模式结束的宏,则必须以另一种方式结束该宏(键入“q”将仅插入字母q)。我们可以在插入模式下执行普通模式命令CTRL-O,然后键入“q”来结束宏的录制。
3、编译
vim提供了:make来编译程序,默认调用的是make, 如果你当前目录下有makefile,简单地:make即可。
如果你没有make程序,你可以通过配置makeprg选项来更改make调用的程序。 如果你只有一个abc.java文件,你可以这样设置:
set makeprg=javac\ abc.java
然后:make即可。如果程序有错,可以通过quickfix窗口查看错误。 不过如果要正确定位错误,需要设置好errorformat,让vim识别错误信息。 如:
:setl efm=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
%f表示文件名,%l表示行号, %m表示错误信息,其它的还不能理解。 请参考 :help errorformat。
4、quickfix用法
:cw 如果有信息列表,则打开quickfix窗口;否则什么也不做
:cl 列出所有信息
:cc 显示详细信息
:cp 跳到上一项
:cn 下一项
:cr 定位到第一个项。
:copen 打开quickfix窗口,可添加窗口高度参数,单位为行
:cclose 关闭quickfix窗口
:cold[er] 到前一个旧列表
:cnew 到后一个新列表
quickfix-list vs location-list
quickfix list 是全局的,相对于窗口而言,不同的窗口共用一个 quickfix list,可以使用 :cw 或者 :copen 打开;而 loaction list 是局部于某个特定窗口的,即不同窗口的 location list 可以不同,使用 :lw 或者 :lopen 命令打开。
5、Vim 补全模式
参考:http://bluegene8210.is-programmer.com/posts/27873
K 模式 (Vim 默认: CTRL-X CTRL-K) -- 字典补全,查找字典文件中的匹配单词,组成补全列表
H 模式 (Vim 默认: CTRL-X CTRL-T) -- 分类补全,查找分类文件(thesaurus 文件)中的匹配单词,组成补全列表
S 模式 (Vim 默认: CTRL-X s) -- 拼写建议
O 模式 (Vim 默认: CTRL-X CTRL-O) -- 全能补全,由一个自定义函数生成补全列表
U 模式 (Vim 默认: CTRL-X CTRL-U) -- 自定义补全,也是由自定义函数生成补全列表
n 模式 (Vim 默认: CTRL-N) -- 关键字补全,查找 'complete' 选项指定文件中的匹配单词,组成补全列表
N 模式 (Vim 默认: CTRL-X CTRL-N) -- 关键字补全,查找当前 buffer 里的匹配单词,组成补全列表
p 模式与 P 模式,分别与 n 模式和 N 模式相同,只是补全列表中候选词的排序相反。
T 模式 (Vim 默认: CTRL-X CTRL-]) -- tag 补全,查找 tag 中的匹配单词,组成补全列表
I 模式 (Vim 默认: CTRL-X CTRL-I) -- 头文件补全,查找当前 buffer 和 include file 中的匹配单词,组成补全列表
D 模式 (Vim 默认: CTRL-X CTRL-D) -- 定义补全,查找当前 buffer 与 include file 中匹配的名称定义,组成补全列表
V 模式 (Vim 默认: CTRL-X CTRL-V) -- Vim 补全,查找 Vim 的命令名, 函数名等等,组成补全列表
F 模式 (Vim 默认: CTRL-X CTRL-F) -- 文件名补全,查找匹配的路径或文件名,组成补全列表
L 模式 (Vim 默认: CTRL-X CTRL-L) -- 整行补全,查找 'complete' 选项指定文件中匹配的整行内容,组成补全列表
6、redir 重定向
vim中把命令输出(譬如::version, :cl的输出)保存下来
:redir @a> "重定向到寄存器a中
:redir > 1.txt "重定向到文件
:redir END "结束重定向