Wie kann ich Fuzzy-Code vervollständigen?

27

Wenn Sie ReSharper in Visual Studio verwenden, können Symbole mithilfe des Fuzzy-Abgleichs anstelle des Präfixabgleichs automatisch vervollständigt werden. Zum Beispiel , wenn ich suche für eine Funktion namens DoSomethingAmazingich schreiben könnte , DoSoAmund es würde versuchen , meine Frage zu erweitern , um alle Symbole entsprechen enthalten Do, Sound Amirgendwo in ihrem Namen.

Ein weiteres Beispiel finden Sie im folgenden GIF. Es werden mehrere Erweiterungen angezeigt, bei denen Zeichenfolgen ohne Präfix zum richtigen Symbol erweitert werden. (Ignorieren Sie die Snippet-Erweiterung, da es in dieser Frage nur um Fuzzy-Matching geht.)Ein GIF, das einige Beispiele für Fuzzy Matching in Aktion zeigt

Ein weiteres Beispiel finden Sie im YouCompleteMe-Plugin für Vim: Ein GIF, das weitere Beispiele für Fuzzy Matching in Aktion in vim zeigt

Autocomplete und Company Mode scheinen Präfix-Matching zu haben, aber ich kann keine Möglichkeit finden, Fuzzy-Matching zu aktivieren.

Idealerweise ist die Lösung sprachunabhängig und gilt für jedes Symbolvervollständigungspaket, das ich verwende, aber ich interessiere mich auch für sprachspezifische Lösungen. Ich habe mir Helm angesehen, aber keine Möglichkeit gefunden, ihn auf die Code-Vervollständigung anzuwenden.

Ich habe Alternativen in Betracht gezogen, wie eine Tastenkombination zum Aktivieren der Symbolvervollständigung mithilfe eines Helm- Puffers, aber ich hoffe, dass es eine Möglichkeit gibt, dies mithilfe der Vervollständigung im Popup-Stil zu tun.

Ich bin auch offen für manuelle Konfigurationen pro Sprache, da einige Sprachen Symbole durch Bindestriche trennen, während andere Unterstriche oder Bindestriche verwenden, von denen ich annehme, dass sie sich auf den Abgleich auswirken.

Jake Woods
quelle

Antworten:

19

Die eingebaute Vervollständigungsfunktion von Emacs bietet ähnliche Fuzzy-Übereinstimmungen (die standardmäßig eher für "do-so-am" als für "DoSoAm" verwendet werden), und IIUC-Versionen des Firmenmodus verwenden diese zumindest in einigen Fällen.

Wenn Sie zB ein Elisp öffnen Puffer mit Emacs-24.4 und dem neuesten Firma-Modus, wenn Sie geben (wi-syUnternehmen ein Abschluss - Menü zeigt Pop - up window-system, window-system-for-displayund with-syntax-table.

Stefan
quelle
2
Mit Emacs 24.4 company-modeunterstützt completion-styles, dieser Beitrag deutet auf eine mögliche Einstellung für sie auszuprobieren.
Wasamasa
Nach der Installation von 24.4 habe ich festgestellt, dass dies genau das ist, wonach ich gesucht habe. Leider scheint es sprachspezifisch zu sein und erfordert Änderungen an den Backends des Unternehmens, damit es für andere Sprachen funktioniert. Von den Antworten ist es jedoch die ähnlichste, die ich gefunden habe, und mit der Zeit wird es hoffentlich auf mehr Sprachen zutreffen. Vielen Dank!
Jake Woods
company-ycmdist ein weiteres Backend, das die Fuzzy-Vervollständigung unterstützt.
Dmitry
9

Mit company-modekönnen Sie C-snach verfügbaren Kandidaten suchen, die angezeigt werden. Die Suchanfrage wird in der Modeline angezeigt (nicht ganz leicht zu erkennen, ich weiß. Ich habe hier ein Problem eingereicht ).

Wenn Sie Helm zur Vervollständigung verwenden möchten, ziehen Sie die Verwendung von helm-company oder ac-helm in Betracht . Ich habe es nicht mit versucht ac-helm, aber mit helm-companykönnen Sie es direkt an einen Schlüssel binden, um die Standardschnittstelle von zu ersetzen company-complete.

Tu Do
quelle
Dies war in der Nähe von dem, wonach ich suchte. Ich hatte gehofft, fertig zu werden, ohne einen Tastendruck ausführen zu müssen, aber ich habe festgestellt, dass die Verwendung in Kombination mit dem Präfix-Abgleich eine geeignete Alternative darstellt. Vielen Dank!
Jake Woods
Wenn Sie die company-modeBenutzeroberfläche verwenden, können Sie auf drücken C-s, um aus einer Liste der verfügbaren Kandidaten company, die Ihnen präsentiert werden, nach einem Kandidaten zu suchen .
Tu Do
Ja, das verstehe ich und wie ich in dem obigen Kommentar gesagt habe, ist das nah an dem, wonach ich gesucht habe. Die ideale Lösung (für mich) würde kein Cs erfordern und würde nach den Kandidaten inline im Popup-Fenster suchen, während ich tippe. Aber der Cs-Ansatz ist sicherlich interessant und ich beabsichtige, ihn in meinen Workflow zu integrieren.
Jake Woods
Ich finde, dass C-M-ses viel besser ist, in der Firma zu arbeiten als C-s. Mit Meta filtert es Kandidaten, anstatt nur zu suchen.
Kindermädchen
@ Kindermädchen toll, das zu wissen.
Tu Do
5

Wie bereits in einem Kommentar erwähnt, ycmdunterstützt Fuzzy Matching. Sie können es über verwenden company-ycmd. Richtig konfiguriert, erhalten Sie eine sprachspezifische Vervollständigung sowie eine einfache identifiziererbasierte Vervollständigung in einer nahtlosen Umgebung.

abingham
quelle
es wäre schön zu zeigen, was "richtig" hier bedeutet.
Jason Hu
2

Es gibt mehrere Pakete, die eine Fuzzy-Vervollständigung der einen oder anderen Art anbieten. Ich stelle mir zum Beispiel vor, dass Helm es tut (seit Sie es erwähnen).

Wenn Sie Bibliotheks- Eiszapfen verwenden , können Sie (on the fly) zwischen mehreren Fuzzy-Completion-Methoden wählen - mehr Auswahlmöglichkeiten, als ich an anderer Stelle gesehen habe. (Ich selbst bin kein Fan von Fuzzy Completion, aber ich biete es an.)

Icicles Abschluss (daher Fuzzy - Abschluss, wenn Sie sich entscheiden , dass) gilt so ziemlich überall, aber es gibt nicht eine ganze Menge von Icicles -spezifische Code -completion Funktionen. Diese Seite des Icicles- Dokuments spricht über eine solche Vervollständigung des Puffertextes.


Mit Icicles , mit Stefan Beispiel Abschluss (wi-syin Emacs Lisp - Modus:

  1. Mit Icicles vanillaVervollständigung (was Emacs bietet, respektieren completion-styles) erhalten Sie die gleichen Symbole, die Stefan erwähnt.

  2. Mit der Fuzzy-Symbol-Vervollständigung von Icicles Swank (aus der Bibliothek el-swank-fuzzy.el) als aktuelle TAB-Vervollständigungsmethode erhalten Sie folgende Vervollständigungskandidaten:

    Fenstersystem                
    mit-syntax-tabelle
    Fenstersystem für die Anzeige
    Widget-Codierung-System-Aktion
    Widget-Symbol-Eingabeaufforderung-intern
    Widget-Codierung-System-Eingabeaufforderungswert
    with-swfy-struct
    Widget-Specify-Doc
    mit-swfy-timedout
    Widget-Feld angeben
    Widget-Spezifizieren-Aktiv
    Widget-Specify-Button
    Widget-Specify-Insert
    Widget-Specify-Sample
    Widget-Spezifiziere-Geheimnis
    Widget-Spezifizieren-Inaktiv
    fenstersicher schrumpfbar p
    Widget-Typen-Kopie
    Fenstergröße anpassen
    window - Ändere die Größe des Root-Fensters vertikal
    Window-Display-Tabelle
    Fenster - Anzeigepuffer
    window - resize-apply-p
    Fenster-Größe-Anwenden-insgesamt
    widgetp-display-Completions
    Fenster-Redisplay-End-Trigger
    mit-angezeigtem-puffer-fenster
    Widget-Sichtbarkeit-Wertschöpfung
    Widget-Emacs-Bibliothek-Link-Aktion
    Widget-editierbare-Liste-Eintrag-erstellen
    Widget-Emacs-Kommentar-Link-Aktion

Die ersten drei Kandidaten sind wieder diejenigen, die Stefan erwähnt.

  1. Bei einfacher Fuzzy-Match-Vervollständigung (Bibliothek fuzzy-match.el) ist der einzige Kandidat with-syntax-table.

  2. Mit Icicles Scatter Fuzzy Completion erhalten Sie alle Kandidaten, die Swank Fuzzy Completion anbietet, sowie Folgendes:

    ange-ftp-wait-not-busy
    dired-in-dir-mit-symlinks
    ediff-select-window-setup-function-automatically
    ediff-make-wide-display
    ediff-toggle-wide-display
    ediff-window-display-p
    ediff-window-ok-for-display
    ediff-mit-syntax-tabelle
    find-new-buffer-file-coding-system
    Gnus-Frame-oder-Fenster-Anzeigename
    Hilfefenster-Display-Nachricht
    Eiszapfen-Auswahlfenster-für-Puffer-Anzeige
    Revert-Buffer-with-Coding-System
    Set-W32-System-Codierung-System
    Set-Window-Display-Tabelle
    set-window-redisplay-end-trigger
    Shell-Write-History-On-Exit
    Fenster sinnvoll teilen
    Baum-Widget - Lokalisiere-Unterverzeichnis
    w32-find-file-not-found-set-buffer-file-coding-system
    w32-initialize-window-system
  1. Mit Icicles Levenshtein (1) Fuzzy-Teilstring-Vervollständigung (Levenshtein-Abstand von 1) erhalten Sie nur diese Vervollständigungen:
    Hilfe-Folge-Symbol
    Message-Check-News-Syntax
    w32-initialize-window-system Fenstersystem
    Fenstersystem für die Anzeige
  1. Bei einer Levenshtein-Distanz von 2 statt 1 gibt es mehr als 300 Abschlusskandidaten.

  2. Bei strikter Levenshtein (1 oder 2) -Vervollständigung gibt es keine Kandidaten. Ebenso für Eiszapfen Jaro-Winklers unscharfe Fertigstellung .

Drew
quelle
1
Ich bin damit einverstanden, dass es einige potenzielle API-Überlappungen für die Fuzzy-Vervollständigung gibt, aber die Code-Vervollständigung erfordert im Allgemeinen eine modusspezifische Kompilierung oder Laufzeitüberprüfung. Wie Sie sich selbst sagen, bietet Icicles nur wenige Funktionen zur Code-Vervollständigung, sodass dies für die vorliegende Frage nicht relevant zu sein scheint.
27.
@dgtized: Nun, ich bin anderer Meinung. Hast du es versucht completion.el? (Ebenso dabbrevund hippie-expand- alle 3 sind in GNU Emacs enthalten.) Diese Dinge sind bei der Code-Vervollständigung sehr hilfreich, obwohl sie, wie Sie vermuten, keine codespezifischen Kenntnisse haben. Sie werden überrascht sein, wie hilfreich sie sein können (mit oder ohne Fuzzy-Matching). Und wie diese profitiert jede codespezifische Vervollständigung, die den Minipuffer verwendet, um zu vervollständigen, wenn es mehrere Kandidaten gibt, automatisch von der Fuzzy-Vervollständigung des Eiszapfens .
Drew
2

Wenn Sie dies verwenden ivy, wird in den letzten Updates ivydie Funktion "Fertigstellung zum Zeitpunkt" in einer Überlagerung unterstützt. Ivy unterstützt Fuzzy Matching mit Hilfe von flx. Schau dir dieses Video an, wie es funktioniert :)

Alles, was Sie tun müssen, ist, die Tastenbelegung zu drücken, an die complete-symbolstandardmäßig gebunden ist, C-M-iund ein Overlay wird eingeblendet, und Sie verwenden Fuzzy Matching, um den Abschlusskandidaten zu erhalten.

Chakravarthy Raghunandan
quelle