Emacs modifizieren das Quit-Fenster, um den Puffer zu löschen und nicht nur zu vergraben

6

Ich möchte Emacs nicht nur dazu bringen, einen Puffer zu vergraben, sondern ihn auch zu töten, wenn ich qauf einen *Completions*/*Help*/etcPuffer drücke . Ich kann die Funktion zum Definieren von Ersatzschlüsseln nicht zum Laufen bringen. Ich verwende Emacs24 unter OSX.

Folgendes habe ich:

(substitute-key-definition
        'quit-window '(lambda () (interactive) (quit-window "KILL")) global-map)
bneil
quelle
Haben Sie einen besonderen Grund, es auch töten zu wollen?
NN
1
@NN Wenn ich zum Beispiel eine Fertigstellung gesehen habe, muss sie nach dem Verlassen des Fensters nicht mehr geöffnet sein.
bneil

Antworten:

7

Die andere Antwort ergibt tatsächlich ein leicht inkompatibles Verhalten. Stellen Sie sich eine Situation vor, in der Sie bereits einen Frame in zwei Fenster aufgeteilt haben, dann öffnen Sie einen Hilfepuffer und beenden ihn. quit-windowist klug genug zu wissen, dass es nicht das Fenster töten sollte, nur den Puffer. Es hat sogar noch ein paar clevere Tricks im Ärmel, also ist es unsere beste Wette, damit zu arbeiten und es nur ein bisschen zu optimieren. Hier ist ein einfacher Weg, um das zu erreichen, was Sie wollen:

(defadvice quit-window (before quit-window-always-kill)
  "When running `quit-window', always kill the buffer."
  (ad-set-arg 0 t))
(ad-activate 'quit-window)
camdez
quelle
1
Mach das nicht. Eine solche Beratung quit-windowist SCHLECHT, fast so schlimm wie eine Neudefinition. Es wird mehr als wahrscheinlich Erweiterungen und Teile von Emacs beschädigen, wie in [diesem Beispiel] ( github.com/joaotavora/sly/pull/143#issuecomment-361030487 ). Fügen Sie dort zumindest einen called-interactively-pAnruf hinzu.
Joao Tavora
1
Hallo Joao, danke für das Feedback. Obwohl ich die Grundlage Ihres Kommentars zu schätzen weiß, habe ich dies seit mindestens sechs Jahren jeden Tag verwendet und bin nie auf ein Problem gestoßen. Es tut mir leid, dass dies zu einem falschen GitHub-Problem in Ihrem Projekt geführt hat, aber es liegt in der Natur der Sache, die Emacs-Benutzer empfehlen und sogar neu definieren, um ihre Umgebung zu ihrer eigenen zu machen. Angesichts der geringen Risiken zögere ich, dies als "SCHLECHT" zu bezeichnen - auch wenn es sicherlich nicht ideal ist. Ich schätze den Vorschlag, hinzuzufügen called-interactively-p.
Camdez
1
Tut mir leid @camdez, aber Sie können mich nicht davon überzeugen, weil es für Sie funktioniert hat, den Vertrag einer Allzweckfunktion zu brechen, ist keine schlechte Sache und / oder ein Teil der Emacs-Erfahrung. Wenn überhaupt, sind Dinge, die sporadisch brechen, viel schlimmer als Dinge, die häufig und zuverlässig brechen. Emacs bietet mehr als genug Möglichkeiten zur Anpassung, ohne die API zu beschädigen. Die Tatsache, dass viele Menschen die Flexibilität von Lisp missbrauchen, ist eine ganz andere Sache. Ich oder ein anderer Emacs-Betreuer kann Ihnen noch viele weitere Beispiele nennen, bei denen Redefinitionen und andere defadviceAufrufe zu Chaos geführt haben.
Joao Tavora
2

Nur die Funktion neu zu definieren schien für mich also funktioniert zu haben

(defun quit-window () 
 "modified quit window"
 (interactive)
 (kill-buffer-and-window)
 )

Ich habe nie verstanden, warum ein Vervollständigungs- oder Hilfepuffer noch verfügbar ist, wenn Sie den Puffer wechseln, nachdem Sie q gedrückt haben, um ihn zuvor zu beenden.

bneil
quelle