我希望C-x o(下一窗口)命令不仅包括当前框架中的窗口,还要包括其他框架中的窗口。
有人知道如何实现这个功能吗?是否应该使用另一个命令?是否有一些elisp魔法小片段可以轻松完成此操作?
C-x o
是 other-window
,用于在窗口之间切换。要跳转到另一个框架,请使用 C-x 5 o
,它是other-frame
。
other-window
有一个参数来控制它如何处理框架。
(global-set-key (kbd "C-x o") (lambda ()
(interactive)
(other-window 1 t)
(let ((nframe (window-frame (selected-window))))
(select-frame-set-input-focus nframe)
(make-frame-visible nframe))))
来自 C-h f next-window
:
(next-window &optional WINDOW MINIBUF ALL-FRAMES) ...
ALL-FRAMES为nil或省略时,表示考虑WINDOW所在框架上的所有窗口,以及由MINIBUF参数指定的迷你缓冲区窗口。如果迷你缓冲区计数,则还要考虑共享该迷你缓冲区的所有框架上的所有窗口。以下非nil值的ALL-FRAMES具有特殊含义:
t表示考虑所有现有框架上的所有窗口。
`visible'表示考虑所有可见框架上的所有窗口。
0(数字零)表示考虑所有可见和图标化框架上的所有窗口。
一个框架表示仅考虑该框架上的所有窗口。
其他任何值都表示仅考虑WINDOW所在框架上的所有窗口。
有点讽刺的是,other-window
也支持这一点,因为它使用了next-window
。不幸的是,我不知道如何交互式地传递非数字参数,但是一个简单的函数应该可以解决问题:
(defun my-other-window (count)
(interactive "p")
(other-window count t))
我使用的是2.0版本的ace-jump-mode。理解它的工作原理只需要大约两分钟,自从2.0版本以来,它允许“跳转”到另一个框架。您可以在三到四个按键中跳转到屏幕上实际可见的任何缓冲区/框架/窗口中的任何字符。这真的很难被超越。
无论如何,这是一个巨大的时间节省器,所以我建议您检查一下,因为它非常方便。
http://www.emacswiki.org/emacs/AceJump
而且还有一个两分钟的视频展示了它的实际操作:"Emacs Rocks! Episode 10: Jumping around"
您必须按下 C-x 5 o C-h 来查看有关处理框架的所有功能。
其中一些功能是 other-frame。
你说:"有没有一种方法可以循环浏览窗口,而不管它们在哪个框架中?这真的是我正在寻找的东西?"
是的,有了Icicles。
你所请求的就是当你使用前缀参数时icicle-select-window
命令所执行的操作。如果你想始终如此,你可以定义自己的命令来执行它而不需要前缀参数:
(defun my-select-window ()
"Select window by name. Windows of all visible frames are candidates."
(interactive)
(let ((current-prefix-arg 1)) (icicle-select-window)))
系统会要求你输入窗口名称。但是如果你只想循环浏览窗口,不希望通过输入部分名称来缩小候选范围,那么只需使用 C-下箭头
即可获取所需的窗口。
(窗口名称是其显示缓冲区的名称,但需要添加后缀[NUMBER]
,以确保名称唯一。例如,如果有两个显示缓冲区*Help*
的窗口,则其中一个窗口将被命名为 *Help*[2]
,以在使用此命令时进行区分。)
C-x b
在同一个窗口中循环缓冲区。通过使用C-x 4 b
,循环缓冲区将出现在“其他”缓冲区中。希望这有所帮助。 - Nicolas Dudebout