我遇到了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有一些特别之处,但我找不到任何可以访问的内容。
答案 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'应该返回的,这个函数几乎总是我想要的。但是,它不会出现任何类型的错误检查,并且没有真正回答所写的问题,只是我表达的意思很差。