2009-09-17 44 views
1

Vim的C-w _有Emacs等價物嗎?這個命令通過儘可能地增加當前窗口的「最大化」(從而縮小所有其他窗口儘可能小)。最大化Emacs窗口而不會讓其他人消失

重要的是,在Vim中,當您將當前窗口放大得太遠時,其他窗口不會消失。相反,當前窗口停止放大,以便其他窗口可以繼續存在。

在Emacs中,當窗口縮小到window-min-height以下時,窗口消失。這很煩人。相反,我希望其他窗口縮小到window-min-height高,然後停止收縮,以便它們不會消失。然後我可以做(enlarge-window 1000)。但我無法弄清楚如何讓這個工作。

如果上述情況不可行,我可以採用其他策略來最大化窗口。

+0

我在標題窗口管理器中,所以我不能測試這個,但是當你將'window-min-height'設置爲0時會發生什麼? – seth 2009-09-17 23:15:09

+0

而通過傾斜我的意思是*平鋪* ...嘆氣。 – seth 2009-09-17 23:29:05

+0

「Windows」是內部Emacs/Vim的東西,而不是窗口管理器管理的窗口。此外,Emacs還可以防止「窗口最小高度」值小於1. – 2009-09-18 00:47:15

回答

1

在我看來,這是一個有點古怪的行爲,但是這應該讓你開始:

編輯:過濾掉其中排隊兩邊,每評論窗口:

(defun maximize-window() 
    (interactive) 
    (let* ((lpos (first (window-edges))) 
     (rpos (third (window-edges))) 
     (in-same-column-p 
      (lambda (w) (or (= lpos (first (window-edges w))) 
          (= rpos (third (window-edges w)))))) 
     (other-windows (remove-if-not in-same-column-p 
             (rest (window-list)))) 
     (other-heights (* (length other-windows) window-min-height)) 
     (my-height (- (frame-height) other-heights))) 
    (setf (window-height) (- my-height 1)))) 
+0

這非常接近,但如果我水平分割窗口,則會計算它不應該顯示的窗口。有沒有一種方法可以計算出當前窗口以上或以下的所有窗口? – 2009-09-18 00:46:01

+0

只需過濾它們。 – 2009-09-18 02:25:40

+0

如果我在底部的全寬窗口上水平分割兩個窗口,並嘗試從右上角的窗口最大化,這仍然不起作用。它殺死了底部窗口。但我想我可以從這裏解決它,謝謝。 – 2009-09-18 18:58:01

0

我不知道你要的答案。

作爲備用工作流程,您是否可以使用打開的緩衝區(switch-to-buffer)(默認綁定爲C-x b),如果您在此刻選中此選項,您將獲得一個可供選擇的列表?

所以我只使用delete-other-windows(默認綁定爲C-x 1),並使用switch-to-buffer返回。

1

這裏是我的投籃在它。對於最多5個窗口的窗口配置,它似乎工作得很好。但是當我有12個(大多數窗口指向相同的緩衝區)時,我感到困惑。因此,它應該爲你工作,除非你有瘋狂的窗口配置:

注:縮小窗口由變量window-min-widthwindow-min-height,這可能比實際最小多個指定的最小尺寸。

(defun my-maximize-current-window() 
    "Maximize the current window" 
    (interactive) 
    (my-shrink-all-but-window-in-tree (get-buffer-window (current-buffer)) (car (window-tree)))) 

(defun my-shrink-all-but-window-in-tree (window tree) 
    (if (windowp tree) 
     (when (eq tree window) tree) 
    (let* ((left (my-shrink-all-but-window-in-tree window (caddr tree))) 
      (right (my-shrink-all-but-window-in-tree window (cadddr tree))) 
      (vertical (car tree)) 
      (found (or left right))) 
     (my-shrink-windows (not vertical) (if right (caddr tree) (cadddr tree))) 
     (select-window window) 
     (when found (cons tree found))))) 

(defun my-shrink-windows (vertical treetoshrink) 
    (if (windowp treetoshrink) 
     (let ((size (if vertical 
         (min 0 (- window-min-width (window-width treetoshrink))) 
        (min 0 (- window-min-height (window-height treetoshrink)))))) 

     (select-window treetoshrink nil) 
     (enlarge-window size 
         vertical)) 
    (my-shrink-windows vertical (caddr treetoshrink)) 
    (my-shrink-windows vertical (cadddr treetoshrink)))) 
+0

該代碼不適用於所有窗口配置b/c,它錯誤地假定該樹只是左/右,而實際上在給定級別上可以有任意數量的窗口窗口樹的。我有另一個版本考慮到這一點,但你不能(容易地)通過縮小窗口來解決這個問題,因爲它們互相竊取,並不總是最終增長你想要的窗口。所以,爲了你的意願而行。我沒有看到簡單的答案。 – 2009-09-18 02:00:26

0

如果有用,一種解決方案是將當前窗口水平和垂直放大大量。

在你~/.emacs

(defun enlarge-window-maximize() 
    (interactive) 
    (enlarge-window-horizontally 10000) 
    (enlarge-window 10000)) 

(global-set-key (kbd "C-x !") 'enlarge-window-maximize) 

使用C-x !使當前窗口大(其它窗口縮小)

繃之間C-x !C-x +工作了很適合我。