Emacs:在启动时从上一个会话重新打开缓冲区吗?


89

每天我启动emacs并打开与前一天完全相同的文件。有什么我可以添加到init.el文件中的文件,它可以重新打开我上次退出emacs时使用的所有缓冲区吗?


似乎在Emacs 21和22+中,桌面处理有所不同。本页中描述了该主题:emacswiki.org/emacs/DeskTop
2009年

桌面处理默认路径的另一项更改是24.3。github.com/jwiegley/emacs-release/blob/…–
食虫性的,

Answers:


116

您可以使用Emacs Desktop库

您可以使用命令Mx desktop-save手动保存桌面。您还可以在退出Emacs时启用桌面的自动保存,并在Emacs启动时自动恢复上次保存的桌面:使用Customization缓冲区(请参阅Easy Customization)将桌面保存模式设置为t,以进行以后的会话,或添加〜/ .emacs文件中的这一行:

 (desktop-save-mode 1)

5
好答案。但是,我注意到Emacs重新安排了会话之间的缓冲区顺序。有什么办法可以使缓冲区顺序始终相同吗?
axel22

如果有人遇到问题(像我一样),这是一种诊断问题的技术:通过M-:执行打开调试(setq debug-on-error t),然后调用desktop-revert,它可能会在调试器中捕获到令人讨厌的错误。对我来说,全局设置应该是局部缓冲区,导致帧恢复失败。(只是使用emacs --debug-init也可能会遇到问题,但我使用了以前的方法。)
robenkleene

10

尽管我怀疑问题是在寻找emacs的“桌面”功能(请参阅上面的答案),但如果一个使用的文件集确实是完全相同的文件集,则Lewap的方法可能会很有用。实际上,如果一个人具有一组经常使用的文件,则可以走得更远并定义“配置文件” ...快速示例:

(let ((profile 
       (read-from-minibuffer "Choose a profile (acad,dist,lisp,comp,rpg): ")
       ))
  (cond
   ((string-match "acad" profile) 
    (dired "/home/thomp/acad")
    (dired "/home/thomp/acad/papers")
    )
   ((string-match "lisp" profile)
    (setup-slime)
    (lisp-miscellany)
    (open-lisp-dirs)
    )
   ((string-match "rpg" profile)
    (find-file "/home/thomp/comp/lisp/rp-geneval/README")
    (dired "/home/thomp/comp/lisp/rp-geneval/rp-geneval")
... etc.

如果发现在工作时定期在不同的一组常规使用的文件之间来回切换,请考虑使用透视图,并用所需的一组常规使用的文件填充每个透视图。


6

用于存储/恢​​复缓冲区/选项卡(特别是elscreen选项卡):我使用elscreen以及管理存储/恢复桌面会话的方式,而elscreen选项卡配置是.emacs文件中的以下代码(使用的名称不言自明)如果不应在每次emacs启动时都执行存储/恢复功能,只需用“(push#'elscreen-store kill-emacs-hook)”和“(elscreen-restore)”)注释掉行:

(defvar emacs-configuration-directory
    "~/.emacs.d/"
    "The directory where the emacs configuration files are stored.")

(defvar elscreen-tab-configuration-store-filename
    (concat emacs-configuration-directory ".elscreen")
    "The file where the elscreen tab configuration is stored.")

(defun elscreen-store ()
    "Store the elscreen tab configuration."
    (interactive)
    (if (desktop-save emacs-configuration-directory)
        (with-temp-file elscreen-tab-configuration-store-filename
            (insert (prin1-to-string (elscreen-get-screen-to-name-alist))))))
(push #'elscreen-store kill-emacs-hook)
(defun elscreen-restore ()
    "Restore the elscreen tab configuration."
    (interactive)
    (if (desktop-read)
        (let ((screens (reverse
                        (read
                         (with-temp-buffer
                          (insert-file-contents elscreen-tab-configuration-store-filename)
                          (buffer-string))))))
            (while screens
                (setq screen (car (car screens)))
                (setq buffers (split-string (cdr (car screens)) ":"))
                (if (eq screen 0)
                    (switch-to-buffer (car buffers))
                    (elscreen-find-and-goto-by-buffer (car buffers) t t))
                (while (cdr buffers)
                    (switch-to-buffer-other-window (car (cdr buffers)))
                    (setq buffers (cdr buffers)))
                (setq screens (cdr screens))))))
(elscreen-restore)

对于任何想走这条路的人,您只需替换一下即可,Emacs已经提供emacs-configuration-directoryuser-emacs-directory这一点。

2

您可以对基本桌面功能进行一些有用的增强。特别方便的(IMO)是在会话期间自动保存桌面的方法,否则,如果您的系统崩溃,则将被您启动该会话时所用的桌面文件所困扰-如果您倾向于让Emacs连续运行许多次,这将非常烦人一次的天数。

http://www.emacswiki.org/emacs/DeskTop

Wiki还具有有关在会话之间持久保存数据的有用信息:

http://www.emacswiki.org/emacs/SessionManagement

特别是对于台式机,我认为Desktop Recover看起来特别有前途,但是我还没有尝试过。


-2

(find-file-noselect "/my/file")将以无提示方式打开它,即不增加缓冲区。只是说。

编辑此命令不是交互式的;要测试它,您必须对表达式求值,例如,将光标放在最后一个括号之后,然后按Cx Ce

对此进行投票并不酷 ; 此命令肯定有效,并且在问题范围内。


2
我没有拒绝投票,但也许您的回答被拒绝了,因为它没有解决如何专门打开在上一个Emacs会话中打开的缓冲区的问题。
瑞安·汤普森

1
downvoted因为它无关,与原来的Q.
RichieHH
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.