ChatGPT解决这个技术问题 Extra ChatGPT

Emacs:在启动时重新打开上次会话的缓冲区?

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

似乎 Emacs 21 和 22+ 中的桌面处理有所不同。此页面上描述了该主题:emacswiki.org/emacs/DeskTop
桌面处理默认路径的另一个变化出现在 24.3 中。 github.com/jwiegley/emacs-release/blob/…

J
Jared Oberhaus

您可以使用 Emacs Desktop library

您可以使用命令 Mx desktop-save 手动保存桌面。您还可以在退出 Emacs 时启用自动保存桌面,并在 Emacs 启动时自动恢复上次保存的桌面:使用自定义缓冲区(请参阅简易自定义)将 desktop-save-mode 设置为 t 以供将来的会话使用,或添加~/.emacs 文件中的这一行:(desktop-save-mode 1)


很好的答案。但是,我注意到 Emacs 会重新排列会话之间的缓冲区顺序。有没有办法总是有相同的缓冲顺序?
如果有人在让它工作时遇到问题(就像我一样),这里有一种诊断问题的技术:通过 M-: 执行 (setq debug-on-error t) 打开调试,然后调用 desktop-revert,它可能会在调试器中捕获有问题的错误。对我来说,全局设置应该是本地缓冲区,导致帧恢复失败。 (仅使用 emacs --debug-init 也可能会遇到问题,但我使用的是前一种方法。)
如果您像我一样想知道:手动恢复由 Mx desktop-read 触发
d
dat

虽然我怀疑这个问题是在寻找 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.

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


s
sadesyllas

用于存储/恢复缓冲区/选项卡(特别是 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 已经提供的 user-emacs-directory 替换 emacs-configuration-directory 只是一个小问题。
p
phils

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

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

wiki 还提供了有关在会话之间保存数据的有用信息:

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

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


y
yPhil

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

编辑此命令不是交互式的;要对其进行测试,您必须评估表达式,例如将光标定位在最后一个括号之后并点击 Cx Ce

否决这个并不酷;这个命令肯定有效,并且在问题的范围内。


我没有投反对票,但也许你的回答被否决了,因为它没有解决如何专门打开在上一个 Emacs 会话中打开的缓冲区的问题。
否决了,因为它与原始 Q 无关。