gpt4 book ai didi

Emacs/GDB : always display source in specific window with gdb-many-windows

转载 作者:行者123 更新时间:2023-12-04 08:49:09 24 4
gpt4 key购买 nike

我在 Emacs 24 中使用 GDB 和 gdb-many-windows设置为 t ,通常在自己的框架中。我喜欢有一个单独的编辑框。它看起来像这样(为我粗略的 ASCII 图道歉):

+-------------+-------------+
| gdb | locals |
+-------------+-------------+
| source | I/O |
| | |
+-------------+-------------+
| stack | breakpoints |
+-------------+-------------+

这工作得很好,除了一个大问题。每当 gdb 需要显示不同的源缓冲区时,例如,在 up/down/step 之后,它并不总是在“源”窗口中显示它。例如,如果我在不同框架的窗口中打开了相同的缓冲区,它将提升该框架,同时将键盘焦点保持在 gdb 框架中。当框架相互覆盖时,这在单显示器设置中真的很烦人。

我希望 gdb 始终使用 gdb-many-windows 设置中的源窗口来显示源,无论是否在其他地方显示相同的源缓冲区。我怎样才能做到这一点?

编辑:更详细的复制说明。我将 Emacs 24.2.1 与 GDB 7.5-ubuntu 一起使用。我在 Ubuntu 10.04 和带有 Cinnamon 的 Linux Mint Nadia 上看到了这个问题。
  • 计算这个表达式:(setq gdb-many-windows t)
  • 用至少两个文件编译一个 C 程序。

  • 例如:
    // foo.c
    void bar(int);
    void foo(int c) {
    if (c > 0)
    bar(c - 1);
    }
    int main(void) {
    foo(100);
    return 0;
    }

    // bar.c
    void foo(int c);
    void bar(int c) {
    if (c > 0)
    foo(c - 2);
    }

    // compile with gcc -g -O0 foo.c bar.c -o test
  • 让 bar.c 显示在主框架中。使用 M-x 5 2 打开一个新框架.在该框架中,使用 M-x gdb 启动 gdb .如上所示,该框架中应该有六个窗口。将 gdb 框架放在源框架的顶部。
  • main 中设置断点并逐步调用 foobar .当bar调用时,主框架将在 gdb 框架上方升起,因为 bar.c 已经在那里可见,但键盘焦点将保留在 gdb 框架中。

  • 我认为问题函数是 gdb-display-source-buffer在 gud.el.gz。我打算尝试用 defadvice 覆盖它,但我对建议并不熟悉。如果我弄明白了,我会在这里发布答案。

    最佳答案

    导致这个问题的函数其实是gud-display-line在 gud.el.gz。该函数负责将源窗口中的叠加箭头定位在当前行上,并确保其可见。这是逻辑:

    (let* ...
    (window (and buffer
    (or (get-buffer-window buffer)
    (if (eq gud-minor-mode 'gdbmi)
    (or (if (get-buffer-window buffer 'visible)
    (display-buffer buffer nil 'visible))
    (unless (gdb-display-source-buffer buffer)
    (gdb-display-buffer buffer nil 'visible))))
    (display-buffer buffer))))

    我用了 defadvice覆盖整个功能;基本上,我复制了源代码并更改了窗口选择逻辑。
    (defadvice gud-display-line (around do-it-better activate)
    (let* ...
    (window (and buffer
    (or (if (eq gud-minor-mode 'gdbmi)
    (unless (gdb-display-source-buffer buffer)
    (gdb-display-buffer buffer nil 'visible)))
    (get-buffer-window buffer)
    (display-buffer buffer))))
    ...)

    显然不是最优雅的解决方案。切换帧(向上/向下/帧)时它也无济于事,所以当我弄清楚时我会编辑它。

    关于Emacs/GDB : always display source in specific window with gdb-many-windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20226626/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com