【发布时间】:2010-09-10 14:27:50
【问题描述】:
在 Emacs 中,C-x o 将我带到下一个窗口。
哪个键盘宏将我带到 Emacs 中的上一个窗口?
【问题讨论】:
标签: emacs
在 Emacs 中,C-x o 将我带到下一个窗口。
哪个键盘宏将我带到 Emacs 中的上一个窗口?
【问题讨论】:
标签: emacs
那就是 C-- C-x o
换句话说,C-x o 参数为 -1。您可以通过在 C-u 和命令之间插入数字参数来指定要移动的窗口数,如 C-u 2 C-x o。 (C-- 是 C-u - 1 的快捷方式)
【讨论】:
C-x z重复上一条命令快速切换窗口。
您可能还想尝试使用 windmove,它可以让您根据几何图形导航到您选择的窗口。我的 .emacs 文件中有以下内容,可以使用 C-x 箭头键更改窗口。
(global-set-key (kbd "C-x <up>") 'windmove-up)
(global-set-key (kbd "C-x <down>") 'windmove-down)
(global-set-key (kbd "C-x <right>") 'windmove-right)
(global-set-key (kbd "C-x <left>") 'windmove-left)
【讨论】:
(windmove-default-keybindings) 会将这些函数绑定到 SHIFT+up/down/left/right,我认为这比您的 C-x 绑定更方便(这与也有用的默认绑定冲突对于previous-buffer 和next-buffer.lkahtz:(kbd) 函数允许您以更易读的语法在字符串表示法中指定键,当您使用C-h k 或C-h c 来描述绑定时,Emacs 也使用该语法。
windmove-default-keybindings 以指定与箭头键一起使用的不同修饰符;所以这个功能对于使用 shift-selection-mode 的人来说仍然很方便。
基于@Nate 的想法,但稍作修改以支持窗口之间的向后循环
;; Windows Cycling
(defun windmove-up-cycle()
(interactive)
(condition-case nil (windmove-up)
(error (condition-case nil (windmove-down)
(error (condition-case nil (windmove-right) (error (condition-case nil (windmove-left) (error (windmove-up))))))))))
(defun windmove-down-cycle()
(interactive)
(condition-case nil (windmove-down)
(error (condition-case nil (windmove-up)
(error (condition-case nil (windmove-left) (error (condition-case nil (windmove-right) (error (windmove-down))))))))))
(defun windmove-right-cycle()
(interactive)
(condition-case nil (windmove-right)
(error (condition-case nil (windmove-left)
(error (condition-case nil (windmove-up) (error (condition-case nil (windmove-down) (error (windmove-right))))))))))
(defun windmove-left-cycle()
(interactive)
(condition-case nil (windmove-left)
(error (condition-case nil (windmove-right)
(error (condition-case nil (windmove-down) (error (condition-case nil (windmove-up) (error (windmove-left))))))))))
(global-set-key (kbd "C-x <up>") 'windmove-up-cycle)
(global-set-key (kbd "C-x <down>") 'windmove-down-cycle)
(global-set-key (kbd "C-x <right>") 'windmove-right-cycle)
(global-set-key (kbd "C-x <left>") 'windmove-left-cycle)
【讨论】:
如果您经常使用多个 emacs 窗口 (>3),并且您希望节省一些击键,请将其添加到您的 init 文件中,这样会更好:
(defun frame-bck()
(interactive)
(other-window-or-frame -1)
)
(define-key (current-global-map) (kbd "M-o") 'other-window-or-frame)
(define-key (current-global-map) (kbd "M-O") 'frame-bck)
现在只需使用 M-o 在窗口中快速循环
【讨论】:
other-window 以使其正常工作。
我个人更喜欢使用window-number.el
要选择不同的窗口,请使用 Ctrl-x、Ctrl-j n
其中n是窗口的编号,每个窗口的模式行显示它的编号,如截图所示。
只需下载 window-number.el,将其放在您的 emacs 加载路径中,然后在您的 .emacs 中使用以下内容
(autoload 'window-number-mode "window-number"
"A global minor mode that enables selection of windows according to
numbers with the C-x C-j prefix. Another mode,
`window-number-meta-mode' enables the use of the M- prefix."
t)
还有另一种类似的模式,称为switch-window.el,它会在窗口中为您提供大数字...(按数字会切换窗口并恢复显示。)
(来源:tapoueh.org)
【讨论】:
C-x C-j,因为如果您使用 (require 'dired-x),这是 dired-jump 的默认绑定。 (如果你想覆盖它,请参阅M-x customize-group RET dired-keys RET。)
switch-window.el,它使用C-x o,当只有两个窗口处于活动状态时,它只会选择另一个窗口。我认为重新绑定C-x o 以执行window-number 技巧是最明智的,您对dired-jump 的看法是正确的。就我个人而言,我很少切换窗口并使用C-x b,但是拥有增强的C-x o 非常令人愉悦。
已经有一个包可以让你使用 M- 切换窗口。 check this website。将此添加到您的初始化文件中:
(require 'windmove)
(windmove-default-keybindings 'meta) ;; or use 'super to use windows key instead alt
【讨论】:
只是为了添加到@Nate、@aspirin 和 @Troydm 的答案,如果您决定将 windmove 命令绑定到您选择的任何组合键,我发现这是一个非常有用的补充:
(setq windmove-wrap-around t)
使用默认配置时,当您尝试移动到不存在的窗口时会收到错误消息,这会在一段时间后变得有点烦人。但是,当设置了 windmove-wrap-around 时,例如尝试移出框架的底部将改为选择框架中最顶部的窗口。这对您来说可能是一种更直观的行为。
【讨论】:
这里有一些非常好的和完整的答案,但是以极简的方式回答问题:
(defun prev-window ()
(interactive)
(other-window -1))
(define-key global-map (kbd "C-x p") 'prev-window)
【讨论】:
previous-window。
M-x 的可调用函数,因此应该用于不同的目的。
(global-set-key (kbd "C-x p") 'previous-window-any-frame) 工作吧
【讨论】:
M-n 和M-p 已经在终端(gdb、python、ielm 等)中使用,因此您必须切换回另一种方法才能跳出终端缓冲区。
关于 Nate 的回答,我将 arrow keys 替换为使用传统的 p 去 up,n 去去 down,f 去去 right 和 b 去去left。我还将Ctrl 替换为Super 键,因为C-p, C-n, C-f and C-b 是默认移动键。这种与M 的组合让您可以跳过字符和行,而不是在每次击键后逐个处理。因此,Super key 感觉是保持简单键绑定的最佳选择。此外,现在您不必再将手从主行移开!
(global-set-key (kbd "s-p") `windmove-up)
(global-set-key (kbd "s-n") `windmove-down)
(global-set-key (kbd "s-f") `windmove-right)
(global-set-key (kbd "s-b") `windmove-left)
希望对你有帮助!
【讨论】:
(global-unset-key (kbd "M-j"))
(global-unset-key (kbd "M-k"))
(global-set-key (kbd "M-j") (lambda () (interactive) (other-window 1)))
(global-set-key (kbd "M-k") (lambda () (interactive) (other-window -1)))
altj 和 altk 将循环通过可见缓冲区。准确地说是向前和向后。
【讨论】:
(global-set-key (kbd "C-x a") 'ace-swap-window)
(global-set-key (kbd "C-x q") 'ace-select-window)
download ace-window from the melpa repo if you don't know how to do that
put this in your .emacs file if you don't have one create it
(package-initialize)
(require 'package)
(add-to-list 'package-archives '("melpa" , "http://melpa.org/packages/"))
(package-initialize)
then "m-x list-packages"
【讨论】:
我发现切换到上一个窗口的最快方法是将几个键组合在一起作为"key-chord"。以下让您可以同时使用左小指和无名指转到上一个窗口:
(key-chord-define-global "qw" 'prev-window)
(key-chord-define-global "'y" 'other-window) ; bonus for my colemak, adjust otherwise
(key-chord-define-global ";'" 'other-window) ; probably normal
(这是可能的,因为 Emacs 键和弦是顺序无关的,这意味着 qw 与 wq 相同。)
【讨论】: