Up: 目次   [Index]


編輯、コンパイル、修正、の流れを早くするコマンド

*quickfix.txt*  For Vim バージョン 8.1.  Last change: 2019 Oct 22


		  VIMリファレンスマニュアル    by Bram Moolenaar

この話題に關してはユーザーマニュアルの |30.1| でも紹介されてゐる。

1. QuickFix コマンドの使ひ方|quickfix|
2. エラーウィンドウ|quickfix-window|
3. 複數のエラーリストを使ふ|quickfix-error-lists|
4. :make の使ひ方|:make_makeprg|
5. :grep の使ひ方|grep|
6. コンパイラを選擇する|compiler-select|
7. エラーフォーマット|error-file-format|
8. ディレクトリスタック|quickfix-directory-stack|
9. 具體的なエラーファイルフォーマット|errorformats|

コンパイル時に |+quickfix| 機能が無效にされた場合は、QuickFix コマンドは使へない。

1. QuickFix コマンドの使ひ方

Vim には編輯-コンパイル-編輯のサイクルを加速するための特別なモードがある。これは Amiga の Manx’s Aztec C compiler の quickfix オプションにインスパイアされた。C コンパイラから出力されたエラーメッセージをファイルに保存し、Vim でそのエラーにジャンプするといふアイデアである。エラーメッセージを全部覺えておかなくても、それぞれの問題を檢證し、修正することができる。

QuickFix コマンドはより一般的に、ファイル中の位置のリストを作成し、ジャンプするために使ふことができる。例へば、|:vimgrep| はパターンにマッチした位置をリストする。スクリプト中で |getqflist()| を使つてこれらの位置を參照することができる。そのため、編輯・コンパイル・修正のサイクル以外にも多くの事に利用できる。

ファイルにエラーメッセージがあるなら "vim -q filename" で起動する:

vim -q filename

Vim の中でコマンドを實行し結果を得る方法の 1 つに |:make| コマンドがある (後述)。

各コンパイラからのエラーメッセージを解釋させるためには、オプション ’errorformat’ をセットする (下の |errorformat| を參照)。

各 QuickFix リストは QuickFix ID と呼ばれる一意な識別子を持ち、この番號は Vim セッションの中で變はらない。|getqflist()| 函數はリストに割り當てられた識別子の取得に使用できる。QuickFix リスト番號もある。この番號は、10 個以上のリストが QuickFix スタックに追加されるたびに變更される可能性がある。

ロケーションリストはウィンドウローカルな QuickFix リストである。‘:vimgrep‘, ‘:grep‘, ‘:helpgrep‘, ‘:make‘ などのコマンドは QuickFix リストを作成するが、それらに對應する ‘:lvimgrep‘, ‘:lgrep‘, ‘:lhelpgrep‘, ‘:lmake‘ などのコマンドを使ふことでロケーションリストを得ることができる。 ロケーションリストはウィンドウに關聯付けられてゐて、各ウィンドウが別々のロケーションリストを持つことができる。ロケーションリストは1個のウィンドウにだけ關聯付けることができる。ロケーションリストは QuickFix リストとは獨立してゐる。

ロケーションリストを持つウィンドウが分割されると、新しいウィンドウはロケーションリストのコピーを得る。ロケーションリストへの參照が全てなくなると、そのロケーションリストは破毀される。

全ての QuickFix リストとロケーションリストはそのリストに行はれた變更の總數を追跡する讀み込み專用の changedtick 變數を持つ。QuickFix リストが變更されるたびに、この總數はインクリメントされる。これは、リストが變更されたときだけアクションを實行することに使用できる。|getqflist() および |getloclist()| 函數は changedtick の現在の値を問ひ合はせるのに使用できる。changedtick 變數を變更することはできない。

以下の QuickFix コマンドが利用できる。ロケーションリストコマンドは QuickFix コマンドに似てゐて、QuickFix コマンドのプリフィックス ’c’ が ’l’ に置き換はつてゐる。

ロケーションリストコマンドで處理されてゐるにもかかはらず現在のウィンドウが |autocommand| により閉ぢられる場合、それは中斷される。

ロケーションリストコマンドで處理されてゐるにもかかはらず現在の QuickFix またはロケーションリストが |autocommand| に變更される場合、それは中斷される。

:cc[!] [nr]
:[nr]cc[!]

エラー [nr]を表示する。 [nr] が省略されると同じエラーが再度表示される。[!] が無く、現在のバッファに變更が有りウィンドウが1つしか無く、’hidden’ も ’autowrite’ も off である場合には、他のバッファへジャンプする事は無い。

[!] を使用して他のバッファに移る時、現在のバッファへの變更點は、’hidden’ がセットされてゐるか別のウィンドウが開いてゐるかしない場合、破毀されてしまふ。バッファ移動の際は設定 ’switchbuf’ が關係してくる。

quickfix ウィンドウで使用するときは、現在行の "." や 最終行の "$" を含む行番號を使用できる。

:ll[!] [nr]
:[nr]ll[!]

":cc" と同樣だが、QuickFix リストでなくカレントウィンドウのロケーションリストが使はれる。

:[count]cn[ext][!]

ファイル名を含むエラーリストで [count] 個後のエラーを表示する。ファイル名が無かつた場合 [count] 個後のエラーに移動する。[!] と ’switchbuf’ については |:cc| を參照。

:[count]lne[xt][!]

":cnext" と同樣だが、QuickFix リストでなくカレントウィンドウのロケーションリストが使はれる。

:[count]cN[ext][!] または
:[count]cp[revious][!]

ファイル名を含むエラーリストで [count] 個前のエラーを表示する。ファイル名が無かつた場合 [count] 個前のエラーに移動する。[!] と ’switchbuf’ については |:cc| を參照。

:[count]lN[ext][!] または
:[count]lp[revious][!]

":cNext" と ":cprevious" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:[count]cabo[ve]

カレントバッファの現在行の [count] 上のエラーに移動する。[count] を省略すると、1 が使用される。エラーがない場合は、エラーメッセージが表示される。quickfix リストのエントリは、バッファ番號と行番號でソートされてゐると假定する。同じ行に複數のエラーがある場合は、最初のエントリだけが使用される。[count] が現在の行より上のエントリの數を超えると、ファイル內の最初のエラーが選擇される。

:[count]lab[ove]

quickfix リストの代はりにカレントウィンドウの location リストが使用されることを除けば、":cabove" と同じ。

:[count]cbel[ow]

カレントバッファの現在行の [count] 下にあるエラーに移動する。[count] を省略すると、1 が使用される。エラーがない場合は、エラーメッセージが表示される。quickfix リストのエントリは、バッファ番號と行番號でソートされてゐると假定する。同じ行に複數のエラーがある場合は、最初のエントリだけが使用される。[count] が現在の行より下のエントリの數を超えると、ファイル內の最後のエラーが選擇される。

:[count]lbel[ow]

quickfix リストの代はりにカレントウィンドウの location リストが使用されることを除けば、":cbelow" と同じ。

:[count]cbe[fore]

カレントバッファ內の現在のカーソル位置の [count] 前のエラーに移動する。[count] を省略すると、1 が使用される。エラーがない場合は、エラーメッセージが表示される。quickfix リストのエントリは、バッファ、行番號および桁番號でソートされてゐると假定する。[count] が現在位置より前のエントリ數を超えると、ファイル內の最初のエラーが選擇される。

:[count]lbe[fore]

quickfix リストの代はりにカレントウィンドウの location リストが使用されることを除けば、":cbefore" と同じ。

:[count]caf[ter]

カレントバッファ內の現在のカーソル位置の [count] 後のエラーに移動する。[count] を省略すると、1 が使用される。エラーがない場合は、エラーメッセージが表示される。quickfix リストのエントリは、バッファ、行番號および桁番號でソートされてゐると假定する。[count] が現在位置以降のエントリ數を超えると、ファイル內の最後のエラーが選擇される。

:[count]laf[ter]

quickfix リストの代はりにカレントウィンドウの location リストが使用されることを除けば、":cafter" と同じ。

:[count]cnf[ile][!]

ファイル名を含むエラーリストで [count] 個後のファイルの最初のエラーを表示する。ファイル名が無いか後のファイルが無い場合には、[count] 後のエラーに移動する。[!] と ’switchbuf’ については |:cc| を參照。

:[count]lnf[ile][!]

":cnfile" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:[count]cNf[ile][!] または
:[count]cpf[ile][!]

ファイル名を含むエラーリストで [count] 個前のファイルの最後のエラーを表示する。ファイル名が無いか後のファイルが無い場合には、[count] 個前のエラーに移動する。[!] と ’switchbuf’ については |:cc| を參照。

:[count]lNf[ile][!] または
:[count]lpf[ile][!]

":cNfile" と ":cpfile" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cr[ewind][!] [nr]

[nr] のエラーを表示する。 [nr] が省略されると一番最初のエラーが表示される。|:cc| を參照。

:lr[ewind][!] [nr]

":crewind" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cfir[st][!] [nr]

":crewind" と同じ。

:lfir[st][!] [nr]

":lrewind" と同じ。

:cla[st][!] [nr]

[nr] のエラーを表示する。 [nr] が省略されると一番最後のエラーが表示される。|:cc| を參照。

:lla[st][!] [nr]

":clast" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cq[uit][!]

Vim をエラーとして終了することで、コンパイラが同じファイルをコンパイルする事が無くなる。

警告:
ファイルに對する變更はすべて失はれる ([!] を指定しなくても)! このコマンドは、システムへの戾り値が非零であるといふこと以外 ":qall!" |:qall| と同じである。

:cf[ile][!] [errorfile]

エラーファイルを讀みこみ最初のエラーへ移動する。Vim がオプション -q で起動された時には自動的に行はれる。コンパイルの閒 Vim を實行したままにしたい時に使ふことができる。エラーファイルの名前を與へればオプション ’errorfile’ に [errorfile] が設定される。[!] については |:cc| を參照。

エラーファイルのエンコーディングが ’encoding’ と異なる場合には、’makeencoding’ オプションでエンコーディングを指定できる。

:lf[ile][!] [errorfile]

":cfile" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。コマンドラインオプション -q を使つてロケーションリストを設定することはできない。

:cg[etfile] [errorfile]

エラーファイルを讀み込む。":cfile" に似てゐるが、最初のエラーに移動しない。

エラーファイルのエンコーディングが ’encoding’ と異なる場合には、’makeencoding’ オプションでエンコーディングを指定できる。

:lg[etfile] [errorfile]

":cgetfile" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:caddf[ile] [errorfile]

エラーファイルを讀み込み、現在の QuickFix リストにエラーを追加する。QuickFix リストがまだない場合は、新しいリストが作成される。

エラーファイルのエンコーディングが ’encoding’ と異なる場合には、’makeencoding’ オプションでエンコーディングを指定できる。

:laddf[ile] [errorfile]

":caddfile" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cb[uffer][!] [bufnr]

カレントバッファからエラーリストを讀み込む。 [bufnr] を指定すると、カレントバッファの代はりにそのバッファが使はれる。bufnr には讀み込まれてゐるバッファ番號を指定しなければならない。

範圍を指定すると、讀み込む行を指定することができる。範圍指定がないとバッファ全體が使はれる。[!] については |:cc| を參照。

:lb[uffer][!] [bufnr]

":cbuffer" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cgetb[uffer] [bufnr]

カレントバッファからエラーリストを讀み込む。":cbuffer" と同じだが、最初のエラーにジャンプしない點が異なる。

:lgetb[uffer] [bufnr]

":cgetbuffer" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cad[dbuffer] [bufnr]

カレントバッファからエラーリストを讀み込み、現在の QuickFix リストにエラーを追加する。QuickFix リストがまだ存在しない場合は、新しいリストが作成される。それ以外は ":cbuffer" と同じ。

:laddb[uffer] [bufnr]

":caddbuffer" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cex[pr][!] {expr}

{expr} の結果を使つて QuickFix リストを作成し、最初のエラーにジャンプする。

{expr} が文字列のときは、その文字列を改行コードで區切り、各行を ’errorformat’ のグローバル値に從つて解釋し、結果を QuickFix リストに追加する。

{expr} がリストのときはリストの各文字列要素を解釋し、QuickFix リストに追加する。リスト中の文字列でない要素は無視される。[!] については |:cc| を參照。

例:

:cexpr system('grep -n xyz *')
:cexpr getline(1, '$')
:lex[pr][!] {expr}

|:cexpr| と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cgete[xpr] {expr}

{expr} の結果を使つて QuickFix リストを作成する。|:cexpr| と同樣だが、最初のエラーにジャンプしない點が異なる。

:lgete[xpr] {expr}

|:cgetexpr| と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cadde[xpr] {expr}

{expr} を評價し、結果の行を現在のQuickFixリストに追加する。QuickFix リストがまだ無い場合は、新しいリストが作成される。現在のカーソル位置は變はらない。より詳しくは |:cexpr| を參照。

例:

:g/mypattern/caddexpr expand("%") . ":" . line(".") .  ":" . getline(".")
:lad[dexpr] {expr}

":caddexpr" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cl[ist] [from] [, [to]]

有效なエラーを全て列擧する |quickfix-valid|。[from] 及び/もしくは [to] で行數を指定された場合、その範圍のエラーが表示される。負であつた場合最後のエラーから數へる。-1 が最後のエラーとなる。設定 ’switchbuf’ がバッファの移動に關係する。 |:filter| コマンドは與へられたパターンにマッチしてゐる Quickfix エントリのみを表示するのに使ふことができる。パターンはファイル名、モジュール名、エントリのテキストに對してマッチされる。

:cl[ist] +{count}

現在と次の {count} 個の有效なエラーを列擧する。これは ":clist from from+count" と似てゐる。ここで "from" はエラーの現在の場所である。

:cl[ist]! [from] [, [to]]

全てのエラーを表示する。

:cl[ist]! +{count}

現在と次の {count} 個のエラー行を列擧する。これは現在の評價されてゐない行の後にある評價されてゐない行を見るのに便利である。例へば ":clist" は次のやうに表示する:

8384 testje.java:252: error: cannot find symbol

それから ":cl! +3" を使ふと、結果はかうだ:

8384 testje.java:252: error: cannot find symbol
8385:   ZexitCode = Fmainx();
8386:               ^
8387:   symbol:   method Fmainx()
:lli[st] [from] [, [to]]

":clist" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:lli[st]! [from] [, [to]]

カレントウィンドウのロケーションリストの中身を全部表示する。

正しいエラーの位置は隱されたマークによつて示されてゐるので、例へ行を插入したり削除したとしても問題はない (Manx’s Z editor ではさうではない)。時々マークが幾つかの理由で消されてしまふ事があり、メッセージ "line changed" がその警告となる。一度 Vim を終了し再起動した場合マークは失はれ正しいエラー位置は把握できない。

QuickFix コマンド (’:make’, ’:grep’ など) を實行する前後に 2 つの自動コマンドが利用できる。詳しくは |QuickFixCmdPre| と |QuickFixCmdPost| を參照。

encoding’ とロケールが異なる場合、コンパイラのエラーメッセージと Vim 內部のエンコーディングが異なる場合がある。次のやうにすれば、このメッセージを變換できる:

function QfMakeConv()
   let qflist = getqflist()
   for i in qflist
      let i.text = iconv(i.text, "cp936", "utf-8")
   endfor
   call setqflist(qflist)
endfunction

au QuickfixCmdPost make call QfMakeConv()

代はりに ’makeencoding’ オプションを使ふこともできる。

すべての QuickFix リストとロケーションリストはタイトルを持つ。デフォルトではタイトルはそのリストを作成したコマンドに設定される。|getqflist()| と |getloclist()| 函數はそれぞれ QuickFix リストとロケーションリストのタイトルを取得するために使はれる。|setqflist()| と |setloclist()| 函數はそれぞれ QuickFix リストとロケーションリストのタイトルを變更するために使はれる。例:

call setqflist([], 'a', {'title' : 'Cmd output'})
echo getqflist({'title' : 1})
call setloclist(3, [], 'a', {'title' : 'Cmd output'})
echo getloclist(3, {'title' : 1})

いづれかの quickfix コマンド (例へば |:cc|, |:cnext|, |:cprev| 等) を使用して quickfix/location リストエントリに移動すると、そのエントリが現在選擇されてゐるエントリになる。quickfix/location リストで現在選擇されてゐるエントリのインデックスは、getqflist()/getloclist() 函數を使つて取得できる。例:

echo getqflist({'idx' : 0}).idx
echo getqflist({'id' : qfid, 'idx' : 0}).idx
echo getloclist(2, {'idx' : 0}).idx

新しい quickfix リストの場合、最初のエントリが選擇され、インデックスは 1 になる。すべての quickfix/location リスト內のすべてのエントリは、setqflist() 函數を使用して現在選擇されてゐるエントリとして設定できる。例:

call setqflist([], 'a', {'idx' : 12})
call setqflist([], 'a', {'id' : qfid, 'idx' : 7})
call setloclist(1, [], 'a', {'idx' : 7})

あなたは QuickFix リストとロケーションリストの中の項目の數をそれぞれ |getqflist()| と |getloclist()| 函數を使用して取得できる。例:

echo getqflist({'size' : 1})
echo getloclist(5, {'size' : 1})

任意の Vim の型は QuickFix リストまたはロケーションリストとのコンテキストとして關聯付けることができる。|setqflist()| と |setloclist()| 函數はコンテキストを QuickFix とロケーションリストにそれぞれ關聯付けることに使用できる。|getqflist()| と |getloclist()| 函數はそれぞれ QuickFix とロケーションリストのコンテキストの取得に使用できる。これは複數の QuickFix/ロケーションリストを取り扱ふ Vim プラグインにとつて便利である。

例:

let somectx = {'name' : 'Vim', 'type' : 'Editor'}
call setqflist([], 'a', {'context' : somectx})
echo getqflist({'context' : 1})

let newctx = ['red', 'green', 'blue']
call setloclist(2, [], 'a', {'id' : qfid, 'context' : newctx})
echo getloclist(2, {'id' : qfid, 'context' : 1})

|getqflist()| 函數を使用して QuickFix リストを作成または變更せずに、’errorformat’ を使用して行のリストをパースできる。例:

echo getqflist({'lines' : ["F1:10:Line10", "F2:20:Line20"]})
echo getqflist({'lines' : systemlist('grep -Hn quickfix *')})

これは ’items’ キーに行からパースされた QuickFix の項目のリストが含まれてゐる辭書を返す。以下は ’errorformat’ オプションを變更せずにカスタム ’errorformat’ を使つて行をパースする方法を示してゐる:

echo getqflist({'efm' : '%f#%l#%m', 'lines' : ['F1#10#Line']})

QuickFix リストやロケーションリスト中のバッファに對してコマンドを實行:

:cdo[!] {cmd}

QuickFix リスト中の有效な各項目に對して {cmd} を實行する。以下の操作と同樣に動作する:

:cfirst
:{cmd}
:cnext
:{cmd}
etc.

カレントファイルが破毀できず(|abandon|)、かつ [!] が與へられない場合、このコマンドは失敗する。次のエントリへの移動が失敗すると、實行は停止する。最後のバッファ (またはエラーが起こつたバッファ) がカレントウィンドウになる。{cmd} の中では ’|’ で複數のコマンドを連結できる。

QuickFix リスト中の有效な項目のみが使はれる。「範圍」を指定して項目を選擇することができる。例:

:10,$cdo cmd

かうすることで 1 番目から 9 番目までをスキップできる。

Note:
このコマンドを實行してゐる閒、Syntax 自動コマンドイベントが ’eventignore’ に追加され、無效化される。これは各バッファの編輯を大幅にスピードアップさせる。

|:bufdo|, |:tabdo|, |:argdo|, |:windo|, |:ldo|, |:cfdo|, |:lfdo| も參照。

:cfdo[!] {cmd}

QuickFix リスト中の各ファイルに對して {cmd} を實行する。以下の操作と同樣に動作する:

:cfirst
:{cmd}
:cnfile
:{cmd}
etc.

それ以外は ‘:cdo‘ の場合と同樣である。

:ld[o][!] {cmd}

カレントウィンドウのロケーションリスト中の有效な各項目に對して {cmd} を實行する。以下の操作と同樣に動作する:

:lfirst
:{cmd}
:lnext
:{cmd}
etc.

ロケーションリスト中の有效な項目のみが使はれる。それ以外は ‘:cdo‘ の場合と同樣である。

:lfdo[!] {cmd}

カレントウィンドウのロケーションリスト中の各ファイルに對して {cmd} を實行する。以下の操作と同樣に動作する:

:lfirst
:{cmd}
:lnfile
:{cmd}
etc.

それ以外は ‘:cdo‘ の場合と同樣である。

QUICKFIX または LOCATIONリストのフィルタリング:

quickfix リストのエントリ數が多すぎる場合は、cfilter プラグインを使用してエントリ數を減らすことができる。プラグインをロードする:

packadd cfilter

その後で、以下のコマンドを使つて、quickfix/location リストをフィルタすることができる:

:Cfilter[!] /{pat}/
:Lfilter[!] /{pat}/

|:Cfilter| コマンドは、現在の quickfix リストの {pat} に一致するエントリから新しい quickfix リストを作成する。{pat} は Vim の正規表現 |regular-expression| パターンである。ファイル名とエントリのテキストの兩方が {pat} と照合される。オプションの ! が指定された場合、{pat} と一致しないエントリが使用される。パターンは、次のいづれかの文字を使用して任意に圍むことができる: ’, ", /。パターンが空の場合は、最後に使用された檢索パターンが使用される。

|:Lfilter| コマンドは |:Cfilter| と同じ動作をするが、カレント location リストを操作する。

2. エラーウィンドウ

:cope[n] [height]

現在のエラーリストを表示するウィンドウを開く。

[height] が與へられたとき、(餘地があれば) ウィンドウの高さがその値になる。[height] を省略したときはウィンドウの高さは 10 行になる。

すでに QuickFix ウィンドウがある場合はそれがカレントウィンドウになる。2 個目の QuickFix ウィンドウを開くことはできない。[height] が指定されたとき、既存のウィンドウはその高さにリサイズされる。

ウィンドウは ’buftype’ の値が "quickfix" である特別なバッファを含んでゐる。これを變更してはならない!ウィンドウは w:quickfix_title 變數を持つてゐる。この變數は quickfix リストを生成したコマンドを示してゐる。變數の値は ’statusline’ が適切に調整されてゐればステータスラインに表示される。このバッファが quickfix のコマンドまたは函數により變更さるたびに、|b:changedtick| 變數はインクリメントされる。このバッファにおける變數の値は getqflist() や getloclist() 函數を用い ’qfbufnr’ アイテムを通して取得できる。location リストの場合は、location リストが削除されるときに、このバッファも削除される。

:lop[en] [height]

カレントウィンドウのロケーションリストを表示するウィンドウを開く。カレントウィンドウにロケーションリストが存在するときだけ動作する。一度に 2 個以上のロケーションリストを開くことができる。それ以外は ":copen" と同樣。

:ccl[ose]

QuickFix ウィンドウを閉ぢる。

:lcl[ose]

カレントウィンドウのロケーションリストを表示してゐるウィンドウを閉ぢる。

:cw[indow] [height]

認識されたエラーがあるとき QuickFix ウィンドウを開く。ウィンドウがすでに開いてゐて認識されたエラーがない場合はウィンドウを閉ぢる。

:lw[indow] [height]

":cwindow" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cbo[ttom]

QuickFix ウィンドウの最後の行にカーソルを移動し、見える樣にスクロールする。これは非同期コールバックでエラーを追加するのに便利である。大量の更新に伴ふ多くの再描畫を避けるには一度限り呼び出すこと。

:lbo[ttom]

現在のウィンドウに關するロケーションリストが表示されてゐるウィンドウである事を除いて ":cbottom" と同じ。

通常、QuickFixウィンドウはスクリーンの一番下に現れる。垂直分割したウィンドウがある場合は、一番右下に現れる。常に最大幅を占めるやうにさせたい場合は

:botright cwindow

とする。このウィンドウを |window-moving| コマンドで移動させることもできる。例へば、一番上に移動させたければ CTRL-W K とする。’winfixheight’ オプションが設定されれば、’winheight’ と ’equalalways’ を無視し、たいていその高さを維持する。高さを手動で變更することもできる (例へばステータスラインをマウスで上へドラッグするなど)。

QuickFix ウィンドウには各行に 1 個ずつエラーが表示される。その行數はエラー番號に等しい。現在の項目は QuickFixLine ハイライティングでハイライトされる。あなたはそれをあなたの好みに變更することができる。例:

:hi QuickFixLine ctermbg=Yellow guibg=Yellow

":.cc" でカーソル下のエラーに移動できる。<Enter> キーを押すのと行をダブルクリックするのは同じ效果がある。そのエラーを含むファイルが QuickFix ウィンドウの上に開かれる。そのファイルがすでにウィンドウに開かれてゐたらそのウィンドウがアクティブになる。そのウィンドウにあるバッファが變更されてゐて、そのエラーが別のファイルにある場合はエラーへの移動は失敗する。まづ、そのウィンドウが破毀してもよいバッファを含んでゐることを確かめなければならない。 CTRL-W <Enter>を使ふと、新しいウィンドウを開いてそこでエラーにジャンプできる。

QuickFix ウィンドウが一杯になつたとき、2 つの自動コマンドイベントが發生する。第一は ’filetype’ オプションが "qf" にセットされ、FileType イベントが發生する (|qf.vim| も參照してください)。それから BufReadPost イベントが發生する。そのときのバッファ名は "quickfix" となる。これを使つてエラーリストに對して操作を行ふことができる。例:

au BufReadPost quickfix  setlocal modifiable
        \ | silent exe 'g/^/s//\=line(".")." "/'
        \ | setlocal nomodifiable

これは各行に行番號を追加する。文字列の置換 ":s" コマンドの中で使はれてゐる "\=" に注目。これは式を評價するのに使はれる。BufWinEnter イベントも發生する。ここでもバッファ名は "quickfix" になる。

Note:
存在する QuickFix リストに追加される場合、autocommand イベントは發生しません。

Note:
QuickFix ウィンドウ內で變更を加へてもエラーのリストには何の影響もない。變更を防ぐために ’modifiable’ がオフになつてゐる。それでも行を削除や插入した場合は、テキストとエラー番號の關係がめちやくちやになる。本當にエラーリストを變更したいのなら、QuickFix ウィンドウの內容をファイルに保存し、":cfile" を實行、ファイルをパースさせ、新しいエラーリストとして使ふこと。

ロケーションリストウィンドウはロケーションリストの中身を表示する。ロケーションウィンドウを開くと、カレントウィンドウの下に開かれ、カレントウィンドウのロケーションリストが表示される。ロケーションリストは QuickFix ウィンドウに似てゐるが、一度に 2 個以上のロケーションリストウィンドウを開ける點が異なる。このウィンドウ內でロケーションリストコマンドを使ふと、表示されてゐるロケーションリストが使はれる。

ロケーションリストウィンドウからファイルを選擇すると、以下のステップによつて、そのファイルを編輯するウィンドウが探される。

  1. ロケーションリストウィンドウに表示されてゐるロケーションリストに關聯付けられてゐるウィンドウがあるなら、そのウィンドウが使はれる。
  2. 上のステップが失敗した場合、そのファイルが既に他のウィンドウで開かれてゐるなら、そのウィンドウが使はれる。
  3. 上のステップが失敗した場合、’buftype’ がセットされてゐないバッファを表示してゐるウィンドウが存在するなら、そのウィンドウが使はれる。
  4. 上のステップが失敗した場合、新しいウィンドウでファイルが開かれる。

上の全ての場合において、選擇されたウィンドウに對してまだロケーションリストが關聯付けられてゐなかつた場合、ロケーションリストウィンドウに表示されてゐるロケーションリストが關聯づけられる。

|getqflist()| と |getloclist()| 函數を使用して、QuickFix ウィンドウとロケーションリストウィンドウのウィンドウ ID をそれぞれ取得できる (もしあれば)。例:

echo getqflist({'winid' : 1}).winid
echo getloclist(2, {'winid' : 1}).winid

|getqflist()| 函數と |getloclist()| 函數は、それぞれ quickfix とロケーションリストのさまざまな屬性を取得するのに使用できる。これらの函數の使用例を以下に示す:

" 現在の QuickFix リストのタイトルを取得する
:echo getqflist({'title' : 0}).title

" 現在の QuickFix リストの識別子を取得する
:let qfid = getqflist({'id' : 0}).id

" スタックの中の 4 番目の QuickFix リストの識別子を取得する
:let qfid = getqflist({'nr' : 4, 'id' : 0}).id

" 特定の識別子を持つ QuickFix リストが存在するかどうかを檢査する
:if getqflist({'id' : qfid}).id == qfid

" スタックの中の現在の QuickFix リストのインデックスを取得する
:let qfnum = getqflist({'nr' : 0}).nr

" 識別子により指定された QuickFix リストの items を取得する
:echo getqflist({'id' : qfid, 'items' : 0}).items

" id により指定された QuickFix リストの中の項目の數を取得する
:echo getqflist({'id' : qfid, 'size' : 0}).size

" スタックの中の 3 番目の QuickFix リストの context を取得する
:echo getqflist({'nr' : 3, 'context' : 0}).context

" スタックの中の QuickFix リストの數を取得する
:echo getqflist({'nr' : '$'}).nr

" 現在の QuickFix リストが變更された回數を取得する
:echo getqflist({'changedtick' : 0}).changedtick

" 識別子により指定された QuickFix リストの中の現在の項目を取得する
:echo getqflist({'id' : qfid, 'idx' : 0}).idx

" 識別子を使用して全ての QuickFix リスト屬性を取得する
:echo getqflist({'id' : qfid, 'all' : 0})

" lines のリストの値からテキストをパースして QuickFix リストを返す
:let myList = ["a.java:10:L10", "b.java:20:L20"]
:echo getqflist({'lines' : myList}).items

" カスタム 'efm' を使用してテキストをパースして QuickFix リストを返す
:echo getqflist({'lines' : ['a.c#10#Line 10'], 'efm':'%f#%l#%m'}).items

" QuickFix リストのウィンドウ ID を取得する
:echo getqflist({'winid' : 0}).winid

" QuickFix リストのウィンドウのバッファ番號を取得する
:echo getqflist({'qfbufnr' : 0}).qfbufnr

" 現在のロケーションリストの context を取得する
:echo getloclist(0, {'context' : 0}).context

" 3 番目のウィンドウのロケーションリストのウィンドウ ID を取得する
:echo getloclist(3, {'winid' : 0}).winid

" 3番目のウィンドウのロケーションリストのバッファ番號を取得する
:echo getloclist(3, {'qfbufnr' : 0}).qfbufnr

" ロケーションリストウィンドウ (winnr: 4) のファイルウィンドウ ID を取得する
:echo getloclist(4, {'filewinid' : 0}).filewinid

|setqflist()| 函數と |setloclist()| 函數は、それぞれ quickfix とロケーションリストのさまざまな屬性を設定するのに使用できる。これらの函數の使用例を以下に示す:

" title と context を持つ空の QuickFix リストを作成する
:let t = 'Search results'
:let c = {'cmd' : 'grep'}
:call setqflist([], ' ', {'title' : t, 'context' : c})

" 現在の QuickFix リストの title を設定する
:call setqflist([], 'a', {'title' : 'Mytitle'})

" 識別子により指定された QuickFix リストの現在のエントリを變更する
:call setqflist([], 'a', {'id' : qfid, 'idx' : 10})

" 識別子により指定された QuickFix リストの context を設定する
:call setqflist([], 'a', {'id' : qfid, 'context' : {'val' : 100}})

" コマンド出力から新しい QuickFix リストを作成する
:call setqflist([], ' ', {'lines' : systemlist('grep -Hn main *.c')})

" カスタム 'efm' を使用してテキストをパースして特定の QuickFix リストに追加する
:call setqflist([], 'a', {'id' : qfid,
            \ 'lines' : ["a.c#10#L10", "b.c#20#L20"], 'efm':'%f#%l#%m'})

" 識別子により指定された QuickFix リストに items を追加する
:let newItems = [{'filename' : 'a.txt', 'lnum' : 10, 'text' : "Apple"},
                \ {'filename' : 'b.txt', 'lnum' : 20, 'text' : "Orange"}]
:call setqflist([], 'a', {'id' : qfid, 'items' : newItems})

" 識別子により指定された QuickFix リストを空にする
:call setqflist([], 'r', {'id' : qfid, 'items' : []})

" スタックの中の全ての QuickFix リストを開放する
:call setqflist([], 'f')

" 4 番目の QuickFix リストの title を設定する
:call setqflist([], 'a', {'nr' : 4, 'title' : 'SomeTitle'})

" スタックの最後に新しい QuickFix リストを作成する
:call setqflist([], ' ', {'nr' : '$',
                    \ 'lines' : systemlist('grep -Hn class *.java')})

" コマンド出力から新しいロケーションリストを作成する
:call setloclist(0, [], ' ', {'lines' : systemlist('grep -Hn main *.c')})

" 3 番目のウィンドウのロケーションリスト項目を置き換へる
:call setloclist(3, [], 'r', {'items' : newItems})

3. 複數のエラーリストを使ふ

これまでは 1 つだけのエラーリストがあると假定してきた。實際は最後に使つた 10 個迄のエラーリストが記憶される。新しいリストではじめた時には、以前のリストは自動的に保存される。古いエラーリストにアクセスするために、2 つのコマンドが用意されてゐる。これらは存在するエラーリストの內 1 つを現在のエラーリストに設定する。

:col[der] [count]

古いエラーリストへ移動する。[count] が與へられると、その回數繰り返し移動する。既に一番古いエラーリストにゐる場合、エラーメッセージが表示される。

:lol[der] [count]

‘:colder‘ と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:cnew[er] [count]

新しいエラーリストへ移動する。[count] が與へられると、その回數繰り返し移動する。既に一番新しいエラーリストにゐる場合、エラーメッセージが表示される。

:lnew[er] [count]

‘:cnewer‘ と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:[count]chi[story]

エラーリストの一覽を表示する。現在のリストは ">" でマークされる。出力は以下の樣になる:

  error list 1 of 3; 43 errors
> error list 2 of 3; 0 errors
  error list 3 of 3; 15 errors

[count] が與へられると、count 番目の QuickFix リストがカレントリストになる。例:

" 4 番目の QuickFix リストをカレントにする
:4chistory
:[count]lhi[story]

ロケーションリストの一覽を表示する。‘:chistory‘ の樣に。

新しいエラーリストが追加された時には、それがカレントリストとなる。

":colder" が實行された後で ":make" や ":grep" が實行され新しいエラーリストが追加されたときは 1 個新しいリストが上書きされる。これは ":grep" |grep| でブラウジングしてゐるときに特に便利である。もつと最近のエラーリストを殘しておきたい場合は初めに ":cnewer 99" を行ふこと。

quickfix やロケーションリストのスタック數を取得するには、特別な値 ’$’ に設定されたリスト番號でそれぞれ、|getqflist()| 函數と |getloclist()| 函數を使用できる。例:

echo getqflist({'nr' : '$'}).nr
echo getloclist(3, {'nr' : '$'}).nr

スタック內の現在のリスト番號を取得するには:

echo getqflist({'nr' : 0}).nr

4. :make の使ひ方

:mak[e][!] [arguments]
  1. |QuickFixCmdPre| に關聯付けられた自動コマンドが全て實行される。
  2. オプション ’autowrite’ が on ならば變更のあるバッファは保存される。
  3. makeef’ からエラーファイルの名前が生成される。’makeef’ が "##" を含まずかつ既に名前が存在する場合それは削除される。
  4. オプション ’makeprg’ で與へられたプログラム (省略時 "make") が [argument] をオプションにして實行され、出力が errorfile に保存される (Unix ではそれも畫面に echo される)。
  5. errorformat’ を使つて errorfile が讀みこまれる。
  6. |QuickFixCmdPost| に關聯付けられた自動コマンドが全て實行される。後述のサンプルを參照。
  7. [!] が與へられてゐないときは最初のエラーに移動する。
  8. エラーファイルが削除される。
  9. |:cnext| や |:cprevious| などのコマンドでエラー閒を移動できる。上を參照。

このコマンドは如何なるコメントも受けつけず、どんな " といふ文字も argument の一部とみなされる。プログラム出力のエンコーディングが ’encoding’ と異なる場合には、’makeencoding’ オプションでエンコーディングを指定できる。

:lmak[e][!] [arguments]

":make" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

コマンド ":make" はオプション ’makeprg’ で與へられるコマンドを實行する。これはオプション ’shell’ で與へられたシェルにコマンドを渡す事で實行されてゐる。以下をタイピングするのとほぼ同じである。

":!{makeprg} [arguments] {shellpipe} {errorfile}".

{makeprg}は ’makeprg’ オプションで指定された文字列である。"make" に限らず、どんなコマンドでも使用できる。’%’ と ’#’ の文字は通常通りコマンドライン中で展開される。擴張子無しの現在ファイル名を表すのに "%<"、擴張子無しの代替ファイル名を表すのに "#<" が使へる。例へば:

:set makeprg=make\ #<.o
[arguments] ":make" より後に入力した全て。
{shellpipe} オプション ’shellpipe
{errorfile} オプション ’makeef’。"##" は一意な名前にする

コマンドが arguments の後にオプションを必要とするならば、{makeprg} の中で引數リストに展開される置換子 "$*" が使用できる。$* は引數全てに置換へられる。例:

:set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}

またはより單純に

:let &mp = 'latex \\nonstopmode \\input\{$*}'

"$*" は次の例のやうに何度でも與へる事ができる:

:set makeprg=gcc\ -o\ $*\ $*

オプション ’shellpipe’ の省略値は Amiga, MS-DOS と Win32 では ">" である。これはコンパイラの出力が直接ファイルに出力されスクリーンには出力されないことを意味する。Unix では "| tee" が使用される。コンパイラがファイルに出力すると同時にスクリーンにも表示される。使つてゐるシェルに應じて標準エラーへの出力も含めるために "|& tee" や "2>&1| tee" が省略値となる。

shellpipe’ が空の場合、{errorfile} が省略される。これはコンパイラ自身がエラーファイルを作成する場合 (Manx’s Amiga C) に便利である。

QuickFixCmdPost を使つてエンコーディングを修正する

ビルドプログラムが出力するメッセージと ’encoding’ の値が異なる場合がある。この例は、Vim がそのエラーメッセージを讀み込んだ後でエンコーディングを變換する方法を示してゐる:

function QfMakeConv()
   let qflist = getqflist()
   for i in qflist
      let i.text = iconv(i.text, "cp936", "utf-8")
   endfor
   call setqflist(qflist)
endfunction

au QuickfixCmdPost make call QfMakeConv()

(Faque Cheng による例)

代はりに ’makeencoding’ オプションを使ふこともできる。

5. :vimgrep と :grep の使ひ方

Vim にはパターンを檢索する方法が 2 つある: 內部 grep と外部 grep である。內部 grep の利點は、全てのシステム上で動作し、Vim の强力な檢索パターンを使へることである。內部 grep が目的に合はない場合は外部 grep を使ふことができる。

內部 grep はファイルをメモリに讀み込むため、より遲い。利點は:

これを行ふために、Vim は各ファイルを編輯するときと同じやうに讀み込む。そのファイルにマッチがなかつたら、そのバッファは消去 (wiped out) される。多數のファイルを扱ふときのメモリ不足やファイル記述子不足を避けるために、ここではオプション ’hidden’ は無視される。しかし、コマンド修飾子 |:hide| が使はれたときは、バッファが讀み込まれたままになる。これによつて、同じファイルを續けて檢索するのがとても高速になる。

Note:
檢索結果へのリンク一覽を開くには |:copen| (|:lgrep| なら |:lopen|) が使はれる。|:silent| コマンドを使ふことで grep の出力が畫面いつぱいに表示されるのを防ぐことができる。|:grep| コマンドを ":grep!" 形式で使ふと最初のマッチに自動的にジャンプしなくなる。これらのコマンドを組み合はせて NewGrep コマンドを作ると次のやうになる:

command! -nargs=+ NewGrep execute 'silent grep! <args>' | copen 42

5.1 Vim の內部 grep の使ひ方

:vim[grep][!] /{pattern}/[g][j] {file} ...

ファイル {file} から {pattern} を檢索し、マッチ位置をエラーリストに追加する。’wildignore’ にマッチしたファイルは無視される。’suffixes’ にマッチしたファイルは最後に檢索される。

フラグ ’g’ がない場合、各行は 1 度だけ追加される。’g’ がある場合、マッチ位置が每囘追加される。

{pattern} は Vim の檢索パターンである。/ で圍まない場合、それが {pattern} 中に現れない限り、どんな非 ID 文字 (|'isident'| を參照) でも使へる。’ignorecase’ が適用される。パターン中に |/\c| を含めると大文字小文字を區別しなくなり、|/\C| を含めると區別するやうになる。これは ’ignorecase’ より優先される。’smartcase’ は適用されない。{pattern} が空のときは (つまり // が指定されたときは)、最後に使はれた檢索パターンが使用される。|last-pattern|

:{count}vim[grep] ...

このコマンドの前に數字が置かれると、その數が檢索するマッチの最大數となる。":1vimgrep pattern file" とすると最初のマッチだけを檢索する。マッチが存在するかどうかだけをチェックしたく、それが見つかつたらすぐに終了してほしい場合に便利である。

フラグ ’j’ がない場合、最初のマッチへジャンプする。’j’ がある場合は QuickFix リストが更新されるだけである。[!] がついた場合、カレントバッファに對する變更は全て失はれる。

進行狀況を示すため、1 秒程度ごとに檢索されたファイル名が表示される。

例:

:vimgrep /an error/ *.c
:vimgrep /\<FileName\>/ *.h include/*
:vimgrep /myfunc/ **/*.c

"**" の使ひ方については |starstar-wildcard| を參照。

:vim[grep][!] {pattern} {file} ...

上と同樣だが、パターンを非 ID 文字で圍むのでなく、空白でパターンを區切る。パターンは ID 文字で始まらねばならない。

例:

:vimgrep Error *.c
:lv[imgrep][!] /{pattern}/[g][j] {file} ... または
:lv[imgrep][!] {pattern} {file} ...

":vimgrep" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:vimgrepa[dd][!] /{pattern}/[g][j] {file} ... または
:vimgrepa[dd][!] {pattern} {file} ...

":vimgrep" と同樣だが、新しくエラーリストを作る代はりに、現在のリストに追加する。

:lvimgrepa[dd][!] /{pattern}/[g][j] {file} ... または
:lvimgrepa[dd][!] {pattern} {file} ...

":vimgrepadd" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

5.2 外部 grep

Vim はコンパイラに對するのと同じ方法 (|:make| 參照) で "grep" や GNU id-utils などの grep ライクなプログラムと連携できる。

[Unix 豆智識: Unix のコマンド "grep" の名前は ":g/re/p" に由來してゐる。"re" は Regular Expression (正規表現) を意味する。]

:gr[ep][!] [arguments]

":make" と同じやうにしかし ’makeprg’ の代はりに ’grepprg’ が、’errorformat’ の代はりに ’grepformat’ が使はれる。’grepprg’ が "internal" の場合、|:vimgrep| と同樣に機能する。その場合、パターンが區切り文字で圍まれてゐなければならないことに注意。

プログラム出力のエンコーディングが ’encoding’ と異なる場合には、’makeencoding’ オプションでエンコーディングを指定できる。

:lgr[ep][!] [arguments]

":grep" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

:grepa[dd][!] [arguments]

":grep" と似てゐるが、新しいエラーリストを作らず、解釋されたエラーが現在のリストに追加される。

例:

:call setqflist([])
:bufdo grepadd! something %

1 番目のコマンドは新しい空のエラーリストを作成する。2 番目のコマンドはバッファリスト內の各バッファに對し "grepadd" を實行する。最初のエラーへジャンプするのを避けるために ! を使つてゐることに注意。|:bufdo| でジャンプすることはできない。

引數リスト內のファイルに對して實行し、マッチがないファイルでのエラーを囘避する例:

:silent argdo try 
  \ | grepadd! something %
  \ | catch /E480:/
  \ | endtry"

プログラム出力のエンコーディングが ’encoding’ と異なる場合には、’makeencoding’ オプションでエンコーディングを指定できる。

:lgrepa[dd][!] [arguments]

":grepadd" と同樣だが、QuickFix リストでなく、カレントウィンドウのロケーションリストが使はれる。

5.3 grep をセットアップする

標準的な "grep" プログラムがインストールされてゐれば :grep コマンドはデフォルトのままで動くだらう。使ひ方は標準的なコマンドにとてもよく似てゐる:

:grep foo *.c

これは擴張子.c の全てのファイルの中から部分文字列 "foo" を檢索する。:grep への引數はそのまま "grep" プログラムに渡されるので、その "grep" がサポートするオプションはなんでも使ふことができる。

デフォルトでは :grep は grep を -n オプションつきで呼び出す (これはファイル名と行番號を出力させる)。これは ’grepprg’ オプションで變更できる。次のやうな場合に ’grepprg’ を變更する必要があるだらう:

a)"grep" 以外の名前のプログラムを使つてゐるとき
b)grepをフルパスで呼ばなければならないとき
c)他のオプションを自動的に渡したいとき (例: 大文字・小文字の無視)

"grep" が實行されると、Vim はその結果を ’grepformat’ オプションに從つて解釋する。このオプションは ’errorformat’ オプションと同樣に働くので詳細はそちらを參照すること。あなたの grep が標準的でない書式で出力したり、あるいは特別な書式を持つ他のプログラムを使つてゐる場合は ’grepformat’ をデフォルト値から變更する必要があるだらう。

結果が解釋されると、|quickfix| モードにおけるコンパイルエラーと同樣に、Vim はマッチした部分を含む最初のファイルを讀み込み、對應した行へジャンプする。その後は |:cnext|, |:clist| などのコマンドを使つて他のマッチにジャンプすることができる。

5.4 id-utils と共に :grep を使ふ

:grep を GNU id-utils と共に使ふにはこのやうにする:

:set grepprg=lid\ -Rgrep\ -s
:set grepformat=%f:%l:%m

そして

:grep (regexp)

これで期待通りの動作をする。

(最初に mkid をするのを忘れてゐなければ)

5.5 :vimgrep や :grep を使つてソースコードをわたり步く

Vim が保存するエラーリストのスタックを使ふことによつて、ファイルをわたり步き、函數とその函數が呼んでゐる函數を探すことができる。例へば、read_file() 函數に引數を加へたいとする。次のやうにコマンドを打てばよい:

:vimgrep /\<read_file\>/ *.c

:cn でマッチのリストを巡り、引數を加へることができる。またあるとき上位の函數 msg() から新しい引數を得て、それを變更しなければならないとする。ならばかうするとよい:

:vimgrep /\<msg\>/ *.c

msg() 函數を變更してゐるときに、上位から引數を得なければならない函數をもう 1 個見つけたとする。ならばその函數を見つけるのにまた ":vimgrep" を使へばよい。1 つの函數が終はつたら、

:colder

とすれば 1 つ前に戾ることができる。

これはツリーをわたるのに似てゐる: ":vimgrep" が 1 レベル深く進むにつれて、分岐のリストが 1 つ作られる。":colder" は 1 つ上に戾る。":vimgrep" と ":colder" を使つてツリーに似た方法ですべての場所をわたることができる。これを一貫して行へば、"todo" のリストを書き留めることなく、すべての場所に行くことができる。

6. コンパイラを選ぶ

:comp[iler][!] {name}

コンパイラ {name} を使ふときに機能するオプションを設定する。"!" オプションがない場合は現在のバッファに對して設定される。"!" がある場合はグローバルオプションが設定される。

"file.foo" で ":compiler foo" とし、その後別のバッファで ":compiler! bar" としたとき、Vim は "file.faoo" では "foo" を使ひ續ける。

{|+eval| 機能なしでコンパイルされた場合には使用できない}

"compiler" ディレクトリ內にある Vim プラグインによつて、選擇されたコンパイラを使ふためのオプションが設定される。‘:compiler‘ はローカルオプションを設定し、‘:compiler!‘ はグローバルオプションを設定する。 Vim の古いバージョンをサポートするために、それらのプラグインは常に "b:current_compiler" でなく "current_compiler" を使ふ。このコマンドが實際に行ふことは次の通り:

コンパイラプラグインを書くためには |write-compiler-plugin| を參照せよ。

GCC

GCC 用に設定できる變數は 1 つある:

g:compiler_gcc_ignore_unmatched_lines

GCC 用に定義されたどのパターンにもマッチしない行を無視する。make から起動されたコマンドの出力のせゐで誤檢出 (false positive) が發生してしまふときに有用である。

MANX AZTEC C

Amiga 上で Manx’s Aztec C compiler とともに Vim を使ふには次のやうにする:

Amiga における Quickfix モードには他にも制限がある。コンパイラは最初の 25 個のエラーしか出力しない (Manx’s のドキュメントにはそれ以上出力する方法が書かれてゐない)。それ以上のエラーを探したいのならば、幾つかのエラーを修正しエディタを拔ける必要がある。再コンパイルの後殘り 25 個のエラーが出てくる

Vim がコンパイラから起動された場合、:sh やいくつかの :! コマンドは機能しない。Vim がコンパイラと同じプロセスの中で動いてゐるため、標準出力が利用できないからである。

PERL

Perl コンパイラプラグインはコンパイルはしないが、Perl 內部の構文チェック機能を呼び出し、その出力を解析してエラーを QuickFix モードで修正できるやうにする。

チェックするファイルの中に "no warnings" または "$^W = 0" と書いてあつても關係なく警告が表示される。これを無效にするには g:perl_compiler_force_warnings に 0 を代入する。例:

let g:perl_compiler_force_warnings = 0

PYUNIT COMPILER

これは實際にはコンパイラではなく、Python 言語用のユニットテストフレームワークである。PYUNIT はバージョン 2.0 から Python 標準ディストリビューションに含まれるやうになつた。それより古いバージョンは http://pyunit.sourceforge.net で入手できる。

フレームワークの助けを借りてテストを走らせるとき、エラーがあれば Vim によつて解釋され、QuickFix モードで表示される。

殘念ながら、テストを走らせる標準的な方法はない。alltests.py スクリプトがよく使はれると思はれるが、それだけである。よつて、’makeprg’ に對する實用的な値は

setlocal makeprg=./alltests.py " テストスイートを走らせる
setlocal makeprg=python\ %:S   " 1 つのテストケースを走らせる

となる。

次も參照。http://vim.sourceforge.net/tip_view.php?tip_id=280.

TEX COMPILER

ディストリビューションに含まれてゐる TeX 用のコンパイラスクリプト ($VIMRUNTIME/compiler/tex.vim) は、可能なら make コマンドを使ふ。コンパイラがカレントディレクトリに "Makefile" または "makefile" といふファイルを見つけたら、*TeX ファイルを make を使つて處理しようとし、その makefile 通りの動作をする。この場合コンパイラは ’errorformat’ を *TeX 出力用にセットし、’makeprg’ は觸らずにそのままにしておく。"Makefie" も "makefile" も見つからない場合はコンパイラは make を使はない。makefile を無視するやうに指定することもできる。變數 b:tex_ignore_makefile か g:tex_ignore_makefile を設定すればよい (これらは存在するかのみチェックされる)。

コンパイラが make を使はないことになつたら、コンパイラは入力を處理するプログラムを選擇する。變數 b:tex_flavorかg:tex_flavor (この順で探される) が存在すれば、それが :make コマンドのためのオプションを定義する。もし兩方とも存在しなければ、既定値 "latex" になる。例へば、AMS-TeX で書かれた mypaper.tex から \input された chapter2.tex を編輯中に

:let b:tex_flavor = 'amstex'
:compiler tex

[editing...]

:make mypaper

Note:
處理するファイルの名前を引數に指定しなければならないことに注意 (\input か \include されたファイルを編輯中に正しいファイルを處理するため; % を引數なしに置換するポータブルな方法もよい)。これはソースではなく、ターゲットを指定するといふ make の意味論ではないが、擴張子 ".tex" を除いたファイル名を指定してもよい。その場合、「filename.dvi または filename.pdf または filename.[コンパイラに應じた何らかの結果の擴張子] をメイクしろ」といふことを意味する。

Note:
tex コマンドライン文法は MikTex (Srinath Avadhanula によつて提案された) と teTeX (Artem Chuprina によつてチェックされた) の兩方で使へるやうに設定されてゐる。|errorformat-LaTeX| からの提案は他のシェルや OS で動かせるやうにするには複雜すぎるし、他の TeX オプションを使ふことも許さない。もしあなたの TeX が "-interaction=nonstopmode" をサポートしてゐなければ、コマンドラインから \nonstopmode を表現する他の方法とともにその旨を報告してください。

7. エラーフォーマット

errorformat’ オプションは認識されるエラーフォーマットのリストを指定する。その中からエラーメッセージにマッチした最初のフォーマットが使はれる。複數のフォーマットを指定して、數種類のメッセージに對應したり、複數のコンパイラに對應したりすることができる。|efm-entries| を參照。

errorformat’ の各要素は、scanf に似たフォーマットを記述する文字列である。はじめに、scanf がどのやうに働くか知る必要がある。C コンパイラのドキュメントを讀むこと。以下は Vim が理解する % の項目である。他は無效になる。

errorformat’ 中の特別な文字はコンマとバックスラッシュである。それがどう扱はれるかは |efm-entries| を參照。"%%" はリテラル "%" にマッチする。よつてこれはバックスラッシュでエスケープしない。

‘:make‘と ‘:grep‘ の出力のすべての NUL 文字は SOH (0x01) に置換されるので注意。

Note:
デフォルトでは大文字と小文字の違ひは無視される。もし大文字・小文字の區別をしたいなら "\C" をパターンに付け加へる |/\C|。

Vim は任意の長さの行を讀み取るが、最初の 4095 バイトのみが使用され、殘りは無視される。要素の長さは 1023 バイトまでである。

基本要素

%fファイル名 (文字列を檢索)
%oモジュール名 (文字列を檢索)
%l行番號 (數字を檢索)
%c桁番號 (エラーの桁を表す數字 (<Tab> 1 個は 1 桁と數へる))
%v畫面上の桁番號 (エラーの畫面上の桁を表す番號 (<Tab> 1 個はスクリーン上 8 桁と數へる))
%tエラーの種類 (1 文字を檢索)
%nエラー番號 (數字を檢索)
%mエラーメッセージ (文字列を檢索)
%rその行の殘り全部 %O/%P/%Q
%pポインタ行 (’-’, ’.’, ’ ’ またはタブの列を檢索し、その長さを桁番號とする)
%*{conv}scanf に割り當てられない變換
%%1 個のリテラル ’%’
%sテキスト檢索 (文字列を檢索)

"%f" の變換は現在の ’isfname’ の設定に依存する。"~/" はホームディレクトリ名に展開され、環境變數も展開される。

變換 "%f" と "%m" はその文字列の終端を檢出しなければならない。通常は、後に續く文字と要素がマッチすれば、そこが終端になる。もし後に續く要素がなかつたら、その行の殘りの部分がマッチする。"%f" の後に ’%’ かバックスラッシュが續いてゐるなら、それは ’isfname’ 文字の列を檢索する。

MS-DOS, MS-Windows そして OS/2 では、"C:" で始まる部分は "%f" に含まれる。"%f:" と指定したときでもさうなる。これはアルファベット 1 文字の名前のファイルは檢出されないことを意味する。

"%p" の後には通常 "^" をつける。これは、以下のやうな出力によつてエラーの桁を示すコンパイラ用に使へる:

            ^
または >
   ---------^

これは複數行のエラーメッセージでも使へる。實用的なサンプルとしては |errorformat-javac| を參照。

"%s" はエラー行の位置を探すためのテキストを指定する。そのテキストは文字列リテラルして使はれる。檢索テキストに正確にマッチするエラー行を探すために、"^" と"$" がテキストに加へられる。また、テキストの先頭に "\V" が追加され、"very nomagic" とされる。"%s" はエラー出力中の行番號がない行を探すために使ふことができる。シェルコマンド "grep" の出力のやうに。

パターンがある場合は行番號は使はれない。

"%o" は quickfix 項目の中のモジュール名を指定する。もし指定があればそれがファイル名の代はりに quickfix エラーウィンドウの中で使はれる。モジュール名は結果を表示するためだけに使はれ、ファイル名はそのファイルにジャンプするときに使はれる。

ディレクトリを變更する

次の大文字の變換文字は、特別なフォーマット文字列のタイプを指定する。これらのうち高々 1 つをコンマ區切りのフォーマットパターンの先頭につけることができる。

"%f" によつて讀まれるファイル名の前につけたす必要があるディレクトリ名を出力するコンパイラがある (例: GNU make)。以下のコードはそれらのディレクトリ名を解釋するのに使はれる。そのディレクトリ名は內部のディレクトリスタックに保存される。

%D"enter directory" フォーマット文字列。これ以下の %f はそのディレクトリ名を檢索する。
%X"leave directory" フォーマット文字列。これ以下の %f はディレクトリスタックの1つ前のディレクトリを檢索する。

"enter directory" や "leave directory" フォーマットを定義する場合、"%D" や "%X" は部分文字列の最初に置かれなけれならない。Vimはディレクトリ變更を追跡し相對パスによつて指定されたファイル名の前にカレントディレクトリ名をつけたす。Tips や制限など詳細は |quickfix-directory-stack| を參照。

複數行にわたるメッセージ

複數行メッセージにわたるメッセージを解釋することも可能である。取りうるプリフィックスは:

%E複數行エラーメッセージの開始
%W複數行警告メッセージの開始
%I複數行情報メッセージの開始
%A複數行メッセージの開始 (種類指定なし)
%>現在と同じパターンで始まつてゐる次行 |efm-%>|
%C複數行メッセージの繼續
%Z複數行メッセージの終了

これらに對して ’+’ と ’-’ をつけることもできる。|efm-ignore| を參照。

パターンに "\n" を含めても、複數行のメッセージにはマッチしない。

例: コンパイラが次のフォーマットでエラーを出力したとする。

(行頭の行番號は實際の出力の一部ではない):

1  Error 275
2  line 42
3  column 3
4  ' ' expected after '--'

適切なエラーフォーマット文字列はこのやうになる:

:set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m

すると、このエラーに對し |:clist| が表示するエラーメッセージはこのやうになる:

1:42 col 3 error 275:  ' ' expected after '--'

別の例: 次のエラーメッセージを出力する Python インタープリターを考へる。

(行頭の行番號は實際の出力の一部ではない):

 1  ==============================================================
 2  FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
 3  --------------------------------------------------------------
 4  Traceback (most recent call last):
 5    File "unittests/dbfacadeTest.py", line 89, in testFoo
 6      self.assertEquals(34, dtid)
 7    File "/usr/lib/python2.2/unittest.py", line 286, in
 8   failUnlessEqual
 9      raise self.failureException, \
10  AssertionError: 34 != 33
11
12  --------------------------------------------------------------
13  Ran 27 tests in 0.063s

このメッセージに關する情報だけを |:clist| で表示させたいところだらう。

このやうに:

5 unittests/dbfacadeTest.py:89:  AssertionError: 34 != 33

そのためにはエラーフォーマット文字列を次のやうに定義する:

:set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m

Note:
"%C" を "%A" の前に置いてゐることに注意: ’ %.%#’ (これは正規表現 ’ .*’ を意味する) がスペースで始まるすべての行にマッチするので、それが7行目を以降を隱してくれる。さうでないと7行目は別のエラーメッセージの始まりと解釋されてしまふ。エラーフォーマットは常に、リストの中から 1 つ 1 つ、最初のマッチが起こるまで試されていく。

要素 %> は ’errorformat’ の最初の方に出てくるパターンを試すのを避けるために使へる。これはほとんど何にでもマッチするパターンに便利である。例へば、エラーがこのやうなら:

Error in line 123 of foo.c:
unknown variable "i"

これは以下でマッチできる:

:set efm=xxx,%E%>Error in line %l of %f:,%Z%m

ここで "xxx" には 2 番目の行にもマッチするパターンが入るとする。

重要:
エラーフォーマットのどの部分が以前にマッチしたかは記憶されてゐない。すなはち、エラーファイルの各行が每囘エラーフォーマットの各行に對してテストされる。例へば、次のやうになつてゐるとする:

setlocal efm=aa,bb,cc,dd,ee

ここで aa, bb などはエラーフォーマット文字列とする。エラーファイルの各行がパターン aa, 次に bb, 次に cc… とテストされる。cc がエラーの 1 つ前の行にマッチしたからといつて、dd が現在行に對して最初にテストされるといふことにはならない。cc と dd が複數行エラーフォーマット文字列だつたとしても、である。

ファイル名を分割する

1 度現れたファイル名を複數のメッセージが參照する場合には、これらのプリフィックスが有效である。

%O1 行ファイルメッセージ: マッチ部分を讀み込む (それ以前に記憶されてゐたものは消去される)
%P1 行ファイルメッセージ: ファイル%fをスタックにプッシュする。
%Q1 行ファイルメッセージ: スタックから最後のファイル名をポップする。

例: 次のエラーログファイルを出力するコンパイラがあるとする (行番號は實際の出力ではない)

 1  [a1.tt]
 2  (1,17)  error: ';' missing
 3  (21,2)  warning: variable 'z' not defined
 4  (67,3)  error: end of file found before string ended
 5
 6  [a2.tt]
 7
 8  [a3.tt]
 9  NEW compiler v1.1
10  (2,2)   warning: variable 'x' not defined
11  (67,3)  warning: 's' already defined

このログファイルは [...] で圍まれたファイルに對し複數のメッセージを示してゐる。これは次のエラーフォーマットで適切に解釋できる:

:set efm=%+P[%f],(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%-Q

|:clist| を呼ぶとこれらをファイル名とともに適切に表示してくれる:

2 a1.tt:1 col 17 error: ';' missing
3 a1.tt:21 col 2 warning: variable 'z' not defined
4 a1.tt:67 col 3 error: end of file found before string ended
8 a3.tt:2 col 2 warning: variable 'x' not defined
9 a3.tt:67 col 3 warning: 's' already defined

行全體にマッチする他のプリフィックスとは違ひ、%P, %Q, %Oは同一行の複數のパターンにマッチさせるのに使へる。それゆゑ、次のやうにファイルがネストした場合を解釋することもできる:

{"file1" {"file2" error1} error2 {"file3" error3 {"file4" error4 error5}}}

%O はファイル名情報のプッシュ・ポップを含まない文字列を解釋する。發展例については |errorformat-LaTeX| を參照。

メッセージ全體を無視する・使ふ

’+’, ’-’ は大文字の指定文字と組み合はせて使ふ。’%+A’ や ’%-G’ のやうに指定文字の前につける。

%-複數行のマッチを含まない。
%+エラー文字列%m中でマッチした行全體

プリフィックス %G だけは ’+’ か ’-’ と組み合はせたときのみ意味を持つ。これはコンパイラバージョンのやうな一般的な情報を含む行か、無視するべきヘッダーを讀み込む。

%-Gこのメッセージを無視する
%+G一般的なメッセージ

パターンマッチング

古いバージョンの Vim との下位互換性の爲に scanf() と同じ "%*[]" といふ記法がサポートされてゐる。しかし、フォーマット文字列に Vim がサポートするほぼ全ての正規表現を用ゐる事も可能である。正規表現言語のメタ文字は普通の文字列やファイル檢索の一部と重なつてしまふから (從つて內部的にはエスケープされる必要がある)、メタシンボルは ’%’ を付加して表記される必要がある:

%\單體の ’\’ といふ文字。これは ":set errorformat=" の定義の中ではエスケープされて ("%\\") 書かれなければならない。
%.單體の ’.’ といふ文字。
%#單體の ’*’ (!) といふ文字。
%^單體の ’^’ といふ文字。注意: これなしでも行頭にはマッチするので、これは特に便利ではない。
%$單體の ’$’ といふ文字。注意: これなしでも行末にはマッチするので、これは特に便利ではない。
%[單體の ’[’ といふ文字。文字の範圍 [] のために使はれる。
%~單體の ’~’ といふ文字。

表現の中でキャラクタクラスを使用する場合 (槪要は |/\i| を參照)、數量子 "\+" を含む語は scanf() の中に "%*" といふ記法で書くことができる。例: "%\\d%\\+" ("\d\+","どんな數字でも") は "%*\\d" と等價である。

重要:
\(...\) のグループ表現は、內部變換に使ふため豫約されてゐるからフォーマット指定內では使用することができない。

errorformat’ 內の複數の要素

複數のコンパイラからの出力を見つけることを可能にするために、コンマで區切つて複數のフォーマットパターンを ’errorformat’ に設定することができるだらう (Note: コンマ直後の空白は無視される)。完全にマッチした最初のパターンが採擇される。マッチするものが無い場合、最後にマッチした部分が使はれるが、ファイルネームは除外されエラーメッセージは全體のメッセージとして設定される。複數のコンパイラからの出力メッセージにマッチしてしまふパターンがあつた (しかし正確には一致しない) 時には、より制限されたもの {譯注: 他のメッセージにマッチし難いもの} の後に置く。

パターンの先頭にコンマを含めるにはバックスラッシュ (":set" コマンド中では 2 度タイプするべきだ) を添へる。バックスラッシュを含めるためには 2 つ與へる (つまり ":set" コマンドの中では 4 つタイプする)。また、":set" コマンド內のスペースの前にはバックスラッシュを置く必要がある。

有效なマッチ

もし ’errorformat’ に完全には一致しない行が現れた場合、エラーメッセージ全體が表示され、エントリは無效とされコマンド ":cn" や ":cp" 使用時にはスキップされる (有效なエントリが全く無い場合で無い限り)。エラーメッセージの全てはコマンド ":cl!" で表示する事ができる。

エラーフォーマットがファイル名を含んでゐないと Vim は正しいファイルへジャンプすることができない。手動でやる必要がある。

Aztec compiler のファイルの書式は:

ファイル名>行:列:エラータイプ:識別番號:メッセージ
ファイル名エラーが見つかつたファイルの名前
エラーが見つかつた行の通し番號
エラーが見つかつた場所の列數 (行先頭からの文字數)
タイプエラーの種類、通常は一文字で ’E’ か ’W’
識別番號エラーの番號 (マニュアルの檢索用)
メッセージエラーの說明

これは ’errorformat’ をこのやうに設定すればマッチできる:

%f>%l:%c:%t:%n:%m

單行エラーを出力する C コンパイラのための幾つかの例:

%f:%l:\ %t%*[^0123456789]%n:\ %mManx/Aztec C エラーメッセージ (scanf() は [0-9] を理解しない)
%f\ %l\ %t%*[^0-9]%n:\ %mSAS C 用
\"%f\"\\,%*[^0-9]%l:\ %mgeneric C compilers 用
%f:%l:\ %mGCC 用
%f:%l:\ %m,%Dgmake[%*\\d]:\ Entering\ directory\ ‘%f’,
%Dgmake[%*\\d]:\ Leaving\ directory\ ‘%f’
GCC with gmake 用 (行を連結すること!)
%f(%l)\ :\ %*[^:]:\ %mold SCO C compiler (pre-OS5)
%f(%l)\ :\ %t%*[^0-9]%n:\ %midem, エラーの種類と番號つき
%f:%l:\ %m,In\ file\ included\ from\ %f:%l:,\^I\^Ifrom\ %f:%l%mいくつかの擴張つき GCC

複數行メッセージを扱ふために擴張した例が次の所で與へられる。|errorformat-Jikes| と |errorformat-LaTeX| を參照。

:set コマンドで使ふときにはスペースとダブルクォートの前にバックスラッシュが必要なことに注意。コンマの前には 2 つのバックスラッシュを置く。1 つは :set コマンドのため、もう 1 つはコンマがエラーフォーマットの區切りと認識されるのを避けるためである。

メッセージをフィルタリングする

もしコンパイラがフォーマットに合はないエラーメッセージを作成する場合、エラーメッセージをこのフォーマットに變換するプログラムを書く方法もある。その時はコマンド ":make" によつて起動されるプログラムオプション ’makeprg’ を變更することで指定できる。例:

:set mp=make\ \\\|&\ error_filter

パイプ (|) の前のバックスラッシュはコマンドセパレータとして認識されないために必要。コマンド "set" では空白の前にバックスラッシュが必要。

8. ディレクトリスタック

Quickfix は make の出力を解釋し、使はれたディレクトリ全てをスタックで保持する。GNU-Make ではディレクトリに入つたり出たりすると常に絕對パスで表示されるので、これはむしろシンプルである。これは makefile 中の cd コマンドか、起動パラメーター "-C dir" (makefile の讀みこみ前にディレクトリを變更) なのかには因らない。GNU-Make に强制的に處理の前後にワーキングディレクトリを表示されるためにスイッチ "-w" を使用するのは便利かもしれない。

GNU-make を使用しない場合、正しいディレクトリを管理する事はもつと複雜になる。例へば AIX-make はワーキングディレクトリに關してなんの情報も表示しない。よつて makefile に細工が必要となる。LessTif の makefile には "Making {target} in {dir}" と表示するコマンドがある。ここにはディレクトリを出る時の情報とその相對パスが表示されないといふ重要な問題もある。

パスの關係とメッセージ "leave directory" が現れない問題のために Vim では次のアルゴリズムで對處してゐる:

1)與へられたディレクトリがカレントディレクトリの子か調べる。眞ならばそれをカレントディレクトリとする。
2)カレントディレクトリの子ディレクトリでなかつた場合、上のディレクトリの子ディレクトリか (つまり兄弟ディレクトリ) を調べる。
3)まだディレクトリが見つからない場合、これは Vim のカレントディレクトリの子ディレクトリだと假定される。

付け加へて、全てのファイルについて認識されたディレクトリに實際に存在するのか調べられる。もしもなければディレクトリスタックの中の全てのディレクトリ (サブディレクトリではない) について探す。これでも見つからなければ Vim のカレントディレクトリにあるものと假定される。

このアルゴリズムには制限がある。この例は make がディレクトリに入つた時に "Making all in dir" の形で情報を表示すると假定してゐる。

1) 次のやうなディレクトリとファイルがあつたとする

./dir1
./dir1/file1.c
./file1.c

カレントディレクトリの前に make が "./dir1" を處理し "./file1.c" にエラーがあると Vimは "./dir1/file.c" をロードしてしまふ。

これはメッセージ "leave directory" があれば解決する事ができる。

2) 次のやうなディレクトリとファイルがあつたとする

./dir1
./dir1/dir2
./dir2

次のやうになる:

Make の出力                    Vim が解釋するディレクトリ
------------------------       ----------------------------
Making all in dir1             ./dir1
Making all in dir2             ./dir1/dir2
Making all in dir2             ./dir1/dir2

これはメッセージ "enter directory" に絕對パスが記述されるか、メッセージ "leave directory" が表示されれば解決される。

この問題を避けるため、ディレクトリの絕對パスとメッセージ "leave directory" が表示されるやうにすればよい。

Makefile の例:

Unix:
    libs:
            for dn in $(LIBDIRS); do                            \
                (cd $$dn; echo "Entering dir '$$(pwd)'"; make); \
                echo "Leaving dir";                             \
            done

上の出力を取り扱ふために

%DEntering\ dir\ '%f',%XLeaving\ dir

を ’errorformat’ につけ加へる。

Note:
Vim はメッセージ "leave directory" の中のディレクトリ名がカレントディレクトリかどうかはチェックしない。これが何故メッセージ "Leaveing dir" だけで良いかの理由だ。

9. 具體的なエラーファイルフォーマット

IBM Research によつて公開されてゐる Java コンパイラ Jikes(TM) はシンプルなマルチラインエラーメッセージを出力する。

このメッセージにマッチする ’errorformat’ の文字列を下に示す。これをユーザーの |vimrc| に書くことで Vim がデフォルトで認識するフォーマットを上書きする事ができる。またデフォルトに追加インストールする方法は |:set+=| を參照。

:set efm=%A%f:%l:%c:%*\\d:%*\\d:,
      \%C%*\\s%trror:%m,
      \%+C%*[^:]%trror:%m,
      \%C%*\\s%tarning:%m,
      \%C%m

Jikes(TM) はオプション "+E" とともに起動されたときは 1 行エラーメッセージを出力する。これは次によつてマッチできる。

:setl efm=%f:%l:%v:%*\\d:%*\\d:%*\\s%m

この ’errorformat’ は、エラーの桁を示すのに "^" の行を出力する javac 用にうまく動作すると報告されてゐる:

:setl efm=%A%f:%l:\ %m,%-Z%p^,%-C%.%#

または:

:setl efm=%A%f:%l:\ %m,%+Z%p^,%+C%.%#,%-G%.%#

Michael F. Lamb が考案した別の方法を以下に示す。これは Unix 用で、最初にエラーをフィルタリングする:

:setl errorformat=%Z%f:%l:\ %m,%A%p^,%-G%*[^sl]%.%#
:setl makeprg=javac\ %:S\ 2>&1\ \\\|\ vim-javac-filter

以下の行を "vim-javac-filter" といふファイルに書いて、PATH の通つたディレクトリ (例へば~/bin) に置き、實行可能にしておく必要がある:

#!/bin/sed -f
/\^$/s/\t/\ /g;/:[0-9]\+:/{h;d};/^[ \t]*\^/G;

{譯注: BSD sed では動作しないやうです。GNU sed では動作します。}

この sed スクリプトを言葉で說明すると次のやうになる:

ant (http://jakarta.apache.org/) 用には、各 javac の出力行の前につく [javac] を受け取るために、上のエラーフォーマットを修正しなければならない:

:set efm=%A\ %#[javac]\ %f:%l:\ %m,%-Z\ %#[javac]\ %p^,%-C%.%#

javac や jikes と ant をともに扱ふためにこの ’errorformat’ を調整することができる。jikes を使つてゐるなら、jikes の +E コマンドラインスイッチを使ふことを ant に敎えなければならない (このスイッチは jikes に 1 行エラーメッセージを生成させる)。これが build.xml ファイルの 2 行目が行つてゐることである:

<property name = "build.compiler"       value = "jikes"/>
<property name = "build.compiler.emacs" value = "true"/>

javac, jikes と組み合はせた ant を扱ふ ’errorformat’ はかうである:

:set efm=\ %#[javac]\ %#%f:%l:%c:%*\\d:%*\\d:\ %t%[%^:]%#:%m,
         \%A\ %#[javac]\ %f:%l:\ %m,%-Z\ %#[javac]\ %p^,%-C%.%#

jade (http://www.jclark.com/ 參照) のエラーを解釋するのは簡單である:

:set efm=jade:%f:%l:%c:%t:%m

次のは複數行に渡つてエラーメッセージを表示する (La)TeX タイプセッティングシステム用の ’errorformat’ 文字列を指定する 1 つの例である。":clist" や ":cc" 等々のコマンドは先行する空白を削除して複數行のものを一行にまとめて表示する。

以下の LaTeX 用 errorformat はマルチラインエラーを出力する他のコンパイラへ應用するのは簡單だらう。

コマンドは |vimrc| ファイルか別の Vim script ファイルに書ける。例へば LaTeX に關聯した內容を含むスクリプトを LaTeX ソースの編輯時にだけ讀みこまれるやうにする。

サンプルの全行をコピーしたことを確認する (順番もそのまま)。行の始まりに見ることのできる ’\’ の表記は |line-continuation| を參照。

まず ’makeprg’ を LaTeX が最初のエラーで止まることなく複數のエラーを返すやうに準備する。

:set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}

マルチラインエラーメッセージの始まり:

:set efm=%E!\ LaTeX\ %trror:\ %m,
       \%E!\ %m,

マルチライン警告メッセージの始まり; 最初の 2 つは行番號も含んでゐる。幾つかの正規表現の意味:

       \%+WLaTeX\ %.%#Warning:\ %.%#line\ %l%.%#,
       \%+W%.%#\ at\ lines\ %l--%*\\d,
       \%WLaTeX\ %.%#Warning:\ %m,

エラー/警告メッセージが續く可能性; 最初の 1 つは行番號も含んでゐる:

       \%Cl.%l\ %m,
       \%+C\ \ %m.,
       \%+C%.%#-%.%#,
       \%+C%.%#[]%.%#,
       \%+C[]%.%#,
       \%+C%.%#%[{}\\]%.%#,
       \%+C<%.%#>%.%#,
       \%C\ \ %m,

次のパターンにマッチする行には重要な情報は含まれてゐない; よつてメッセージに含まないやうにする。

       \%-GSee\ the\ LaTeX%m,
       \%-GType\ \ H\ <return>%m,
       \%-G\ ...%.%#,
       \%-G%.%#\ (C)\ %.%#,
       \%-G(see\ the\ transcript%.%#),

通常、空白文字だけの行は表示しない:

       \%-G%*\\s,

LaTeX の出力ログには個々のライン每にエラーのあつたファイル名が特定(記述)されてゐるわけではない; ログのあらゆる所で與へられ、括弧にくくられてゐる。續くパターンはそれらの名前を取り出し內部スタックに保存しようと試みる。パターンは時として 1 つの行を複數回走査 (1 つ目を見つけた後、同じ行に次のを發見しようと) するので、パターンの末尾の "%r" が行の殘りの部分が次の試行で解釋の對象になることと、行の末尾に達するまでそれが繰り返されることを示す。

’(’...’)’ でくくられたファイル名を讀み飛ばす;明らかにエラーを含まないファイルはスタックに積まない:

       \%+O(%f)%r,

ファイル名をスタックに積む。名前は ’(’ の後に與へられる。

       \%+P(%f%r,
       \%+P\ %\\=(%f%r,
       \%+P%*[^()](%f%r,
       \%+P[%\\d%[^()]%#(%f%r,

’)’ が見つかつたらファイル名をスタックから取り崩す。

       \%+Q)%r,
       \%+Q%*[^()])%r,
       \%+Q[%\\d%*[^()])%r

Note:
幾つかのケースにおいて LaTeX の出力したログの中のファイル名を正確に取り出す事ができないことに注意。括弧の對應が正しくつかない時パーサーは混亂してしまふ。上記のサンプルはもつとも一般的なケースだけ檢出できるやうにしてある。目的に合はせてこのサンプルを變へる事はできる。例へば全てのゐまいましい "Overfull ..." といふ警告メッセージがエラーとして認識されてしまふ事を防ぐ事ができる。

付け加へて LaTeX コンパイラの出力をフィルタリングするには、[La]TeX コンパイラによつて生成されるファイル *.log を直接讀むことも可能である。これは起こる可能性のあるエラーについてより便利な情報を澤山含んでゐる。しかしそのやうに複雜なファイルを正確に解釋するには、外部フィルタを使ふほうが良い。そのやうな Vim に識別されるフィルタの作り方はずつと以前に述べたので參照。

$VIMRUNTIME/tools に efm_perl.pl スクリプトがある。これは Perl のエラーメッセージをフィルタし、QuickFix モードが理解できるフォーマットに變換する。使ひ方はファイルの先頭を參照。(このスクリプトはもう非推奬で、今は |compiler-perl| を參照のこと)


Up: 目次   [Index]