Создание имен файлов/номеров строки, связываемых в буфере Emacs gud

Я выполняю pdb на своих тестовых сценариях в Python через буфер gud. Когда я получаю stacktrace/failure в своем тестовом сценарии, он похож на это:

FAIL: test_foo_function (__main__.TestFoo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test/testfoo.py", line 499, in test_foo_function
    self.assertEqual('foo', 'foo')

Я хотел бы смочь сделать строку (строки) как:

File "test/testfoo.py", line 499, in test_foo_function

активируемый по щелчку и берут для выравнивания 499 в testfoo.py.

(редактируют) люди в списке режима Python, привел меня к pdbtrack, и я смог заставить его работать там. См. ответ ниже...

11
задан Martijn Pieters 30 March 2015 в 10:42
поделиться

3 ответа

Добавление к ответу Джастина:

У меня есть следующее в My Slime Config, который должен перейти в файл и строку из трассировки стека Clojure.

К сожалению, я должен признать, что на самом деле он на самом деле на самом деле работает на данный момент - функция не сможет найти правильный файл - но, насколько я могу сказать, что должно быть исправлено, меняясь CORT Project определяется или изменив структуру моих проектов на файловую систему (у меня просто не было времени или склонности к нему).

Это поднимает хорошую точку, хотя, в большинстве функтинальности, как это, как это немного сложно выяснить корневой проект в общей и портативной моде. В этом случае мы полагаемся на каталог SRC , но это, вероятно, не подходит для ваших проектов Python.

Таким образом, на месте, откуда осталось Джастина, вы сможете предпринять несколько советов из функции ниже и анализировать имя файла и номеров строк из ошибки чехол, создайте ссылку на номер строки и используйте Compilation-Parse-Errors-filename-функция и и , чтобы сделать линию в GUUD буферную ссылку.

Если вы получите это на работу, пожалуйста, добавьте ответ на свой вопрос. Я думаю, что многие люди найдут это полезным.

  (defun slime-jump-to-trace (&optional on)
    "Jump to the file/line that the current stack trace line references.
    Only works with files in your project root's src/, not in dependencies."
    (interactive)
    (save-excursion
      (beginning-of-line)
      (search-forward-regexp "[0-9]: \\([^$(]+\\).*?\\([0-9]*\\))")
      (let ((line (string-to-number (match-string 2)))
            (ns-path (split-string (match-string 1) "\\."))
            (project-root (locate-dominating-file default-directory "src/")))

        (find-file (format "%s/src/%s.clj" project-root
                           (mapconcat 'identity ns-path "/")))
        (goto-line line))))

Я также должен упомянуть, что скопировал эту функцию откуда-то в Интернете, но я не могу вспомнить URL. Похоже, из Фила Хагельберга (Technomancy) отличный стартовый комплект Emacs.

0
ответ дан 3 December 2019 в 11:20
поделиться

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

Если функция compilation-parse-errors-filename-function не вызывается, то необходимо добавить список в compilation-error-regexp-alist-alist (т.е. alist-alist, то есть не опечатка), который представляет собой список имен режимов, за которыми следуют регулярные выражения для сопоставления ошибок, а также числовые индексы совпадения номера строки, имени файла и т.д. в случае совпадения регеxp-ошибки.

2
ответ дан 3 December 2019 в 11:20
поделиться

Благодаря подсказкам Герарда Б Я понял его. Я делаю это с PDBTrack (Shell) вместо чистого PDB, но он должен работать в обоих, как я полагаю. Вам необходимо включить компиляцию-оболочку - Minor-Mode. И иметь следующий код в ваших .emacs:

;; if compilation-shell-minor-mode is on, then these regexes
;; will make errors linkable
(defun matt-add-global-compilation-errors (list)
  (dolist (x list)
    (add-to-list 'compilation-error-regexp-alist (car x))
    (setq compilation-error-regexp-alist-alist
      (cons x
            (assq-delete-all (car x)
                             compilation-error-regexp-alist-alist)))))

(matt-add-global-compilation-errors
 `(
   (matt-python ,(concat "^ *File \\(\"?\\)\\([^,\" \n    <>]+\\)\\1"
                    ", lines? \\([0-9]+\\)-?\\([0-9]+\\)?")
           2 (3 . 4) nil 2 2)
   (matt-pdb-stack ,(concat "^>?[[:space:]]*\\(\\([-_./a-zA-Z0-9 ]+\\)"
                       "(\\([0-9]+\\))\\)"
                       "[_a-zA-Z0-9]+()[[:space:]]*->")
              2 3 nil 0 1)
   (matt-python-unittest-err "^  File \"\\([-_./a-zA-Z0-9 ]+\\)\", line \\([0-9]+\\).*" 1 2)
   )
 )

(defun matt-set-local-compilation-errors (errors)
  "Set the buffer local compilation errors.

Ensures than any symbols given are defined in
compilation-error-regexp-alist-alist."
  (dolist (e errors)
     (when (symbolp e)
      (unless (assoc e compilation-error-regexp-alist-alist)
        (error (concat "Error %s is not listed in "
                       "compilation-error-regexp-alist-alist")
               e))))
  (set (make-local-variable 'compilation-error-regexp-alist)
       errors))

Затем вы можете использовать стандартную навигацию в режиме компиляции для ZIP через трассировку стека ошибок.

4
ответ дан 3 December 2019 в 11:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: