1. ホーム
  2. c++

[解決済み】Vimのオートコンプリートについて

2022-04-03 18:01:27

質問

一応、検索しているのは 作業中 Vim エディタのオートコンプリート機能。私は 以前論じた Vim は Linux では IDE に完全に取って代わるもので、確かにその通りなのですが、1つ重要な機能が欠けています。

について知っています。 Ctrl + N , Exuberant Ctagsの統合 , タグリスト , 完成 および OmniCppComplete . しかし、これらのどれもが、私が説明した「動作するオートコンプリート:」に当てはまりません。

  • Ctrl + N は、スペルの書き方を忘れてしまった場合にうまく機能します。 class または while . まあいいや。
  • Ctags は初歩的なことを教えてくれますが、多くの欠点があります。
  • タグリスト は単なる Ctags ラッパーであり、その欠点のほとんどを受け継いでいます(ただし リスト の宣言があります)。
  • cppcomplete それとも、「正しく」動作しており、この制限は設計によるものなのでしょうか?
  • OmniCppComplete は、cppcompleteと同じ問題があるようです。つまり、オートコンプリートが正しく動作しないのです。さらに tags ファイルをもう一度手動で更新する必要があります。

最近の本格的なIDEでさえ、C++のコード補完がうまくいっていないことは承知しています。だから今までVimのこの分野での不足を受け入れてきたのです。しかし、基本的なレベルのコード補完は無理もないし、むしろ生産的に使うためには必要なことだと考えています。そこで、少なくとも以下のようなことを実現できるものを探しています。

  • <強い シンタックスの認識 cppcompleteは、以下のような、スコープを意識した正しい自動補完を約束します(ただし、私には実現できません)。

    variableName.abc
    variableName->abc
    typeName::abc
    
    

    そして、本当にそれ以外のものは全く意味がありません。

  • コンフィギュラビリティ . ソースファイルがどこにあるか、つまりスクリプトが自動補完情報を取得する場所を(簡単に)指定する必要があるんだ。実際、私のディレクトリには、必要なインクルードパスを指定するMakefileがあります。Eclipseはその情報を解釈できるのに、なぜVimスクリプトはできないのでしょうか?

  • 最新性 . ファイル内で何かを変更したら、すぐにオートコンプリートに反映させたいのです。私は ではなく を手動で起動したい。 ctags (またはそれに匹敵する何か)。また、変更点は インクリメンタル つまり、1つのファイルだけを変更した場合、それは完全に 受け入れがたい に対して ctags を使用して、ディレクトリツリー全体を再解析します (巨大になる可能性があります)。

何か忘れていることはないですか?遠慮なく更新してください。

私は、多くの設定やいじくり回しは平気ですが、ゼロからソリューションをプログラムするのは嫌ですし、Vimスクリプトのデバッグも得意ではありません。

最後に、本当はJavaやC#でも同じようなものが欲しいのですが、それは望み過ぎでしょうかね。 ctags はコードファイルを解析するだけで、Java と C# はどちらもインデックスを作成する必要のある巨大なプリコンパイルされたフレームワークを持っています。残念ながら。 IDEなしで.NETを開発する は、C++よりもさらに厄介なものです。

どうすればいい?

試す ユーコンプリートミー . libclang インタフェースを介して Clang を使用し、セマンティックな C/C++/Objective-C 補完を提供します。clang_complete によく似ていますが、かなり高速で、ファジーマッチングを行います。

上記以外にも、YCMはC#、Python、Go、TypeScriptなどのセマンティック補完も提供しています。また、セマンティックに対応していない言語に対しては、識別子ベースの非セマンティック補完を提供する。