5 分で読了 #tools #nvim

Neovim 概要

エディタは LazyVim 上での Neovim です。ゼロから構築するのではなくディストリビューションを選んだのは、LSP、Treesitter、フォーマッター、デバッガなどがすでに設定済みだからです。私にはそれらを再実装する理由がありませんでした。その代償として、私の設定は非常に薄くなっています。init.lua は一行だけで、本当に私自身のものは lua/config/options.lua の数箇所の設定、lazyvim.json で有効にした言語、そして lua/plugins/ で追加した十数個のプラグインだけです(次の記事 で解説します)。

言語は基本的に「extra を有効にするだけで完了」です。LazyVim の各 lang.* extra は、対応する LSP、Treesitter パーサー、フォーマッター、DAP を一度に設定してくれます。私は lazyvim.json でそれを有効にするだけです。普段は以下の構成を使用しています:

  • rust → rustaceanvim(標準の rust-analyzer より runnables/debuggables、マクロ展開、:RustLsp が追加)、Cargo.toml 内でバージョンヒントを表示する crates.nvim。
  • go → gopls + delve デバッグ + 自動 goimports
  • dotnet / C#roslyn.nvim を使用。大規模なソリューションでは omnisharp より安定しています。
  • clangd → C/C++ 用 LSP。コンパイルユニットをまたいだジャンプ、.clang-format との連携に対応。
  • java → jdtls(Eclipse 由来の LSP で、起動に少し時間がかかります)。
  • typescript → vtsls。フロントエンドプロジェクトの補完、リネーム、コードアクションに対応。

extra を有効にして手動で設定しない利点は、LSP のどのバージョンをインストールするか、フォーマッターをどう接続するか、DAP アダプタをどこから持ってくるかといった点で、LazyVim が合理的なデフォルトを提供してくれるためです。そのため、言語ごとにボイラープレートコードを再実装する必要がありません。

options には、私の作業スタイルに合わせて設定した三箇所があり、特に注目すべきです。

クリップボードは OSC52 を使用しています。これは端末のエスケープシーケンスを使用してコピーを行います。これにより、SSH や Wayland 環境下でも、yank 操作がシステムクリップボードに反映され、頻繁に問題が発生する xclip/wl-copy の依存関係に頼る必要がなくなります。

autoformat は無効化しています。保存時にこっそりと大量の変更を加えられるのは好みではありません。コミットに無関係なフォーマット差分が混入するのを避けるため、手動またはプロジェクト単位でトリガーしたいと考えています。

また、Windows を検知した場合はシェルを pwsh に切り替え、UTF-8 を適切に設定します。同じ設定が chezmoi を通じてその Windows 環境でもそのまま動作します。

最後に options には含まれていませんが非常に重要な点として、Ctrl+hjkl によるウィンドウ切り替えと、境界に達した際に Zellij パネルへ移動する機能があります。これは smart-splits によって実現されており(at_edge='stop' によってデッドロックを防いでいます)、エディタとリペーター(マルチプレクサ)で移動キーを統一しています。これが私の環境全体の基調となっています。