はじめに
しばらく惰性でコードエディタとしてVisual Studio Codeを利用していた。ただ、AIエージェントにコーディングを任せる比率が増え、自分が書くより読む/指示する/微修正する時間のほうが長くなった今、重たいエディタは不要なのでは論や、拡張機能を狙ったサプライチェーン攻撃が怖いといった昨今の風潮には、私も素直に同意できるところがあった。
それに、そもそもVS Codeを大して使いこなせていたわけでもないので、もう少しシンプルで軽量なものに乗り換えてみようと思い立った。
移行先を検討するにあたり、できればターミナルで完結させたい気持ちがあった。
Claude Codeはデスクトップアプリも便利という話を最近耳にするが、経歴的にインフラエンジニアをやっていた期間が長く、個人的にターミナル内のほうが落ち着くというか、知らないGUIアプリを使って何が起こるか不安みたいな気持ちもあって、漠然とCLIを使い続けている。
またもともとVimmer、というかvi戦士あがりであるため、vim系の何かだと安心感がある。
というところからClaudeに壁打ちしてもらって、Neovimを最小限カスタマイズするのがよさそうというところに至った。
Neovimの存在は認知していたのだが、何か難しそうでずっとvimのままだったので、重い腰をあげるのにもちょうど良さそうということで移行を試みる。
ここまで書いて、なんだか年齢のせいか新しいツールをすぐ試してみようという気持ちが弱まっているのだろうか。そういうのが一番楽しかった気がするのだが。悲しい。
要件
設計方針
- 書くより読む優先
- 薄くてシンプル最小限な構成
- 設定は宣言的・再現可能な仕組みで
- できるだけNeovim固有のものではなく個別のCLIツールを組み合わせる感じで
- エディタ用とCLI用でツールを分けたくない
- Neovimの設定がツール群を呼ぶ薄いIFになっていて、AIや人間の実行と共用できるのが理想
- 対象言語やファイルフォーマット
- Go, TypeScript, HCL(Terraform), Python, Markdown, yaml, toml, json, HTML あたり
ほしい機能
- ファイラー(サイドバーにファイル階層が表示されるやつ)
- 検索
- タグジャンプ
- シンタックスハイライト
- フォーマッタ
- ステータスライン
- いい感じのバッファ切り替え
- Git連携(状態が見れるくらいでよい)
このくらいをClaude Codeに与えてプランを作ってもらう。
できたもの
以下のようになっている。
https://github.com/j-un/dotfiles/tree/main/dot_config/nvim
https://github.com/j-un/dotfiles/blob/main/dot_config/mise/conf.d/nvim-tools.toml
以下、ポイントの説明。
Mason未使用
NeovimではLSP管理に Mason というパッケージマネージャを利用するケースが多いらしい。
しかしMasonは ~/.local/share/nvim/mason/ 配下にバイナリを置くようで、これはnvimプロセス内からしか見えない。これだと極力同じツールを共用したいという設計原則に反する。
そのため代わりにmiseとhomebrewで管理して組み込むことにした。
- mise -> 言語ランタイム + LSP/formatter (go:、npm:、pipx: などのバックエンドを横断管理)
- homebrew -> バイナリ単発配布のもの (terraform-ls, marksman, taplo, fd など)
結果として nvim 設定から Mason 関連プラグイン群が消えて、設定が薄くなった。
反面brewなどプラットフォーム依存な仕組みになってしまったが、今回は許容で。
mise の conf.d にnvim 用ツールを 1 ファイルに集約
miseもあまり使いこなせてはいないのだが、configを分割して管理できるようなので、~/.config/mise/conf.d/nvim-tools.toml を新設した。
これでNeovim依存を避けつつ、Neovimを捨てる時も影響範囲はこのファイルに集約されているので見通しが良い。
導入プラグインなど
Claude Codeに教えてもらいながら以下のような感じで。
| カテゴリ | プラグイン |
|---|---|
| プラグイン管理 | lazy.nvim |
| カラースキーム | tokyonight.nvim |
| ファイラー | neo-tree.nvim |
| シンタックス | nvim-treesitter |
| ステータスライン | lualine.nvim |
| バッファ切り替え | bufferline.nvim |
| LSP | nvim-lspconfig |
| フォーマッタ | conform.nvim |
| Git | gitsigns.nvim |
| 検索 | fzf-lua |
| 補完 | blink.cmp |
ファイル検索は Telescope が高機能で良いらしいのだが、やや他のプラグイン依存の機能が多そうなのと、そこまで高機能でなくてもよいので、すでにインストール済みのfzfを使う fzf-lua というのを採用してみた。
結果と雑感
まだほとんど使っていないものの、ターミナル内でvimっぽいキーバインドで使えるだけでだいぶ気持ちがいい。
またNeovimは難しそうと思っていたが、VimScriptのほうがよっぽど難しいではないか。
総じて今まで何故こうしなかったのか悔やまれるくらい良さげである。
まだよく分かっていないところもあるけどひとまずはこれでやってみます。
やや残課題として、いくつか関わっているプロジェクトでDevContainerを採用していて、VS Code以外でうまく運用した経験がないのだが、いい機会なので何とかしてみることとする。
DevContainerで何やりたかったんだっけ?を再整理するいい機会でもあるかもしれない(サンドボックスで開発したかったのか?開発環境を簡単に立ち上げたかったのか?的な)。
備忘メモ
あまりてんこ盛りにしたくないが、このへん良さそう。