vim-clangでCUDAファイルの補完を

目次

vim-clangとは

GitHub - justmao945/vim-clang

vimでCやC++の補完を行うためのプラグインです.
clangの補完候補を洗い出す機能を使って補完候補を展開してくれます.
とても便利なんですけど,CUDAのコードに非対応だったので少し強引に対応させました.
g:clang_cpp_options等のオプションで対応可能であればよかったんですけどね...
ft=cppとするだけだとカーネル関数を立ち上げる<<<>>>あたりでエラーが出ます.

clangの補完機能

例えばmain.cuの133行目に

 std::
とあったとき,std::のあとの候補をclangに出力させたければ
clang -fsyntax-only -std=c++14 --cuda-gpu-arch=sm_70 -x cuda -Xclang -code-completion-at=main.cu:133:7 main.cu
とします.
C++であれば
--cuda-gpu-arch=sm_70 -x cuda
の部分が
-x c++
となるので,vim-clangのソースコードのこの部分をCUDAのものに書き換えればいいわけです.

vim-clangの修正

手っ取り早く修正したかったので,次のような制約を設けました.

  • --cuda-gpu-archはsm_70に固定.
    仮想アーキテクチャ指定なので高めに設定しておいてもいいかもしれないです. __CUDA_ARCH__が設定されます. WMMA API等の__CUDA_ARCH__で#if分岐されているファイルでの挙動が変わってきそうです.
  • cppはcudaとみなす.
    &filetype==cudaの場合のみCUDA対応させると面倒だったので,cppはcudaとみなします.
    au BufNewFile,BufRead *.cu set ft=cpp
    au BufNewFile,BufRead *.cuh set ft=cpp
    としておきましょう.
修正箇所ですが,vim-clang/plugin/clang.vimの に変更するだけです.

ちょっぴり注意

プラグインの管理にdein.vimを使っていたのですが,プラグインのキャッシュ機能の影響で変更が反映されずに時間を溶かしました.
dein.vimを使っている場合は

:call map(dein#check_clean(), "delete(v:val, 'rf')")
:call dein#recache_runtimepath()
のようにリキャッシュするといいようです.

参考サイト

カテゴリー:Vim
記事作成日:2018-11-26