重新打开*暂存*缓冲区


25

如果不小心关闭了Emacs中的暂存缓冲区,如何创建新的暂存缓冲区?


请不要仅仅为了回答自己的问题而提出问题,尤其是当这些问题易于回答时。
Edgar Aroutiounian 2014年

8
@EdgarAroutiounian 可以提出并回答您自己的问题!但是,在私人测试期间应避免提出简单的问题:私人测试为网站定下了基调。
吉尔(Gilles)“所以

1
@Gilles当然可以回答您自己的问题,但是当您背对背提出3个问题时,每个问题都在回答问题后立即回答,这确实令人怀疑。
Edgar Aroutiounian 2014年

2
@ EdgarAroutiounian,Jon Ericson希望我们回答简单的AZ问题。欢迎
路加福音2014年

2
我认为这很公平-对于新手来说,暂存缓冲区没有什么特别的地方通常并不明显,并且@Sigma的答案非常简洁。
Mark Aufflick 2014年

Answers:


28

只需切换到缓冲区即可重新创建缓冲区:C-x b *scratch* RET。从Emacs 21.2开始,如果创建一个名为的缓冲区*scratch*,它将自动进入Lisp Interaction模式


为什么需要特殊功能?对我来说,如果我杀死*scratch*它然后再切换回它,它会自动设置为lisp-interaction模式。
Tikhon Jelvis 2014年

@TikhonJelvis啊,的确如此。我具有此功能是因为它在较旧的版本中没有做到这一点(更改是从21.2开始的,从绝对意义上来说,这并不是最近的更改,但比我的大部分更改要晚.emacs)。
吉尔斯(Gillles)“所以-别再作恶了”

是的 Emacs 21.2是在我第一次使用计算机时发布的。那是一个很大的绝对差异;)。
Tikhon Jelvis 2014年

7

可以说,*scratch*每当删除缓冲区时自动重新创建缓冲区,最好避免重新键入其名称。

(defun prepare-scratch-for-kill ()
  (save-excursion
    (set-buffer (get-buffer-create "*scratch*"))
    (add-hook 'kill-buffer-query-functions 'kill-scratch-buffer t)))

(defun kill-scratch-buffer ()
  (let (kill-buffer-query-functions)
    (kill-buffer (current-buffer)))
  ;; no way, *scratch* shall live
  (prepare-scratch-for-kill)
  ;; Since we "killed" it, don't let caller try too
  nil)

(prepare-scratch-for-kill)

3

GNU Emacs的默认绑定:

C-xb*scratch*

或者,更详细地说

  1. M-xswitch-to-buffer
  2. 输入: *scratch*
  3. 然后按一下RET键。

*scratch*缓冲器是在启动时选择的缓冲液中,并具有主要模式Lisp的相互作用。注意:*scratch*缓冲区的模式由变量控制initial-major-mode


通常,您可以根据需要创建任意数量的“临时”缓冲区,并根据您的选择命名。

C-x bNAME

切换到buffer NAME,如果不存在则创建它。除非您使用C-xC-w(或M-xwrite-file)选择应将文件保存到的文件,否则新缓冲区不会与磁盘上的文件关联。


M-xtext-mode 将当前缓冲区的主模式更改为文本模式。

要查找所有可用模式(即不需要任何新软件包),可以通过键入以下内容获取列表:

  1. M-xapropos-command
  2. 然后输入: -mode$
  3. 然后按 RET

2

我喜欢将暂存缓冲区用于一次性物品。尽管只有一个是一个限制,所以我有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


我已经用了六个星期了。太好了,谢谢!但是...昨晚,我的Windows计算机重新启动了。我从暂存缓冲区中丢失了数据,因为M-x recover-session无法恢复这些数据。有没有人修改此使用类似make-temp-file
daveloyall

1

我可以建议创建一个空缓冲区吗?有趣的是,如果确实要创建缓冲区,请先创建缓冲区,然后再保存。

(defun my-empty-buffer () 
  "Open a new empty buffer."
  (interactive)
  (let ((buf (generate-new-buffer "untitled")))
    (switch-to-buffer buf)
    (funcall (and initial-major-mode))
    (setq buffer-offer-save t)))

您必须将init-major-mode设置为lisp到init文件中,并且应将my-empty-buffer绑定到类似的快捷方式C-n

人体工程学提供

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.