2011-06-27 10 views
2

私はツールlints pythonの変更を行い、エラーと警告を生成しています。私はこれをEmacsのコンパイルモードで使えるようにしたいと思いますが、問題があります。ファイル名は最初に一度だけ出力され、行番号だけがエラーと警告とともに表示されます。ここに例があります:複数行のEmacsコンパイルモードの正規表現

Linting file.py 
E0602: 37: Undefined variable 'foo' 
C6003: 42: Unnecessary parens after 'print' keyword 
2 new errors, 2 total errors in file.py. 

これはpylintとよく似ていますが、output-format = parseableオプションはありません。私は、コンパイル・エラー - 正規表現 - 連想リストのドキュメントをチェックし、有望な何かを見つけた:

If FILE, LINE or COLUMN are nil or that index didn't match, that
information is not present on the matched line. In that case the
file name is assumed to be the same as the previous one in the
buffer, line number defaults to 1 and column defaults to
beginning of line's indentation.

だから私は、必要に応じてファイルの行と一致し、グループでそれを引き出すだろう正規表現、その後、残りの部分を書いてみました他の行と一致します。私はそれが最初に一致すると仮定した。

Linting file.py 
E0602: 37: Undefined variable 'foo' 

その後、それは継続して一致するだろう

C6003: 42: Unnecessary parens after 'print' keyword 

ファイルなし。ファイルがないので、以前の試合のファイル名を使用する必要がありますか?私が使っている正規表現は次のとおりです。

(add-to-list 'compilation-error-regexp-alist 'special-lint) 
(add-to-list 'compilation-error-regexp-alist-alist 
     '(special-lint 
      "\\(Linting \\(.*\\)\\n\\)?\\([[:upper:]][[:digit:]]+:\\s-+\\([[:digit:]]\\)+\\).*" 
      2 4 nil nil 3)) 

私は再ビルダーと手動でスクラッチバッファにチェックインしました。期待どおりに動作します。 2番目のグループはファイル名、4番目は行番号、3番目は強調表示したいものです。私はこれを試してみてくださいたびに、私はエラーを取得する:

signal(error ("No match 2 in highlight (2 compilation-error-face)")) 

私は、コンパイルモジュールがそれを見て、私はそれを取り除くことを好むと「持っていると思います前に出力を変換する必要このための回避策を持っています純粋な "ソリューションです。私は何かアドバイスをお寄せいただき、私が行ったかもしれない間違いを指摘します。

EDITは

以下トーマスの擬似コードは非常によく働きました。彼は、後方検索をするとマッチデータが乱れる可能性があると言いました。しかしそれはsave-excursionの前にsave-match-data特別書式を追加することで解決しました。

答えて

3

FILE can also have the form (FILE FORMAT...), where the FORMATs (e.g. "%s.c") will be applied in turn to the recognized file name, until a file of that name is found. Or FILE can also be a function that returns (FILENAME) or (RELATIVE-FILENAME . DIRNAME). In the former case, FILENAME may be relative or absolute.

ファイル名にまったく一致しない正規表現を書くこともできますが、その列のみです。次に、ファイルについて、そのファイルを後方検索する関数を記述します。おそらく効率的ではないかもしれませんが、エラーメッセージを上方に移動でき、ファイル境界を超えたときに正しいファイルが識別されるという利点があります。

私はこれを試してインストールに必要なものを持っていますが、インスピレーションとして次の擬似コードを取ることはありません:special-lint-backward-search-filename内の検索機能を使用して台無しになること

(add-to-list 'compilation-error-regexp-alist-alist 
     '(special-lint 
      "^\\S-+\\s-+\\([0-9]+\\):.*" ;; is .* necessary? 
      'special-lint-backward-search-filename 1)) 

(defun special-lint-backward-search-filename() 
    (save-excursion 
    (when (re-search-backward "^Linting \\(.*\\)$" (point-min) t) 
     (list (match-string 1))))) 

は(それができますコンパイルエラーのregexpのサブグループマッチングは、吸います。

+0

私は今これで遊んでいて、それは有望に見えます。ありがとう。私はいくつかの問題を抱えています、そして、グループを台無しにする検索かもしれません。私はある方法か他の方法を見つけたときにあなたに知らせるでしょう。 –

0

あなたがここで必要なことをコンパイルすることはできないと思います。なぜなら、その後のエラーが以前に見たファイル名に関係しているとは考えていないからです。しかし、ここに別の方法があります。 flymakeプラグインを作成してください。 Flymakeは常に現在のファイルを操作しますので、行番号(およびオプションで列番号)の検索方法を伝えるだけで済みます。

ハッキングsomething like thisを試してみると、あなたはうれしく思います。

+0

このツールは単一のファイルでは機能しません。私のVCSと統合して、自分の変更だけに取り組んでいます。私はフライメークのために何かを持っていますが、私はそれが好きですが、このツールは私が使用したいと思う別の目的を持っています。 –