Help us understand the problem. What is going on with this article?

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さんっぽいです。

rbtnn
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away