Настройка Emacs GDB - PullRequest
       11

Настройка Emacs GDB

7 голосов
/ 05 октября 2010

Я люблю использовать GDB в emacs. И мне больше всего нравится конфигурация, которую я получаю с "gdb-many-windows", как показано здесь:

GDB-много-окна

Тем не менее, это не идеально. Я хотел бы добавить рамку для отображения текущих запущенных потоков. Кто-нибудь знает, возможно ли настроить конфигурацию, которую дает вам "gdb-many-windows"? Или, если я не могу этого сделать, это способ создать мои собственные кадры ПОСЛЕ того, как gdb автоматически появляется в моем .emacs? Моя идеальная установка должна иметь потоки, трассировку стека, локальные переменные и большое окно исходного кода.

Ответы [ 2 ]

9 голосов
/ 05 октября 2010

Макет окна, используемый 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)))
4 голосов
/ 26 декабря 2016

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

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

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

При выходе из gdb (defadvice gdb-reset) сначала выполняется исходная функция выхода, а затем перезагружается сохраненный макет.

Результат содержит то же самое окно gdb-many-windows, текущий запущенный поток находится в правом верхнем углу изображения

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))
...