2010-10-05 11 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

Nice! Однако я хотел бы получить немного больше информации о деталях (я не совсем уверен в Emacs-внутренностях ...). Что такое «вокруг»? "Ад-Do-It"? – thoni56

+1

Итак, «вокруг» обертывает этот совет вокруг функции «setup-more-gdb-windows» (которая, вероятно, будет трудно найти в общем случае), и она немедленно активирует этот совет. – thoni56

+1

И «ad-do-it» является заполнителем оригинальной функции, которая будет запускаться там, где этот заполнитель существует. – thoni56

3

Это очень старый пост, однако последующее решение может помочь кому-то.

Следующий код фиксирует начало и выход интерфейса gdb, изменяя его поведение.

При запуске GDB (defadvice GdB), он первым сохранить текущую схему, а затем запустить GDB и, наконец подготовить новый пользовательский макет (легко изменить его для ваших предпочтений)

В 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

Это хорошо. Я собираюсь украсть его! –

Смежные вопросы