Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何制作Emacs';其他窗口命令忽略终端窗口?_Emacs - Fatal编程技术网

如何制作Emacs';其他窗口命令忽略终端窗口?

如何制作Emacs';其他窗口命令忽略终端窗口?,emacs,Emacs,Emacs作为一个窗口管理器做得很好。我一直在像这样拆分我的Emacs框架: +---------------------------+ | | | | | | | | B | | A | | | | | | | | |

Emacs作为一个窗口管理器做得很好。我一直在像这样拆分我的Emacs框架:

+---------------------------+
|             |             |
|             |             |
|             |      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切换窗口可选择性