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]) | 只保留活动窗口 |
- 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 {N}或者{N}gt
光标移动
- 基本移动:hjkl(左,下,上,右)
- 词: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}就可以跳转到该位置。
文本编辑
- 删除当前字符: 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
修饰符
用a表示附近,用i表示内部,通常结合符号使用。
例如:
- 修改[]内部内容:ci[
- 修改()内部内容:ci(
- 删除''中内容与'':da'
- 删除当前词:daw
- 删除当前字符串:daW
缩进
- 增加缩进:>
- 减小缩进:<
- 自动缩进:=
可以进行重复表示缩进当行,加数字表示缩进多行。也可以接修饰符表示缩进范围。
插入模式下支持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来粘贴。 - 黑洞寄存器
"_通常为了在删除文本的同时不影响任何寄存器的值。 - 文件名寄存器
"%为当前文件名,"#为交替文件 - 剪贴板寄存器
"+为剪贴板寄存器。 - 查看寄存器值
:reg可以查看所有寄存器的值,:reg a可以查看a寄存器的值。
录制宏到命名寄存器
q+字母开始录制宏,开始记录操作,操作完按q结束录制。
使用宏时,{N}@字母,可以添加重复次数。
当宏命令中途失败时,例如在文件首行向上移动,会停止执行该宏,可以理解为串行执行,第三次执行的失败,之后都不执行。
也可以通过:%norm @字母执行宏,可以理解为所有行并行执行,行与行互不影响。
命令行模式下
- 操作文本
命令 | 用途 |
---|---|
:[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
将匹配到的数字减一。
自动补全
在插入模式下,使用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 窗口。 |
其他
- 快速切换模式
在插入模式时,需要进入普通模式执行一条指令再返回到插入模式,可以手动切换但比较麻烦。
vim提供了快捷键,在插入模式下<C-o>,会切换到插入模式,在这种情况下输入一条指令后会自动切换到插入模式。 - 可视化块模式下修改
- 使用i进入不了插入模式,选中过后可以通过c或I或A进入插入模式。
I在块之前插入,A在块之后插入。
插入模式下只显示第一行的插入,但Esc退出后会在所有行插入内容。 - 通过$可以选中不同长度,但类似w这种并不能选中不同长度。
如图光标在第三行开头时输入w,依然保持矩形,选中长度以所在行的w为主。
- 使用i进入不了插入模式,选中过后可以通过c或I或A进入插入模式。
本文作者:xzh-personal-issue
本文链接:https://www.cnblogs.com/xzh-personal-issue/p/18311276
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步