コード補完プラグイン
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
- 備考
- Vim から python binding 経由で libclang を利用する
- コード補完以外の機能も実装されている
- 最近開発が滞っている
- 参考サイト
- 本の虫: Vimにclang_completeを導入した
- C++書くにあたってVimで最低限準備したこと(殴り書き) - タオルケット体操
####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*'
-
備考
-
自動補完を行いたい場合は neocomplete.vim を利用する
-
補完結果をキャッシングしているので2回目以降は即座に結果が返ってくる
-
ただし、キャッシングする対象はコンテキストを考慮していないので正確ではない
-
補完処理が終了して補完ウィンドウが出るまでに時間は
updatetime
に依存する -
updatetime
の値が大きいと補完ウィンドウが出るまでに時間がかかる -
参考サイト
####marching.vim(同期版)
- 概要
- marching.vim の同期版
- コード補完中は処理をブロックする
- その代わり依存しているプラグインが少ないのが利点
- バックエンド
- clang のコンパイラコマンド
- 動作環境
- clang(外部コマンド)
- 依存しているプラグイン
- なし
- 設定
" バックエンドに同期版の実装を使用する
" これ以外は非同期版と同様の設定
let g:marching_backend = "sync_clang_command"
- 備考
- 処理が非同期で行われない以外は非同期版と同等の処理です
- このページ内で紹介しているプラグインの中では依存している環境が一番少ない
- clang のコンパイラコマンドのみ使用できれば動作する
- 非同期版と同様にキャッシングが行われているので2回目以降であれば即座に補完が行われます
- 参考サイト
- marching.vim をいろいろと改良した - C++でゲームプログラミング
####marching.vim(Wandbox 版)
- 概要
- marching.vim の Wandbox 版
- Wandbox を利用してオンラインでコード補完を行う
- ローカルのマシンに Clang が存在しなくても利用可能
- バックエンド
- Wandbox
- 動作環境
- オンライン環境
- curl or wget(外部コマンド)
- 依存しているプラグイン
- なし
- 設定
" バックエンドに Wnadbox 版の実装を使用する
" これ以外は非同期版と同様の設定
let g:marching_backend = "sync_wandbox"
- 備考
- コード補完の処理に Wandbox を利用する以外は非同期版と同等の処理です
- 補完処理を行うたびに通信を行うので補完処理は早くはない
- 非同期版と同様にキャッシングが行われているので2回目以降であれば即座に補完が行われます
- ローカルのヘッダーファイルは使用できない
- この時に利用できる環境は以下のとおりになる
- clang HEAD 3.5 (trunk 199132)
- Boost 1.55.0
- Sprout
- 参考サイト
- arching.vim に wandbox を使用したコード補完の実装を追加してみた - C++でゲームプログラミング
####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 版)