non chiudere mai zero


10

Se mai chiudo il *scratch*buffer è sempre un incidente.

Ho persistent-scratchquindi è facile come un persistent-scratch-reloadma sarebbe bello se il graffio non potesse essere ucciso. Come lo posso fare?


1
Utilizzi effettivamente le funzionalità fornite dalla modalità di *scratch*? Altrimenti, se lo usi essenzialmente per il codice Emacs-Lisp e potresti usare altrettanto facilmente la modalità Emacs-Lisp, allora considera di non usarlo *scratch*per il tuo armeggiare con il Lisp. Basta usare C-x fcon un buffer di file che è possibile salvare o lanciare a piacimento.
Drew

In modo simile puoi sempre ripristinare scratch semplicemente passando a *scratch*—Emacs lo creerà se non esiste — e accedendo alla modalità di interazione Lisp.

@Drew sì, continuo a tornare a questa idea nel corso degli anni, ad esempio a ~/.emacs.d/scratch.el. Ma non sembra giusto, non so perché.
fommil

O semplicemente tossa.el, tossb..., ovunque. È banale fare %m ^tossper contrassegnare tutti questi file in un buffer Dired, quindi Deliminarli tutti.
Ha

Sto scratch.elprovando l' approccio con un altro tentativo. Forse se riesco a ripulire il flycheck sarà bello emacs.stackexchange.com/questions/19506
fommil

Risposte:


15

È possibile (ab-) utilizzare kill-buffer-query-functionsa questo scopo:

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

Nella mia vecchia configurazione di Emacs l'ho usato per proteggere un mucchio di buffer importanti come *Messages*.

Si noti che la mia funzione utilizza bury-bufferper ottenere l'effetto di uccidere un buffer — eliminando il buffer — senza effettivamente uccidere il buffer. Emacs passerà a un buffer diverso proprio come se avessi ucciso scratch, ma manterrà lo scratch attivo e lo metterà alla fine dell'elenco buffer.

O semplicemente

(add-hook 'kill-buffer-query-functions
          (lambda() (not (equal (buffer-name) "*scratch*"))))

Ti prego di scusarmi per eventuali errori nel codice: ho incollato e incollato questa risposta sul cellulare.

freddo! A proposito, perché usi il #? Non penso che sia più necessario
fommil

3
@fommil Fa avvisare il compilatore di byte se il simbolo non è definito come una funzione. Non fa alcuna differenza semanticamente qui (ma è possibile quando si utilizza lambdas) ma è comunque necessario utilizzarlo per supportare il compilatore di byte.

2
@fommil Inoltre, penso che sia un buon stile usare la citazione delle funzioni quando ci si riferisce alle funzioni, se non altro per supportare i lettori del proprio codice. Qui è chiaro che ci riferiamo a una funzione, ma in altri luoghi potrebbe non esserlo. In queste situazioni la citazione della funzione può fornire un indizio importante.

1
E inoltre: (eq 'foo #' foo) vale. Entrambe le forme valutano letteralmente lo stesso oggetto, ovvero il simbolo foo.

5

È stata introdotta una nuova funzionalità per scratch persistente denominata "ricordare"

Da 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.

! Neat Si noti inoltre che ha una variabile associata remember-notes-bury-on-kill(che è tper impostazione predefinita). Fa quello che suggerisce il nome, il che sembra abbastanza rilevante per la domanda originale.
Harald Hanche-Olsen,

Wow, grazie, questa è sicuramente una bella caratteristica!

questo non funziona per me, il buffer viene sempre chiamato notes(che si apre all'avvio) e non dirotta *scratch*(ho provato con e senza
escape nell'asterisco

@fommil Solo curioso. Perché vuoi che lo scratch sia persistente. Perché non utilizzare le note per persistente e scratch per l'uso non persistente?
Talespin_Kit

2

ok, tutta questa discussione mi ha spinto a tornare ad un approccio che ho provato a configurare ma @Drew ha riacceso l'interesse per.

Crea un file come questo 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

grazie a https://emacs.stackexchange.com/a/19507/5142 per il Local Variables.

E quindi aggiungere quanto segue alla ~/.emacs.d/init.elrisposta di @ 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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.