Emacs可以成为一名窗口管理员。我一直在拆分我的Emacs框架:
+---------------------------+
| | |
| | |
| | B |
| A | |
| | |
| | |
| |-------------|
| | C |
+---------------------------+
C
通常是一个具有某种长时间运行过程的终端,如Web服务器或守护进程。偶尔我会在那里移动重启守护进程,但大部分时间我只想在A
和B
之间进行交换。我怎样才能方便呢?
答案 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)
并在使用单缓冲开关和双缓冲开关之间交替使用。