如何制作Emacs';其他窗口命令忽略终端窗口?
Emacs作为一个窗口管理器做得很好。我一直在像这样拆分我的Emacs框架:如何制作Emacs';其他窗口命令忽略终端窗口?,emacs,Emacs,Emacs作为一个窗口管理器做得很好。我一直在像这样拆分我的Emacs框架: +---------------------------+ | | | | | | | | B | | A | | | | | | | | |
+---------------------------+
| | |
| | |
| | B |
| A | |
| | |
| | |
| |-------------|
| | C |
+---------------------------+
C
通常是带有某种长时间运行的进程的终端,如web服务器或守护进程。偶尔我会将点移到那里以重新启动守护进程,但大多数时候我只想在A
和B
之间交换。我如何使这变得方便?不是确切的答案,但我使用的是允许您使用箭头在窗口之间视觉移动,然后执行Control Left(向左控制)或Control Right(向右控制)仅在A和B之间移动
除此之外,您可能还可以重新定义其他缓冲区函数,在切换到缓冲区时忽略缓冲区列表中的一些模式,但我没有方便地编写代码。没有内置的功能来执行您想要的操作。您可以使用下面的代码执行您想要的操作(只需自定义正则表达式以匹配您想要避免的缓冲区的名称) 注意:
my other 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)
对于懒惰的人,我在.emacs中使用类似的东西
(fset 'doublejump
"\C-u2\C-xo")
(global-set-key (kbd "C-c o") 'doublejump)
并交替使用单缓冲开关和双缓冲开关。这适用于eshell:
(添加hook'eshell模式hook(lambda()
(设置窗口参数(第一个(窗口列表))'无其他窗口(t)))
将“无其他窗口”设置为非零会使标准的“其他窗口”函数跳过此操作。使用C-h C-f其他窗口查看其他窗口文档
可能有更好的方法来获取当前窗口,但我还不知道。是的,我使用这个,但按一个键而不是记住方向似乎更方便。不过,谢谢!顺便提一下,还有一个窗口编号模式,可能不回答您的问题。ace-window允许快速切换到窗口,就像ace jump允许快速切换到任何窗口中的任何单词一样。有关类似的切换技巧,请参见avy goto line,它也适用于windows。FWIW,仍在定期使用。太棒了。我不知道这是怎么回事,因为它需要你跟踪你在缓冲区中的位置,然后按另一个键。问题的重点(以及懒惰的方式)是忽略@trey jackson在其答案中所做的某些窗口。请参阅有用的函数esc切换窗口可选择性