Skip to content

コード補完プラグイン

osyo-manga edited this page Jul 24, 2014 · 12 revisions

####用語

  • Clang
  • LLVM をバックエンドとした C++ のコンパイラ
  • Clang には構文解析器が付属しているのでそれを利用しているプラグインはいくつか存在する
  • libclang
  • Clang に付属している構文解析を行う動的ライブラリ(e.g. libclang.dll や libclang.so)
  • +python
  • Vim で if_python を使用する為の組み込み機能
  • Vim をビルドする時に +python を指定する必要がある

####clang_complete

  • 概要
  • libclang を利用したコード補完
  • バックエンド
  • libclang(動的ライブラリ)
  • 動作環境
  • libclang(動的ライブラリ)
  • +python(Vim の組み込み機能)
  • 依存しているプラグイン
  • なし
  • 設定
" コマンドオプション
let g:clang_user_options = '-std=c++11'


" neocomplete.vim と併用して使用する場合は以下の設定も行う
if !exists('g:neocomplete#force_omni_input_patterns')
  let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_overwrite_completefunc = 1
let g:neocomplete#force_omni_input_patterns.c =
	  \ '[^.[:digit:] *\t]\%(\.\|->\)\w*'
let g:neocomplete#force_omni_input_patterns.cpp =
	  \ '[^.[:digit:] *\t]\%(\.\|->\)\w*\|\h\w*::\w*'
let g:neocomplete#force_omni_input_patterns.objc =
	  \ '[^.[:digit:] *\t]\%(\.\|->\)\w*'
let g:neocomplete#force_omni_input_patterns.objcpp =
	  \ '[^.[:digit:] *\t]\%(\.\|->\)\w*\|\h\w*::\w*'

" clang_complete では自動補完を行わない用に設定
let g:clang_complete_auto = 0
let g:clang_auto_select = 0

####marching.vim(非同期版)

  • 注意
  • marching.vim ではいくつかの実装が存在している
  • 実装によって依存しているプラグインや環境などが異なるので別々に説明する
  • ここではデフォルトで設定されている__非同期版__の説明を行う
  • 概要
  • Clang のコンパイラコマンドを利用したプラグイン
  • 他のプラグインとは違い外部コマンドのみを利用して補完を行っている
  • 非同期版であれば補完処理中もキー入力を受け付ける
  • 自動補完ではなくて手動補完である
  • バックエンド
  • clang のコンパイラコマンド
  • 動作環境
  • clang(外部コマンド)
  • 依存しているプラグイン
  • vimproc.vim
  • 設定
" clang コマンドの設定
let g:marching_clang_command = "C:/clang.exe"

" オプションを追加する場合
let g:marching_clang_command_option="-std=c++1y"

" インクルードディレクトリのパスを設定
let g:marching_include_paths = [
\   "C:/MinGW/lib/gcc/mingw32/4.6.2/include/c++",
\   "C:/cpp/boost"
\]

" neocomplete.vim と併用して使用する場合は以下の設定を行う
let g:marching_enable_neocomplete = 1

if !exists('g:neocomplete#force_omni_input_patterns')
  let g:neocomplete#force_omni_input_patterns = {}
endif

let g:neocomplete#force_omni_input_patterns.cpp =
    \ '[^.[:digit:] *\t]\%(\.\|->\)\w*\|\h\w*::\w*'

####marching.vim(同期版)

  • 概要
  • marching.vim の同期版
  • コード補完中は処理をブロックする
  • その代わり依存しているプラグインが少ないのが利点
  • バックエンド
  • clang のコンパイラコマンド
  • 動作環境
  • clang(外部コマンド)
  • 依存しているプラグイン
  • なし
  • 設定
" バックエンドに同期版の実装を使用する
" これ以外は非同期版と同様の設定
let g:marching_backend = "sync_clang_command"
  • 備考
  • 処理が非同期で行われない以外は非同期版と同等の処理です
  • このページ内で紹介しているプラグインの中では依存している環境が一番少ない
  • clang のコンパイラコマンドのみ使用できれば動作する
  • 非同期版と同様にキャッシングが行われているので2回目以降であれば即座に補完が行われます
  • 参考サイト
  • marching.vim をいろいろと改良した - C++でゲームプログラミング

####marching.vimWandbox 版)

  • 概要
  • marching.vimWandbox
  • Wandbox を利用してオンラインでコード補完を行う
  • ローカルのマシンに Clang が存在しなくても利用可能
  • バックエンド
  • Wandbox
  • 動作環境
  • オンライン環境
  • curl or wget(外部コマンド)
  • 依存しているプラグイン
  • なし
  • 設定
" バックエンドに Wnadbox 版の実装を使用する
" これ以外は非同期版と同様の設定
let g:marching_backend = "sync_wandbox"

####snowdrop.vim + neocomplete.vim

  • 概要
  • snowdrop.vim は libclang を利用した C++ の便利プラグインである
  • neocomplete.vim を利用する事でコード補完プラグインとして利用する事も可能である
  • バックエンド
  • libclang(動的ライブラリ)
  • 動作環境
  • libclang(動的ライブラリ)
  • +python(Vim の組み込み機能)
  • +lua(Vim の組み込み機能)
  • 依存しているプラグイン
  • neocomplete.vim
  • 設定
  • 備考
  • 実装や必要な動作環境は clang_complete と同等
  • 参考サイト

####YouCompleteMe

手元の環境ではうまく動作しなかったので保留中.

####まとめ

  • libclang + +python がある環境
  • clang_complete
  • snowdrop.vim + neocomplete.vim
  • clang のコンパイラコマンドが使用できる環境
  • marching.vim(非同期版)
  • clang のコンパイラコマンドが使用でき、依存している環境が少ないほうがよい場合
  • marching.vim(同期版)
  • ローカルのマシンに clang が存在しない環境
  • marching.vim(wandbox 版)