【问题标题】:Customizing Emacs GDB自定义 Emacs GDB
【发布时间】:2010-10-05 00:00:22
【问题描述】:

我喜欢将 GDB 与 emacs 一起使用。我最喜欢使用“gdb-many-windows”获得的配置,如下所示:

gdb-many-windows

也就是说,它并不完美。我想添加一个框架来显示当前正在运行的线程。有谁知道是否可以自定义“gdb-many-windows”给你的配置?或者,如果我不能这样做,他们是否可以在我的 .emacs 中自动出现 gdb 之后创建我自己的框架?我理想的设置应该有线程、堆栈跟踪、局部变量和一个大的源窗口。

【问题讨论】:

    标签: configuration emacs gdb


    【解决方案1】:

    gdb-many-windows 使用的窗口布局显然是在gdb-setup-windows 中实现的。您可以建议该函数在设置窗口时做额外的工作,例如

    (defadvice gdb-setup-windows (around setup-more-gdb-windows activate)
      ad-do-it
      (split-window-horizontally)
      (other-window 1)
      (gdb-set-window-buffer
        (gdb-get-buffer-create 'gdb-some-buffer-type)))
    

    【讨论】:

    • 不错!但是,我想了解更多有关这些部件的信息(我对 Emacs 内部结构并不完全精通......)。什么是“周围”部分? “做它”?
    • 因此,"around" 将这个建议包装在函数 "setup-more-gdb-windows" 周围(在一般情况下这可能很难找到)并且它会立即激活这个建议。
    • 而“ad-do-it”是原始函数的占位符,它将在该占位符存在的任何地方运行。
    【解决方案2】:

    这是一个非常古老的帖子,但是以下解决方案可以帮助某人。

    以下代码捕获 gdb 接口的启动和退出,改变其行为。

    在 gdb 启动时(默认 gdb),它首先保存当前布局,然后运行 ​​gdb,最后准备一个新的自定义布局(很容易根据您的喜好进行编辑)

    在gdb exit(defadvice gdb-reset)时,先执行原来的exit函数,然后重新加载保存的布局。

    结果包含与gdb-many-windows相同的窗口,当前正在运行的线程在图片的右上角

    (setq gdb-many-windows nil)
    
    (defun set-gdb-layout(&optional c-buffer)
      (if (not c-buffer)
          (setq c-buffer (window-buffer (selected-window)))) ;; save current buffer
    
      ;; from http://stackoverflow.com/q/39762833/846686
      (set-window-dedicated-p (selected-window) nil) ;; unset dedicate state if needed
      (switch-to-buffer gud-comint-buffer)
      (delete-other-windows) ;; clean all
    
      (let* (
             (w-source (selected-window)) ;; left top
             (w-gdb (split-window w-source nil 'right)) ;; right bottom
             (w-locals (split-window w-gdb nil 'above)) ;; right middle bottom
             (w-stack (split-window w-locals nil 'above)) ;; right middle top
             (w-breakpoints (split-window w-stack nil 'above)) ;; right top
             (w-io (split-window w-source (floor(* 0.9 (window-body-height)))
                                 'below)) ;; left bottom
             )
        (set-window-buffer w-io (gdb-get-buffer-create 'gdb-inferior-io))
        (set-window-dedicated-p w-io t)
        (set-window-buffer w-breakpoints (gdb-get-buffer-create 'gdb-breakpoints-buffer))
        (set-window-dedicated-p w-breakpoints t)
        (set-window-buffer w-locals (gdb-get-buffer-create 'gdb-locals-buffer))
        (set-window-dedicated-p w-locals t)
        (set-window-buffer w-stack (gdb-get-buffer-create 'gdb-stack-buffer))
        (set-window-dedicated-p w-stack t)
    
        (set-window-buffer w-gdb gud-comint-buffer)
    
        (select-window w-source)
        (set-window-buffer w-source c-buffer)
        ))
    (defadvice gdb (around args activate)
      "Change the way to gdb works."
      (setq global-config-editing (current-window-configuration)) ;; to restore: (set-window-configuration c-editing)
      (let (
            (c-buffer (window-buffer (selected-window))) ;; save current buffer
            )
        ad-do-it
        (set-gdb-layout c-buffer))
      )
    (defadvice gdb-reset (around args activate)
      "Change the way to gdb exit."
      ad-do-it
      (set-window-configuration global-config-editing))
    

    【讨论】:

    • 很好看,我要偷了!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    相关资源
    最近更新 更多