2010-10-05 14 views
7

Me encanta usar GDB con emacs. Y la que más me gusta la configuración que tengo con "IAE-muchas-ventanas", como se ve aquí:Personalizando Emacs GDB

gdb-many-windows

Dicho esto, no es perfecto. Me gustaría agregar un marco para mostrar los hilos actualmente en ejecución. ¿Alguien sabe si es posible personalizar la configuración que le ofrece "gdb-many-windows"? O, si no puedo hacer eso, ¿es una forma de crear mis propios marcos DESPUÉS de que gdb aparezca automáticamente en mis .emacs? Mi configuración ideal tendría hilos, rastros de pila, variables locales y una gran ventana de fuente.

Respuesta

9

El diseño de ventana utilizado por gdb-many-windows aparentemente se implementa en gdb-setup-windows. Se puede advertir que la función de hacer un trabajo adicional en la creación de ventanas, como

(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

Nice! Sin embargo, me gustaría obtener un poco más de información sobre las partes (no soy completamente fluido en Emacs-internals ...). ¿Cuál es la parte "alrededor"? "ad-do-it"? – thoni56

+1

Por lo tanto, "alrededor" envuelve este consejo acerca de la función "setup-more-gdb-windows" (que probablemente sería lo difícil de encontrar en un caso general) y activa este consejo inmediatamente. – thoni56

+1

Y "ad-do-it" es un marcador de posición para la función original, que se ejecutará allí donde exista ese marcador de posición. – thoni56

3

Es un puesto muy antiguo, sin embargo, la solución de seguimiento puede ayudar a alguien.

El siguiente código captura el inicio y la salida de la interfaz gdb, cambiando su comportamiento.

Al inicio GDB (defadvice BGF), en primer lugar, guardar la organización actual, a continuación, ejecutar el BGF y finaly preparar un nuevo diseño personalizado (que sea fácil para editarla para sus preferencias)

En la salida GDB (BGF defadvice -reset), primero ejecuta la función de salida original y luego vuelve a cargar el diseño guardado.

el resultado contiene la misma ventana de las GDB muchas ventanas, el hilo de ejecución actual se encuentran en la parte superior derecha de la imagen

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

Es bueno. ¡Lo voy a robar! –