Come posso ottenere il completamento del codice fuzzy


27

Quando si utilizza ReSharper in Visual Studio, i simboli possono essere completati automaticamente utilizzando la corrispondenza fuzzy anziché la corrispondenza del prefisso. Per esempio, se sto cercando una funzione denominata DoSomethingAmazingPotrei scrivere DoSoAme sarebbe cercare di ampliare la mia domanda per abbinare tutti i simboli che contengono Do, Soe Amda qualche parte nel loro nome.

Un altro esempio può essere trovato nella gif di seguito. Puoi vedere diverse espansioni in cui le stringhe senza prefisso vengono espanse nel simbolo corretto. (Ignora l'espansione dello snippet poiché in questa domanda mi occupo solo della corrispondenza fuzzy).Una gif che mostra diversi esempi di corrispondenza fuzzy in azione

Un altro esempio può essere visto nel plugin YouCompleteMe per Vim: Una gif che mostra altri esempi di corrispondenza fuzzy in azione in vim

Il completamento automatico e la modalità Azienda sembrano entrambi avere la corrispondenza del prefisso ma non riesco a trovare un modo per abilitare la corrispondenza fuzzy.

Idealmente, la soluzione sarebbe indipendente dalla lingua e si applicherebbe a qualsiasi pacchetto di completamento di simboli che sto usando, ma sono anche interessato a soluzioni specifiche della lingua. Ho guardato Helm ma non ho trovato il modo di applicarlo al completamento del codice.

Ho considerato alternative come avere un keybinding per attivare il completamento del simbolo usando un buffer Helm ma spero che ci sia un modo per farlo usando il completamento in stile popup.

Sono anche aperto a fare la configurazione manuale in base alla lingua poiché alcune lingue separano i simboli con trattini mentre altri usano trattini bassi o trattini che presumo influenzerebbero il modo in cui la corrispondenza sarebbe stata fatta.


Risposte:


19

La funzionalità di completamento integrata di Emacs offre una corrispondenza fuzzy simile (sebbene per impostazione predefinita sia usata per "do-so-am" piuttosto che per "DoSoAm") e le recenti versioni IIUC della modalità aziendale lo usano almeno in alcuni casi.

Ad esempio, se si apre un buffer Elisp utilizzando Emacs-24.4 e l'ultima modalità aziendale, se si digita (wi-sycompany verrà visualizzato un menu di completamento che mostra window-system, window-system-for-displaye with-syntax-table.


2
Con i company-modesupporti Emacs 24.4 completion-styles, questo post suggerisce una possibile impostazione per provarlo.
Wasamasa,

Dopo aver installato 24.4 ho scoperto che questo è esattamente quello che stavo cercando. Purtroppo sembra essere specifico della lingua e richiederà modifiche ai backend aziendali per farlo funzionare per altre lingue. Tuttavia tra le risposte è il più vicino che ho trovato e si spera con più tempo si applicherà a più lingue. Grazie!
Jake Woods,

company-ycmdè un altro backend che supporta il completamento fuzzy.
Dmitry,

9

Con company-mode, è possibile utilizzare C-sper cercare tra i candidati disponibili che viene visualizzato. La query di ricerca viene visualizzata nella modeline (non molto facile da individuare, lo so. Ho presentato un problema qui ).

Se si desidera utilizzare Helm per il completamento, considerare l'utilizzo di helm-company o ac-helm . Non ho provato con ac-helm, ma con helm-company, è possibile associarlo direttamente a una chiave per sostituire l'interfaccia standard di company-complete.


Questo era vicino a quello che stavo cercando. Speravo di ottenere il completamento senza dover invocare un tasto, ma ho scoperto che usarlo in combinazione con la corrispondenza dei prefissi rappresenta un'alternativa adatta. Grazie!
Jake Woods,

Se si utilizza l' company-modeinterfaccia utente, è possibile premere C-sper cercare un candidato da un elenco di candidati disponibili companypresentati.
Tu Do,

Sì, lo capisco e come ho detto nel commento sopra che è vicino a quello che stavo cercando. La soluzione ideale (per me) non richiederebbe Cs e cercherebbe i candidati in linea nella finestra popup mentre scrivo. Ma l'approccio Cs è sicuramente interessante e intendo integrarlo nel mio flusso di lavoro.
Jake Woods,

Mentre uso la compagnia, trovo che C-M-ssia molto meglio di C-s. Con meta, filtrerà i candidati anziché semplicemente cercare.
tata

@Nanny fantastico saperlo.
Ma Do,

5

Come accennato in precedenza in un commento, ycmdsupporta la corrispondenza fuzzy. Puoi usarlo tramite company-ycmd. Configurato correttamente, puoi ottenere un completamento specifico della lingua e un semplice completamento basato su identificatore in un'esperienza piuttosto fluida.


sarebbe bello mostrare cosa significa "correttamente" qui.
Jason Hu,

2

Esistono diversi pacchetti che offrono il completamento fuzzy di un tipo o di un altro. Immagino che Helm lo faccia, per esempio (dal momento che lo dici).

Se usi la libreria Icicles puoi scegliere (al volo) tra diversi metodi di completamento fuzzy - più scelta di quella che ho visto offerto altrove. (Non sono particolarmente un fan del completamento fuzzy, me stesso, ma lo offro.)

Ghiaccioli completamento (completamento quindi fuzzy, se si sceglie che) si applica un po 'ovunque, ma non ci sono un sacco di Ghiaccioli SPECIFICI codice -Completamento caratteristiche. Questa pagina del documento Icicles parla di tale completamento del buffer-text.


Con Icicles , usando l'esempio di Stefan per il completamento (wi-syin modalità Lisp di Emacs:

  1. Con il completamento di Icicles (ciò che Emacs fornisce, rispettando ), ottieni gli stessi simboli che menziona Stefan.vanillacompletion-styles

  2. Con il completamento del simbolo fuzzy di Icicles Swank (dalla libreria el-swank-fuzzy.el) come metodo di completamento TAB corrente, ottieni questi candidati per il completamento:

    window-system                
    con-sintassi-table
    window-system-per-display
    widget di codifica-system-action
    widget di-simbolo-pronta-interno
    widget di codifica-system-pronta-value
    con-swfy-struct
    widget di-specifica-doc
    con-swfy-TimedOut
    widget di specificare-campo
    widget di specificare-attivo
    widget di specificare-pulsante
    widget di-specifica-insert
    widget di specificare-campione
    widget di specificare-secret
    widget di-specifica-inattiva
    window-sicurezza-termoretraibile-p
    Widget-tipi-copy
    window-ridimensionamento-applicare
    window - ridimensionamento-root-window-verticale
    finestra-display-table
    Finestra - Display-buffer
    window - ridimensionamento-apply-p
    window-ridimensionamento-apply-totale
    widgetp-display-Completamenti
    window-Rivisualizza-end-trigger
    con-mostrato-buffer-finestra
    widget di visibilità-valore-creare
    Widget-emacs-libreria-link-action
    widget di modificabile-list-entry-creare
    widget di-emacs-commento-link-action

I primi 3 candidati sono, ancora una volta, quelli menzionati da Stefan.

  1. Con il semplice completamento di fuzzy-match (libreria fuzzy-match.el), l'unico candidato è with-syntax-table.

  2. Con Icicles scatter fuzzy completamento , ottieni tutti i candidati che offre Swank fuzzy completamento, più i seguenti:

    ange-ftp-wait-non-occupati
    dired-in-dir-con-link simbolici
    Ediff-scegliere-window-setup-funzione-automatico
    Ediff-make-wide-display
    Ediff ginocchiera-wide-display
    Ediff-window-display-p
    Ediff-window-ok-per-display
    Ediff-con-sintassi-table
    trovare-nuovi-buffer-file-codifica-system
    gnus-frame-o-window-display-name
    aiuto-window-display-messaggio
    ghiacciolo-scegliere-window-per-buffer-display
    revert-buffer-con-codifica-system
    set-w32-sistema di codifica-system
    set-window-display-table
    set-window-Rivisualizza-end-trigger
    shell-write-storia-on-uscita
    split-window-sensibilmente
    tree-widget di - localizzare-sub-directory
    W32-find-file-not-found-set-buffer-file-codifica-system
    W32-inizializzazione-window-system
  1. Con Icicles Levenshtein (1) completamento sfocato sottostringa (distanza Levenshtein di 1), ottieni solo questi completamenti:
    aiuto-follow-simbolo
    messaggio-check-news-sintassi
    w32-inizializza-sistema-finestra sistema-finestra
    window-system-per-display
  1. Con una distanza di Levenshtein di 2 anziché 1, ci sono più di 300 candidati per il completamento.

  2. Con rigorosa Levenshtein (1 o 2) il completamento ci sono non candidati. Allo stesso modo, per il completamento fuzzy di Icicles Jaro-Winkler .


1
Sono d'accordo che ci sia una potenziale sovrapposizione dell'API per il completamento fuzzy, ma il completamento del codice richiede generalmente una compilazione specifica per la modalità o un'ispezione di runtime. Come ti dichiari, Icicles fornisce poco in termini di funzionalità di completamento del codice, quindi non sembra rilevante per la domanda a portata di mano.
dgtized

@dgtized: Beh, non sono d'accordo. Ci hai provato completion.el? (Allo stesso modo, dabbreve hippie-expand- tutti e 3 sono inclusi in GNU Emacs.) Queste cose sono molto utili per il completamento del codice, anche se, come suggerisci, non hanno alcuna conoscenza specifica del codice. Potresti essere sorpreso di quanto possano essere utili (con o senza corrispondenza fuzzy). E come questi, qualsiasi completamento specifico del codice che utilizza il minibuffer per completare quando ci sono più candidati beneficia automaticamente del completamento fuzzy di Icicles .
Disegnò il

2

se lo usi ivy, negli aggiornamenti recenti ivysupporta la funzionalità di completamento al punto in un overlay. Ivy supporta la corrispondenza fuzzy con l'aiuto di flx. Guarda questo video su come funziona :)

Tutto quello che devi fare è premere il tasto di associazione a complete-symbolcui è associato per impostazione predefinita C-M-ie apparirà una sovrapposizione e usi la corrispondenza fuzzy per ottenere il candidato finale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.