Vim 与 VSCode 天衣无缝的配合
众所周知 Vim 是一种码代码习惯,自然也少不了 VScode 的水乳交融。
毕竟 VSCode 现在可是正统的 “宇宙第一 IDE”,Vim 或者 Nvim 在很多方面显然要甘拜下风,很多时候都不得不重新捡起 VSCode 写代码(甚至尤其是 Windows 上糟糕的终端体验)。所以作为 Vim 的第二期教程,就来讲讲在 VSCode 上如何优雅地使用 Vim。
此外这里也给出了对应的 Vim 插件名称,读者也可以在正常的 Vim 或者 Neovim 上使用这些插件,体验完全一致。
插件#
对于 VSCode,Vim 插件少不了!VSCodeVim ↗ 速速装完了再看下文。
Input Method#
在进入 Vim 编辑模式时自动切换输入法
Null
对于非英文用户,在退出 Insert 模式后需要切换回英文输入模式,这对于偶尔频繁用非英文输入内容时很烦人(比如我正在输入的这篇文章)。这个配置可以在退出 Insert 模式时自动切换到英文,重新回到 Insert 的时候切换回上次退出时候的输入法,大幅降低你的血压。
这可能需要 im-select
或者 fcitx
等工具的支持。不过对于 Windows 官方的微软输入法,推荐使用 AIMSwitcher ↗。它能在不切换输入法语言的请款下,调用微软拼音输入法的中英文切换。
配置参考:
{
"vim.autoSwitchInputMethod.enable": true,
"vim.autoSwitchInputMethod.switchIMCmd": "C:/Users/cworld/.local/bin/AIMSwitcher.exe --imm {im}",
"vim.autoSwitchInputMethod.defaultIM": "0",
"vim.autoSwitchInputMethod.obtainIMCmd": "C:/Users/cworld/.local/bin/AIMSwitcher.exe --imm"
}
jsonvim-surround#
快速帮你选择和操作外框字符
surround.vim
写代码经常碰到外框 <>
、""
、{}
等?surround.vim
插件可以帮你快速选择和操作这些外框字符。即使是 <p>hello world</p>
这样选择起来非常麻烦的内容,也可以通过 yit
来快速选择外框。当然,不只是选择,添加、替换、删除都是一应俱全的。
Surround Command | Description |
---|---|
y s <motion> <desired> | Add desired surround around text defined by <motion> |
d s <existing> | Delete existing surround |
c s <existing> <desired> | Change existing surround to desired |
S <desired> | Surround when in visual modes (surrounds full selection) |
具体玩法 VScode 内部给了快速跳转链接,这里就不展开了。
vim-easymotion#
快速移动光标
vim-easymotion
移动光标确实常常力不从心,从一头跳到另一头可能最快的方法还是鼠标。所以我们有了 easymotion
插件,快速输入你想要找的字母,然后快速跳转(或者快速跳转到后文的任意单词的开头/结尾)。
使用指令很多,这里贴官方表:
Motion Command | Description |
---|---|
<leader><leader> s <char> | Search character |
<leader><leader> f <char> | Find character forwards |
<leader><leader> F <char> | Find character backwards |
<leader><leader> t <char> | Til character forwards |
<leader><leader> T <char> | Til character backwards |
<leader><leader> w | Start of word forwards |
<leader><leader> b | Start of word backwards |
<leader><leader> l | Matches beginning & ending of word, camelCase, after _ , and after # forwards |
<leader><leader> h | Matches beginning & ending of word, camelCase, after _ , and after # backwards |
<leader><leader> e | End of word forwards |
<leader><leader> ge | End of word backwards |
<leader><leader> j | Start of line forwards |
<leader><leader> k | Start of line backwards |
<leader><leader> / <char>... <CR> | Search n-character |
<leader><leader><leader> bdt | Til character |
<leader><leader><leader> bdw | Start of word |
<leader><leader><leader> bde | End of word |
<leader><leader><leader> bdjk | Start of line |
<leader><leader><leader> j | JumpToAnywhere motion; default behavior matches beginning & ending of word, camelCase, after _ and after # |
缺点大概是要动脑子快速输入对应位置,很多时候其实快速行跳转 + f
就定位了。这个都是习惯问题,习惯了肯定好用,故更适用于高阶玩家。
vim-commentary#
快速注释/反注释你的代码行或块
vim-commentary
这玩意被默认启用!使用方法很简单:
gc
注释选中行(gcc
注释当前行,同理gc2j
注释当前两行、gcap
注释当前段落);gC
注释选中段落(同理gCC
、gC2j
)。
vim-sneak#
使用两个字符跳转并操作
vim-sneak
这样的描述会很奇怪,我们需要举例说明:
something.data.set(
'rounded-t-2xl',
inView &&
(this.target.index
? !this.headingProgress[this.tocLinks[i - 1]?.slug].inView
: 'rounded-b-2xl'),
true
)
js假设我想把代码中的 (this.target.index ? ...)
表达式替换为 (this.target. index && <new content>)
,使用传统的查找选择编辑就很是捉襟见肘。但是如果使用了这个插件,我们就可以简化为:
- 前往关键位置
?
- 输入
cz),
- 后续内容全部被清空,进入编辑模式。
指令构成其实是 <operator>z<char><char>
,z
换 Z
就是向前查找。
此外还可以使用 s<char><char>
或 S<char><char>
快速跳转!甚至可以使用 ;
或 ,
重复跳转,可谓是非常便捷了。Vim 还提供了 “把原生的 f
替换成这个插件的” 以及忽略大小写功能,可以按需开启。
vim-textobj-arguments#
快速选择/处理参数
targets.vim
函数作为现代编程的基本单元,参数经常涉及修改。这个插件就能快速选择对应参数:
foo(a.test.backwards, b, c, d)
js光标放在第一个参数上,daa
就能删除整个参数(含分割逗号),cia
就能替换整个参数。这个插件还支持 a
、i
、r
、l
、c
、d
、y
等操作,非常方便。
VSCodeVim tricks!#
这部分内容似乎有点进阶?没事看看就行。
gd
- jump to definition.(一键跳注释,很方便吧?)gq
- on a visual selection reflow and wordwrap blocks of text, preserving commenting style. Great for formatting documentation comments.gb
- adds another cursor on the next word it finds which is the same as the word under the cursor.af
- visual mode command which selects increasingly large blocks of text. For example, if you had “blah (foo [bar ‘ba|z’])” then it would select ‘baz’ first. If you pressedaf
again, it’d then select [bar ‘baz’], and if you did it a third time it would select “(foo [bar ‘baz’])”.gh
- equivalent to hovering your mouse over wherever the cursor is. Handy for seeing types and error messages without reaching for the mouse!
FAQ#
-
There are annoying intellisense/notifications/popups that I can’t close with
<esc>
! Or I’m in a snippet and I want to close intellisensePress
shift+<esc>
to close all of those boxes.