先上两张图,再给文字说明。第一张,综合图。 光标移动说明图: ??
快捷键默认为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
|