0%

定制Emacs GDB调试窗口布局

我们在Emacs中可以方便地使用GDB,具体操作在emacser.com有详细的快捷键的教程。不过我觉得其实GDB的CLI已经很好用了。

Emacs中默认可以方便打开多窗格模式,看起来就很像平时大家用的IDE了。

我们只需要M-x gdb-many-windows就可以打开多窗格了,默认布局如下图:

我们可以看到有6个窗格,其中有GDB命令行、局部变量、源代码、程序输出、栈、断点。功能看上去虽然很强大,不过我常用的只有其中几个,于是就决定开始定制Emacs的GDB调试窗口布局。

我常用的是代码框、输出、GDB命令行以及栈,什么断点、局部变量基本可以在需要的时候用i bi locals查看就可以了,没必要弄这么小一个窗格占住位置,而且想看的时候还看不完整。

定制

于是开始按照我的心意,将其定制成如下这样。

这样用起来比较爽,没有不需要的窗格。各位看官也可以根据自己的需要配置。

gdb-many-windows的窗口布局是写死在gdb-setup-windows这个函数里面,我们最好的方法就是defadvice这个函数。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
(defadvice gdb-setup-windows (after my-setup-gdb-windows activate)
"my gdb UI"
(gdb-get-buffer-create 'gdb-stack-buffer)
(set-window-dedicated-p (selected-window) nil)
(switch-to-buffer gud-comint-buffer)
(delete-other-windows)
(let ((win0 (selected-window))
(win1 (split-window nil nil 'left)) ;code and output
(win2 (split-window-below (/ (* (window-height) 2) 3))) ;stack
)
(select-window win2)
(gdb-set-window-buffer (gdb-stack-buffer-name))
(select-window win1)
(set-window-buffer
win1
(if gud-last-last-frame
(gud-find-file (car gud-last-last-frame))
(if gdb-main-file
(gud-find-file gdb-main-file)
;; Put buffer list in window if we
;; can't find a source file.
(list-buffers-noselect))))
(setq gdb-source-window (selected-window))
(let ((win3 (split-window nil (/ (* (window-height) 3) 4)))) ;io
(gdb-set-window-buffer (gdb-get-buffer-create 'gdb-inferior-io) nil win3))
(select-window win0)
))

经过defadvice就可以修改原来定义的函数了,从而我们就可以定制UI了。

Emacs是伪装成编辑器的操作系统~~~