防止emacs命令在其他窗口中显示新的缓冲区



我在控制台模式下使用emacs(即没有鼠标,一个框架),具有固定的四窗口配置:

+------+------+|胜利||1|3|+------+------+|胜利||2|4|+------+------+

Window 3是我的主要编辑窗口,我大部分时间都在其中。Windows 1和2始终保持相同的两个缓冲区,我很少更改这些窗口,因为缓冲区会自动更新,并且它们包含只读信息。Windows4是我的卫星窗口,很高兴大多数打开新缓冲区的emacs命令(例如grep、编译命令等)显示新缓冲区总是在Windows4中。这让生活变得非常轻松,因为我绑定了F12,直接在窗口3和窗口4之间跳回来。

坏家伙是psvn.el。svn状态缓冲区总是根据需要在Window 3中打开
但是所有其他缓冲区(*svn-diff*,*svn-log*,…)在窗口1、2或3中随机打开,我永远无法预测它们会在哪个窗口中打开。有时,同一个缓冲区甚至同时显示在其中两个窗口上,这让我抓狂!

我该如何告诉emacs/psvn停止这样做?我尝试了所有常用的措施(调整相同的窗口缓冲区名称、分割高度阈值、分割宽度阈值等),但到目前为止都没有效果:-(

请不要有涉及欧洲央行的解决方案。

在@lawlist的基础上,下面是一个如何通过编写自己的display-buffer函数并向display-buffer-alist添加元素来覆盖display-buffer功能的示例。

这里我们有一个互动功能,将当前选择的窗口标记为"卫星"窗口:

(defun mark-this-window-as-satellite ()
"Mark the current window as the satellite window."
(interactive)
(mapc (lambda (win) (set-window-parameter win 'satellite nil))
(window-list))
(set-window-parameter nil 'satellite t)
(message "Window: %s is now the satellite window." (selected-window)))

这是一个助手,它将允许我们扫描并找到卫星窗口:

(defun get-satellite-window ()
"Find and return the satellite window or nil if non exists."
(find-if (lambda (win) (window-parameter win 'satellite)) (window-list)))

然后,我们编写一个函数来覆盖display-buffer的行为。此功能将查找卫星窗口并在那里显示缓冲区:

(defun display-buffer-in-satellite (buffer ignore)
"Display the buffer in the satellite window, or the first window 
it finds if there is no satellite."
(let ((satellite-window (or (get-satellite-window)
(first (window-list)))))
(select-window satellite-window)
(display-buffer-same-window buffer nil)
(display-buffer-record-window 'reuse satellite-window buffer)
satellite-window))

最后,您需要向display-buffer-alist添加一个regexp/函数对,这将使您的所有SVN缓冲区使用新的卫星函数:

(push '("\*svn-" display-buffer-in-satellite) display-buffer-alist)

您也可以为其他令人烦恼的模式添加类似的元素。

也许您可以将窗口1和2标记为专用的。这将防止任何更改它们显示的缓冲区的行为(在您希望使用C-xb手动切换缓冲区的罕见事件中,您甚至需要取消它们的指示)。

如果安装了dedicated-mode,只需在相关窗口中运行M-xdedicated-mode即可。

如果没有,你可以定义你自己的小功能来标记窗口为专用:

(defun my-dedicated-window-toggle ()
"Toggle `window-dedicated-p' in the current window"
(interactive)
(set-window-dedicated-p
(selected-window)
(not (window-dedicated-p))))

最新更新