Skip to content

Latest commit

 

History

History
881 lines (797 loc) · 35 KB

vim.md

File metadata and controls

881 lines (797 loc) · 35 KB

目录

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与]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写入文件

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>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 删除所有所有标签

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>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

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 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