C ++でインテリジェントな自動補完を取得する方法は?


43

Emacsに自動補完機能がない場合、他のIDEと競合することはできません。オートコンプリートにより、私はより効率的なプログラマになります。Auto Complete Mode拡張機能は知っていますが、C ++では機能しません。

オートコンプリート

C ++のスマートで効率的なオートコンプリートを実現するにはどうすればよいですか?


この質問は、もともとエリア51の提案について Malabarbaが尋ねたものです。C++でインテリジェントなオートコンプリートを取得する方法は?


1
この質問を少し広げてみるといいでしょう。これには多くの潜在的な価値がありますが、今の問題は単なるタイトルです。
マラバルバ14年

アイロニーモードは、この時点で行く方法のようです。
Sevki

回答:


45

免責事項:私はアイロニーモードの著者です

会社の皮肉なスクリーンショット

スマート自動補完が必要な場合は、company-ironyirony-modeをお勧めします

  • MELPAのおかげで、アイロニーモードは簡単にインストールできます
  • 完成が非常に正確であるパフォーマンスはかなりまともなのおかげlibclang
  • company-irony では、完了に時間がかかる場合に邪魔にならない非同期完了バックエンドがあります
  • company-irony はオーバーロードされた関数サポートします。Yasnippetがインストールされている場合、関数の引数は入力するプレースホルダーとして挿入されます
  • プロジェクトでDoxygenを使用している場合、完了候補の簡単なドキュメントがミニバッファーに表示されます(スクリーンショットを参照)
  • Unixライクシステム(Linux、OS X)へのアイロニーモードサーバーのインストールは簡単です。一方、Windowsでは少し調整が必要ですが、wikiに記載されています

まだ引用されていない別のツールはemacs-ycmdです。


2
どうもありがとうございます!もっと早く知りたいirony-mode
ルーク14年

@GuillaumePapin皮肉を書いてくれてありがとう!タイミングベンチマークを利用できるようになりますか?clang_codeCompleteAt解析されたTU(ただし、保存されていない変更)での呼び出しには3〜5秒かかることに気付きました。あるirony-mode速いこれよりも?
プラダン14年

1
Ironyはlibclang / clang_codeCompleteAtを使用しているため、それ以上の時間は得られません。コンテキストによっては3〜5秒は長すぎる場合があります(たとえば、グローバルスコープでの完了には他のスコープよりもはるかに時間がかかります)。私が最近やったいくつかのタイミングを見ることができます:github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008803-Guillaume
Papin

関連、将来の読者向け:github.com/Sarcasm/irony-mode/issues/140
ショーン・

irony-modeとemacs-ycmdの役割はどのように比較されますか?それらは互いに代替物ですか?両方を使用するのは理にかなっていますか?
プラクセオリック

23

私のガイドを確認してください。C / C ++での自動補完のためのいくつかのメソッドがリストされています。

これらのオプションは次のとおりです。

  • Ironyを使用します。Clangを使用し、他のソリューションと比較してセットアップが簡単なので、強くお勧めします。

  • Emacsの組み込みパーサーを使用します。Emacsパーサー、セマンティック内から取得できる最高のオートコンプリートですが、Linuxカーネルのような大規模なプロジェクトでは時間がかかります。

  • company-modeパッケージを使用するcompany-clang。Clangから自動的にパスを取得できるため、システムインクルードパスにコード補完を提供しますが、プロジェクトローカルの設定を行う必要があります。

  • で使用company-modecompany-gtagsます。補完としてGNU Globalから生成されたタグデータベースを使用します。これを使用して、プロジェクトにローカルで完全なコードを提供できます。生成されたデータベース内のすべてをあなたに投げるので、正確ではありません。

  • rtagsライブ分析用のサーバーを提供することにより、さらに進んでいます。しかし、純粋なElispソリューションと比較してセットアップは複雑です。


rtagsの設定が純粋なemacs lispソリューションよりも複雑であることには同意しません。純粋なemacs lispソリューションは通常、cmake / buildファイルを考慮せずヘッダーを見つけることがほとんどできませ。Rtagsは比較してセットアップが非常に簡単です。プロジェクトとしてはまだまだ若く、テストのカバレッジがあまり良くありません。
baol

Tuhdoのガイドへの素敵な追加:syamajala.github.io/c-ide.html
ビクター

9

RTags + Companyで大きな成功を収めました。

RTags rdmでは、コード補完、コードナビゲーション、リファクタリングにclangを使用する別個のデーモンを実行する必要があります。rdmまた、シンボルのデータベースとして機能します。つまり、オートコンプリートは、を直接呼び出すだけのソリューションよりもはるかに高速ですclang_codeCompleteAt

RDMは、面倒なことができ、あなたのプロジェクトのためのコンパイルフラグの情報を必要としますが、からアドバイスに従うならばRTagsのページやシンボリックリンクgcc-rtags-wrapper.shgccg++ccおよびc++RDMは自動的に再コンパイルに新しいコンパイルフラグで更新されます。


アイロニーモードからrtagsに切り替えました。アイロニーモードは絶えず発生し、約15分ほどで動作を停止します。Rtagsはこれまでのところかなり良いようで、yasnippetとの統合がよりクリーンです。
-nenchev

6

解決策1:会社モード+ clang

唯一の問題は、プロジェクトのc / c ++ヘッダーファイルを検索する場所をcompany-modeに伝える必要があることです。

cmakeを使用する場合は、https://github.com/redguardtoo/cpputils-cmakeでセットアップを行うことができます(ヒント:cpputils-cmakeの作成者です)。

または

解決策2:企業モード+ GNUグローバル

言うまでもなく、他の人が述べたように、gnuグローバルcliツールでタグを構築する必要があります。


1

私はcmake-ideを使用してrtags、flycheck、irony、およびcompany-clangを構成しています。

これで、ビルドシステムお気に入りの静的解析emacsプラグインを同時に設定できます!

編集:会社clangがオートコンプリートを提供していることに注意してください。これはあなたが探していた機能でした。cmake-ideはflycheckとrtagsを構成することもできます。これにより、さらにIDEに似た機能がいくつか追加されます。


1
これがC ++オートコンプリートを取得する方法の質問にどのように答えるかを説明してください。
ドリュー

@Drew会社打ち鳴らすには、補完提供
AnimatedRNG

答えに入れてください。どうも。
ドリュー

0

MXセマンティックモード

www.gnu.org/software/emacs/manual/html_node/semantic/Using-Semantic.html#Using-Semantic

&&

タグ表

見つける 。-name "*。[chCH]" -print | etags-

www.gnu.org/software/emacs/manual/html_node/emacs/Tags.html

etags、ctags-Emacsのタグファイルを生成、vi

manpages.debian.org/cgi-bin/man.cgi?query=etags&apropos=0&sektion=0&manpath=Debian+8+jessie&format=html&locale=en

CMi(またはM-TAB)完了点。セマンティックモードが有効な場合、セマンティックパーサーデータを使用しようとします。セマンティックモードが無効または失敗した場合、選択したタグテーブルを使用して完了しようとします(タグを参照)

http://www.gnu.org/software/emacs/manual/html_node/emacs/Symbol-Completion.html#index-C_002dM_002di

M-。(find-tag)タグ名をプロンプト&&定義にジャンプ

http://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Tag.html#index-M_002d_002e

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.