97

在 Emacs 中,C-x o将我带到下一个窗口。

什么键盘宏将我带到 Emacs 中的上一个窗口?

4

13 回答 13

109

您可能还想尝试使用 windmove,它可以让您根据几何图形导航到您选择的窗口。我的 .emacs 文件中有以下内容可以使用 Cx 箭头键更改窗口。

(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)
于 2008-09-18T20:27:11.600 回答
90

那将是C-- C-x o

换句话说,C-x o参数为 -1。C-u您可以通过在和 命令之间插入数字参数来指定要移动的窗口数量,如C-u 2 C-x o. (C--是 的快捷方式C-u - 1

于 2008-09-18T09:05:05.327 回答
32

我个人更喜欢使用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

于 2012-06-25T05:57:05.830 回答
14

如果您经常使用多个 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)

现在只需使用 Mo 在窗口中快速循环

于 2012-02-16T04:54:55.750 回答
12

这里有一些非常好的和完整的答案,但是以极简的方式回答这个问题:

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

 (define-key global-map (kbd "C-x p") 'prev-window)
于 2013-08-01T02:52:36.453 回答
4

基于@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)
于 2011-05-21T10:58:28.730 回答
4

只是添加到@Nate、@aspirin 和@Troydm 的答案,如果您决定将windmove 命令绑定到您选择的任何组合键,我发现这是一个非常有用的补充:

(setq windmove-wrap-around t)

使用默认配置,当您尝试移动到不存在的窗口时会收到错误消息,这会在一段时间后变得有点烦人。但是,当设置了 windmove-wrap-around 时,例如尝试移出框架的底部将改为选择框架中最顶部的窗口。这对您来说可能是一种更直观的行为。

于 2012-10-01T04:02:04.417 回答
4

M-n对我来说最M-p有意义,因为它们类似于C-n( next-line ) 和C-p( previous-line ):

(define-key global-map (kbd "M-p") 'previous-multiframe-window)
(define-key global-map (kbd "M-n") 'other-window)

(灵感来自这个那个

于 2013-11-28T10:23:46.210 回答
3

参考 Nate 的回答,我替换了arrow keys使用传统p的 for going upnfor going downffor goingrightbfor going left。我还将CtrlwithSuper键替换为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)

希望能帮助到你!

于 2014-06-10T13:24:03.730 回答
2
(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循环通过您的可见缓冲区。准确地说,向前和向后。

于 2015-02-01T20:06:21.640 回答
1

已经有一个包可以让你使用 M- 切换窗口。检查这个网站。将此添加到您的初始化文件中:

(require 'windmove)
(windmove-default-keybindings 'meta) ;; or use 'super to use windows key instead alt
于 2012-07-30T23:06:02.183 回答
0
(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"
于 2018-04-09T11:40:12.230 回答
0

我发现切换到上一个窗口的最快方法是将几个键混合在一起作为"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 键和弦是顺序无关的,这意味着它qwwq.)

于 2020-10-07T17:42:31.860 回答