gpt4 book ai didi

emacs - 如何使 `C-x b RET` 切换到上一个缓冲区,即使它已经显示在另一帧中?

转载 作者:行者123 更新时间:2023-12-02 11:54:26 25 4
gpt4 key购买 nike

编辑: 发帖者称之为“窗口”,Emacs 称之为“框架”。我修正了标题。

简而言之,问题是:在一个窗口中,如何快速切换到先前在该窗口中访问过的缓冲区,即使它已在另一个窗口中打开?

下面是更详细的描述。

通常,为了将窗口切换到前一个缓冲区,只需键入 C-x b RET。也就是说,switch-to-buffer(或ido-switch-buffer)的默认参数是前一个缓冲区。

但是,当(先前的)缓冲区已显示在另一个窗口中时,情况并非如此。这正是让我烦恼的地方。

让我们考虑一个例子。假设我有三个缓冲区(ABC)和两个显示缓冲区 A 的窗口B(C 此时不可见)。

然后我也在第二个窗口中打开缓冲区A。所以,现在我在两个窗口中都显示了缓冲区 A。然后我再次将 (C-x b RET) 切换到 B。之后,C-x b RET 不会将我带到 A,而是带到 C,因为 A 已显示在另一个窗口。

如何使 C-x b RET 表现得更加一致?

更新

这个问题解决后,我意识到我需要更多:即,每个窗口而不是每个缓冲区记住点位置。幸运的是,有现成的解决方案:

它们非常相似;有关差异的讨论,请参阅 here .

最佳答案

我找到了切换到缓冲区的修复程序。它最终调用

(other-buffer (current-buffer))

为了解决您的问题,调用需要如下所示:

(other-buffer (current-buffer) t)

visible-ok 参数必须是 t

这里建议始终将其设置为t。希望它不会破坏使用 other-buffer 的其他内容:

(defadvice other-buffer (around fix-switch-to-buffer 
(&optional buffer visible-ok frame) activate)
(setq visible-ok t)
ad-do-it)

请注意,ido-switch-to-buffer 使用不同的机制,因此需要不同的方法来修复它。

更新:修复ido-switch-to-buffer

我需要重新定义ido-make-buffer-list:

(defun ido-make-buffer-list (default)
(let* ((ido-current-buffers (list (buffer-name (current-buffer))))
(ido-temp-list (ido-make-buffer-list-1 (selected-frame) ido-current-buffers)))
(if ido-temp-list
(nconc ido-temp-list ido-current-buffers)
(setq ido-temp-list ido-current-buffers))
(if default
(setq ido-temp-list
(cons default (delete default ido-temp-list))))
(if (bound-and-true-p ido-enable-virtual-buffers)
(ido-add-virtual-buffers-to-list))
(run-hooks 'ido-make-buffer-list-hook)
ido-temp-list))

差异只有一行,但太乱了,无法建议。

更新:对other-buffer使用新的建议系统

旧的东西应该仍然可以工作很长一段时间,但这是新的方法:

(defun other-buffer-advice (orig-fun &optional buffer visible-ok frame)
(funcall orig-fun buffer t frame))
(advice-add 'other-buffer :around #'other-buffer-advice)
;; (advice-remove 'other-buffer :around #'other-buffer-advice)

关于emacs - 如何使 `C-x b RET` 切换到上一个缓冲区,即使它已经显示在另一帧中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27660608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com