Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

g:neocomplcache_force_omni_patternsが動作しないことがある #244

Closed
Shougo opened this issue Sep 5, 2012 · 28 comments
Closed

g:neocomplcache_force_omni_patternsが動作しないことがある #244

Shougo opened this issue Sep 5, 2012 · 28 comments

Comments

@Shougo
Copy link
Owner

Shougo commented Sep 5, 2012

manga_osyoさんより報告を受けましたが、こちらで再現しないのでここで議論することにします。

この設定ファイルを使用したとき、二回目のg:neocomplcache_force_omni_patternsが動作せず、keyword_completeやmember_completeが働くようです。

http://ideone.com/vdyQU

現象が再現するC++ソースコードも欲しいところです。ソースコードが一致していないと辛いです。

@Shougo
Copy link
Owner Author

Shougo commented Sep 5, 2012

osyoさんの.vimrcは試せなかったので、私はこの最小構成で試しました。

https://gist.github.com/3628411

しかし、再現しませんでした。

@Shougo
Copy link
Owner Author

Shougo commented Sep 5, 2012

もうちょっと.vimrcの量を減らして見ました。そうして原因がほぼ判明。
neocomplcacheはrefresh=alwaysなので、neocomplcacheの補完が続けて発動してしまっているようです。

@osyo-manga
Copy link

コメントしようと思ったらコメントされていた。
何を言っているのかry。
それは、ユーザ側で対処出来るような問題なのでしょうか?

@Shougo
Copy link
Owner Author

Shougo commented Sep 5, 2012

修正して見ました。試してみてください。

@Shougo
Copy link
Owner Author

Shougo commented Sep 5, 2012

ユーザー側での対処は無理です。プラグイン側で検出する必要があります。
こちらで試した限り、オムニ補完が発動するようになりました。

@osyo-manga
Copy link

neocomplcache を更新して試してみました。
今度は常にユーザ定義補完が呼ばれるようになりました。
neocomplcache の設定は特に変えていません。
echo neocomplcache#is_omni_complete("str.")
では 1 が返ってきます。

@osyo-manga
Copy link

あ、あと C++ のコードはこんな感じです。

#include <string>

int
main(){
    std::string str;
    str.              // ここで補完を行う
    return 0;
}

@Shougo
Copy link
Owner Author

Shougo commented Sep 5, 2012

うーん、たしかに挙動が変ですね。最小構成.vimrcではユーザー定義補完が呼ばれます。
私のいつもの.vimrcでは再現しないし……。
昨日試したときは動いたんだけどな。

@Shougo
Copy link
Owner Author

Shougo commented Sep 6, 2012

どうやら、自分のいつもの環境と最小構成ではneocomplcacheが呼ばれるタイミングが微妙に異なるようです。原因は不明。

今度は常にユーザ定義補完が呼ばれるようになりました。

一応、それは修正したんですがis_omni_complete()の検出後Vimのキーワード補完が呼ばれます。
原因が不明で、それは直せていません。

@Shougo
Copy link
Owner Author

Shougo commented Sep 6, 2012

とりあえず、強制的にキーワード補完のウインドウを閉じることで対処出来ました。
いつもの.vimrc+最小構成の両方で確認。manga_osyoさんのほうでも確認をお願いします。

@osyo-manga
Copy link

こちらでも試してみました。
最小構成の vimrc では問題なくオムニ補完が行われて clang_complete で補完がおこなれました。
2回目以降も問題ありません。
ただ、いつもの vimrc では、インクルードファイルをスキャンした後にキーワード補完が行われてしまい、こちはらうまく動作しませんでした。
手動() でオムニ補完してみたんですが、パターンが見つからずに正しく clang_complete で補完が行われていないみたいですね。
こちらでもうちょっと調べてみます、。

@osyo-manga
Copy link

あ、手動()が出力さてなかった…。
<C-x><C-o>
です。

@osyo-manga
Copy link

もうちょっと試してみたんですが、どうやら手動オムニ補完した場合に clang_complete が正しく呼び出される場合と、正しく呼び出されない場合があるみたいです。
これについても何が原因なのかは不明。
あと手動オムニ補完が正しく動作する場合でも、自動補完ではインクルードファイルをスキャン後にキーワード補完が呼び出されてしまいました。

@osyo-manga
Copy link

1つ原因がわかりました。

inoremap <expr><C-e> neocomplcache#cancel_popup()

がマッピングされている場合オムニ補完ではなくてキーワード補完が呼び出されました。
ユーザ側では特に呼び出してはいないと思うのですが…。

#include <string>

int
main(){
    std::string str;
    str.str         // キーワード補完が呼ばれる
    return 0;
}

そちらでも再現されるか確認をお願いします。

@osyo-manga
Copy link

あと

set path+=C:/MinGW/lib/gcc/mingw32/4.6.2/include/c++

を設定していると str. で『インクルードされたファイルのスキャン』が行われました。
これは別に原因があるのかも知れません。

@Shougo
Copy link
Owner Author

Shougo commented Sep 7, 2012

1つ原因がわかりました。
inoremap <expr><C-e> neocomplcache#cancel_popup()
がマッピングされている場合オムニ補完ではなくてキーワード補完が呼び出されました。

修正しました。

を設定していると str. で『インクルードされたファイルのスキャン』が行われました。
これは別に原因があるのかも知れません。

これは、neocomplcacheの終了後になぜかキーワード補完が呼び出されるからです。
ひとまず、'complete'オプションから"i"を抜いてください。

set complete-=i

@Shougo
Copy link
Owner Author

Shougo commented Sep 7, 2012

この挙動自体がVimのバグの可能性があり、ちょっと再現方法を調べています。

@osyo-manga
Copy link

ありがとうございます。
上記の対策をしたところ、とりあえず問題になっていた点は解消されていました。
今のところ特に問題は出ていないのでもうちょっと様子を見てみたいと思います。
あと動作には問題ないのですが、『.』を打った直後に一瞬ポップアップメニューが出てすぐ消えて、その後にオムニ補完のポップアップが出るのですが、これは挙動としては合っていますか?

@Shougo
Copy link
Owner Author

Shougo commented Sep 7, 2012

すみません、自分が書いた最小コード(neocomplcacheを使わない)では再現しませんでした……。

補完関数内でreturn -3をすると、なぜかキーワード補完が呼ばれる、
return -1をするとcompletefuncが呼ばれる、return -2をするとオムニ補完が呼ばれる、ということがわかったので-2を返すようにしました。neocomplcacheを更新してください。一瞬ポップアップメニューが出るのも解消されているはずです。

補完状態が壊れている気もしますが原因はよくわかりません。

@osyo-manga
Copy link

一瞬ポップアップメニューが出るのは解消されました。
あと complete オプションに i が付いていてもキーワード補完が呼び出されることなくオムニ補完が呼び出されるようになりま
した。
ざっと使ってみた限りでは特に問題はなさそうです。

@Shougo Shougo closed this as completed Sep 7, 2012
@Shougo
Copy link
Owner Author

Shougo commented Sep 7, 2012

了解。原因がよくわからなかったのが不安ですが、とりあえずcloseします。

@osyo-manga
Copy link

とりあえず、しばらくこれで使ってみて問題がなければ。って感じで。

@Shougo
Copy link
Owner Author

Shougo commented Sep 7, 2012

はい。ようやくneocomplcache-clang_completeがオワコンになりますね。

@osyo-manga
Copy link

Twitter の方にも報告したんですが、こっちの方がいいと思ったので転載。

// 下記の設定の場合で再現
// let g:neocomplcache_force_omni_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::'

// let g:neocomplcache_force_omni_patterns.cpp = '::'
// これであれば動作したので正規表現パターンが原因?

#include <iostream>

::iostream      // :: を打つ
                        // インクルードファイルをスキャンしてキーワード補完が呼ばれる
                        // iostream が勝手に選択される


int
main(){

        return 0;
}

@Shougo
Copy link
Owner Author

Shougo commented Sep 7, 2012

原因判明しました。clang_completeの自動補完を無効にしていなかったためです。

let g:clang_complete_auto = 0
let g:clang_auto_select = 0

こうすると、上記の問題は起こらなくなりました。
つまり私の.vimrcは上記の設定をしているのでこの問題が起こらなかったという事です。

@Shougo
Copy link
Owner Author

Shougo commented Sep 7, 2012

clang_completeの自動補完を無効にすると、neocomplcacheが-3を返しても、うまく動作することを確認。
どうやらclang_complete側の自動補完と競合しています。今回に関してはVimのバグではありません。

@osyo-manga
Copy link

アーイエーアーそういう事か…。
確かにわたしの環境だと let g:clang_complete_auto = 0 になっていますね…。

@osyo-manga
Copy link

ひとまず

 let g:clang_complete_auto = 0 

としたところ上記に書いたグローバル空間上でのキーワード補完はされなくなりました。
あと :: だけで補完して欲しい場合もあったので

let g:neocomplcache_force_omni_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|::'

と変更。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants