代码之家  ›  专栏  ›  技术社区  ›  dicroce

自定义Emacs gdb

  •  7
  • dicroce  · 技术社区  · 14 年前

    我喜欢在Emacs中使用gdb。我最喜欢使用“gdb-many-windows”获得的配置,如下所示:

    gdb-many-windows

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

    2 回复  |  直到 8 年前
        1
  •  9
  •   rafl    14 年前

    使用的窗口布局 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)))
    
        2
  •  4
  •   campisano    8 年前

    这是一篇非常古老的文章,但是下面的解决方案可以帮助某人。

    follow代码捕获gdb接口的开始和退出,更改其行为。

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

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

    结果包含gdb的同一窗口多个窗口,当前运行的线程位于图像的右上角

    (setq gdb many windows nil)
    
    (defun set gdb layout(&可选c-buffer)
    (如果(不是C缓冲器)
    (setq c-buffer(窗口缓冲区(所选窗口));;保存当前缓冲区
    
    ;来自http://stackoverflow.com/q/39762833/846686
    (set-window-indicate-p(selected window)nil);;如果需要,取消设置专用状态
    (切换到缓冲器Gud Comint Buffer)
    (删除其他窗口);;全部清除
    
    (让*)
    (w-source(选定窗口));;左上角
    (w-gdb(拆分窗口w-source nil'right));右下角
    (w-locals(拆分窗口w-gdb nil'以上));右中底
    (w-stack(split window w w-locals nil'above));右中上
    (W-断点(上面的拆分窗口w-stack nil”);右上角
    (W-IO(分窗W源(地板(*0.9(窗体高度)))
    '下方');;左下
    )
    (设置窗口缓冲区w-io(gdb get buffer create'gdb subior io))。
    (设置-窗口-专用-P W-IO T)
    (设置窗口缓冲区w-断点(gdb get buffer create'gdb断点缓冲区))
    (设置-窗口-专用-P W-断点T)
    (设置窗口缓冲区w-locals(gdb get buffer create'gdb locals buffer))。
    (设置-窗口-专用-P W-局部变量T)
    (设置窗口缓冲区w-stack(gdb get buffer create'gdb stack buffer))。
    (设置-窗口-专用-P W-堆栈T)
    
    (设置窗口缓冲区w-gdb gud comint buffer)
    
    (选择窗口w-source)
    (设置窗口缓冲区w-源c-缓冲区)
    )
    (defadvice gdb(args附近激活)
    “更改GDB的工作方式。”
    (setq全局配置编辑(当前窗口配置));要恢复:(设置窗口配置C-编辑)
    (让(
    (C缓冲区(窗口缓冲区(选定窗口));;保存当前缓冲区
    )
    做广告
    (设置gdb布局c-buffer)
    )
    (默认GDB重置(args激活周围)
    “更改到gdb出口的方式。”
    做广告
    (设置窗口配置全局配置编辑)
    < /代码> 
    它的行为。

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

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

    结果包含gdb的同一窗口多个窗口,当前运行的线程位于图像的右上角

    enter image description here

    (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))