【问题标题】:How do I list non-ECB windows in Emacs?如何在 Emacs 中列出非 ECB 窗口?
【发布时间】:2012-02-09 21:42:39
【问题描述】:

我遇到了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)))))

tod​​ay,只要正好有两个窗口,它就会在两个窗口中交换缓冲区的内容。对我来说,问题是我通常运行 ecb,这会创建 1 个或多个额外的窗口。除了从其他地方获得的调整方法之外,我从来没有真正用 elisp 做过任何事情,而且这个(希望)简单的改变有点超出我目前的理解。

我花了一些时间查看 ecb 信息和 emacs 手册,但找不到合理的方法来确定是否正好打开了两个非 ecb 窗口。

我还尝试在 ecb 窗口上使用“bury-buffer”之类的东西,所以我可以假设它们不会在列表的前面,但这是一种有缺陷的方法。

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

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    我还尝试在 ecb 窗口上使用“bury-buffer”之类的东西,所以我可以假设它们不会在列表的前面,但这是一种有缺陷的方法。

    有点小技巧,但您可以隐藏 ECB 窗口,调用 swap-windows,然后再次显示它们,如下所示:

    (defun my-swap-windows () (交互的) (ecb-隐藏-ecb-windows) (交换窗口) (ecb-show-ecb-windows))

    顺便说一句,我必须添加这一行才能使要点起作用:

    (需要'cl)

    编辑:我没有看到您描述的窗口大小调整问题,但此代码应该在忽略 ECB 窗口的同时交换非 ECB 窗口。

    (需要'cl) (defun 非 ecb-window-list () (删除 - 如果 #'(λ(窗口) (find (window-buffer window) (ecb-dedicated-special-buffers))) (窗口列表))) (defun count-non-ecb-windows () (长度(非 ecb 窗口列表))) (defun 交换窗口 () “如果你有 2 个窗口,它会交换它们。” (交互的) (cond ((not (= (count-non-ecb-windows) 2)) (消息“您需要正好 2 个窗口来执行此操作。”)) (吨 (let* ((w1 (first (non-ecb-window-list)))) (w2(第二个(非 ecb 窗口列表))) (b1 (窗口缓冲区 w1)) (b2 (窗口缓冲区 w2)) (s1 (window-start w1)) (s2 (window-start w2))) (设置窗口缓冲区 w1 b2) (设置窗口缓冲区 w2 b1) (设置窗口开始 w1 s2) (set-window-start w2 s1)))))

    【讨论】:

    • 嗯……肯定有可能。乍一看,它似乎在调整我的窗口大小。或者更确切地说,即使在隐藏时也会保持均匀分割,但是当 ecb 窗口再次显示时,一个(第一个?左?)窗口保持相同的宽度,而另一个缩小。
    • 我已经更新了我的答案,正如我所说,我的 ECB 窗口没有调整大小,但新代码可能更接近你想要的。
    • 太棒了,谢谢!我想也许我们正在使用不同版本的 emacs(老实说,我不完全确定我使用的是什么版本......我在 Mac 上,并在某处使用 brew 遵循了一些 24 个版本的说明,除此之外,我不能直接说)。
    【解决方案2】:

    我会继续发布这个答案,因为我通过更多的试验和错误来编写/发现它。这不是我所要求的,接受的答案是,但对于阅读此主题的其他人来说,它有其自身的优点。

    (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' 应该返回的,所以这个函数几乎总是我想要的。但是,它忽略了任何类型的错误检查,并没有真正回答所写的问题,只是我表达不佳的意图。

    【讨论】:

    • 经过一些进一步的实验,'next-window' 并不总是返回窗口 'C-x o' 会带我去,这使得它比我最初想象的更没用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多