Vim KeyMapper CMD
Vim模式
Normal模式
Insert模式
Visual模式
Quickfix模式
quickfix模式主要思想时保存一个位置列表,然后提供一系列命令, 实现在这个位置列表中的跳转
位置列表来源
- 编译器输出信息
grep命令输出信息(cscope命令):vimgrep命令
quickfix中常用的命令有
:copen/:cw:打开quickfix模式窗口:cclose:关闭quickfix窗口:cc:显示详细错误信息:cp:跳至下一个错误:cn:跳至上一个错误:cl:列出所有错误:cw:如果有错误列表,则打开quickfix窗口:colder/col:到前一个旧错误列表:cnewer/cnew:到后一个新错误列表
Ex模式
底层编辑模型,normal下Q进入
Paste模式
Motion快捷键
normal模式下移动,visual模式下选取,无特殊说明visual和normal 模式通用
固定移动
基本
hjkl:左、上、下、右gj/gk:虚上、虚下(光标移动排版意义上行) (可以尝试noremap交换和j/k的逻辑方便使用)M:窗口中间行首各非空白字符H/L:窗口顶/底scrolloff处行首各非空白字符<c-i>/<c-o>:跳至下一个/上一个编辑处 (可以跨文件)
行内
w:下个单词开头aw:整个单词b/e:当前单词首/尾W/B:下/上个非空格开头E: 下个非空格结尾g_:行尾,visual模式下不包括换行符$:行尾,visual模式下包括换行符0:行首^:非空白字符行首|:当前行第一列<int>|:当前行第n列(不是字符)
全文
gg:文件首G:文件尾<int>G:第<int>行'<:之前visual模式选取起始行(一直保存直至下次选取)'>:之前visual模式选取结束行{/}:下/上一个空行.:当前行%:全文选取???
组合
这些快捷键的效果取决于当前状态
行内
f/F:向前/后移动到某字符(;、,同向、反向重复)t/T:till,向前/后移动到某字符前i:在某个区域((), [], {}, w等)内(显然不能单独用 于normal)
全文
//?:命令行向前、向后查找(n、N同向、反向重复)*/#:向前、向后查找当前单词g*/g#:向前、向后查找当前字符串,包括非单独单词
Operation快捷键
对区域进行操作可以和motion连用
内容修改
插入
i:insert进入insert模式I(normal):行首insert进入insert模式I(visual block):选中区域同时插入a:add进入insert模式A:行尾add进入insert模式<c-e>:insert模式下复制下行当前位置字符至当前行
删除
d:删除选取区域c:删除(修改)选中区域,进入insert模式x/X:删除当前/前一个字符s:删除字符,进入insert模式dd:删除当前行D:normal模式删除当前位置至行尾<c-h>/<m-h>:insert模式backspace
复制、粘贴
["<reg>]y:复制选中区域至寄存器<reg>,默认"<reg>yy:复制当前行["<reg>]p:粘贴"<reg>寄存器中内容,默认"<reg>
其他
J:合并下一行,<space>分隔u/U(visual):转换为小、大写~(normal):当前字符大、小写切换(光标移动至下个字符)~(visual):选中区域大、小写切换gu/gU(normal):区域转换为小、大写g~:区域大、小写切换[num]>/<:右/左移动区域num个shiftwidth单位=:区域格式化(修改为标准缩进)<c-d>/<c-i>:insert模式减少/增加缩进gc(visual/normal):选中区域按行注释/取消注释 (应该是按vim的filetype确定注释格式)<c-a>/<c-x>:将光标下数字增加/减少1,支持多种进制
功能性
记录
q<reg>:宏记录,记录行为于寄存器<reg>中,按下q则 停止记录@<reg>:调用寄存器<reg>中的宏操作(不一定是q<reg>记录的结果)m<char>:记录当前位置于<char>中(不是寄存器中未知)`\:回到<char>中记录的位置
撤销、redo
.:重复上一个操作u:撤销上一个操作<c-r>:继续执行,撤销u<c-m>:等同于<cr>
外部功能
K:对当前单词调用keywordprg设置的外部程序,默认“man”
Diff
]c/[c:比较窗口中移至下个不同的为止do/dp:将当前比较窗口中不同区域,同步为/至另一个 窗口该位置
其他
q::vim命令历史窗口
界面变动
窗口
Window
<c-w-h/j/k/l>:切换至左/下/上/右窗口<c-w-w>:轮换窗口(切换活动窗口)<c-w-t/b/p>:切换至最左上/右下/前个窗口<c-w-+/->:竖直方向扩展/收缩当前窗口<c-w->/<>:水平方向扩展/收缩当前窗口<c-w-=>:恢复当前窗口高度<c-w-H/J/K/L>:移动窗口至tab左/下/上/右,占据全部高/宽<c-w-T>:移动窗口至新tab<c-w-r/x>:交换窗口位置(具体逻辑未知)ZZ:保存退出ZQ:放弃保存退出
Tab
[n]gt/gT:下/上一个tab;第n个tab
内容
折叠
foldmethod=marker:{{{`、`}}}标记折叠区域(各花括号之间无空格)zf:创建折叠(在选中区域前后添加标记)zf[n]G:创建当前行至第n行折叠[n]zf[+]:创建当前行至后n行折叠[n]zf[-]:创建当前行至前n行折叠
zd:删除 包含 当前位置折叠zD:递归 删除包含当前位置折叠、及子折叠zE:删除窗口中所有折叠za:折叠 togglezo:折叠展开zc:折叠
foldmethod=indent:缩进标记折叠zc:折叠zC:递归 折叠zo:展开折叠zO:递归展开折叠[z:移至当前折叠开始]z:移至当前折叠末尾zj:移至下个折叠开始(包括关闭折叠)zk:移至上个折叠结束(包括开闭折叠)zm:提高折叠水平,即依次折叠当前最高水平缩进zr:降低折叠水平,即依次展开当前最高水平缩进zn:禁用折叠zN:启用折叠
foldmethod=manual:手动折叠zf<range>:折叠选中区域zf70j:折叠之后70行zfa(:折叠(包围区域
mkview:保存折叠状态loadview:载入折叠状态
Vim Cmd常用命令
内容相关
查找
//?
:/foo向下查找,:?foo向上查找
set ingorecase时,不敏感查找;set smartcase时,如果 查找中有大写字符则敏感;:/foo\c手动强制大小写不敏感,:/foo\C强制敏感n、N重复同向、反向之前查找
:vimgrep
文件间搜索
1 | :vim[grep] /pattern/[g][j] files |
选项
g:全局匹配(匹配每行全部)j:查找完毕后,进更新quickfix列表,光标不跳转
files%:当前文件*:当前目录**/*:仅子目录**/xxxx:当前目录及子目录所有满足xxxx模式文件pattern:满足pattern的文件
global
- 在
[range]范围(默认整个文件)中查找{pattern},标记 匹配行 - 对匹配行执行命令
{command}(默认print命令)- 若标记行在被操作之前已经被删除、移动、合并等而消失, 则不对器执行操作
1 | :[range]g[lobal][!]/{pattern}/{command} |
- 选项
[!]:对不匹配者执行草在
1 | :g/^/m 0 |
替换
:s
1 | :[start,end]s/foo/bar[/i][I][g] |
- 替换区域:默认只替换当前行
- 手动指定具体行号:
:2,4s/foo/bar(左闭右开) - 特殊符号
- 全文替换
%::%s/foo/bar - 第一行
^::^,4s/foo/bar - 当前行
.::.,6s/foo/bar - 末尾行
$::4,$s/foo/bar
- 全文替换
- visual模式下,手动选择区域命令行自动补全为
:'<,'>
- 手动指定具体行号:
- 替换标志
- 大小写不敏感
/i、\c::%s/foo/bar/i或:%s/foo\c/bar - 大小写敏感
/I、\C:%s/foo/bar/I或:%s/foo\C/bar - 全局替换
/g(替换每行全部模式)::%s/foo/bar/g- 默认情况下只替换首个模式:
foo,foobar被替换为bar,foobar - 全局替换模式下:
foo,foobar被替换为bar,barbar
- 默认情况下只替换首个模式:
- 大小写不敏感
- 交互(确认)替换:
:%s/foo/bar/c,每次替换前会询问 - 超级变量
&:代表被替换模式字串
文本移动
>/<
1 | :[range]> |
- 范围内文本块右、左移动1个
shiftwidth - 移动num个
shiftwidth添加num个>/<
move
1 | :[range]m[ove] [n] |
- 移动范围内行至第
[n]行后
1 | :m0 |
t
1 | :[range]t [n] |
- 复制范围内至第
[n]行后
1 | :t. |
文件相关
放弃修改、重新加载、保存
:w[rite]:保存此次修改:e!:放弃本次修改(和:q!不同在于不会退出vim):bufdo e!:放弃vim所有已打开文件修改:e:重新加载文件:e#:当前窗口加上个buffer(反复切换):bufdo e:重新加载vim所有已打开文件:saveas new_file_name:另存为,不删除原文件:sb[n]:split窗口加载第n个buffer:b[n]:当前窗口加载第n个buffer:n[n]:当前窗口加载下/第n个buffer
Window
:sp[lit]:水平分割当前窗口,展示当前文件:vs[plit]:竖直分割当前窗口,展示当前文件:new:水平分割当前窗口,新文件:vnew:竖直分割当前窗口,新文件:sview:水平分割当前窗口,只读[缺省当前]文件:[n]winc >/<:水平方侧扩展/收缩:[n]winc +/-:竖直方向扩展/收缩:res+/-[n]:竖直方向扩展/收缩:vertical res+/-[n]:水平方向扩展/收缩:ressize[n]:高度设置为n单位:vertical res[n]:宽度设置为n单位:q[uit][!]:退出当前窗口!:强制退出,修改不保存
:close:关闭当前窗口(不能关闭最后窗口):only:关闭其他窗口:qa:退出所有窗口:wq:保存、退出当前窗口:x:类似于wq,但是未修改则不写入
注:
- 水平方向:扩张优先左侧变化,收缩右侧变化
- 竖直方向:扩展收缩均优先下侧变化
Tab
:tabnew [opt] [cmd] [file_name]:打开新tab:tabc:关闭当前tab:tabo:关闭其他tab:tabs:vim cmd区域查看所有打开的tab信息:tabp:查看前一个tab:tabfirst/:tablast:第一个/最后一个tab:tabn [num]:查看下一个/第num个tab
Diff
:diffsplit [filename]:上下分割窗口和当前窗口比较- 默认同当前文件进行diff
:difft:将当前窗口变为比较窗口- 若没有其他比较窗口,则没有明显变化
- 若存在其他比较窗口,则加入比较
:diffu[pdate][!]:更新当前比较窗口- 比较状态下修改当前文件后,重新生成比较信息
!:重新载入文件后更新(外部修改文件)
:diffo[!]:关闭当前窗口比较状态!:关闭所有窗口比较状态
Session
:mksession[!] <session-file-name>:将当前状态写入 session 文件:source <session-file-name>:载入已有 session 文件
其他
多行语句
“|”管道符可以用于隔开多个命令:echom "bar" | echom "foo"
:vertical
:vertical基本可以用所和窗口有关命令之前,表示左右(分割)
:vert split/:vs:左右分割窗口:vert sb[n]:左右分割窗口载入buff[n]:vert diffs file_name:左右分割窗口diffs:vert res +/-[n]:调整窗口大小
其他CMD命令
编辑过程中使用shell
:!{shell command}即可直接执行shell命令并暂时跳出vim:r !{shell command}可以将输出结果读取到当前编辑:w !{sheel command}可以将输出结果输出到vim命令行
:shell即可暂时进入到shell环境中,$exit即可回到vim中<c-z>暂时后台挂起vim回到shell环境中,$fg即可回到之前 挂起的进程(此时为vim,详见fg命令)
读取结果
:read cmd:读取cmd结果至光标下一行:read !date:读取系统date命令结果
交换文件处理
确认需要恢复:直接恢复
R确认丢弃:直接删除
D没有明确目标:只读打开
O比较交换文件、现在文件差别
- 恢复打开
R - 另存为其他文件
:saveas filname.bak - 与当前文件对比
:diffsplit filename
- 恢复打开
一般不会直接
E(edit anyway)
Vim命令行参数
vim
$ vim [filname]:打开一般窗口-r [filename]:常看交换文件(特定文件对应交换文件)-R [filename]:只读方式打开文件-S session-file:打开session的方式启动vim- 需要
:mksession[!] <session-file>先创建 session 文件
- 需要
vimdiff
$ vimdiff [file1] [file2]:打开比较窗口-u:合并模式比较-c:上下文模式比较
- 后面两个模型可常用于输出重定向至新文件
Vim KeyMapper CMD

