バックトラック#
nvim への移行について話す前に、なぜ私が nvim を使用する必要があるのかについて話しましょう。
もし私が大学 4 年生の時になぜ vim をいじる必要があるのか聞かれたら、見栄を張るためだと答えるでしょう。当時、Python の入門のために黒馬の動画を見つけ、スクレイピングの講師が私に vim を見せてくれました。私はそれに魅了され、様々な検索をし、最終的にvimplusを使うことにしました。それは私が GitHub で最初にスターをつけたものでもあります。しかし、それは一時的なものでした。一方で、私の大学のコンピュータは 1 年生の時に 2000 ドル以上で買ったもので、仮想マシンで vim を使うと常に「カード」のような感じがしました。他方で、私は vim についてあまり詳しく知りませんでした。ショートカットキーもプラグインも理解していませんでした。vimplus が提供する多くの機能の中で、私はテーマだけを使っていました。
仕事に就いた後、同僚の影響で pycharm に vim プラグインをインストールしましたが、通常モード、挿入モード、コマンドラインモードの切り替え、カーソルの移動は方向キーに依存していました。
変化は私が 13 インチの MacBook Pro を手に入れた時に起こりました。その方向キーは本当に小さく、「隅に追いやられて」いて、カーソルを移動するたびに私を苦しめました。仕方がないので、私は hjkl を覚えました。冒険の旅に一歩踏み出した後、あなたは前に進む運命になります。茨の道を歩むことはできないかもしれませんが、終点から遠ざかることもありません。だから、私は徐々に virtual mode、text object、mark、window など、コードを書くのに便利な操作を学びました。コードを書くときにはマウスや方向キーから遠ざかることができました。
もし今、なぜ 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)