vim快捷键
基本操作
单个字符移动
h: 向左移动
l: 向右移动
j: 向下移动
k: 向上移动
xh: 向左移动x个字符距离
单词移动
w: 将光标移动到下一个单词的开头
b: 将光标移动到前一个单词的开头
e: 将光标移动到下一个单词的词末
E: 移动到单词的结尾(忽略标点符号)
ge: 将光标移动到上一个单词的词末
2w: 指定移动的次数
行移动
$: 将光标移动到当前行的行尾
0: 将光标移动到当前行的行首
^: 将光标移动到当前行的第一个非空字符(行首和当前行非空字符不是一个位置)
2|: 移到当前行的第2列
fx: 将光标移动到当前行的第一个字符x上
3fx: 将光标移动到航前行的第3个字符x上
tx: 将光标移动到目标字符x的前一个字符上
fx和tx可以通过;和,进行重复移动,一个是正向重复,一个是反向重复%: 用于符号间的移动,它会在一对()、[]、{}之#间跳跃
文本块移动
(: 移到当前句子的开头
): 移到下一个句子的开头
{: 移到当前一段的开头
}: 移到下一段的开头
[[: 移到当前这一节的开头
]]: 移到下一节的开头
在屏幕中移动
xG: 跳转到指定的第x行,G移动到文件按末尾,``(2次单引号)返回到跳转前的位置
gg: 移动到文件开头
x%: 移动到文件中间,就使用50%
H: 移动到home
M: 移动到屏幕中间
L: 移动到一屏末尾
ctrl+G: 查看当前的位置状态
滚屏与跳转
半屏滚动 | ctrl+u/ctrl+d |
---|---|
全屏滚动 | ctrl+b/ctrl+f |
z | 定位光标的位置 |
zz | 将光标置于屏幕的中间 |
zt | 将光标移动到屏幕的顶部 |
zb | 将光标移动到屏幕的底部 |
设置跳转标记mx,my,mz设置三个位置x,
y,`z跳转到设置
文本插入操作
i | 在当前光标的前面插入字符 |
---|---|
a | 在当前光标的后面追加字符 |
o | 在当前光标的下一行行首插入字符 |
I | 在一行的开头添加文本 |
A | 在一行的结尾处添加文本 |
O | 在光标当前行的上一行插入文本 |
s | 删除当前光标处的字符并进入到插入模式 |
S | 删除光标所在处的行,并进入到插入模式 |
u | 撤销修改 |
文本删除操作
x | 删除当前光标所在处的字符 |
---|---|
X | 删除当前光标左边的字符 |
dw | 删除一个单词(从光标处到空格) |
daw | 无论光标在什么位置,删除光标所在的整个单词(包括空白字符) |
diw | 删除整个单词文本,但是保留空格字符不删除 |
d2w | 删除从当前光标开始处的2个单词 |
d$ | 删除从光标到一行末尾的整个文本 |
d0 | 删除从光标到一行开头的所有单词 |
dl | 删除当前光标处的字符 |
=xdh | 删除当前光标左边的字符 |
=X | 行删除 |
dd | 删除当前光标处的一整行 |
=D5dd | 删除从光标开始处的5行代码 |
dgg | 删除从光标到文本开头 |
dG | 删除从光标到文本结尾 |
J | 删除一个分行符,将当前行与下一行合并 |
文本复制、剪切与粘贴
y | 复制 |
---|---|
p | 粘贴 |
yw | 复制一个单词 |
y2w | 复制2个单词 |
y$ | 复制从当前光标到行结尾的所有单词 |
y0 | 复制从当前光标到行首的所有单词 |
yy | 复制一整行 |
2yy | 复制从当前光标所在行开始的2行 |
复制文本块
1.首先进入visual模式: v
2.移动光标选择文本
3.复制与粘贴的操作
文本的修改与替换
cw | 删除从光标处到单词结尾的文本并进入到插入模式 |
---|---|
cb | 删除从光标处到单词开头的文本并进入到插入模式 |
cc | 删除一整行并进入到插入模式 |
~:修改光标下字符的大小写 | |
r | 替换当前光标下的字符 |
R | 进入到替换模式 |
xp | 交换光标和下一个字符 |
文本的查找与替换
/string | 正向查找 |
---|---|
?string | 反向查找 |
set hls | 设置高亮显示 |
* | 按键将当前光标处的单词高亮显示,使用n浏览下一个查找高亮的结果: |
s/old/new | 将当前行的第一个字符串old替换为new |
s/old/new/g | 将当前行的所有字符串old替换为new |
90s/old/new/g | 将指定行的所有字符串old替换为new |
90,93s/old/new/g | 将指定范围的行的所有字符串old替换为new |
%s/old/new/g | 将文本中所有的字符串old替换为new |
%s/old/new/gc | 依次替换每个字符串关键字 |
%s/^struct/int/g | 将所有以struct开头的字符串替换为int |
撤销修改、重做与保存
u | 撤销上一步的操作。 |
---|---|
Ctrl+r | 将原来的插销重做一遍 |
U | 恢复一整行原来的面貌(文件打开时的文本状态) |
q | 若文件没有修改,直接退出 |
q! | 文件已经被修改,放弃修改退出 |
wq | 文件已经被修改,保存修改并退出 |
e! | 放弃修改,重新回到文件打开时的状态 |
编辑多个文件
文件和缓冲区的区别文件是保存在磁盘上的,而打开的文件的文件是在内存中,在内存中有一个缓冲区,用来存放打开的文件。vim每次打开文件时都会创建一个缓冲区,vim支持打开多个文件
buffers | 查看缓冲区列表 |
---|---|
**ls:buffer N | 根据缓冲区列表的编号跳转到指定缓冲区 |
bnext/bprev | 遍历缓冲区列表 |
bfirst/blast | 分别调到缓冲区列表的开头和结尾 |
write | 将缓冲区的修改保存到磁盘上 |
edit! e! | 放弃缓冲区的修改,恢复到文件打开时的状态 |
edit file | 编辑另一个文件 |
wnext | 保存当前缓冲区的修改并跳转到缓冲区列表中的下一个文件 |
标签页与折叠栏
tabedit file/tab split | 标签页的新建 |
---|---|
tabn/tabp | 标签页的切换 |
gt/gT | 标签页的关闭 |
tabclose | 关闭当前的标签页 |
tabonly | 创建一个折叠 |
zf200G | 将光标和200行之间的代码折叠起来折叠的打开与关闭 |
za | 打开和关闭折叠 |
zr/zm | 一层一层地打开和关闭折叠 |
zR/zM | 分别打开和关闭所有的折叠折叠键的光标移动 |
zj | 跳转到下一个折叠处 |
zk | 跳转到上一个折叠处删除折叠 |
zd | 删除光标下的折叠 |
zD | 删除光标下的折叠以及嵌套的折叠 |
zE | 删除所有的折叠标签 |
创建的折叠当退出vim之后就失效了。
多窗口操作
分割窗口
split/vsplitfilename | 窗口间跳转 |
---|---|
ctrl+ww | 移动窗口 |
ctrl+wHJKL | 调整窗口尺寸 |
ctrl+w+/- | 调整窗口的高度 |
ctrl+w</> | 调整窗口的宽度 |
ctrl+w= | 所有的窗口设置相同的尺寸 |
resizen | 将当前窗口尺寸调整为N行关闭窗口 |
close | 关闭一个窗口 |
qall | 退出所有窗口 |
qall! | 放弃修改,退出所有窗口 |
wqall | 保存并退出所有窗口 |
wall | 保存所有窗口 |
编程辅助
基本跳转
gd: 跳转到局部变量的定义处;
gD: 跳转到全局变量的定义处,从当前文件开头开始搜索;
g;: 上一个修改过的地方;
g,: 下一个修改过的地方;
[[: 跳转到上一个函数块开始,需要有单独一行的{。
]]: 跳转到下一个函数块开始,需要有单独一行的{。
[]: 跳转到上一个函数块结束,需要有单独一行的}。
][: 跳转到下一个函数块结束,需要有单独一行的}。
[{: 跳转到当前块开始处;
]}: 跳转到当前块结束处;
[/: 跳转到当前注释块开始处;
]/: 跳转到当前注释块结束处;
%: 不仅能移动到匹配的(),{}或[]上,而且能在#if,#else, #endif之间跳跃。
下面的括号匹配对编程很实用的。
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<:修改、剪切或复制<>之间的内容,包含<>。
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可能有多个匹配,如函数重载,一个函数名就会有多个匹配。 这种情况会先跳转到第一个匹配处。
:[n]tnext – 下一[n]个匹配。
:[n]tprev – 上一[n]个匹配。
:tfirst – 第一个匹配
:tlast – 最后一个匹配
:tselect tagname – 打开选择列表
tab键补齐
:tag xyz – 补齐以xyz开头的tag名,继续按tab键,会显示其他的。
:tag /xyz – 会用名字中含有xyz的tag名补全。
cscope
cscope -Rbq: 生成cscope.out文件
:cs add /path/to/cscope.out /your/work/dir
:cs find c func – 查找func在哪些地方被调用
:cw – 打开quickfix窗口查看结果
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目录下的文件。
make
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。
快速修改窗口
其实是quickfix插件提供的功能, 对编译调试程序非常有用 😃
:copen – 打开快速修改窗口。
:cclose – 关闭快速修改窗口。
快速修改窗口在make程序时非常有用,当make之后:
:cl – 在快速修改窗口中列出错误。
:cn – 定位到下一个错误。
:cp – 定位到上一个错误。
:cr – 定位到第一个错误。
自动补全
C-x C-s – 拼写建议。
C-x C-v – 补全vim选项和命令。
C-x C-l – 整行补全。
C-x C-f – 自动补全文件路径。弹出菜单后,按C-f循环选择,当然也可以按 C-n和C-p。
C-x C-p 和C-x C-n – 用文档中出现过的单词补全当前的词。 直接按C-p和C-n也可以。
C-x C-o – 编程时可以补全关键字和函数名啊。
C-x C-i – 根据头文件内关键字补全。
C-x C-d – 补全宏定义。
C-x C-n – 按缓冲区中出现过的关键字补全。 直接按C-n或C-p即可。
当弹出补全菜单后:
C-p 向前切换成员;
C-n 向后切换成员;
C-e 退出下拉菜单,并退回到原来录入的文字;
C-y 退出下拉菜单,并接受当前选项。
多行缩进缩出
正常模式下,按两下>;光标所在行会缩进。
如果先按了n,再按两下>;,光标以下的n行会缩进。
对应的,按两下<;,光标所在行会缩出。
如果在编辑代码文件,可以用=进行调整。
在可视模式下,选择要调整的代码块,按=,代码会按书写规则缩排好。
或者n =,调整n行代码的缩排。
折叠
zf – 创建折叠的命令,可以在一个可视区域上使用该命令;
zd – 删除当前行的折叠;
zD – 删除当前行的折叠;
zfap – 折叠光标所在的段;
zo – 打开折叠的文本;
zc – 收起折叠;
za – 打开/关闭当前折叠;
zr – 打开嵌套的折行;
zm – 收起嵌套的折行;
zR (zO) – 打开所有折行;
zM (zC) – 收起所有折行;
zj – 跳到下一个折叠处;
zk – 跳到上一个折叠处;
zi – enable/disable fold;
命令行
normal模式下按:进入命令行模式
命令行模式下的快捷键:
上下方向键:上一条或者下一条命令。如果已经输入了部分命令,则找上一 条或者下一条匹配的命令。
左右方向键:左/右移一个字符。
C-w: 向前删除一个单词。
C-h: 向前删除一个字符,等同于Backspace。
C-u: 从当前位置移动到命令行开头。
C-b: 移动到命令行开头。
C-e: 移动到命令行末尾。
Shift-Left: 左移一个单词。
Shift-Right: 右移一个单词。
@: 重复上一次的冒号命令。
q: 正常模式下,q然后按’:',打开命令行历史缓冲区, 可以像编辑文件一样编辑命令。
q/和q? 可以打开查找历史记录。
执行外部命令
:! cmd 执行外部命令。
:!! 执行上一次的外部命令。
:sh 调用shell,用exit返回vim。
:r !cmd 将命令的返回结果插入文件当前位置。
:m,nw !cmd 将文件的m行到n行之间的内容做为命令输入执行命令。
其它
工作目录
:pwd 显示vim的工作目录。
:cd path 改变vim的工作目录。
:set autochdir 可以让vim 根据编辑的文件自动切换工作目录。
K: 打开光标所在词的manpage。
*: 向下搜索光标所在词。
g*: 同上,但部分符合即可。
#: 向上搜索光标所在词。
g#: 同上,但部分符合即可。
g C-g: 统计全文或统计部分的字数。
在线帮助:
h(elp)或F1 打开总的帮助。
:help user-manual 打开用户手册。
命令帮助的格式为:第一行指明怎么使用那个命令; 然后是缩进的一段解释这个命令的作用,然后是进一步的信息。
:helptags somepath 为somepath中的文档生成索引。
:helpgrep 可以搜索整个帮助文档,匹配的列表显示在quickfix窗口中。
Ctrl+] 跳转到tag主题,Ctrl+t 跳回。
:ver 显示版本信息。
一些小功能
简单计算器: 在插入模式下,输入C-r =,然后输入表达式,就能在 光标处得到计算结果。