如果您不喜欢desktop.el的基本功能,请在其周围添加一些elisp:
(defvar my-desktop-session-dir
(concat (getenv "HOME") "/.emacs.d/desktop-sessions/")
"*Directory to save desktop sessions in")
(defvar my-desktop-session-name-hist nil
"Desktop session name history")
(defun my-desktop-save (&optional name)
"Save desktop with a name."
(interactive)
(unless name
(setq name (my-desktop-get-session-name "Save session as: ")))
(make-directory (concat my-desktop-session-dir name) t)
(desktop-save (concat my-desktop-session-dir name) t))
(defun my-desktop-read (&optional name)
"Read desktop with a name."
(interactive)
(unless name
(setq name (my-desktop-get-session-name "Load session: ")))
(desktop-read (concat my-desktop-session-dir name)))
(defun my-desktop-get-session-name (prompt)
(completing-read prompt (and (file-exists-p my-desktop-session-dir)
(directory-files my-desktop-session-dir))
nil nil nil my-desktop-session-name-hist))
编辑:
得到一些投票,因此添加了类似 completing-read 和 history 的小细节。
已经回答:
详细解释您的要求可以让我们为您提供更具体的解决方案。
编辑
桌面模式允许您拥有多个会话 - 保存的桌面不是基于名称而是基于目录。
您可以保存当前桌面并 通过键入
M-x desktop-change-dir
重新加载另一个目录中保存的桌面。
此外,desktop-path
变量允许您定义要搜索保存的桌面的目录列表。
编辑2
scottfrazer发送的Elisp代码片段允许您命名会话,因为在后台它将名称转换为桌面模式的正确目录名称。
desktop-path
在24.3中的默认值已更改,这可能会导致旧文档的混淆。https://www.emacswiki.org/emacs/DesktopMultipleSaveFiles - pestophagous关于问题的缓冲区/选项卡存储/恢复部分:我使用elscreen,我在我的.emacs文件中使用以下代码来管理存储/恢复桌面会话和elscreen选项卡配置(使用的名称是不言自明的,如果不希望每次启动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 (eq (type-of (desktop-read)) 'symbol)
(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)
编辑:
我将elscreen-restore中的"if (desktop-read)"更改为"if (eq (type-of (desktop-read)) 'symbol)",因为如果emacs被杀死而不是通常的关闭方式,.emacs.desktop.lock文件将不会被删除。因此,如果由于任何原因无法恢复桌面会话,则"(desktop-read)"的返回值是一个"字符串",解释错误,而不是"nil",所以"if"不会像应该的那样失败。