【问题标题】:Emacs, switch to previous windowEmacs,切换到上一个窗口
【发布时间】:2010-09-10 14:27:50
【问题描述】:

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

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

【问题讨论】:

    标签: emacs


    【解决方案1】:

    那就是 C-- C-x o

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

    【讨论】:

    • 并且可以使用C-x z重复上一条命令快速切换窗口。
    【解决方案2】:

    您可能还想尝试使用 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-buffernext-buffer.lkahtz:(kbd) 函数允许您以更易读的语法在字符串表示法中指定键,当您使用C-h kC-h c 来描述绑定时,Emacs 也使用该语法。
    • 我不赞成使用箭头键。但无论如何,我都赞成乐于助人。 :smug:
    • @phils SHIFT + 干预 Emacs 23 默认启用的班次选择(班次选择模式)。
    • legends2k:是的;尽管您也可以将参数传递给windmove-default-keybindings 以指定与箭头键一起使用的不同修饰符;所以这个功能对于使用 shift-selection-mode 的人来说仍然很方便。
    • @phils 同意,meta 似乎是一个不错的选择; as seen in Emacs Wiki.
    【解决方案3】:

    基于@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】:

      如果您经常使用多个 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-or-frame 更改为 other-window 才能使其工作,仅供参考。我在 Emacs 24.2.1 上。
      • 我认为这些是非常好的绑定(尤其是当您有 2 个以上的窗口时),谢谢。如前所述,也可以更改为other-window 以使其正常工作。
      【解决方案5】:

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

      要选择不同的窗口,请使用 Ctrl-xCtrl-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 非常令人愉悦。
      • 第一张截图中令人惊叹的 Emacs 主题。我怎样才能得到它?
      • @semente 在我的 Emacs 相关页面上jasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
      • @petrux emacsfodder.github.io/blog/two-new-emacs24-themes 我想这可能是两个主题之一。 - 顺便提一句。对于很酷的模式线,请尝试gist.github.com/jasonm23/8554119
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

        (setq windmove-wrap-around t)
        

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

        【讨论】:

          【解决方案8】:

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

           (defun prev-window ()
             (interactive)
             (other-window -1))
          
           (define-key global-map (kbd "C-x p") 'prev-window)
          

          【讨论】:

          • 我不知道从什么时候开始,但是 emacs 现在已经内置了 previous-window
          • @Arne 这不是 M-x 的可调用函数,因此应该用于不同的目的。
          • (global-set-key (kbd "C-x p") 'previous-window-any-frame) 工作吧
          【解决方案9】:

          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)
          

          (灵感来自 thisthat

          【讨论】:

          • 我已经投票并使用了这个配置。问题是M-nM-p 已经在终端(gdb、python、ielm 等)中使用,因此您必须切换回另一种方法才能跳出终端缓冲区。
          • 它们在这些环境中的用途是什么?
          • 这是我目前看到的最好的一个,它不违背其他东西并且像魅力一样!谢谢!
          【解决方案10】:

          关于 Nate 的回答,我将 arrow keys 替换为使用传统的 pupn 去去 downf 去去 rightb 去去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)
          

          希望对你有帮助!

          【讨论】:

            【解决方案11】:
            (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 将循环通过可见缓冲区。准确地说是向前和向后。

            【讨论】:

            • M-k 是一个有用的快捷方式。还有其他选择吗?
            【解决方案12】:
            (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"
            

            【讨论】:

              【解决方案13】:

              我发现切换到上一个窗口的最快方法是将几个键组合在一起作为"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 相同。)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-01-01
                相关资源
                最近更新 更多