5

In a typical Emacs session I often have only one frame open, and I have it divided into 4 windows forming a 2x2 grid with some specific buffers (files) in each window.

Every time I use ediff-buffers to compare two buffers, Emacs takes my existing frame, and re-splits it into two windows vertically (which I can choose to hortizontal by subsequentially pressing -). However, when I quit the ediff session, Emacs does not automatically restore the original layout of windows in my frame.

With this my questions are:

  1. Is there any way to automatically restore my original layout?'
  2. Even better, how can I have ediff-buffers use a new separate frame just for the ediff session and close it automatically when I quit the ediff session?
4

4 回答 4

6

您可以在 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)
于 2013-08-25T05:02:27.700 回答
5

在相关说明中(尽管您询问的是恢复窗口配置而不是框架配置):Emacs 24 的最新开发快照让您可以持续保存和恢复当前的框架集。查看新库frameset.el和更新库desktop.el。请注意,这目前正在处理中,因此可能会立即发生变化。

于 2013-08-25T00:46:23.333 回答
3

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

您还可以编写自己的函数来创建新框架并运行 ediff。这需要一些调整,因为 ediff 从 minibuffer 中读取文件名,但它应该很简单。

于 2013-08-25T02:59:04.267 回答
3

至少在 emacs >= 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 之后,它们就消失了。

于 2017-09-10T22:05:50.637 回答