2010-01-20 9 views
27

Parece haber muchos mecanismos alternativos de autocompletado de Emacs. Sin una búsqueda exhaustiva, vienen a la mente los siguientes: ido, autocompletar, carámbanos, en la finalización del búfer, finalización del minibúfer y finalización estándar fuera de la caja. Y luego está el código completado. Montones. Y gran parte de eso depende del idioma. Sería muy útil tener un gurú de Emacs, o tres, resumir los beneficios de los principales jugadores tanto en el código como en el autocompletado sin código. Y siendo Stack Overflow, no hace falta decir que sería bueno identificar los modos de autocompletado que funcionan mejor para los mecanismos de IDE de Emacs.Entender las opciones del modo de finalización de Emacs

actualización: acabo de descubrir the Emacs Wiki completion page que amplifica mi pregunta básica: de todas estas opciones, lo que es bueno, lo que es menos bueno y si sólo se podía jugar con 2-3, que me recomiendan?

Respuesta

7

Por lo general, utilizo dos paquetes de finalización (que no sean la completación de TAB incorporada en los buffers de minibuffer y comint).

pabbrev.el - que proporciona una sugerencia con el cursor (presione TAB) para aceptar. Las elecciones se hacen mirando la frecuencia de las palabras. Me gusta esto por la indicación visual de lo que se completaría, pero en general funciona solo para una finalización.

hippie-expand - que por lo general está obligado a M-/ en lugar de dabbrev porque hace todo lo que hace dabbrev y más. Esto funciona bien cuando es posible que necesite recorrer algunas alternativas, o si desea completar un nombre de archivo u otra cosa.

Me gustan ambos porque no requieren ningún movimiento del mouse y funcionan rápidamente.

4

Utilizo la terminación estándar de pestañas en el minibúfer para nombres de archivos, comandos M-x y otras cosas.

También utilizo con frecuencia la pulsación de tecla M-/ (dabbrev-expand) para la finalización dinámica de cualquier palabra en cualquiera de sus búferes de Emacs. Es fantástico, especialmente para nombres largos de variables. Aquí está la documentación:

 
M-/ runs the command dabbrev-expand, which is an interactive 
autoloaded Lisp function in `dabbrev.el'. 

It is bound to M-/. 

(dabbrev-expand ARG) 

Expand previous word "dynamically". 

Expands to the most recent, preceding word for which this is a prefix. 
If no suitable preceding word is found, words following point are 
considered. If still no suitable word is found, then look in the 
buffers accepted by the function pointed out by variable 
`dabbrev-friend-buffer-function'. 

A positive prefix argument, N, says to take the Nth backward *distinct* 
possibility. A negative argument says search forward. 

If the cursor has not moved from the end of the previous expansion and 
no argument is given, replace the previously-made expansion 
with the next possible expansion not yet tried. 

The variable `dabbrev-backward-only' may be used to limit the 
direction of search to backward if set non-nil. 

See also `dabbrev-abbrev-char-regexp' and C-M-/. 
4

Usted puede mirar a la empresa-modo o paquete de autocompletar, que podrían utilizar diferentes fuentes de terminación, incluyendo CEDET, y también permitirá definir nuevas fuentes de finalización ... Para algunos lenguajes de programación , puede usar CEDET directamente ...

+2

probablemente se refiera a http://cx4a.org/software/auto-complete/index.html, extraño que nadie lo haya mencionado. Es lo mejor en mi experiencia. – VitoshKa

+0

Sí, me refiero a este paquete: siempre me olvido de qué contiene el signo '-' y cuál no ;-) –

8

Wrt Icicles -

En su mayor parte, se trata de carámbanos minibuffer finalización. Hay algunos casos en los que ofrece algo para la finalización en el búfer (por ejemplo, código), pero se trata principalmente de la finalización del minibúfer.

Cuando la mayoría de las personas piensa acerca de la finalización del minibúfer, piensan en la finalización del nombre del archivo, la finalización del nombre del búfer y la finalización del nombre del comando. Pero hay un lote más a él.

Como programador de Emacs-Lisp, puede utilizar la finalización donde quiera que los usuarios tengan una opción de forma interactiva. ¡Eso es bastante general!

La finalización es realmente acerca de patrón de coincidencia para definir conjuntos, que luego puede manipular.

La mayoría de las personas piensan que el único objetivo de la finalización del minibúfer es elegir un solo nombre (archivo, búfer, comando, variable, ...). Pero el poder de la finalización es realmente filtrar y posiblemente clasificar el conjunto completo de nombres de archivos, nombres de búfer, etc. de diferentes maneras, y luego permitir que los usuarios hagan algo al conjunto (no necesariamente un solo objeto) .

Eso es lo que carámbanos está a punto: lo que le permite dinámicamente (incremental) definir conjuntos con el patrón de coincidencia, y luego actuar sobre los miembros seleccionados o todos los miembros de esos grupos.

Esto no es tanto el objetivo de Ido o los otros paquetes de terminación, con la posible excepción de Helm (Cualquier cosa).

A diferencia Helm (Anything), que los privilegios de objeto nombres más tipos de objetos y acciones como punto de partida, en carámbanos que suelen invocar un comando hacer algo a uno o más objetos de un determinado tipo (por ejemplo, almacenamientos intermedios) y luego delimita el conjunto de esos objetos, generalmente por coincidencia de nombres. A menudo es el caso en Icicles que puede actuar sobre esos objetos en formas múltiples pero relacionadas dentro del mismo comando.

En Helm (Cualquier cosa), en general, su entrada es emparejado por primera vez por el nombre del objeto contra todo el universo de objetos de todo tipo, y después se estrechan hacia abajo para recoger alguna operación (s) para llevar a cabo.

Finalmente, tenga en cuenta que cada uno de los diversos enfoques de finalización ofrece algo (por ejemplo, comandos) para los usuarios finales y algo (por ejemplo, características de finalización) para los programadores.

Si usted está haciendo código de finalización continuación, por lo general, sólo quieren completar el nombre en el punto. Lo principal interesante sobre la finalización del código es determinar cuáles son los candidatos apropiados. Para eso, el contexto textual (por ejemplo, el código) es típicamente de suma importancia. Para ofrecer opciones inteligentes, la función de finalización necesita analizar el contexto (código), incluido cualquier contexto abarcador (por ejemplo, código de proyecto).

La finalización del minibúfer por otro lado se puede utilizar para cualquier tipo de elección y acción, incluida la opción múltiple con múltiples acciones. Aquí, todas las partes son interesantes: qué candidatos ofrecer, qué puedes hacer con ellos, etc.

No sé si eso ayuda, pero esa es mi opinión de todos modos.

Cuestiones relacionadas