Я начинаю с emacs, и не очень хорошо знаю elisp. На самом деле почти ничего.
Я хочу использовать ack вместо grep.
Вот инструкции, которым я следовал, чтобы использовать ack из Emacs:
http://www.rooijan.za.net/?q=ack_el
Теперь мне не нравится формат вывода, который используется в этом файле el, я хотел бы, чтобы вывод был ack --group
.
Итак, я изменился:
(read-string "Ack arguments: " "-i" nil "-i" nil)
до:
(read-string "Ack arguments: " "-i --group" nil "-i --group" nil)
Пока все хорошо.
Но это заставило меня потерять способность click-press_enter на строках буфера вывода. В исходном поведении режим компиляции использовался для возможности перехода к выбранной строке.
Я решил, что должен добавить регулярное выражение в ack-mode. Ack-режим определяется так:
(define-compilation-mode ack-mode "Ack"
"Specialization of compilation-mode for use with ack."
nil)
и я хочу добавить регулярное выражение [0-9]+:
, которое также будет определяться как ошибка, поскольку это то, что включает в себя каждая строка выходного буфера (номер строки).
Я пытался изменить define-compilation-mode
выше, чтобы добавить регулярное выражение, но с треском провалился.
Как сделать буфер вывода равным ack
, дайте мне щелкнуть по его строкам?
--- РЕДАКТИРОВАТЬ, я пробовал также: ---
(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))
Я украл это где-то и попытался приспособиться к моим потребностям. Не повезло.
--- РЕДАКТИРОВАТЬ, результат после предложения Ивана ---
С обновленным ack.el:
(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)
Затем, проверяя переменную compilation-error-regext-alist
, я получаю значение:
(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))
Я нахожу формат переменной очень странным, не так ли? Я не знаю elisp (пока), так что, возможно, это правильно.
Все еще нет ссылок или цвета в буфере * ack *.