tutorial mac commands emacs

commands - emacs ubuntu



emacs-autocompletar en modo Emacs Lisp (2)

Recientemente descubrí Mx ielm (el Emacs auto-REPL) y me sorprendió gratamente el hecho de que haya una pestaña que funciona en ese modo. Digamos, puedo comenzar a escribir ecb- , luego presionar TAB y ielm me mostrará qué funciones están expuestas por el BCE. Muy conveniente para la exploración!

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

Intenté averiguar cómo funciona la autocompletación dentro de ielm para posiblemente trasplantarla al modo Emacs Lisp. Sin embargo, al parecer, el autocompletado en ielm usa comint-dynamic-complete , que, según tengo entendido, solo funciona en comint basados ​​en comint . Supongo que esto significa que estoy fuera de suerte aquí.

Entonces, bien, ¿cómo habilito el autocompletado para Emacs Lisp?


En las versiones recientes de Emacs, puede usar una pieza de funcionalidad incorporada poco conocida que permite la finalización de TAB:

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

Con esta configuración, TAB , que generalmente está vinculada a indent-for-tab-command , primero intenta ajustar la sangría según la configuración del modo, pero si la sangría ya es correcta, se activa la finalización. Este suele ser el comportamiento deseado, y el IMHO funciona mejor que los complementos de terceros como smart-tab .

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


Encuentro que tanto la sangría como la terminación son útiles a veces, así que tengo una función que elige en función de si lo último que hice fue insertar 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 pueda usar comint-dynamic-complete 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 expandirse incluso hasta find-file-read-only .