在Emacs中重新打开* scratch *缓冲区?

如果我不小心closures了Emacs中的暂存缓冲区,我该如何创build一个新的暂存缓冲区?

GNU Emacs默认绑定:

Cx b *scratch* RET

或者更详细地说

Mx switch-to-buffer *scratch* RET

*scratch*缓冲区是在启动时select的缓冲区,并具有主要模式Lisp Interaction 。 注意: *scratch*缓冲区的模式由variablesinitial-major-mode

一般来说,您可以根据需要创build尽可能多的“scratch”缓冲区,然后根据您的select命名它们。

Cx b NAME RET

切换到缓冲区NAME ,如果不存在则创build它。 除非使用Cx Cw (或Mx write-file RET )select要保存的文件,否则新的缓冲区不会与磁盘上的文件相关联。

Mx text-mode RET

将当前缓冲区的主要模式更改为文本模式。 要查找所有可用的模式(即不需要任何新软件包),可以通过键入以下命令来获取列表:

Mx apropos-command -mode$ RET

我在.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))) 

如果我不想看到暂存缓冲区,我按Cx Ck,但它不会杀死它,只是放在缓冲区列表的末尾,所以下次我不需要创build新缓冲区。

这个EmacsWiki页面上有一大堆技巧。

这是第一个:

一个非常简单的函数来重新创build暂存缓冲区:

 (defun create-scratch-buffer nil "create a scratch buffer" (interactive) (switch-to-buffer (get-buffer-create "*scratch*")) (lisp-interaction-mode)) 

Cx b *scratch* RET y启用了iswitchb模式的RET。

只是Cx b *scratch*否则。

我在几年前发现我刚开始使用emacs时, 我不知道现在在哪里,但是我的个人.el文件里总是有一个家。 它确实popup在谷歌search。

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

我曾经使用dwj的解决scheme,我很高兴,直到有一天我意识到,当你真的重命名暂存缓冲区(例如通过保存),它失败了。

然后我采纳了这个,对我来说效果很好:

  (run-with-idle-timer 1 t '(lambda () (get-buffer-create "*scratch*"))) 

这是我使用的 – 我有这个绑定到一个方便的击键。 它会将您发送到*scratch*缓冲区,而不pipe它是否已经存在,并将其设置为处于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))) 

scratch作为一个交互式命令来打开一个新的暂存缓冲区(我喜欢有几个):

 (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 

通过从: http : //everything2.com/index.pl?node_id=1038451

我更喜欢让我的暂存缓冲区成为一个自动保存的实际文件,重新打开它就像打开一个文件一样简单。 在启动时,我杀了默认,find我自己的这个。

 (add-hook 'emacs-startup-hook (lambda () (kill-buffer "*scratch*") (find-file "/Users/HOME/Desktop/.scratch"))) 

我有一个自定义的kill-buffer函数,基本上是一样的东西 – 重新打开我的个人抓取保存的文件,并杀死默认的scratch, 如果我杀了最后一个可见的缓冲区。

我定制了几个desktop.el函数来加载(kill-buffer "*scratch*")(find-file "/Users/HOME/Desktop/.scratch")以便在退出Emacs时最后可见的文件不会在启动Emacs时,不会被默认的划痕掩盖,也不会被我自定义的划痕掩盖。

我喜欢使用auto-save-buffers-enhanced ,它会自动保存任何不被明确排除的文件扩展名:

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

当我想创build一个无文件访问缓冲区时,我使用@paprika函数的一个细微变化:

 (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) )) 
 (global-set-key (kbd "Cx Mz") '(lambda () (interactive) (switch-to-buffer "*scratch*"))) 

这不仅会快速切换到*scratch*缓冲区(因为我经常这样做),而且重新创build一个*scratch*缓冲区,并且在意外lisp-interaction-mode自动启用lisp-interaction-mode 。 根据需要更改绑定。

只要注意在MELPA中的emacs包unkillable-scratch将做到这一点。 还有scratch-persist ,会自动保存和恢复会话之间的缓冲区。

就像文档string所说,这个函数将会:

切换到暂存缓冲区。 如果缓冲区不存在,则创build它并将初始消息写入它。“

这将带来一个新的暂存缓冲区,看起来像初始暂存缓冲区。

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

我已经把迄今为止发布的解决scheme结合到一个函数中:

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

要在.emacs中应用此function,请使用:

 (--scratch-buffer t) (run-with-idle-timer 3 t '--scratch-buffer) 

这将使暂存缓冲区不可摧毁,如果保存将被重新创build。 另外我们可以使用一个快捷函数scratch快速调出缓冲区:

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

在过去,已经certificate了知道从哪个Emacs启动的原始启动目录是有用的。 这是scratch-buffer的desktop-dirnamedefault-directory局部variables的值:

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

所以–startup-directory将总是返回你的makefile的基目录,TODO-file等。如果没有桌面( –no-desktop命令行开关或者没有桌面文件),– --scratch-directoryvariables将会保存目录Emacs曾经开始下。

在EmacsWiki中find答案: 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)) 

Cx b然后键入*scratch* ↩︎

以创build一个新的缓冲区,这也是在lisp交互模式。