VIM - Charles-Charmless/Charles-Charmless.github.io GitHub Wiki

模式

普通模式下

窗口

命令 解析
zz 重新绘制屏幕,并把当前行显示在屏幕中央

查看

命令 解析
K 查看当前光标所在处的单词的手册页
移动
命令 解析
-- 3 :-
h
J
K
l
home 去到行首
end 去到行尾
$ 去到行尾
B 去到字符串词首
gg 去到文件开头
{number}G 直接跳转到某行
删除
命令 3 解析
-- 2 :-
dd 删除当前光标所在行
x 删除当前光标所在的字符,并且光标向向前进一位
cw 删除从光标位置到单词结尾间的字符,并进入插入模式
dw 删除从光标位置到单词结尾间的字符,不进入插入模式
db 删除从光标起始位置到代词开头的内容,不进入输入模式
daw delete a word
dap 删除当前所在段落
C 删除指定文本并进入插入模式
查找与替换
命令 4 解析
-- :-
R 进入替换模式
- 正向查询字符串
逆向查询字符串
F{char} 查找下一出指定字符出现的位置并把光标移动到字符处
; 与f{char}配合使用,重复查找上次F命令所查找到的字符
, 与f{char}配合使用,反向查找上次F命令所查找到的字符
2 查找当前光标下的字符
N 跳转到下一个匹配项
N 反向跳转到上一个匹配项
格式控制
命令 2 解析
-- 4 :-
G

插入

命令 解析
I
I
A
A
s
cw 2 删除从光标位置到单词结尾间的字符,并进入插入模式
o(字母) 在当前光标所在行的下面新建一个新行,切换到新行,进入输入模式
ctrl+vcode code为要插入字符的编码,

撤销

命令 解析
U

复合字符串

命令 解析
July 19, 2020 先删除光标下的字符,然后进入插入模式

数值运算

命令 解析
numberctrl+a 加法
numberctrl+x 减法
ctrl+r=expressionbackspace 计算表达式的值并插入光标所在位置
复制与粘贴
命令 14 解析
-- 14 :-
yy 复制当前行(使用寄存器)
P 粘贴
J 将当前行与下一行连接起来
进制问题
命令 15 解析
-- 15 :-
0 4 0开头的数字为8进制
0x 0x开头的数字为16进制
ga 显示字符编码格式

VIM操作符命令

额外规则:当一个操作符被连续调用两次的时候,他会作用于当前行
操作符+动作命令=操作

命令 解析
c 2 修改
d 删除
y 复制到寄存器
g-~-vU 反转大小写
gU 转换为小写
gU 转换为大写
3 增加缩进
4 减小缩进
= 自动缩进
! 使用外部程序过滤所跨越的行

VIM动作命令

命令 解析
aW
ap
it 文本对象

插入模式

删除

命令 解析
ctrl+h 删除前一个字符,相当于
ctrl+w 删除前一个单词
ctrl+u 删除至行首

返回普通模式

命令 解析
ESC 2 切换到普通模式
ctrl+ 切换到普通模式
ctrl+o 2 切换到插入-普通模式

可视模式

命令 解析
V 激活面向字符的可视化模式
V 激活面向行的可视化模式
ctrl+v 激活面向块的可视化模式
gv 重选上一次由可视化模式选择的文本范围
o 切换到高亮选区的活动端
b 2 选区向前选择一个单词
E 选区向后选择一个单词
U 可视模式下的U相当于普通模式下的gU
rchar 用cahr代替选区中的所有内容
c 3 删除选区内容,并进入插入模式,并且在退出后会将修改的文本添加到每一行
I 2 可视模式下的插入(光标前)
A 2 可视模式下的插入(光标后)
- 2 在可视模式下进入命令行会将表示范围的’<,’>预先填充到命令行上

命令行模式

命令 解析
- 3 切换到命令行模式
ESC 切换回普通模式
-noh 取消搜索之后的一直高亮模式
-edit 读写文件
-write 读写文件
-tabnew 创建标签页
-split 分割窗口
-prev 操作参数列表
-printf -p 显示指定范围的文字
-delete -d 删除指定行的文字
-next 操作参数列表
-bprev 操作缓冲区列表
-bnext 操作缓冲区列表
-rangedelete x 删除指定范围内的行【到寄存器X中】
-rangeyank x 复制指定范围的行【到寄存器中】
-rangeput x 在指定行后粘贴寄存器X中的内容
-rangecopy {address} -co -t 把指定范围内的行拷贝到{address}指定的行之下(不使用寄存器)
-rangemove {address} 把指定范围内的行移动到{address}指定的行之下
-rangejoin 连接指定范围内的行
-rangenormal {command} 对指定范围内的每一行执行普通模式命令{command}
-rangesubstitude-{pattern}-{string}-flags 在指定范围内出现{pattern}的地方替换为{string}
-rangeglobal-{pattern}-cmd 对指定范围内匹配{pattern}的所有行执行Ex命令{cmd}
-@- 重复执行上次的Ex命令
-@@ 重复执行上一条命令
-u 撤销上一条命令行命令的影响
-up ordown 类似bash,回溯历史命令
ctrl+d 命令补全 还可进行选项补全
tab 依次显示可以执行的命令,还可进行文件路补全
s+tab 反向遍历所有的可执行命令
ctrl+rctrl+w 复制光标下的单词并把他插入到命令行中
q- 进入命令行窗口模式
ctrl+f 把当前命令行命令映射到命令行窗口
运行shell命令
命令 7 解析
-- 7 :-
-!{cmd} 执行shell中的命令,当给此命令指定范围时,会将『range』指定行会传给{cmd}作为标准输入,然后会将{cmd}的输出覆盖『range』内原本的内容
-shell 启动一个交互的shell会话
:exit &emsp退出此shell并返回vim
-read !{cmd} 把命令的标准输出重定向到缓冲器
-rangewrite !{cmd} 把缓冲区的内容作为指定{cmg}的标准输入
区别于 -write! {cmd} 把缓冲区的内容写到一个名为{cmd}的文件,这里的!表示会覆盖原文件的内容
-range!filter 使用外部程序{dilter]过滤指定的『range』
批量执行Ex命令
命令 5 解析
-- 6 :-
-source {file} 执行vim脚本
-argdo source {file} 对参数列表里的每个文件执行{file}里面的Ex命令
自动补全EX命令
命令 6 解析
-- 5 :-
-set wildmode=… 设置自动补全的环境变量

地址的表达

命令 解析
{start},{end} start行至end行
0 虚拟行,位于文件的第一行上面
1 文件的第一行
8 表示当前行
$ 2 表示文件最后一行
% 2 整个文件(:1,$的简写形式)
m 包含位置标记m的行
6 高亮选区的起始行
9 高亮选区的终止行
-{string}-.-{string}- 起始字符到终止字符
{address}+n 对地址进行便偏移,可视模式的选区
文件
管理多个文件
命令 8 解析
-- 8 :-
-ls 列出所有被载入内存中的缓冲区列表
% 指明那个缓冲区在当前窗口可见
10 代表轮换文件
ctrl+r 在当前文件与轮换文件间快速切换
-bnext 2 切换到列表中的下一个缓冲区
-bprev 2 切换到列表中的上一个缓冲区
-bfirst 跳到缓冲区列表的开头
-blast 跳到缓冲去列表的结尾
-buffer N -h N 直接按照编号跳转到相应的缓冲区
-bdelete N1 N2… 删除编号为N1,N2…的缓冲区
-M,N bdelete &emsjp; 删除编号从M到N的缓冲区列表
-args 显示参数列表(参数列表记录了在启动时作为参数传递给VIM的文件列表)(可以在任意时刻修改参数列表的值)
&emsjp; -args file &emsjp; 在参数列表中加入参数
7 匹配0个或多个字符(范围局限于指定的目录,不会递归子目录)
5 匹配0个或多个字符(可以递归进入指定目录的子目录)
-args ‘{command}’ 把``内的命令的输出作为args的参数执行
-write 2 将缓冲区内容写入磁盘
-edit 2 把磁盘文件内容写入缓冲区(即回滚所做修改)
-qall 关闭所有窗口,摈弃修改而无需警告
-wall 把所有改变的缓冲区写入磁盘:
-split {file} ctrl+ws 水平切分当前窗口,并在新窗口中载入{file}
-vsplit {file} ctrl+wv 垂直切分当前窗口,并在新窗口中载入{file}
ctrl+ww 在窗口间循环切换
ctrl+wh 切换到左边的窗口
ctrl+wj 切换到下面的窗口
ctrl+wk 切换到上面的窗口
ctrl+wl 切换到右面的窗口
-close 关闭活动窗口以及包含此窗口的标签页
-only 只保留活动窗口,关闭其他活动窗口
ctrl+w= 使所有窗口等宽等高
ctrl+w_ 最大化活动窗口的高度
ctrl+w 2
Nctrl+w 把活动窗口的高度设置为[N]行
Nctrl+w 2 把活动窗口的宽度设置为[N]列
-lcd {path} 设置当前窗口的本地工作目录 如果创建了一个新的标签页,并用:lcd命令切换到另一个目录,就可以将每个标签页限制在当前的工作目录(:lcd只影响当前窗口,而非当前标签页)
-windo lcd {path} 为所有这些窗口设置本地工作目录
-tabedit {filename} 打开一个新的标签页
ctrl+wT 把当前窗口移动到一个新的标签页中
-tabclose 关闭当前标签页
-tabonly 只保留活动标签页关闭其他所有标签页
EX命令 普通命令 解析
-tabnext {N} {N}gt 切换到编号为N{的}标签页
-tabnext gt 切换到下一个标签页
-tabprevious gT 切换到上一个标签页
-tabmove N 重新排列标签页,如果没有N,当前标签会被移动到结尾

打开以及保存文件

命令 解析
-edit {file} 通过文件的绝对路径与相对路径来打开文件
&emsjp; -edit % &emsjp; 这里的%表示活动缓冲区的完整文件目录
&emsjp; -edit %-h &emsjp; 这里的:h修饰符回去除文件名,但保留路径中的其他部分
-write 3 把缓冲区的内容写入磁盘
-pwd 打印工作目录
-find 允许通过文件名来打开一个文件,但无需输入该文件的完整路径,要想利用此功能,首先要配置‘path’选项
&emsjp; -set path+=-dir- &emsjp; 把/dir/目录下面的所有文件添加到path里面,以’,’作为分割符
使用netrw(插件)管理文件系统
命令 9 解析
-- 9 :-
$ vim -dir- 通过vim打开一个文件管理器窗口{h,j,k,l,/}
-edit -dir- 在vim内部打开文件管理器窗口
-explore 打开文件管理器,并显示活动缓冲区所在目录
-Sexplore 水平切分窗口打开文件管理器
-Vexplore 垂直切分窗口打开文件管理器
ctrl+^ 切换刚才正在编辑的文件

保存文件

命令 解析
ctrl+g 显示当前文件的文件名与状态

更快的移动及跳转

用命令动作在文档中移动

命令 解析
-h motion.txt 列出动作命令的帮助文档
h 2
j 2
k 2
l 2
-gj -gk 按照屏幕行进行上下移动
0 2 移动到实际行的行首
-g0 移动到屏幕行的行首
^ 移动到实际行的第一个非空白字符
g^ 移动到屏幕行的第一个非空白字符
$ 3 移动到实际行的行尾
g$ 移动到屏幕行的行尾
W 正向移动到下一个单词的开头
W 以字串为单位操作
b 3 反向移动到当前单词/上一个单词的开头
B 以字串为单位操作
e 2 正向移动到当前单词/上一个单词的开头
E 以字串为单位操作
gE 反向移动到上一单词的结尾
gE 以字串为单位操作
f{char} 2 在光标位置与当前行的行尾查找字符串,如果找到就将光标移动到此字符上
F{char} 反向移动到上一个{char}所在之处
T{char} 正向移动到下一个{char}所在之处的前一个字符上
T{char} 反向移动到上一个{char}所在之处的后一个字符上
; 2 重复上次的字符查找命令
反向查找上次的字符查找命令
-{str}cr 通过查找命令快速跳转
C-b 向上翻页
C-f 向下翻页

分割符文本对象

文本对象 选择区域
a) ab 包含符号本身
a} aB 包含符号本身
A 2 包含符号本身
a 3 包含符号本身
a’ 包含符号本身
a” 包含符号本身
a` 包含符号本身
at 包含符号本身
i) ib 不包含符号本身
i} iB 不包含符号本身
i 3 不包含符号本身
I 2 不包含符号本身
i’ 不包含符号本身
i” 不包含符号本身
i` 不包含符号本身
it 2 不包含符号本身
iW 当前单词
aw 2 当前单词及一个空格
iW 当前字串
aW 当前字串及一个空格
is 当前句子
as 当前句子以及一个空格
ip 当前段落
ap 2 当前段落以及一个空行
-m{a~zA~Z} 用选定的字母标记当前光标所在位置
-‘{mark} 跳到光标所在的行并且把光标置在第一个非空白字符上
-`{mark} 跳到光标所在的行列
`` 当前文件中上次跳转动作之前的位置
` 5 上次修改的位置
`^ 上次插入的位置
` 2 上次修改或复制的起始位置
` 4 上次修改或复制的结束位置
` 3 上次高亮选区的起始位置
` 上次高亮选区的结束位置
% 3 在一组开闭括号间跳转
S{‘ “ } } 把选中的文本用符号括起来

在文件间跳转

命令 解析
-jumps 查看跳转列表的内容
NG 跳转到指定的行号
-patternCR-patternCR-n-N 跳转到下一个/上一个模式出现之处
% 4 跳转到匹配的括号之处
(-) 跳转到上一句/下一句的开头
{-} 跳转到上一段/下一段的开头
H-M-L 跳转到屏幕上方/正中间/最下方
gf 跳转到光标的文件名下
gi 返回上次修改的地方继续编辑
C- 跳转到光标下关键字的定义之处
‘{mark}-`{mark} 跳转到一个位置标记处,小写字母会创建局部于缓冲区的标记,大写字母则创建全局变量
ctrl+i
ctrl+o
-changes 查看改变列表
:g;-:g, 反向或正向遍历改变列表
set suffixesadd+=.c 为文件添加扩展名,suffixesadd path选项可以针对每一个缓冲区进行设置,因此可以对不同的文件类型来设置不同的值
-vimgrep -“string”- path 在路径中查找string字符串
-grep
-make

寄存器

命令 解析
x 3 x命令用于把光标下的字符剪切下来,把他放在无名寄存器中
dd 2 剪切当行文本并把他放到无名寄存器中
yy 2 复制当前行文本到无名寄存器中
p 2 p命令把无名寄存器中的内容粘贴到光标后面,也可以在可视模式下替换高亮选区内容
P 将文本插入到光标的前面
gP 将文本插入到光标的后面
gP 将文本插入到光标的前面
“” 无名寄存器的表示,”a-“z/“A-“Z
“_ 黑洞寄存器
“0 复制专用寄存器
-reg {regester} 显示寄存器内的信息

复制文本到外部区域

命令 解析
“+ 系统剪切版,可用剪切,复制粘贴命令操作
主剪切板,保留上次被高亮选中的文本,可用鼠标中键粘贴出来
“= 表达式寄存器,当从此寄存器中读取内容时,VIM进入命令行模式,可以输入一段VIM脚本表达式并执行
隐式赋值寄存器(只读寄存器)
“% 当前文件名
“ 3 轮换文件名
“ 2 上次插入的文本
“- 2 上次执行的EX命令
“- 上次查找的模式
可以串行或者并行的方式执行宏
命令 10 解析
-- 10 :-
q{REG} 录制宏在指定寄存器中 再次按下q录制结束
q{REG} 添加宏在指定寄存器中
@{reg} 用来执行指定寄存器中的宏
@@ 重复最近调用的宏
N@{reg} 重复N次寄存器中的宏
-wall 2 保存缓冲列表中的所有文件
-wnext 相当于 :w+:next
-put {reg} 把寄存器中的内容粘贴到新的一行(当前行的光标之后)

模式

匹配

命令 解析
ignorecse 是否忽略大小写的变量
-C 覆盖ignorecase,忽略大小写
-C 覆盖ignorecase,强制大小写检查
smartcase 智能的大小写敏感性检查,如果全部为小写,则忽略大小写,否则不忽略大小写
V 2 magic搜索模式,即假定除_ 大小写字母以及数字之外的所有字符均具有特殊含义
V 2 该元字符会激活very noagic搜索模式
x 2 该字符类可以代替完整的字符集[0-9a-fA-F]
13 在VIM中匹配任意字符
() 1 任何()内部的匹配文本都会被自动保存到一个临时仓库中。可以用\1来引用这段被捕获的文本,\2 \3…则被用来对每个()捕获的子匹配
_s 匹配空白符或换行符
12 在very magic模式下,用<和>表示单词界定符
W 2 匹配单词类字符,包括字母,数字,以及符号_
W 2 用来匹配除单词类字符以外的其他字符串
14 正向查找光标下的单词
11 反向查找光标下的单词
g 2 正向查找光标下的单词(不使用单词界定符)
g 3 反向查找光标下的单词(不使用单词界定符)
查找与匹配的区别
命令 13 解析
-- 12 :-
zs 标志着一个匹配的起始(零宽度)
ze 标志着一个匹配的结束(零宽度)
- 5 (正向查找)查找结束符
(反向查找)查找结束符
15 在查找域中,一个\的出现预示着紧挨着他的后面的字符将会被特殊对待,如果将其加倍变成\之后,前者会消除后者的特殊含义
查找
命令 12 解析
-- 13 :-
warpscan 当检查到文件结尾时是否返回文本开头进行检查
- 4 正向查找
? 2 反向查找
gN 进入面向字符的可视化模式,并选中下一次匹配并进行操作
gN 进入面向字符的可是花模式,并选中上一次匹配并进行操作
hlsearch 是否进行高亮匹配
-nohlsearch 暂时关闭查找高亮
incsearch 可以预览第一处匹配
ctrl+rctrl+w 2 用当前预览的匹配结果对查找域进行自动补全
-{string}-e /e表示用来结束匹配,并将光标放在string之后
-UP 显示上一次的查找历史
q- 2 调出命令行窗口(查找历史)
-substitude 能够显示匹配的数量
-vimgrep 显示匹配的数量
-v^(^,),(^,),(^,) 子匹配
替换
命令 11 解析
-- 11 :-
-rangesubtitute-{pattern}-{string}-flags 一条完整的substitute命令 [range]对于每一条EX命令均适用
flags effect
G 使substitute命令可以在全局范围内执行,实际上仅作用于当前行
c 4 有机会确认或者拒绝每一处修改(在每次修改前进行询问)
&emsjp; y &emsjp; 替换此处匹配
&emsjp; n &emsjp; 忽略此处匹配
&emsjp; q &emsjp; 退出替换过程
&emsjp; l &emsjp; 替换此处匹配后退出
&emsjp; a &emsjp; 替换此处与之后所有匹配
&emsjp; ctrl-e &emsjp; 向上滚动屏幕
&emsjp; ctrl-y &emsjp; 向下滚动屏幕
n 2 抑制正常的替换行为,即让vim不执行替换操作,只报告此次substitute命令匹配的个数
& 仅仅用来指示vim重用上一次substitute命令所使用的标志位
e 3 专门用来屏蔽错误提示
替换域中的特殊字符 描述
R 插入一个换行符
t 插入一个制表符
16 插入一个反斜杠
1 2 插入第一个子匹配
2 插入第二个子匹配(以此类推)
0 3 插入匹配模式的所有内容
& 2 插入匹配模式的所有内容
- 6 使用上一次调用:substitute的[string]
&emsjp; ={VIM scripts } &emsjp; 执行vim的脚本表达式,并将结果替换为{string}
缺省情况下,substitute命令仅作用于当前行的第一个匹配处
命令 解析
g 4 标志位,貌似表示全文,实则只表示当前行
% 5 代表全文范围
c 5 标志位,控制是否继续实现相同的修改
y 2 替换此处匹配
n 3 忽略此处匹配
q 退出替换过程
l 3 替换此处匹配后退出
a 4 替换此处与之后的所有匹配
ctrl+e 向上滚动屏幕
ctrl+y 向下滚动屏幕

当把查找域留空时,默认使用上一次的查找,这样使得我们可以先设置查找域在进行替换

命令 解析
ctrl+r{reg} 把寄存器的值插入到命令行
-= 只是VIM执行一段表达式文本
g& 在整个文件的范围重复上一次substitute命令
& 3 重复上一次sub命令(忽略上一次的标志位)
vimgrep 在工程范围内查找,并将返回的结果记录在quickfix列表中
&emsjp; -copen &emsjp; 打开quickfix列表浏览匹配结果
-set hidden 该设置项可以无需存盘就可以从某个被修改的文件中切换出去
-cfdo 在整个工程的范围内执行sub命令
-update 用于保存有过更改的文件

global命令

命令 解析
-range global! -{partern}- range2{cmd} :global命令的形式,默认情况下作用范围是整个文件,{pattern}如果留空的话会自动使用当前的查找模,{cmd}如果不指定会默认使用:print,global[!]表示反向匹配,range2默认没有,使用前面的range,不过也可以单独设置

ctags

命令 解析
ctrl+ 2 光标会从当前所在的关键字跳转到它的定义处
ctrl+t 充当后退按钮
gctrl+ 多次匹配的时候会从标签匹配列表挑出可选项供我们选择
-tselect 提示用户从标签匹配列表中选择一项进行跳转
-tprev 跳转到上一处匹配的标签
-tnext 跳转到下一处匹配的标签
-tfirst 跳转到第一处匹配的标签
-tlast 跳转到最后一处匹配的标签
-tag(keyword) 跳转到匹配关键字的第一处标签
-tjumo(keyword) 提示用户从匹配关键字的多次标签中指定一处进行跳转
-tag 正向遍历标签历史
-pop <ctrl+t>

quickfix

命令 解析
-cnext 跳转到下一项
-cprev 跳转到上一项
-cfirst 跳转到第一项
-clast 跳转到最后一项
-cnfile 跳转到下一个文件第一项
-cpfile 跳转到上一个文件的最后一项
-cc N 挑战到第N项
-copen 打开quickfix窗口
-cclose 关闭quickfix窗口
-cdo {cmd} 在quickfix列表中的每一行上执行{cmd}
-cfdo {cmd} 在quickfix列表中的每一个文件上执行一次{cmd}
-colder 回溯quickfix列表之前的某个版本 支持次数
-cnewer 从旧的的quickfix列表回到比较新的列表 支持次数
makeprg 改选项允许指定运行:make时调用的程序
errorformat 改选项控制错误信息显示格式
-compiler 激活一个编译器插件,它回设置‘makeprg’ ‘errorformat’选项

grep vimgrep

命令 解析
-grep 2 在vim内部调用grep并生成quickfix列表进行查询
grepprg 负责指定调用的shell程序
grepformat 指定VIM如何解析来自:grep命令的输出结果

自动补全

命令 解析
ctrl+n 普通关键字
ctrl+xctrl+i 当前缓冲区关键字:-
ctrl+xctrl+n 包含文件关键字
ctrl+xctrl+ 标签文件关键字
ctrl+xctrl+k 字典查找
ctrl+xctrl+l 整行补全
ctrl+xctrl+f 文件名补全
ctrl+xctrl+o 全能(omni)补全:-
ctrl+n 2 使用来自补全列表的下一个匹配项
ctrl+p 使用来自补全列表的上一个匹配项
Down 使用来自补全列表的下一个匹配项
Up 使用来自补全列表的上一个匹配项
ctrl+y 2 确认使用当前选中的匹配项
ctrl+e 2 还原早先输入的文本(从自动补全中exit)
&emsjp; ctrl+h &emsjp; 从当前匹配中删除一个字符
&emsjp; ctrl+l &emsjp; 从当前匹配中增加一个字符
&emsjp; {char} 终止自动补全并插入字符串
cd - 切换到之前的工作目录
s 3 在拼写错误间进行反向跳转
s 2 在拼写错误间正向跳转
z= 获取VIM提供的更正建议列表
zg 把当前单词添加到拼写文件中
zw 把当前单词从拼写文件中删除
zug 撤销针对当前单词的zg和zw命令
ctrl+xs vim从光标位置进行反向扫描,直到发现一处拼写错误,然后根据建议创建单词列表并将他们显示在弹出菜单中
set setting! 反转当前设置项的状态
set setting 查看当前设置项的状态
set setting& 将当前设置项的状态设为默认

工具

附录

⚠️ **GitHub.com Fallback** ⚠️