deoplete-clangとは
deoplete-clangとは,deopleteの補完ソースです.
clangの静的構文解析による補完を簡単に利用することができるので,neovimでC++を書くのが格段に快適になります.
今回はneovimにdeoplete-clangを導入する方法を書きます.
dein.vimと,clangがインストールされていることが前提です.
clangについて,ubuntuを使っているなら以下のパッケージを入れておきましょう.
- clang
- libclang-dev
インストール方法
tomlファイルにzchee/deoplete-clang
を追加しましょう.
私の設定は以下の通りです.
[[plugins]]
repo = 'zchee/deoplete-clang'
hook_source = '''
let g:deoplete#sources#clang#libclang_path = '/usr/lib/llvm-3.8/lib/libclang-3.8.so.1'
let g:deoplete#sources#clang#clang_header = '/usr/include/clang'
'''
on_ft = ['c', 'cpp', 'cmake']
depends = ['deoplete.nvim']
clangの共有ライブラリ,ヘッダファイルへのパスを指定しています.
g:deoplete#sources#clang#clang_header
は,ヘッダファイルが入っているディレクトリを直接指定するのではなく,
x.x.x/include/
が後に続くように設定しましょう.
上の例だと,/usr/include/clang/x.x.x/include/*.h
にヘッダファイルが入っています.
READMEに書いてあるので読んでいれば問題ないのですが,私は読んでいなくて2日ほどハマりました.
また,今回は共有ライブラリへのパスを記述しましたが,共有ライブラリが入っているディレクトリを指定しても大丈夫です.
設定は以上です.deoplete#omni#input_patterns
の設定も必要ありません.
ここで,なにかC++ファイルを開いて編集してみましょう.
このように,[clang]
マーカがついた補完メニューが出現し,deoplete-clangによる補完が有効であることが分かると思います.
cmakeプロジェクトで使う
deoplete-clangは,.clang
というファイルを用意し,
flags=<flags>
のようにコンパイラに渡すオプションを指定することも可能ですが,JSON Compilation Databaseを利用することも可能です.
cmakeでもJSON Compilation Databaseがサポートされているため,cmakeプロジェクトでもclangを利用した補完が可能です.
例えば,以下のような簡単なプロジェクトを作成します.
├── .clang
├── CMakeLists.txt
├── build
├── main.cpp
└── third_party
└── picojson
└── picojson.h
project(test-cpp CXX)
cmake_minimum_required(VERSION 2.6)
set(CMAKE_CXX_STANDARD 11)
include_directories("third_party/picojson")
add_executable(test-cpp main.cpp)
compilation_database = "./build"
以下のコマンドでbuildディレクトリにcompilation_database.json
という名前でJSON Compilation Databaseが生成されます.
mkdir build
cd build
cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
これで,deoplete-clangが適切にオプションをつけてclangを呼び出してくれるため,このように補完ができるようになります.
余談: CMakeLists.txtで補完
余談ですが,deoplete-clangはcmakeファイル内で,コマンド等の補完を行うことも可能です.
これは私のdeoplete-clangの設定の一部です.
on_ftにcmake
が追加されているのがわかるかと思います.
on_ft = ['c', 'cpp', 'cmake']
こうすると,deoplete-clangに含まれるcmakeの補完ソースが仕事をするようになります.
こちらは特にREADMEに記載がなかったので,deoplete-clangの補完ソースのプログラムを確認している際に気づきました.