Pregunta

Estoy empezando con emacs, y no sé mucho elisp. Casi nada, en realidad.

Quiero usar ACK como un reemplazo de grep.

Estas son las instrucciones que he seguido a utilizar ACK desde Emacs: http://www.rooijan.za.net/?q=ack_el

Ahora que no me gusta el formato de salida que se utiliza en este archivo EL, me gustaría que la salida sea la de ack --group.

Así que cambié:

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

a:

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

Hasta aquí todo bien. Pero esto me hizo perder la posibilidad de hacer clic-press_enter en las filas del búfer de salida. En el comportamiento original, compilar modo se utilizó para ser capaz de saltar a la línea seleccionada.

que pensé que debería añadir una expresión regular para el ACK-mode. El ack-modo se define así:

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

y quiero añadir el [0-9]+: expresión regular para ser detectado como un error demasiado, ya que es lo que cada fila de la salida incluye cabrón (número de línea).

He intentado modificar el define-compilation-modeabove añadir la expresión regular, pero fallé miserablemente.

¿Cómo puedo hacer que el búfer de salida de ack déjame clic en sus filas?

--- EDITAR, he intentado también: ---

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

He ganado que en algún lugar y trató de adaptarse a mis necesidades. No hubo suerte.

--- EDITAR, como resultado después de la propuesta de Ivan ---

Con ack.el actualiza para incluir:

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

A continuación, comprobar la variable compilation-error-regext-alist, consigo el valor:

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

Me parece que el formato de la variable muy extraño, ¿verdad? No sé elisp (todavía), así que quizás es correcta esa manera.

Todavía no hay enlaces o de color en el acuse de recibo * * búfer.

¿Fue útil?

Solución

Hay otro paquete full-ack arriba en ELPA que he usado antes y se ocupa de la producción --group.

Dicho esto, la lectura de la documentación para compilation-error-regexp-alist que ver que tiene la forma:

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

En el caso de la producción --group, usted tiene que coincidir con el archivo y la línea por separado, por lo que cree que quiere algo así (no probado)

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

- Actualizado -

El compilation-error-regext-alist variable es una lista de símbolos o elementos como (REGEXP ...). Los símbolos se consultan en compilation-error-regexp-alist-alist para encontrar los elementos correspondientes. Así que sí, es un poco raro, pero es más fácil de ver lo que enciende y se apaga sin tener que mirar a expresiones regulares feas y supongo que lo que hacen. Si se va a distribuir este sugeriría añadiendo la expresión regular a compilation-error-regexp-alist-alist y después de encenderlo en compilation-error-regext-alist, pero eso es algo discutible hasta conseguir que funcione correctamente.

Mirando más de cerca ack.el, noto que se utiliza

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

En otras palabras, se sobrescribe localmente compilation-error-regexp-alist con grep-regexp-alist, por lo que es necesario agregar las expresiones regulares en su lugar. O mejor aún podría ser sustituirlo por

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

Al final todavía recomiendo -ACK completo desde la expresión regular de nombre de archivo hace no parece estar funcionando correctamente. Parece más completa (aunque más complicado), y he sido feliz con él.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top