elisp компилирует, добавляет регулярное выражение для обнаружения ошибок
-
21-09-2019 - |
Вопрос
Я начинаю с 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)
Все идет нормально.Но из-за этого я потерял возможность нажимать-press_enter на строках выходного буфера.В исходном поведении режим компиляции использовался для перехода к выбранной строке.
Я решил, что мне следует добавить регулярное выражение в режим подтверждения.Режим подтверждения определяется следующим образом:
(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* по-прежнему нет ссылок или цвета.
Решение
Есть еще одно full-ack
упаковать вещи ЭЛПА который я использовал раньше и обрабатывает --group
выход.
Тем не менее, прочитав документацию для compilation-error-regexp-alist
вы видите, что он имеет форму:
(REGEXP FILE [LINE COLUMN TYPE HYPERLINK HIGHLIGHT...])
В случае --group
вывод, вам нужно сопоставить файл и строку отдельно, поэтому я думаю, вам нужно что-то вроде (непроверенного)
(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.")
-- Обновлено --
Переменная compilation-error-regext-alist
представляет собой список символов или элементов, таких как (REGEXP ...)
.Символы ищутся в compilation-error-regexp-alist-alist
найти соответствующие элементы.Так что да, это немного странно, но легче увидеть, что включено и выключено, без необходимости смотреть на уродливые регулярные выражения и гадать, что они делают.Если бы вы собирались распространять это, я бы предложил добавить регулярное выражение в compilation-error-regexp-alist-alist
а затем включив его в compilation-error-regext-alist
, но это несколько спорно, пока вы не заставите его работать правильно.
Присмотревшись к ack.el, я заметил, что он использует
(let (compile-command
(compilation-error-regexp-alist grep-regexp-alist)
...)
...
)
Другими словами, он локально перезаписывает compilation-error-regexp-alist
с grep-regexp-alist
, поэтому вам нужно вместо этого добавить туда регулярные выражения.Или еще лучше заменить его на
(let (compile-command
(compilation-error-regexp-alist ack-regexp-alist)
...)
...
)
В конце концов я все равно рекомендую полный доступ поскольку регулярное выражение имени файла, похоже, работает неправильно.Он кажется более полным (хотя и более сложным), и я им доволен.