|
先上两张图,再给文字说明。第一张,综合图。 光标移动说明图: ??
快捷键默认为Normal模式,即按<ESC>后的状态。<c-*>代表Ctrl+*
1. 查看
1.1 基础移动
| 按键 | 作用 |
|---|
h/j/k/l | 左,下,上,右 | w/e/b | 下一个词的词首 / 下一个词的词尾 / 上一个词的词首 | W/E/B | (以空格为分隔)下一个词的词首 / 下一个词的词尾 / 上一个词的词首 | </> | visual 模式 选中后进行缩进 |
1.2 翻屏、跳转
| 按键 | 作用 |
|---|
% | 在成对的{}/[]/()之间跳转 | H/M/L | 跳转到当前屏幕的顶部、中部、底部 | #L | 跳转到当前屏的第#行 | zt/zz/zb | 当前编辑行置为屏顶/屏中/屏底 | gg/G | 跳转到文件的开头/底部 | (/) | 跳转到当前的行首、行尾 | {/} | 向上、向下跳转到最近的空行 | [{/}] | 跳转到目前区块开头、结尾 | 0/$/^ | 跳转到行首/本行第一个非空白字符/行尾,#$可跳到本行后第#号行的行尾 | :#/#G | 跳到第#行 | <c-b> / <c-f> | 向前/后一页,第一个组合按键为Ctrl+b | <c-u> /<c-d> | 向前/后半页 | <c-e>/ | 向下/上滚一行 |
1.3 选择
| 按键 | 作用 |
|---|
V | 选择一行 | <c-v> | 矩形选择 | v3w | 从光标起选择三个字符,其中v代表从Normal模式进入Visual模式 |
2. 编辑
2.1 新增
| 按键 | 作用 |
|---|
i/I | 光标前/当前行首插入 | a/A | 光标后/当前行尾插入 | o/O | 当前行后/当前行前插入 | :r filename | 在当前位置插入filename内容 | :r! command | 在当前位置插入在shell执行command的结果,如:r! date在当前位置插入时间 |
2.2 修改 c(change)
| 按键 | 作用 |
|---|
r/R | 修改光标下字符/修改光标所到之处的字符(相当于按了Insert键) | cw/c#w/C | 更改光标所在处的字到字尾处 / 修改#个字符 / 修改到行尾 | ci'/ di'/yi'/vi' | 修改/删除/复制/选中`配对标点符号中的文本内容 | s/#S | 删除当前光标处字符 / 删除 # 行,然后进入Insert 模式 |
2.3 删除 d(delete)
| 按键 | 作用 |
|---|
#x/#X | 剪切光标右边/左边n个字符,相当于d[n]l/d#h | D/d$/d^ | 删除到行尾/行尾/行首 | dw/daw/d#w | 删除光标处单词结束/光标处单词结束(含单词后空格)/删除#个单词 | #dd | 删除光标所在行起#行 | diB/daB | 删除{}中的内容 / 删除{}及其内的内容 | :m,n d | 将m-n行之间的内容剪切到粘贴板 | dgg/dG | 剪切光标以上/下所有行 |
2.4 查找 f(ind)
| 按键 | 作用 |
|---|
f‘n’/F'n' | 跳转到光标后第一个/上一个字符’n’ (配合;/,,正向/反向重复查找) | t‘n’/T'n' | 跳转到光标后第一个/上一个字符’n’之前 (配合;/,,正向/反向重复查找) | //? | 向后/前搜索关键字,之后可匹配n/N向后/前找下一个关键字 | */# | 以光标所在位置的单词为关键字,向后/前搜索下一个关键字 |
2.5 复制 y(yank)
| 按键 | 作用 |
|---|
yw/#yw | 复制到当前词尾 / 复制光标起#个词 | Y/yy/#yy | 复制当前行 / 复制当前行 / 从当前行起复制#行 | p | 粘贴 | :m,ny | 复制当前文件m-n行的内容 | ygg/yG | 复制光标以上/下所有行 | yaw/yas | 复制一个词和复制一个句子,即使光标不在词首和句首也没关系,其中a代表around |
2.6 替换 r(place)
语法 {范围}s/{匹配模式}/{目标字符串}/{选项}
范围:指生效范围
%:代表整个文件n1,n2:代表只在n1到n2行之间生效.:当前行,{范围}为空时使用此情况0: 最开始一行(可能是这样)。$: 最后一行 s:指substitue,替换匹配模式:可为字符串或正则表达式目标字符串:要替换为的字符串选项:
- 常用项
g/c/n,分别代表全局/替换要确定/(不替换)只统计匹配次数 - 为空,则只替换第一个匹配到的项
2.7 大小写转换 u(ppercase)
| 按键 | 作用 |
|---|
~ | 大小写转换 | u/U | Visual模式下,将选中的字符变为小写/大写 | g[u|U]{范围} | 将范围内的字符改为小写/大写,见表格后 |
g[u|U]{范围}示例:
gUU/guu:将当前行的字母改为大写 /小写gUw/guw:将当前光标下的单词改为大写 /小写gU$/gu$:将到行尾的词改为大写 /小写
2.8 撤消与重做(normal模式)
| 按键 | 作用 |
|---|
[#]u | 取消#个改动 | :undo 5 | 撤销5个改变 | :undolist | 你的撤销历史 | <c-r> | 重做最后的改动 | U | 取消当前行中所有的改动 | :earlier 4m | 回到4分钟前 | :later 55s | 前进55秒 |
3. 编程辅助
3.1 基本按键
| 按键 | 作用 |
|---|
gd/gD | 跳转到局部/全局变量的定义处,搜索全局变量时从当前文件开头开始搜索 | K | 在新窗口中显示当前光标所在函数的帮助文档 | g;/g, | 上一个/下一个修改过的地方 | [[/[] | 跳转到上一个函数块开始/结束,需要有单独一行的{ | ]]/][ | 跳转到下一个函数块开始/结束,需要有单独一行的{ | [{/]} | 跳转到当前块开始/结束 | [//]/ | 跳转到当前注释块开始/结束 | % | 不仅能移动到匹配的(),{}或[]上,而且能在#if,#else, #endif之间跳跃 |
3.2 ctags
ctags -R: 生成tag文件,-R表示也为子目录中的文件生成tags
| 按键 | 作用 |
|---|
:set tags=path/tags | 告诉ctags使用哪个tag文件 | :tag xyz | 跳到xyz的定义处,或者将光标放在xyz上按C-],返回用C-t | :stag xyz | 用分割的窗口显示xyz的定义,或者C-w ], 如果用C-w n ],就会打开一个n行高的窗口 | :ptag xyz | 在预览窗口中打开xyz的定义,热键是C-w } | :pclose | 关闭预览窗口。热键是C-w z | :pedit abc.h | 在预览窗口中编辑abc.h | :psearch abc | 搜索当前文件和当前文件include的文件,显示包含abc的行 |
有时一个tag可能有多个匹配,如函数重载,一个函数名就会有多个匹配。 这种情况会先跳转到第一个匹配处。
| 按键 | 作用 |
|---|
:[#]tnext | 下一[#]个匹配。 | :[#]tprev | 上一[#]个匹配。 | :tfirst | 第一个匹配 | :tlast | 最后一个匹配 | :tselect tagname | 打开选择列表 |
tab键补齐
| 按键 | 作用 |
|---|
:tag xyz<tab> | 补齐以xyz开头的tag名,继续按tab键,会显示其他的 | :tag /xyz<tab> | 会用名字中含有xyz的tag名补全 |
3.3 cscope
cscope -Rbq: 生成cscope.out文件
| 按键 | 作用 |
|---|
:cs add {/path/to/cscope.out} {/your/work/dir} | | :cs find c {func} | 查找函数func在哪些地方被调用 | :cw | 打开quickfix窗口查看结果 |
3.4 gtags
Gtags综合了ctags和cscope的功能。 使用Gtags之前,你需要安装GNU Gtags。 然后在工程目录运行 gtags 。
| 按键 | 作用 |
|---|
:Gtags {funcname} | 定位到 funcname 的定义处。 | :Gtags -r {funcname} | 查询 funcname被引用的地方。 | :Gtags -s {symbol} | 定位 symbol 出现的地方。 | :Gtags -g {string} | Goto string 出现的地方。 :Gtags -gi string 忽略大小写。 | :Gtags -f {filename} | 显示 filename 中的函数列表。 你可以用 :Gtags -f % 显示当前文件。 | :Gtags -P {pattern} | 显示路径中包含特定模式的文件。 如 :Gtags -P .h$ 显示所有头文件, :Gtags -P /vm/ 显示vm目录下的文件。 |
3.5 编译
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
3.6 快速修改窗口
其实是quickfix插件提供的功能, 对编译调试程序非常有用 😃
| 按键 | 作用 |
|---|
:copen | 打开快速修改窗口 | :cclose | 关闭快速修改窗口 |
快速修改窗口在make程序时非常有用,当make之后:
| 按键 | 作用 |
|---|
:cl | 在快速修改窗口中列出错误 | :cn | 定位到下一个错误 | :cp | 定位到上一个错误 | :cr | 定位到第一个错误 |
3.7 自动补全
| 按键 | 作用 |
|---|
<c-x> <c-s> | 拼写建议 | <c-x> <c-v> | 补全vim选项和命令 | <c-x> <c-l> | 整行补全 | <c-x> <c-f> | 自动补全文件路径。弹出菜单后,按C-f循环选择,当然也可以按<c-p>和<c-n> | <c-x> <c-p>/<c-x> <c-n> | 用文档中出现过的单词补全当前的词。 直接按<c-p>和<c-n>也可以 | <c-x> <c-o> | 编程时可以补全关键字和函数名,需要安装vim插件 | <c-x> <c-i> | 根据头文件内关键字补全 | <c-x> <c-d> | 补全宏定义 |
当弹出补全菜单后:
| 按键 | 作用 |
|---|
<c-p> /`` | 向前/向后切换成员 | C-e | 退出下拉菜单,并退回到原来录入的文字 | C-y | 退出下拉菜单,并接受当前选项 | | |
3.8 多行缩进缩出
Normal模式下,按两下>,光标所在行会缩进。 如果先按了数学n,再按两下>,光标以下的n行会缩进。 对应的,按两下<,光标所在行会缩出。
在Visual模式下,选择要调整的代码块,按=,代码会按书写规则缩排好。 或者n =,调整n行代码格式。
3.9 折叠
| 按键 | 作用 |
|---|
zf/a/p | 创建折叠的命令,可以在一个可视区域上使用该命令 | zd/zD | 删除当前行的折叠 | zfap | 折叠光标所在的段 | zo | 打开折叠的文本 | zc | 收起折叠 | za | 打开/关闭当前折叠 | zr | 打开嵌套的折行 | zm | 收起嵌套的折行 | zR/zO | 打开所有折行 | zM /zC | 收起所有折行 | zj/zk | 跳到下/上一个折叠处 | zi | 开启/关闭折叠功能 |
4. vim通用高级编辑功能
4.1 文本块
汇总文本块用法 a代表around,i代表in
| 按键 | 作用 |
|---|
aw/iw | 一个词(含/不含左右符号) | as/is | 一句,以空格分隔(含/不含左右空格) | ap | 一段,以空行分隔 | ab | 一块(包含在圆括号中的) |
y/d/c/v都可以跟文本对象组合使用
例如: ci’, di’, yi’:修改、剪切或复制’之间的内容。 ca’, da’, ya’:修改、剪切或复制’之间的内容,包含’。 ci", di", yi":修改、剪切或复制"之间的内容。 ca", da", ya":修改、剪切或复制"之间的内容,包含"。 ci(, di(, yi(:修改、剪切或复制()之间的内容。 ca(, da(, ya(:修改、剪切或复制()之间的内容,包含()。 ci[, di[, yi[:修改、剪切或复制[]之间的内容。 ca[, da[, ya[:修改、剪切或复制[]之间的内容,包含[]。 ci{, di{, yi{:修改、剪切或复制{}之间的内容。 ca{, da{, ya{:修改、剪切或复制{}之间的内容,包含{}。 ci<, di<, yi<:修改、剪切或复制<>之间的内容。 ca<, da<, ya<:修改、剪切或复制<>之间的内容,包含<>。
4.2 书签(bookmark)、标记
| 按键 | 作用 |
|---|
m{a-z} | 标记光标所在位置,局部标记,只用于当前文件,可以有26个标记位置 | m{A-Z} | 标记光标所在位置,全局标记。标记之后,退出Vim, 重新启动,标记仍然有效 | | `{a-z} | 移动到标记位置 | '{a-z} | 移动到标记行的行首 | | `` | 在当前编辑位置与上次编辑位置之间来回跳转 | <c-i>/<c-o> | 跳到历史位置/更新位置,可无限回溯 | :marks | 显示所有标记 | :delmarks a c-f/:delmarks! | 删除标记a、c、d、e、f / 删除所有标记 |
4.3 寄存器 register
寄存操作以"开头,在Normal模式下,以"{寄存器名}{操作}的格式使用寄存器。 寄存器可用于保存代码片断。
| 寄存器说明 | 作用 |
|---|
a-z | 都可以用作寄存器名。"ayy把当前行的内容放入a寄存器 | A-Z | 用大写字母索引寄存器,可以在寄存器中追加内容。 如"Ayy把当前行的内容追加到a寄存器中 | :reg | 显示所有寄存器的内容 | "" | 不加寄存器索引时,默认使用的寄存器 | "* | 当前选择缓冲区,"*yy把当前行的内容放入当前选择缓冲区 | "+ | 系统剪贴板。"+yy把当前行的内容放入系统剪贴板 |
4.4 宏 macro
| 按键 | 作用 |
|---|
. | Normal模式下,重复上一个编辑动作 | q{a-z} | 开始录制宏,编号为字母a-z之一 | q | 停止录制 | @{a-z | 播放编号为{a-z}宏 |
5. 多文件操作
5.1 多文件基本操作
vi a.txt b.txt c.txt
多文件操作多在命令模式下使用
| 命令 | 作用 |
|---|
:#n[ext] | 编辑下#个文件 | :previous/:N | 编辑上一个文件 | :wnext | 保存当前文件,并编辑下一个文件 | :wprevious | 保存当前文件,并编辑上一个文件 | :args | 显示文件列表 | :n filenames/:args filenames | 指定新的文件列表 | vi -o filenames | 在水平分割的多个窗口中编辑多个文件(vim外的shell命令行中) | vi -O filenames | 在垂直分割的多个窗口中编辑多个文件(vim外的shell命令行中) | :wq filename | 将编辑内容保存到文件filename,并退出 | :e/:e!/:e filename | 重载当前文件/ 重载当前文件并放弃修改 / 打开文件filename | :f filename/:saveas filename | 另存为filename | e#/<c-^> | 回到上一个编辑的文件 | :f/<c-g> | 在状态栏显示当前文件名 |
5.2 多标签操作(很少用)
| 命令 | 作用 |
|---|
vim -p files | 打开多个文件,每个文件占用一个标签页 | :tabe/tabnew | 如果加文件名,就在新的标签中打开这个文件, 否则打开一个空缓冲区 | :tabn/Control + PageDown | 切换到下一个标签 | :tabp/Control + PageUp | 切换到上一个标签 | [#]gt | 切换到下一个标签。如果前面加了 #, 就切换到第#个标签。序号起始为1 | :tab split | 将当前缓冲区的内容在新页签中打开 | :tabc[lose] | 关闭当前的标签页 | :tabo[nly] | 关闭其它的标签页 | :tabs | 列出所有的标签页和它们包含的窗口 | :tabm[ove] [N] | 移动标签页,移动到第N个标签页之后。 如 tabm 0 当前标签页,就会变成第一个标签页 |
5.3 缓冲区
一个缓冲区保存一个打开的文件
| 命令 | 作用 |
|---|
:buffers/:ls/:files | 显示缓冲区列表 | ctrl+^ | 在最近两个缓冲区间切换 | :bn | 下一个缓冲区 | :bp | 上一个缓冲区 | :bl | 最后一个缓冲区 | :b[n]/:[n]b | 切换到第n个缓冲区 | :nbw[ipeout] | 彻底删除第n个缓冲区 | :nbd[elete] | 删除第n个缓冲区,并未真正删除,还在unlisted列表中 | :ba[ll] | 把所有的缓冲区在当前页中打开,每个缓冲区占一个窗口 |
6. 窗口操作
| 命令 | 作用 |
|---|
vim -o file1 file2 | 水平分割窗口,同时打开file1和file2 | vim -O file1 file2 | 垂直分割窗口,同时打开file1和file2 |
6.1 水平分割
| 命令 | 作用 |
|---|
:sp[lit]/<c-w> s/ <c-w> <c-s> | 把当前窗水平分割成两个窗口。注意,<c-s>可能会冻结终端,请按<c-q>继续 | :sp[lit] filename | 水平分割窗口,并在新窗口中显示另一个文件 | :[#]sp[lit] | 水平分割出一个#行高的窗口 | :[#]new/<c-w> n/<c-w> <c-n> | 水平分割出一个#行高的窗口,并编辑一个新文件。 | ctrl+w f | 水平分割出一个窗口,并在新窗口打开名称为光标所在词的文件 |
6.2 垂直分割
| 命令 | 作用 |
|---|
:vs[plit]/ v | /<c-w> <c-v>把当前窗口分割成水平分布的两个窗口 | :[#]vne[w] | 垂直分割出一个高度为#的新窗口 | :vertical | 水平分割的命令: 相应的垂直分割 |
6.3 关闭子窗口
| 命令 | 作用 |
|---|
:wq/ZZ/:x | 将编辑内容保存,并退出,w(write)写,q(uit)退出, | q! | !强制操作(如q!代表不保存退出) | :qall | 关闭所有窗口,退出vim | :wall | 保存所有修改过的窗口,即write all | :only/<c-w> o | 只保留当前窗口,关闭其它窗口。(CTRL-W o) | <c-w>q/:q/:close/<c-w> c | 关闭当前窗口,不保存 |
6.4 调整窗口大小
| 命令 | 作用 |
|---|
<c-w> +/<c-w> - | 当前窗口增高/降低一行。也可以用n增高n行 | <c-w> _/ctrl+w | | 当前窗口扩展到尽可能的大/当前窗口扩展到尽可能的宽,相像_/|分别代表行/列 | <c-w> #/:resize n/n <c-w> _ | 设置窗口为#行高 | <c-w> = | 所有窗口同样高度 | [#]<c-w> </[#]<c-w> > | 当前窗口减少/增加 #列 |
6.5 切换和移动窗口
| 命令 | 作用 |
|---|
<c-w> w/<c-w> <c-w> | 切换到下一个窗口 | <c-w> p | 切换到前一个窗口 | <c-w> h/l/j/k | 切换到左/右/下/上的窗口 | <c-w> t/b | 切换到最上/最下面的窗口 | <c-w> H/L/K/J | 将当前窗口移动到最左/右/上/下 | <c-w> r | 旋转窗口的位置 | <c-w> T | 将当前的窗口移动到新的标签页上 |
6.6 调整字体
7. 命令行
normal模式下按:进入命令行模式
7.1 命令行模式下的快捷键
| 命令 | 作用 |
|---|
上下方向键 | 上一条或者下一条命令。如果已经输入了部分命令,则找上一 条或者下一条匹配的命令 | 左右方向键 | 左/右移一个字符 | <c-w>/<c-h> | 向前删除一个单词/字符,后者等同于Backspace | <c-u> | 从当前位置移动到命令行开头 | <c-b>/<c-e> | 移动到命令行开头/结尾 | Shift-Left>/Shift-Right> | 左/右移一个单词 | @: | 重复上一次的冒号命令 | q: | 正常模式下,q然后按’:’,打开命令行历史缓冲区, 可以像编辑文件一样编辑命令 | q//q? | 可以打开查找历史记录 |
7.2 执行外部命令
| 命令 | 作用 |
|---|
:!{command} | 执行外部命令command | :!! | 执行上一次的外部命令 | :sh {bash-file} | 从shell调用{bash-file},用exit返回vim | :r !cmd | 将命令的返回结果插入文件当前位置,如r! echo %返回当前文件名 | :m,nw !cmd | 将文件的m行到n行之间的内容做为命令输入执行命令 |
8. 其它
8.1 工作目录
| 命令 | 作用 |
|---|
:pwd | 显示vim的工作目录 | | :cd path ` | 改变vim的工作目录 | | :set autochdir ` | 可以让vim 根据编辑的文件自动切换工作目录 |
8.2 一些快捷键
| 命令 | 作用 |
|---|
K | 打开光标所在词的manpage | g <c-g> | 统计全文或统计部分的字数 |
8.3 在线帮助
| 命令 | 作用 |
|---|
:h(elp)或<F1> | 打开总的帮助 | :help user-manual | 打开用户手册 |
命令帮助的格式为:第一行指明怎么使用那个命令; 然后是缩进的一段解释这个命令的作用,然后是进一步的信息。
| 命令 | 作用 |
|---|
:helptags somepath | 为somepath中的文档生成索引 | :helpgrep | 可以搜索整个帮助文档,匹配的列表显示在quickfix窗口中 | Ctrl+] | 跳转到tag主题,Ctrl+t 跳回 | :ver | 显示版本信息 |
8.4 一些小功能
简单计算器: 在插入模式下,输入C-r =,然后输入表达式,就能在 光标处得到计算结果。
9. 排版
排版使用较少,所以放在靠后位置
9.1 基本排版
| 按键 | 作用 |
|---|
<</>> | 向左/右缩进一个shiftwidth | :ce(nter)/:le(ft)/:ri(ght) | 本行文字居中/靠左/靠右 | gq | 对选中的文字重排,即对过长的文字进行断行 | gq#j | 重排当前行和下面#行 | gq#q | 重排#行,#为空则仅当前行 | gq#ap | 重排#段,#为空则仅当前段 | gqQ | 重排当前段到文章末尾 | J/gJ | 拼接当前行和下一行,后者不保存空格 |
9.2 拼写检查
| 按键 | 作用 |
|---|
:set spell/:set nospell | 开启/关闭拼写检查功能 | ]s/[s | 移到下一个/上一个拼写错误的单词 | z= | 显示一个有关拼写错误单词的列表,可从中选择 | zg | 告诉拼写检查器该单词是拼写正确的 | zw | 与上一命令相反,告诉拼写检查器该单词是拼写错误的 |
参考
网页1
|