osyo-manga / vim-marching

Async clang code completion.
123 stars 5 forks source link

vim-marchingにインクルードパスが自動認識されない件について(Linux環境) #4

Open Shougo opened 10 years ago

Shougo commented 10 years ago

これは本来vim-marchingでやるべきことなのかはわかりませんが、ハマりやすい問題なのも事実なので、報告しておきます。

Linux環境では一部のインクルードパスを手で設定しない限り、インクルードパスが正しく認識されません。/usr/include/usr/local/include しか 'path' に設定されていないためです。特にC++の標準ヘッダが認識されないのは致命的でした。

それらのパスを自動設定する適切なftplugin/cpp.vimが存在すれば良いと思いますが、標準では存在しないようです。

lingrで報告していた、候補がおかしかったり候補が出なかったりする問題も実は原因はこれでした。

私は現在、次のように設定して対処しています。これで動作しますが、コマンドラインで渡すインクルードパスがかなり長くなってしまうのが欠点です。

  let g:marching_include_paths = filter(
        \ split(glob('/usr/include/c++/*'), '\n') +
        \ split(glob('/usr/include/*/c++/*'), '\n') +
        \ split(glob('/usr/include/*/'), '\n'),
        \ 'isdirectory(v:val)')

ちなみに、neocomplete/neocomplcacheではC++を特別扱いして、上記のようなパスを追加しています。

プラグイン側で自動設定しないとしても、設定をドキュメントに追記するだけで有意義と思います。

osyo-manga commented 10 years ago

報告ありがとうございます。 インクルードディレクトリの問題は難しいですね…。 path に対して自動的にインクルードディレクトリを設定するプラグインがあれば便利そう。 ひとまずドキュメントに追記しておこうと思います。 ありがとうございました。

Shougo commented 10 years ago

path に対して自動的にインクルードディレクトリを設定するプラグインがあれば便利そう。

便利そうですね。 あとは、上記のスクリプトだと/usr/local/include/以下に対応していません。バージョン違いのライブラリがある場合も無力です。そのあたりもきちんと対応させたいですが、なかなか難しく……。

osyo-manga commented 10 years ago

あとは、上記のスクリプトだと/usr/local/include/以下に対応していません。バージョン違いのライブラリがある場合も無力です。そのあたりもきちんと対応させたいですが、なかなか難しく……。

ここら辺を自動化するのは大変そうですね…。 インクルードディレクトリを参照するのは neocomplete/neocomplcache や marching.vim 以外にも clang_complete や quickrun.vim などにも関わってくるのでやっぱり外部プラグインで用意した方がスマートな気がしますね。 clang_complete とかはどうしているのだろうか。

Shougo commented 10 years ago

clang_completeのコードを見てみました。どうやら、pathの値に頼っているようです。あとはプロジェクトの設定の.clang_completeで設定するか。

osyo-manga commented 10 years ago

あとは clang のディレクトリを追加している感じなのかな。 https://github.com/Rip-Rip/clang_complete/blob/master/plugin/libclang.py#L27

Shougo commented 10 years ago

みたいですね。これはvim-marchingでも使える手だとは思います。

Shougo commented 10 years ago

YouCompleteMeはclangのヘッダファイルを同梱しているみたい。理由は謎ですが……。

osyo-manga commented 10 years ago

YouCompleteMeはclangのヘッダファイルを同梱しているみたい。理由は謎ですが……。

YouCompleteMe のビルドに必要なので同梱しているのではないでしょうか。

Shougo commented 10 years ago

ああ、そういうことですか。ビルドにclangを使うんですかね。

rhysd commented 10 years ago

インクルードディレクトリはコンパイラの種類やバージョンによっても異なる場合があるため,一概に決められないのが厳しいですね… 各 OS ごとの設定例ぐらいなら書けそうですが. ちなみに,参考までに Mac の libc++ は /usr/lib/c++/v1 にあったりします.

osyo-manga commented 10 years ago

各環境の設定を切り替えるウマイ仕組みがほしいですねぇ。

ちなみに,参考までに Mac の libc++ は /usr/lib/c++/v1 にあったりします.

おーありがとうございます。

Shougo commented 10 years ago

gccの検索パスはgcc -vしたときに分かるようですが、このパスはコンパイル時に決定するみたいですね。 汎用的な方法で得るのは難しそうです。

osyo-manga commented 10 years ago

gccの検索パスはgcc -vしたときに分かるようですが、このパスはコンパイル時に決定するみたいですね。

なるほど、コンパイラから情報を取得するんですね。

osyo-manga commented 10 years ago

ドキュメントに追加ed