¿Cómo puedo completar el código difuso?

27

Cuando se usa ReSharper en Visual Studio, los símbolos se pueden completar automáticamente usando la coincidencia difusa en lugar de la coincidencia de prefijos. Por ejemplo, si estoy buscando una función llamada DoSomethingAmazingpodría escribir DoSoAmy sería tratar de ampliar mi consulta para que coincida con todos los símbolos que contienen Do, Soy Amen algún lugar de su nombre.

Otro ejemplo se puede encontrar en el siguiente gif. Puede ver varias expansiones donde las cadenas sin prefijo se expanden al símbolo correcto. (Ignore la expansión del fragmento, ya que en esta pregunta solo me preocupa la coincidencia difusa).Un gif que muestra varios ejemplos de coincidencias difusas en acción

Otro ejemplo se puede ver en el complemento YouCompleteMe para Vim: Un gif que muestra más ejemplos de coincidencias difusas en acción en vim

Los modos Autocompletar y Empresa parecen tener una coincidencia de prefijos, pero no puedo encontrar una manera de habilitar la coincidencia difusa.

Idealmente, la solución sería independiente del lenguaje y se aplicaría a cualquier paquete de finalización de símbolos que esté usando, pero también estoy interesado en soluciones específicas del idioma. He examinado Helm pero no he encontrado una manera de aplicarlo para completar el código.

He considerado alternativas como tener una combinación de teclas para activar la finalización del símbolo utilizando un búfer Helm, pero espero que haya una manera de hacerlo utilizando la finalización de estilo emergente.

También estoy dispuesto a hacer la configuración manual por idioma, ya que algunos idiomas separan los símbolos con guiones, mientras que otros usan guiones bajos o guiones, lo que supongo que afectaría la forma en que se haría la coincidencia.

Jake Woods
fuente

Respuestas:

19

La funcionalidad de finalización incorporada de Emacs ofrece una coincidencia difusa similar (aunque por defecto se usa para "do-so-am" en lugar de "DoSoAm") y las versiones recientes de IIUC del modo de empresa utilizan esto al menos en algunos casos.

Por ejemplo, si abre un búfer de Elisp usando Emacs-24.4 y el último modo de compañía, si escribe (wi-sycompañía, aparecerá un menú de finalización que muestra window-system, window-system-for-displayy with-syntax-table.

Stefan
fuente
2
Con company-modesoporte para Emacs 24.4 completion-styles, esta publicación sugiere una posible configuración para probarlo.
wasamasa
Después de instalar 24.4, descubrí que esto es exactamente lo que estaba buscando. Desafortunadamente, parece ser específico del idioma y requerirá cambios en los backends de la compañía para que funcione en otros idiomas. Sin embargo, de las respuestas es lo más cercano que he encontrado y espero que con más tiempo se aplique a más idiomas. ¡Gracias!
Jake Woods, el
company-ycmdes otro backend que admite la finalización difusa.
Dmitry
9

Con company-mode, puede usar C-spara buscar entre los candidatos disponibles que muestra. La consulta de búsqueda se muestra en la línea de modelo (no es realmente fácil de detectar, lo sé. He presentado un problema aquí ).

Si desea usar Helm para completar, considere usar helm-company o ac-helm . No he probado con ac-helm, pero con helm-company, puedes vincularlo directamente a una tecla para reemplazar la interfaz estándar de company-complete.

Tu Do
fuente
Esto estaba cerca de lo que estaba buscando. Esperaba completar sin tener que invocar una pulsación de tecla, pero descubrí que usarlo en combinación con la coincidencia de prefijos presenta una alternativa adecuada. ¡Gracias!
Jake Woods, el
Si usa la company-modeinterfaz de usuario, puede presionar C-spara buscar un candidato de una lista de candidatos disponibles que se le companypresentan.
Tu Do
Sí, entiendo eso y, como dije en el comentario anterior, está cerca de lo que estaba buscando. La solución ideal (para mí) no requeriría Cs y buscaría los candidatos en línea en la ventana emergente mientras escribo. Pero el enfoque Cs es ciertamente interesante y tengo la intención de integrarlo en mi flujo de trabajo.
Jake Woods, el
Al usar la compañía, creo que C-M-ses mucho mejor que C-s. Con meta, filtrará candidatos en lugar de solo buscar.
niñera
@nanny genial saber eso.
Tu Do
5

Como se mencionó en un comentario anterior, ycmdadmite la coincidencia difusa. Puedes usarlo a través de company-ycmd. Configurado correctamente, puede obtener la finalización específica del idioma, así como la finalización basada en un identificador simple en una experiencia bastante fluida.

abingham
fuente
Sería bueno mostrar lo que significa "correctamente" aquí.
Jason Hu
2

Hay varios paquetes que ofrecen finalización difusa de un tipo u otro. Me imagino que Helm sí, por ejemplo (ya que lo mencionas).

Si usa la biblioteca Icicles , puede elegir (sobre la marcha) entre varios métodos de finalización difusa , más opciones de las que he visto en otros lugares. (No soy particularmente un fanático de la finalización difusa, pero lo ofrezco).

La finalización de Icicles (por lo tanto, la finalización difusa, si elige eso) se aplica prácticamente en todas partes, pero no hay muchas características de finalización de código específicas de Icicles . Esta página del documento de Icicles habla sobre dicha finalización del texto del búfer.


Con Icicles , usando el ejemplo de Stefan de completar (wi-syen modo Emacs Lisp:

  1. Con la finalización de Icicles (lo que proporciona Emacs, respetando ), obtienes los mismos símbolos que Stefan menciona.vanillacompletion-styles

  2. Con la finalización del símbolo difuso Icicles Swank (de la biblioteca el-swank-fuzzy.el) como el método actual de finalización de TAB, obtiene estos candidatos de finalización:

    sistema de ventanas                
    con-sintaxis-tabla
    sistema de ventana para mostrar
    widget-coding-system-action
    widget-symbol-prompt-internal
    widget-coding-system-prompt-value
    with-swfy-struct
    widget-especificar-doc
    con-swfy-timedout
    widget-especificar-campo
    widget-especificar-activo
    widget-especificar-botón
    widget-especificar-insertar
    widget-especificar-muestra
    widget-especificar-secreto
    widget-especificar-inactivo
    ventana-con-seguridad-encogible-p
    widget-types-copy
    aplicar tamaño a la ventana
    ventana - redimensionar-ventana-raíz-verticalmente
    mesa-escaparate
    ventana - display-buffer
    ventana - redimensionar-aplicar-p
    ventana-redimensionar-aplicar-total
    widgetp-display-Completions
    ventana-redisplay-end-trigger
    con-muestra-ventana-buffer
    widget-visibilidad-valor-crear
    widget-emacs-library-link-action
    widget-editable-list-entry-create
    widget-emacs-commentary-link-action

Los primeros 3 candidatos son, nuevamente, los que Stefan menciona.

  1. Con la finalización simple de coincidencia difusa (biblioteca fuzzy-match.el), el único candidato es with-syntax-table.

  2. Con Icicles dispersa la finalización difusa , obtienes todos los candidatos que ofrece la finalización difusa de Swank, además de lo siguiente:

    ange-ftp-wait-not-busy
    dired-into-dir-with-symlinks
    ediff-choose-window-setup-function-automatic
    ediff-make-wide-display
    ediff-toggle-wide-display
    ediff-ventana-display-p
    ediff-window-ok-for-display
    ediff-with-syntax-table
    sistema-codificación-archivo-búfer-nuevo-encontrar
    gnus-frame-or-window-display-name
    mensaje-ayuda-ventana-pantalla
    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
    ventana dividida con sensatez
    tree-widget - localizar-sub-directorio
    w32-find-file-not-found-set-buffer-file-coding-system
    w32-initialize-window-system
  1. Con Icicles Levenshtein (1) finalización de subcadena difusa (distancia de Levenshtein de 1), solo obtiene estas terminaciones:
    ayuda-seguir-símbolo
    mensaje-verificar-noticias-sintaxis
    w32-initialize-window-system sistema-ventana
    sistema de ventana para mostrar
  1. Con una distancia de Levenshtein de 2 en lugar de 1, hay más de 300 candidatos de finalización.

  2. Con la terminación estricta de Levenshtein (1 o 2) no hay candidatos. Del mismo modo, para Icicles Jaro-Winkler finalización difusa .

Dibujó
fuente
1
Estoy de acuerdo en que existe una posible superposición de API para la finalización difusa, pero la finalización del código generalmente requiere una inspección compilada o en tiempo de ejecución específica del modo. Como usted mismo afirma, Icicles proporciona poco en cuanto a características de finalización de código, por lo que no parece relevante para la pregunta en cuestión.
2014
@dgtized: Bueno, no estoy de acuerdo. Has intentado completion.el? (Del mismo modo, dabbrevy hippie-expand- los 3 están incluidos en GNU Emacs.) Estas cosas son muy útiles con la finalización de código, a pesar de que, como usted sugiere, tienen ningún conocimiento de código específico. Puede que se sorprenda de lo útiles que pueden ser (con o sin coincidencia difusa). Y como estos, cualquier finalización específica de código que use el minibúfer para completar cuando hay múltiples candidatos se beneficia automáticamente de la finalización difusa de Icicles .
Dibujó el
2

si lo usa ivy, en las actualizaciones recientes ivyadmite la finalización en la funcionalidad del punto en una superposición. Ivy admite la coincidencia difusa con la ayuda de flx. Mira este video sobre cómo funciona :)

Todo lo que tiene que hacer es presionar la combinación de teclas para la complete-symbolcual está vinculada de forma predeterminada C-M-iy aparecerá una superposición y usará coincidencia difusa para obtener el candidato de finalización.

Chakravarthy Raghunandan
fuente