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

时间:2011-02-09 06:31:43

标签: emacs

Emacs可以成为一名窗口管理员。我一直在拆分我的Emacs框架:

+---------------------------+
|             |             |
|             |             |
|             |      B      |
|      A      |             |
|             |             |
|             |             |
|             |-------------|
|             |      C      |
+---------------------------+

C通常是一个具有某种长时间运行过程的终端,如Web服务器或守护进程。偶尔我会在那里移动重启守护进程,但大部分时间我只想在AB之间进行交换。我怎样才能方便呢?

4 个答案:

答案 0 :(得分: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))))))

并适当地绑定它:

(global-set-key (kbd "C-x o") 'my-other-window)

答案 1 :(得分:0)

不是确切的答案,但是我使用windmove-mode来允许您使用箭头在窗口之间进行视觉移动,然后执行Control-Left或Control-Right以仅在A和B之间移动。

除此之外,您可能可以使用缓冲区列表重新定义其他缓冲区函数,当切换到缓冲区时忽略一些模式,但我没有编写代码。

答案 2 :(得分:0)

这适用于eshell:

(add-hook 'eshell-mode-hook (lambda () (set-window-parameter (first (window-list)) 'no-other-window t)))

将no-other-window设置为non-nil会使标准的other-window函数跳过此状态。查看包含C-h C-f other-window

的其他窗口文档

可能有更好的方法来获取当前窗口,但我还不知道。

答案 3 :(得分:-1)

对于懒惰,我在.emacs

中使用这样的东西
(fset 'doublejump
      "\C-u2\C-xo")
(global-set-key (kbd "C-c o") 'doublejump)

并在使用单缓冲开关和双缓冲开关之间交替使用。