【问题标题】:Emacs move around split windows in a specified direction?Emacs 在指定方向上移动拆分窗口?
【发布时间】:2013-05-17 11:24:00
【问题描述】:

在终端 Emacs(无鼠标)中,我使用拆分窗口同时处理多个缓冲区。我发现在拆分窗口之间移动比在 Vim 中移动要痛苦得多。阅读文档看起来我做得正确(C-x o),但这只是顺时针方向围绕窗口循环。如果我移动到相邻的窗口进行快速编辑,我需要按几次 C-x o 才能回到原来的位置。有时我不小心匆忙按了太多次,不得不再次从窗户一路循环回来。

远离安装另一个外部包,有什么方法可以直接移动到一个窗口(例如,一个数字),或者至少在相反的方向上围绕窗口循环?

在 Vim 中 C-w C-w 就像在 Emacs 中的 C-x o 一样,但也有 C-w ARROW 可以朝指定方向移动...像那样? :)

【问题讨论】:

  • 我知道你说过你不想要包,但 Evil 使用你熟悉和喜爱的 C-w 绑定。 :)
  • 已安装 Evil,谢谢。到目前为止我很喜欢它,因为它不会像我想象的那样干扰 Emacs 命令。
  • @ChrisBarrett 有趣的是 evil-mode 似乎实现了C-w h/j/k/l,但不是那些箭头键的变体。我想我可以自己轻松地映射它们。

标签: emacs


【解决方案1】:

将此添加到您的初始化文件中:

(windmove-default-keybindings)

然后你可以使用SHIFT+箭头在指定方向移动到下一个相邻窗口。

如果您愿意,可以通过传递参数(默认为 'shift)来指定不同的修饰符。

或者只是将你喜欢的任何东西绑定到这些函数:

  • windmove-up
  • windmove-down
  • windmove-left
  • windmove-right

您还可以将FrameMove 添加到组合中,以使这项工作在多个帧之间透明。

对于编号的窗口导航,有switch-window.el

【讨论】:

  • 正如 OP 明确指出 Emacs 在终端中运行,值得注意的是 Shift+UP 不适用于基于 xterm 的模拟器,包括 gnome-terminal 和终结器。请参阅related question 了解更多信息。
  • 非常好;在这种情况下,他们可能需要指定自己的绑定。 (虽然 xterm 是终端仿真器之一,它 确实 也有助于扩展键序列,我不认为你提到的另外两个实际上是基于它的 :)
  • @phils,我应该更准确地选词,我指的是 xterm-terminfo 而不是 xterm-the-emulator 本身。
【解决方案2】:

将此添加到您的初始化文件中(例如~/.emacs):

(windmove-default-keybindings)

然后按 SHIFT+箭头 移动到那个方向的窗口。

【讨论】:

    【解决方案3】:

    您可以像这样C-u -1 C-x oC-x o 提供前缀参数。这样,您可以向前或向后移动任意数量的窗口。就个人而言,我认为创建一个特殊的键来返回一个窗口更容易。我的 .emacs 中有这个:

    (defun other-window-backward ()
      "Goto previous window"
      (interactive)
      (other-window -1))
    (global-set-key (kbd "\C-x p") 'other-window-backward)
    

    【讨论】:

    • 啊,我没有意识到other-window 接受这样的论点,谢谢。然后使用映射进行自定义又好又简单:)
    【解决方案4】:

    我使用以下命令导航到下一个(与 C-x o 相同)、上一个、第一个和最后一个窗口:

    (defun my-previous-window ()
      "Previous window"
      (interactive)
      (other-window -1))
    (global-set-key "\C-xp" 'my-previous-window)
    
    (global-set-key "\C-xn" 'other-window)
    
    (defun my-select-first-window ()
      (interactive)
      (select-window (frame-first-window)))
    
    (defun my-select-last-window ()
      (interactive)
      (select-window (previous-window (frame-first-window))))
    
    (global-set-key "\C-x<" 'my-select-first-window)
    (global-set-key "\C-x>" 'my-select-last-window)
    

    【讨论】:

      【解决方案5】:

      使用窗口跳转,例如:

      ;; C-x <direction> to switch windows
      (use-package window-jump
                   :bind (("C-x <up>" . window-jump-up)
                          ("C-x <down>" . window-jump-down)
                          ("C-x <left>" . window-jump-left)
                          ("C-x <right>" . window-jump-right)))
      

      有关使用包的帮助,请参阅https://github.com/jwiegley/use-package/blob/master/README.md

      【讨论】:

        【解决方案6】:

        为了补全,还有window-numberingace-window

        【讨论】:

        • 我将此行添加到我的 .emacs 中,但仍无法按预期移动。有问题?我的版本是 24.5
        【解决方案7】:

        不久前我写了一个 elisp 模块来扩展 windmove 以使其更有用:http://samograd.ca/stumpwm.el。您可以将 stumpwm-move-window-[left/right/up/down] 绑定到您想要的任何键,并且窗口将朝正确的方向移动,甚至进入另一个框架(用 2 个框架测试)。还有一个 stumpwm-interactive-resize-window 可以方便地使用 C-n/C-p/C-f/C-b 和 Return to end 调整大小来调整交互式窗口大小。

        【讨论】:

        • 链接已损坏。你能把它放在 emacs wiki 或 github 上吗?
        猜你喜欢
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多