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 DoSomethingAmazing
podría escribir DoSoAm
y sería tratar de ampliar mi consulta para que coincida con todos los símbolos que contienen Do
, So
y Am
en 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).
Otro ejemplo se puede ver en el complemento YouCompleteMe para 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.
fuente
Respuestas:
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-sy
compañía, aparecerá un menú de finalización que muestrawindow-system
,window-system-for-display
ywith-syntax-table
.fuente
company-mode
soporte para Emacs 24.4completion-styles
, esta publicación sugiere una posible configuración para probarlo.company-ycmd
es otro backend que admite la finalización difusa.Con
company-mode
, puede usarC-s
para 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 conhelm-company
, puedes vincularlo directamente a una tecla para reemplazar la interfaz estándar decompany-complete
.fuente
company-mode
interfaz de usuario, puede presionarC-s
para buscar un candidato de una lista de candidatos disponibles que se lecompany
presentan.C-M-s
es mucho mejor queC-s
. Con meta, filtrará candidatos en lugar de solo buscar.Como se mencionó en un comentario anterior,
ycmd
admite la coincidencia difusa. Puedes usarlo a través decompany-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.fuente
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-sy
en modo Emacs Lisp:Con la finalización de Icicles (lo que proporciona Emacs, respetando ), obtienes los mismos símbolos que Stefan menciona.
vanilla
completion-styles
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:Los primeros 3 candidatos son, nuevamente, los que Stefan menciona.
Con la finalización simple de coincidencia difusa (biblioteca
fuzzy-match.el
), el único candidato eswith-syntax-table
.Con Icicles dispersa la finalización difusa , obtienes todos los candidatos que ofrece la finalización difusa de Swank, además de lo siguiente:
Con una distancia de Levenshtein de 2 en lugar de 1, hay más de 300 candidatos de finalización.
Con la terminación estricta de Levenshtein (1 o 2) no hay candidatos. Del mismo modo, para Icicles Jaro-Winkler finalización difusa .
fuente
completion.el
? (Del mismo modo,dabbrev
yhippie-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 .si lo usa
ivy
, en las actualizaciones recientesivy
admite la finalización en la funcionalidad del punto en una superposición. Ivy admite la coincidencia difusa con la ayuda deflx
. Mira este video sobre cómo funciona :)Todo lo que tiene que hacer es presionar la combinación de teclas para la
complete-symbol
cual está vinculada de forma predeterminada C-M-iy aparecerá una superposición y usará coincidencia difusa para obtener el candidato de finalización.fuente