如何使`Cx b RET`切换到先前的缓冲区,即使它已经在另一个窗口中显示了?

sha*_*rov 6 emacs

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

以下是更详细的描述.

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

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

让我们考虑一个例子.假设我有三个缓冲区(A,BC)和两个窗口显示缓冲区AB(C不可见在这一点).

然后我A也在第二个窗口打开缓冲区.所以,现在我A在两个窗口都显示了缓冲区.然后我再次切换(C-x b RET)B.在那之后,C-x b RET会带我不要A,但C因为A已经在其他窗口显示了.

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

更新

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

它们非常相似; 有关差异的讨论,请参见此处.

abo*_*abo 5

我找到了一个修复程序switch-to-buffer。它最终调用

(other-buffer (current-buffer))
Run Code Online (Sandbox Code Playgroud)

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

(other-buffer (current-buffer) t)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

请注意,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))
Run Code Online (Sandbox Code Playgroud)

差异只是一行,但建议它太混乱了。

更新:使用新的建议系统 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) 
Run Code Online (Sandbox Code Playgroud)