vim模式

vim主要分为几种模式:普通、命令、插入、可视

其中普通模式是vim启动时默认的模式,非普通模式之间的切换,需要回到普通模式才能进行切换。

  • 普通模式 --> 插入模式:通过i、a、o等进入

    i在光标前插入 I在行首插入

    o在下一行插入 O在上一行插入

    a在光标后插入 A在行尾插入

  • 插入模式 --> 普通模式:通过ESC退出插入模式

    由于ESC键较远,往往的我们会映射一些键作为ESC,例如j jCapsLock等,这个可以根据个人喜好来进行映射

  • 普通模式 --> 可视模式:通过v进入

  • 可视模式 --> 普通模式:通过ESC或者再按一边v退出

  • 普通模式 --> 命令模式:通过:进入

  • 命令模式 --> 普通模式:命令以回车结束运行,或者通过ESC退出

光标移动

vim的光标移动均是在普通模式下移动的

字符为单位(类似方向键)的光标移动是使用hjkl进行移动

image-20221118132303565

单词为单位的移动

  • w(word)跳到下一个单词的开头
  • b(begin)跳到本单词或上一个单词开头
  • e(end)跳到本单词或下一个单词的结尾
  • ge跳到上一个单词的结尾

image-20221118134249940

为单位的移动

  • 0跳到行首
  • ^跳到行首开始的第一个非空字符
  • $跳到行尾
  • gg跳到第一行
  • G跳到最后一行

跳转到同一行下一个指定字符 {char}一个字符

  • f{char}光标跳到下个{char}
  • F{char}光标跳到上个{char}
  • t{char}光标跳到下个{char}前一个字符的位置 //不常用
  • T{char}光标跳到上个{char}的后一个字符的位置 //不常用
  • ;重复上次跳转操作
  • ,反向查找上次的查找命令

操作符与动作

操作符也是在普通模式下进行使用。

操作符是在告诉vim我们要干什么

主要有四个操作符:

  • d(delete) 删除

    dd删除一行 ndd删除n行,n为数字

  • c(change) 修改(删除并进入插入模式)

    cc删除一行并进入插入模式 ncc删除n行并进入插入模式,n为数字

  • y(yank) 复制

    yy复制一行

  • v(visual) 选中并进入VISUAL(可视)模式

动作是告诉vim我们要怎么做,在使用操作符后,我们在的字符处的光标会变成半高的符号,接下来我们加上动作,注意:再键入一次的d也是一个动作

动作同样是有ia两个,它们实际上代表的意思是inneraround

image-20221119012302660

它们主要的区别是包含(i)与不包含(a)两边的符号

一些常见动作motion

1
2
3
4
5
6
7
8
iw  :  当前单词
aw : 当前单词及一个空格
iW : 当前字符串
aW : 当前字符串及一个空格
is : 当前句子
as : 当前句子及一个空格
ip : 当前段落
ap : 当前段落及一个空行

d(delete)操作符常用的示例有

  • diw删除当前单词
  • di( / dib删除当前小括号内的所有内容 注:b是(的替代
  • da{ / daB删除当前包括大括号在内的所有内容 注:B是{的替代
  • df{char}删除当前直到{char}处的内容
  • d^ / d$删除当前直到开头(^) / 结尾处($)的内容
  • die删除整个文件的内容
  • dit删除一个HTML标签内的全部内容

一些额外的补充

  • p(paste)粘贴
  • u(undo)撤回一个操作符+动作

上面讲的主要是d、c、y三个操作符,这三个操作符比较相似,接下来我们说v

v操作符是进入一个选择的模式,可以快速进入选择模式,进入后可以在后面添加我们的动作,如d删除选中的,iw选中一个单词等等

大小写转换

大小写转换比较简单

  • ~将光标下的字母改变大小写
  • {n}~将光标位置开始的{n}个字母改变大小写
  • g~~改变当前行字母的大小写
  • gUU将当前行的字母改成大写
  • guu将当前行的字母改成小写
  • gUiw(gUaw)将光标下的单词改成大写
  • guiw(guaw)将光标下的单词改成小写

大小写转换也可以配合v操作符一起使用,在v操作符选中后,再使用U转换为大写,或者使用u转换为小写

开发Tips

  • gd(goto definition)查看函数实现

  • gh(goto hover)类似于鼠标悬浮查看的效果

  • gt往后跳转标签页 gT往前跳转标签页 {n}gt跳转到第{n}个标签页

  • ctrl+0跳转到资源管理器侧边栏,其他数字代表不同页面

    space展开文件夹、打开文件

插件

Easymotion

easymotion是vim的一个插件,在vscode的vim插件默认自带了这个插件

1
"vim.easymotion": true

通过这个来开启,在默认给出的配置文件,该插件是启用的

这个插件增加了快速跳转的功能,通过<leader>加上一些动作来完成操作,在vscode的vim的默认配置文件中,<leader>的默认指定为<space>

1
"vim.leader": "s"

我们通过这个可以修改<leader>使用的按键,使用快速跳转模式后,都会出现类似的界面

image-20221119190436775

以上示例是在使用<leader><leader>b出现的界面,我们按下我们想跳转位置的有颜色的字母即可跳转到对应位置

它的具体用法有以下几种

  • 前后位置跳转

    <leader><leader>w(word)当前光标后面位置的单词开头

    <leader><leader>b(back)当前光标前面位置的单词开头

  • 搜索跳转

    <leader><leader>s{char}(search)搜索全部{char}的位置

    <leader><leader>f{char}搜索当前光标后面全部{char}的位置

    <leader><leader>F{char}搜索当前光标前面全部{char}的位置

还有很多种用法,可以前往官方提供的文档进行查看

在实际使用中<leader><leader>w/b已经涵盖了大部分场景,几乎用不上其他用法

vim-surround

这个插件的主要作用是对含括类符号({}、()、""等)添加了动作 s–>surround(环绕)

  • ds{char}删除两边的{char}

  • cs{char1}{char2}将两边的{char1}替换为{char2}

  • ys{motion}{char}在动作{motion}选中的部分两端添加{char}

  • S{char}在v模式下用{char}括起来选中的

  • gs{char}在v模式下用{char}括起来选中的,括号内文本做新一行

    例:

    1
    2
    3
    4
    Hello world!` =>
    `Hello {`
    `world`
    `}!

建议参考文档、视频

https://github.com/ahrencode/Miscellaneous/blob/master/vim-cheatsheet.pdf

指尖飞舞:vscode + vim 高效开发(系列视频)_哔哩哔哩_bilibili