Comment puis-je obtenir l'achèvement du code flou

27

Lorsque vous utilisez ReSharper dans Visual Studio, les symboles peuvent être complétés automatiquement à l'aide d'une correspondance floue au lieu d'une correspondance de préfixe. Par exemple , si je suis à la recherche d'une fonction nommée DoSomethingAmazingje pourrais écrire DoSoAmet essaierais d'élargir ma requête pour correspondre à tous les symboles contenant Do, Soet Amquelque part dans leur nom.

Un autre exemple peut être trouvé dans le gif ci-dessous. Vous pouvez voir plusieurs extensions où les chaînes non préfixées sont développées jusqu'au symbole correct. (Ignorez l'expansion de l'extrait de code car dans cette question, je ne suis concerné que par la correspondance floue).Un gif montrant plusieurs exemples de correspondance floue en action

Un autre exemple peut être vu dans le plugin YouCompleteMe pour Vim: Un gif montrant plus d'exemples de correspondance floue en action dans vim

La saisie semi - automatique et le mode société semblent tous deux avoir une correspondance de préfixe, mais je ne trouve pas de moyen d'activer la correspondance floue.

Idéalement, la solution serait indépendante de la langue et s'appliquerait à tout package de complétion de symboles que j'utilise, mais je suis également intéressé par les solutions spécifiques à la langue. J'ai regardé Helm mais je n'ai pas trouvé de moyen de l'appliquer à l'achèvement du code.

J'ai envisagé des alternatives telles que la présence d'une liaison de touches pour activer la complétion de symboles à l'aide d'un tampon Helm , mais j'espère qu'il existe un moyen de le faire en utilisant la complétion de style popup.

Je suis également ouvert à la configuration manuelle sur une base linguistique, car certaines langues séparent les symboles par des tirets tandis que d'autres utilisent des traits de soulignement ou des tirets qui, je suppose, affectent la façon dont la correspondance serait effectuée.

Jake Woods
la source

Réponses:

19

La fonctionnalité de complétion intégrée d'Emacs offre une correspondance floue similaire (mais par défaut, elle est utilisée pour "do-so-am" plutôt que pour "DoSoAm") et les versions récentes de l'IIUC du mode entreprise l'utilisent au moins dans certains cas.

Par exemple, si vous ouvrez un tampon Elisp en utilisant Emacs-24.4 et le dernier mode entreprise, si vous tapez (wi-syentreprise, un menu de fin apparaîtra window-system, window-system-for-displayet with-syntax-table.

Stefan
la source
2
Avec les company-modesupports Emacs 24.4 completion-styles, cet article suggère un paramètre possible pour l'essayer.
wasamasa
Après avoir installé 24.4, j'ai trouvé que c'est exactement ce que je cherchais. Malheureusement, il semble être spécifique à la langue et nécessitera des changements dans les backends de l'entreprise pour le faire fonctionner dans d'autres langues. Cependant, parmi les réponses, c'est la plus proche que j'ai trouvée et, espérons-le, avec plus de temps, elle s'appliquera à plus de langues. Merci!
Jake Woods
company-ycmdest un autre backend qui prend en charge l'achèvement flou.
Dmitry
9

Avec company-mode, vous pouvez utiliser C-spour rechercher parmi les candidats disponibles qu'il affiche. La requête de recherche est affichée dans la modélisation (pas vraiment facile à repérer, je sais. J'ai déposé un problème ici ).

Si vous souhaitez utiliser Helm pour terminer, envisagez d'utiliser Helm-company ou ac-helm . Je n'ai pas essayé avec ac-helm, mais avec helm-company, vous pouvez le lier directement à une clé pour remplacer l'interface standard de company-complete.

Tu Do
la source
C'était proche de ce que je cherchais. J'espérais terminer sans avoir à appeler une touche, mais j'ai trouvé que son utilisation en combinaison avec la correspondance de préfixe présente une alternative appropriée. Merci!
Jake Woods du
Si vous utilisez l' company-modeinterface utilisateur, vous pouvez appuyer sur C-spour rechercher un candidat à partir d'une liste de candidats disponibles companyqui vous est présentée.
Tu Do
Oui, je comprends cela et comme je l'ai dit dans le commentaire ci-dessus, c'est proche de ce que je cherchais. La solution idéale (pour moi) ne nécessiterait pas de C et rechercherait les candidats en ligne dans la fenêtre contextuelle lors de la frappe. Mais l'approche Cs est certainement intéressante et j'ai l'intention de l'intégrer dans mon workflow.
Jake Woods
En utilisant l'entreprise, je trouve que C-M-sc'est bien mieux que C-s. Avec la méta, il filtrera les candidats au lieu de simplement rechercher.
nounou
@nanny super de le savoir.
Tu Do
5

Comme mentionné dans un commentaire plus tôt, ycmdprend en charge la correspondance floue. Vous pouvez l'utiliser via company-ycmd. Configuré correctement, vous pouvez obtenir une complétion spécifique à la langue ainsi qu'une complétion basée sur un identifiant simple dans une expérience assez transparente.

abingham
la source
ce serait bien de montrer ce que "correctement" signifie ici.
Jason Hu
2

Il existe plusieurs packages qui offrent une exécution floue d'un type ou d'un autre. J'imagine que Helm le fait, par exemple (puisque vous en parlez).

Si vous utilisez la bibliothèque Icicles, vous pouvez choisir (à la volée) parmi plusieurs méthodes de complétion floue - plus de choix que ce que j'ai vu ailleurs. (Je ne suis pas particulièrement un fan de la finition floue, moi-même, mais je le propose.)

L' achèvement de Icicles (d'où l'achèvement flou, si vous choisissez cela) s'applique à peu près partout, mais il n'y a pas beaucoup de fonctionnalités de complétion de code spécifiques à Icicles . Cette page du document Icicles parle d'une telle complétion de texte tampon.


Avec Icicles , en utilisant l'exemple de Stefan de terminer (wi-syen mode Emacs Lisp:

  1. Une fois Icicles vanillaterminé (ce que Emacs fournit, en respectant completion-styles), vous obtenez les mêmes symboles que Stefan mentionne.

  2. Avec l' achèvement du symbole flou Icicles Swank (de la bibliothèque el-swank-fuzzy.el) comme méthode d'achèvement TAB actuelle, vous obtenez ces candidats à l'achèvement:

    système de fenêtre                
    with-syntax-table
    système de fenêtre pour affichage
    widget-coding-system-action
    widget-symbol-prompt-internal
    widget-coding-system-prompt-value
    avec-swfy-struct
    widget-specifier-doc
    avec-swfy-timedout
    widget-spécifier-champ
    widget-spécifier-actif
    widget-spécifier-bouton
    widget-spécifier-insérer
    widget-spécifier-échantillon
    widget-spécifier-secret
    widget-spécifier-inactif
    fenêtre-en toute sécurité-rétractable-p
    widget-types-copy
    fenêtre-redimensionner-appliquer
    fenêtre - resize-root-window-verticalically
    vitrine-table
    fenêtre - affichage-tampon
    fenêtre - resize-apply-p
    fenêtre-redimensionner-appliquer-total
    widgetp-display-Completions
    fenêtre-redisplay-end-trigger
    avec-fenêtre-tampon-affichée
    widget-visibilité-value-create
    widget-emacs-bibliothèque-lien-action
    widget-editable-list-entry-create
    widget-emacs-commentary-link-action

Les 3 premiers candidats sont, encore une fois, ceux que Stefan mentionne.

  1. Avec l' achèvement de correspondance floue simple (bibliothèque fuzzy-match.el), le seul candidat est with-syntax-table.

  2. Avec l' achèvement flou de la dispersion des glaçons , vous obtenez tous les candidats proposés par l'achèvement flou Swank, ainsi que les éléments suivants:

    ange-ftp-wait-not-busy
    dired-in-dir-with-symlinks
    ediff-choisissez-fenêtre-configuration-fonction-automatiquement
    ediff-make-wide-display
    ediff-toggle-wide-display
    ediff-window-display-p
    ediff-window-ok-for-display
    ediff-with-syntax-table
    find-new-buffer-file-coding-system
    gnus-frame-or-window-display-name
    help-window-display-message
    icicle-choose-window-for-buffer-display
    revert-buffer-with-coding-system
    set-w32-system-coding-system
    set-window-display-table
    set-window-redisplay-end-trigger
    shell-write-history-on-exit
    split-window-sensiblement
    widget d'arbre - sous-répertoire de localisation
    w32-find-file-not-found-set-buffer-file-coding-system
    w32-initialize-window-system
  1. Avec Icicles Levenshtein (1) achèvement de la sous-chaîne floue (distance Levenshtein de 1), vous obtenez uniquement ces achèvements:
    aide-suivre-symbole
    message-check-news-syntax
    w32-initialize-window-system système de fenêtre
    système de fenêtre pour affichage
  1. Avec une distance Levenshtein de 2 au lieu de 1, il y a plus de 300 candidats à l'achèvement.

  2. Avec l' achèvement strict de Levenshtein (1 ou 2), il n'y a pas de candidats. De même, pour Icicles Jaro-Winkler complétion floue .

A dessiné
la source
1
Je suis d'accord qu'il y a un certain chevauchement potentiel d'API pour l'achèvement flou, mais l'achèvement du code nécessite généralement une inspection compilée ou d'exécution spécifique au mode. Comme vous le dites, Icicles offre peu de fonctionnalités de complétion de code, donc cela ne semble pas pertinent pour la question à traiter.
organisé
@dgtized: Eh bien, je ne suis pas d'accord. As-tu essayé completion.el? (De même, dabbrevet hippie-expand- les 3 sont inclus dans GNU Emacs.) Ces choses sont très utiles pour la complétion de code, même si, comme vous le suggérez, elles n'ont aucune connaissance spécifique au code. Vous pourriez être surpris de leur utilité (avec ou sans correspondance floue). Et comme ceux-ci, toute complétion spécifique au code qui utilise le mini-tampon pour terminer lorsqu'il y a plusieurs candidats bénéficie automatiquement de la complétion floue Icicles .
Drew
2

si vous utilisez ivy, dans les mises à jour récentes ivyprend en charge la fonctionnalité d'achèvement au point dans une superposition. Ivy prend en charge la correspondance floue à l'aide de flx. Découvrez cette vidéo sur son fonctionnement :)

Tout ce que vous avez à faire est d'appuyer sur la liaison de touches pour complete-symbollaquelle est par défaut lié à C-M-iet une superposition apparaîtra et vous utilisez une correspondance floue pour obtenir le candidat à l'achèvement.

Chakravarthy Raghunandan
la source