J'ai donc un outil lints changements python que j'ai fait et produit des erreurs et des avertissements. Je voudrais que ce soit utilisable en mode compilation avec Emacs, mais j'ai un problème. Le nom du fichier est sorti une seule fois au début, puis seuls les numéros de ligne apparaissent avec les erreurs et les avertissements. Voici un exemple:Emacs regex en mode de compilation pour plusieurs lignes
Linting file.py
E0602: 37: Undefined variable 'foo'
C6003: 42: Unnecessary parens after 'print' keyword
2 new errors, 2 total errors in file.py.
Il est très similaire à pylint, mais il n'y a pas de sortie format option = analysable. J'ai vérifié la documentation pour la compilation-error-regexp-alist et trouvé quelque chose prometteur:
If FILE, LINE or COLUMN are nil or that index didn't match, that
information is not present on the matched line. In that case the
file name is assumed to be the same as the previous one in the
buffer, line number defaults to 1 and column defaults to
beginning of line's indentation.
J'essayé d'écrire une expression rationnelle qui en option correspondre à la ligne de fichiers et tirez dans un groupe, puis le reste correspondrait aux autres lignes. J'ai supposé qu'il serait d'abord correspondre
Linting file.py
E0602: 37: Undefined variable 'foo'
et être bien. Ensuite, il continuerait et correspondrait
C6003: 42: Unnecessary parens after 'print' keyword
sans fichier. Comme il n'y avait pas de fichier, il devrait utiliser le nom de fichier du match précédent à droite? Voici le regexp J'utilise:
(add-to-list 'compilation-error-regexp-alist 'special-lint)
(add-to-list 'compilation-error-regexp-alist-alist
'(special-lint
"\\(Linting \\(.*\\)\\n\\)?\\([[:upper:]][[:digit:]]+:\\s-+\\([[:digit:]]\\)+\\).*"
2 4 nil nil 3))
Je l'ai vérifié avec re-constructeur et manuellement dans la mémoire tampon de zéro. Il se comporte comme prévu. le 2ème groupe est le nom du fichier, le 4ème est le numéro de ligne, et le 3ème est ce que je veux mettre en surbrillance. Chaque fois que j'essaie, j'obtenir l'erreur:
signal(error ("No match 2 in highlight (2 compilation-error-face)"))
J'ai une solution pour ce qui consiste à transformer la sortie avant que le module de compilation regarde, mais je préfère se débarrasser de cela et avoir une " pure "solution". J'apprécierais n'importe quel conseil ou signaler toutes les erreurs stupides que j'ai pu avoir faites.
EDIT
code pseudo Thomas a travaillé très bien en dessous. Il a mentionné que faire une recherche en arrière pourrait gâcher les données de match, et il a fait. Mais cela a été résolu en ajoutant le formulaire spécial save-match-data
avant save-excursion
.
Je joue avec ça en ce moment, et ça semble prometteur. Merci. J'ai quelques problèmes, et c'est peut-être la recherche qui gâche les groupes. Je vous le ferai savoir quand je le découvrirai d'une façon ou d'une autre. –