回溯#
在說向 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:
全做到了。也就是說,我已經可以用 nvim 編程了。但事實卻是,這個階段我僅僅在家使用 nvim,工作中仍是用 IDE。
必要不緊急#
必要不緊急的功能有:
- symbol 樹
- git blame
- git diff 本地文件
- 窗口會話
- 代碼折疊
- 書籤
這些是我編程過程中低頻使用的功能,屬於 “沒有會降低工作效率”。
在 NvChad 下,git blame 執行 :Gitsigns toggle_current_line_blame
;git diff 本地文件 :Gitsigns diffthis
;代碼折疊 nvim 本就支持(:help fold
)。
其他功能通過插件實現:
- symbol 樹:symbols-outline.nvim;
- 窗口會話:rmagatti/auto-session,zwhitchcox/auto-session-nvim-tree;
- 書籤:ChristianChiarulli/bookmark.nvim
這個階段梳理完成,我在工作中就基本依賴 nvim 開發了。這裡提前申明,ChristianChiarulli/bookmark.nvim 作為書籤不是很好的選擇,它剛出來不久,作者規劃的許多功能還沒有實現,使用過程中遇到了明顯的 bug,我順手修過兩個。我是有一點私心的,想借助它的不完美來達到學習寫 lua 插件的目的。
不必要不緊急#
不必要不緊急是我在 IDE 中沒有用過、但研究 nvim 插件時發現的一些功能,屬於 “錦上添花”:
- 首頁:goolord/alpha-nvim
- 高亮關鍵字:Mr-LLLLL/interestingwords.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
退出來,目錄樹的根目錄就變成了所在文件的目錄,而不是項目根目錄。並且,我好像沒辦法再回到項目根目錄。
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)