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

Svn 防止emacs命令在其他窗口中显示新缓冲区,svn,emacs,Svn,Emacs,我在控制台模式下使用emacs(即没有鼠标,一帧),并采用固定的四窗口配置: +------+------+ | win | win | | 1 | 3 | +------+------+ | win | win | | 2 | 4 | +------+------+ +------+------+ |赢| | 1 | 3 | +------+------+ |赢| | 2 | 4 | +------+------+ 窗口3是我的主要编辑窗

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

+------+------+ | win | win | | 1 | 3 | +------+------+ | win | win | | 2 | 4 | +------+------+ +------+------+ |赢| | 1 | 3 | +------+------+ |赢| | 2 | 4 | +------+------+ 窗口3是我的主要编辑窗口,我大部分时间都在那个窗口里。Windows 1和2始终保持相同的两个缓冲区,我很少切换到这些窗口,因为缓冲区会自动更新,并且它们包含只读信息。Windows 4是我的附属窗口,很高兴大多数打开新缓冲区的emacs命令(例如grep、编译命令等)都显示新缓冲区总是在Windows 4中。这让生活变得非常简单,因为我绑定F12直接在3号窗口和4号窗口之间跳转并返回

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

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


请不要使用涉及ecb的解决方案。

根据@lawlist所说的内容,下面是一个如何通过编写自己的
显示缓冲区
函数并向
显示缓冲区列表
添加元素来覆盖
显示缓冲区
功能的示例

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

(取消将此窗口标记为卫星()
“将当前窗口标记为卫星窗口。”
(互动)
(mapc(λ(win)(设置窗口参数win'卫星零))
(窗口列表))
(设置窗口参数nil'卫星t)
(消息“窗口:%s现在是卫星窗口。”(选定窗口)))
这是一个帮助程序,允许我们扫描并找到卫星窗口:

(取消获取卫星窗口()
“查找并返回卫星窗口,如果不存在,则返回nil。”
(查找if(lambda(win)(窗口参数win'satellite))(窗口列表)))
然后,我们编写一个函数,该函数将覆盖显示缓冲区的行为。该函数将查找附属窗口并在那里显示缓冲区:

(取消卫星中的显示缓冲区(缓冲区忽略)
'在卫星窗口或第一个窗口中显示缓冲区\
如果没有卫星,它就会发现。”
(let((卫星窗口)或(获取卫星窗口)
(第一(窗口列表((())))
(选择窗口卫星窗口)
(显示缓冲区同一窗口缓冲区为零)
(显示缓冲区记录窗口“重用卫星窗口缓冲区”)
卫星窗口)
最后,您需要将regexp/函数对添加到
display buffer alist
,以使所有SVN缓冲区使用新的卫星功能:

(按“(“\\*svn-”卫星显示缓冲区)显示缓冲区列表)

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

也许您可以将windows 1和2标记为专用。这将阻止任何更改它们显示的缓冲区的操作(您甚至需要在使用C-xb手动切换其中缓冲区的情况下取消它们的指定)

如果安装了
专用模式
,只需在相关窗口中运行M-x
专用模式

如果没有,您可以定义自己的小功能,将windows标记为专用:

(取消我的专用窗口切换()
“在当前窗口中切换'window-dedicated-p'”
(互动)
(设置-窗口-专用-p
(选定窗口)
(非(窗口专用-p)))

要完全控制某些缓冲区的显示方式,您可以进入
psvn.el
的源代码并对其进行修改(或创建新函数)使用
display buffer
函数系列。以下是指向最近两个线程的链接,我和其他线程参与者给出了如何在给定窗口中显示特定缓冲区的示例(如果不存在,则创建新窗口):还有其他选择,但从源代码处扼杀萌芽是我处理事情的首选方式。例如,有争议的源代码的作者似乎个人偏爱
pop to buffer
——您可以用自己的显示缓冲功能替换它们。您可能需要调整c语言的其他部分ode,但这是一般的想法。尽管最近版本的Emacs Trunk中提供了
显示缓冲区功能
,但Emacs团队预计在将来某个时候会弃用它,取而代之的是
显示缓冲区列表
。尽管如此,我认为在它仍然是av的情况下没有理由不使用它可用选项。摘自
window.el
(使过时变量“显示缓冲功能”显示缓冲列表“24.3”)
IIUC您应该能够使用
(推送“(“\\\*svn-”卫星显示缓冲列表)获得相同的结果)
。我不知道,这似乎是一个更好的选择,我已更改了答案。另一个注意事项:看起来您只使用了一个帧,但如果您没有使用,则可以跨帧列表“映射
窗口列表”,以获取所有帧中的所有窗口。