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

3
我看到了这个代码片段,链接在这里
(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,它会创建1个或多个额外的窗口。除了调整从其他地方得到的方法之外,我从未真正使用过elisp,而这个(希望)简单的更改超出了我的当前理解范围。
我花了一些时间查看ecb信息和emacs手册,但找不到合理的方法来确定是否有恰好两个非ecb窗口打开。
我还尝试在ecb窗口上使用像“bury-buffer”这样的东西,这样我就可以假定它们不会在列表的前面,但这是一个有缺陷的方法。
所以我的问题是,有没有办法修改要使其与ecb配合使用?我假设ecb窗口有一些特殊之处,但我找不到任何我可以访问的东西。
2个回答

3
我也尝试过在ECB窗口上使用"bury-buffer"之类的方法,这样我就可以假设它们不会出现在列表的最前面,但这本来就是一种有缺陷的方法。
有点像黑客技术,但是你可以隐藏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 () "如果你有两个窗口,它会将它们交换。" (interactive) (cond ((not (= (count-non-ecb-windows) 2)) (message "你需要恰好有2个窗口才能执行此操作。")) (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)))))

嗯...这肯定是一个可能性。乍一看,它似乎可以调整我的窗口大小。或者说,即使隐藏了一个(第一个?左边的?)窗口,在显示 ecb 窗口时仍然保持均匀分割,而另一个则会缩小。 - Chris
我已经更新了我的答案,就像我在那里说的一样,我的ECB窗口没有被调整大小,但是新的代码可能更接近你想要的。 - Luke Girvin
太棒了,谢谢!我想也许我们正在使用不同版本的emacs(说实话,我不完全确定我正在使用哪个版本...我在mac上,并按照某些24版本的说明使用brew,除此之外,我无法立即说出)。 - Chris

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”并不总是返回“C-x o”将带我到的窗口,使得它比我最初想象的还要没用。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接