ne ferme jamais les rayures

10

Si je ferme le *scratch*tampon, c'est toujours un accident.

J'ai persistent-scratchdonc c'est aussi simple qu'un persistent-scratch-reloadmais ce serait bien si le scratch ne pouvait pas être tué. Comment puis je faire ça?

fommil
la source
1
Utilisez-vous réellement les fonctionnalités fournies par le mode de *scratch*? Sinon - si vous l'utilisez essentiellement pour le code Emacs-Lisp et que vous pourriez tout aussi facilement utiliser le mode Emacs-Lisp, alors envisagez de ne pas l'utiliser *scratch*pour votre violon Lisp. Il suffit de l'utiliser C-x favec un tampon de fichiers que vous pouvez enregistrer ou lancer à volonté.
Drew
De la même manière, vous pouvez toujours restaurer le scratch en basculant simplement sur *scratch*—Emacs le créera s'il n'existe pas — et en entrant en mode d'interaction Lisp.
lunaryorn
@Drew ouais, je reviens à cette idée au fil des ans, par exemple a ~/.emacs.d/scratch.el. Mais ça ne me semble pas juste, je ne sais pas pourquoi.
fommil
Ou tout simplement tossa.el, tossb..., partout. Il est trivial de %m ^tossmarquer tous ces fichiers dans un tampon Dired, puis Dde les supprimer tous.
Drew
J'essaie à nouveau l' scratch.elapproche. Peut-être que si je peux nettoyer le contrôle de vol, ce sera bien emacs.stackexchange.com/questions/19506
fommil

Réponses:

15

Vous pouvez (ab-) utiliser kill-buffer-query-functionsà cette fin:

(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))

Dans mon ancienne configuration Emacs, je l'ai utilisé pour protéger un tas de tampons importants comme *Messages*.

Notez que ma fonction utilise bury-bufferpour obtenir l'effet de tuer un tampon - en supprimant le tampon - sans réellement tuer le tampon. Emacs passera à un tampon différent comme si vous aviez tué scratch, mais gardez scratch en vie et placez-le simplement à la fin de la liste des tampons.

Ou simplement

(add-hook 'kill-buffer-query-functions
          (lambda() (not (equal (buffer-name) "*scratch*"))))
lunaryorn
la source
Veuillez me pardonner toute erreur dans le code - j'ai copié-collé cette réponse ensemble sur mobile.
lunaryorn
cool! BTW, pourquoi utilisez-vous le #? Je ne pense pas que ce soit plus nécessaire
fommil
3
@fommil Il avertit le compilateur d'octets si le symbole n'est pas défini comme une fonction. Cela ne fait aucune différence sémantiquement ici (mais peut le faire lors de l'utilisation de lambdas) mais vous devez néanmoins l'utiliser pour prendre en charge le compilateur d'octets.
lunaryorn
2
@fommil Aussi, je pense que c'est un bon style d'utiliser la citation de fonction lorsque l'on se réfère à des fonctions, ne serait-ce que pour soutenir les lecteurs de votre code. Ici, il est clair que nous nous référons à une fonction, mais dans d'autres endroits, elle peut ne pas l'être. Dans ces situations, la fonction quote peut fournir un indice important.
lunaryorn
1
Et en plus: (eq 'foo #' foo) tient. Les deux formes évaluent littéralement le même objet, à savoir le symbole foo.
lunaryorn
5

Une nouvelle fonctionnalité a été introduite pour le scratch persistant appelée "Remember"

De 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
la source
Soigné! Notez également qu'il a une variable associée remember-notes-bury-on-kill(qui est tpar défaut). Il fait ce que le nom suggère - ce qui semble tout à fait pertinent pour la question d'origine.
Harald Hanche-Olsen
Wow, merci, c'est une fonctionnalité intéressante, c'est sûr!
lunaryorn
cela ne fonctionne pas pour moi, le tampon est toujours appelé notes(qui s'ouvre au démarrage) et il ne détourne pas *scratch*(j'ai essayé avec et sans échappe à l'astérisque)
fommil
@fommil Juste curieux. Pourquoi voulez-vous que le scratch soit persistant. Pourquoi ne pas utiliser des notes pour persistant et scratch pour une utilisation non persistante?
Talespin_Kit
2

ok, toute cette discussion m'a incité à revenir à une approche que j'ai essayé de configurer, mais @Drew a ravivé un intérêt pour.

Créez un fichier comme celui-ci dans ~/.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

merci à https://emacs.stackexchange.com/a/19507/5142 pour le Local Variables.

Et puis ajoutez ce qui suit ~/.emacs.d/init.elselon la réponse de @ lunaryorn:

;; *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
la source