目录

August 30, 2021 · View on GitHub

SpaceVim定制版

 本手册适用于该项目的配置, 手册中还介绍了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
  • 文本对象:需要带前缀ia w s p ( { [ < " ' ` e l i f ,
  • 替换:
  • 替换: R r

快捷移动

按键作用
<c-a>,<c-e>行首,行尾
f{char}与F{char}连续按fF可以重复移动
;{char}{char}跳转至指定字符处
<space>jw跳转至某单词
<space>jl跳转至某行
<space>ju跳转至某URL
[c与]cdiff中跳转至上/下个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写入文件

Windows

按键作用
<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}将当前窗口移动到最左/下/上/右边

Tabs

按键作用
[t与]t切换至上/下一个标签页

复制粘贴

按键(插入模式)作用
<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>向上添加光标

规则:

  • 上述按键进入多光标编辑模式
  • 如果自选单词范围,则先进入vim-visual模式再按<m-e>或者按<m-a>进入VM-normal再用<s-left><s-right>选取
  • 上下左右移动真实光标(不是虚拟多光标),这样便可以再在适当的位置添加一个光标
  • 多光标模式又分两种:普通模式与可视模式
  • 普通模式的快捷键类似正常vim普通模式相仿
  • 可视模式的快捷键类似正常vim可视模式相仿
  • 具体快捷键见 https://github.com/mg979/vim-visual-multi/wiki/Quick-start
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>asStartify启动界面
<space>aoTODO窗口
<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删除所有所有标签

FlyGrep搜索文件内容

按键作用
<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

LeaderF模糊搜索

搜索文件路径

按键作用
<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搜索所有寄存器并复制

LeaderF窗口局部按键

快捷键功能
<c-e>切换模糊搜索模式
<esc>进入leaderf结果窗口
<F1>进入leaderf结果窗口后打开快捷键提示
<c-c>关闭leaderf

项目管理

版本控制

按键作用
<space>gsgit status
<space>gdgit diff
<space>gv当前文件的git-log
<space>gV当前仓库的git-log
<space>gS暂存当前文件
<space>ggGitGutterToggle
<space>ghrundo cursor hunk
<space>ghvpreview 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

Markdown

按键作用
<space>lp开启markdown预览
<space>lg添加或删除GFM目录
<space>lk利用系统剪切板的URL插入链接元素
[[与]]]上/下个标题
[]当前标题
][上级标题
<s-tab>插入内容&emsp;

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 :修改匹配的patrel,默认范围.

      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

runtimepath目录结构

  • 查看配置加载::scriptnames
    • :filetype plugin indent on
    • 加载filetype.vimscript.vim,并加载ftdetect/*.vim
    • 加载ftplugin.vim,并加载ftplugin/*.vim
    • 加载indent.vim,并加载indent/*.vim
  • :syntax enable:syntax on
    • 加载syntax/*.vim
  • :set loadplugins
    • 加载plugin/*.vim
  • :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!

VimL

变量

  • 变量的声明、销毁与引用

    let var = val
    echo var
    echo foo_{var}_bar
    unlet var
    unlet! var
    
  • 变量作用域

    若在函数体外则默认全局变量,若在函数体内则默认为函数局部变量

    • g:var :全局变量
    • a:var :函数参数
    • l:var :函数局部变量
    • b:var :buf局部变量
    • w:var :win局部变量
    • t:var :tab局部变量
    • s:var :脚本内可见的局部变量
    • v:var :Vim预定义的内部变量
  • 表达式

    • $环境变量
    • &选项变量
    • @寄存器
    • * / % + -
    • ? :
    • 字符串比较:
use 'ignorecase'match caseignore 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