Emacs:保存和恢复原始帧布局(例如使用ediff时)

时间:2013-08-24 22:52:40

标签: emacs

在典型的Emacs会话中,我通常只打开一个框架,并将其划分为 4 窗口,形成 2x2 网格,其中包含一些特定的缓冲区(文件)每个窗口。

每次我使用ediff-buffers来比较两个缓冲区时,Emacs会占用我现有的帧,并将其重新分割为两个垂直窗口(我可以通过按顺序按-来选择hortizontal)。但是,当我退出ediff会话时,Emacs会自动恢复我框架中窗口的原始布局。

我的问题是:

  1. 有没有办法自动恢复原来的布局?'
  2. 更好的是,我如何ediff-buffers仅为ediff会话使用新的单独框架,并在退出ediff会话时自动关闭它?

4 个答案:

答案 0 :(得分:5)

在相关说明中(尽管您询问了有关还原窗口配置而不是帧配置): Emacs 24的最新开发快照允许您持久保存和恢复当前的帧集。查看新库frameset.el和更新后的库desktop.el。请注意,目前正在进行此项工作,因此可能会立即发生变化。

答案 1 :(得分:4)

您可以在ediff的入口/出口挂钩上设置功能,以保存/恢复窗口配置,以及创建新帧。这似乎在Emacs 24.3中起到了作用 - 我不明白为什么它在旧版本中不起作用:

(defvar pre-ediff-window-configuration nil
  "window configuration to use")
(defvar new-ediff-frame-to-use nil
  "new frame for ediff to use")
(defun save-my-window-configuration ()
  (interactive)
  (setq pre-ediff-window-configuration (current-window-configuration))
  (select-frame-set-input-focus (setq new-ediff-frame-to-use (new-frame))))
(add-hook 'ediff-before-setup-hook 'save-my-window-configuration)
(defun restore-my-window-configuration ()
  (interactive)
  (when (framep new-ediff-frame-to-use)
    (delete-frame new-ediff-frame-to-use)
    (setq new-ediff-frame-to-use nil))
  (when (window-configuration-p pre-ediff-window-configuration)
    (set-window-configuration pre-ediff-window-configuration)))
(add-hook 'ediff-after-quit-hook-internal 'restore-my-window-configuration)

答案 2 :(得分:2)

请参阅Emacs manual section on registers。您可以将窗口配置保存到寄存器,运行ediff,然后恢复配置。默认绑定是C-x r w R来“写入”寄存器,C-x r j R来“跳转”到寄存器。如果您打算经常使用此功能,可以相应地重新绑定它们。

您还可以编写自己的函数来创建新框架并运行ediff。这将需要一些调整,因为ediff从迷你缓冲区读取文件名,但它应该是直截了当的。

答案 3 :(得分:2)

至少在emacs&gt; = 25中,您可以使用C-x r f <register>框架布局存储到寄存器中。 C-x r j <register>可以恢复它(注意:使用已恢复的框架后,您可能需要C-x 5 0才能退出,而不是正常的C-x C-c。)

当我使用emacsclient连接到长寿的emacs守护程序时,这非常有用。存储的帧布局可以通过守护进程的生命周期。

您也可以使用C-x r w <register>。但是存储的窗口布局只能存在于同一个emacsclient会话中。退出emacsclient后,它们就消失了。