2013-08-24 54 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之後,它們不見了。