我又开始折腾 NeoVim,这次能否代替 VSC
使用 NeoVim 能带来什么?和传统编辑器相比优势在哪
下面的内容大概很多人不会看了,所以我决定先写这个部分。看完之后,再做决定要不要配置它,因为这是一件非常漫长却又享受的过程,同时你有需要习惯 hjkl 的横向移动和大量快捷键。
使用 Vim 最大的优势就是可以舍弃鼠标,在写代码时候不会因为需要用到鼠标去定位而出现了停顿时间,没有停顿时间可以更加专注去编码。
其次就是它非常快,启动时间在 100ms 之内,内存使用非常小,响应速度非常快,不会像某些 IDE 96G 的内存都不够用的。
有了插件的加持你可以很快速的做到以下经常遇到的问题。
- 选区
在 VSC 中选择一个块级作用域的代码从一处搬到另一处可能需要借助鼠标的拖动来完成块级作用域的选区。而在 NeoVim 中使用 Treesitter 的 increase selection 你只需要按几下 Enter
。
另外 NeoVim + Treesitter 提供了非常多的 textobjects 可以非常方便的选区和删除修改文本对象。
- 增加/修改/删除括号配对
在 VSC 不知道一般都是怎么操作的,我的话是鼠标选区配合键盘剪贴然后加括号再粘贴。这里需要花费很多时间。而在 NeoVim 中使用 mini-surround。
- 快速移动
如果 VSC 中在当前视图中看到一个关键字,想把光标移动那个地方然后输入,可能需要用到鼠标。但在 NeoVim 中使用 flash.nvim 的能力的话。比如我想移动到 console.log
然后删除这行。
- 上下文快速移动
- 模糊匹配
根据路径和文件内容去模糊匹配内容也是 VSC 做不到的。
前情摘要
从刚开始接触 NeoVim(下文简称 nvim)已经 3 年了,记得那个时候还是 nvim 0.4.x 半年多过去了还停留在 0.5 的 dev 版本迟迟等不到 0.5 stable 的到来。
那个时候,我还在写 Vue 2,nvim 上还没有 telescope.nvim 也没有 nvim-lsp,虽然已经不是 YouCompleteMe 的时代,但是 nvim 还是没有性能上很优秀的 lsp,那时候我们都在用 coc.nvim,这是一个由 NodeJS 驱动的 lsp,因为 NodeJS 的运行时和采用了 VSC 一致的接口,可以非常方便的把 VSC 的插件移植到 coc 上,但是由于 coc 的性能堪忧,再加上 coc 生态变化快。最后我还是选择放弃了使用 nvim 作为主要的编辑器。
过去两年中,nvim 进入了 lua 时代,这段时间中我也有时关注 nvim 圈子,折腾折腾好玩的插件,但是由于原本的配置基本都是 VimScript 的很难再迁移到 lua,虽然可以两者混用,但是堪忧的启动速度和繁多的快捷键我早已忘记。
这次又一次看到了 theniceboy 的视频,自己迁移 nvim 配置到 lua 后的体会,让我也心里痒痒,再一次开始配置 nvim 了,而这一次彻底把原本一千多行的配置全部推到重来。
开始
使用 kitty 作为承载 nvim 的终端模拟器。因为 kitty 支持波浪线,性能足够快,渲染字符比 iTerm2 更优秀。相比 Alacritty 它的配置更加简单。而且它的图标很萌。
nvim 社区一直都是很活跃的,插件生态也很庞大。目前在社区中,有以下的开箱即用的配置:
从 star 数看,AstroNvim 是比较多的,社区维护的预设插件配置也很多,而且主配置和用户配置分离,后期会比较好维护,也不太有心智负担。新手推荐可以直接用这个,然后熟悉预设键位。
注意的是,以上每个的预设键位都是不同的所以一旦习惯一个之后就很难再换一个了。这里需要选择最适合你的。
我使用的是 LazyNvim。
git clone https://github.com/LazyVim/starter ~/.config/nvim
rm -rf ~/.config/nvim/.git
安装完之后就可以使用了,基本的功能都有,lsp telescope treesitter 都配置好了。然后可以去看看这个视频熟悉一下基本操作:
这里我就不说了,不想折腾的自然也不会看到这里,想折腾的自己早去看官方文档了。我扯这么多也没有用,毕竟不是教程贴。
按键移动
作为 vim 党和 qwerty 键盘布局,hjkl 的移动是不可少的,使用 Hammerspoon map 系统键位,把上下左右 map 到 <Caps-hjkl>
,对了我现在是在设置中改键 CapsLock 也是 Control 键。Control 也是 Control,完全弃用 CapsLock 了。
映射 hjkl 配置如下:
https://gist.github.com/Innei/695460015ba94e8d163d3665d707c6b4
迁移常用配置
前面说了我之前是有一千多行的配置的,虽然这次从头开始了,但是有些配置还是需要去配一下的。
目前我配置了以下的 options,其他都使用 LazyNvim 默认值。
local opt = vim.opt
opt.clipboard = "unnamedplus"
opt.wrap = true
opt.clipboard = ""
opt.spelllang = "en,cjk"
opt.spelloptions = "camel"
opt.scrolloff = 5
opt.indentexpr = ""
opt.foldmethod = "indent"
opt.foldlevel = 99
opt.foldenable = true
opt.foldlevelstart = 99
开启了代码折叠了,禁用了系统剪贴板同步,开启代码超出换行,光标距离底部保持 5 行。就没别的了。
然后是一些常规 keymap,; 到 : 还是很方便的。y 到 +"y
只有 y 才会复制到系统剪贴板。到 <C-g>u
这个就很特殊了,可以解决 nvim 在输入模式下 undo 范围过大。这样的话一个空格会作为一个记忆点。同样的可以把 = 也做一下。
上面还有一些 keymap 为 kitty 准备的。在使用 kitty 时,可以对 nvim 专门做一些字符映射。比如我在 kitty 中配置了在 nvim 中把 ⌘P 组合按下时发送 ⌥P 的字符序列,然后在 nvim 做 <M-p>
的 keymap 到 :Telescope fd
就可以做到 VSC 的 ⌘P 一样了。
其他的我还做了 ⌘S, ⌘D, ⌘C, ⌘X 等等。
(此灵感来自 sxyazi)
插件分享
插件是 nvim 作为主力编辑器的第一生产力。LazyNvim 自带的我就不推荐了,大家都用,默认就好。
better-escape.nvim
可以消除 jk 之后的字符等待。可以用,也不是很必要。
fedepujol/move.nvim
可以对选区做一些块级移动。
LunarVim/bigfile.nvim
可以对大文件提速。但是我还是建议使用 VSC 去打开大文件,目前用下来只有 VSC 对大文件的支持最好,打开速度最快,最流畅。
dstein64/nvim-scrollview
可以给 nvim 右侧加上滚动条指示器。
AndrewRadev/switch.vim
很方便的在 false
和 true
直接切换。
Wansmer/treesj
根据 ast 对多行作用域合并到一行,或者相反。还是很方便的。
mbbill/undotree
没用过几次,但是关键时候挺有用的。回溯 undo 历史。
gbprod/yanky.nvim
剪贴板记录。
Eandrju/cellular-automaton.nvim
没卵用的东西,just for fun。
下代码雨。
Bekaboo/dropbar.nvim
类似 VSC 的面包屑导航,需要 nvim > 0.10。