Kratzer niemals schließen

10

Wenn ich jemals den *scratch*Puffer schließe, ist es immer ein Unfall.

Ich habe persistent-scratches so einfach wie ein, persistent-scratch-reloadaber es wäre schön, wenn der Kratzer nicht getötet werden könnte. Wie kann ich das machen?

Fommil
quelle
1
Nutzen Sie tatsächlich die Funktionen des Modus von *scratch*? Wenn nicht - wenn Sie es im Wesentlichen für Emacs-Lisp-Code verwenden und genauso gut den Emacs-Lisp-Modus verwenden können, sollten Sie in Betracht ziehen, ihn nicht *scratch*für Ihr Lisp-Geigen zu verwenden. Verwenden C-x fSie einfach einen Dateipuffer, den Sie nach Belieben speichern oder werfen können.
Drew
Auf ähnliche Weise können Sie Scratch jederzeit wiederherstellen, indem Sie einfach zu " *scratch*Emacs erstellt ihn, wenn er nicht vorhanden ist" wechseln und in den Lisp-Interaktionsmodus wechseln.
Mondhorn
@Drew yeah, ich komme im Laufe der Jahre immer wieder auf diese Idee zurück, zB a ~/.emacs.d/scratch.el. Aber es fühlt sich einfach nicht richtig an, ich weiß nicht warum.
am
Oder einfach nur tossa.el, tossb... und überall. Es ist trivial, %m ^tossalle diese Dateien in einem Dired-Puffer zu markieren und dann alle Dzu löschen.
Drew
Ich scratch.elversuche es noch einmal. Vielleicht, wenn ich Flycheck bereinigen kann, wird es nett sein emacs.stackexchange.com/questions/19506
fommil

Antworten:

15

Sie können (ab-) kill-buffer-query-functionsfür diesen Zweck verwenden:

(add-hook 'kill-buffer-query-functions #'my/dont-kill-scratch)
(defun my/dont-kill-scratch ()
  (if (not (equal (buffer-name) "*scratch*"))
      t
    (message "Not allowed to kill %s, burying instead" (buffer-name))
    (bury-buffer)
    nil))

In meiner alten Emacs-Konfiguration habe ich dies verwendet, um eine Reihe wichtiger Puffer wie zu schützen *Messages*.

Beachten Sie, dass meine Funktion verwendet wird bury-buffer, um den Effekt zu erzielen, dass ein Puffer gelöscht wird - indem der Puffer entfernt wird -, ohne den Puffer tatsächlich zu löschen. Emacs wechselt zu einem anderen Puffer, als hätten Sie Scratch getötet, aber halten Sie Scratch am Leben und setzen Sie ihn einfach an das Ende der Pufferliste.

Oder einfach

(add-hook 'kill-buffer-query-functions
          (lambda() (not (equal (buffer-name) "*scratch*"))))
Mondhorn
quelle
Bitte verzeihen Sie mir alle Fehler im Code - ich habe diese Antwort auf dem Handy zusammen kopiert.
Mondhorn
cool! Übrigens, warum benutzt du das #? Ich glaube nicht, dass das mehr gebraucht wird
am
3
@fommil Der Byte-Compiler warnt, wenn das Symbol nicht als Funktion definiert ist. Es macht hier semantisch keinen Unterschied (kann aber bei Verwendung von Lambdas), aber Sie sollten es trotzdem verwenden, um den Byte-Compiler zu unterstützen.
Mondhorn
2
@fommil Ich denke auch, dass es ein guter Stil ist, das Funktionszitat zu verwenden, wenn auf Funktionen verwiesen wird, wenn auch nur, um Leser Ihres Codes zu unterstützen. Hier ist klar, dass wir uns auf eine Funktion beziehen, an anderen Stellen jedoch möglicherweise nicht. In diesen Situationen kann das Funktionszitat einen wichtigen Hinweis liefern.
Mondhorn
1
Und außerdem gilt: (eq 'foo #' foo). Beide Formen bewerten buchstäblich dasselbe Objekt, nämlich das Symbol foo.
Mondhorn
5

Für dauerhaften Scratch wurde eine neue Funktion namens "Merken" eingeführt.

Von https://www.masteringemacs.org/article/whats-new-in-emacs-24-4

The new command ``remember-notes`` creates a buffer which is saved

on ``kill-emacs``.

You may think of it as a \*scratch\* buffer whose content is preserved.

In fact, it was designed as a replacement for \*scratch\* buffer and can

be used that way by setting ``initial-buffer-choice`` to

``remember-notes`` and ``remember-notes-buffer-name`` to “\*scratch\*”.

Without the second change, \*scratch\* buffer will still be there for

notes that do not need to be preserved.
Talespin_Kit
quelle
Ordentlich! Beachten Sie auch, dass der Variable eine Variable zugeordnet ist remember-notes-bury-on-kill( tstandardmäßig). Es macht das, was der Name andeutet - was für die ursprüngliche Frage ziemlich relevant zu sein scheint.
Harald Hanche-Olsen
Wow, danke, das ist sicher eine nette Funktion!
Mondhorn
Das funktioniert bei mir nicht, der Puffer wird immer aufgerufen notes(der beim Start geöffnet wird) und er *scratch*
entführt
@fommil Nur neugierig. Warum soll der Kratzer dauerhaft sein? Warum nicht Notizen für die dauerhafte und Scratch für die nicht dauerhafte Verwendung verwenden?
Talespin_Kit
2

ok, diese ganze Diskussion hat mich veranlasst, zu einem Ansatz zurückzukehren, den ich versucht habe einzurichten, aber @Drew hat ein Interesse wieder geweckt.

Erstellen Sie eine Datei wie diese in ~/.emacs.d/scratch.el

;;; scratch.el --- Emacs Lisp Scratch -*- lexical-binding: t -*-


;; Local Variables:
;; flycheck-disabled-checkers: (emacs-lisp-checkdoc)
;; byte-compile-warnings: (not free-vars unresolved)
;; End:
;;; scratch.el ends here

Vielen Dank an https://emacs.stackexchange.com/a/19507/5142 für die Local Variables.

~/.emacs.d/init.elFügen Sie dann gemäß der Antwort von @ lunaryorn Folgendes hinzu:

;; *scratch* is immortal
(add-hook 'kill-buffer-query-functions
          (lambda () (not (member (buffer-name) '("*scratch*" "scratch.el")))))

(find-file (expand-file-name "scratch.el" user-emacs-directory))
Fommil
quelle