バックトラック#
nvim への移行について話す前に、なぜ私が nvim を使用する必要があるのかについて話しましょう。
もし私が大学 4 年生の時になぜ vim をいじる必要があるのか尋ねられたら、私は見栄を張るためだと言うでしょう。当時、Python の入門のために黒馬のビデオを見つけ、スクレイピングを教える講師が私に Vim を見せてくれました。私はそれについて様々な情報を探しましたが、最終的にvimplusを使うことにしました。これは私が GitHub で最初にスターをつけたものです。しかし、それは一時的なものでした。一方で、私の大学のコンピュータは 1 年生の時に 2000 ドル以上で買ったもので、仮想マシンで Vim を使うといつも「カード」のような感じがしました。他方で、私は Vim についてもっと知らなかったし、ショートカットキーもプラグインも理解していませんでした。vimplus が提供する多くの機能の中で、私はテーマしか使っていませんでした。
仕事を始めてから、同僚の影響で pycharm に vim プラグインをインストールしましたが、普通モード、挿入モード、コマンドラインモードの切り替えとカーソル移動にしか使っていませんでした。
変化が起こったのは、13 インチの MacBook Pro を手に入れた時です。方向キーが本当に小さくて、使いにくいです。毎回カーソルを移動するたびに苦痛を感じました。仕方なく、私は hjkl を覚えました。冒険の旅に一歩踏み出した後、あなたは前に進む運命になります。茨を折ることはできないかもしれませんが、終点から遠ざかることはありません。だから、徐々に、私は仮想モード、テキストオブジェクト、マーク、ウィンドウなど、コーディングを助けるための操作を学びました。コードを書くときにはマウスや方向キーから遠ざかることができました。
もし今、なぜ nvim をいじる必要があるのか尋ねられたら、私はクラックソフトウェアから離れたいと言うでしょう。会社では正規の JetBrains IDE を使用し、家ではクラック版を使用していますが、それでもあまり幸せではありません。Vim を nvim に置き換えたのはかなり前ですが、今年の 4 月に lua の設定をサポートしていることを知り、pycharm を nvim に切り替えるという野心が再び湧いてきました。
今日まで、私は nvim を使ってプログラミングをするようになってから 1 ヶ月以上経ちましたので、私の移行の旅について話しましょう。
習慣#
まず、私が仕事で依存している IDE の機能を整理しました。これらの機能が nvim でも実現できるなら、IDE から nvim に切り替えることができるようになります。これらの機能を必要かつ緊急、必要だが緊急でないものに分類しました。
必要かつ緊急#
必要かつ緊急な機能は次のとおりです:
- カーソル移動
- ファイルジャンプ
- コード補完
- シンボルの参照(変数、関数、クラスの参照)
- ディレクトリツリー
- ファイル名とファイルの内容の検索
これらは私がプログラミングの過程で強く依存している能力であり、「なければ死ぬ」と言えるものです。
カーソル移動、ファイルジャンプは、IDE で vim プラグインを使用して操作しているもので、nvim でも自然に使用できます。他の機能はどうでしょうか?私は長い間 nvim を見てきましたが、これらの機能をサポートするプラグインが必ず存在すると知っています。最終的にNvChadを見つけました。いくつかの nvim ディストリビューションを比較しましたが、個人的には NvChad が一番好きです。最小限の機能セットを実現しており、重くなりません。NvChad に必要な機能がない場合、カスタム設定を追加する方法を学ぶだけで済みます。そこで、私はすぐに~/.config/nvim/lua/
ディレクトリの下にカスタムディレクトリを作成し、カスタム設定を保存するために使用しました。
NvChad の下で、ディレクトリツリーのオープンまたはクローズはC-n
で行います。ファイル名の検索は<leader>ff
、ファイルの内容の検索は<leader>fw
です。シンボルの参照はgr
です。コード補完には lspconfig の設定が必要です:
すべて実現できました。つまり、私は nvim を使ってプログラミングすることができます。しかし、実際には、この段階では私は家でしか nvim を使っておらず、仕事ではまだ IDE を使っています。
必要だが緊急でない#
必要だが緊急でない機能は次のとおりです:
- シンボルツリー
- git blame
- git diff ローカルファイル
- ウィンドウセッション
- コードの折りたたみ
- ブックマーク
これらは私がプログラミングの過程で低頻度で使用する機能であり、「ないと作業効率が低下する」と言えるものです。
NvChad の下で、git blame は:Gitsigns toggle_current_line_blame
で実行します。git diff ローカルファイルは:Gitsigns diffthis
です。コードの折りたたみは nvim 自体でサポートされています(:help fold
)。
他の機能はプラグインで実現します:
- シンボルツリー:symbols-outline.nvim;
- ウィンドウセッション:rmagatti/auto-session、zwhitchcox/auto-session-nvim-tree;
- ブックマーク:ChristianChiarulli/bookmark.nvim
この段階で整理が完了し、私は仕事で基本的にnvim に依存して開発しています。ここで事前に申し明けますが、ChristianChiarulli/bookmark.nvim はブックマークとしてはあまり良い選択肢ではありません。それはまだ新しく出てきたものであり、作者が計画している多くの機能が実装されていません。使用中に明らかなバグに遭遇し、私は 2 つのバグを修正しました。私は少し私的な思いがあり、その不完全さを利用して Lua プラグインの学習目的を達成したかったのです。
必要でも緊急でもない#
必要でも緊急でもないものは、私が IDE で使用したことがなく、nvim プラグインを調べている中で見つけたいくつかの機能で、「糖衣をつける」ものです:
- ホームページ:goolord/alpha-nvim
- キーワードのハイライト:Mr-LLLLL/interestingwords.nvim
- カーソルの高速移動:
私は現在この探索段階にいます。多くのプラグインを試しては削除しました。NvChad 自体の統合を除いて、追加したプラグインはほとんどありません。本質的には「質より量」を望んでいます。
慣れていない#
仕事で nvim を使用して開発する際には、まだ使いにくいところがあります。
慣れていないコードチェック#
私たちの Python プロジェクトは pep484 に従っていないため、pyright によるコードチェックは多くのエラーや警告を表示します。邪魔にならないようにするために、厳格なチェックをオフにするしかありません:
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 では動作しないようです。私は MacBook を持っていますが、開発ツールが特定のオペレーティングシステムに依存することは避けたいです。だから諦めました。
同時に、Go も書いています。goland は、struct がどのインターフェースを実装しているか、あるインターフェースがどの struct によって実装されているかを表示する機能をサポートしています。現時点では、同様のプラグインを見つけることができませんでした。
これらの不満は、依存ライブラリのコードを深く読むときに浮かび上がるものであり、必要だが緊急でない機能であり、作業効率を低下させます。一度遭遇すると、pycharm や goland を使うしかありません。幸いにも、非常に低頻度です。
最後に#
私にとって、完全に JetBrains IDE を排除するためにはまだ時間がかかります。少なくとも、nvim での「慣れていない」体験を解決するまで待たなければなりません。幸いにも私は焦っていません。ゆっくりと移行しています。最終的に解決できない場合、おそらく自分で Lua プラグインを書くことになるでしょう。Vimscript 時代なら、そんな大それたことは言えませんでした(笑)。
もし誰かが尋ねたら、「なぜ VSCode を使わないの?」と言われたら、私はそれは個人の選択だと答えるでしょう。
(私の nvim の設定:https://github.com/youguanxinqing/Config/tree/master/vim/nvchad)