关闭Emacs缓冲区后显示的缓冲区

7
我该如何修改emacs在关闭一个buffer后选择显示哪个buffer的方式?
当我有多列显示同一个缓冲区时,然后在其中一个缓冲区中打开另一个文件,然后关闭新打开的缓冲区,它不会切换回以前的缓冲区,而是切换到另一个缓冲区。
我将尝试用示例来解释:
- 从*scratch*开始使用新的emacs - C-x 2(分割成两列) - C-x C-f 1(查找文件1) - C-x o(切换到其他窗格) - C-x b 1(查找文件1) - C-x C-f 2(查找文件2) - C-x k(杀死缓冲区)
现在它切换到了scratch,但我希望它再次在两个窗口中显示1,是否可以让emacs这样工作?
3个回答

3
这可能不是直接回答你问题的方法,但它可能会有所帮助。
Emacs 管理其缓冲区列表,包括在你杀死一个缓冲区(通过 kill-buffer)时决定哪个缓冲区被显示。我没有研究过它是如何实现的,但文档 "已经存在"。很多人已经创建了自定义缓冲区堆栈管理魔法来改变 Emacs 的工作方式,其中一些可能基于贝叶斯分析或其他方法。你可以想象这种可能性。
我从来没有考虑过改变 Emacs 管理其缓冲区的方式。相反,我只是将other-windowswitch-to-buffer绑定到方便的按键上(C-x o,C-x b),然后我就非常擅长使用它们了。
你可以创建一个简单的函数来实现你想要的功能:它应该销毁所有其他窗口,然后将当前缓冲区分割成两个窗口并显示。幸运的是,Emacs 已经有了能够完全实现这些功能的函数。
(defun cheeso-show-buffer-two-windows ()
  "Close all other windows; then split, and show the current
buffer in both windows."
  (interactive)
  (delete-other-windows)
  (split-window-vertically))

将其绑定到一个按键,然后badda-bing,你就可以使用了。这是一个垂直分割 - 窗口以垂直堆栈显示。如果您想要水平分割(窗口并排显示),则替换...好吧,你知道的。

1
正如你所说,这并不是我正在寻找的。问题在于switch-to-buffers也不想切换到已经可见的缓冲区。如果我在两个框架中都打开了文件1,然后在其中一个框架中打开文件2并执行switch-to-buffer,它不会建议1,而是scratch。我查看了emacs的源代码,并且函数other-buffer(由kill-buffer使用)有一个可选参数visible-ok,如果设置了它就不会关心缓冲区是否在另一个框架中可见。但我不想重新编译emacs来解决我的问题。 - Puppe
呵呵,我相信你不需要重新编译emacs就能让它按照你的意愿工作。我已经不太清楚你想要什么了。你说我提出的方案“不是你真正想要的”。为什么呢?无论你想象中的是什么,都有一小段elisp代码可以实现你想要的功能。试试看使用switch-to-buffer-other-window命令,也许会有所帮助。 - Cheeso
我想要它的功能是关闭一个窗格中的缓冲区,并切换到在该窗格中打开的先前缓冲区,即使该缓冲区可能在另一个窗格中可见。这肯定是可能的,我只需要学习(e)lisp。 - Puppe
"...也许其中一些是基于贝叶斯分析的..." LOL +1 - Paul

1

这并不能直接帮助你,但Winner mode可能会帮助你达到你想要的目标。


0

你是否正在使用tabbar-mode?我曾经遇到过同样的问题,对我来说,tabbar是原因。Tabbar将函数tabbar-buffer-kill-buffer-hook添加到kill-buffer-hook中。您可以使用(remove-hook 'kill-buffer-hook 'tabbar-buffer-kill-buffer-hook)来删除它。

如果您不使用tabbar,请尝试M-x describe-variablekill-buffer-hook。此列表中的一个函数可能会干扰您的缓冲区。


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