如何在Emacs中列出非ECB窗口?

时间:2012-02-07 21:28:27

标签: emacs elisp

我遇到了this gist

(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窗口上使用像'埋葬缓冲区'这样的东西,所以我可以假设它们不会出现在列表的前面,但这是一个有缺陷的方法开始。

所以我的问题是,有没有办法修改要点以使其与ecb一起使用?我假设ecb windows有一些特别之处,但我找不到任何可以访问的内容。

2 个答案:

答案 0 :(得分:3)

  

我也尝试在ecb窗口上使用像'埋葬缓冲区'这样的东西,所以我可以假设它们不会出现在列表的前面,但这是一个有缺陷的方法开始。

有点黑客攻击,但是你可以隐藏ECB窗口,调用swap-windows,再次显示它们,如下所示:

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

顺便说一下,我必须添加这一行才能让要点发挥作用:

(require 'cl)

编辑:我没有看到您描述的窗口调整大小问题,但此代码应该在忽略ECB窗口的同时交换非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)))))

答案 1 :(得分: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将会发生什么,这就是'next-window'应该返回的,这个函数几乎总是我想要的。但是,它不会出现任何类型的错误检查,并且没有真正回答所写的问题,只是我表达的意思很差。