2012-02-07 26 views
3

我碰到this gist如何在Emacs中列出非ECB窗口?

(defun swap-windows() 
"If you have 2 windows, it swaps them." 
(interactive) 
(cond ((not (= (count-windows) 2)) 
     (message "You need exactly 2 windows to do this.")) 
     (t 
     (let* ((w1 (first (window-list))) 
       (w2 (second (window-list))) 
       (b1 (window-buffer w1)) 
       (b2 (window-buffer w2)) 
       (s1 (window-start w1)) 
       (s2 (window-start w2))) 
      (set-window-buffer w1 b2) 
      (set-window-buffer w2 b1) 
      (set-window-start w1 s2) 
      (set-window-start w2 s1))))) 

走到今天,其交換緩衝區的內容在兩個窗口,只要恰好有兩個窗口。對我來說問題是我通常有ecb運行,這會創建一個或多個額外的窗口。除了從其他地方獲得的調整方法之外,我從來沒有真正用過elisp做過任何事情,而這個(希望)簡單的改變略高於我目前的理解。

我花了一些時間瀏覽ecb信息和emacs手冊,但找不到合理的方法來確定是否有兩個非ecb窗口打開。

我也嘗試過在ecb窗口中使用'bury-buffer'之類的東西,所以我可以假設它們不會在列表的前面,但這是一個有缺陷的方法。

所以我的問題,有沒有辦法修改的要點,使其與ecb工作?我假設ecb windows有一些特別的東西,但是我找不到任何我可以訪問的東西。

回答

3

我也嘗試過使用像歐洲央行窗口「埋葬緩衝區」,所以我只能假設,他們將不會在列表的前面,但這是開始與一個有缺陷的方法。

一個黑客一點,但你可以隱藏ECB窗口,調用swap-windows,並再次顯示它們,就像這樣:

 
(defun my-swap-windows() 
    (interactive) 
    (ecb-hide-ecb-windows) 
    (swap-windows) 
    (ecb-show-ecb-windows)) 

順便說一句,我不得不添加此行得到要點工作:

 
(require 'cl) 

編輯:我沒有看到改變窗口大小,你所描述的問題,但是卻忽略歐洲央行窗口此代碼應交換非ECB窗口。

 
(require 'cl) 

(defun non-ecb-window-list() 
    (remove-if 
    #'(lambda (window) 
     (find (window-buffer window) (ecb-dedicated-special-buffers))) 
    (window-list))) 

(defun count-non-ecb-windows() 
    (length (non-ecb-window-list))) 

(defun swap-windows() 
"If you have 2 windows, it swaps them." 
(interactive) 
(cond ((not (= (count-non-ecb-windows) 2)) 
     (message "You need exactly 2 windows to do this.")) 
     (t 
     (let* ((w1 (first (non-ecb-window-list))) 
       (w2 (second (non-ecb-window-list))) 
       (b1 (window-buffer w1)) 
       (b2 (window-buffer w2)) 
       (s1 (window-start w1)) 
       (s2 (window-start w2))) 
      (set-window-buffer w1 b2) 
      (set-window-buffer w2 b1) 
      (set-window-start w1 s2) 
      (set-window-start w2 s1))))) 
+0

嗯......肯定的可能性。乍一看,它似乎調整我的窗戶雖然。或者說,即使在隱藏時仍會保持均勻分割,但當ecb窗口再次顯示時,其中一個(第一個?離開?)窗口保持相同寬度,而另一個會縮小。 – Chris 2012-02-08 16:21:30

+0

我已經更新了我的答案,正如我所說,我的ECB窗口沒有被調整大小,但新代碼可能更接近你想要的。 – 2012-02-08 18:36:30

+0

太棒了,謝謝!我想也許我們正在使用不同版本的emacs(說實話,我不完全確定我使用的是什麼版本...我在Mac上,並且在使用brew的某處使用了24條版本說明,除此之外,我不能說脫手)。 – Chris 2012-02-08 19:35:45

1

我會繼續發佈這個答案,因爲我寫了/發現它有一些更多的試驗和錯誤。我所要求的並不是我所接受的答案,但對於其他人閱讀本主題,它有其自身的優點。

(defun swap-windows() 
"Swap two windows." 
(interactive) 
(let* ((w1 (selected-window)) 
    (w2 (next-window)) 
    (b1 (window-buffer w1)) 
    (b2 (window-buffer w2)) 
    (s1 (window-start w1)) 
    (s2 (window-start w2))) 
    (set-window-buffer w1 b2) 
    (set-window-buffer w2 b1) 
    (set-window-start w1 s2) 
    (set-window-start w2 s1))) 

因爲我基本上總是知道什麼是C-X O轉換到,這正是「未來窗」應該返回,這個功能幾乎都是我想要的。然而,它沒有任何形式的錯誤檢查,並沒有真正回答寫下來的問題,只是我表達不好的意圖。

+0

經過一些進一步的實驗後,'下一個窗口'並不總是返回'C-x o'窗口會帶我去的地方,這使得這一點甚至比我一開始就沒想到的有用。 – Chris 2012-02-08 19:40:49