vim使用
模式切换
- 正常模式:在文件中四处移动光标进行修改
- 插入模式:插入文本,i进入
- 替换模式:替换文本,R进入
- 可视化模式(一般,行,块):选中文本块,v进入可视(一般)模式,V进入可视(行)模式,ctrl-v 进入可视(块)模式,
o切换选中区的活动端,gv进入可视化并选中上一次选中的内容。 - 命令模式:用于执行命令
打开多个文件
- vim打开多个文件并竖直分屏:
vim -o file1 file2,窗口会竖向排列。 - vim打开多个文件并水平分屏:
vim -O file1 file2,窗口会横向排列。 - 窗口切换
| 命令 | 用途 |
|---|---|
| ctrl-w 上方向键 | 切换到上窗口 |
| ctrl-w 下方向键 | 切换到下窗口 |
| ctrl-w 左方向键 | 切换到左窗口 |
| ctrl-w 右方向键 | 切换到右窗口 |
| ctrl-w w | 循环切换 |
| ctrl-w c(:clo[se]) | 关闭活动窗口 |
| ctrl-w o(:on[ly]) | 只保留活动窗口 |
| ctrl-w s | 水平切分当前窗口 |
| ctrl-w v | 竖直切分当前窗口 |
- vim打开多个文件:
vim file1 file2- 切换到上个文件::n
- 切换到下个文件::N
- 关闭所有编辑文件::qa
- 所有编辑文件修改保存::wa
- 查看所有buffer编号::buffers或者:ls(没找到区别在哪)
- buffer切换
- 下一个buffer::bnext(bn)
- 上一个buffer::bprevious(bp)
- 第一个buffer::bfirst(bf)
- 最后一个buffer::blast(bl)
- 关闭buffer::bdelete(bd)关闭当前buffer
:bdelete(bd) n1 n2 n3关闭编号为n1 n2 n3的buffer
:n,m bdelete(bd)关闭编号为n-m的buffer - <C-6>在当前文件与轮换文件之间切换,轮换文件为上一次打开的文件
- 当前窗口切换到另一个buffer::buffer数字编号(b数字编号)
- vim界面打开文件并垂直分屏::sp 文件名
- vim界面打开文件并水平分屏::vsp 文件名
- vim界面打开文件::e 文件名
- vim界面打开vim目录::e .
- vim界面打开当前文件的同级目录::E
- tab
- 建立对指定文件新的tab :tabnew 文件
- 关闭当前的tab :tabc
- 关闭所有其他的tab :tabo
- 查看所有打开的tab :tabs
- 前一个 :tabp或者gT
- 后一个/切换到第N个tab :tabn/:tabn {N}或者{N}gt
- 前后切换也可以用ctrl+pageup或者ctrl+pagedown,与终端多tab类似,比较推荐
:tabmove n当前窗口进行tab排序移动,开头为0
光标移动
- 基本移动:hjkl(左,下,上,右)
- 屏幕行与实际行:j、k、0 和 $ 都用于操作实际行,而如果在这些键前加上 g 前缀的话,就会让 Vim 对屏幕行进行操作。
- 词:w(下一个词),b(词初),e(词尾),ge(反向词尾),大写与此类似,区别是词对应为字符串,颗粒度更大。
- 行:0(行初),^(第一个非空格字符),$(行尾)
- 屏幕:H(屏幕首行),M(屏幕中间),L(屏幕底部)
- 翻页:Ctrl-u(上翻),Ctrl-d(下翻)
- 文件:gg(文件头),G(文件尾)
- 行数:G({行数}为行数),或者:行数就是移动到该行
- 杂项:%(找到配对,比如括号或者/**/之类的注释对)
- 搜索:/{正则表达式},n/N用于导航匹配,*表示所搜光标所在词,gn/gN可以进入可视化并选中匹配。
- 行内搜索:
- 向后搜索字符并移动光标到:f
- 向前搜索字符并移动光标到:F
- 向后搜索字符并移动光标到该字符之前:t
- 向前搜索字符并移动光标到该字符之后:T
- ,/; 用于导航匹配 ";"命令重复前一次输入的f, t, F, T命令,而","命令会反方向重复前一次输入的f, t, F, T命令。这两个命令前也可以使用数字来表示倍数。
- 修改跳动:g;回到上一次发生了发生修改的位置 g,相反。可以通过:changes查看位置。每次修改过后,不管处于哪一个位置记录,会形成最新的位置记录。
- 跳转跳动:ctrl+o回到上一次发生了发生跳动的位置 ctrl+i相反。可以通过:jumps查看位置。只有比较大的跳动才是跳转,移动一行这种算比较小的跳转。
- 插入跳动:gi回到上次退出插入模式的位置并进入插入模式。
- 做标记:m{letter}给当前位置做标记,小写字母表示标记作用于当前缓冲区,大写字母表示标记作用于全局。再'{letter}或者`{letter}就可以跳转到该位置。
| 默认符号 | 功能 |
|---|---|
| `` | 当前文件中上次跳转动作之前的位置 |
| `. | 上次修改的地方 |
| `^ | 上次插入的地方 |
| `[ | 上次修改或复制的起始位置 |
| `] | 上次修改或复制的结束位置 |
| `< | 上次高亮选区的起始位置 |
| `> | 上次高亮选区的结束位置 |
| gi | 使用'^恢复光标位置并进入插入模式 |
文本编辑
- 删除当前字符: x
- 拼接字符串: J,拼接至少两行,删除空格,可以指定行数;
qJ,拼接至少两行,不会删除多余空格,可以指定行数;
可视化模式下选中后直接按J拼接。 - 删除当前字符并进入插入模式(xi): s
- 删除整行并进入插入模式(^c$或者cc): S
- 删除光标前的字符: X
- 在行末添加字符($a): A
- 在行首添加字符(^i): I
- 删除当前这个word,可以d5w,切到下个词。: dw
- 删除当前word,切到这个词的结尾。: de
- 删除至行尾: d$
- 更改: c+字符
后接字符与d类似,删除后自动进入插入模式 - 删除到结尾并进入插入模式(c$) C
- 移动光标到开头: 0
- 移动到行尾: $
- 向下新建空行并进入插入模式: o
- 向上新建空行并进入插入模式: O
- 删除当前行: dd
- 移动光标到下个词开头: w
- 移动光标到下个词结尾: e
- undo当前举动: u
- undo这一整行: U
- 使undo不奏效: ctrl+R
- 把删掉的内容粘贴到当前光标位置之后,光标移动到粘黏: p
- 把删掉的内容粘贴到当前光标位置之前: P
- 用x字符替换当前字符: rx
- 进入替换模式: R
- 复制当前词: yw
- 复制整行: yy
- 复制选中内容: v+光标选中+y
- 大小写转换选中内容: v+光标选中+~
- 重复上一次操作: 输入.
如果上一次是编辑模式,它会把删去同等数量字符并输入相同内容。(如果跨行之类的比较复杂的情况并没有尝试) - 大小写转换
- ~:普通模式,光标下字符大小写切换
- g~:大小写翻转
- gu:变为小写
- gU:变为大写
可视化模式下,选中相应内容后,也可以使用~,u,U
后接范围,比如l(当前字符),w(到词尾),3w(三个词),也可以重复表示一行,guu,gUU
- 数字加减法
- 加法:ctrl+a,如果光标在数字上,数字加一,如果不在数字上,会搜索该行下一个数字并加一。
- 减法:ctrl+x,如果光标在数字上,数字减一,如果不在数字上,会搜索该行下一个数字并减一。
前面可以加数字,180ctrl+a,就会找到数字并加180。
修饰符
用a表示附近,用i表示内部,通常结合符号使用。
例如:
- 修改[]内部内容:ci[
- 修改()内部内容:ci(
- 删除''中内容与'':da'
- 删除当前词:daw
- 删除当前字符串:daW
缩进
- 增加缩进:>
- 减小缩进:<
- 自动缩进:=
可以进行重复表示缩进当行,加数字表示缩进多行。也可以接修饰符表示缩进范围。>后面可以接{motion},常见的使用>G到结尾所有行缩进,>gg,>>当前行缩进,>5⬇️下6行缩进。
插入模式下支持linux命令行类似的一些操作
- 删除前一个单词 ctrl+w
- 删除光标之前该行的所有内容 ctrl+u
- 移动到下一个词/上一个词 ctrl+->/<-
页面滚动
- 向下翻页 page down
- 向上翻页 page up
- 跳到页面首行 H
- 跳到页面中间 M
- 跳到页面末行 L
- 把当前行作为页面中间并重绘屏幕 zz
寄存器
- 匿名寄存器
""寄存器是一个指针,指向刚才被存到的寄存器。不指定p指令的寄存器时默认使用"" - 数字寄存器
编号寄存器从"0到"9共10个,其中"0保存着拷贝来的字符串,"1到"9保存着删除掉的字符串,
1号保存上一次删除内容,2号保存上上次删除内容,1-9号寄存器会保存最近的9次删除。 - 命名寄存器
执行"a后再接入删除或者复制指令,会将删除或者复制的内容存入a寄存器。需要复制时再"ap就可以。b-z同理。
如果使用大写字母,例如对a寄存器来说,"A接入删除或者复制指令,会将删除或者复制的内容与原有值进行拼接。
寄存器a中的值,在normal模式下可以通过"ap来粘贴;在插入模式或者命令行模式下通过<C-r>a来粘贴。 - 黑洞寄存器
"_通常为了在删除文本的同时不影响任何寄存器的值。 - 文件名寄存器
"%为当前文件名,"#为交替文件 - 剪贴板寄存器
"+为剪贴板寄存器。 - 指令寄存器
".为上次插入文本,":为上条ex命令,"/为上次查找的模式。 - 查看寄存器值
:reg可以查看所有寄存器的值,:reg a可以查看a寄存器的值。
录制宏到命名寄存器
q+字母开始录制宏,开始记录操作,操作完按q结束录制。
使用宏时,{N}@字母,可以添加重复次数,@@可以执行上次运行的宏。
当宏命令中途失败时,例如在文件首行向上移动,会停止执行该宏,可以理解为串行执行,第三次执行的失败,之后都不执行。
也可以通过:%norm @字母执行宏,可以理解为所有行并行执行,行与行互不影响。
q+大写字母,可以在宏的后面添加内容。
命令行模式下
- 操作文本
| 命令 | 用途 |
|---|---|
| :[range]delete [x] | 删除指定行内容[到寄存器x中],delete可以缩写为d |
| :[range]yank [x] | 复制指定行内容[到寄存器x中],yank可以缩写为y |
| :[line]put [x] | 将寄存器x中内容放到指定行下,没指定x时使用匿名寄存器,put可以缩写为pu |
| :[range]copy [address] | 将指定行内容复制到地址下,copy可以缩写为t |
| :[range]move [address] | 将指定行内容移动到地址下,move可以缩写为m |
| :[range]join | 连接指定行内容,join可以缩写为j |
| :[range]normal | 对范围内每一行执行普通模式命令,normal可以缩写为norm |
| :[range]substitute/{pattern}/{pattern}/[flags] | 替换,substitute可以缩写为s |
| :[range]global/{pattern}/[cmd] | 对指定范围内符合pattern的行执行命令{cmd},global可以缩写为g |
省略时默认使用当前行,+后面没有数字时为默认为+1。
- 命令行模式下选中行
| 符号 | 含义 |
|---|---|
| 1 | 第一行 |
| 0 | 文件开头 |
| $ | 文件结尾 |
| % | 文件所有行 |
| "< | 高亮选中开关 |
| "> | 高亮选中结尾 |
| . | 当前行 |
也支持偏移的表达方式,比如.,.+3
也可以通过模式作为地址。
- 命令行输入选中词
<C-r><C-w>在命令行中输入光标所在词。 - 命令行输入寄存器值
<C-r>寄存器名在命令行中输入寄存器值。 - 执行shell命令
| 命令 | 用途 |
|---|---|
| :shell | 启动shell(exit返回) |
| :!cmd | 执行shell命令 |
| :r(ead) file | 把文件内容插入到光标下方 |
| :r(ead) !cmd | 执行shell命令,并把标准输出插入到光标下方 |
| :[range]w(rite) !cmd | 执行shell命令,并把范围作为命令的标准输入 |
| :[range]w(rite)(!) file | 把范围内容写入文件,若文件存在需要在w后面加感叹号 |
| :[range]!filter | 过滤指定range,在普通模式下可以!{motion},会将范围预置在命令行下,等待输入filter,例如sort,grep等 |
- 命令行窗口
q:进入命令行窗口,所有历史命令作为一个缓存区,可以进行修改,将某行修改完后将光标移动到该行,回车就可以执行该行。
如果不需要可以:q退出。
<C-f>可以从命令行模式进入命令行窗口,已经输入的内容会保存到命令行窗口底部。
q/打开查找历史命令的命令行窗口。
模式匹配
- 特殊含义
默认的模式匹配*等符号具有特殊含义,但括号等符号不具有特殊含义。
在模式匹配前加入\v,基本所有符号具有特殊含义。
在模式匹配前加入\V,基本所有符号不具有特殊含义。 - 捕获内容
\1,\2表示第一个,第二个匹配内容,在搜索与替换时都可以使用。
在()之前加入%,可以只使用()的分组功能,但不算捕获。 - 匹配边界
<表示边界开头,>表示边界结尾。
可以用\zs与\ze对匹配边界进行微调,在常规匹配与\v匹配中都可以使用。
正向查找时\会被当做查找域结束符,在常规匹配与\v匹配都是如此,会自动忽略后面内容。
同理反向查找?也会被当做查找域结束符。如果需要搜索\需要进行转义。 - 移动匹配完的光标
默认情况下光标在匹配内容开头,/查找内容/e会将光标移动到匹配内容结尾。
启动incsearch之后,在搜索的同时会自动跳转到第一处匹配,并可以通过<C-r><C-w>自动补全当前匹配单词。(使用\v模式或者没打开incsearch时不正常,例如te匹配test,会补全成tetest)
特殊含义:

查找
简单使用
- 替换当前行old为new
:s/old/new/g - 替换文件old为new
:%s/old/new/g - 每次替换时候询问是否更换
:%s/old/new/gc - 替换从x到y行old为new
:x,ys/old/new/g
当忘记加前缀&时,当然可以找到历史命令添加%执行,但也可以g&,等同于:%s//~/&
特殊符号


:%s//\=submatch(0)-1/g将匹配到的数字减一。使用submatch时候需要用.进行字符串拼接,例如:%s//=submatch(0) . "\n" . submatch(0)/g。
查找时换行符为\n,替换时换行符为\r。
自动补全
在插入模式下,使用ctrl+n或者ctrl+p进行自动补全,两者的区别在于,存在多个选项时,ctrl+n是从上向下,ctrl+p是从下向上。
如果只有一个可选项会自动补全,否则会出现一个列表。
在列表界面,可以进行如下操作:
- ctrl+n,向下,同<Down>,不同的是,使用ctrl+n好像可以省去ctrl+y的过程。
- ctrl+p,向上,同<Up>,不同点同上。
- ctrl+y,确认使用
- ctrl+e,还原原来的输入
- ctrl+h,从当前匹配项中删除一个字符,还在匹配中,删掉字符出现多个匹配项时,仍然会存在列表。
- ctrl+l,从当前匹配项中增加一个字符
其余的补全选项为:
- ctrl+x ctrl+i : 从包含文件中获取补全项
- ctrl+x ctrl+] : 从外部标签中获取补全项
- ctrl+x ctrl+k : 从字典文件中获取补全项,字典文件需要自定义,
set dictionary=filename与set dictionary+=filename - ctrl+x ctrl+l : 补全整行
- ctrl+x ctrl+f : 补全文件名,一次操作只会有找到一级目录,存在多级目录时,ctrl+x ctrl+f一次,ctrl+n/p上下滑动,选中以后再ctrl+x ctrl+f
- ctrl+x ctrl+o : 根据编程语言来进行补全
也可以进行多次补全,例如,第一次ctrl+x ctrl+p后,没有ctrl+y的话,再按下ctrl+x ctrl+p,就会把当前选中项的文档位置的后一个词自动补全。
同理,ctrl+x ctrl+l也是一样,会把当前选中项的文档位置的后一个行复制到当前位置。
global
使用格式:[range]global[!]/{pattern}/[cmd]
多个cmd可以用|连接。
global可以缩写为g,不加!时表示对所有符合pattern的行执行cmd,cmd缺省时默认为print。
加!,表示对所有不符合pattern的行执行cmd。此时global!可以写成:vglobal或者:v
也可以采取广义,g/{start}/ .,{finish} [],
对从{start}开始,到{finish}结束的所有文本行,执行指定的[cmd]。也可以通过+1,-1进行微调。
:g/{/ .+1,/}/—1 sort对{}中的所有行进行排序,不算{}所在行。
vim中使用grep
在命令行模式下输入:vimgrep string filelist,使用*表示当前文件夹下所有文件,**表示当前文件夹下所有文件及其子文件。
当文件特别多时,使用vimgrep速度会非常慢,不建议使用。
使用:grep string filelist时相当于调用外部的grep命令,使用*表示当前文件夹下所有文件,加入-R选项表示当前文件夹下所有文件及其子文件。
所有的捕捉到的文件会放到quickfix。
可以:copen或者:cwindow打开quickfix列表。在里面上下跳转,enter进入想进入的文件。
在quickfix列表:q就可以关掉这个列表,或者在正常文件中输入:cclose
也可以:cnext,:cprev,:cfirst,:clast进行跳转,但感觉都比较麻烦。
| 命令 | 作用 |
|---|---|
| :cl[ist] | 使用 more 打开 Quickfix 窗口,不可编辑 |
| :cope[n][num] :cw[indow][num] | 打开 Quickfix 窗口,以Num行的高度列出所有结果 |
| :ccl[ose] | 关闭 Quickfix 窗口。 |
折叠
更多关于折叠的设置进行百度,手动折叠的指令:
V进入可视化模式,选中需要折叠的行,
| 命令 | 作用 |
|---|---|
| zf | 创建折叠 |
| zd | 关闭折叠 |
| za | 可以折叠状态翻转 |
| set foldlevel=0 | 关闭所有折叠 |
| set foldlevel=99 | 打开所有折叠 |
| zR | 递归打开所有折叠 (Recursive) |
| zO | 递归打开当前折叠 (当前光标处) |
| zM | 递归关闭所有折叠 (Max fold) |
| zC | 递归关闭当前折叠 (当前光标处) |
其他
- 快速切换模式
在插入模式时,需要进入普通模式执行一条指令再返回到插入模式,可以手动切换但比较麻烦。
vim提供了快捷键,在插入模式下<C-o>,会切换到插入模式,在这种情况下输入一条指令后会自动切换到插入模式。 - 可视化块模式下修改
- 使用i进入不了插入模式,选中过后可以通过c或I或A进入插入模式。
I在块之前插入,A在块之后插入。
插入模式下只显示第一行的插入,但Esc退出后会在所有行插入内容。 - 通过$可以选中不同长度,但类似w这种并不能选中不同长度。

如图光标在第三行开头时输入w,依然保持矩形,选中长度以所在行的w为主。
- 使用i进入不了插入模式,选中过后可以通过c或I或A进入插入模式。

浙公网安备 33010602011771号