coc.nvimを使ってC/C++の開発環境を整える

最近neovimというものに移行しcoc.nvimを使ってみたところ中々VimIDEだったので紹介します。
まずは出来上がりのイメージをどうぞ。

こんな感じです。
短いコードしか書いていないのでわかりづらいですが、中々補完がIDEっぽくなっているのではないでしょうか。

今回はcoc.nvimというプラグインを使いました。

github.com

導入方法

まずは事前にインストールするものがあったりするのでコマンド群を載せます。

sudo apt-get install -y snapd
sudo snap install ccls --classic
curl -sL install-node.now.sh/lts | sudo bash
sudo npm install -g yarn

必要なものを諸々設定します。

cclsのPATHが最初は通っていないのでexportします。

export PATH="$PATH:/snap/bin"

もしくはパスを変えずにリンクを張るなどをしてください。

sudo ln -sf /snap/bin/ccls /usr/local/bin/ccls

これらが完了したら次はnvimの設定ファイルをいじっていきます。
色々な設定ファイルを使いますが全て私は~/.config/nvimの中に置いています。

ではまずはプラグインのインストール

dein.toml
[[plugins]]
repo = 'neoclide/coc.nvim'
on_ft = ['python']
merged=0
rev="release"
hook_source = '''
source ~/.config/nvim/coc.rc.vim
'''

これを記入したらnvimを起動しなおします。
次はcoc-settings.jsonというファイルを編集します。
~/.config/nvimの直下に直接作成しても良いですし、nvimを開いて:CocConfigと実行すると設定ファイルの編集に移動します。

coc-settings.json
{
  "languageserver": {
    "ccls": {
      "command": "ccls",
      "filetypes": ["c", "cpp", "cuda", "objc", "objcpp"],
      "rootPatterns": [".ccls-root", "compile_commands.json"],
      "initializationOptions": {
         "cache": {
           "directory": "/tmp/ccls-cache"
         }
       }
    }
  },
  "suggest.keepCompleteopt": true
}

これを設定することにより、LSPの恩恵を受けられます。

きっとここまででもう殆ど変わらない動きをしているのではないでしょうか。

ですが、少しだけ違和感が残ると思います。
それは補完対象がデフォルトで選択されていないことです。

通常IDEではヒット率が高いものがデフォルトで選択されている状態になっています。そこでEnterを押すとすぐに挿入ができるわけです。
ですが今の状態だと必ずCtrl+pを実行しなければなりません。
気にならない方は良いのですが私は少し気になったのでinit.vimに追加でコードを書きます。

init.vim
" 補完表示時のEnterで改行をしない
inoremap <expr><CR>  pumvisible() ? "<C-y>" : "<CR>"
set completeopt=menuone,noinsert
inoremap <expr><C-n> pumvisible() ? "<Down>" : "<C-n>"
inoremap <expr><C-p> pumvisible() ? "<Up>" : "<C-p>"

これによって常に一つは選択された状態になっています。
また選択完了でEnterを押した時に改行をしない。
補完の欄を見るだけでは挿入されず、Enterを押した時のみ実際にコードが挿入されるようになっています。
このコードは Vimの補完を他エディタやIDEのような挙動にするようにする|yasukotelin|note こちらを丸々ぱk(( 参考にさせていただきました。

まとめ

私もまだ導入したばかりなのでこれから使用感を確かめていこうと思います。
私以外のvimmerの方々で一押しのプラグインがあれば是非教えてください。

参考

Vimの補完を他エディタやIDEのような挙動にするようにする|yasukotelin|note

Vimにcoc.nvimを入れたら便利すぎて感動したっていう話 - Qiita

vimにlanguage serverを設定する - おのかちお's blog