如何使Emacs的other-window命令忽略终端窗口?

a p*_*erd 2 emacs

Emacs做一个窗口管理员做得很好.我一直在拆分我的Emacs框架,如下所示:

+---------------------------+
|             |             |
|             |             |
|             |      B      |
|      A      |             |
|             |             |
|             |             |
|             |-------------|
|             |      C      |
+---------------------------+
Run Code Online (Sandbox Code Playgroud)

C通常是一个具有某种长时间运行过程的终端,如Web服务器或守护进程.偶尔我会移动那里重新启动守护进程,但大多数时候我只想在A和之间交换B.我该怎样才能方便?

Tre*_*son 5

没有内置任何你想要的东西.您可以使用以下代码执行您想要的操作(只需自定义正则表达式以匹配您要避免的缓冲区的名称).

注意:my-other-window没有实现所有功能other-window,这是留给读者的练习.

my-other-window将尝试切换到缓冲区不匹配的窗口avoid-window-regexp.如果没有这样的窗口,那么它只是切换到下一个窗口.

(require 'cl)
(defvar avoid-window-regexp "^[0-9]$")
(defun my-other-window ()
  "Similar to 'other-window, only try to avoid windows whose buffers match avoid-window-regexp"
  (interactive)
  (let* ((window-list (delq (selected-window) (window-list)))
         (filtered-window-list (remove-if
                                (lambda (w)
                                  (string-match-p avoid-window-regexp (buffer-name (window-buffer w))))
                                window-list)))
    (if filtered-window-list
        (select-window (car filtered-window-list))
      (and window-list
           (select-window (car window-list))))))
Run Code Online (Sandbox Code Playgroud)

并适当地绑定它:

(global-set-key (kbd "C-x o") 'my-other-window)
Run Code Online (Sandbox Code Playgroud)