0

私はemacsから始めていますが、elispについてはあまり知りません。本当にほとんど何もありません。

grepの代わりにackを使用したいと思います。

これらは私が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)

ここまでは順調ですね。しかし、これにより、出力バッファーの行でclick-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))

私はそれをどこかで盗み、自分のニーズに適応しようとしました。運がない。

---編集、Ivanの提案後の結果---

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-alistされるgrep-regexp-alistため、代わりに正規表現を追加する必要があります。または、それを次のように置き換えることをお勧めします

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

結局、ファイル名の正規表現が正しく機能していないように見えるので、私はまだfull-ackをお勧めします。それはより完全に見えます(より複雑ですが)、そして私はそれに満足しています。

于 2010-03-19T18:59:49.617 に答える