Emacs,切换到上一个窗口


93

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

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

Answers:


88

那会是 C-- C-x o

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


您可以使用C-x z重复上一个命令来快速切换窗口。
Ivan Huang,

105

您可能还想尝试使用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)

11
请注意,调用(windmove-default-keybindings)会将这些函数绑定到SHIFT +上/下/左/右,我认为这比您的C-x绑定更方便(这与previous-buffernext-buffer.. lkahtz的默认绑定也有冲突:该(kbd)函数允许您以字符串表示法指定键在更可读的语法,其也使用的Emacs当您使用C-h kC-h c描述的结合。
PHILS

4
我不同意使用箭头键。但是无论如何,我都对它的帮助表示支持。:smug:
比约恩

2
@phils SHIFT + <keys>与默认情况下从Emacs 23(shift-selection-mode)启用的换档选择混合在一起。
legends2k 2014年

2
legends2k:是的;尽管您也可以将参数传递windmove-default-keybindings给指定与箭头键结合使用的其他修饰符;因此该功能对于使用班次选择模式的人仍然非常方便。
菲尔2014年

1
@phils同意,meta似乎是一个不错的选择。如Emacs Wiki中所见
legends2k

30

我个人更喜欢使用 window-number.el

要选择其他窗口,请使用Ctrl- xCtrl- j n

其中n是窗口的编号,每个窗口的modeline都会显示其编号,如屏幕截图所示。

只需下载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


2
很好,但是我建议不要绑定任何东西C-x C-j,因为这是dired-jumpif 的默认绑定(require 'dired-x)。(看看M-x customize-group RET dired-keys RET是否要覆盖它。)
phils 2012年

1
发布此内容后,我决定放弃switch-window.el使用它,而是使用它C-x o,并且当只有两个窗口处于活动状态时,它将选择另一个窗口。我认为重新绑定C-x owindow-number技巧是最明智的,您是正确的dired-jump。就我个人而言,我很少进行窗口切换并使用C-x b自己,但是增强C-x o功能非常令人满意。
ocodo 2012年

第一个屏幕截图中令人惊叹的Emacs主题。我怎么才能得到它?
semente

我的Emacs相关页面上的@sementejasonm23.github.com
EmacsFodder/

1
@petrux emacsfodder.github.io/blog/two-new-emacs24-themes我认为这可能是两个主题之一。-顺便说一句。对于酷模式行请尝试gist.github.com/jasonm23/8554119
ocodo

13

如果您经常使用多个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快速浏览窗户即可


1
这正是我需要的解决方案。我只希望窗口切换命令是一个重复的击键。谢谢!FYI,我确实必须将“其他窗口或框架”更改为“其他窗口”才能正常工作。我正在使用Emacs 24.2.1。
Geoff

我认为这些是非常好的绑定(特别是当您有2个以上的窗口时),谢谢。如前所述,也要进行更改other-window以使其起作用。
dolzenko 2014年

11

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

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

 (define-key global-map (kbd "C-x p") 'prev-window)

2
我不知道从什么时候开始,但是emacs已经previous-window内置
Arne

@Arne这不是一个可调用的函数,M-x因此应该用于其他目的。
Ivan Huang,

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)

4

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

(setq windmove-wrap-around t)

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


4

M-nM-p最有意义给我,因为他们是类似于C-n下一行)和C-p之前的线):

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

(由启发这个


我已经投票并使用了此配置。的问题是,M-nM-p已经在终端(GDB,蟒,ielm等)使用,因此,你必须切换回另一个方法跳转终端缓冲器的进行。
mihai

它们在那些环境中有什么用?
tshepang 2015年

那是我目前所见过的最好的东西,它没有与其他东西相提并论,就像魅力一样!谢谢!
aurelien

2

关于Nate的回答,我替换了arrow keys使用传统p的去upndownfrightbleft。我还CtrlSuper键替换了C-p, C-n, C-f and C-b默认的移动键。这种结合M使您可以跳字符和换行,而不是每次击键后仅一步一步地进行操作。因此,Super密钥是保持简单的密钥绑定的最佳选择。而且,现在您不必再将手从本垒打了!

(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)

希望能帮助到你!


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)))

altjaltk循环浏览您的可见缓冲区。确切地说,向前和向后。


Mk是一种有用的快捷方式。还有其他选择吗?
A_P

1

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

(require 'windmove)
(windmove-default-keybindings 'meta) ;; or use 'super to use windows key instead alt

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"
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.