为什么存在lisp-interaction-mode,我们是否需要它?


20

问:为什么lisp-interaction-mode存在,有什么理由代替它使用emacs-lisp-mode

手册指出,emacs-lisp-modelisp-interaction-mode是不同之处在于后者结合相同C-jeval-print-last-sexp。除此之外,“ Lisp交互模式下的所有其他命令与Emacs Lisp模式下的相同。” 据我所知,只有*scratch*缓冲区使用后一种模式。

我感到奇怪的是,有一个整体模式与另一个模式只有一个按键绑定是不同的,所以我想我缺少一些历史或上下文。

所以:

这个问题的动机是,现在,我将键绑定两次(在两种模式下),以便*scratch*缓冲区的行为就像访问*.el文件的缓冲区一样。如果没有实际的理由可以lisp-interaction-mode解决,那么我就(setq initial-major-mode 'emacs-lisp-mode)解决了。


1
也许您将不再在每个问题前加“ Q: ” :)
nicael 2014年

您可以使用喜欢的任何主要模式*scratch*
Stefan

3
@nicael:问:有什么理由不喜欢对Q?先生,你伤了我!;)

Answers:


13

除非您讨厌这种C-j行为(我敢肯定大多数elisp的作者都会发现它很方便),否则请保持现状。

定义您的键,lisp-mode-shared-map而不是为特定于模式的键图复制它们。

所有的lisp-mode-mapemacs-lisp-mode-map以及lisp-interaction-mode-maplisp-mode-shared-map其父键盘映射。


15

一种新的派生模式很便宜:lisp-interaction-mode继承自emacs-lisp-mode,其实现仅需十几行代码。它emacs-lisp-mode仅在以下方面有所不同:

  • 它具有不同的名称;
  • 它具有不同的键盘映射;
  • 它具有不同的语法表;
  • 它有一个额外的钩子。

另一方面,它与共享其缩写表emacs-lisp-mode

编辑:正如@phils在他的答案(请参见)中指出的那样,emacs-lisp-modelisp-interaction-mode共享一个公共父级的键盘映射lisp-mode-shared-map。因此,没有理由重复键绑定-只需在中定义它们lisp-mode-shared-map,它们将适用于两种模式(lisp-mode也可以,但这可能很好)。

*scratch*缓冲区的模式更改为会不会有任何意外的后果emacs-lisp-mode

最明显的结果是lisp-interaction-mode-hook将不再在*scratch*缓冲区中运行。


3
它有一个额外的钩子。之所以emacs-lisp-mode-hook运行,lisp-interaction-mode是因为派生模式是这样工作的。它确实具有不同的键盘映射,但是两种elisp模式共享相同的父键盘映射(lisp-mode-shared-map)。它确实有一个单独的语法表,但是与它的父模式相同(因为它是为父模式设置的)。
菲尔2014年

该死,你是对的。希望现在纠正。
2014年

4

FWIW,我自己emacs-lisp-mode*scratch*缓冲区中使用。如果我想评估某些东西,我只需要在需要时C-x C-e加上一个C-u前缀即可。我认为这种做法没有不利之处。

至于为何模式是存在的,它是在Lisp代码短短的几行elisp-mode.el,它一直在那里像永远,因此,去掉它似乎毫无意义。


我很早以前就开始这样做,因为我想C-j绑定到newline-and-indent,但是现在,随着缩进自动发生,这不再是一个严重的问题。因此,如果我很久以前还没有进行此更改,那么现在我就不会再打扰了。
Harald Hanche-Olsen 2014年

对于我来说,就其价值而言-已经这样做了很长时间。或者,我使用一个一次性*.el文件缓冲区。
德鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.