2011-08-11 7 views
20

Récemment, j'ai découvert M-x ielm (l'Emacs self-REPL) et j'ai été agréablement surpris qu'il y ait un travail de complétion de tabulation dans ce mode. Dites, je peux commencer à taper ecb-, puis appuyez sur TAB et ielm va me montrer quelles sont les fonctions exposées par la BCE. Très pratique pour l'exploration!emacs - autocomplétion en mode Emacs Lisp

Cependant, lorsque je commence à éditer un de mes fichiers *.el (en mode majeur Emacs Lisp), TAB ne fonctionne plus comme saisie semi-automatique et effectue une indentation, ce que je trouve malheureux.

J'ai essayé de comprendre comment l'auto-complétion fonctionne au sein de ielm afin de éventuellement le transplanter en mode Emacs Lisp. Cependant, apparemment, l'auto-complétion dans ielm utilise comint-dynamic-complete, qui, autant que je comprends, ne fonctionne que dans les tampons comint. Je suppose que cela signifie que je n'ai pas de chance ici. Alors, comment puis-je activer l'auto-complétion pour Emacs Lisp?

Répondre

28

Dans les versions récentes d'Emacs, vous pouvez utiliser un morceau peu connu de la fonctionnalité intégrée qui permet la touche de tabulation:

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

Avec cette configuration, TAB - qui est généralement lié à indent-for-tab-command - premiers essais pour ajuster l'indentation en fonction des paramètres du mode, mais si l'indentation est déjà correcte, l'achèvement est déclenché. C'est généralement le comportement souhaité, et à mon humble avis fonctionne mieux que les plugins tiers comme smart-tab.

Notez cependant que dans certains modes, TAB n'est pas lié à indent-for-tab-command, donc une reliure supplémentaire est nécessaire pour ces modes, par ex. avec smart-tab. De même, lorsque les modes ont un "retrait de rebond" (par exemple python-mode), cette technique ne fonctionnera pas non plus.

2

je trouve à la fois indenter et l'achèvement utile parfois, j'ai donc une fonction qui choisit selon que la dernière chose que j'ai insérait texte ou non:

(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))) 

Vous pouvez probablement utiliser comint-dynamic-complete au lieu de dabbrev si vous voulez, mais je trouve que dabbrev fonctionne très bien pour Emacs Lisp - en particulier lorsqu'il est combiné avec completer.el, qui peut même étendre f-f-r-o en find-file-read-only.

+0

Idée intelligente. Invoquer accidentellement l'achèvement lorsque vous vouliez simplement indenter n'est jamais une bonne chose. – phils