Как мне перехватить команды, отправленные в pdb через gud?

Я начал использовать pdb через gud в emacs 23.3, как я могу перехватить командные сообщения, отправленные отладчику из буфера? ниже я написал совет для использования с gdb, чтобы сохранить кольцо коминта, но не могу найти эквивалентную функцию для подключения к pdb. Я использую python-mode.el в качестве основного режима.

Благодарю.

(defadvice gdb-send-item (before gdb-save-history first nil activate)
  "write input ring on quit"
  (if (equal (type-of item) 'string) ; avoid problems with 'unprintable' structures sent to this function..
    (if (string-match "^q\\(u\\|ui\\|uit\\)?$" item)
      (progn (comint-write-input-ring)
             (message "history file '%s' written" comint-input-ring-file-name)))))

1 ответ

Решение

Я думаю, что, возможно, я мог бы ответить на свой собственный вопрос в то время, просто немного покопавшись, но первое решение GDB скорее забрало его у меня на старом фронте обучения. я выздоровел, так что..

Ch b Cs Major

после небольшой прокрутки мы можем определить 'comint-send-input' как функцию, связанную с клавишей 'enter'. Глядя на источник этой функции, comint.el:1765 - это вызов 'run-hook-with-args' .. здесь мы понимаем, что нигде конкретно 'pdb' не может делать то, что мы хотим.

gud - это универсальная оболочка для вызова внешних процессов отладки и возврата результатов.. поэтому в elisp отсутствует контроль. то же самое было и с GDB, но вокруг внешнего вызова была хорошая (уже существующая) оболочка, которая давала рекомендации этой функции чувствовать себя "чистой".

так что хак... чуть выше 'comint-send-input' лежит 'comint-add-to-input-history'.. очень просто.

;;save command history
(defadvice comint-add-to-input-history (before pdb-save-history activate compile)
  "write input ring on exit"
  (message "%s" cmd)
  (if (string-match "^e\\(x\\|xi\\|xit\\)?$" cmd)
  (progn (comint-write-input-ring)
     (message "history file '%s' written" comint-input-ring-file-name)))
)

Кстати, у меня есть эти, чтобы инициировать входное кольцо для сеансов отладки

;#debugger history
(defun debug-history-ring (file)
  (comint-read-input-ring t)
  (setq comint-input-ring-file-name file)
  (setq comint-input-ring-size 1000)
  (setq comint-input-ignoredups t))
(let ((hooks '((gdb-mode-hook . (lambda () (debug-history-ring "~/.gdbhist")))
       (pdb-mode-hook . (lambda () (debug-history-ring  "~/.pythonhist"))))))
  (dolist (hook hooks) (print (cdr hook)) (add-hook (car hook) (cdr hook))))

..и запись в файл истории, если буфер отладки уничтожен

  (add-hook 'kill-buffer-hook 'comint-write-input-ring)

веселит.

Другие вопросы по тегам