2010-10-05 59 views
7

我喜欢使用GDB和emacs。而我最喜欢的配置,我用“GDB-许多窗口”得到,如下所示:定制Emacs GDB

gdb-many-windows

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

回答

9

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))) 
+0

尼斯的右上角!不过,我想了解更多有关这些部件的信息(我在Emacs内部并不完全流畅......)。什么是“周围”部分? “广告做它”? – thoni56 2014-01-16 12:37:37

+1

因此,“around”将围绕函数“setup-more-gdb-windows”(在一般情况下可能很难找到)包装此建议,并立即激活此建议。 – thoni56 2014-01-16 12:47:25

+1

“ad-do-it”是原始函数的占位符,将在占位符存在的任何位置运行。 – thoni56 2014-01-16 12:48:30

3

这是一个很老的帖子,但是后续的解决方案可以帮助别人。

下面的代码捕获gdb接口的开始和结束,改变其行为。

在GDB启动(defadvice GDB),它首先保存当前的布局,然后运行GDB和finaly准备一个新的自定义布局(很容易地编辑就为你的喜好)

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

结果包含了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)) 
+0

很好,我要去偷它! – 2017-07-05 21:57:34