今後Perlを書くようになっていきそうなので、PerlのLanguage Serverの一つであるPerlNavigatorを利用するためにNeovimでLanguage Server Clientの設定を行いました。
perlnavigatorのインストールは、Language Server自体のパッケージマネージャーである williamboman/mason.nvim を用いて行いました。
他のLSは、特に設定を書かなくてもLSの設定例を集めたneovim/nvim-lspconfig がよしなに設定をしてくれるのである程度動作するのですが、perlnavigatorの場合はnvim-lspconfig/lua/lspconfig/server_configurations/perlnavigator.lua at 2b361e043810d5587d9af0787f8ce40da92ec5e9 · neovim/nvim-lspconfig · GitHubに書かれているようにperlnavigatorがどこにインストールされているかわからないので cmd
は少なくとも自分で設定する必要があります。
cmd
を設定していない場合は、
(lspconfig) unhandled error: ...llar/neovim/0.9.2/share/nvim/runtime/lua/vim/lsp/rpc.lua:663: cmd: expected string, got nil
というエラーメッセージがでてうまく動作しませんでした。
Neovimでのperlnavigator用の設定は次のようにしました。
require('mason-lspconfig').setup_handlers({ function(server_name) if server_name == 'perlnavigator' then opts = { cmd = { 'perlnavigator', '--stdio' }, single_file_support = true, root_dir = require('lspconfig').util.root_pattern( '.git', '.perl-vertion', '.perltidyrc', '.perlcriticrc', 'lib' ), settings = { perlnavigator = { perlPath = 'perl', includeLib = true, perlImportsTidyEnabled = true, perlTidyEnabled = true, perlcriticEnabled = true, enableWarnings = true, }, }, } end -- このon_attachは、別の場所で定義している一般的なLS関連のキーバインドなどを設定するための関数を代入してる opts.on_attach = on_attach opts.capabilities = vim.lsp.protocol.make_client_capabilities() require('lspconfig')[server_name].setup(opts) end })
GitHub - neovim/nvim-lspconfig の設定例にはないオプションも追加で指定しています。 PerlNavigatorで指定できるオプションに何があるのかが初見ではわかりにくかったのですが、PerlNavigatorのリポジトリにあるpackage.jsonの説明を参考に調べました。 https://github.com/bscan/PerlNavigator/blob/103e8f3ae76ccfe7dc47ebba82f36bc2f8fca4e3/package.json#L30C10-L30C10
一般的なものと異なるところでいうと、root_dir
の設定が調べた限りだとあまりやっていないと思います。
.git
だけでなくPerl関連の設定ファイルやさっと練習用にPerlを書きたいときは lib
ディレクトリまでは切ってもGit管理下に置かないことやLinterの設定までは書かないことがありそうだったので、.git
や .perl-version
などがなかったら lib
のある場所を root_dir
にするようにしました。
Neovimの設定ファイル全体は、dotfiles/nvim/lua/rc/nvim-lspconfig.lua at 23b02b8ca4c3bc3f8a7d8af7ba408b2afb80ff41 · tomato3713/dotfiles · GitHubにあります。
フォーマットは perltidy
に依存しているようでperlnavigator
のインストールだけではうまくいかなったのでcpm
を使って追加でインストールする必要がありました。
# perlnavigatorでフォーマットを行うのに使っているようなのでインストールしておく cpm install -g Perl::Tidy
静的解析は説明を読む限りだとPerl::Critic
に依存していてこれもインストールが必要な気もしましたが、間違った文法で書いた時に警告がでていたので一旦OKとしています。
設定の動作確認のために軽く使ってみた感触では、GoやTypeScriptのLanguage Serverと比べると参照の検索などが弱い印象でしたが最低限の環境は整えられたと思います。
GitHub - bscan/PerlNavigator#currently-implemented-features を読むとperlnavigatorの機能をまだ使いきれていないので追々整備していきたいです。