(不)习惯:向nvim的迁徙

工具 2023-07-08 4183 字 1189 浏览 点赞

回溯

在说向 nvim 迁徙之前,我想先聊聊我为什么要用 nvim。

要是在我大四的时候问我为什么要折腾 vim,我会说为了装逼。当时为了入门 python 找来黑马视频,教爬虫的讲师一手 vim 秀花我的眼。我为此百般搜索,最后用上了 vimplus。它也是我在 github 留下的第一个 star。但这次只是浅尝则止。一方面,我大学的电脑是大一2000多块买的,在虚拟机中使用 vim 总给我一种很“卡”的感觉;另一方面,我对 vim 没做更多了解,快捷键、插件都不懂,在 vimplus 提供的众多能力中,我只用上了主题。

工作之后在同事的影响下我给 pycharm 装了 vim 插件,也只是在熟练地切换正常模式、插入模式、命令行模式,光标移动依赖方向键。

转变发生在我入手一台 13 寸的 mac pro。它的方向键真的很小,且“偏安一隅”,每次移动光标都令我痛苦。无奈中,我学会了 hjkl。当你在冒险旅途中踏出第一步后,你就注定一路向前,也许做不到披荆斩棘,但也不会离终点越来越远。所以慢慢的,我学会了 virtual mode,text object,mark,window 等一些方便我写代码的操作。我做到了写代码的时候远离鼠标和方向键。

要是现在问我为什么要折腾 nvim,我会说想要远离破解软件。在公司使用正版的 JetBrains IDE,在家使用盗版,终归有些不快乐。尽管我老早就把 vim 换成了 nvim,但今年 4 月份才了解到它支持 lua 配置,将 pycharm 切到 nvim 的雄心壮志又冉冉上升起来。

到今天截至,我在工作中使用 nvim 编程已有一个多月,是该聊聊我的迁徙之旅了。

习惯

首先,我梳理出工作中依赖了 IDE 的哪些功能。如果这些能力 nvim 也能做到,那从 IDE 切到 nvim 就具有可操作性。我将这些功能按必要且紧急,必要不紧急分类。

必要且紧急

必要且紧急的功能有:

  • 光标移动
  • 文件跳转
  • 代码提示
  • 查看符号引用(变量或函数或类的引用)
  • 目录树
  • 文件名和文件内容搜索

这些是我编程过程中强依赖的能力,属于“没有就会死”。

光标移动、文件跳转是我在 IDE 中基于 vim 插件操作的,它俩在 nvim 中天然可用。其他呢?我站在岸边观望 nvim 好些年了,知道这些功能一定有现成的插件支持,最终找到了 NvChad。我对比过好几个 nvim 发行版,个人偏爱 NvChad,它实现了最小的功能集,不会显得臃肿。如果遇到了我需要但 NvChad 没有的功能,我只要学会如何在 NvChad 添加自定义配置即可——于是,我立即在 ~/.config/nvim/lua/ 目录下创建了 custom 目录,用来存放自定义配置。

在 NvChad 下,打开或者关闭目录树只需要 C-n;文件名搜索 <leader>ff,文件内容搜索 <leader>fw;查看符号引用 gr;代码提示需要配置 lspconfig:

image-20230708111800589

全做到了。也就是说,我已经可以用 nvim 编程了。但事实却是,这个阶段我仅仅在家使用 nvim,工作中仍是用 IDE。

必要不紧急

必要不紧急的功能有:

  • symbol 树
  • git blame
  • git diff 本地文件
  • 窗口会话
  • 代码折叠
  • 书签

这些是我编程过程中低频使用的功能,属于“没有会降低工作效率”。

在 NvChad 下,git blame 执行 :Gitsigns toggle_current_line_blame;git diff 本地文件 :Gitsigns diffthis;代码折叠 nvim 本就支持(:help fold)。

其他功能通过插件实现:

这个阶段梳理完成,我在工作中就基本依赖 nvim 开发了。这里提前申明,ChristianChiarulli/bookmark.nvim 作为书签不是很好的选择,它刚出来不久,作者规划的许多功能还没有实现,使用过程中遇到了明显的 bug,我顺手修过两个。我是有一点私心的,想借助它的不完美来达到学习写 lua 插件的目的。

不必要不紧急

不必要不紧急是我在 IDE 中没有用过、但研究 nvim 插件时发现的一些功能,属于“锦上添花”:

当下我正处于这个探索阶段。我试玩过很多插件,又删掉了很多。除去 NvChad 自身集成,我额外添加的插件还很少,本质上希望“在精不在多”。

不习惯

工作中使用 nvim 开发还是有不顺手的地方。

不习惯的代码检查

我们的 python 项目没有遵守 pep484,导致 pyright 做代码检查会给出大量的 error、warn 信息。为了降低干扰,我只能关掉严格检查:

settings = {
    python = {
        analysis = {
            diagnosticMode = "openFilesOnly",
            typeCheckingMode = "basic",
            diagnosticSeverityOverrides = {
                reportGeneralTypeIssues = "none",
            },
        },
    },
}

尽管还是会有“误报”,但已然勉强可用。

不习惯的代码阅读体验

当我需要跳入依赖的第三方包,目录树不会跟着切换。这是因为离开了项目的根目录,而 nvim-tree/nvim-tree.lua 配置为不更新根目录 update_root = false。我改为 true 后,跳进依赖包目录树会跟着切换了,但 C-t 退出来,目录树的根目录就变成了所在文件的目录,而不是项目根目录。并且,我好像没办法再回到项目根目录。

image-20230708164029928

Bekaboo/dropbar.nvim 插件能解决我遇到的问题,但好像它不能在 windows wsl 中运行。我虽然有 mac 电脑,但我不想自己的开发工具依赖具体的操作系统。遂放弃。

同时我也在写 go。goland 支持查看 struct 实现了哪些接口、某个接口被哪些 struct 实现了。目前我还没有找到类似的插件。

这些不爽在我深度阅读依赖库代码的时候才会浮现,属于必要不紧急功能,会降低工作效率。一旦遭遇,只能乖乖打开 pycharm 或者 goland。好在非常低频。

最后

对我来说,在工作中完全杜绝 JeBrains IDE 还需要一些时间,至少要等我解决掉在 nvim 中的“不习惯”体验。还好我并不着急,佛系迁徙不赶时间。如果最后怎么也解决不了,或许我会自己写 lua 插件。如果是在 vimscript 时代,我不敢说这种大话(笑)。

要是有人问起:那你为什么不用 vscode 啊?我会答,这是个人选择。

(我的 nvim 配置:https://github.com/youguanxinqing/Config/tree/master/vim/nvchad



本文由 Guan 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论