7

我正在使用 pdb 调试 Python 程序,但对它的行为不满意。

我将屏幕分成多个 emacs 窗口,当我执行 pdb 时,它(随机?)用 *gud* 调试器的输出替换其中一个窗口。

此外,当遇到断点时,即使调试缓冲区已经在一个窗口中可见,它通常也会将此缓冲区放入另一个窗口,并用源文件的内容替换我的另一个窗口。(顺便说一句,我喜欢它跳转到源文件中的正确行)

如何禁用 gud/pdb 为我管理我的窗口?在 emacs 中是否有可能阻止对窗口和屏幕布局的所有编程操作?

编辑:我在另一篇文章中找到了部分解决此问题的答案:切换专用窗口

4

4 回答 4

4

我在 Emacs 24 上尝试了所有这些方法都没有成功。如果你仍然感兴趣,我使用 'gud-gdb' 恢复到旧的 gdb 行为,它实现了 gdb/emacs 交互的旧行为(没有专用窗口和没有 I/O 缓冲区)。如果你不想在使用的时候调用 Mx gud-gdb,可以给 Mx gdb 定义一个别名

于 2013-03-22T21:17:27.147 回答
3

查看粘性窗口

于 2009-05-01T16:52:08.243 回答
3

我有一个解决方案可以防止 gdb 窃取窗口。它适用于 Emacs 24.4(2014-07-18 快照)并且不需要专用缓冲区。与其他答案相比的好处是,每当您更改缓冲区时,您都不必费心使用专用和非专用缓冲区,这很快就会变得乏味。

将此建议放在您的 .emacs 中:

(defadvice gdb-inferior-filter
    (around gdb-inferior-filter-without-stealing)
  (with-current-buffer (gdb-get-buffer-create 'gdb-inferior-io)
    (comint-output-filter proc string)))
(ad-activate 'gdb-inferior-filter)

这有效地替换了 gdb-mi.el 中定义的这个函数,并删除了调用 gdb-display-buffer 的分支,这是导致窗口盗窃的原因。

于 2014-07-24T00:39:51.260 回答
2

您应该使用Sticky Windows使您的窗口和缓冲区固定在它们所在的位置,但 Sticky Windows 不会阻止 gud/pdb 试图窃取您的窗口。当 gud/pdb 不能窃取你的源代码窗口时,它会打开一个新的 Emacs 框架,即使当前框架上有另一个窗口。

这是因为试图跳转到 gud-pdb 缓冲区 ( py-pdbtrack-track-stack-file) 的函数调用pop-to-buffer参数 OTHER-WINDOW 设置为 的函数t

为了规避所有调用 pop-to-buffer 的库的这种行为,您可以通过在pop-to-buffer(在您的 .emacs 中)定义一个建议来取消 OTHER-WINDOW 的角色:

(defadvice pop-to-buffer (before cancel-other-window first)
  (ad-set-arg 1 nil))

(ad-activate 'pop-to-buffer)

您还应该将变量自定义pop-up-windows为 nil 以强制display-buffer(用于在窗口和框架上显示特定缓冲区的低级例程)不创建新窗口。

于 2011-03-03T01:45:35.083 回答