0

我从emacs开始,不太了解elisp。几乎没有,真的。

我想用 ack 代替 grep。

这些是我在emacs中使用ack的说明: 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 的能力。在最初的行为中,编译模式用于能够跳转到选定的行。

我想我应该在 ack-mode 中添加一个正则表达式。ack-mode 定义如下:

(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* 缓冲区中仍然没有链接或颜色。

4

1 回答 1

2

ELPA上还有另一个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-alistgrep-regexp-alist因此您需要在那里添加正则表达式。或者更好的可能是将其替换为

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

最后,我仍然推荐full-ack,因为文件名正则表达式似乎无法正常工作。它看起来更完整(虽然更复杂),我对此很满意。

于 2010-03-19T18:59:49.617 回答