【问题标题】:What alternate session managers are available for Emacs?Emacs 可以使用哪些备用会话管理器?
【发布时间】:2010-10-25 06:43:34
【问题描述】:

我已阅读 the page in Emacs wiki,其中包含会话管理器插件列表。但是在尝试了所有这些之后,我仍然对其中任何一个都不满意。

相比之下,the VIM session manager 按名称保存和加载会话,这对我来说是最重要的功能之一。

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

  • 按名称管理会话
  • 保存标签、屏幕、框架等。

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


相关:

【问题讨论】:

  • 如果你能列出你尝试过和不喜欢的那些会有所帮助。
  • +1 Nifle,并且您应该在“emacs wiki 中的页面”上包含一个链接,以便您的读者可以看到您在说什么。相应的 VIM 文档的链接也会有所帮助。
  • 好的。我努力清理这个。问题是,hevalbaranov,您要求人们帮助您,因此您可能会考虑多做一些工作,让他们轻松这样做...
  • @Brian:该死。我很烂。谢谢。

标签: session emacs


【解决方案1】:

试试 Emacs 桌面。 Go here

【讨论】:

  • 我已经尝试过 desktop.el(我说过 4 次),它不支持按名称保存会话。
  • 你说你在哪里使用了 desktop.el?
  • "我尝试了所有在 wiki 中编写的用于 emacs 的 sessionmanager 插件,但我发现其中最有用的插件不保存帧,不使用会话名称,而且它们都具有坏名声。”
【解决方案2】:

已经回答:

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

编辑

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

来自Saving Emacs Sessions章节:

您可以保存当前桌面和 重新加载保存在另一个目录中的文件 通过输入M-x desktop-change-dir.

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

编辑 2

Elisp code snippet sent by scottfrazer 允许您为会话命名,因为它在后台将名称转换为桌面模式的正确目录名称。

【讨论】:

  • 我已经尝试过 desktop.el(我说过 4 次),它不支持按名称保存会话。
  • @Török Gábor:他声称已经尝试过其中的选择列表,并要求一个非常特殊的功能。问题的表述是边缘化的,语气是被动攻击性的,但问题似乎是独一无二的。
  • @dmckee:是的,对我的回答的评论澄清了这一点,这就是为什么我试图指出 Emacs Desktop 处理多个会话,它只是不按名称而是按目录分隔它们。跨度>
  • 可能值得注意的是 desktop-path 默认值在 24.3 中发生了变化,导致与旧文档混淆。 emacswiki.org/emacs/DesktopMultipleSaveFiles
【解决方案3】:

由于您不喜欢 desktop.el 的基本功能,请在其周围添加一些省略号:

(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))

编辑

获得一些选票,所以添加一些细节,比如完成阅读和历史记录

【讨论】:

  • 谢谢,我一直在寻找这样的东西,这是完美的。对于像我这样的 emacs 菜鸟来说,这真是太棒了。
  • @Ibrahim:更新让事情变得更好
  • 天才解决方案,有什么是你不能用 elisp 做的吗? ;p
  • 我无法检索窗口配置。这个lisp代码是否支持它。
  • 正是我在寻找什么。谢谢你:)
【解决方案4】:

通过添加书签来使用不同的桌面。简单、快速使用 - 敲击一个键,即刻,不同的桌面。如果你愿意,你甚至可以在它们之间循环。

  • 使用 C-x p K(默认)设置desktop bookmark。系统会提示您输入桌面文件位置和要使用的书签名称。

  • 使用 C-x j K(默认)跳转到书签桌面。系统会提示您输入书签名称(完成)。

您需要Bookmark+ 来执行此操作。

【讨论】:

    【解决方案5】:

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

    (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”不会失败,因为它应该。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 2021-03-30
      • 1970-01-01
      • 2011-03-24
      • 2013-06-22
      相关资源
      最近更新 更多