web-dev-qa-db-ja.com

emacsでコード補完を取得する方法は?

Emacsがコード補完をサポートしていることを知っています。でも、正直に言うと、私はFAQ読者です。少なくとも、まったく新しいものについては。 C++やJavaでのスマートコード補完、または多くの主要言語のコード補完を行うパッケージはありますか?

20
starcorn

Emacsのあらゆる種類のバッファで機能する基本的な方法は、 動的省略形M-/(別名 alt+/

これにより、テキストが展開され、現在のバッファーまたは現在開いている他のバッファーに既に存在する他の文字列が複製されます。

C++またはJava(またはその他)に固有の言語であるより広範なコード補完については、コードテンプレートまたはスニペットパッケージを確認する必要があります。一部については この関連する質問 StackOverflowでこれらのディスカッションで一般的に言及されているのは yasnippet -スクリーンキャストのデモが emacsブログのこの投稿 にあります。

27
Doug Harris

@Dougの答えは少し時代遅れであり、彼の焦点は事前定義されたスニペットを使用したコード拡張にあります。

OPの質問は、インテリセンス(たとえば、クラスのオートコンプリートメソッド名)に関するものだと思います。

  1. ヒッピーエキスパンド が一般的でしたが、構文アナライザーは emacsタグ です。したがって、ctagsがサポートするすべての言語(C++、Javaを含む)をサポートします。しかし、ctagsはコードの分析に正規表現しか使用しないため、結果は完全ではありません。詳細はmy init-hippie-expand.el を参照してください。 hippie-expand-try-functions-listの値を確認することから始めます。

  2. auto-complete は、ファンシーUI(コンソールウィンドウでもドロップダウンメニュー)を備えたモダンなものです。 clang をバックエンドとして使用する場合。インテリセンスははるかに優れています。 clangを機能させるには、オートコンプリートのプラグインであるauto-complete-clangをインストールする必要があります。 clangがサポートする言語(C/C++/Obj-C)のみをサポートします。 Sylvain Benner が指摘したように、実際にEclipseの実行可能ファイルを呼び出すJava解析バックエンドとして emacs-eclim を使用できます。オートコンプリートはJavaをサポートできます。詳細は、my init-auto-complete.el を参照してください。

  3. semantic は、UIとバックエンド解析エンジンの両方を提供します。遅いです。ドロップダウンUIは問題ありませんが、Xウィンドウが必要です。インテリセンスの結果はctagsよりも優れています。そして、ドキュメンテーションは私にとってオタクすぎる。詳細は init-semantic.el を参照してください。

  4. company-mode はオートコンプリートに似ていますが、すべてを1つのバンドルにパッケージ化する点が異なります。たとえば、C++開発者は会社モードのインストールのみが必要です(オートコンプリートにはサードパーティのプラグインが必要です)。もう1つのUIの違いは、会社が候補を自動的に表示することです。したがって、会社で押すキーが少なくなります。カスタマイズ後にオートコンプリートで同じことを行うことができます。

要約すると、オートコンプリート、会社は最も人気のある2つの選択肢です。セマンティックおよびヒッピー展開も歓迎されますが、あまり使用されません。他の人は言及するのは簡単すぎて、それらの機能はすでにビッグ4でカバーされています。たとえば、オートコンプリートはyasnippetを入力ソースとして使用できます(オートコンプリートはUIを提供しますが、実際の候補はyasnippetバックエンドによって生成されます)。

主要なコード補完プラグインとして(== --- ==)オートコンプリートまたは会社のいずれかを使用することをお勧めしますおよびセマンティックまたはヒッピー拡張のいずれかを補完として使用しますプラグイン

私はcompany-modeとhippie-expandを使用しているため、

  • 現在(2017年)の会社モードは、オートコンプリートよりも積極的に維持されており、サードパーティのプラグイン(ラテックスプラグインなど)が多い

  • ヒッピー拡張はあまりアクティブではありませんが、company-mode/semantic/auto-completeが使用しているTABキーを占有しません

C++/Javaで会社モードを使用している場合は、company-backendsを変更することをお勧めします。

企業モードに関するいくつかのヒント、

company-backendsの値を微調整する必要がある場合があります。たとえば、その値が(company-eclim company-semantic company-clang (company-dabbrev-code company-gtags company-etags company-keywords))であるとします。次に、company-eclimがゼロ以外の候補を取得できる場合、companyはJavaを記述していると見なし、company-eclimの後にバックエンドを実行しません。

では、(company-dabbrev-code company-gtags company-etags company-keywords)を見てみましょう。これら4つのバックエンドはすべて一緒に使用されます。たとえば、company-dabbrev-codeがゼロ以外の候補を正常にフェッチした後でも、他の3つのバックエンドは実行されます。

現実の世界では、バックエンドの順序を再調整したり、新しいバックエンド(たとえば、company-rtags)を追加したりする必要があることがよくあります。

22
chen bin

短い答え:Javaに役立つemacsについては知りません。ダイナミックエキスパンドは、クラスパス内のライブラリを考慮しません。入力しているコードについては何も認識せず、バッファの1つに既に存在するテキストにのみ展開できます。 JDEとemacs-eclimはこの機能を提供しようとしますが、個人的には感心しませんでした。

2
email missing

短い答え: M-/

長い答え:RTFM :-)

0
Gyom