NeovimでPerlNavigatorを使えるように設定しました

今後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の機能をまだ使いきれていないので追々整備していきたいです。