Почему существует режим lisp-взаимодействия и нужен ли он нам?

20

В: Почему lisp-interaction-modeсуществует, и есть ли причины использовать его вместо emacs-lisp-mode?

В руководстве говорится, что emacs-lisp-modeи lisp-interaction-modeони идентичны, за исключением того, что последний связывается C-jс eval-print-last-sexp. Кроме того, «все остальные команды в режиме Lisp Interaction такие же, как в режиме Emacs Lisp». Насколько я могу судить, только *scratch*буфер использует последний режим.

Мне кажется странным, что существует целый режим, который отличается от другого только одной привязкой клавиш, поэтому я предполагаю, что мне не хватает какой-либо истории или контекста.

Так:

  • Почему lisp-interaction-modeсуществует?
  • Не считая C-jпривязки клавиш, есть ли обстоятельства, при которых это было бы предпочтительнее emacs-lisp-mode?
  • Будут ли какие-нибудь неожиданные последствия для изменения *scratch*режима буфера наemacs-lisp-mode ?

Мотивация для этого вопроса заключается в том, что прямо сейчас я связываю ключи дважды (в двух режимах), чтобы мой *scratch*буфер вел себя как буферы, посещающие *.elфайлы. Если нет практической причины держаться lisp-interaction-mode, я просто (setq initial-major-mode 'emacs-lisp-mode)покончу с этим.

Дэн
источник
1
Может быть, вы перестанете отвечать на все ваши вопросы с помощью « Q: » :)
nicael
Вы можете использовать любой основной режим, который вам нравится *scratch*.
Стефан
3
@nicael: Q: что не нравится в Q ? Вы ранили меня, сэр! ;)
Дан

Ответы:

13

Если вы не ненавидите C-jповедение (и я уверен, что большинство авторов elisp считают его удобным), просто держите вещи такими, какие они есть.

Определите ваши ключи для lisp-mode-shared-mapвместо того, чтобы дублировать их для конкретных режимов клавиатуры.

Все lisp-mode-map, emacs-lisp-mode-mapи lisp-interaction-mode-mapимеют в lisp-mode-shared-mapкачестве родителя раскладки клавиатуры.

Phils
источник
15

Новый производный режим дешев: он lisp-interaction-modeнаследуется emacs-lisp-mode, его реализация - всего дюжина строк кода или около того. Он отличается emacs-lisp-modeтолько следующими способами:

  • у него другое имя;
  • у него другая раскладка клавиш;
  • у него другая таблица синтаксиса;
  • у него есть дополнительный крюк.

С другой стороны, он делится своей таблицей сокращений с emacs-lisp-mode.

Edit: как отметило @phils в своем ответе (которые видят), то раскладка из emacs-lisp-modeи lisp-interaction-modeразделяет общий предок, lisp-mode-shared-map. Поэтому нет причин дублировать сочетания клавиш - просто определите их lisp-mode-shared-map, и они будут применяться к обоим режимам (и lisp-modeтоже, но это, вероятно, хорошо).

Будут ли какие-нибудь неожиданные последствия для изменения *scratch*режима буфера на emacs-lisp-mode?

Наиболее очевидным последствием будет то, lisp-interaction-mode-hookчто больше не будет выполняться в *scratch*буфере.

JCH
источник
3
У него есть дополнительный крючок. emacs-lisp-mode-hookработает lisp-interaction-modeпотому, что так работают производные режимы . У него есть другая таблица ключей, но оба режима elisp используют одну и ту же родительскую таблицу ключей ( lisp-mode-shared-map). У него есть отдельная таблица синтаксиса, но она идентична таблице родительского режима (потому что она зависит от родительского режима при настройке).
phils
Черт, ты прав. Надеюсь исправить сейчас.
2011 года
4

FWIW, я использую emacs-lisp-modeв *scratch*буфере сам. Если я хочу что-то оценить, я просто делаю C-x C-eс C-uпрефиксом, когда это необходимо. Я не вижу недостатков в этой практике.

Относительно того, почему этот режим существует, это всего лишь несколько строк кода на языке LISP elisp-mode.el, и он был там как всегда , поэтому удаление его кажется бессмысленным.

Харальд Ханче-Олсен
источник
Я начал делать это сам давным-давно, потому что хотел быть C-jсвязанным newline-and-indent, но в наши дни, когда отступы происходят более автоматически, это больше не является серьезной проблемой. Так что, если бы я еще не сделал это изменение давно, я бы не стал беспокоиться об этом сейчас.
Харальд Ханче-Олсен
Я тоже, для чего это стоит - сделали это в течение длительного времени. Или я использую одноразовый *.elфайловый буфер.
Дрю