nunca feche riscos

10

Se eu fechar o *scratch*buffer, é sempre um acidente.

Eu tenho, persistent-scratchpor isso é tão fácil quanto um, persistent-scratch-reloadmas seria bom se o arranhão não pudesse ser morto. Como eu posso fazer isso?

fommil
fonte
11
Você realmente usa os recursos fornecidos pelo modo de *scratch*? Caso contrário - se você o usar essencialmente para o código Emacs-Lisp e puder usar o modo Emacs-Lisp com a mesma facilidade, considere não usá-lo *scratch*para suas brincadeiras no Lisp. Basta usar C-x fcom um buffer de arquivo que você pode salvar ou lançar à vontade.
Tirou
De maneira semelhante, você sempre pode restaurar o arranhão mudando para - o *scratch*Emacs o criará se ele não existir - e entrando no Modo de Interação Lisp.
lunaryorn
@ Drew sim, continuo voltando a essa idéia ao longo dos anos, por exemplo, a ~/.emacs.d/scratch.el. Mas simplesmente não parece certo, não sei por quê.
fommil 12/01
Ou apenas tossa.el, tossb..., em qualquer lugar. É trivial fazer %m ^tosspara marcar todos esses arquivos em um buffer Dired e depois Dexcluí-los todos.
Tirou
Estou dando uma scratch.elnova chance à abordagem. Talvez se eu posso limpar flycheck vai ser bom emacs.stackexchange.com/questions/19506
fommil

Respostas:

15

Você pode (ab-) usar kill-buffer-query-functionspara esta finalidade:

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

Na minha configuração antiga do Emacs, usei isso para proteger um monte de buffers importantes *Messages*.

Observe que minha função é usada bury-bufferpara obter o efeito de eliminar um buffer - eliminando o buffer - sem realmente matar o buffer. O Emacs mudará para um buffer diferente, como se você tivesse eliminado o scratch, mas mantenha o scratch vivo e coloque-o no final da lista de buffer.

Ou simplesmente

(add-hook 'kill-buffer-query-functions
          (lambda() (not (equal (buffer-name) "*scratch*"))))
lunaryorn
fonte
Por favor, perdoe-me qualquer erro no código - colei esta resposta juntos no celular.
lunaryorn
legal! BTW, por que você usa o #? Eu não acho que isso é mais necessário
fommil
3
@fommil Faz com que o compilador de bytes avise se o símbolo não está definido como uma função. Não faz nenhuma diferença semanticamente aqui (mas pode ao usar lambdas), mas você deve usá-lo mesmo assim para dar suporte ao compilador de bytes.
lunaryorn
2
@fommil Além disso, acho que é bom estilo usar a citação de função ao se referir a funções, apenas para apoiar os leitores do seu código. Aqui está claro que nos referimos a uma função, mas em outros lugares talvez não. Nessas situações, a cotação da função pode fornecer uma pista importante.
lunaryorn
11
E além do mais: (eq 'foo #' foo) aguenta. Ambas as formas avaliam literalmente o mesmo objeto, ou seja, o símbolo foo.
lunaryorn
5

Um novo recurso foi introduzido para riscos persistentes chamado "lembrar"

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
fonte
Arrumado! Observe também que ele possui uma variável associada remember-notes-bury-on-kill(que é tpor padrão). Ele faz o que o nome sugere - o que parece bastante relevante para a pergunta original.
Harald Hanche-Olsen
Uau, obrigado, esse é um recurso interessante, com certeza!
lunaryorn
isso não funciona para mim, o buffer é sempre chamado notes(que abre na inicialização) e não faz hijack *scratch*(eu tentei com e sem fugas para o asterisco)
fommil
@fommil Apenas curioso. Por que você deseja que o arranhão seja persistente. Por que não usar notas para persistente e zero para uso não persistente?
Talespin_Kit
2

ok, toda essa discussão me levou a voltar para uma abordagem que tentei configurar, mas o @Drew reacendeu o interesse.

Crie um arquivo como este em ~/.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

obrigado a https://emacs.stackexchange.com/a/19507/5142 pelo Local Variables.

E adicione o seguinte ~/.emacs.d/init.elconforme a resposta do @ 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
fonte