简而言之,问题是:在一个窗口中,如何快速切换到之前在该窗口中访问过的缓冲区,即使它已经在另一个窗口中打开了?
以下是更详细的描述.
通常,为了将窗口切换到先前的缓冲区,只需键入即可C-x b RET.也就是说,switch-to-buffer(或ido-switch-buffer)的默认参数是前一个缓冲区.
但是,当(前一个)缓冲区已经显示在另一个窗口中时,情况并非如此.这正是让我烦恼的原因.
让我们考虑一个例子.假设我有三个缓冲区(A,B和C)和两个窗口显示缓冲区A和B(C不可见在这一点).
然后我A也在第二个窗口打开缓冲区.所以,现在我A在两个窗口都显示了缓冲区.然后我再次切换(C-x b RET)B.在那之后,C-x b RET会带我不要A,但C因为A已经在其他窗口显示了.
如何使C-x b RET表现更加一致?
在这个问题解决之后,我意识到我需要更多:即,每个窗口记住点位置,而不是每个缓冲区.幸运的是,有现成的解决方案:
它们非常相似; 有关差异的讨论,请参见此处.
我找到了一个修复程序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)
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |