Language Server Protocolを使ってvimでpython入力補完

#Language Server Protocolって?
Language Serverというものを知って、気になったので試してみたっという記事です。
Language Serverについては[こちら](https://qiita.com/atsushieno/items/ce31df9bd88e98eec5c4)の記事を参考にさせていただきました。

私の理解でまとめると、今までIDEとかがやってくれてたキーワード補完や定義の参照など、エディタごとプラグインが必要だったのを、エディタがサーバーにつなぐことで解決しましょう。みたいなことかなと思っています。
例えばVS CodeでPythonシンタックスを使いたければpythonプラグインが必要です。AtomであればAtom用のプラグインが必要です。
エディタの数x言語の数　だけプラグインが必要になります(作る必要があります)。
やりたいことは大体どの言語でも共通なので、言語情報をサーバーに補完しておいて、エディタをクライアントにしてそのサーバーとやり取りできれば、楽じゃないかと。
それが実現すれば好きなエディタでIDEのような機能が使えて素敵じゃないか!っということで感銘を受け、早速愛用のvimでpythonキーワード補完をすべく、あれこれいじってみました。
ちなみに[Software Design 3月号](http://gihyo.jp/magazine/SD/archive/2018/201803)に掲載されていますので、こちらの記事で理解できない場合はこちらもご参照ください。

#プラグインを入れよう
※macでの手順です。windows版はいずれ投稿したい(希望)
[vim-lsp](https://github.com/prabirshrestha/vim-lsp)というブラグインがあるのでこちらを.vimrcに追記します。

```vim:.vimrc
Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/vim-lsp'
```
非同期で入力補完を行いたい場合は次も足します。よく分からなければ追記しておきましょう。私のように。

```vim:.vimrc
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
```

ただ、これを使うには[vim-plug](https://github.com/junegunn/vim-plug)というプラグインマネージャーが必要です。
私はvim-plugすら知らなかったのでまずここから設定しました。まだ使っていない方は参考にしてください。[こちら](https://qiita.com/kouichi_c/items/e19ccf94b8e5ab6ed18e)にまとめてありますのでご参照ください。

#言語の設定
各言語設定の仕方が異なりますが、今回はpythonで設定します。他の言語の設定は[こちら](https://github.com/prabirshrestha/vim-lsp/wiki)を参照してください。

##python-language-serverのインストール
以下のコマンドを実行します。

```terminal:terminal
pip install python-language-server
```

.vimrcに以下を追記します。

```vim:.vimrc
if executable('pyls')
    au User lsp_setup call lsp#register_server({
        \ 'name': 'pyls',
        \ 'cmd': {server_info->['pyls']},
        \ 'whitelist': ['python'],
        \ })
endif
```

追記したら保存、終了

#補完を使ってみる
適当なファイルを作ってみて補完できるか試してみましょう

<img width="247" alt="スクリーンショット 2018-03-08 23.37.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/236727/4ddb1c22-d226-4ffe-10a5-38922ba3a822.png">

最初起動直後はすぐに出てこないこともありますが、数秒待てば出てきます。
deと打つと画像のような補完が出てきてくれます。
補完の候補にフォーカスしたいときはCtrl + n or pで選択できます。

ライブラリなども補完してくれるので、うろ覚えな状態では助かります。
<img width="251" alt="スクリーンショット 2018-03-08 23.42.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/236727/7f9f0f08-57e5-c028-0c36-748bc9e3a955.png">
補完を使う際に注意すべきはEnterやtabを押すと改行やtab入力になってしまいます。
フォーカスした瞬間に入力もされているのでEnter押したい気持ちをグッと堪える必要があります。
これは慣れが必要か、、、

#定義へジャンプ
定義へジャンプするにはLspコマンドを使います。
例えば
<img width="205" alt="スクリーンショット 2018-03-08 23.47.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/236727/1011ac0b-4e7c-f897-aa44-3271f04f77de.png">
こんな感じで探したいワードのカーソルを置き、
<img width="169" alt="スクリーンショット 2018-03-08 23.48.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/236727/35028e6e-49a1-8e2c-4c3b-76f047171dd5.png">
`:LspDefinition`を実行します。Lspまでタイプしてtabキーを押すと使えるコマンド候補が出てきます。
<img width="190" alt="スクリーンショット 2018-03-08 23.50.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/236727/700b1e33-82ca-88d3-aaf0-4ee8650cc845.png">
実行後、カーソルが定義した位置まで移動しました。

こんな短いコードでは何もありがたみも湧きませんが、もっと長いコードになれば助かるのではないでしょうか。

#使ってみた所感
今回は1言語だけの導入でしたが、もっといろんな言語を扱う方には便利なシステムになるのではないでしょうか。他にもできることはたくさんあるみたいなので色々勉強してみたいです。
補完候補を選択した時にdefなら定型文みたいにある程度入力してくれると便利です。最初いじってた時にはできた気がしたのですが、いじってるうちにできなくなってました。何かプラグインを外したせいかもしれません。
解決したら追記したいと思います。
この機能を使って、自分の好きなエディタでIDE並みに便利に使えると楽しくなりそうですね。

#今回の環境

```
macvim: Custom Version 8.0.1522 (KaoriYa 20180218)
macOS: High Sierra バージョン10.13.3（17D102)
python: Python 3.6.3
```