本手册适用于该项目的配置,
手册中还介绍了vim自带的按键,一些按键功能未具体指出,读者可以打开vim试试便知其意
基础操作
插入模式
进入插入模式:gi i a I A o O
快捷移动
| 按键 | 作用 |
|---|
<c-a>,<c-e> | 行首,行尾 |
<c-left>,<c-right> | 左移一个单词,右移一个单词 |
<m-s> | 跳转结对符的另一边(即普通模式的%) |
<m-n> | 跳转下对结对符 |
修改内容
| 按键 | 作用 |
|---|
<m-e> | 将光标后的字符向后移 |
<m-{char}> | 将光标后的字符向后移动到第一个{char}后面,{char}是结对符之一 |
<s-left>,<s-right> | 向前缩进与向后缩进 |
<c-s-down>,<c-s-up> | 将本行下移,将本行上移 |
<c-o> | 下行插入 |
<c-w> | 删除光标前单词 |
<c-u> | 删除光标前文本,删除光标后文本 |
<c-l> | 删除光标后一个字符 |
<c-k> | 删除光标后单词 |
<c-v>{char} | 插入{char}(控制)字符 |
<c-v>x{hh} | 插入编码为0xhh的ascii字符 |
<c-v>u{hhhh} | 插入码点为hhhh的unicode字符 |
普通模式
复合操作符可以:
结合光标移动,对初始位置与移动后位置之间的文本进行操作,如df1删除直到第一个1
- 复合操作符:
d c y gu gU g~ v
- 光标移动:
0 ^ $ w W b B e E ge gE
f F % ( ) { }
gg G H L M {num}| gm
- 文本对象:需要带前缀
i或a
w s p ( { [ < " ' `
e l i f ,
- 替换:
- 替换:
R r
快捷移动
| 按键 | 作用 |
|---|
<c-a>,<c-e> | 行首,行尾 |
f{char}与F{char} | 连续按f与F可以重复移动 |
;{char}{char} | 跳转至指定字符处 |
<space>jw | 跳转至某单词 |
<space>jl | 跳转至某行 |
<space>ju | 跳转至某URL |
[c与]c | diff中跳转至上/下个diff点 |
g,与g; | 跳转新/旧更改表 |
K | 快速查找doc |
gf | 快速跳转光标下的URL与文件 |
gF | 使用GUI工具打开目标文件 |
修改内容
| 按键 | 作用 |
|---|
x,s | 删除相当于dl与cl |
D,C | 删除相当于d$与c$ |
dd,cc | 删除当前行 |
d<space> | 删除当前行的行尾空白 |
da<space> | 删除所有行的行尾空白 |
<c-s-down>,<c-s-up> | 将本行下/上移 |
[<space>,]<space> | 上/下一行添加空行 |
~ | 转换大小写 |
J | 将下行文本连接到此行 |
S | 将光标处断行 |
u,<c-r> | 撤销树回溯与前进 |
g+与g- | 新/旧撤销树(按时间) |
. | 重复上次操作 |
可视模式
进入可视模式:v <c-v> V gv
| 按键 | 作用 |
|---|
<c-a>,<c-e> | 行首,行尾 |
o | 块选取时对角线跳转 |
O | 块选取时邻角跳转 |
v | 扩大可视范围 |
V | 缩小可视范围 |
常用命令::ene,:e,:bd,:qa,:wa,:wq,:wqa,:saveas
参数列表::args,:arga,:argd,:argdo
参数列表::args,:arga,:argd,:argdo
buf详情::h ls
| 按键 | 作用 |
|---|
<leader>n,<leader>b | 下/上一个缓冲区 |
<leader>{numr} | 第{numr}个buffer |
<c-s> | 保存buffer至硬盘 |
<c-w>x | 安全删除该buffer |
<c-w>X | 安全删除所有未激活buffer |
<c-w>W | 用sudo写入文件 |
| 按键 | 作用 |
|---|
<c-w>= | 所有窗口等高等宽 |
<c-w>-与<c-w>+ | 减少与增加窗口高度 |
<c-w><与<c-w>> | 减少与增加窗口宽度 |
{num}<c-w>_与{num}<c-w>| | 设置窗口高度与宽度为num |
<c-w>c | 关闭窗口 |
Q | 关闭窗口 |
{num}Q | 关闭num号窗口 |
<c-w>o | 关闭其它所有窗口 |
<c-w>s | 水平分割窗口 |
<c-w>v | 垂直分割窗口 |
<space>{numr} | 切换至第{numr}号窗口 |
<tab> | 切换至下个窗口 |
<s-tab> | 切换至上个窗口 |
<c-w>{H/J/K/L} | 将当前窗口移动到最左/下/上/右边 |
复制粘贴
| 按键(插入模式) | 作用 |
|---|
<c-r>{reg} | 粘贴reg寄存器 |
<c-y> | 粘贴"寄存器 |
| 按键(普通模式) | 作用 |
|---|
, | 复制相当于yl |
Y | 复制相当于y$ |
<leader>y | 复制到系统剪切板"+y |
<leader>, | 复制到系统剪切板"+yl |
<leader>Y | 复制到系统剪切板"+y$ |
<space>by | 复制整个buffer至系统剪切板 |
<leader>p与<leader>P | 粘贴系统剪切板到光标后/前 |
<leader>o与<leader>O | 粘贴系统剪切板到光标下/上行 |
<space>bp | 粘贴系统至整个buffer(覆盖原来的内容) |
=p与=P | 粘贴0寄存器到光标前/后 |
=O与=o | 粘贴0寄存器到光标上/下 |
| 按键(可视模式) | 作用 |
|---|
<leader>Y | 复制到http://pastebin.com并将URL赋值到系统剪切板 |
<leader>y | 复制到系统剪切板"+y |
<leader>p | 粘贴系统剪切板 |
=p | 粘贴0寄存器 |
屏幕滚动
| 按键(可视模式) | 作用 |
|---|
<c-d>与<c-b> | 下半屏,上半屏 |
<c-down>与<c-up> | 光标行下/上滚半屏 |
z<down>与z<up> | 光标行下/上滚三行 |
z<cr>与zz与zb | 光标行滚动到屏幕顶/中/底 |
z<left>与z<right> | 光标列左/右滚动半屏 |
zs | 光标列移至屏幕左边 |
进阶操作
缓冲区搜索
| 按键 | 作用 |
|---|
*与# | 搜索当前单词,向下/上 |
g*与g# | 搜索当前字符串(不加单词边界),向下/上 |
/与? | 正向和反向正则匹配 |
z/ | 模糊搜索 |
折叠操作
| 按键 | 作用 |
|---|
<space>tF | 切换折叠模式(手动/自动) |
zF | 手动折叠N行 |
za与zA | 切换(所有)折叠 |
zc与zC | 关闭该处(所有)折叠 |
zo与zO | 打开该处(所有)折叠 |
zr与zR | 打开(所有)折叠 |
zm与zM | 关闭(所有)折叠 |
zj与zJ | 下一个折叠 |
zk与zK | 上一个折叠 |
制表与对齐
| 按键 | 作用 |
|---|
<m-t> | 切换制表模式 |
<leader>tr | 手动对齐 |
<leader>ts | 以该列为基准进行行排序 |
<leader>tdd | 删除改行 |
<leader>tdc | 删除改列 |
<leader>tic | 在右边添加一列 |
<leader>tiC | 在左边添加一列 |
<leader>t? | 查询当前cell编号 |
<leader>tfa | 添加公式 |
<leader>tfe | 计算公式 |
<space>xj{c/l/r} | 居中/左/右对齐该段落 |
<space>xa{char} | 根据{char}对齐 |
<space>xao | 根据运算符对齐 |
制表公式:
$n表示n列
$n,m表示n行m列
r1:r2表示范围从光标当前列的行r1-r2
r1,c1:r2,c2表示范围从r1,c1到r2,c2的矩阵
- 列运算的结果也为列
- 可使用vim内建函数,以及Sum()与Average()
代码注释
| 按键 | 作用 |
|---|
<space>cl | 切换该行注释状态 |
<space>cL | 注释该行 |
<space>cp | 切换该段落注释状态 |
<space>cP | 注释该段落 |
代码补全
| 插入(模式按键) | 作用 |
|---|
<Tab>与<S-Tab> | 在补全列表中上下选择 |
<CR> | 选中补全选项并关闭补全列表 |
<C-Z> | 手动触发补全列表 |
<M-/> | 触发代码片段补全,或跳向下一个片段锚点 |
<M-?> | 跳向上一个片段锚点 |
<c-x><c-f> | 补全路径 |
举例:
cs{[将{content}替换成[ content ],
cs{]则是将{content}替换成[content](内部无空格),
其它同理。
替换的字符(第二个{char})若是<,则还可以继续输入直到>来添加html标签
替换的字符(第二个{char})若是<,则还可以继续输入直到>来添加html标签
详见surround
| 按键 | 作用 |
|---|
cs{char}{char} | 替换包围符 |
ds{char}{char} | 删除包围符 |
ys{text-obj}{char} | 添加包围符 |
yss{char} | 为改行添加包围符 |
多光标编辑
| 按键 | 作用 |
|---|
<m-e> | 选取光标处单词(普通模式) |
<m-e> | 选取选中单词(可视模式) |
<m-a> | 将光标位置添加一个光标 |
<m-down> | 向下添加光标 |
<m-up> | 向上添加光标 |
规则:
| VM模式按键(通用) | 作用 |
|---|
<tab> | 切换到VM normal/visual模式 |
\\<cr> | 切换到VM single/multi模式 |
↑↓←→ | 移动真实光标 |
<c-left>与<c-right> | 移动真实光标 |
<c-a>与<c-e> | 移动真实光标 |
<c-d>与<c-b> | 移动真实光标 |
<space>jw | 移动真实光标 |
<space>jj | 移动真实光标 |
<space>jJ | 移动真实光标 |
| VM模式按键(visual) | 作用 |
|---|
\\A | 选取所有匹配的单词 |
n | 选取下个单词 |
N | 选取上个单词 |
[ | 移动到上个选取的单词 |
] | 移动到下个选取的单词 |
q | 跳过选取当前单词到下个匹配单词 |
Q | 取消选取单词并返回上个选取单词 |
| VM模式按键(normal) | 作用 |
|---|
<s-left> | 光标向左选取并进入VM visual |
<s-right> | 光标向右选取并进入VM visual |
高级功能
界面与工具
| 按键 | 作用 |
|---|
<F1> | 开关符号栏 |
<F2> | 开关文件树(<space>fo会打开当前目录) |
<F3> | 开关tab管理器 |
<F4> | 开关撤销树 |
<space>ac | 计算器 |
<space>al | 日历 |
<space>as | Startify启动界面 |
<space>ao | TODO窗口 |
<space>aR | 阅读模式 |
文件树局部操作
| 按键 | 作用 |
|---|
<left> | 关闭目录,或进入上级目录 |
<right> | 展开目录,或打开文件 |
<CR> | 进入目录,或打开文件 |
. | 切换显示隐藏文件 |
~ | 切换到家目录 |
R | 切换到项目根目录 |
F | 搜索文件,利用Leaderf搜索光标位置的目录 |
P | 预览文件,利用tmux(或Guake)与ranger |
O | 利用其它桌面工具打开当前目录或文件 |
K | 新建目录 |
N | 新建文件 |
rn | 重命名 |
rm | 删除 |
dd | 剪切文件 |
pp | 粘贴文件 |
yy | 复制文件 |
yp | 复制文件路径 |
]a | 将文件加入git暂存区git add |
]r | 撤销该文件的git暂存区git restore |
]d | 撤销该文件的git工作区git restore --staged |
特性开关
| 按键 | 作用 |
|---|
<space>tb | 切换背景颜色 |
<space>tc | 切换conceallevel |
<space>te | 切换expandtab |
<space>t8 | 切换长行提醒 |
<space>tf | 切换超长行提醒 |
<space>tF | 切换foldmethod |
<space>tl | 切换隐藏符号显示 |
<space>tL | 切换linebreak |
<space>tn | 切换行号显示 |
<space>tp | 切换粘贴模式 |
<space>ts | 切换语法检测 |
<space>tS | 切换拼写检测 |
<space>tv | 切换virtualedit |
<space>tw | 切换尾部空白符高亮 |
<space>tW | 切换wrap |
<space>thh | 切换高亮本行 |
<space>thc | 切换高亮本列 |
<space>thi | 切换缩进高亮 |
<space>ths | 切换语法高亮 |
<bs> | 关闭高亮搜索 |
在线搜索与翻译
| 按键 | 作用 |
|---|
gs | 智能搜索URL |
<leader>tc | 在命令行显示翻译 |
<leader>tw | 在pop-window显示翻译 |
<leader>tr | 替换翻译结果 |
<leader>tx | 翻译剪切板中的内容 |
书签标记
| 按键 | 作用 |
|---|
<space>mm | 切换标签状态 |
<space>mi | 为标签添加注释 |
<space>mn | 跳转至下一个标签 |
<space>mb | 跳转至上一个标签 |
<space>ml | 列出所有标签 |
<space>mc | 删除当前文件的所有标签 |
<space>mC | 删除所有所有标签 |
| 按键 | 作用 |
|---|
<space>ss | 搜索当前缓冲区 |
<space>sb | 搜索所有缓冲区 |
<space>sd | 搜索当前目录 |
<space>sp | 搜索工程目录 |
<space>sj | 后台搜索工程目录 |
<space>sl | 打开上次后台搜索结果 |
<space>sf | 搜索指定目录 |
| FlyGrep窗口局部按键 | 作用 |
|---|
<c-e> | 正则模式/字符串模式 |
<m-r> | 进入替换模式 |
<c-p> | 浮窗预览 |
<c-d> | 向下翻页 |
<c-b> | 向上翻页 |
<c-s> | 水平分屏打开文件 |
<c-v> | 竖直分屏打开文件 |
<c-c>或<esc> | 关闭flygrep |
搜索文件路径
| 按键 | 作用 |
|---|
<leader>sr | 搜索最近打开文件 |
<leader>sb | 搜索打开的缓冲区 |
<leader>sd | 搜索当前目录文件 |
<leader>sp | 搜索当时工程目录文件 |
<leader>sf | 搜索指定目录 |
搜索代码符号
| 按键 | 作用 |
|---|
<leader>ff | 搜索当前buffer函数 |
<leader>fF | 搜索所有buffer函数 |
<leader>ft | 搜索当前buffer符号 |
<leader>fT | 搜索所有buffer符号 |
<leader>fg | 搜索项目gtags符号 |
其它搜索
| 按键 | 作用 |
|---|
<leader>fr | 重置上次搜索 |
<leader>f<space> | 搜索快捷键并执行 |
<leader>fp | 搜索插件信息 |
<leader>fh | 搜索vim帮助文档 |
<leader>fq | 搜索quickfix |
<leader>fl | 搜索locationlist |
<leader>fj | 搜索跳转表并跳转 |
<leader>fm | 搜索vim的输出信息并复制 |
<leader>fu | 搜索unicode并插入 |
<leader>fy | 搜索"寄存器历史并复制 |
<leader>fe | 搜索所有寄存器并复制 |
| 快捷键 | 功能 |
|---|
<c-e> | 切换模糊搜索模式 |
<esc> | 进入leaderf结果窗口 |
<F1> | 进入leaderf结果窗口后打开快捷键提示 |
<c-c> | 关闭leaderf |
项目管理
版本控制
| 按键 | 作用 |
|---|
<space>gs | git status |
<space>gd | git diff |
<space>gv | 当前文件的git-log |
<space>gV | 当前仓库的git-log |
<space>gS | 暂存当前文件 |
<space>gg | GitGutterToggle |
<space>ghr | undo cursor hunk |
<space>ghv | preview cursor hunk |
符号跳转
前三个是基于Leaderf gtags,有时需要手动更新Leaderf gtags --update,
后面四个基于YCM语义
| 按键 | 作用 |
|---|
gD | 跳转gtags定义 |
gR | 跳转gtags引用 |
gS | 跳转gtags符号 |
gd | 跳转定义或声明 |
gr | 跳转引用 |
gt | 获取对象类型 |
gc | 重构对象名字 |
语法检测
| 按键 | 作用 |
|---|
<space>en | 跳转下一个语法检测提示 |
<space>eb | 跳转上一个语法检测提示 |
<space>ed | 打开语法检测提示详情 |
<space>el | 打开语法检测提示列表 |
<space>ec | 清除语法提示 |
代码运行
| 按键 | 作用 |
|---|
<space>lr | 快速运行程序 |
<space>lR | 快速运行程序(强制编译) |
<space>li | 快速打开输入窗口 |
<space>ld | 启动调试命令 |
<space>pl | 列出项目task |
<space>pe | 编辑项目task |
<space>pr | 运行项目task |
| 按键 | 作用 |
|---|
<space>lp | 开启markdown预览 |
<space>lg | 添加或删除GFM目录 |
<space>lk | 利用系统剪切板的URL插入链接元素 |
[[与]]] | 上/下个标题 |
[] | 当前标题 |
][ | 上级标题 |
<s-tab> | 插入内容  |
Ultisnips/markdown.snippets里有实用的代码片段
杂项
| 按键 | 作用 |
|---|
g& | 当前行重复上次:s命令 |
g<c-g> | 显示光标位置 |
<c-g> | 显示文件绝对路径和文件大小 |
g< | 上次命令输出 |
g= | 格式化排版 |
ga | 查看ascii字符编码或unicode码点 |
g8 | 查看utf-8字符编码 |
+或- | 加或减当前数字 |
<space>fC | 转换文件格式 |
<leader>m | 快速编辑宏 |
<space>fh | 添加文件头部版权声明等信息 |
(可视模式)<space>xc | 计算选中区域字符数 |
(普通模式)<space>xc | 统计代码量 |
(普通模式)<space>xC | 统计项目代码量 |
参考:
vim-galore-zh_cn
vim-galore-zh_cn
VIM中文文档
命令模式
- 进入:
:
- 外部命令:!cmd
利用:r与:w,将外部命令I/O重定向到该缓冲区
- 外部过滤:{范围}!cmd
将外部命令的I/O同时重定向到目标指定区域
- 常用命令
:g/pat/cmd :在匹配pat的行执行cmd,:g!表示不匹配的行,默认范围%
:s/pat/rel/flag :修改匹配的pat为rel,默认范围.
s_flags :e不报错,g全替换,i忽略大小写
:r/w :范围表示read到范围行后,write指定范围
:X :设置密码,为空解除
:profile :调试
范围
- 先输入数字后再键入:冒号
% :整个文件
0 :第一行行前
n :第n行
$ :最后一行
. :当前行
+n :当前行后n行
-n :当前行前n行
'm :标签行
/pattern/+1 :模式匹配行
?pattern?+1 :前向模式匹配行
/foo//bar/ :多次模式匹配行
寄存器
- 查看::reg
- 使用:" + □ + y/p
- 寄存器:
- 用户:a-z和A-Z(大写用来向寄存器添加)
- 系统:
*(选择区) 和 +(剪切板)
- 只读:
%文件、. 修改、: 命令、/搜索
- 数字:0为最近一次复制,1-9最近1-9次删除
宏录制
- 录制:q+□+操作+q
- 使用:@+□,@@
- 特殊:. 执行上次的单次修改操作
标记与跳转
- 查看::marks 与 :jumps
- 标记:m + 字母
- 跳转:' + 标记
- 标记:
| 意义 | 标记 |
|---|
| 用户 | 字母(大写全局) |
| 上次跳转 | ' |
| 上次关闭 | " |
| 上次修改 | . |
| 上次插入 | ^ |
| 上次修改或复制 | [ ] |
| 返回较旧跳转 | <c-o>(全局) |
| 返回较新跳转 | <c-i>(全局) |
注:因为<c-i>在vim中被映射为<tab>,故将返回较新跳转映射为<c-p>
临时文件
- swap文件
防止多开的vim同时打开同一个文件,并且防止非正常关机导致进度未保存
- backup文件
修改任何文件时,都会备份原文件
- undo文件
用于记录文件的更改记录,从而可进行撤销或回溯修改历史
- viminfo文件
存储vim使用信息,如打开文件记录、历史命令、寄存器值、跳转标签等
:makesession mysession.vim
:source mysession.vim
:source mysession.vim
- 查看配置加载::scriptnames
:filetype plugin indent on
- 加载
filetype.vim与script.vim,并加载ftdetect/*.vim
- 加载
ftplugin.vim,并加载ftplugin/*.vim
- 加载
indent.vim,并加载indent/*.vim
:syntax enable与:syntax on
:set loadplugins
:set packpath=与:set runtimepath=
/pack/foo/start/bar/类vim目录/
/pack/foo/opt/bar/类vim目录/
存放自动载入的函数,调用时使用
存放自动载入的函数,调用时使用
:call (dirname#)*filename#funcname()
/ftplugin/
<filetype>.vim
<filetype>_<name>.vim
<filetype>_<name>.vim
<filetype>/<name>.vim
命令别名
- 参数:
-nargs=0/1/*/?/+
<args>:用命令别名的参数代替该位置
<q-args>:"str 'str' "
<f-args>:"str","str"
- 默认范围:-range/-range=%
- 默认范围:-range/-range=%
自动命令
- 形式: :autocmd [group] {events} {file_pattern} [nested] {command}
- 查询:不加{command}
键映射
- 特殊参数
<buffer> :buf局部映射
<nowait> :映射冲突时不等待
<silent> :不在命令行回显操作
<expr> :将{rhs}替换为表达式结果
<SID> :添加独一无二编号
<c-v>{key}
<c-v>{字符编码}:0,x,u,U
<c-k>{二合字符}
查看::digraphs,ga,g8
查看::digraphs,ga,g8
调试
:profile start profile.log
:profile func *
:profile file *
" At this point do slow actions
:profile pause
:noautocmd qall!
变量
| use 'ignorecase' | match case | ignore case |
|---|
== | ==# | ==? |
!= | !=# | !=? |
> | ># | >? |
>= | >=# | >=? |
< | <# | <? |
<= | <=# | <=? |
=~ | =~# | =~? |
!~ | !~# | !~? |
-
数据类型
:echo type(varname) 可以查看变量类型
- 空值
let null = v:null
- 布尔值
let bool = v:true
- 整数 :32为有符型,支持8/10/16进制
let integer = -19 + 0x1f + 017 +0b1010
- 浮点数 :支持科学记数法
let float = 1.5 + 1.5e-3 * -1.5e3
- 字符串 :以NULL结尾的8位无符号字符串
" 数字开头的字符串会转换为子串对应的数值,否则为0
let string = "\t\n\r\e\b\"\\ \<esc>" . 'all is original'
- 函数引用 :首字母必须大写
let Function = function("printf")
echo Function("parameter")
- 有序列表List
let list = [1, "str1", [2, "str2"]] " 下标从0开始
echo list[0]
echo list[2][0]
- 无序字典Dictionary
let dict = {"key": "value", "foo": {"bar": 1}} "key值必须是字符串类型
echo dict.key
-
定义与删除:
function! Func(arg1, arg2, ...) " 感叹号表示强制覆盖
" `...`表示变参,使用`a:1`表示`...`中的第一个参数并依此类推,`a:0`表示`...`共有多少参数
endfunction
delfunction <function>
-
调用:
call Funcname(args) "只进行函数调用
echo Funcname(args) "将函数返回值当作变量
-
范围:
function! Func() range
echo a:lastline - a:firstline "范围中最后一行行号减去第一行行号
endfunction
-
面向对象:
let MyClass = {"foo": "bar"}
function! MyClass.Func() dict
echo self.foo "通过self引用字典
endfunction
call MyClass.Func()
语句
- 条件判断
if <expression>
...
elseif <expression>
...
else
...
endif
- 循环语句
for <var> in <list>
continue
break
endfor
for [var1, var2] in [[1, 2], [3, 4]]
" on 1st loop, var1 = 1 and var2 = 2
" on 2nd loop, var1 = 3 and var2 = 4
endfor
while <expression>
endwhile
- 异常捕获
try
...
catch /pattern/
" HIGHLY recommended to catch specific error.
finally
...
endtry
函数
- exists("varname")
- search("pattern")
- getline("line")
- setline("line", "replace")
- substitute("expr", "pattern", "replace", "flag")
- function("funcname")
- pyeval("py_expr") :转换为python表达式的结果
- eval("expression") :转换为表达式的结果
- execute("cmd") :将命令输出作为返回值
命令
- execute "c-cmd"
- normal "n-cmd"
- substitute/pattern/replace/flag