文章目录
- 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. 排版
-
- 官方键位图
- 参考
先上两张图,再给文字说明。第一张,综合图。
光标移动说明图:
快捷键默认为Normal
模式,即按
后的状态。
代表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 |
跳到第#行 |
/
|
向前/后 一页,第一个组合按键为Ctrl +b |
/
|
向前/后 半页 |
/ |
向下/上 滚一行 |
1.3 选择
按键 |
作用 |
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 |
你的撤销历史 |
|
重做最后的改动 |
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 |
补齐以xyz开头的tag名,继续按tab键,会显示其他的 |
:tag /xyz |
会用名字中含有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 自动补全
按键 |
作用 |
|
拼写建议 |
|
补全vim选项和命令 |
|
整行补全 |
|
自动补全文件路径。弹出菜单后,按C-f循环选择,当然也可以按 和
|
/ |
用文档中出现过的单词补全当前的词。 直接按 和 也可以 |
|
编程时可以补全关键字和函数名,需要安装vim插件 |
|
根据头文件内关键字补全 |
|
补全宏定义 |
当弹出补全菜单后:
按键 |
作用 |
/
|
向前/向后 切换成员 |
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} |
移动到标记行的行首 |
`` |
在当前编辑位置与上次编辑位置之间来回跳转 |
/
|
跳到历史位置/更新位置 ,可无限回溯 |
: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# /
|
回到上一个编辑的文件 |
:f /
|
在状态栏显示当前文件名 |
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] / s / |
把当前窗水平分割成两个窗口。注意 , 可能会冻结终端,请按 继续 |
:sp[lit] filename |
水平分割窗口,并在新窗口中显示另一个文件 |
:[#]sp[lit] |
水平分割出一个# 行高的窗口 |
:[#]new / n / |
水平分割出一个# 行高的窗口,并编辑一个新文件。 |
ctrl+w f |
水平分割出一个窗口,并在新窗口打开名称为光标所在词的文件 |
6.2 垂直分割
命令 |
作用 |
:vs[plit] / v |
/ 把当前窗口分割成水平分布的两个窗口 |
:[#]vne[w] |
垂直分割出一个高度为# 的新窗口 |
:vertical |
水平分割的命令: 相应的垂直分割 |
6.3 关闭子窗口
命令 |
作用 |
:wq /ZZ /:x |
将编辑内容保存,并退出,w(write) 写,q(uit) 退出, |
q! |
! 强制操作(如q! 代表不保存退出) |
:qall |
关闭所有窗口,退出vim |
:wall |
保存所有修改过的窗口,即write all |
:only / o |
只保留当前窗口,关闭其它窗口。(CTRL-W o) |
q /:q /:close / c |
关闭当前窗口,不保存 |
6.4 调整窗口大小
命令 |
作用 |
+ / - |
当前窗口增高/降低 一行。也可以用n增高n行 |
_ /ctrl+w | |
当前窗口扩展到尽可能的大/当前窗口扩展到尽可能的宽,相像_/| 分别代表行/列 |
# /:resize n /n _ |
设置窗口为# 行高 |
= |
所有窗口同样高度 |
[#] < /[#] > |
当前窗口减少/增加 # 列 |
6.5 切换和移动窗口
命令 |
作用 |
w / |
切换到下一个窗口 |
p |
切换到前一个窗口 |
h/l/j/k |
切换到左/右/下/上 的窗口 |
t/b |
切换到最上/最下 面的窗口 |
H/L/K/J |
将当前窗口移动到最左/右/上/下 |
r |
旋转窗口的位置 |
T |
将当前的窗口移动到新的标签页上 |
6.6 调整字体
7. 命令行
normal
模式下按:进入命令行模式
7.1 命令行模式下的快捷键
命令 |
作用 |
上下方向键 |
上一条或者下一条命令。如果已经输入了部分命令,则找上一 条或者下一条匹配的命令 |
左右方向键 |
左/右移一个字符 |
/
|
向前删除一个单词/字符 ,后者等同于Backspace |
|
从当前位置移动到命令行开头 |
/
|
移动到命令行开头/结尾 |
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 |
统计全文或统计部分的字数 |
8.3 在线帮助
命令 |
作用 |
:h(elp)或 |
打开总的帮助 |
: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