Answers:
我显然更喜欢使用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。
ace-window
然后看了看switch-window
似乎做大致相同的事情,除了字母更明显。似乎很有趣,我们有两个包。
switch-window
直到我提交ace-window
给MELPA,我才意识到。
ace-window
,它比我猜想的其他软件包具有更多的自定义项。将来可能仍然有帮助的是,该功能的键绑定与智能交换操作类似,但是会占用该窗口,从而导致某个点处的窗口更大而所选窗口的大小更小(窗口)。在这种情况下,该比率应确定为二分之一,四分之一或三分之一。
一种方法是使用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。
(windmove-default-keybindings 'meta)
EmacsWiki上建议的那样。
Shift-arrow
),但是当您的显示器较大且有很多裂痕时,这种移动很快就变得笨拙。以某种方式枚举窗口/拆分会更有趣。类似于ace-window
,但按键次数较少,并且有明显的算法可以立即找出所需的数字。
您可以绑定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键后,只需按一个按钮即可移至下一个窗口。这比每次移动三个按键要容易得多。
C-x o
for other-window
是“最差的默认emacs快捷方式”标题的几个可靠竞争者之一。我的解决方案(类似于zck)是将其绑定other window
到(更简单的)键序列-我将其绑定到了C-;
(并且Caps-Lock
交换了Ctrl
它,因此只需轻按一下小指即可)。顺便说一句,我完全依赖于某些功能helm
和icicles
(即我不是“反包”或任何东西); 我只是认为一个简单的解决方案在这里效果最好。
M-o
了other-window
。有些模式已经有M-o
约束力的,尤其是diff-mode
,ggtag-mode
和ibuffer-mode
。您必须在每个模式图中手动解除绑定。unbind-key
提供的bind-key.el
功能非常有用。
M-o
它,并且在我需要其他功能时已M-O
绑定到ace-window
。
window-numbering.el!
我分配了热键“,1”,“,2”,“,3”来切换特定窗口(请注意,我使用邪恶模式)
此外,我在模式行以粉红色显示带下划线的窗口号。
这是您永远都不会忽略的视觉提示,
这是切换窗口的最快方法。
检查https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.el和https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .el作为我的设置。
西尔文·本纳(Sylvain Benner)在spacemacs中采用了我的想法,但是键绑定却不同。因此,如果您使用spacemacs,则可以立即获得最快的解决方案。
window-number
with M-<num>
来快速切换黑白窗口。与此相似的概念
在不使用任何其他附加组件的情况下,您可以继续使用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是数字前缀参数。返回零。
有些人可能还记得编辑者Brief(足够有趣,由一家名为Underware的公司制作)。
它有一种在可见窗口之间切换的巧妙方法。M箭头将使光标直接按箭头键的方向移入窗口。
所以,我映射winmove-left
,winmove-right
,winmove-up
和winmove-down
功能M-left
,M-right
,M-up
和M-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
现在,无论我的配置多么杂乱,我都可以轻松地在窗口之间移动...而且如今的显示器尺寸可能变得杂乱无章...
(windmove-default-keybindings 'meta)
!
如果您使用冰柱,则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-u
:icicle-select-window
,所有框架的窗口都可以作为候选窗口(包括图标化或隐藏的框架)。
与冰柱一样,您可以结合(a)完成,键入文本以缩小匹配候选集(在这种情况下为窗口或帧名称)的范围,并结合(b)循环(在匹配候选者之间)。
考虑使用键盘和弦在窗口之间快速跳转。我发现它比拿到修饰键要快得多(并且也减轻了我的负担)。
我选择使用的软件包是ace-window
,它使您可以轻松浏览多个窗口而不仅仅是other-window
。
(require 'key-chord)
(key-chord-define-global "xo" 'ace-window)
(key-chord-mode +1)
显然,要使用此功能,您需要key-chord
和ace-window
,都可以在melpa中使用。
ace-window
正在像@ abo-abo的答案那样进行工作。令我惊讶的是,在这种情况下,使用特定的键绑定作为注释而不是答案更有意义。只是我的两分钱。
key-chord
可以绑定非常易于访问的键组合。的示例绑定 xo
速度快于C-x o
(深度一对二)。可以改写此答案以强调该答案与关于功能选择的其他答案正交(并且ace-window
仅仅是可以以所述方式绑定的许多选择之一)。保持这个答案与众不同!
这里有一些很好的答案,我也是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,所有功能都可以作为一个键使用按。
(windmove-default-keybindings 'control)
。
通过Ace Jump,您可以将指针导航到屏幕上的所有单词,而不管它们位于哪个窗口或框架中,因此与使用Ace Window或Switch Window没什么不同。
一个优点是,在跳窗时,您还可以将指针精确定位。
我仍然觉得它有点麻烦或分散注意力,并且发现我正在使用windmove
更多,因为它非常简单,但是当我在另一个窗口或框架中阅读并希望移至该位置时仍使用Ace Jump。
与往常一样,有一百种不同的方法可以完成此操作。我的首选方式是使用NumberedWindows。然后,我使用Super和1-9键设置以下按键绑定。
(global-set-key (kbd "s-1") (lambda() (interactive) (window-number-select 1)))
我将在我的最新文章中详细介绍这个确切的主题,您可以在Afternoon Coder上阅读。