在典型的Emacs会话中,我通常只打开一个框架,并将其划分为 4 窗口,形成 2x2 网格,其中包含一些特定的缓冲区(文件)每个窗口。
每次我使用ediff-buffers
来比较两个缓冲区时,Emacs会占用我现有的帧,并将其重新分割为两个垂直窗口(我可以通过按顺序按-
来选择hortizontal)。但是,当我退出ediff
会话时,Emacs会不自动恢复我框架中窗口的原始布局。
我的问题是:
ediff-buffers
仅为ediff
会话使用新的单独框架,并在退出ediff
会话时自动关闭它?答案 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后,它们就消失了。