もちろんNeovimがいいんだけれど、NeovimとVimは設定を分けることができるし、ディストリビューションで標準でインストールされてるのはVimなことが多いので、Vimの環境づくり。
ちなみに現在のVimバージョンは9.1.707です。
さて、Vimの補完プラグインですが、Shougoさんが作成していたneocomplete.vimは終了し、deoplete.nvimを経て、現在はddc.vimが開発を続けられています。なので、補完フレームワークはddc.vimにして、そうするとLSPとかfileとかいろいろと補完ソースに指定することができるはず。
AURを見るとvim-ddc 0.17.0-1というパッケージソースがあるようなので、dpp.vimのようなプラグインマネージャを利用するか、pacman(自前パッケージ)を利用するか悩むところですが、AURからextraになることもないだろうし、そうするとアップデートも自分でチェックしてやることになって面倒が増えるだろうから、プラグインマネージャで行う方針にします。とりあえずはdpp.vimで考えてみることに。
ddc.vimもそうですが、dpp.vimもDenoを利用し、そのためにdenops.vimをインストールする必要があるので、まずはDenoをインストールします。こちらはpacmanでさっくり。
次にdenops.vimですが、こちらはvim-plugのようなプラグインマネージャでインストールして、と書いてあります。vimballが提供されていれば楽なんですが…。プラグインマネージャのdpp.vimをインストールするにはdenops.vimが必要で、denops.vimをインストールするにはプラグインマネージャが必要という鶏卵問題。
もうちょっとお手軽にいかないかな、と考えた結果、メンテナンスフェーズに移って開発は終了していますがdein.vimを使用することにしました。lazy.nvimに手を出してみたいけど、こちらはVimでは動かないようですし。
ということで、Dein-installer.vimの手順でインストールします。curlなら標準でインストールされているので、curlのほうで行います。さっくり。
すると$HOME/.vimrcに書くべき設定を表示してくれるので、これを.config/vim/vimrcにコピペします。ぺたぺた。
でもってdein#addのところにインストールしたいプラグインを記述します。
call dein#add('vim-denops/denops.vim')
call dein#add('vim-denops/denops-helloworld.vim')
vimrcをリロードしたら、:call dein#install() して、:DenopsHelloしてみると、ちゃんと挨拶を返してくれました。
次はddc.vimです。こちらはフレームワークなので、Vimの場合にはポップアップメニューを表示するための仕組みが必要になるので、pum.vimも必要です。それと、pumのUIを定義するためにddc-ui-pumも必要です…と言い切っちゃっていいのかどうかよくわかりませんが、一応インストールします。
call dein#add('Shougo/ddc.vim')
call dein#add('Shougo/pum.vim')
call dein#add('Shougo/ddc-ui-pum')
また、ddc.vimで入力補完を利用するにはソースプラグインとフィルタプラグインが必要です。ddc.vimはあくまでフレームワークなので。
call dein#add('Shougo/ddc-filter-sorter_rank')
call dein#add('Shougo/ddc-source-around')
call dein#add('Shougo/ddc-filter-matcher_head')
フィルタ用の設定も書き足します。
call ddc#custom#patch_global('sourceOptions', #{
\ _: #{
\ sorters: ['sorter_rank'],
\ }
\ })
call ddc#custom#patch_global('sourceOptions', #{
\ around: #{ mark: 'A' },
\ })
call ddc#custom#patch_global('sourceParams', #{
\ around: #{ maxSize: 500 },
\ })
ここまでは下準備で、次がようやく当初の目的のLSP(Language Service Protocol)のインストールです。
よく使うのはPythonなので、まずはPythonからいってみます。
PythonのLSPはMicrosoftのPyrightやPylanceなどもありますが、PyrightもPylanceはTypeScriptで記述されており、動作にはnode.jsが必要です。今回はnode.jsではなくDenoで行きたいので、これはなしの方向で。
ということで、Python LSP Serverことpylspを導入します。pylspはpipでもインストールできますが、pipだと前述したようにアップデートの管理が面倒なので、ArchLinuxのパッケージになっているpython-lsp-serverをインストールします。python-lsp-serverはSpyderプロジェクトにて開発されていたもので、Pythonで記述されているため、速度的には遅いもののnode.jsやnpmは不要です。
# sudo pacman -S python-lsp-server
また、Vim側でLSPをお話するLSPクライアントのプラグインであるvim-lspをインストールします。vim-lspはVimスクリプトで記述されていますが、重たい動作の部分をluaで実装しているため、Vimがluaをサポートしていないと利用できません。幸いArchLinuxのVimは+luaでコンパイルされているので問題なし。
call dein#add('prabirshrestha/vim-lsp')
vim-lspを使ったLSPの設定を用意にするために、vim-lsp-settingsを使ってもよいのですが、実はこれを使うとちょっとnode.jsがゴニョゴニョっぽいので自前で用意します。といっても、vim-lspのページのRegistering Serversの設定をコピペするだけ。なのでコードは省きます。これはpylsp用の設定なので、その他のLSPサーバを利用するときはそれ用の設定を加えないといけませんが、それはまたあとで。
ここまでやれば、あとはddc.vimに渡してやると動くようになります。
call ddc#custom#patch_global('sourceOptions', #{
\ vim-lsp: #{
\ matchers: ['matcher_head'],
\ mark: 'lsp',
\ },
\ })
call ddc#custom#patch_global('sources', ['around', 'vim-lsp'])
call ddc#enable()
最後のddc#enable()をcallしないと動きませんが、結構忘れがち。これで .py のファイルを編集するときには自動でpylspが動きます。
とりあえずは動いたので、チューニングなどはおいおい :h vim-lsp などしてやっていきます。
ちなみにちなみに、Python用の高速なlinter/formatterのruffをpylspのプラグインとして利用するpython-lsp-ruffというのもあるようですが、これもまたあとで。これまで使っていたBlackとFlake8を置き換えられるかどうかの検討が必要かなと。Pythonの Ruff (linter) でコード整形もできるようになりましたでは
要約: Flake8 + Black + isort はもうすべて Ruff だけで置き換えられる。
などとあるのでちょっと気になってます。ちなみにruffはRustで書かれていますが、Rustってripgrepのアレだよねぇ、と高速っぽい印象バイアスかかってます。
それとは別に、python-lsp-blackというのもあり、こちらはBlackを使うプラグインです。どっちがいいんだろうか。それと静的型チェックを行うmypyのプラグインpylsp-mypyなんてのもあります。いずれにしてもまたあとで。