elisp compilar, agregar una expresión regular a detección de errores
-
21-09-2019 - |
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-mode
above 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.
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.