2011-08-11 16 views
20

Recientemente descubrí M-x ielm (Emacs self-REPL) y quedé gratamente sorprendido de que haya una finalización de pestañas en funcionamiento en ese modo. Diga, puedo comenzar a escribir ecb-, luego presionar TAB y ielm me mostrará qué funciones están expuestas por ECB. Muy conveniente para la exploración!emacs - autocompletado en modo Emacs Lisp

Sin embargo, cuando empiezo a editar uno de mis archivos *.el (en el modo principal de Emacs Lisp), TAB ya no funciona como autocompletar y realiza una sangría, lo cual me parece desafortunado.

Traté de averiguar cómo funciona el autocompletado dentro de ielm para posiblemente trasplantarlo al modo Emacs Lisp. Sin embargo, aparentemente, el autocompletado en ielm usa comint-dynamic-complete, que, por lo que yo entiendo, funciona solo en los almacenamientos intermedios basados ​​en comint. Supongo que esto significa que no tengo suerte aquí.

Entonces, bueno, ¿cómo habilito la autocompletación para Emacs Lisp?

Respuesta

28

En versiones recientes de Emacs, se puede utilizar una pieza poco conocida de funcionalidad integrada que permite la implementación del tabulador:

(setq tab-always-indent 'complete) 
(add-to-list 'completion-styles 'initials t) 

Con esta configuración, TAB - que por lo general está obligado a indent-for-tab-command - primeros intentos para ajustar la sangría de acuerdo con la configuración del modo, pero si la sangría ya es correcta, se completa la finalización. Este suele ser el comportamiento deseado, y en mi humilde opinión funciona mejor que los complementos de terceros como smart-tab.

Tenga en cuenta, sin embargo, que en algunos modos, TAB no está vinculado a indent-for-tab-command, por lo que es necesario volver a enlazar para esos modos, p. con smart-tab. Además, cuando los modos tienen "sangría de rebote" (por ejemplo, python-mode), esta técnica tampoco funcionará.

2

puedo encontrar tanto la sangría y la finalización útil a veces, así que tengo una función que elige en función de si el último que hice fue insertar el texto o no:

(global-set-key [tab] 'indent-or-expand) 
(defun indent-or-expand() 
    "Either indent according to mode, or expand the word preceding point." 
    (interactive) 
    (if (or 
     (eq last-command 'self-insert-command) 
     (eq last-command 'dabbrev-expand)) 
     (progn 
     (setq this-command 'dabbrev-expand) 
     (dabbrev-expand nil)) 
    (indent-according-to-mode))) 

Probablemente puede utilizar comint-dynamic-complete en lugar de dabbrev si lo desea, pero me parece que dabbrev funciona muy bien para emacs lisp, especialmente cuando se combina con completer.el, que puede ampliar incluso f-f-r-o en find-file-read-only.

+0

Idea inteligente. Invocar accidentalmente la finalización cuando lo que quería era marcar nunca es algo bueno. – phils