Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

errorformatについて(入門編)

$
0
0

この記事は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 =&errorformattrylet&errorformat=a:errfmt
    cexprjoin(a:lines,"\n")copencatch
    echo v:exception
    echo v:throwpoint
  finallylet&errorformat= temp_errorfomat
  endtryendfunction

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

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


Viewing all articles
Browse latest Browse all 5608

Trending Articles