2

行と列の範囲を考慮した最終的な実用的なソリューション:

(csharp
 "^ *\\(?:[0-9]+>\\)*\\(\\(?:[a-zA-Z]:\\)?[^:(\t\n]+\\)(\\([0-9]+\\),\\([0-9]+\\),\\([0-9]+\\),\\([0-9]+\\)) *\: \\(error\\|warning\\) *CS[0-9]+:)"
 1 (2 . 4) (3 . 5) )

以下の両方の回答は非常に役に立ちました。システムの理解が深まりました。


要約: 私の正規表現は出力文字列と一致するように機能しますが、コンパイル出力のエラーと一致するように compilation-error-regexp-alist-alist では機能しません。

コンパイル モードの正規表現が少しわかりにくいと思います。私は、エラー文字列に対してリビルドと compile.el にある元の正規表現を使用して動作することがわかっている正規表現を作成しました。

40>f:\Projects\dev\source\Helper.cs(37,22,37,45): エラー CS1061: 'foo.bar' には '関数' の定義が含まれておらず、拡張メソッド 'メソッド' が受け入れられませんタイプ 'foo.bar' の最初の引数が見つかりました (using ディレクティブまたはアセンブリ参照がありませんか?)

そして、ここに私の正規表現があります:

(pushnew '(csharp
 "^ *\\(?:[0-9]+>\\)*\\(\\(?:[a-zA-Z]:\\)?[^:(\t\n]+\\)(\\([0-9]+\\),\\([0-9]+\\),[0-9]+,[0-9]+) *\: \\(?:error *CS[0-9]+:\\)"
 2 3)
     compilation-error-regexp-alist-alist)

明らかに、出力される最初の行/列のペアに到達しようとしているだけです。(コンパイラが 2 つではなく 4 つの数値を出力していることに驚いていますが、何でも構いません。)

compile.el の edg-1 正規表現を見ると、次のようになります。

    (edg-1
 "^\\([^ \n]+\\)(\\([0-9]+\\)): \\(?:error\\|warnin\\(g\\)\\|remar\\(k\\)\\)"
 1 2 nil (3 . 4))

だから私が混乱しているのは、引数がどのように渡されるかということだと思います。edg-1 では、3 と 4 はどこから来ていますか? 彼らは捕獲グループに対応していないと思いますか?整形式のエラー メッセージに対して re-builder を介して edg-1 regexp を実行し、部分式モードに入ると、0 は一致する文字列全体に一致し、1 はファイル名とパスに一致し、2 は行番号に一致します。ドキュメンテーションを見ると (Mx describe-variable を実行したとき)、サブ式がメイン式のどの場所にあるかだけを気にしているように見えます。いずれにせよ、私は明らかに何かを誤解しています。

また、公式の csharp.el 正規表現を変更して余分な 2 つの数値を処理しようとしましたが、うまくいきませんでした。

(編集、例を少し修正、csharp 正規表現を更新)

4

2 に答える 2

2

これに関する情報が見つかりました。

このページには簡単な説明があります:
http://praveen.kumar.in/2011/03/09/make-gnu-emacs-detect-custom-error-messages-a-maven-example/

ページからの引用 -

"Each elt has the form (REGEXP FILE [LINE COLUMN TYPE HYPERLINK
HIGHLIGHT...]).  If REGEXP matches, the FILE'th subexpression
gives the file name, and the LINE'th subexpression gives the line
number.  The COLUMN'th subexpression gives the column number on
that line"

したがって、形式は次のようになります。

(REGEXP FILE [LINE COLUMN TYPE HYPERLINK HIGHLIGHT...])

正規表現をもう一度見ると、変更された BRE のように見えます。

 ^                   # BOS
 \( [^ \n]+ \)       # Group 1

 (                   # Literal '('
 \( [0-9]+ \)        # Group 2
 )                   # Literal ')'

 : [ ] 

 \(?:
      error
   \|
      warnin\(g\)    # Group 3
   \|
      remar\(k\)     # Group 4
 \)

これがedg-1です

(edg-1
 "^\\([^ \n]+\\)(\\([0-9]+\\)): \\(?:error\\|warnin\\(g\\)\\|remar\\(k\\)\\)"
 1 2 nil (3 . 4))

どこ

"^\\([^ \n]+\\)(\\([0-9]+\\)): \\(?:error\\|warnin\\(g\\)\\|remar\\(k\\)\\)"
REGEXP ^^^^^^^^

 1     2    nil    (3 . 4)
 ^     ^     ^      ^^^^^
FILE LINE  COLUMN   TYPE

"TYPE is 2 or nil for a real error or 1 for warning or 0 for info.
TYPE can also be of the form (WARNING . INFO).  In that case this
will be equivalent to 1 if the WARNING'th subexpression matched
or else equivalent to 0 if the INFO'th subexpression matched."

したがって、TYPE はこの形式です (WARNING . INFO)

In the regex,
if capture group 3 matched (ie. warnin\(g\) ) it is equivalent to a warning.
If capture group 4 matched (ie. remar\(k\) ) it is equivalent to info.  
One of these will match.  

csharp 要素情報

あなたのcsharp要素 を見て

"^ *\\(?:[0-9]+>\\)?\\(\\(?:[a-zA-Z]:\\)?[^:(\t\n]+\\)(\\([0-9]+\\),\\([0-9]+\\),[0-9]+,[0-9]+) *\: \\(?:error *CS[0-9]+:\\)"
2 3 4

そして、正規表現 (以下) には、実際にはキャプチャ グループ 4 が含まれていません。
したがって、2 3 4 の FILE LINE COLUMN は
おそらく1 2 3

エンジンが見ている正規表現は次のとおりです-

 ^ 
 [ ]* 
 \(?:
      [0-9]+ > 
 \)?
 \(                            # Group 1
      \(?:
            [a-zA-Z] : 
      \)?
      [^:(\t\n]+ 
 \)
 (                             # Literal '('
      \( [0-9]+ \)                # Group 2
      ,
      \( [0-9]+ \)                # Group 3
      ,
      [0-9]+
      ,
      [0-9]+ 
 )                             # Literal ')'
 [ ]* \: [ ] 
 \(?:
      error [ ]* CS [0-9]+ :
 \)
于 2015-01-08T00:23:56.757 に答える
1

私の水晶玉は奇妙な説明を思いつきました:compilation-error-regexp-alist-alistは一致するルールの集まりにすぎませんが、どのルールを使用するかは述べていません。したがって、新しいルールを使用する場合は、追加csharpする必要があります。compilation-error-regexp-alist

の意味については(3 . 4)、 を参照してくださいC-h v compilation-error-regexp-alist

于 2015-01-08T14:10:32.923 に答える