F: Warum gibt lisp-interaction-mode
es und gibt es Gründe, es stattdessen zu verwenden emacs-lisp-mode
?
Die manuelle besagt , dass emacs-lisp-mode
und lisp-interaction-mode
ist identisch mit der Ausnahme , dass die letztere bindet C-j
an eval-print-last-sexp
. Darüber hinaus "sind alle anderen Befehle im Lisp-Interaktionsmodus dieselben wie im Emacs-Lisp-Modus." Soweit ich das beurteilen kann, verwendet nur der *scratch*
Puffer den letzteren Modus.
Es kommt mir seltsam vor, dass es einen ganzen Modus gibt, der sich nur durch eine einzige Tastenkombination von einem anderen unterscheidet, also vermute ich, dass mir entweder eine Geschichte oder ein Kontext fehlt.
So:
- Warum gibt
lisp-interaction-mode
es? C-j
Gibt es Umstände, denen es vorzuziehen wäre, die Tastenkombination nicht mitzurechnenemacs-lisp-mode
?- Gäbe es keine unerwarteten Folgen sein , um den sich kontinuierlich verändernden
*scratch*
Puffers Modusemacs-lisp-mode
?
Die Motivation für diese Frage ist, dass ich momentan zweimal (in den beiden Modi) Schlüssel binde, sodass sich mein *scratch*
Puffer wie Puffer verhält, die *.el
Dateien besuchen . Wenn es keinen praktischen Grund gibt, weiterzumachen lisp-interaction-mode
, bin ich (setq initial-major-mode 'emacs-lisp-mode)
fertig damit.
*scratch*
.Antworten:
Es sei denn, Sie hassen das
C-j
Verhalten (und ich bin sicher, die meisten Elisp-Autoren finden es praktisch), lassen Sie die Dinge einfach so, wie sie sind.Definieren Sie Ihre Schlüssel für,
lisp-mode-shared-map
anstatt sie für die modusspezifischen Keymaps zu duplizieren.Alle
lisp-mode-map
,emacs-lisp-mode-map
undlisp-interaction-mode-map
habenlisp-mode-shared-map
als ihre Eltern keymap.quelle
Ein neuer abgeleiteter Modus ist billig:
lisp-interaction-mode
erbt vonemacs-lisp-mode
, seine Implementierung besteht nur aus etwa einem Dutzend Codezeilen. Es unterscheidet sichemacs-lisp-mode
nur in folgenden Punkten:Andererseits teilt es seine Abkürzungstabelle mit
emacs-lisp-mode
.Edit: wie @phils in seiner Antwort festgestellt ( sd ), die keymaps von
emacs-lisp-mode
undlisp-interaction-mode
einen gemeinsamen Elternteil,lisp-mode-shared-map
. Es gibt daher keinen Grund, Tastenkombinationen zu duplizieren - definieren Sie sie einfach inlisp-mode-shared-map
und sie gelten für beide Modi (undlisp-mode
auch, aber das ist wahrscheinlich in Ordnung).Die naheliegendste Konsequenz wäre, dass
lisp-interaction-mode-hook
nicht mehr im*scratch*
Puffer ausgeführt würde.quelle
emacs-lisp-mode-hook
läuft,lisp-interaction-mode
weil so abgeleitete Modi funktionieren . Es hat zwar eine andere Tastaturbelegung, aber beide elisp-Modi verwenden dieselbe übergeordnete Tastaturbelegung (lisp-mode-shared-map
). Es verfügt zwar über eine separate Syntaxtabelle, ist jedoch mit der des übergeordneten Modus identisch (da die Einstellung beim übergeordneten Modus erfolgt).FWIW benutze ich
emacs-lisp-mode
im*scratch*
Puffer selber. Wenn ich etwas auswerten möchte C-x C-e, mache ich es einfach , C-ubei Bedarf mit einem Präfix. Ich sehe keinen Nachteil dieser Praxis.Was den Grund angeht, warum der Modus vorhanden ist, sind nur ein paar Zeilen Lisp-Code enthalten
elisp-mode.el
, und er ist schon seit Ewigkeiten vorhanden , sodass das Entfernen sinnlos erscheint.quelle
C-j
gebunden sein wolltenewline-and-indent
, aber heutzutage, da das Einrücken mehr automatisch erfolgt, ist dies kein ernstes Problem mehr. Wenn ich diese Änderung also nicht schon vor langer Zeit vorgenommen hätte, würde ich mich jetzt nicht darum kümmern.*.el
Dateipuffer.