VSCodeVim 最佳实践

20 Sep 2019 - 周岩

1. Preface

初学者在学了一些 Vim 入门教程,掌握了一些基本操作后,往往不知道从何下手,日常工作中不太可能在终端下直接写代码,何况直接终端用 Vim 写代码,还需要大量插件的支持。

其实我认识的很多 Vim 用户,现在已经不用原生 Vim 了,都是先选一个自己喜欢的编辑器/IDE, 再装 Vim 插件,基本上没有哪个现代编辑器/IDE没有 Vim 插件的了。

我比较喜欢 VSCode,日常工作也是用 VSCode 写代码,所以今天就来介绍下 VSCode 里 Vim 插件的一些设置和应用技巧,至于是不是最佳实践不重要,起这样的标题完全是不知道用什么好,权当做一回标题党吧。

2. 编辑器选择

在讲具体内容之前,先介绍几个编辑器的 Vim 插件现状, 顺便解释下我为什么要选 VSCode:

3. VSCode Vim 插件的安装

上面说了那么多,对于初学者来说,建议直接用 VSCode 吧,不折腾。

安装非常方便,打开插件界面,输入 Vim,第一个就是,点安装即可。

800多万的安装量,感受下 Vim 用户的庞大,是不是感觉不用 Vim 和时代脱离了:)

4. 最佳实践

4.1 settings.json 配置

{
    "vim.easymotion": true,
    "vim.leader": ",",
    "vim.searchHighlightColor": "#5f00af",
    "vim.hlsearch": true,
    "vim.normalModeKeyBindingsNonRecursive": [
        { "before": ["H"], "after": ["g", "T"], },
        { "before": ["L"], "after": ["g", "t"] },
    ],

    "editor.lineNumbers": "relative",
    "files.autoSave": "onFocusChange",
    "workbench.editor.enablePreviewFromQuickOpen": false,
    "editor.renderWhitespace": "boundary",
    "editor.detectIndentation": false,
    "showMusicMetrics": false,
    "showGitMetrics": false,
    "showWeeklyRanking": false,
    "editor.minimap.enabled": false,
    "git.autofetch": true,
}

首先把上面的配置放到自己的配置文件里,Mac 平台点左上角 Code->Preferences->Settings-> 在右边往下拉,找到 Edit in settings.json, 把上面内容放进去,大括号自己去掉。

解释几个:

Vim 相关的

Vim 无关的

4.2 行级操作(删除、注释、左移右移)

上面设置了相对行号后,才能方便的做多行操作,在做具体操作前,先说单行操作分别是什么:

上面的操作,在 v 模式下,都可以生效,可以试一下按 Shift+v 选中一行,然后分别按 d, gc,<, >, 看看是不是删除、注释、左移、右移

好了,有了上面的这些知识,我们可以开始多行操作了,具体操作方法如下:

4.3 切换标签

对于标签开的比较多时怎么操作,我的习惯是这样的:

4.4 调整光标所在行的位置(Vim基本功能)

这三个用的非常多,尤其是 zz, 一定要熟练使用

4.5 文件内快速搜索某个函数、变量(Vim基本功能)

把光标移到想搜索的那个函数名或变量名上,按*就可以搜索了,按n下一个,按N上一个。

比如看到类里有个成员变量,想去回到它的定义处看有没有注释说它是干嘛的,一般定义的地方肯定是文件内第一次出现的地方,我们可以这么操作:

这4步熟悉后基本一气呵成

4.6 对一个单词进行操作

这里先说两个概念,操作符(operator)和动作命令(motion), 操作符就是 d(delete), c(change), y(yank) 等等,动作命令是iw(in word), aw(a word)这些,可以通过 操作符 + 动作命令的方式,组合出千变万化的操作出来,帮助我们快速移动、修改等等。

完整列表可以在 Vim 里输入 :h motion.txt 查看,这里只列出一些常用的。

4.6.1 操作符(Operators)

操作符 功能
c change (先删除再进入插入模式)
d delete
y yank into register (does not change the text)
~ swap case (转换大小写)
gu make lowercase (转为小写)
gU make uppercase (转为大写)
> shift right (右移)
< shift left (左移)

4.6.2 动作命令(Motions)

动作命令 功能
f{char} find, 行内搜索一个字符
t{char} till, 功能类型 f{chat}, 但是是在这个搜索到的字符前停下,意思是到这个字符之前,很常用的motion
gg 跳到行首
G 跳到行尾
w 移到下个单词的第一个字符
b 移到上个单词的第一个字符
e 移到单词最后一个字符
ge 上个单词的最后一个字符
aw “a word”, 选择一整个单词,包括它边上的空格
iw in word, 选择一整个单词,不包括空格

4.6.3 举例:

还有很多,这样只要记住一个,就可以举一反三,所以 Vim 是不需要死记硬背的,理解着记会更快。(当然不排除一些要死记硬背,但比较少)

4.7 把一个单词改成另一个(通过复制)

比如有下面一段代码:

local _hello = true
function test()
    print(_world)
end
-- 用复制的方式把 _world 改成 _hello

这个问题看起来很简单,但实际上用起来后就会发现并不简单,我们用鼠标时的操作逻辑是下面这样的:

想象中的 Vim 操作逻辑是下面这样的:

这时你会发现,咦,贴出来的还是 _world, 而不是期望中的 _hello, 这是因为 Vim 里的删除,实际上是剪切,会把删除的东西放到“剪切板”里,所以我们不能这样操作,而应像下面这样操作:

这个操作是目前的最优解了,《Vim 实用技巧》这本书里给的也是这个方案(我是先自己发明这个方案才看的书:),这个方案虽然也很别扭,但是够用了,习惯了也不是不能接受。

4.8 EasyMotion 文件内快速跳转

4.9 回到上一个编辑点

4.10 代码的快速翻页

这四个非常常用,尤其是读代码时,我们不可能按住 j/k 不放去翻代码。

4.11 分栏

在创建多个分栏后,怎样在分栏之间移动?总不能用鼠标吧!当然不需要,下面就是移动分栏的方法:

按下 ctrl+w 后,就进入“移动分栏待决模式”了,这时按 hjkl 就可以移动了。

分栏在屏幕比较大时还是很方便的,有时候写代码时,要看着另一块代码,也很方便。

5. Postface

暂时就想到这些,还有很多比较常用的,想到了再补充。以上这些如果能掌握,基本上在 VSCode-Vim 环境下写代码足够了,等真正用进去了,才会发现有很多不会的或者不方便的点,这时要学会去 Google 或请教别人,只有这样才能不断强化,最终让 Vim 操作变成肌肉记忆。