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:变为大写
      可视化模式下,选中相应内容后,也可以使用~uU
      后接范围,比如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=filenameset 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进入不了插入模式,选中过后可以通过cIA进入插入模式。
      I在块之前插入,A在块之后插入。
      插入模式下只显示第一行的插入,但Esc退出后会在所有行插入内容。
    • 通过$可以选中不同长度,但类似w这种并不能选中不同长度。

      如图光标在第三行开头时输入w,依然保持矩形,选中长度以所在行的w为主。

本文作者:xzh-personal-issue

本文链接:https://www.cnblogs.com/xzh-personal-issue/p/18311276

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   心比天高xzh  阅读(37)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起