ファジーコード補完を取得する方法


27

Visual StudioでReSharperを使用する場合、プレフィックスマッチングの代わりにファジーマッチングを使用してシンボルを自動補完できます。私は名前の関数を探している場合たとえばDoSomethingAmazing、私は書くことができDoSoAm、それが含む全てのシンボルと一致するように私のクエリを拡大しようとDoSoそしてAm自分の名前でどこかを。

別の例は、以下のgifにあります。非プレフィックス文字列が正しいシンボルに展開されるいくつかの展開を見ることができます。(この質問のように、ファジーマッチングのみに関心があるため、スニペットの展開は無視してください)。ファジーマッチングのいくつかの例を示すgif

別の例は、VimのYouCompleteMeプラグインで見ることができます。 vimの実際のファジーマッチングの例を示すgif

オートコンプリート会社モードの両方にプレフィックス一致があるようですが、あいまい一致を有効にする方法が見つかりません。

理想的には、ソリューションは言語に依存せず、使用しているシンボル補完パッケージに適用されますが、言語固有のソリューションにも興味があります。私はHelmを見ましたが、それをコード補完に適用する方法を見つけていません。

Helmバッファーを使用してシンボル補完をアクティブにするキーバインドを使用するなどの代替手段を検討しましたが、ポップアップスタイルの補完を使用してこれを行う方法があることを望んでいます。

言語によってはシンボルをダッシュ​​で区切る言語もあれば、アンダースコアまたはダッシュを使用する言語があるため、言語ごとに手動設定を行うこともできます。


回答:


19

Emacsの組み込み補完機能は、同様のファジーマッチングを提供し(デフォルトでは「DoSoAm」ではなく「do-so-am」に使用されます)、IIUCの最近のバージョンの企業モードでは、少なくともこれが使用されます。

あなたはelispのは、Emacs 24.4と最新の企業・モードを使用してバッファ開いた場合は、入力した場合など、(wi-sy同社は補完メニューの上映をポップアップ表示されますwindow-systemwindow-system-for-displaywith-syntax-table


2
Emacs 24.4のcompany-modeサポートによりcompletion-stylesこの投稿では試してみるための可能な設定を提案しています。
wasamasa 14年

24.4をインストールした後、これがまさに私が探していたものであることがわかりました。残念ながら、それは言語固有のものであるようであり、他の言語で動作させるには会社のバックエンドに変更を加える必要があります。しかし、答えのうち、それは私が見つけた最も近いものであり、できればより多くの言語に適用されることを願っています。ありがとう!
ジェイクウッズ14年

company-ycmdファジー補完をサポートする別のバックエンドです。
ドミトリー14年

9

ではcompany-mode、あなたは使用することができC-s、それが表示されることを候補から検索します。検索クエリはモードラインに表示されます(見つけるのはそれほど簡単ではありません。私はここに問題を提出しました)。

完了にHelmを使用する場合は、helm-companyまたはac-helmの使用を検討してください。試したことはありませんac-helmhelm-company、キーに直接バインドしての標準インターフェイスを置き換えることができますcompany-complete


これは私が探していたものに近いものでした。キープレスを呼び出さずに完成させることを望んでいましたが、プレフィックスマッチングと組み合わせて使用​​することが適切な代替手段であることを発見しました。ありがとう!
ジェイクウッズ14年

company-modeUI を使用する場合は、を押しC-sて、company提示された使用可能な候補のリストから候補を検索できます。
火ドゥ

うん、私はそれを理解し、私が探していたものに近い上記のコメントで言ったように。(私にとって)理想的なソリューションは、Csを必要とせず、入力時にポップアップウィンドウで候補をインラインで検索します。ただし、Csアプローチは確かに興味深いものであり、ワークフローに統合するつもりです。
ジェイクウッズ14年

会社を使用している間、私C-M-sはよりもはるかに優れていると思いますC-s。メタを使用すると、単に検索する代わりに候補をフィルタリングします。
ナニー14年

@nannyそれを知って素晴らしい。
火ドゥ

5

前のコメントで述べたように、ycmdあいまい一致をサポートしています。経由で使用できcompany-ycmdます。適切に設定すると、言語固有の補完だけでなく、識別子ベースの補完も非常にシームレスに実現できます。


ここで「適切に」とはどういう意味かを示すといいでしょう。
ジェイソン胡

2

あいまいな補完を提供するパッケージがいくつかあります。たとえば、ヘルムがそうすることを想像します(あなたがそれについて言及しているので)。

ライブラリーIciclesを使用する場合は、いくつかのファジー完了メソッドの中から(オンザフライで)選択できます-他の場所で提供されているよりも多くの選択肢があります。(私は、ファジー完成のファンではありませんが、私自身はそれを提供しています。)

Icicles補完(したがって、ファジー補完を選択した場合)は、ほぼすべての場所に適用されますが、Icicles固有のコード補完機能はそれほど多くありません。Iciclesのドキュメントのこのページでは、このようなバッファーテキストの補完について説明しています。


つらら完成のステファンの例使用し(wi-syたEmacs Lispモードでは:

  1. つららの vanilla完了(Emacsは尊重し、提供するものcompletion-styles)、あなたはステファンが述べていることと同じ記号を取得します。

  2. つらら スワンクファジーシンボル完了(ライブラリからel-swank-fuzzy.el現在のタブ補完法など)、あなたはこれらの補完候補を取得します:

    ウィンドウシステム                
    with-syntax-table
    表示用ウィンドウシステム
    ウィジェットコーディングシステムアクション
    ウィジェットシンボルプロンプト内部
    ウィジェットコーディングシステムプロンプト値
    with-swfy-struct
    ウィジェット指定ドキュメント
    with-swfy-timedout
    ウィジェット指定フィールド
    ウィジェット指定アクティブ
    ウィジェット指定ボタン
    ウィジェット指定挿入
    ウィジェット指定サンプル
    ウィジェット指定秘密
    ウィジェット指定-非アクティブ
    window-safely-shrinkable-p
    ウィジェットタイプのコピー
    window-resize-apply
    window--resize-root-window-vertically
    ウィンドウ表示テーブル
    ウィンドウ-表示バッファ
    window--resize-apply-p
    window-resize-apply-total
    widgetp-display-Completions
    ウィンドウ再表示終了トリガー
    with-displayed-buffer-window
    ウィジェット可視性値作成
    ウィジェット-emacs-library-link-action
    ウィジェット編集可能リストエントリ作成
    widget-emacs-commentary-link-action

最初の3人の候補者も、ステファンが言及した候補者です。

  1. 単純なファジーマッチ補完(ライブラリfuzzy-match.el)では、唯一の候補はwith-syntax-tableです。

  2. つらら 散布ファジー完了、あなたは候補者のすべてを取得することスワンクファジー完了の提供に加え、以下:

    ange-ftp-wait-not-busy
    dired-into-dir-with-symlinks
    ediff-choose-window-setup-function-automatically
    ediff-make-wide-display
    ediff-toggle-wide-display
    ediff-window-display-p
    ediff-window-ok-for-display
    ediff-with-syntax-table
    新しいバッファファイルのコーディングシステムを見つける
    gnus-frame-or-window-display-name
    ヘルプウィンドウ表示メッセージ
    icicle-choose-window-for-buffer-display
    符号化システムでバッファを元に戻す
    set-w32-system-coding-system
    set-window-display-table
    set-window-redisplay-end-trigger
    終了時のシェル書き込み履歴
    分割ウィンドウに応じて
    tree-widget--locate-sub-directory
    w32-find-file-not-found-set-buffer-file-coding-system
    w32-initialize-window-system
  1. つらら レーベンシュタイン(1)ファジーサブ完了(1のレーベンシュタイン距離)、あなただけのこれらの補完を取得します:
    ヘルプフォローシンボル
    メッセージチェックニュースの構文
    w32-initialize-window-system window-system
    表示用ウィンドウシステム
  1. レーベンシュタイン距離が1ではなく2の場合、300以上の完了候補があります。

  2. 厳格なレーベンシュタイン(1又は2)完了がないない候補は。同様に、Icicles Jaro-Winklerファジー補完の場合


1
ファジー補完にはAPIのオーバーラップの可能性があることに同意しますが、通常、コード補完にはモード固有のコンパイル済み検査またはランタイム検査が必要です。あなたが自分自身で述べているように、Iciclesはコード補完機能に関してほとんど何も提供していないので、目前の質問には関係がないように思われます。
14年

@dgtized:さて、私は同意しません。試しましたcompletion.elか?(同様に、dabbrevhippie-expand-すべての3は、GNU Emacsの中に含まれています。)これらのことは、あなたが提案として、彼らは持っていない、にもかかわらず、コード補完とかなり便利です何のコード特有の知識を。ファジーマッチングの有無にかかわらず、それらがどれほど役立つか驚くかもしれません。そして、これらのように、複数の候補があるときにミニバッファーを使用して完了するコード固有の補完は、Iciclesのファジー補完の恩恵を自動的に受けます。
ドリュー

2

を使用するivyと、最近の更新でivyオーバーレイのポイント機能の完了がサポートされます。Ivyは、を使用してファジーマッチングをサポートしていますflx。チェックアウトこのそれがどのように動作するかのビデオを:)

必要なのは、complete-symbolデフォルトでバインドされているキーバインディングを押すだけで、C-M-iオーバーレイがポップアップ表示されるので、ファジーマッチングを使用して補完候補を取得します。

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