ぼくはパソコンは実家にしか無く、開発系は全てAndroidのTermuxで済ませなくてはならないので、"ポケットIDE"こと(neo)Vimを使っています。こういうわけで、開発毎に、それぞれの言語の補完プラグイン、Linter(これはうまく動かなかったのだが)を入れ、またファイラを入れ、がんばっていた訳です。
プロローグ
数年前、ネットをVimについてググりサーフィンしていると、"LSP"という単語が目に入りました。"Language Server Protocol"。どうやら、コーディング補助系について規格化したものであるようなのです。
参考:[https://langserver.org/]
Vimに対応させるプラグインも出てきたと聞いて、すぐ飛びついた訳ですが、当時、ぼくは英語力も拙く、READMEさえも読めずにうまく設定すらもできないで諦めてしまいました。
受験を経て、ある程度英語力もついたことだし、または、LSP界隈も活発になっているかも?と期待して、調べてみると、実装も複数なされていて、どうやら聞き覚えのないものも出てきているようです。その一つがcoc.nvimでした。
[https://github.com/neoclide/coc.nvim]
coc.nvimの導入
Vim(8.0.1453以上) || Neovim(0.3.1以上)が必要です。
まず、Node.jsとyarnを入れましょう。
apt install nodejs
npm install-g yarn
あとはcoc.nvim自体をいつものパッケージマネージャで加えるだけです。ぼくはvim-plugなのでこうします。
Plug 'neoclide/coc.nvim',{'branch':'release'}
そして :PlugInstall
ですね。
インストール時に色々足りないって注意されたのですが、その都度指摘してくれ、選択すれば自動でそれらをインストールしてくれました。
これで終わりです。以下も参照してみてください。
[https://github.com/neoclide/coc.nvim]
各種設定など
coc.nvimの設定ファイルはコマンド:CocConfig
で開くことができます。ただ、デフォルトでも使いにくいわけではないです。
また、coc.nvimのExtension、というものがあり、機能追加・拡張ができます。各言語のlanguageserverもあります。
coc.nvimの拡張専用のパッケージマネージャがあり、それでExtensionを管理してくれます。
試しにtypescript/javascriptのサーバーであるcoc-tsserverを入れてみます。コマンドモードで以下をEnter:
:CocInstall coc-tsserver
また、設定すれば、Extensionにないサーバーも使えます。例えば、C系のサーバーのclangdだと、設定ファイルに、
{"languageserver":{"clangd":{"command":"clangd","filetypes":["c","cpp","objc","objcpp"]}}}
と書けば使えるようになります。
以下に、各種言語について設定方法などをまとめて下さっているので参照してみてください。
[https://github.com/neoclide/coc.nvim/wiki/Language-servers]
coc.nvimの機能
coc.nvimの各機能を調べてみました。
AutoCompletion
デフォルトで自動の補完が効きました。
また、何もサーバーなどを登録せずとも、Vimでデフォルトで使える補完の、ファイル、バッファ、aroundの補完候補は一覧で出てきます。
Diagnostics
エラー、警告、インフォメーションが表示されます。その場所にカーソルを合わせるとメッセージが見れます。
CocList
多機能セレクタと呼ばれるものです。かなり便利です。CtrlPに類似しています。
デフォルトでもextentionのトグル、diagnosticsのリスト表示とジャンプ、symbolの検索まで色々できます。
さらに、拡張coc-lists
を入れると、ファイル検索、grep検索、buffer移動など、もう何でもできます…
何でも突っ込んだ感じになる機能ですが、あいまい検索ができるので割とスムーズに操作できます。
Hover
ヒント(ホバー)を読むことができます。
2019/06/25現在、NeoVimのnightlyビルドではfloating windowが使えるようですが、これはそれにも対応しています。
残念ながら、Termux版はstableのみなのでpreview windowにヒントが表示されています。
References
Definition
機能の呼び出し方
多数の機能がある!と言うことは調べてみて割とすぐにわかったのですが、呼び出し方がちょっと引っかかったのでメモしておきます。
機能 | 呼び出し方 |
---|---|
AutoCompletion | insertモードで既に有効 |
Diagnostics | バッファ横にマーク表示されている CocList内にリスト有 |
CocList | :CocListコマンドで呼び出し |
Hover | :call CocAction('doHover')で呼び出し |
References | <Plug>(coc-references)で呼び出し |
Definition | <Plug>(coc-definition)で呼び出し |
少しバラバラに思えるのですが、多分本当はもっと奥深く体系だった構成なのでしょう。
coc.txtをもっと読み解かなくては……。
まとめや追伸
使ってみた感じですが、Androidスマホでもヌルヌルでサクサク動いて快適です。
これでまたvimが真のideに近づいていけます。
嬉しい限りですね。
この先、新たな発見等をしたら追記していこうと思います。