elisp компилирует, добавляет регулярное выражение для обнаружения ошибок

StackOverflow https://stackoverflow.com/questions/2478656

  •  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)
      ...)
  ...
  )

В конце концов я все равно рекомендую полный доступ поскольку регулярное выражение имени файла, похоже, работает неправильно.Он кажется более полным (хотя и более сложным), и я им доволен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top