nunca cerrar arañazos

10

Si alguna vez cierro el *scratch*búfer, siempre es un accidente.

Tengo, persistent-scratchasí que es tan fácil como un persistent-scratch-reloadpero sería bueno si no se pudiera matar el rasguño. ¿Cómo puedo hacer eso?

fommil
fuente
1
¿Realmente hace uso de las características proporcionadas por el modo de *scratch*? Si no, si lo usa esencialmente para el código Emacs-Lisp y podría usar el modo Emacs-Lisp con la misma facilidad, considere no usarlo *scratch*para su violín Lisp. Simplemente utilícelo C-x fcon un búfer de archivos que puede guardar o tirar a voluntad.
Dibujó
De manera similar, siempre puede restaurar el scratch simplemente cambiando a " *scratch*Emacs lo creará si no existe" e ingresando al modo de interacción Lisp.
lunaryorn
@Drew sí, sigo volviendo a esta idea a lo largo de los años, por ejemplo, a ~/.emacs.d/scratch.el. Pero simplemente no se siente bien, no sé por qué.
fommil
O simplemente tossa.el, tossb..., en cualquier lugar. Es trivial hacer %m ^tossmarcar todos esos archivos en un búfer Dired, luego Deliminarlos a todos.
Dibujó el
Estoy dando scratch.elotra oportunidad al enfoque. Tal vez si puedo limpiar flycheck sería bueno emacs.stackexchange.com/questions/19506
fommil

Respuestas:

15

Puede (ab-) usar kill-buffer-query-functionspara este propósito:

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

En mi antigua configuración de Emacs, usé esto para proteger un montón de búferes importantes como *Messages*.

Tenga en cuenta que mi función se utiliza bury-bufferpara lograr el efecto de matar un búfer (eliminar el búfer) sin realmente matar el búfer. Emacs cambiará a un búfer diferente, como si hubiera eliminado scratch, pero manténgalo vivo y colóquelo al final de la lista de búfer.

O simplemente

(add-hook 'kill-buffer-query-functions
          (lambda() (not (equal (buffer-name) "*scratch*"))))
Lunaryorn
fuente
Perdóneme cualquier error en el código. Copié y pegué esta respuesta en el móvil.
lunaryorn
¡frio! Por cierto, ¿por qué usas el #? Ya no creo que sea necesario
fommil
3
@fommil Hace que el compilador de bytes advierta si el símbolo no está definido como una función. Aquí no hace ninguna diferencia semántica (pero puede hacerlo cuando se usan lambdas), pero de todos modos debe usarlo para admitir el compilador de bytes.
lunaryorn
2
@fommil Además, creo que es un buen estilo usar la cita de función cuando se refiere a funciones, aunque solo sea para apoyar a los lectores de su código. Aquí está claro que nos referimos a una función, pero en otros lugares puede que no. En estas situaciones, la cita de la función puede proporcionar una pista importante.
lunaryorn
1
Y además: (eq 'foo #' foo) se mantiene. Ambas formas literalmente evalúan el mismo objeto, es decir, el símbolo foo.
lunaryorn
5

Se ha introducido una nueva característica para scratch persistente llamada "recordar"

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
fuente
¡Ordenado! También tenga en cuenta que tiene una variable asociada remember-notes-bury-on-kill(que es tpor defecto). Hace lo que el nombre sugiere, lo que parece bastante relevante para la pregunta original.
Harald Hanche-Olsen
Wow, gracias, esa es una buena característica, ¡seguro!
lunaryorn
esto no funciona para mí, el búfer siempre se llama notes(que se abre al inicio) y no se secuestra *scratch*(lo intenté con y sin escapes al asterisco)
fommil
@fommil Solo curiosidad. ¿Por qué quieres que el rasguño sea ​​persistente? ¿Por qué no usar notas para uso persistente y scratch para uso no persistente?
Talespin_Kit
2

ok, toda esta discusión me ha llevado a volver a un enfoque que he intentado configurar pero @Drew ha reavivado el interés.

Crea un archivo como este en ~/.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

gracias a https://emacs.stackexchange.com/a/19507/5142 por el Local Variables.

Y luego agregue lo siguiente a ~/.emacs.d/init.ella respuesta 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
fuente