文章目录

  • 1. 查看
    • 1.1 基础移动
    • 1.2 翻屏、跳转
    • 1.3 选择
  • 2. 编辑
    • 2.1 新增
    • 2.2 修改 c(change)
    • 2.3 删除 d(delete)
    • 2.4 查找 f(ind)
    • 2.5 复制 y(yank)
    • 2.6 替换 r(place)
    • 2.7 大小写转换 u(ppercase)
    • 2.8 撤消与重做(normal模式)
  • 3. 编程辅助
    • 3.1 基本按键
    • 3.2 ctags
    • 3.3 cscope
    • 3.4 gtags
    • 3.5 编译
    • 3.6 快速修改窗口
    • 3.7 自动补全
    • 3.8 多行缩进缩出
    • 3.9 折叠
  • 4. vim通用高级编辑功能
    • 4.1 文本块
    • 4.2 书签(bookmark)、标记
    • 4.3 寄存器 register
    • 4.4 宏 macro
  • 5. 多文件操作
    • 5.1 多文件基本操作
    • 5.2 多标签操作(很少用)
    • 5.3 缓冲区
  • 6. 窗口操作
    • 6.1 水平分割
    • 6.2 垂直分割
    • 6.3 关闭子窗口
    • 6.4 调整窗口大小
    • 6.5 切换和移动窗口
    • 6.6 调整字体
  • 7. 命令行
    • 7.1 命令行模式下的快捷键
    • 7.2 执行外部命令
  • 8. 其它
    • 8.1 工作目录
    • 8.2 一些快捷键
    • 8.3 在线帮助
    • 8.4 一些小功能
  • 9. 排版
    • 9.1 基本排版
    • 9.2 拼写检查
  • 官方键位图
  • 参考

先上两张图,再给文字说明。第一张,综合图。(无插件) vim 基础快捷键汇总-编程知识网
光标移动说明图:
​​(无插件) vim 基础快捷键汇总-编程知识网

快捷键默认为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-n> 向前/向后切换成员
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代表aroundi代表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 调整字体

命令 作用
<c-->/<c-=> 字体调/
<c-0> 恢复默认字体大小

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 与上一命令相反,告诉拼写检查器该单词是拼写错误的

官方键位图

(无插件) vim 基础快捷键汇总-编程知识网
(无插件) vim 基础快捷键汇总-编程知识网
(无插件) vim 基础快捷键汇总-编程知识网
(无插件) vim 基础快捷键汇总-编程知识网
(无插件) vim 基础快捷键汇总-编程知识网
(无插件) vim 基础快捷键汇总-编程知识网
(无插件) vim 基础快捷键汇总-编程知识网

参考

网页1