emacs - автозаполнение в режиме Emacs Lisp - PullRequest
23 голосов
/ 11 августа 2011

Недавно я обнаружил M-x ielm (самовоспроизведение Emacs) и был приятно удивлен, что в этом режиме есть работающее завершение табуляции.Скажем, я могу начать печатать ecb-, затем нажать TAB, и ielm покажет мне, какие функции предоставляет ECB.Очень удобно для исследования!

Однако, когда я начинаю редактировать один из моих *.el файлов (в основном режиме Emacs Lisp), TAB больше не работает как автозаполнение и выполняет отступы, что я считаю неудачным.

Я попытался выяснить, как работает автозаполнение в ielm, чтобы перевести его в режим Emacs Lisp.Однако, по-видимому, при автозаполнении в ielm используется comint-dynamic-complete, который, насколько я понимаю, работает только в буферах на основе comint.Полагаю, это означает, что мне здесь не повезло.

Итак, как мне включить автозаполнение для Emacs Lisp?

Ответы [ 2 ]

31 голосов
/ 11 августа 2011

В последних версиях Emacs вы можете использовать малоизвестную часть встроенной функциональности, которая обеспечивает выполнение TAB:

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

При этой настройке TAB - которая обычно связана с indent-for-tab-command - сначала пытается отрегулировать отступ в соответствии с настройками режима, но если отступ уже правильный, запускается завершение.Обычно это желаемое поведение, и IMHO работает лучше, чем сторонние плагины, такие как smart-tab .

Обратите внимание, однако, что в некоторых режимах TAB не привязан к indent-for-tab-command, поэтому для этих режимов требуется дальнейшая привязка, например, с smart-tab.Кроме того, когда режимы имеют «отступ» (например, python-mode), этот метод также не будет работать.

2 голосов
/ 11 августа 2011

Иногда мне помогают и отступ, и завершение, поэтому у меня есть функция, которая выбирает в зависимости от того, вставляла ли я последнюю вещь:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...