Edited at

errorformatについて(入門編)

More than 5 years have passed since last update.

この記事はVim Advent Calendar 2012 : ATND 348日目の記事になります。

昨日は@manga_osyoさんのquickrun.vim でリアルタイムに出力を行う場合の注意でした。

今回は&errorformatについて説明したいと思います。

この記事では&errorformatをどういうふうに設定すればよいのかを説明するつもりです。

&errorformatがどんな時に使われるか全く検討のつかない方はQuickfixや:makeについて

調べてから読むことをおすすめします。

また、ここで説明することは:help error-file-formatにすべて載っています。


前準備

&errorformatをいろいろと試してみるにあたり、まずは&errorformatのテスト環境をまず作りましょう。

function! TestErrFmt(errfmt,lines)

let temp_errorfomat = &errorformat
try
let &errorformat = a:errfmt
cexpr join(a:lines,"\n")
copen
catch
echo v:exception
echo v:throwpoint
finally
let &errorformat = temp_errorfomat
endtry
endfunction

これは以下のような感じで使います。


:call TestErrFmt('(%l\,%c):%m',['(1,2): abc','(13,27): xyz','hoge'])


Quickfixの出力結果

|1 col 2| abc

|13 col 27| xyz
|| hoge

簡単にこのTestErrFmt関数を説明すると、これは引数に「&errorformat文字列」と「解析する文字列」を指定し、

その結果をQuickfixに出力する関数です。

行っていることは以下のような感じです。:cexpr便利ですね!



  1. temp_errorfomatに現在の&errorformatを退避しておく。


  2. &errorformatを設定する。


  3. :cexprでTestErrFmt関数に渡された引数をもとにQuickfixを作成する。


  4. :copenでQuickfixを開く。


  5. &errorformatを元に戻す。


&errorformatの書式


カンマ(,)

&errorformatとは複数のパターンというものをカンマ(,)で区切ってある文字列のことです。


let &errorformat = 'File %f,(%l\,%c):%m'

set errorformat=File\ %f,(%l\\,%c):%m


カンマ(,)がパターンに含まれている場合には\でエスケープしなければなりません。

個人的にletのほうがエスケープがめんどくないので好みです。


基本要素

&errorformatのパターンは%Xのように%でエスケープされた特殊文字と単なる文字(例えばAとか)で

構成させています。


1.主な特殊文字



  • %f: ファイルパスにマッチする文字列。各文字は&isfnameに含まれていなければなりません。


  • %l: 行番号。単なる数字にマッチします。


  • %c: 桁番号。単なる数字にマッチします。


  • %m: エラーメッセージ。正規表現でいうところの/.*/です。

上記の特殊文字はそれぞれ%f|%l col %c| %mの形式でQuickfixの表示される部分に当たります。


2.正規表現のように扱われる特殊文字



  • %\: 単体の '\' という文字。


  • %.: 単体の '.' という文字。


  • %#: 単体の '*' という文字。


  • %[: 単体の '[' という文字。文字の範囲[]のために使われる。


  • %~: 単体の '~' という文字。

上記の特殊文字は正規表現のアトムと全く同じ扱われ方をします。


3.便利な特殊文字



  • %-G: このメッセージを無視する。これを付けるとそのパターンはQuickfixに表示されなくなります。


  • %A: 複数行メッセージの開始。


  • %C: 複数行メッセージの継続。


  • %Z: 複数行メッセージの終了。

上記の特殊文字は基本的にパターンの先頭に置きます。

それぞれ、単体では何もマッチしませんので他のものと一緒に使用します。


パターンマッチ

パターンマッチは行単位で行われ、&errorformatの先頭から順にそれぞれのパターンと

パターンマッチが行われます。

どれにもマッチしなかった場合には、単なるメッセージとしてQuickfixに表示されます。


&errorformatの使用例

まぁ簡単にまとめてみましたが、日本語で説明するのは難しいので、

先ほどのTestErrFmt関数を使っていくつか例をあげて終わりにしたいと思います。



1. TestErrFmt('$%m,%-G%.%#',['$hoge','$foo','piyo'])

Quickfixの出力結果

|| hoge

|| foo

どれにもマッチしなかった場合には、単なるメッセージとしてQuickfixに表示されるので、

最後に'%-G%.%#'のパターンをつけておくと、'%.%#'によって0文字以上の任意の文字にマッチし、

'%-G'によってQuickfixに表示されなくなるので余計な出力を消せてすごく便利です。

また、'%m'にマッチした部分しか表示されないので'$'の部分は表示されません。



2. TestErrFmt('(%l\,%c):%m',['(1,2): abc','(13,27): xyz','hoge'])

Quickfixの出力結果

|1 col 2| abc

|13 col 27| xyz
|| hoge

最後の'hoge'はどれにもマッチしなかったので単なるメッセージとしてQuickfixに表示されています。



3. TestErrFmt('%A[%f],%C%l\,%c,%Z%m',['[~/.vimrc]','12,5','hoge'])

Quickfixの出力結果

.vimrc|12 col 5|  hoge

'%A'と'%C'と'%Z'を一緒に使うことで複数行を1つの出力として扱うことができます。



4. TestErrFmt('%.%m',['hoge','foo','piyo'])

Quickfixの出力結果

|| oge

|| oo
|| iyo

'%.'は正規表現でいう/./に当たるので出力はそれに1文字消費されてしまいます。



5. TestErrFmt('%[a-i]%m',['hoge','foo','piyo'])

Quickfixの出力結果

|| oge

|| oo
|| piyo

'%[a-i]'は正規表現でいう/[a-i]/に当たるので、hogeのhとfooのfは消費されてしまいます。


終わり

以上、「errorformatについて(入門編)」でした。

これがすべてではないので、詳しくは:help error-file-formatを参照してください。

Vim Advent Calendar 2012もあと16日ですね。明日は@unmoremasterさんっぽいです。