Configuration 自定义Emacs GDB

Configuration 自定义Emacs GDB,configuration,emacs,gdb,Configuration,Emacs,Gdb,我喜欢使用GDB和emacs。我最喜欢“gdb多窗口”的配置,如下所示: 也就是说,这并不完美。我想添加一个框架来显示当前正在运行的线程。有人知道是否可以自定义“gdb多窗口”提供给您的配置吗?或者,如果我不能做到这一点,他们是一种在我的.emacs中自动出现gdb后创建我自己的帧的方法吗?我的理想设置是线程、堆栈跟踪、局部变量和一个大的源窗口。gdb许多窗口使用的窗口布局显然是在gdb设置窗口中实现的。您可以建议该函数在设置窗口时执行其他工作,如 (defadvice gdb-setup-w

我喜欢使用GDB和emacs。我最喜欢“gdb多窗口”的配置,如下所示:


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

gdb许多窗口使用的窗口布局显然是在
gdb设置窗口中实现的。您可以建议该函数在设置窗口时执行其他工作,如

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

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

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

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

在gdb退出(defadvice gdb reset)时,它首先执行原始退出功能,然后重新加载保存的布局

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


美好的不过,我想了解更多关于这些部件的信息(我对Emacs的内部结构不太熟悉…)。“周围”部分是什么?“ad do it”?因此,“around”将此建议包装在函数“setup more gdb windows”(在一般情况下可能很难找到)周围,并立即激活此建议。“ad do it”是原始函数的占位符,将在该占位符存在的任何位置运行。这很好。我要偷走它!!
(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))