Domanda

Sto iniziando con emacs, e non so molto elisp. Quasi niente, davvero.

Voglio usare ACK in sostituzione di grep.

Queste sono le istruzioni che ho seguito da usare ack dall'interno di Emacs: http://www.rooijan.za.net/?q=ack_el

Ora non mi piace il formato di output che viene utilizzato in questo file el, vorrei l'output ad essere quella di ack --group.

Così ho cambiato:

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

a:

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

Fin qui tutto bene. Ma questo mi ha fatto perdere la possibilità di cliccare-press_enter sulle righe del buffer di uscita. Nel comportamento originale, la compilazione in modalità stato utilizzato per essere in grado di passare alla linea selezionata.

Ho pensato che dovrei aggiungere un regexp al ACK-mode. L'ACK-mode si definisce in questo modo:

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

e voglio aggiungere il [0-9]+: regexp essere rilevata come un errore, in quanto anche essa è ciò che ogni riga del sodomita uscita include (numero di riga).

Ho provato a modificare il define-compilation-modeabove per aggiungere l'espressione regolare, ma ho fallito miseramente.

Come posso fare il buffer di output di ack lasciatemi fare clic sul suo file?

--- EDIT, ho provato anche: ---

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

ho rubato che da qualche parte e ho cercato di adattarsi alle mie esigenze. Nessuna fortuna.

--- EDIT, risultato dopo la proposta di Ivan ---

Con ack.el aggiornato per includere:

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

Poi controllare la variabile compilation-error-regext-alist, ottengo il valore:

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

Trovo il formato della variabile molto strano, non è vero? Non so elisp (ancora), quindi forse è corretto in questo modo.

Ancora nessun link o colore del * ack * buffer.

È stato utile?

Soluzione

C'è un altro pacchetto full-ack su ELPA che ho usato prima e gestisce uscita --group.

Detto questo, leggendo la documentazione per compilation-error-regexp-alist si vede che ha la forma:

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

Nel caso di uscita --group, si devono indovinare di file e la linea a parte, quindi penso che si desidera qualcosa di simile (non testato)

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

- Aggiornata -

Il compilation-error-regext-alist variabile è un elenco di simboli o elementi come (REGEXP ...). I simboli sono guardato in compilation-error-regexp-alist-alist per trovare gli elementi corrispondenti. Quindi sì, è un po 'strano, ma è più facile da vedere che cosa è acceso e spento, senza dover guardare brutti regex e indovinate un po' che fanno. Se si dovesse andare a distribuire questo vorrei suggerire di aggiungere la regex per compilation-error-regexp-alist-alist e poi accenderlo in compilation-error-regext-alist, ma che è un po 'discutibile fino ad arrivare a farlo funzionare correttamente.

Guardando più da vicino ack.el, noto che utilizza

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

In altre parole si sovrascrive localmente compilation-error-regexp-alist con grep-regexp-alist, quindi è necessario aggiungere le regex lì, invece. O meglio ancora potrebbe essere quella di sostituirlo con

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

Alla fine mi raccomando ancora full-ACK dal momento che il nome del file regex fa non sembrano funzionare correttamente. Sembra più completo (anche se più complicato), e sono stato soddisfatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top