Warum gibt es den Lisp-Interaktions-Modus und brauchen wir ihn jemals?

20

F: Warum gibt lisp-interaction-modees und gibt es Gründe, es stattdessen zu verwenden emacs-lisp-mode?

Die manuelle besagt , dass emacs-lisp-modeund lisp-interaction-modeist identisch mit der Ausnahme , dass die letztere bindet C-jan 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:

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 *.elDateien besuchen . Wenn es keinen praktischen Grund gibt, weiterzumachen lisp-interaction-mode, bin ich (setq initial-major-mode 'emacs-lisp-mode)fertig damit.

Dan
quelle
1
Vielleicht hörst du auf, deine Fragen mit " Q: "
voranzustellen
Sie können einen beliebigen Hauptmodus verwenden *scratch*.
Stefan
3
@nicael: Q: Was mag man an dem Q nicht ? Sie gewickelt , Sir! ;)
Dan

Antworten:

13

Es sei denn, Sie hassen das C-jVerhalten (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-mapanstatt sie für die modusspezifischen Keymaps zu duplizieren.

Alle lisp-mode-map, emacs-lisp-mode-mapund lisp-interaction-mode-maphaben lisp-mode-shared-mapals ihre Eltern keymap.

Phils
quelle
15

Ein neuer abgeleiteter Modus ist billig: lisp-interaction-modeerbt von emacs-lisp-mode, seine Implementierung besteht nur aus etwa einem Dutzend Codezeilen. Es unterscheidet sich emacs-lisp-modenur in folgenden Punkten:

  • es hat einen anderen Namen;
  • Es hat eine andere Tastaturbelegung.
  • es hat eine andere Syntaxtabelle;
  • Es hat einen zusätzlichen Haken.

Andererseits teilt es seine Abkürzungstabelle mit emacs-lisp-mode.

Edit: wie @phils in seiner Antwort festgestellt ( sd ), die keymaps von emacs-lisp-modeund lisp-interaction-modeeinen gemeinsamen Elternteil, lisp-mode-shared-map. Es gibt daher keinen Grund, Tastenkombinationen zu duplizieren - definieren Sie sie einfach in lisp-mode-shared-mapund sie gelten für beide Modi (und lisp-modeauch, aber das ist wahrscheinlich in Ordnung).

Gäbe es keine unerwarteten Konsequenzen des zu ändernden *scratch*Puffers Modus emacs-lisp-mode?

Die naheliegendste Konsequenz wäre, dass lisp-interaction-mode-hooknicht mehr im *scratch*Puffer ausgeführt würde.

jch
quelle
3
Es hat einen zusätzlichen Haken. emacs-lisp-mode-hookläuft, lisp-interaction-modeweil 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).
Phils
Verdammt, du hast recht. Hoffentlich jetzt richtig.
23.
4

FWIW benutze ich emacs-lisp-modeim *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.

Harald Hanche-Olsen
quelle
Ich habe vor langer Zeit selbst damit begonnen, weil ich daran C-jgebunden sein wollte newline-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.
Harald Hanche-Olsen
Ich auch, für das, was es wert ist - habe es schon lange getan. Oder ich verwende einen Wegwerf- *.elDateipuffer.
Drew