Question

Je commence avec emacs, et je ne sais pas grand-chose elisp. Presque rien, vraiment.

Je veux utiliser ack en remplacement de grep.

Ce sont les instructions que je suivais à utiliser ack à l'intérieur emacs: http://www.rooijan.za.net/?q=ack_el

Maintenant, je n'aime pas le format de sortie qui est utilisé dans ce fichier el, je voudrais que la sortie soit celle de ack --group.

Je changé:

(read-string "Ack arguments: " "-i" nil "-i" nil)

à:

(read-string "Ack arguments: " "-i --group" nil "-i --group" nil)

Jusqu'à présent, si bon. Mais cela m'a fait perdre la possibilité de cliquer-press_enter sur les lignes de la mémoire tampon de sortie. Dans le comportement d'origine, le mode de compilation a été utilisé pour être en mesure de sauter à la ligne sélectionnée.

Je me suis dit que je devrais ajouter un regexp au ack mode. Le ack-mode est défini comme ceci:

(define-compilation-mode ack-mode "Ack"
  "Specialization of compilation-mode for use with ack."
   nil)

et je veux ajouter le [0-9]+: regexp à détecter comme une erreur aussi, car il est ce que chaque ligne de la bougre de sortie comprend (numéro de ligne).

J'ai essayé de modifier le define-compilation-modeabove d'ajouter l'expression régulière, mais j'a lamentablement échoué.

Comment puis-je faire le tampon de sortie de ack me permet de cliquer sur ses lignes?

--- EDIT, j'ai essayé aussi: ---

(defvar ack-regexp-alist 
    '(("[0-9]+:"
     2 3))
  "Alist that specifies how to match rows in ack output.")

(setq compilation-error-regexp-alist
      (append compilation-error-regexp-alist
          ack-regexp-alist))

J'ai gagné que quelque part et essayé d'adapter à mes besoins. Pas de chance.

--- EDIT, résultat après la proposition de Ivan ---

Avec ack.el mis à jour pour inclure:

(defvar ack-regexp-alist 
  '(("^[0-9]+:" ;; match the line number
     nil        ;; the file is not found on this line, so assume that it's the same as before
     0          ;; The line is the 0'th subexpression (the whole thing)
     )
    ("^[^: ]+$" ;; match a file -- this could be better
     0          ;; The file is the 0'th subexpression
     ))
  "Alist that specifies how to match rows in ack output.")

(setq compilation-error-regexp-alist
      (append compilation-error-regexp-alist
          ack-regexp-alist))


(define-compilation-mode ack-mode "Ack"
  "Specialization of compilation-mode for use with ack."
   nil) 

vérifier ensuite la variable compilation-error-regext-alist, je reçois la valeur:

(absoft ada aix ant bash borland caml comma edg-1 edg-2 epc ftnchek iar ibm irix java jikes-file jikes-line gnu gcc-include lcc makepp mips-1 mips-2 msft oracle perl rxp sparc-pascal-file sparc-pascal-line sparc-pascal-example sun sun-ada 4bsd gcov-file gcov-header gcov-nomark gcov-called-line gcov-never-called
        ("^[0-9]+:" nil 0)
        ("^[^: ]+$" 0))

Je trouve le format de la variable très étrange, non? Je ne sais pas elisp (encore), alors peut-être il est exact de cette façon.

Toujours pas de liens ou de couleur dans le * ack * tampon.

Était-ce utile?

La solution

Il y a un autre paquet full-ack sur ELPA que je l'ai utilisé avant et poignées sortie --group.

Cela dit, la lecture de la documentation pour vous compilation-error-regexp-alist voir qu'il a la forme suivante:

(REGEXP FILE [LINE COLUMN TYPE HYPERLINK HIGHLIGHT...])

Dans le cas de la production de --group, vous devez faire correspondre le fichier et la ligne séparément, donc je pense que vous voulez quelque chose comme (non testé)

(defvar ack-regexp-alist
  '(("^\\S +$" ;; match a file -- this could be better
     0          ;; The file is the 1st subexpression
     )
    ("^[0-9]+:" ;; match the line number
     nil        ;; the file is not found on this line, so assume that it's the same as before
     0          ;; The line is the 0'th subexpression (the whole thing)
     ))
  "Alist that specifies how to match rows in ack output.")

- Mise à jour -

La compilation-error-regext-alist variable est une liste des symboles ou des éléments tels que (REGEXP ...). Les symboles sont recherchés dans compilation-error-regexp-alist-alist pour trouver les éléments correspondants. Alors oui, il est un peu bizarre, mais il est plus facile de voir ce qui s'allumé et éteint sans avoir à regarder regexes laid et devinez ce qu'ils font. Si vous allez distribuer ce que je suggère d'ajouter l'expression rationnelle compilation-error-regexp-alist-alist puis tournant dans compilation-error-regext-alist, mais qui est un peu discutable jusqu'à ce que vous obtenez pour fonctionner correctement.

En regardant de plus près ack.el, je remarque qu'il utilise

(let (compile-command
      (compilation-error-regexp-alist grep-regexp-alist)
      ...)
  ...
  )

En d'autres termes, elle écrasera localement compilation-error-regexp-alist avec grep-regexp-alist, vous devez donc ajouter les expressions rationnelles là à la place. Ou mieux encore peut-être de le remplacer par

(let (compile-command
      (compilation-error-regexp-alist ack-regexp-alist)
      ...)
  ...
  )

En fin de compte, je recommande toujours plein ack depuis le nom du fichier regex ne semblent ne pas fonctionner correctement. Il semble plus complet (bien plus compliqué), et je l'ai été heureux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top