2012-02-07 72 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