Si j'ai accidentellement fermé le scratch buffer dans Emacs, comment créer un nouveau scratch buffer?
Liaisons par défaut de GNU Emacs:
C-xb
*scratch*
RET
ou, plus verbalement
M-x
switch-to-buffer *scratch*
RET
Le tampon *scratch*
est le tampon sélectionné au démarrage et a le mode majeur interaction LISP . Remarque: le mode pour le tampon *scratch*
est contrôlé par la variable initial-major-mode
.
En général, vous pouvez créer autant de tampons "de travail" que vous le souhaitez et les nommer comme vous le souhaitez.
C-xb
NAME
name__ RET
bascule vers un tampon NAME
name__, le créant s'il n'existe pas. Un nouveau tampon n'est pas associé à un fichier sur le disque jusqu'à ce que vous utilisiez C-xC-w (ou M-x write-file
RET) pour choisir un fichier où il devrait être sauvegardé.
M-x
text-mode
RET
change le mode principal du tampon actuel en mode texte. Pour trouver tous les modes disponibles (c'est-à-dire sans nécessiter de nouveaux packages), vous pouvez obtenir une liste en tapant:
M-x
apropos-command -mode$
RET
J'ajoute ce qui suit dans mes .emacs:
;; bury *scratch* buffer instead of kill it
(defadvice kill-buffer (around kill-buffer-around-advice activate)
(let ((buffer-to-kill (ad-get-arg 0)))
(if (equal buffer-to-kill "*scratch*")
(bury-buffer)
ad-do-it)))
Si je ne veux pas voir scratch buffer j'appuie sur Cx Ck, mais cela ne le tue pas, il suffit de le placer à la fin de la liste des tampons, donc j'en ai besoin la prochaine fois que je n'aurai pas à créer nouveau.
Il y a une foule de conseils sur cette page EmacsWiki .
Voici le premier:
Une fonction très simple pour recréer le tampon de travail:
(defun create-scratch-buffer nil
"create a scratch buffer"
(interactive)
(switch-to-buffer (get-buffer-create "*scratch*"))
(LISP-interaction-mode))
C-x b *scratch*
RET et RET avec iswitchb-mode activé.
Autrement, C-x b *scratch*
RET sinon.
J'ai trouvé cela il y a des années lorsque j'ai commencé à utiliser emacs; Je ne sais pas où maintenant mais il a toujours eu une maison dans mes fichiers personnels .el. Il apparaît dans les recherches Google.
;;; Prevent killing the *scratch* buffer -- source forgotten
;;;----------------------------------------------------------------------
;;; Make the *scratch* buffer behave like "The thing your aunt gave you,
;;; which you don't know what is."
(save-excursion
(set-buffer (get-buffer-create "*scratch*"))
(make-local-variable 'kill-buffer-query-functions)
(add-hook 'kill-buffer-query-functions 'kill-scratch-buffer))
(defun kill-scratch-buffer ()
;; The next line is just in case someone calls this manually
(set-buffer (get-buffer-create "*scratch*"))
;; Kill the current (*scratch*) buffer
(remove-hook 'kill-buffer-query-functions 'kill-scratch-buffer)
(kill-buffer (current-buffer))
;; Make a brand new *scratch* buffer
(set-buffer (get-buffer-create "*scratch*"))
(LISP-interaction-mode)
(make-local-variable 'kill-buffer-query-functions)
(add-hook 'kill-buffer-query-functions 'kill-scratch-buffer)
;; Since we killed it, don't let caller do that.
nil)
;;;----------------------------------------------------------------------
J'ai scratch
comme commande interactive pour ouvrir un nouveau tampon de travail (j'aime en avoir plusieurs):
(defun scratch ()
"create a new scratch buffer to work in. (could be *scratch* - *scratchX*)"
(interactive)
(let ((n 0)
bufname)
(while (progn
(setq bufname (concat "*scratch"
(if (= n 0) "" (int-to-string n))
"*"))
(setq n (1+ n))
(get-buffer bufname)))
(switch-to-buffer (get-buffer-create bufname))
(if (= n 1) initial-major-mode))) ; 1, because n was incremented
J'avais l'habitude d'utiliser la solution de dwj et j'en étais assez heureuse jusqu'au jour où j'ai réalisé qu'elle échouait lorsque vous renommiez le tampon de travail (par exemple en le sauvegardant).
Alors j'ai adopté ceci, qui fonctionne bien pour moi:
(run-with-idle-timer 1 t
'(lambda () (get-buffer-create "*scratch*")))
Notez que le package emacs unkillable-scratch
dans MELPA le fera. Il existe également scratch-persist
qui enregistrera et restaurera automatiquement le tampon entre les sessions.
(global-set-key (kbd "C-x M-z")
'(lambda ()
(interactive)
(switch-to-buffer "*scratch*")))
Cela basculera non seulement rapidement vers le tampon *scratch*
(puisque je le fais fréquemment), mais recréera un tampon *scratch*
et activera automatiquement LISP-interaction-mode
si vous le tuez accidentellement. Changer la liaison comme vous le souhaitez.
C’est ce que j’utilise - je l’ai lié à une frappe pratique. Il vous envoie dans le tampon *scratch*
, qu'il existe déjà ou non, et le configure pour être dans LISP-interaction-mode
(defun eme-goto-scratch ()
"this sends you to the scratch buffer"
(interactive)
(let ((eme-scratch-buffer (get-buffer-create "*scratch*")))
(switch-to-buffer eme-scratch-buffer)
(LISP-interaction-mode)))
Je préfère que mon tampon de travail soit un fichier réel qui est automatiquement enregistré, et sa réouverture est aussi simple que d'ouvrir un fichier. Au démarrage, je tue le défaut et trouve le mien comme celui-ci.
(add-hook 'emacs-startup-hook
(lambda ()
(kill-buffer "*scratch*")
(find-file "/Users/HOME/Desktop/.scratch")))
J'ai une fonction kill-buffer personnalisée qui fait essentiellement la même chose: rouvre mon fichier sauvegardé personnel et supprime le scratch par défaut if si j'ai tué le dernier tampon visible.
J'ai personnalisé quelques-unes des fonctions desktop.el
pour charger after(kill-buffer "*scratch*")
et (find-file "/Users/HOME/Desktop/.scratch")
, de sorte que le dernier fichier visible sur Emacs existant ne soit pas enterré par le scratch par défaut ou par mon scratch personnalisé lors du lancement d'Emacs.
J'aime utiliser auto-save-buffers-enhanced
, qui enregistre automatiquement toute extension de fichier non spécifiquement exclue:
https://github.com/kentaro/auto-save-buffers-enhanced/blob/master/auto-save-buffers-enhanced.el
(require 'auto-save-buffers-enhanced)
(auto-save-buffers-enhanced t)
(setq auto-save-buffers-enhanced-save-scratch-buffer-to-file-p 1)
(setq auto-save-buffers-enhanced-exclude-regexps '("\\.txt" "\\.el" "\\.tex"))
J'utilise une légère variation de la fonction de @paprika lorsque je veux créer un tampon de visite sans fichier:
(defun lawlist-new-buffer ()
"Create a new buffer -- \*lawlist\*"
(interactive)
(let* (
(n 0)
bufname)
(catch 'done
(while t
(setq bufname (concat "*lawlist"
(if (= n 0) "" (int-to-string n))
"*"))
(setq n (1+ n))
(if (not (get-buffer bufname))
(throw 'done nil)) ))
(switch-to-buffer (get-buffer-create bufname))
(text-mode) ))
J'ai combiné les solutions publiées jusqu'à présent en une seule fonction:
(defun --scratch-buffer(&optional reset)
"Get the *scratch* buffer object.
Make new scratch buffer unless it exists.
If RESET is non-nil arrange it that it can't be killed."
(let ((R (get-buffer "*scratch*")))
(unless R
(message "Creating new *scratch* buffer")
(setq R (get-buffer-create "*scratch*") reset t))
(when reset
(save-excursion
(set-buffer R)
(LISP-interaction-mode)
(make-local-variable 'kill-buffer-query-functions)
(add-hook 'kill-buffer-query-functions '(lambda()(bury-buffer) nil)
)))
R))
Pour appliquer cette fonction dans votre .emacs use:
(--scratch-buffer t)
(run-with-idle-timer 3 t '--scratch-buffer)
Cela rendra le tampon d'effacement indestructible en premier lieu et, s'il est enregistré, il sera recréé. De plus, nous pouvons utiliser une fonction de raccourci scratch
pour afficher rapidement le tampon:
(defun scratch()
"Switch to *scratch*. With prefix-arg delete its contents."
(interactive)
(switch-to-buffer (--scratch-buffer))
(if current-prefix-arg
(delete-region (point-min) (point-max))
(goto-char (point-max))))
Dans le passé, il était utile de connaître le répertoire de démarrage d'origine à partir duquel Emacs a été démarré. Il s’agit de la valeur de desktop-dirname
ou de la variable locale default-directory
du tampon de travail:
(defvar --scratch-directory
(save-excursion (set-buffer "*scratch*") default-directory)
"The `default-directory' local variable of the *scratch* buffer.")
(defconst --no-desktop (member "--no-desktop" command-line-args)
"True when no desktop file is loaded (--no-desktop command-line switch set).")
(defun --startup-directory ()
"Return directory from which Emacs was started: `desktop-dirname' or the `--scratch-directory'.
Note also `default-minibuffer-frame'."
(if (and (not --no-desktop) desktop-dirname)
desktop-dirname
--scratch-directory))
So --startup-directory retournera toujours le répertoire de base de votre makefile, fichier TODO, etc. S'il n'y a pas de bureau ( --no-desktop commandline-switch ou pas de fichier desktop) la variable --scratch-directory
contiendra le répertoire dans lequel Emacs a déjà été démarré.
Comme le dit la docstring, cette fonction va:
Basculez vers le tampon de travail. Si le tampon n'existe pas, créez-le et écrivez-y le message initial. "
Cela créera un nouveau tampon de travail qui ressemble au tampon de travail initial.
(defun switch-buffer-scratch ()
"Switch to the scratch buffer. If the buffer doesn't exist,
create it and write the initial message into it."
(interactive)
(let* ((scratch-buffer-name "*scratch*")
(scratch-buffer (get-buffer scratch-buffer-name)))
(unless scratch-buffer
(setq scratch-buffer (get-buffer-create scratch-buffer-name))
(with-current-buffer scratch-buffer
(LISP-interaction-mode)
(insert initial-scratch-message)))
(switch-to-buffer scratch-buffer)))
(global-set-key "\C-cbs" 'switch-buffer-scratch)
trouver la réponse dans EmacsWiki: http://www.emacswiki.org/emacs/RecreateScratchBuffer
(defun create-scratch-buffer nil
"create a scratch buffer"
(interactive)
(switch-to-buffer (get-buffer-create "*scratch*"))
(LISP-interaction-mode))
Pour ajouter à la réponse acceptée, si vous avez activé le mode OIT (et qu’il se complète automatiquement après C-xb, ne vous laissant donc pas écrire *scratch*
), essayez alors:
C-xbC-b
*scratch*
RET
C-x b C-b *scratch* RET