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