2013-08-24 28 views
3

在典型Emacs会话我往往只有一个帧开,我已经它分为窗口与一些特定形成2x2的格每个窗口中的缓冲区(文件)。Emacs的:保存和恢复原始帧布局(例如,用ediff工作时)

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

有了这个我的问题是:

  1. 有什么办法可自动恢复我原来的布局“?
  2. 更妙的是,我怎么能有ediff-buffers使用新的独立的框架只是为ediff会议,并自动关闭它,当我退出ediff会议?
+1

请使用Emacs的术语重新编写问题? Emacs有一个或多个*帧*,每个*帧包含一个或多个*窗口*,每个窗口显示单个缓冲区。您可以通过拆分旧窗口来创建新窗口(例如'C-x 2')。您可以使用例如'C-x 5 2'创建新框架。起初我以为你刚刚用“窗格”代替了“窗格”,但最后我不能确定,就像你提到“垂直将窗格重新分成两个窗格”一样。由于ediff提供了一些围绕窗口/框架使用的选项,有一个更精确的问题将会有所帮助。 – phils

+0

谢谢phils。我实际上意识到了这种区别,但意外地使用了'pane'而不是'frame'。对困惑感到抱歉。 –

+0

我更新了帖子。谢谢@phils –

回答

3

您可以在入口/出口挂钩上设置ediff的功能以保存/恢复窗口配置,以及创建新框架。这似乎这样的伎俩在Emacs 24.3 - 我不明白为什么它会在旧版本不能正常工作:至少在Emacs

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

伟大的解决方案。小修正:我认为第二行'(set-window-configuration pre-ediff-window-configuration)))'需要额外的右括号。 – daveraja

5

与此相关的(虽然你问还原窗口配置,而不是一个框架结构):Emacs的24 最近的发展快照让你持久保存和恢复当前帧的集合。查看新库frameset.el和更新库desktop.el。请注意,这项工作目前正在进行中,因此可能会立即改变。

2

查看Emacs manual section on registers。您可以将窗口配置保存到寄存器,运行ediff,然后恢复配置。默认绑定是C-x r w R来'写'寄存器,C-x r j R'跳'到寄存器。如果您计划频繁使用此功能,则可以相应地重新绑定它们。

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

2

> = 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之后,它们不见了。