如何在Windows之间快速切换?


Answers:


62

我显然更喜欢使用ace窗口。您可以在可见的窗口和框架之间切换。它在MELPA中,您可以快速安装。剩下要做的唯一事情就是绑定它:

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

或使用较短的和弦,因为切换窗口是一项常见的任务:

(global-set-key (kbd "M-p") 'ace-window)

的总结 ace-window

它是的直接替代品other-window。与后者不同,您不必调用ace-window两次或多次来选择窗口:您可以在一个调用中选择想要的窗口(可能跨多个帧)。

除了切换窗口外,ace-window还可以执行其他操作(删除或交换窗口等),请参阅README


2
这是有趣的。我使用ace-window然后看了看switch-window似乎做大致相同的事情,除了字母更明显。似乎很有趣,我们有两个包。
milkypostman

你是对的。它们之间只有很小的差异。当我们有一个包含2000个软件包的存储库时,我们必须面对这个问题。switch-window直到我提交ace-window给MELPA,我才意识到。
abo-abo

1
谢谢ace-window,它比我猜想的其他软件包具有更多的自定义项。将来可能仍然有帮助的是,该功能的键绑定与智能交换操作类似,但是会占用该窗口,从而导致某个点处的窗口更大而所选窗口的大小更小(窗口)。在这种情况下,该比率应确定为二分之一,四分之一或三分之一。
博士学位

4
请考虑添加说明。您只是说喜欢并且链接到它。这实际上使它成为仅链接的答案。
提请

4
ace窗口有什么好处?为什么要在此页面上提出的其他14个解决方案上使用它?
吉尔斯(Gilles)

103

一种方法是使用windmove。使用其默认的键盘绑定,它可以切换到当前活动窗口旁边的窗口。

它内置在Emacs中,因此不需要安装任何东西。只需使用init文件中的以下最小设置激活它即可:

(windmove-default-keybindings)

然后,您可以切换到使用以下项(其中,直观地使用箭头定义了您移动方向)邻近窗口:S-<left>S-<right>S-<up>S-<down>


如果您希望使用而不是其他修饰符shift,则可以将其作为参数提供windmove-default-keybindings。例如:

(windmove-default-keybindings 'meta)

要么

(windmove-default-keybindings 'control)

有关更多信息,请参见Emacs Wiki


16
这应该是公认的答案!
Rowman

OMG,为什么没有教程提到Shift +箭头键在窗口中移动!它比ctrl + o好得多
Didier A.

我想说这里的其他一些答案包含冗余的windmove配置。也许值得更新答案,以提及该函数接受修饰键作为参数,例如(windmove-default-keybindings 'meta)EmacsWiki上建议的那样。
metaturso

这与其他键绑定(或窗口管理器)产生了很多冲突。我喜欢王牌窗口。
azzamsa

我正在使用类似的东西(我随处移动Shift-arrow,但是当您的显示器较大且有很多裂痕时,这种移动很快就变得笨拙。以某种方式枚举窗口/拆分会更有趣。类似于ace-window,但按键次数较少,并且有明显的算法可以立即找出所需的数字。
Hi-Angel

21

您可以绑定other-window到易于键入的键序列。

例如,我已经C-.绑定到other-window,并且C-,必须转到上一个窗口。

(global-set-key (kbd "C-.") #'other-window)
(global-set-key (kbd "C-,") #'prev-window)

(defun prev-window ()
  (interactive)
  (other-window -1))

这对于移动多个窗口特别有用。按住Control键后,只需按一个按钮即可移至下一个窗口。这比每次移动三个按键要容易得多。


2
+1 C-x ofor other-window是“最差的默认emacs快捷方式”标题的几个可靠竞争者之一。我的解决方案(类似于zck)是将其绑定other window到(更简单的)键序列-我将其绑定到了C-;(并且Caps-Lock交换了Ctrl它,因此只需轻按一下小指即可)。顺便说一句,我完全依赖于某些功能helmicicles(即我不是“反包”或任何东西); 我只是认为一个简单的解决方案在这里效果最好。
iceman 2014年

2
+1这应该是公认的答案,也是最简单的答案(可惜,StEx尚不存在这样的东西)。开箱即用,可完美缩放,易于记忆。我发现后者在Emacs丛林中尤其重要。在那儿生存了20多年后,有时我发现自己渴望潜伏在vi沙漠中……
Andreas Spindler

简单,易用,易于实现。这需要更多的选票。
stewSquared

1
这也是我的工作。我用M-oother-window。有些模式已经有M-o约束力的,尤其是diff-modeggtag-modeibuffer-mode。您必须在每个模式图中手动解除绑定。unbind-key提供的bind-key.el功能非常有用。
Yasushi Shoji

我也使用M-o它,并且在我需要其他功能时已M-O绑定到ace-window
glucas

13

window-numbering.el!

我分配了热键“,1”,“,2”,“,3”来切换特定窗口(请注意,我使用邪恶模式)

此外,我在模式行以粉红色显示带下划线的窗口号。

这是您永远都不会忽略的视觉提示,

这是切换窗口的最快方法

检查https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.elhttps://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .el作为我的设置。

西尔文·本纳(Sylvain Benner)在spacemacs中采用了我的想法,但是键绑定却不同。因此,如果您使用spacemacs,则可以立即获得最快的解决方案。


2
对。这个概念很棒。我使用window-numberwith M-<num>来快速切换黑白窗口。与此相似的概念
unperson325680 2014年

1
需要注意的是窗口numbering.el是有利于winum的弃用,这是在这里。FWIW对我来说,编号窗口根本没有用。
Hi-Angel

我可能很快会切换到winum。但是窗口编号在emacs24 / 25/26上仍然可以正常工作。
陈斌

10

在不使用任何其他附加组件的情况下,您可以继续使用C-x o可选的前缀来跳过那么多窗口。例如:C-u 1 C-x o将按顺序转到下一个窗口(即,使用plain会得到的结果C-x o),C-u 2 C-x o将两个窗口移到上方,C-u 3 C-x o将三个窗口移到上方,依此类推。

other-window文档字符串的摘录(该函数由调用C-x o

COUNT指定在进行选择之前从所选窗口开始要跳过的窗口数。如果COUNT为正,则向前跳过COUNT个窗口。如果COUNT为负数,请向后跳过-COUNT个窗口。COUNT为零表示不跳过任何窗口,因此选择选定的窗口。在交互式呼叫中,COUNT是数字前缀参数。返回零。


当您有多个窗口时,它们遵循什么顺序?
stsquad 2014年

该顺序是循环窗口顺序

2
嗯,“顺序是由帧的窗口树的深度优先遍历确定的,检索作为树的叶子节点的活动窗口”对于尝试猜测哪个窗口是下一窗口还是下一窗口不是最有用的描述。有多少要跳过。我猜这就是为什么我使用ace-window。
stsquad 2014年

2
@stsquad:哦,我同意你的观点,它也使我的头旋转。为了完整起见,我把这个答案放在这里。

8

有些人可能还记得编辑者Brief(足够有趣,由一家名为Underware的公司制作)。

它有一种在可见窗口之间切换的巧妙方法。M箭头将使光标直接按箭头键的方向移入窗口。

所以,我映射winmove-leftwinmove-rightwinmove-upwinmove-down功能M-leftM-rightM-upM-down项,如下所示在我的.emacs文件-

(global-set-key [M-left] 'windmove-left)          ; move to left window
(global-set-key [M-right] 'windmove-right)        ; move to right window
(global-set-key [M-up] 'windmove-up)              ; move to upper window
(global-set-key [M-down] 'windmove-down)          ; move to lower window

现在,无论我的配置多么杂乱,我都可以轻松地在窗口之间移动...而且如今的显示器尺寸可能变得杂乱无章...


这不是@Francesco的答案吗?

我同意。在发布我的消息之前,我没有注意到。
user2542 2014年

2
获得这些键绑定的更短方法是(windmove-default-keybindings 'meta)
奥马尔

8

如果您使用冰柱,C-x o可以按名称(或按循环)选择窗口。

  • 没有前缀arg C-x o的情况与通常相同other-window,除非帧只有一个窗口,在这种情况下为other-frame

  • 带有前缀arg C-x o多命令使您可以按名称(或按循环)在窗口或框架之间导航。在Windows中导航使用多命令 icicle-select-window;在框架之间导航使用icicle-select-frame

使用哪种导航取决于前缀arg:

  • 前缀arg(例如C-0):如果所选框架具有多个窗口,则为 icicle-select-window,其中窗口与候选框架同一框架中。否则(单窗口框架)为icicle-select-frame

  • C-u:如果所选框架具有多个窗口,则为 icicle-select-window,所有可见框架中的窗口均作为候选窗口。否则为icicle-select-frame

  • C-u C-uicicle-select-window所有框架的窗口都可以作为候选窗口(包括图标化或隐藏的框架)。

冰柱一样,您可以结合(a)完成,键入文本以缩小匹配候选集(在这种情况下为窗口或帧名称)的范围,并结合(b)循环(在匹配候选者之间)。


4

考虑使用键盘和弦在窗口之间快速跳转。我发现它比拿到修饰键要快得多(并且也减轻了我的负担)。

我选择使用的软件包是ace-window,它使您可以轻松浏览多个窗口而不仅仅是other-window

(require 'key-chord)
(key-chord-define-global "xo" 'ace-window)
(key-chord-mode +1)

显然,要使用此功能,您需要key-chordace-window,都可以在melpa中使用。


2
这不是@ abo-abo的答案吗?

1
@Dan他不使用和弦,请注意和弦中缺少meta或super键。如果您使用ace-window /其他方式则无关紧要,重点是给出一个答案,该答案在通常使用的操作中不使用修饰键。
Zavior 2014年

1
我看到了,但是我提出了问题,因为ace-window正在像@ abo-abo的答案那样进行工作。令我惊讶的是,在这种情况下,使用特定的键绑定作为注释而不是答案更有意义。只是我的两分钱。

@Dan,总体而言,问题在于是否要快速切换窗口,我认为此解决方案尚未提出。关于这一点,澄清了一些答案。
Zavior 2014年

@Zavior提出了一个重要观点。问题是关于快速切换窗口-绑定的形式非常重要。无论您喜欢哪种库,都key-chord可以绑定非常易于访问的键组合。的示例绑定 xo速度快于C-x o(深度一对二)。可以改写此答案以强调该答案与关于功能选择的其他答案正交(并且ace-window仅仅是可以以所述方式绑定的许多选择之一)。保持这个答案与众不同!
ebpa

3

这里有一些很好的答案,我也是WinMove的粉丝,但我将其绑定到C-,因为org-mode使用M-来操纵标题

(define-key global-map (kbd "C-<up>") 'windmove-up)
(define-key global-map (kbd "C-<down>") 'windmove-down)
(define-key global-map (kbd "C-<left>") 'windmove-left)
(define-key global-map (kbd "C-<right>") 'windmove-right)

如果将它与Hydra结合使用,那么它真正变得不错的地方。按照他们的Wiki上示例,我创建了自己的怪物:

(defhydra hydra-windows ()
  "C-arrow = switch, S-arrow = size, M-arrow = move"
  ("C-<left>" windmove-left nil)
  ("C-<right>" windmove-right nil)
  ("C-<up>" windmove-up nil)
  ("C-<down>" windmove-down nil)
  ("S-<left>" hydra-move-splitter-left nil)
  ("S-<right>" hydra-move-splitter-right  nil)
  ("S-<up>" hydra-move-splitter-up nil)
  ("S-<down>" hydra-move-splitter-down nil)
  ("M-<left>" buf-move-left nil)
  ("M-<right>" buf-move-right nil)
  ("M-<up>" buf-move-up nil)
  ("M-<down>" buf-move-down nil)
  ("p" previous-buffer "prev-buf")
  ("n" next-buffer "next-buf")
  ("1" delete-other-windows "1")
  ("d" delete-window "del")
  ("k" kill-buffer "kill")
  ("s" save-buffer "save")
  ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
  ("r" winner-redo "redo")
  ("b" helm-mini "helm-mini" :exit t)
  ("f" helm-find-files "helm-find" :exit t)
  ("|" (lambda () (interactive) (split-window-right) (windmove-right)))
  ("_" (lambda () (interactive) (split-window-below) (windmove-down)))
  ("q" nil "cancel")
  )

(global-set-key (kbd "M-#") 'hydra-windows/body)

这使我可以更改窗口,调整窗口大小,在窗口之间移动缓冲区,循环缓冲区,终止缓冲区,甚至通过获胜者模式撤消窗口配置,并且还集成了头盔。要退出hydra,只需按箭头或不在hydra中的其他键即可。您可以在hydra示例中找到“ hydra-move”功能。hydra的优点在于,我不必记住所有这些键绑定及其“适度”功能,因此一旦进入hydra,所有功能都可以作为一个键使用按。


1
获得您在一开始提到的键绑定的一种较短方法是(windmove-default-keybindings 'control)
奥马尔

1

如果使用evil-mode,则可以仅使用带有C-w C-wevil-window-next)的数字前缀来选择所需的窗口。因此:1 C-w C-w以循环顺序选择第一个窗口,以循环顺序3 C-w C-w选择第三个窗口,依此类推。


似乎应该将其与您的其他答案结合使用:这是同一回事,只是带有邪恶特定的绑定。
npostavs

1

通过Ace Jump,您可以将指针导航到屏幕上的所有单词,而不管它们位于哪个窗口或框架中,因此与使用Ace Window或Switch Window没什么不同。

一个优点是,在跳窗时,您还可以将指针精确定位。

我仍然觉得它有点麻烦或分散注意力,并且发现我正在使用windmove更多,因为它非常简单,但是当我在另一个窗口或框架中阅读并希望移至该位置时仍使用Ace Jump。



-1

您也可以决定使用开关窗口作为C-x o


1
切换窗口有什么好处?为什么要在此页面上提出的其他14个解决方案上使用它?
吉尔斯(Gilles)

你怎么说?Emacs涉及替代方案,定制和决定的自由。
csantosb

2
那既不是这里也不是那里。为什么有人会选择这种特殊选择?为什么一个人决定使用switch-window所有其他人?
吉尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.