[emacs] [customização do gdb] Como exibir o buffer de origem em uma janela?
Eu personalizei janelas gdb no emacs. Depois, durante a depuração, o novo código-fonte é aberto em janelas diferentes. Eu gostaria de ver o código fonte apenas em uma janela. Minha personalização do gdb é:
; _____________________________________________________________________________________
; | | |
; | BREAKPOINTS | |
; |__________________________________________| |
; | | |
; | STACK | |
; |__________________________________________| |
; | | |
; | | |
; | LOCALS | |
; | | SOURCE CODE |
; |__________________________________________| |
; | | |
; | | |
; | | |
; | | |
; | | |
; | | |
; | GDB | |
; | |__________________________________________|
; | | |
; | | |
; | | I/O |
; | | |
; |__________________________________________|__________________________________________|
(require 'gud)
; invoke
(global-set-key [f8] 'gdb)
; GDB layout
(defadvice gdb-setup-windows (after activate)
(gdb-setup-my-windows)
)
(defun gdb-setup-my-windows ()
(set-window-dedicated-p (selected-window) nil)
(switch-to-buffer gud-comint-buffer)
(delete-other-windows)
(let
((win0 (selected-window)) ; breakpoints
(win1 (split-window-horizontally
(floor (* 0.5 (window-width))))) ; source + i/o
(win2 (split-window-vertically
(floor (* 0.5 (window-body-height))))) ; gdb
(win3 (split-window-vertically
(floor (* 0.5 (window-body-height))))) ; locals
(win4 (split-window-vertically
(floor (* 0.6 (window-body-height))))) ; stack
)
(select-window win1)
; configurating right window
(let
((winSrc (selected-window)) ; source
(winIO (split-window-vertically (floor (* 0.9 (window-body-height))))) ; I/O
)
(set-window-buffer winIO (gdb-get-buffer-create 'gdb-inferior-io))
(set-window-buffer
winSrc
(if gud-last-last-frame
(gud-find-file (car gud-last-last-frame))
(if gdb-main-file
(gud-find-file gdb-main-file)
(list-buffers-noselect))))
(setq gdb-source-window winSrc)
(set-window-dedicated-p winIO t)
)
(set-window-buffer win0 (gdb-get-buffer-create 'gdb-breakpoints-buffer))
(set-window-buffer win3 (gdb-get-buffer-create 'gdb-locals-buffer))
(set-window-buffer win4 (gdb-get-buffer-create 'gdb-stack-buffer))
(select-window win2)
)
)
; GDB variables
(setq gdb-many-windows t)
(setq gdb-show-main t)
(setq gdb-show-changed-values t)
(setq gdb-use-colon-colon-notation t)
(setq gdb-use-separate-io-buffer nil)
(setq gdb-delete-out-of-scope t)
(setq gdb-speedbar-auto-raise t)
A tela principal é:tela de gdb após o início
Mas quando eu comecei a depurar, o próximo arquivo de origem é aberto em outra janela. Veja o exemplo abaixo:Novo código-fonte na janela gdb
O exemplo de aplicativo para reproduzir é:
main.cpp
#include "classB.h"
int main()
{
B *b = 0;
b = new B();
return 0;
}
classA.h
#ifndef CLASS_A_H
#define CLASS_A_H
class A
{
public:
A();
};
#endif
classA.cpp
#include "classA.h"
#include <iostream>
A::A()
{
std::cout << "Constructor A" << std::endl;
}
classB.h
#ifndef CLASS_B_H
#define CLASS_B_H
#include "classA.h"
class B : public A
{
public:
B();
};
#endif
classB.cpp
#include "classB.h"
#include <iostream>
B::B() : A()
{
std::cout << "Constructor B" << std::endl;
}
Makefile
SOURCES=main.cpp classA.cpp classB.cpp
TARGET=test
CXX_FLAGS=-g
.PHONY: all
all: $(TARGET)
$(TARGET): $(SOURCES)
$(CXX) $(CXX_FLAGS) $^ -o $@
.PHONY: clean
clean:
rm -vf $(TARGET)
Etapa para reproduzir:
Execute o emacs
M-x gdb
teste gdb -i = mi
Na janela de comando gdb, execute: start
executar: próximo
executar: passo
Meu ambiente é: Ubuntu14.04, gdb - 7.7.1, emacs - 25.1.1.
Eu tentei usarset-window-dedicado-p. Mas isso não é solução para o meu problema. Eu sou novo no emacs, me ajude por favor, o que há de errado na minha configuração?