2010-01-18 2 views
10

gud 버퍼를 통해 파이썬에서 테스트 케이스에 pdb를 실행 중입니다. 내 테스트 케이스의 스택 트레이스/실패를 얻을 때, 그것은 다음과 같습니다Emacs gud 버퍼에서 파일 이름/행 번호를 링크 가능하게 함

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

클릭 할 걸릴 :

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

내가 좋아하는 라인 (들)을 만들 수 싶어요 testfoo.py에서 499 줄로.

(편집) 파이썬 모드 목록에있는 사람들은 나를 pdbtrack로 안내했으며 거기서 일할 수있었습니다. 아래 답변을 참조하십시오 ...

+1

정말 멋질 것입니다. gud 버퍼에서 테스트를 실행하기위한 설정에 대해 더 알고 싶습니다. 미안하지만 당신의 질문에 대답 할 수 없다. –

+0

나는 나의 오래된 설정 (http://panela.blog-city.com/python_and_emacs_5_pdb_and_emacs.htm)과 관련하여 내 블로그에 게시물을 올렸다. 현재 쉘 모드/파이썬 모드 (python.org 버전은 emacs 버전이 아님)와 pdbtrack –

답변

2

사용자 정의하려는 것은 compilation-parse-errors-filename-function이며 파일 이름을 사용하는 함수이며 표시 할 파일 이름의 수정 버전을 반환합니다. 이것은 버퍼 로컬 변수이므로 파이썬 오류를 표시 할 각 버퍼에 설정해야합니다 (사용할 수있는 적절한 훅이 있습니다. 파이썬 모드가 설치되어 있지 않으므로 찾을 수 없습니다). propertize을 사용하여 실제 파일을로드하는 하이퍼 링크의 역할을하는 입력 파일 버전을 리턴 할 수 있습니다. propertize는 elisp 매뉴얼에 잘 설명되어있다.

compilation-parse-errors-filename-function이 호출되지 않으면 다음의 모드 이름 목록 인 compilation-error-regexp-alist-alist (typist가 아닌 alist-alist라고 함)에 목록을 추가하려고합니다 오류를 일치시키는 정규 표현식 및 일치하는 행 번호, 파일 이름 등의 숫자 색인을 정규 표현식과 일치시킵니다. 저스틴의 대답에 추가

0

:

나는이 (가) Clojure의 스택 추적에서 파일 및 라인으로 이동하도록되어 내 점액 설정에서 다음 있습니다.

불행히도 필자는 실제로 그 기능이 올바른 파일을 찾을 수 없다는 것을 인정해야한다. 그러나 내가 말할 수있는 한, 그 파일은 project-root이 어떻게 수정 될 수 있어야 하는가? 정의되거나 파일 시스템에 대한 내 프로젝트의 구조를 변경함으로써 (필자는 시간이나 경향을 보지 못했습니다).

이렇게 좋은 점이 있지만, 이처럼 대부분의 functinality에서는 일반적이고 이식성있는 방식으로 프로젝트 루트를 찾는 것이 약간 까다 롭습니다. 이 경우 우리는 src 디렉토리를 사용하지만, 이것은 아마도 여러분의 파이썬 프로젝트에는 적절하지 않을 것입니다.

저스틴이 끝낸 곳에서 다음과 같은 몇 가지 팁을 취하고 테스트 사례 오류에서 파일 이름과 줄 번호를 파싱하고 줄 번호에 대한 링크를 만든 다음 compilation-parse-errors-filename-functionpropertize을 사용하여 gud 버퍼의 링크를 링크로 만듭니다.

작동하려면 제발 자신의 질문에 대한 답변을 추가하십시오. 많은 사람들이 유용하다고 생각합니다.

(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을 기억할 수 있습니다. Phil Hagelberg (technomancy)의 뛰어난 Emacs 스타터 키트에서 나온 것 같습니다.

4

Gerard B의 힌트 덕택으로 그것을 알아 냈습니다. 나는 순수한 pdb 대신 pdbtrack (셸)에서이 일을하고 있지만 그것은 모두 믿을 만하다. compilation-shell-minor-mode를 활성화해야합니다. 그리고 다음 코드를 가지고 있습니다.이맥스 :

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

그런 다음 표준 스택 모드 탐색을 사용하여 오류 스택 추적을 압축 할 수 있습니다.

+0

을 사용하고 있습니다. 이것은 파일/버퍼가 처음 열릴 때 작동합니다. 시간이 지남에 따라 약간의 표류가 생깁니다 (즉, 커서가 실제 줄 다음에 몇 줄이 나타납니다) –

+0

고마워요! 그러나 긴 추적 표시의 맨 위에있는 선은 클릭 할 수 있지만 아래쪽 선은 클릭 할 수 없습니다. – nealmcb