coc.nvimを使ってC/C++の開発環境を整える
最近neovimというものに移行しcoc.nvimを使ってみたところ中々VimIDEだったので紹介します。
まずは出来上がりのイメージをどうぞ。
割と良い感じになったかも〜 pic.twitter.com/YLXGI0Xiuo
— きさらぎ (@nabesan_C) July 23, 2020
こんな感じです。
短いコードしか書いていないのでわかりづらいですが、中々補完がIDEっぽくなっているのではないでしょうか。
今回はcoc.nvimというプラグインを使いました。
導入方法
まずは事前にインストールするものがあったりするのでコマンド群を載せます。
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