Подтвердить что ты не робот

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?

4b9b3361

Ответ 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.