はじめに
coc.nvim
を使うのがベストな選択肢でしたが、neovim builtin lsp(以下 nvim-lsp)でもかなりエコシステムが整備されており、VSCode 並の開発体験が得られるようになっています。この記事ではそんな nvim-lsp の設定の基本的なところを説明します。環境
- Windows でも MacOS でも Linux でも動くはずです。
- Neovim stable 最新版もしくは nightly
- git コマンド
- その他 Mason から色々な物をインストールして使う際には
:checkhealth mason
で指定されたコマンドが必要となることがあります。
基本的な設定
必須プラグイン系
- nvim-lspconfig (https://github.com/neovim/nvim-lspconfig)
- mason.nvim (https://github.com/williamboman/mason.nvim)
- mason-lspconfig.nvim (https://github.com/williamboman/mason-lspconfig.nvim)
package.json
がある場合は Typescript の言語サーバーが起動してほしいなど)はそれぞれ違うのでこのプラグインが必要になります。次に
local on_attach
で始まる行では、LSPサーバーがアタッチ(つまりvimのバッファと紐付けられて起動)した際に実行される処理を記述しています。この中ではLSPサーバーに関係するキーマップを設定することが多いです。この設定例ではK
で「ホバー」、gd
で「定義へ移動」などを設定しています。もちろん自分が使いやすいように自由に変更することができます。そして残った部分ではプラグインを設定します。ここでは、
mason.nvim
でインストールした言語サーバが自動的に起動するように設定しています。init.lua
を書いて neovim を起動してみましょう。すると、lazy.nvimが自動でプラグインをインストールしてくれるはずです。インストール後には、
mason.nvim
により:LspInstall [server name]
というコマンドが使えるようになっています。また、
:Mason
コマンドを使うことで下図のようにインタラクティブなサーバーインストール画面を使うこともできます。:LspInstall lua_ls
を実行してLuaの言語サーバをインストールしてみましょう。コマンド実行後にインストール画面が表示され、しばらくすればインストールが完了します。完了後、一旦Neovimを再起動して
init.lua
を開くと自動で言語サーバが起動するはずです。LSPによる診断が表示され、上でも説明したようにK
でホバーを出すこともできます。:h lsp
に詳細な情報が載っているので読んでみると良いでしょう。補完
cmp-nvim-lsp
が分離されているため、両方インストールします。LSP 以外にも様々な補完ソースが開発されており、下のサンプルではバッファのキーワードを補完してくれる
cmp-buffer
を入れています。他にもコマンドラインバッファの補完をしてくれるcmp-cmdlineなど便利なソースが多くあります。
他の補完プラグイン
nvim-cmp
以外にもnvim-lspで仕様できる補完プラグインがあるのでご紹介します。- ddc.vim
GitHub - Shougo/ddc.vim: Dark deno-powered completion framework for Vim/NeoVim
github.com
- coq_nvim
GitHub - ms-jpq/coq_nvim: Fast as FUCK nvim completion. SQLite, concurrent scheduler, hundreds of hours of optimization.
github.com
フォーマッタ/リンタ
neovim でフォーマッタ/リンタを動かす方法はいろいろありますが、ここではnone-lsを紹介します。
これは様々なツールの出力を LSP の形式に変換して nvim-lsp に送るという仕組みになっています。似たようなツールにdiagnostic-languageserverやefm-langserverがありますが、
none-ls
はLua製の外部依存がないNeovimプラグインであることなどが利点です。また様々なリンター/フォーマッタ用にあらかじめ設定が用意されているので簡単に設定できます。
詳しくはnull-ls のドキュメントを見てください。
prettier
がインストールされていればそちらが、インストールされてなければグローバルのものが使用されます。さらに、前述の mason.nvim で prettier をインストールすることもできます。mason.nvim はインストールしたパッケージの実行可能ファイルを neovim が認識するPATHに加えるため特別に設定しなくても使えます。
ちなみに neovim の
:terminal
の中でも mason でインストールしたものはパスが通っており、実行することができます。deno fmt
を使います。さらにdeno
の設定ファイルがあれば null-ls 経由のdeno fmt
ではなく deno LSP の組み込みフォーマットを使います。prettier
と同様にeslint
も none-ls で使用できますが、すごく重いのでeslint-lsp
を使うことをお勧めします。mason.nvim からインストールできます。いろいろなプラグイン達
このリストの作成者さんの記事もありますのでこちらもどうぞ。
Neovimプラグインをまともに選定できるリストを作った
zenn.dev
LSP 拡張系
-
lsp_signature.nvim
GitHub - ray-x/lsp_signature.nvim: LSP signature hint as you type
LSP signature hint as you type. Contribute to ray-x/lsp_signature.nvim development by creating an account on GitHub.github.com
関数の引数を入力しているときにシグネチャヘルプを表示してくれます。 -
lspkind-nvim
GitHub - onsails/lspkind.nvim: vscode-like pictograms for neovim lsp completion items
vscode-like pictograms for neovim lsp completion items - onsails/lspkind.nvimgithub.com
補完にアイコンを追加してくれます。 -
fidget.nvim
GitHub - j-hui/fidget.nvim: 💫 Extensible UI for Neovim notifications and LSP progress messages.
💫 Extensible UI for Neovim notifications and LSP progress messages. - j-hui/fidget.nvimgithub.com
言語サーバの稼働状況などを表示してくれるやつです。VSCodeの右下に出ているものを再現できます。 -
noice.nvim
GitHub - folke/noice.nvim: 💥 Highly experimental plugin that completely replaces the UI for messages, cmdline and the popupmenu.
💥 Highly experimental plugin that completely replaces the UI for messages, cmdline and the popupmenu. - folke/noice.nvimgithub.com
neovim の UI 全般を魔改造するプラグインです。lsp_signature.nvim と fidget.nvim を置き換えることができます。
特定の言語用のやつ
experimental/externalDocs
(docs.rs を開く機能)のように、言語サーバはそれぞれ LSP の標準にはない独自の仕様を定義していることがあります。当然それらは nvim-lsp では扱えないのでプラグインが必要になります。
その他にも LSP では扱いきれないようなものがいろいろあったりするのでそれを扱ってくれるプラグインを以下で紹介します。
-
typescript.nvim
GitHub - jose-elias-alvarez/typescript.nvim: A Lua plugin, written in TypeScript, to write TypeScript (Lua optional).
A Lua plugin, written in TypeScript, to write TypeScript (Lua optional). - jose-elias-alvarez/typescript.nvimgithub.com
-
rust-tools.nvim
GitHub - simrat39/rust-tools.nvim: Tools for better development in rust using neovim's builtin lsp
Tools for better development in rust using neovim's builtin lsp - simrat39/rust-tools.nvimgithub.com
-
go.nvim
GitHub - ray-x/go.nvim: G'day Nvimer, Joyful Gopher: Discover the Feature-Rich Go Plugin for Neovim
G'day Nvimer, Joyful Gopher: Discover the Feature-Rich Go Plugin for Neovim - ray-x/go.nvimgithub.com
-
nvim-jdtls
GitHub - mfussenegger/nvim-jdtls: Extensions for the built-in LSP support in Neovim for eclipse.jdt.ls
Extensions for the built-in LSP support in Neovim for eclipse.jdt.ls - mfussenegger/nvim-jdtlsgithub.com
-
flutter-tools.nvim
GitHub - nvim-flutter/flutter-tools.nvim: Tools to help create flutter apps in neovim using the native lsp
Tools to help create flutter apps in neovim using the native lsp - nvim-flutter/flutter-tools.nvimgithub.com
参考になるサイト
-
公式の LSP のドキュメント
Lsp - Neovim docsNeovim
neovim.io
-
r/neovim
https://www.reddit.com/r/neovim/
www.reddit.com
海外の巨大掲示板 Reddit の neovim subreddit です。新しいプラグインはよくここで宣伝されています。他にもいろいろな neovim の最新情報を知ることができます。 -
Github の dotfiles リポジトリ達いろんな人が自分の好みの neovim のコンフィグを作って Github やらに上げています(Github で
nvim
とか検索すればたくさんでてきます)。参考になる設定が沢山あるので詰まったりしたら見てみるとよいでしょう。 -
Neovim Mine
neovim-mine.vercel.app
手前味噌で申し訳ありませんが、Neovim のプラグインを見つけやすくするサイトを作ったので紹介しておきます。
先ほども挙げた https://github.com/yutkat/my-neovim-pluginlist とAwesome Neovimのデータを使用させてもらい、見やすい形(個人の感想)にまとめたサイトです。
最後に
zenn/examples/c2f16b07798bab/init.lua at main · nazo6/zenn
github.com
GitHub - nazo6/nvim
github.com