Emacs - автозаполнение в режиме Emacs Lisp
Недавно я обнаружил M-x ielm
(Emacs self-REPL) и был приятно удивлен тем, что в этом режиме есть рабочая вкладка. Скажем, я могу начать набирать ecb-
, а затем нажать TAB, а ielm
покажет мне, какие функции выставлены ECB. Очень удобно для разведки!
Однако, когда я начинаю редактировать один из моих файлов *.el
(в главном режиме Emacs Lisp), TAB больше не работает как автозаполнение и выполняет отступы, которые я нахожу неудачными.
Я попытался выяснить, как автозаполнение работает внутри ielm
, чтобы перевести его в режим Emacs Lisp. Однако, по-видимому, автозаполнение в ielm
использует comint-dynamic-complete
, которое, насколько я понимаю, работает только в буферах на основе comint
. Наверное, это означает, что мне здесь не повезло.
Итак, как мне включить автозаполнение для Emacs Lisp?
Ответы
Ответ 1
В последних версиях Emacs вы можете использовать малоизвестную часть встроенных функций, которая позволяет завершить TAB:
(setq tab-always-indent 'complete)
(add-to-list 'completion-styles 'initials t)
С помощью этой настройки TAB
, которая обычно привязана к indent-for-tab-command
, сначала пытается отрегулировать отступ в соответствии с настройками режима, но если отступ уже прав, завершение завершается. Обычно это желаемое поведение, и IMHO работает лучше, чем сторонние плагины, такие как смарт-вкладка.
Обратите внимание, однако, что в некоторых режимах TAB
не привязан к indent-for-tab-command
, поэтому для этих режимов требуется дополнительное повторное связывание. с smart-tab
. Кроме того, когда режимы имеют "отскок отступа" (например, python-mode
), этот метод также не будет работать.
Ответ 2
Я иногда нахожу как отступы, так и завершение полезными, поэтому у меня есть функция, которая выбирает на основе того, было ли последнее, что я делал, вставлять текст или нет:
(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)))
Вы можете использовать comint-dynamic-complete
вместо dabbrev
, если хотите, но я считаю, что dabbrev
отлично работает для emacs lisp - особенно в сочетании с completer.el
, который может расширить даже f-f-r-o
в find-file-read-only
.