12

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 に導き、そこで動作させることができました。以下の回答を参照してください...

4

4 に答える 4

5

Gerard BI によるヒントのおかげで、それがわかりました。私は純粋な pdb ではなく pdbtrack (シェル) からこれを行っていますが、両方で動作するはずです。コンパイルシェルマイナーモードを有効にする必要があります。.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))

その後、標準のコンパイル モード ナビゲーションを使用して、エラー スタック トレースを高速で表示できます。

于 2010-01-23T06:53:52.470 に答える
2

あなたがカスタマイズしたいcompilation-parse-errors-filename-functionのは、ファイル名を取り、表示するファイル名の変更されたバージョンを返す関数であると思います。これはバッファ ローカル変数なので、Python エラーを表示する各バッファに設定する必要があります (使用する適切なフックがある可能性があります。Python モードがインストールされていないため、調べることができません)。propertize実際のファイルをロードするためのハイパーリンクとして機能する入力ファイル名のバージョンを返すために使用します。propertyize は、elisp マニュアルに詳しく記載されています。

compilation-parse-errors-filename-function が呼び出されてcompilation-error-regexp-alist-alistいない場合は、モード名のリストと一致する正規表現が続くリストを追加します (これは alist-alist と言っていますが、これはタイプミスではありません)。エラー、および一致する行番号、ファイル名などの数値インデックス。エラー正規表現一致の情報。

于 2010-01-18T23:45:54.530 に答える
0

ジャスティンの答えに追加する:

私のslimeconfigには、clojureスタックトレースからファイルと行にジャンプすることになっている次のものがあります。

残念ながら、現時点では実際には機能しないことを認めなければなりません-関数は正しいファイルを見つけることができません-しかし、私が知る限り、project-root定義方法を変更するか、ファイルシステム上のプロジェクトの構造(私はそれを調べる時間や傾向がありませんでした)。

しかし、それは良い点をもたらしますが、このようなほとんどの機能では、一般的でポータブルな方法でプロジェクトのルートを理解するのは少し難しいです。この場合、ディレクトリに依存してsrcいますが、Pythonプロジェクトにはおそらく適切ではありません。

したがって、Justinが中断したところから続けて、以下の関数からいくつかのヒントを取得し、テストケースエラーからファイル名と行番号を解析し、行番号へのリンクを作成し、とを使用compilation-parse-errors-filename-functionpropertizegudバッファ内の行にリンク。

それが機能するようになったら、あなた自身の質問に答えを追加してください。多くの人がそれを役に立つと思うでしょう。

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

また、この関数をWebのどこかからコピーしたのですが、URLを思い出せません。Phil Hagelberg(技術)の優れたEmacsスターターキットからのもののようです。

于 2010-01-19T09:14:59.383 に答える