Language Server Protocolって?
Language Serverというものを知って、気になったので試してみたっという記事です。
Language Serverについてはこちらの記事を参考にさせていただきました。
私の理解でまとめると、今までIDEとかがやってくれてたキーワード補完や定義の参照など、エディタごとプラグインが必要だったのを、エディタがサーバーにつなぐことで解決しましょう。みたいなことかなと思っています。
例えばVS CodeでPythonシンタックスを使いたければpythonプラグインが必要です。AtomであればAtom用のプラグインが必要です。
エディタの数x言語の数 だけプラグインが必要になります(作る必要があります)。
やりたいことは大体どの言語でも共通なので、言語情報をサーバーに補完しておいて、エディタをクライアントにしてそのサーバーとやり取りできれば、楽じゃないかと。
それが実現すれば好きなエディタでIDEのような機能が使えて素敵じゃないか!っということで感銘を受け、早速愛用のvimでpythonキーワード補完をすべく、あれこれいじってみました。
ちなみにSoftware Design 3月号に掲載されていますので、こちらの記事で理解できない場合はこちらもご参照ください。
プラグインを入れよう
※macでの手順です。windows版はいずれ投稿したい(希望)
vim-lspというブラグインがあるのでこちらを.vimrcに追記します。
Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/vim-lsp'
非同期で入力補完を行いたい場合は次も足します。よく分からなければ追記しておきましょう。私のように。
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
ただ、これを使うにはvim-plugというプラグインマネージャーが必要です。
私はvim-plugすら知らなかったのでまずここから設定しました。まだ使っていない方は参考にしてください。こちらにまとめてありますのでご参照ください。
言語の設定
各言語設定の仕方が異なりますが、今回はpythonで設定します。他の言語の設定はこちらを参照してください。
python-language-serverのインストール
以下のコマンドを実行します。
pip install python-language-server
.vimrcに以下を追記します。
if executable('pyls')auUser lsp_setup call lsp#register_server({ \'name':'pyls', \'cmd':{server_info->['pyls']}, \'whitelist':['python'], \})endif
追記したら保存、終了
補完を使ってみる
適当なファイルを作ってみて補完できるか試してみましょう
最初起動直後はすぐに出てこないこともありますが、数秒待てば出てきます。
deと打つと画像のような補完が出てきてくれます。
補完の候補にフォーカスしたいときはCtrl + n or pで選択できます。
ライブラリなども補完してくれるので、うろ覚えな状態では助かります。
補完を使う際に注意すべきはEnterやtabを押すと改行やtab入力になってしまいます。
フォーカスした瞬間に入力もされているのでEnter押したい気持ちをグッと堪える必要があります。
これは慣れが必要か、、、
定義へジャンプ
定義へジャンプするにはLspコマンドを使います。
例えば
こんな感じで探したいワードのカーソルを置き、:LspDefinition
を実行します。Lspまでタイプしてtabキーを押すと使えるコマンド候補が出てきます。
実行後、カーソルが定義した位置まで移動しました。
こんな短いコードでは何もありがたみも湧きませんが、もっと長いコードになれば助かるのではないでしょうか。
使ってみた所感
今回は1言語だけの導入でしたが、もっといろんな言語を扱う方には便利なシステムになるのではないでしょうか。他にもできることはたくさんあるみたいなので色々勉強してみたいです。
補完候補を選択した時にdefなら定型文みたいにある程度入力してくれると便利です。最初いじってた時にはできた気がしたのですが、いじってるうちにできなくなってました。何かプラグインを外したせいかもしれません。
解決したら追記したいと思います。
この機能を使って、自分の好きなエディタでIDE並みに便利に使えると楽しくなりそうですね。