有哪些可用于Emacs的备选会话管理器?

17

我阅读了Emacs维基页面,其中列出了一些会话管理器插件。但是在尝试所有这些插件之后,我仍然对它们不感满意。

相比之下,VIM会话管理器可以按名称保存和加载会话,这对我来说是最重要的功能之一。

特别是,我想要一个Emacs会话管理器:

  • 能够通过名称管理会话
  • 能够保存选项卡、屏幕、框架等等

我试图使用Emacs,因为它具有非常好的功能,但良好的会话管理器对我的工作流程很重要。


相关链接:


5
请列出您尝试过但不喜欢的选项,这将有所帮助。 - Nifle
1
+1 Nifle,你应该在“emacs wiki页面”上包含一个链接,这样你的读者就可以看到你在谈论什么。同时,一个适当的VIM文档链接也会有所帮助。 - dmckee --- ex-moderator kitten
4
好的。我试着把这个整理干净了。问题是,hevalbaranov,你在请求别人帮助你,所以你可能要考虑更多地努力让他们做到这一点变得容易... - dmckee --- ex-moderator kitten
@Brian:该死。我太菜了。谢谢。 - dmckee --- ex-moderator kitten
5个回答

35

如果您不喜欢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 的小细节。


谢谢,我一直在寻找这样的东西,这非常完美。对于像我这样的Emacs新手来说,这太棒了。 - Ibrahim
@Ibrahim:更新以使事情更加美好。 - scottfrazer
天才的解决方案,有什么是用一点elisp做不到的吗?;p - user9903
我无法检索窗口配置。这个Lisp代码支持它吗? - Talespin_Kit
你知道我怎么才能让它也保存ssh文件吗?(我尝试添加(setq desktop-buffers-not-to-save "^ $")但没有起作用) - Euge

5

已经回答:

详细解释您的要求可以让我们为您提供更具体的解决方案。

编辑

桌面模式允许您拥有多个会话 - 保存的桌面不是基于名称而是基于目录。

来自章节Saving Emacs Sessions

您可以保存当前桌面并 通过键入M-x desktop-change-dir重新加载另一个目录中保存的桌面。

此外,desktop-path变量允许您定义要搜索保存的桌面的目录列表。

编辑2

scottfrazer发送的Elisp代码片段允许您命名会话,因为在后台它将名称转换为桌面模式的正确目录名称。


我已经尝试过desktop.el(正如我说了4次),它不支持按名称保存会话。 - sid3k
@Török Gábor:他声称已经尝试了其中的选择列表,并且正在寻求一个非常特定的功能。问题的表述有些边缘化,语气被动攻击,但问题似乎是独一无二的。 - dmckee --- ex-moderator kitten
@dmckee:是的,对我回答的评论进行了澄清,这就是为什么我试图指出Emacs桌面可以处理多个会话,只是没有按名称而是按目录分隔它们。 - viam0Zah
可能值得注意的是,desktop-path 在24.3中的默认值已更改,这可能会导致旧文档的混淆。https://www.emacswiki.org/emacs/DesktopMultipleSaveFiles - pestophagous

2

关于问题的缓冲区/选项卡存储/恢复部分:我使用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"不会像应该的那样失败。


2
使用不同的桌面,通过书签来实现。简单易用——按下一个键就可以切换到另一个桌面。如果你喜欢,甚至可以在它们之间循环切换。
  • 使用C-x p K(默认情况下)设置桌面书签。你需要提供桌面文件位置和要使用的书签名称。

  • 使用C-x j K(默认情况下)跳转到已经书签化的桌面。你需要提供书签名称(带有自动完成功能)。

你需要Bookmark+才能实现这些功能。

0

1
我已经尝试过 desktop.el(就像我说了4次一样),它不支持按名称保存会话。 - sid3k
4
你说你在哪里使用了desktop.el? - Nifle
1
我尝试了维基上编写的所有emacs会话管理器插件,但我发现其中大多数最有用的插件都不能保存框架,不使用会话名称,并且它们的命名都非常糟糕。 - sid3k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接