【问题标题】:Emacs: Saving and restoring original frame layout (e.g. when working with ediff)Emacs:保存和恢复原始框架布局(例如,使用 ediff 时)
【发布时间】:2017-09-14 07:24:13
【问题描述】:

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

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

我的问题是:

  1. 有什么方法可以自动恢复我原来的布局?'
  2. 更好的是,我怎样才能让ediff-buffersediff 会话使用新的单独框架,并在我退出ediff 会话时自动关闭它?

【问题讨论】:

  • 请用 Emacs 的术语重写问题? Emacs 有一个或多个 frames,每个框架包含一个或多个 windows,每个窗口显示一个缓冲区。您可以通过拆分旧窗口来创建新窗口(例如C-x 2)。您可以使用例如C-x 5 2 创建新框架。起初我以为您只是将“窗格”替换为“框架”,但最后我无法确定,因为您谈到了“将 [将窗格] 垂直拆分为两个窗格”。由于 ediff 提供了一些有关窗口/框架使用的选项,因此提出更精确的问题会有所帮助。
  • 谢谢菲尔斯。我实际上意识到了这种区别,但不小心使用了pane 而不是frame。很抱歉造成混乱。
  • 我更新了帖子。谢谢@phils
  • 我的答案已更新以处理新语义。

标签: emacs


【解决方案1】:

您可以在 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)

【讨论】:

  • 很好的解决方案。次要修复:我认为倒数第二行 (set-window-configuration pre-ediff-window-configuration))) 需要一个额外的右括号。
【解决方案2】:

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

【讨论】:

    【解决方案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 后,它们就消失了。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多