我想阻止 ESS 更改我的窗口配置,但是当 ESS Tracebug 处于活动状态时,进入调试会更改窗口配置。
假设emacs框架中有三个窗口:(1)一个定义函数的R文件; (2) 调用 (1) 中定义的函数的 R 脚本; (3):劣R ess 过程。如果从 (2) 发送代码到 R 解释器,默认情况下 (2) 会被 (1) 替换(显示要评估的行等)。显示 (3) 的窗口保留在原来的位置;所以我们实际上将 (1) 中的缓冲区显示了两次(在 2 和 1 处)。
在这种配置下,这发生在我身上(以
emacs -Q
启动 emacs)
(package-initialize)
(use-package ess)
我有一个额外的配置(所有这些都本着“不要破坏我的窗口配置:我将通过在那里发出
M-x R
来告诉您在哪个窗口中启动”):
(setq display-buffer-alist
'(("*R" . (display-buffer-same-window)))
)
使用此配置,在调试下,窗口 (2) 现在显示 R 会话(即,下级 R 缓冲区显示在原始窗口位置 3,现在也显示在 2)。
下面的屏幕截图显示了这个问题。第一个屏幕截图包含三个窗口,如所述(1、2、3,从上到下)。
在将函数评估为 R (
display-buffer-same-window
) 后立即使用第二个屏幕截图(使用 C-c C-f
的配置),然后从 (2) 开始评估行 (C-c C-n
)。
如果我禁用tracebug,
M-x ess-tracebug
,不会发生窗口更改,但我不想禁用在具有代码的窗口(窗口1)上执行以下操作。我想使用 Tracebug 但避免对窗口配置进行任何更改:仅显示 (1) 和调试内容,但保留 (2)。我怎样才能做到这一点?
没有答案,但我同意,ess 以随意的方式更改窗口配置,甚至在另一个帧中复制缓冲区,这让我感到愤怒。
我无法再重现第二个问题(用 ess-20240131.1041 测试)。换句话说,启动 Emacs 并进行此设置
(setq display-buffer-alist
'(("*R" . (display-buffer-same-window))))
不会重复劣质的 R 进程窗口,但通过简单的解决方案仍然可能导致可能的问题。
假设我们从这个窗口配置开始(其中来自左下缓冲区
f1
的函数f1.R
已经被评估):
现在,如果从左上方的窗口中显示缓冲区
code1.R
,我们使用ess-eval-line/region/buffer
中的任何一个,我们最终会得到
原来显示
code1.R
的窗口现已替换为 f1.R
。
但是如果我们使用
ess-eval-line/region/buffer-and-go
版本,则根本不会发生这种情况。这样问题就解决了!
我认为这可以说是窗口设置混乱的一个错误。但这在实践中大多是无关紧要的,因为如果我们正在调试,我们会想要进入劣质的 R 进程。 (我有使用
ess-eval-line/region/buffer
然后转向较差的 R 进程的坏习惯;如果我使用 and-go
版本,则无需这样做。因此,我猜这是人们使用and-go
永远不会遇到。)