使文件名/行号在Emacs gud缓冲区中可链接

时间:2010-01-18 18:35:03

标签: python emacs pdb gud

我正在通过gud缓冲区在Python的测试用例上运行pdb。当我在我的测试用例中得到堆栈跟踪/失败时,它看起来像这样:

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

可点击并转到testfoo.py中的第499行。

(编辑)python-mode列表上的人们带我到pdbtrack,我能够让它在那里工作。见下面的答案......

3 个答案:

答案 0 :(得分:4)

感谢Gerard B的暗示我明白了。我是从pdbtrack(shell)而不是纯pdb这样做的,但它应该适用于我相信的两个。您需要启用compilation-shell-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))

然后,您可以使用标准编译模式导航来压缩错误堆栈跟踪。

答案 1 :(得分:2)

我认为您要自定义的是compilation-parse-errors-filename-function,这是一个采用文件名的函数,并返回要显示的文件名的修改版本。这是一个缓冲局部变量,所以你应该在每个缓冲区中设置它将显示python错误(可能有一个合适的钩子使用,我没有安装python模式,所以我无法查找)。您将使用propertize返回输入文件名的版本,该文件用作加载实际文件的超链接。 “属性”在elisp手册中有详细记载。

如果没有调用compilation-parse-errors-filename-function,那么你想要一个列表添加到compilation-error-regexp-alist-alist(确实说alist-alist,这不是拼写错误),这是一个列表模式名称后跟正则表达式以匹配错误,以及错误正则表达式匹配中匹配行号,文件名等信息的数字索引。

答案 2 :(得分:0)

加入Justin的回答:

我的slime配置中有以下内容,它应该从clojure堆栈跟踪跳转到文件和行。

不幸的是我必须承认它目前对我来说实际上并不起作用 - 该功能无法找到正确的文件 - 但据我所知,这应该可以通过改变{{1定义或通过改变文件系统上我的项目的结构(我只是没有时间或倾向于调查它)。

它确实提出了一个很好的观点,在这样的大多数功能中,以通用和便携的方式找出项目根目录有点棘手。在这种情况下,我们依赖于project-root目录,但这可能不适合您的python项目。

所以继续Justin离开之后,您应该能够从下面的函数中获取一些提示,并从测试用例错误中解析文件名和行号,创建一个指向行号的链接,然后使用{ {1}}和src使compilation-parse-errors-filename-function缓冲区中的行成为链接。

如果你确实让它起作用,请为你自己的问题添加一个答案。我想很多人会发现它很有用。

propertize

我还应该提一下,我从网络上的某个地方复制了这个功能,但是我记不清了URL。它似乎来自Phil Hagelberg的(技术)优秀的Emacs入门套件。