如何在Emacs中进行缓冲区分割后切换焦点?

47
我希望在分割窗口(C-x 3C-x 2)后,能够自动跳转光标到新打开的缓冲区(除了当前缓冲区之外)。我该如何实现这种行为?

1
Morgan,很抱歉我的回答可能会导致不良的副作用,因此我想撤回它。不幸的是,只要它是被接受的答案,我就无法这样做。你能否取消接受它,这样我就可以删除它?谢谢。 - Thomas
C-x 4f 不完全是你所要求的,但它是一个非常方便的技巧。 - Raoul HATTERER
6个回答

68

您可以使用C-x o切换缓冲区。至于自动执行此操作,我认为没有现有的命令可用。


谢谢。在我的当前设置中,我使用S-<箭头键>在可见缓冲区之间移动,自动化是我感兴趣的事情。 - morgan freeman

40

你可以像这样做:

(global-set-key "\C-x2" (lambda () (interactive)(split-window-vertically) (other-window 1)))
(global-set-key "\C-x3" (lambda () (interactive)(split-window-horizontally) (other-window 1)))

在Emacs 24.3.1中,如果你将参数1更改为0,它就可以工作了。


1
这里有一个小错别字。应该是 split-window-horizontally 而不是 split-window-horizonatally。我尝试编辑但没有权限。 - morgan freeman
4
真的应该是split-window-rightsplit-window-below吗? - asmeurer

13

!!!不要使用这个答案!!!--正如评论所指出的那样,建议使用split-window可能会导致不希望发生的副作用。

我建议使用Bozhidar Batsov的答案。


将以下内容放入您的 .emacs 文件中:

(defadvice split-window (after move-point-to-new-window activate)
  "Moves the point to the newly created window after splitting."
  (other-window 1))

作为一项观察,这会搞乱ECB。至少在我的设置中是这样的。 - morgan freeman
如果您有2个垂直分割的缓冲区,并在其中一个(org)中执行“org-schedule”操作,则会出现与日历缓冲区相关的错误。 - Sergey
@Thomas,它打开了日历,但光标在其缓冲区中不可见,并且它还用3个月的日历缓冲区内容替换了我的org文件(因此最终我有2-3个无法工作的日历缓冲区)。 - Sergey
1
这会破坏 ispell-word (M-$),因为它不希望在创建的 ispell 缓冲区中有点。我认为 Bozhidar Batsov 的解决方案只更改用户键盘快捷方式是一个更好的方法。 - asmeurer
这会破坏任何已经实现切换到创建的窗口的功能,例如在自定义分组中导航。 - QwiglyDee
显示剩余3条评论

3
除了手动使用C-x 2C-x 3拆分框架之外,有时也会自动弹出缓冲区。这些缓冲区默认情况下也没有被选择/激活。
可以通过更改用于拆分窗口的函数来解决这个问题。默认设置为split-window-sensibly,但您可以将其设置为调用split-window-sensibly并选择缓冲区的自己的函数。
不幸的是,这会导致在迷你缓冲区中按TAB时选择*Completions*缓冲区。因此,在这种情况下值得检查迷你缓冲区是否处于活动状态,并且在这种情况下不进行切换。我敢打赌还有其他不良情况。如果我发现它们,我会尽快更新此帖子。
;; after splitting a frame automatically, switch to the new window (unless we
;; were in the minibuffer)
(setq split-window-preferred-function 'my/split-window-func)
(defun my/split-window-func (&optional window)
  (let ((new-window (split-window-sensibly window)))
    (if (not (active-minibuffer-window))
        (select-window new-window))))

(适用于Emacs 24.5.1。)

1

当你想要在split-window之后跟随窗口时,我认为它与以下代码中的相同缓冲区有关:

(defun split-window--select-window (orig-func &rest args)
  "Switch to the other window after a `split-window'"
  (let ((cur-window (selected-window))
        (new-window (apply orig-func args)))
    (when (equal (window-buffer cur-window) (window-buffer new-window))
      (select-window new-window))
    new-window))
(advice-add 'split-window :around #'split-window--select-window)

简单

0

C-x o可以帮助您切换到“其他”缓冲区。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接