2010-01-18 3 views
10

Je lance pdb sur mes testcases en Python via le buffer gud. Quand je reçois un stacktrace/échec dans mon cas de test, il ressemble à ceci:Rendre les noms de fichiers/lignes connectables dans le tampon gud Emacs

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

J'aimerais être en mesure de faire la ligne (s) comme:

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

cliquable et prendre être à la ligne 499 dans testfoo.py. (Edit) Les gens de la liste en mode python m'ont conduit à pdbtrack et j'ai réussi à le faire fonctionner là-bas. Voir la réponse ci-dessous ...

+1

ce serait plutôt cool. Je suis curieux d'en savoir plus sur votre configuration pour exécuter des tests dans le tampon gud. désolé je ne peux pas répondre à votre question si –

+0

J'ai un post sur mon blog concernant mon ancienne configuration (http://panela.blog-city.com/python_and_emacs_5_pdb_and_emacs.htm). Suis actuellement en mode shell/mode python (version python.org pas la version emacs) et pdbtrack –

Répondre

2

Je pense que ce que vous voulez personnaliser est compilation-parse-errors-filename-function, qui est une fonction qui prend un nom de fichier, et renvoie une version modifiée du nom de fichier à afficher. Ceci est une variable locale de tampon, donc vous devriez le placer dans chaque tampon qui affichera des erreurs python (il y a probablement un hook approprié à utiliser, je n'ai pas le mode python installé donc je ne peux pas le rechercher). Vous devez utiliser propertize pour renvoyer une version du nom de fichier d'entrée qui agit comme un lien hypertexte pour charger le fichier réel. La propriété est bien documentée dans le manuel d'elisp. Si compilation-parse-errors-filename-function n'est pas appelée, alors vous voulez ajouter une liste à compilation-error-regexp-alist-alist (c'est-à-dire alist-alist, ce n'est pas une faute de frappe) qui est une liste de noms de mode suivis par des expressions régulières pour faire correspondre les erreurs, et des index numériques du numéro de ligne correspondant, du nom de fichier etc. info dans le match regexp d'erreur.

0

Ajouter à la réponse de Justin:

Je suit dans ma config de boue qui est censé passer à un fichier et la ligne à partir d'une trace de la pile de Clojure. Malheureusement, je dois admettre que cela ne fonctionne pas pour moi en ce moment - la fonction n'est pas capable de trouver le bon fichier - mais pour autant que je sache, cela devrait être réparable en changeant la façon dont project-root est défini ou en changeant la structure de mes projets sur le système de fichiers (je n'ai juste pas eu le temps ou l'envie de le regarder). Cependant, cela fait un bon point, dans la plupart des fonctinalité, il est un peu difficile de trouver la racine du projet de manière générique et portable. Dans ce cas, nous nous appuyons sur un répertoire src, mais ce n'est probablement pas approprié pour vos projets python. Donc, à la suite de l'arrêt de Justin, vous devriez pouvoir suivre quelques conseils de la fonction ci-dessous et analyser le nom de fichier et les numéros de ligne de l'erreur de test élémentaire, créer un lien vers le numéro de ligne et utiliser le compilation-parse-errors-filename-function et propertize pour faire la ligne dans le tampon gud un lien.

Si vous le faites fonctionner, s'il vous plaît ajouter une réponse à votre propre question. Je pense que beaucoup de gens le trouveraient utile.

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

Je devrais également mentionner que j'ai copié cette fonction de quelque part sur le Web, mais je ne me souviens pas de l'URL. Il semble provenir de l'excellent kit de démarrage Emacs de Phil Hagelberg (technomancie).

4

Grâce à un indice de Gerard B, je l'ai compris. Je fais ça à partir de pdbtrack (shell) au lieu de pdb pur, mais ça devrait fonctionner dans les deux je crois. Vous devez activer la compilation-shell-minor-mode. Et avoir le code suivant dans votre.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)) 

Ensuite, vous pouvez utiliser la navigation en mode de compilation standard pour passer en revue la trace de la pile d'erreurs.

+0

Notez que cela fonctionne lorsque le fichier/tampon est ouvert en premier. Au fil du temps, il semble y avoir une certaine "dérive" (ie le curseur apparaît quelques lignes après la ligne réelle) –

+0

Merci! Mais je remarque que si les lignes en haut d'une longue traceback sont cliquables, les lignes plus bas ne le sont pas. – nealmcb

Questions connexes