クイックフィックス

Nvim の :help ページは、生成されており、ソースtree-sitter-vimdocパーサーを使用して生成されています。


この項目はユーザーマニュアルの30.1節で紹介されています。

1. クイックフィックスコマンドの使用 Quickfix E42

Vimには、編集-コンパイル-編集サイクルを高速化するための特別なモードがあります。これは、Amiga上のManxのAztec Cコンパイラのクイックフィックスオプションに触発されたものです。アイデアは、コンパイラからのエラーメッセージをファイルに保存し、Vimを使用してエラーを1つずつジャンプすることです。すべてのエラーメッセージを覚えておく必要なく、各問題を調べて修正できます。
Vimでは、クイックフィックスコマンドは、ファイル内の位置のリストを見つけるために一般的に使用されます。たとえば、:vimgrepはパターンマッチを見つけます。 getqflist()関数を使用すると、スクリプトで位置を使用できます。したがって、編集/コンパイル/修正サイクルよりも多くのことができます!
エラーメッセージがファイルにある場合は、次のコマンドでVimを起動できます。
vim -q filename
Vim内からコマンドを実行して出力を処理する簡単な方法は、:makeコマンドを使用することです(下記参照)。
'errorformat'オプションは、コンパイラからのエラーメッセージに一致するように設定する必要があります(下記のerrorformatを参照)。
クイックフィックスID
各クイックフィックスリストには、クイックフィックスIDと呼ばれる一意の識別子があり、この番号はVimセッション内で変更されません。getqflist()関数を使用して、リストに割り当てられた識別子を取得できます。また、クイックフィックススタックに10個を超えるリストが追加されるたびに変更される可能性があるクイックフィックスリスト番号もあります。
location-list E776 ロケーションリストは、ウィンドウローカルなクイックフィックスリストです。:lvimgrep:lgrep:lhelpgrep:lmakeなどのコマンドの後に取得します。これらのコマンドは、対応する:vimgrep:grep:helpgrep:makeのように、クイックフィックスリストではなくロケーションリストを作成します。location-list-file-window
ロケーションリストはウィンドウに関連付けられており、各ウィンドウは個別のロケーションリストを持つことができます。ロケーションリストは1つのウィンドウのみに関連付けることができます。ロケーションリストは、クイックフィックスリストとは独立しています。
ロケーションリストを持つウィンドウが分割されると、新しいウィンドウはロケーションリストのコピーを取得します。ロケーションリストへの参照がなくなると、ロケーションリストは破棄されます。
クイックフィックス-変更ティック
すべてのクイックフィックスリストとロケーションリストには、リストに加えられた変更の総数を追跡する読み取り専用のchangedtick変数があります。クイックフィックスリストが変更されるたびに、このカウントが増加します。これは、リストが変更された場合にのみアクションを実行するために使用できます。getqflist()およびgetloclist()関数を使用して、changedtickの現在の値をクエリできます。changedtick変数を変更することはできません。
次のクイックフィックスコマンドを使用できます。ロケーションリストコマンドはクイックフィックスコマンドに似ており、クイックフィックスコマンドの「c」プレフィックスを「l」に置き換えます。
E924
ロケーションリストコマンドの処理中に、現在のウィンドウがautocommandによって閉じられた場合、それは中断されます。
E925 E926 クイックフィックスまたはロケーションリストコマンドの処理中に、現在のクイックフィックスリストまたはロケーションリストがautocommandによって変更された場合、それは中断されます。
:cc
:cc[!] [nr] エラー[nr]を表示します。[nr]が省略されている場合、同じ:[nr]cc[!]エラーが再度表示されます。[!]がない場合、別のバッファにジャンプするときに機能しません。現在のバッファが変更された、バッファにウィンドウが1つしかない、かつ'hidden''autowrite'の両方がオフの場合です。[!]を使用して別のバッファにジャンプすると、'hidden'が設定されているか、このバッファに別のウィンドウがない限り、現在のバッファへの変更は失われます。バッファにジャンプするときは、'switchbuf'の設定が尊重されます。クイックフィックスウィンドウで使用する場合、現在の行の「.」や最後の行の「$」など、行番号を使用できます。
:ll
:ll[!] [nr] ":cc"と同じですが、クイックフィックスリストの代わりに現在のウィンドウのロケーションリストが使用されます。
:cn :cne :cnext E553 ]q :[count]cn[ext][!] ファイル名を含むリスト内の[count]次のエラーを表示します。ファイル名がまったくない場合は、[count]次のエラーに移動します。[!]および'switchbuf'については、:ccを参照してください。
:lne :lnext ]l :[count]lne[xt][!] ":cnext"と同じですが、クイックフィックスリストの代わりに現在のウィンドウのロケーションリストが使用されます。
:[count]cN[ext][!] :cp :cprevious :cprev :cN :cNext [q :[count]cp[revious][!] ファイル名を含むリスト内の[count]前のエラーを表示します。ファイル名がまったくない場合は、[count]前のエラーに移動します。[!]および'switchbuf'については、:ccを参照してください。
:[count]lN[ext][!] :lp :lprevious :lprev :lN :lNext [l :[count]lp[revious][!] ":cNext"および":cprevious"と同じですが、クイックフィックスリストの代わりに現在のウィンドウのロケーションリストが使用されます。
:cabo :cabove :[count]cabo[ve] 現在のバッファの現在の行の上の[count]エラーに移動します。[count]が省略されている場合は、1が使用されます。エラーがない場合は、エラーメッセージが表示されます。クイックフィックスリストのエントリがバッファ番号と行番号でソートされていることを前提としています。同じ行に複数のエラーがある場合は、最初のエントリのみが使用されます。[count]が現在の行の上のエントリ数を超える場合は、ファイル内の最初のエラーが選択されます。
:lab :labove :[count]lab[ove] ":cabove"と同じですが、クイックフィックスリストの代わりに現在のウィンドウのロケーションリストが使用されます。
:cbel :cbelow :[count]cbel[ow] 現在のバッファの現在の行の下の[count]エラーに移動します。[count]が省略されている場合は、1が使用されます。エラーがない場合は、エラーメッセージが表示されます。クイックフィックスリストのエントリがバッファ番号と行番号でソートされていることを前提としています。同じ行に複数のエラーがある場合は、最初のエントリのみが使用されます。[count]が現在の行の下のエントリ数を超える場合は、ファイル内の最後のエラーが選択されます。
:lbel :lbelow :[count]lbel[ow] ":cbelow"と同じですが、クイックフィックスリストの代わりに現在のウィンドウのロケーションリストが使用されます。
:cbe :cbefore :[count]cbe[fore] 現在のバッファの現在のカーソル位置より前の[count]エラーに移動します。[count]が省略されている場合は、1が使用されます。エラーがない場合は、エラーメッセージが表示されます。クイックフィックスリストのエントリがバッファ、行、および列番号でソートされていることを前提としています。[count]が現在の位置より前のエントリ数を超える場合は、ファイル内の最初のエラーが選択されます。
:lbe :lbefore :[count]lbe[fore] ":cbefore"と同じですが、クイックフィックスリストの代わりに現在のウィンドウのロケーションリストが使用されます。
:caf :cafter :[count]caf[ter] 現在のバッファの現在のカーソル位置より後の[count]エラーに移動します。[count]が省略されている場合は、1が使用されます。エラーがない場合は、エラーメッセージが表示されます。クイックフィックスリストのエントリがバッファ、行、および列番号でソートされていることを前提としています。[count]が現在の位置より後のエントリ数を超える場合は、ファイル内の最後のエラーが選択されます。
:laf :lafter :[count]laf[ter] ":cafter"と同じですが、クイックフィックスリストの代わりに現在のウィンドウのロケーションリストが使用されます。
:cnf :cnfile ]CTRL-Q :[count]cnf[ile][!] ファイル名を含むリスト内の[count]次のファイル内の最初のエラーを表示します。ファイル名がまったく存在しない場合、または次のファイルがない場合は、[count]次のエラーに移動します。[!]および'switchbuf'については、:ccを参照してください。
:lnf :lnfile ]CTRL-L :[count]lnf[ile][!] ":cnfile"と同じですが、クイックフィックスリストの代わりに現在のウィンドウのロケーションリストが使用されます。
:[count]cNf[ile][!] :cpf :cpfile :cNf :cNfile [CTRL-Q :[count]cpf[ile][!] ファイル名を含むリスト内の、[count]個前のファイルにある最後のエラーを表示します。ファイル名がまったく存在しない場合、または次のファイルが存在しない場合は、[count]個前のエラーに移動します。 [!]と'switchbuf'については、:ccを参照してください。
:[count]lNf[ile][!] :lpf :lpfile :lNf :lNfile [CTRL-L :[count]lpf[ile][!] ":cNfile" および ":cpfile" と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:crewind :cr [Q :cr[ewind][!] [nr] エラー [nr] を表示します。[nr] を省略した場合、最初のエラーが表示されます。:cc を参照してください。
:lrewind :lr [L :lr[ewind][!] [nr] ":crewind" と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:cfirst :cfir :cfir[st][!] [nr] ":crewind" と同じです。
:lfirst :lfir :lfir[st][!] [nr] ":lrewind" と同じです。
:clast :cla ]Q :cla[st][!] [nr] エラー [nr] を表示します。[nr] を省略した場合、最後のエラーが表示されます。:cc を参照してください。
:llast :lla ]L :lla[st][!] [nr] ":clast" と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:cq :cquit :cq[uit][!] :{N}cq[uit][!] :cq[uit][!] {N} のエラーコードで Vim を終了します。{N} のデフォルトは 1 です。Vim が別のプログラムから呼び出される場合に便利です。例: コンパイラは同じファイルを再度コンパイルせず、git commit はコミットプロセスを中断し、fc (bash や zsh などのシェルに組み込まれている) はコマンドを実行しません。また、{N} は 0 にすることもでき、その場合は Vim は正常に終了します。警告: ファイルのすべての変更は失われます。":qall!" :qall と同様に機能しますが、Nvim は 0 以外または [count] で終了します。
:cf :cfi :cfile :cf[ile][!] [errorfile] エラーファイルを読み込み、最初のエラーにジャンプします。これは、Vim が -q オプションで起動されたときに自動的に行われます。コンパイル中に Vim を実行し続ける場合に、このコマンドを使用できます。エラーファイルの名前を指定すると、'errorfile' オプションが [errorfile] に設定されます。[!]については、:cc を参照してください。エラーファイルのエンコーディングが 'encoding' オプションと異なる場合は、'makeencoding' オプションを使用してエンコーディングを指定できます。
:lf :lfi :lfile :lf[ile][!] [errorfile] ":cfile" と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。ロケーションリストを設定するために -q コマンドラインオプションを使用することはできません。
:cg[etfile] [errorfile] :cg :cgetfile エラーファイルを読み込みます。":cfile" と同じですが、最初のエラーにはジャンプしません。エラーファイルのエンコーディングが 'encoding' オプションと異なる場合は、'makeencoding' オプションを使用してエンコーディングを指定できます。
:lg[etfile] [errorfile] :lg :lge :lgetfile ":cgetfile" と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:caddf :caddfile :caddf[ile] [errorfile] エラーファイルを読み込み、エラーファイルのエラーを現在のクイックフィックスリストに追加します。クイックフィックスリストが存在しない場合は、新しいリストが作成されます。エラーファイルのエンコーディングが 'encoding' オプションと異なる場合は、'makeencoding' オプションを使用してエンコーディングを指定できます。
:laddf :laddfile :laddf[ile] [errorfile] ":caddfile" と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:cb :cbuffer E681 :[range]cb[uffer][!] [bufnr] 現在のバッファからエラーリストを読み込みます。[bufnr] が指定されている場合は、ロードされたバッファの番号である必要があります。そのバッファが現在のバッファの代わりに使用されます。使用する行に範囲を指定できます。それ以外の場合は、バッファ内のすべての行が使用されます。[!]については、:cc を参照してください。
:lb :lbuffer :[range]lb[uffer][!] [bufnr] ":cbuffer" と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:cgetb :cgetbuffer :[range]cgetb[uffer] [bufnr] 現在のバッファからエラーリストを読み込みます。":cbuffer" と同じですが、最初のエラーにはジャンプしません。
:lgetb :lgetbuffer :[range]lgetb[uffer] [bufnr] ":cgetbuffer" と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:cad :cadd :caddbuffer :[range]cad[dbuffer] [bufnr] 現在のバッファからエラーリストを読み込み、エラーを現在のクイックフィックスリストに追加します。クイックフィックスリストが存在しない場合は、新しいリストが作成されます。それ以外の場合は、":cbuffer" と同じです。
:laddb :laddbuffer :[range]laddb[uffer] [bufnr] ":caddbuffer" と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:cex :cexpr E777 :cex[pr][!] {expr} の結果を使用してクイックフィックスリストを作成し、最初のエラーにジャンプします。{expr} が文字列の場合、文字列内の各改行で終わる行は、'errorformat' のグローバル値を使用して処理され、結果がクイックフィックスリストに追加されます。{expr} がリストの場合、リスト内の各文字列項目が処理され、クイックフィックスリストに追加されます。リスト内の文字列以外の項目は無視されます。[!]については、:cc を参照してください。例
:cexpr system('grep -n xyz *')
:cexpr getline(1, '$')
:lex :lexpr :lex[pr][!] {expr} :cexpr と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:cgete :cgetexpr :cgete[xpr] {expr} の結果を使用してクイックフィックスリストを作成します。:cexpr と同じですが、最初のエラーにはジャンプしません。
:lgete :lgetexpr :lgete[xpr] {expr} :cgetexpr と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:cadde :caddexpr :cadde[xpr] {expr} を評価し、結果の行を現在のクイックフィックスリストに追加します。クイックフィックスリストが存在しない場合は、新しいリストが作成されます。現在のカーソル位置は変更されません。詳細については、:cexpr を参照してください。例
:g/mypattern/caddexpr expand("%") .. ":" .. line(".") ..  ":" .. getline(".")
:lad :addd :laddexpr :lad[dexpr] {expr} ":caddexpr" と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:cl :clist :cl[ist] [from] [, [to]] 有効な quickfix-valid であるすべてのエラーを一覧表示します。数値 [from] または [to] が指定されている場合、エラーのそれぞれの範囲が一覧表示されます。負の数は最後のエラーから後方に数え、-1 は最後のエラーです。:filter コマンドを使用して、指定されたパターンに一致するクイックフィックスエントリのみを表示できます。パターンは、エントリのファイル名、モジュール名、パターン、およびテキストと照合されます。
:cl[ist] +{count} 現在および次の {count} 個の有効なエラーを一覧表示します。これは、"from" が現在のエラー位置である ":clist from from+count" と似ています。
: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]] :lli :llist ":clist" と同じですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:lli[st]! [from] [, [to]] 現在のウィンドウのロケーションリスト内のすべてのエントリを一覧表示します。
行を挿入または削除した場合、ほとんどの場合、非表示のマークが使用されるため、正しいエラー位置がまだ見つかります。マークが何らかの理由で削除された場合、「行が変更されました」というメッセージが表示され、エラー位置が正しくない可能性があることを警告します。Vim を終了して再起動すると、マークが失われ、エラー位置が正しくなくなる可能性があります。
クイックフィックスコマンド (':make'、':grep' など) の実行前後にコマンドを実行するために、2 つの自動コマンドが利用可能です。詳細については、QuickFixCmdPre および QuickFixCmdPost を参照してください。
QuickFixCmdPost-example
'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-title
すべてのクイックフィックスとロケーションリストにはタイトルがあります。デフォルトでは、タイトルはリストを作成したコマンドに設定されます。getqflist() および getloclist() 関数を使用して、それぞれクイックフィックスとロケーションリストのタイトルを取得できます。setqflist() および setloclist() 関数を使用して、それぞれクイックフィックスとロケーションリストのタイトルを変更できます。例
call setqflist([], 'a', {'title' : 'Cmd output'})
echo getqflist({'title' : 1})
call setloclist(3, [], 'a', {'title' : 'Cmd output'})
echo getloclist(3, {'title' : 1})
quickfix-index
クイックフィックスコマンド(例えば、:cc:cnext:cprevなど)を使ってクイックフィックス/ロケーションリストのエントリにジャンプすると、そのエントリが現在選択されているエントリになります。クイックフィックス/ロケーションリストで現在選択されているエントリのインデックスは、getqflist()/getloclist()関数を使って取得できます。例
echo getqflist({'idx' : 0}).idx
echo getqflist({'id' : qfid, 'idx' : 0}).idx
echo getloclist(2, {'idx' : 0}).idx
新しいクイックフィックスリストの場合、最初のエントリが選択され、インデックスは1になります。任意のクイックフィックス/ロケーションリスト内の任意のエントリは、setqflist()関数を使って現在選択されているエントリとして設定できます。例
call setqflist([], 'a', {'idx' : 12})
call setqflist([], 'a', {'id' : qfid, 'idx' : 7})
call setloclist(1, [], 'a', {'idx' : 7})
quickfix-size
クイックフィックスリストとロケーションリストのエントリ数(サイズ)は、それぞれgetqflist()関数とgetloclist()関数を使って取得できます。例
echo getqflist({'size' : 1})
echo getloclist(5, {'size' : 1})
quickfix-context
任意のVim型をクイックフィックスまたはロケーションリストのコンテキストとして関連付けることができます。setqflist()関数とsetloclist()関数は、それぞれクイックフィックスリストとロケーションリストにコンテキストを関連付けるために使用できます。getqflist()関数とgetloclist()関数は、それぞれクイックフィックスリストとロケーションリストのコンテキストを取得するために使用できます。これは、複数のクイックフィックス/ロケーションリストを扱う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})
quickfix-parse
'errorformat'を使って、クイックフィックスリストを作成または変更することなく、行のリストを解析できます。この処理にはgetqflist()関数を使います。例
echo getqflist({'lines' : ["F1:10:Line10", "F2:20:Line20"]})
echo getqflist({'lines' : systemlist('grep -Hn quickfix *')})
これは、"items"キーに、行から解析されたクイックフィックスエントリのリストを含む辞書を返します。以下に、'errorformat'オプションを変更せずに、カスタムの'errorformat'を使用して行を解析する方法を示します。
echo getqflist({'efm' : '%f#%l#%m', 'lines' : ['F1#10#Line']})
クイックフィックスまたはロケーションリスト内のすべてのバッファでコマンドを実行する: :cdo
:cdo[!] {cmd} クイックフィックスリスト内の有効な各エントリで{cmd}を実行します。これは、以下のように動作します。
:cfirst
:{cmd}
:cnext
:{cmd}
etc.
現在のファイルを破棄できず、[!]が存在しない場合、コマンドは失敗します。次のエントリへの移動に失敗すると、実行は停止します。最後(またはエラーが発生した場所)のバッファが現在のバッファになります。{cmd}には、複数のコマンドを連結するための'|'を含めることができます。
クイックフィックスリスト内の有効なエントリのみが使用されます。範囲を使用してエントリを選択できます。例えば
:10,$cdo cmd
エントリ1から9をスキップする場合。
注: このコマンドの実行中、構文自動コマンドイベントは'eventignore'に追加されることで無効になります。これにより、各バッファの編集が大幅に高速化されます。また、:bufdo:tabdo:argdo:windo:ldo:cfdo、および:lfdoも参照してください。
:cfdo
:cfdo[!] {cmd} クイックフィックスリスト内の各ファイルで{cmd}を実行します。これは、以下のように動作します。
:cfirst
:{cmd}
:cnfile
:{cmd}
etc.
それ以外は、:cdoと同じように動作します。
:ldo
:ld[o][!] {cmd} 現在のウィンドウのロケーションリスト内の有効な各エントリで{cmd}を実行します。これは、以下のように動作します。
:lfirst
:{cmd}
:lnext
:{cmd}
etc.
ロケーションリスト内の有効なエントリのみが使用されます。それ以外は、:cdoと同じように動作します。
:lfdo
:lfdo[!] {cmd} 現在のウィンドウのロケーションリスト内の各ファイルで{cmd}を実行します。これは、以下のように動作します。
:lfirst
:{cmd}
:lnfile
:{cmd}
etc.
それ以外は、:ldoと同じように動作します。
クイックフィックスまたはロケーションリストのフィルタリング: cfilter-plugin :Cfilter :Lfilter クイックフィックスリストにエントリが多すぎる場合は、cfilterプラグインを使用してエントリ数を減らすことができます。プラグインを以下のようにロードします。
packadd cfilter
次に、以下のコマンドを使用してクイックフィックス/ロケーションリストをフィルタリングできます。
:Cfilter[!] /{pat}/
:Lfilter[!] /{pat}/
:Cfilterコマンドは、現在のクイックフィックスリスト内で{pat}に一致するエントリから新しいクイックフィックスリストを作成します。{pat}は、Vimの正規表現パターンです。ファイル名とエントリのテキストの両方が{pat}と照合されます。オプションの!が指定されている場合、{pat}に一致しないエントリが使用されます。パターンは、必要に応じて、以下のいずれかの文字で囲むことができます:'、"、/。パターンが空の場合、最後に使用された検索パターンが使用されます。
:Lfilterコマンドは、:Cfilterと同じ処理をしますが、現在のロケーションリストに対して動作します。
現在のクイックフィックス/ロケーションリストはこれらのコマンドによって変更されないため、:colder/|:lolder|コマンドを使用してフィルタリングされていないリストに戻ることができます。

2. エラーウィンドウ quickfix-window

:cope :copen w:quickfix_title :cope[n] [height] 現在のエラーリストを表示するウィンドウを開きます。
[height]が指定されている場合、ウィンドウはその高さになります(十分なスペースがある場合)。[height]が省略された場合、ウィンドウは10行の高さになります。
既にクイックフィックスウィンドウがある場合は、それが現在のウィンドウになります。2つ目のクイックフィックスウィンドウを開くことはできません。[height]が指定されている場合は、既存のウィンドウがそのサイズに変更されます。
quickfix-buffer
ウィンドウには、'buftype'が"quickfix"に設定された特別なバッファが含まれます。これを変更しないでください!ウィンドウには、クイックフィックスリストを生成したコマンドを示すw:quickfix_title変数が設定されます。これは、'statusline'の値が適切に調整されている場合に、カスタムのステータス行を作成するために使用できます。このバッファがクイックフィックスコマンドまたは関数によって変更されるたびに、b:changedtick変数がインクリメントされます。このバッファの番号は、"qfbufnr"項目を渡すことによってgetqflist()関数とgetloclist()関数を使って取得できます。ロケーションリストの場合、このバッファはロケーションリストが削除されると消去されます。
:lop :lopen :lop[en] [height] 現在のウィンドウのロケーションリストを表示するウィンドウを開きます。現在のウィンドウのロケーションリストが存在する場合にのみ機能します。一度に複数のロケーションウィンドウを開くことができます。それ以外の場合は、":copen"と同じように動作します。
:ccl :cclose :ccl[ose] クイックフィックスウィンドウを閉じます。
:lcl :lclose :lcl[ose] 現在のウィンドウのロケーションリストを表示するウィンドウを閉じます。
:cw :cwindow :cw[indow] [height] 認識されたエラーがある場合にクイックフィックスウィンドウを開きます。ウィンドウが既に開いていて、認識されたエラーがない場合は、ウィンドウを閉じます。
:lw :lwindow :lw[indow] [height] 現在のウィンドウのロケーションリストを表示するウィンドウを使用する点を除き、":cwindow"と同じです。
:cbo :cbottom :cbo[ttom] カーソルをクイックフィックスウィンドウの最後の行に置き、それを表示するようにスクロールします。これは、非同期コールバックによってエラーが追加された場合に便利です。再描画を避けるために、更新が多い場合は時々のみ呼び出してください。
:lbo :lbottom :lbo[ttom] 現在のウィンドウのロケーションリストを表示するウィンドウを使用する点を除き、":cbottom"と同じです。
通常、クイックフィックスウィンドウは画面の下部にあります。垂直分割がある場合は、ウィンドウの右端の列の下部にあります。常に全幅を占めるようにするには
:botright cwindow
ウィンドウ移動コマンドでウィンドウを移動できます。例えば、上部に移動するには:CTRL-W K 'winfixheight'オプションが設定されます。これは、ウィンドウが'winheight''equalalways'を無視して、ほぼその高さを維持することを意味します。高さは手動で変更できます(例えば、マウスでステータス行をドラッグすることで)。
クイックフィックスウィンドウでは、各行が1つのエラーです。行番号はエラー番号と同じです。現在のエントリはQuickFixLineハイライトで強調表示されます。これは、必要に応じて変更できます。例えば
:hi QuickFixLine ctermbg=Yellow guibg=Yellow
":.cc"を使用して、カーソルの下にあるエラーにジャンプできます。<Enter>キーを押すか、行をダブルクリックすると、同じ効果があります。エラーを含むファイルは、クイックフィックスウィンドウの上にあるウィンドウで開かれます。そのファイルのウィンドウが既に存在する場合は、代わりにそれが使用されます。使用したウィンドウのバッファが変更され、エラーが別のファイルにある場合、エラーへのジャンプは失敗します。最初に、ウィンドウに破棄できるバッファが含まれていることを確認する必要があります。
クイックフィックスウィンドウからファイルを選択すると、次の手順を使用してファイルを編集するウィンドウが検索されます。
1. 選択したファイルを表示するウィンドウが現在のタブページ(クイックフィックスウィンドウの前のウィンドウから開始)に存在する場合は、そのウィンドウが使用されます。 2. 上記の手順が失敗し、'switchbuf'に"usetab"が含まれ、選択したファイルを表示するウィンドウがタブページのいずれか(最初のタブページから開始)に存在する場合は、そのウィンドウが使用されます。 3. 上記の手順が失敗した場合は、'buftype'が設定されていないバッファを表示する現在のタブページのウィンドウ(クイックフィックスウィンドウの前のウィンドウから開始)が使用されます。 4. 上記の手順が失敗し、'switchbuf'に"uselast"が含まれている場合は、以前にアクセスしたウィンドウが使用されます。 5. 上記の手順が失敗した場合は、クイックフィックスウィンドウの前のウィンドウが使用されます。前のウィンドウがない場合は、クイックフィックスウィンドウの後のウィンドウが使用されます。 6. 上記の手順が失敗した場合は、クイックフィックスウィンドウの上に新しい水平分割ウィンドウが使用されます。
CTRL-W_<Enter> CTRL-W_<CR> CTRL-W <Enter>を使用して、新しいウィンドウを開き、そこにエラーをジャンプできます。
クイックフィックスウィンドウが入力されると、2つの自動コマンドイベントがトリガーされます。最初に、'filetype'オプションが"qf"に設定され、FileTypeイベントがトリガーされます(qf.vimも参照してください)。次に、バッファ名に"quickfix"を使用して、BufReadPostイベントがトリガーされます。これは、リストされたエラーに対して何らかのアクションを実行するために使用できます。例
au BufReadPost quickfix  setlocal modifiable
        \ | silent exe 'g/^/s//\=line(".") .. " "/'
        \ | setlocal nomodifiable
これにより、各行に行番号が先頭に追加されます。":s"コマンドの置換文字列で"\="が使用されていることに注意してください。これは、式を評価するために使用されます。BufWinEnterイベントも、バッファ名に"quickfix"を使用してトリガーされます。
注: 既存のクイックフィックスリストに追加する場合、自動コマンドはトリガーされません。
注: クイックフィックスウィンドウで変更を行っても、エラーリストには影響しません。'modifiable'は、変更を加えないようにオフになっています。それでも行を削除または挿入すると、テキストとエラー番号の関係が混乱します。どうしてもこれを行いたい場合は、クイックフィックスウィンドウの内容をファイルに書き込み、":cfile"を使用して解析し、新しいエラーリストとして使用できます。
ロケーションリストウィンドウ
ロケーションリストウィンドウには、ロケーションリストのエントリが表示されます。ロケーションリストウィンドウを開くと、現在のウィンドウの下に作成され、現在のウィンドウのロケーションリストが表示されます。ロケーションリストウィンドウは、クイックフィックスウィンドウに似ていますが、一度に複数のロケーションリストウィンドウを開くことができる点が異なります。このウィンドウでロケーションリストコマンドを使用すると、表示されているロケーションリストが使用されます。
ロケーションリストウィンドウからファイルを選択すると、次の手順でファイルを編集するウィンドウが検索されます。
1. ロケーションリストに関連付けられた非クイックフィックスウィンドウが現在のタブページに存在する場合は、そのウィンドウが使用されます。2. 上記の手順が失敗し、ファイルが現在のタブページの別のウィンドウで既に開かれている場合は、そのウィンドウが使用されます。3. 上記の手順が失敗し、'switchbuf'に "usetab" が含まれており、ファイルがいずれかのタブページのウィンドウで開かれている場合は、そのウィンドウが使用されます。4. 上記の手順が失敗した場合は、'buftype' が設定されていないバッファを表示している現在のタブページのウィンドウが使用されます。5. 上記の手順が失敗した場合は、新しいウィンドウでファイルが編集されます。
上記のすべての場合において、選択されたウィンドウのロケーションリストがまだ設定されていない場合は、ロケーションリストウィンドウに表示されているロケーションリストに設定されます。
クイックフィックスウィンドウID
getqflist() および getloclist() 関数を使用して、クイックフィックスウィンドウとロケーションリストウィンドウのウィンドウIDをそれぞれ取得できます(存在する場合)。例
echo getqflist({'winid' : 1}).winid
echo getloclist(2, {'winid' : 1}).winid
getqflistの例
getqflist() および getloclist() 関数を使用して、クイックフィックスリストとロケーションリストのさまざまな属性をそれぞれ取得できます。これらの関数の使用例を以下に示します。
" get the title of the current quickfix list
:echo getqflist({'title' : 0}).title
" get the identifier of the current quickfix list
:let qfid = getqflist({'id' : 0}).id
" get the identifier of the fourth quickfix list in the stack
:let qfid = getqflist({'nr' : 4, 'id' : 0}).id
" check whether a quickfix list with a specific identifier exists
:if getqflist({'id' : qfid}).id == qfid
" get the index of the current quickfix list in the stack
:let qfnum = getqflist({'nr' : 0}).nr
" get the items of a quickfix list specified by an identifier
:echo getqflist({'id' : qfid, 'items' : 0}).items
" get the number of entries in a quickfix list specified by an id
:echo getqflist({'id' : qfid, 'size' : 0}).size
" get the context of the third quickfix list in the stack
:echo getqflist({'nr' : 3, 'context' : 0}).context
" get the number of quickfix lists in the stack
:echo getqflist({'nr' : '$'}).nr
" get the number of times the current quickfix list is changed
:echo getqflist({'changedtick' : 0}).changedtick
" get the current entry in a quickfix list specified by an identifier
:echo getqflist({'id' : qfid, 'idx' : 0}).idx
" get all the quickfix list attributes using an identifier
:echo getqflist({'id' : qfid, 'all' : 0})
" parse text from a List of lines and return a quickfix list
:let myList = ["a.java:10:L10", "b.java:20:L20"]
:echo getqflist({'lines' : myList}).items
" parse text using a custom 'efm' and return a quickfix list
:echo getqflist({'lines' : ['a.c#10#Line 10'], 'efm':'%f#%l#%m'}).items
" get the quickfix list window id
:echo getqflist({'winid' : 0}).winid
" get the quickfix list window buffer number
:echo getqflist({'qfbufnr' : 0}).qfbufnr
" get the context of the current location list
:echo getloclist(0, {'context' : 0}).context
" get the location list window id of the third window
:echo getloclist(3, {'winid' : 0}).winid
" get the location list window buffer number of the third window
:echo getloclist(3, {'qfbufnr' : 0}).qfbufnr
" get the file window id of a location list window (winnr: 4)
:echo getloclist(4, {'filewinid' : 0}).filewinid
setqflistの例
setqflist() および setloclist() 関数を使用して、クイックフィックスリストとロケーションリストのさまざまな属性をそれぞれ設定できます。これらの関数の使用例を以下に示します。
" create an empty quickfix list with a title and a context
:let t = 'Search results'
:let c = {'cmd' : 'grep'}
:call setqflist([], ' ', {'title' : t, 'context' : c})
" set the title of the current quickfix list
:call setqflist([], 'a', {'title' : 'Mytitle'})
" change the current entry in the list specified by an identifier
:call setqflist([], 'a', {'id' : qfid, 'idx' : 10})
" set the context of a quickfix list specified by an identifier
:call setqflist([], 'a', {'id' : qfid, 'context' : {'val' : 100}})
" create a new quickfix list from a command output
:call setqflist([], ' ', {'lines' : systemlist('grep -Hn main *.c')})
" parse text using a custom efm and add to a particular quickfix list
:call setqflist([], 'a', {'id' : qfid,
            \ 'lines' : ["a.c#10#L10", "b.c#20#L20"], 'efm':'%f#%l#%m'})
" add items to the quickfix list specified by an identifier
:let newItems = [{'filename' : 'a.txt', 'lnum' : 10, 'text' : "Apple"},
                \ {'filename' : 'b.txt', 'lnum' : 20, 'text' : "Orange"}]
:call setqflist([], 'a', {'id' : qfid, 'items' : newItems})
" empty a quickfix list specified by an identifier
:call setqflist([], 'r', {'id' : qfid, 'items' : []})
" free all the quickfix lists in the stack
:call setqflist([], 'f')
" set the title of the fourth quickfix list
:call setqflist([], 'a', {'nr' : 4, 'title' : 'SomeTitle'})
" create a new quickfix list at the end of the stack
:call setqflist([], ' ', {'nr' : '$',
                    \ 'lines' : systemlist('grep -Hn class *.java')})
" create a new location list from a command output
:call setloclist(0, [], ' ', {'lines' : systemlist('grep -Hn main *.c')})
" replace the location list entries for the third window
:call setloclist(3, [], 'r', {'items' : newItems})

3. 複数のエラーリストの使用 quickfix-error-lists

これまでは、エラーリストが1つしかないことを前提としてきました。実際には、最後に使用された10個のリストが記憶されています。新しいリストを開始すると、前のリストは自動的に保持されます。古いエラーリストにアクセスするために、2つのコマンドを使用できます。これらのコマンドは、既存のエラーリストの1つを現在のリストとして設定します。
:colder :col E380 :col[der] [count] 古いエラーリストに移動します。[count] が指定されている場合は、[count] 回実行します。既に最も古いエラーリストにある場合は、エラーメッセージが表示されます。
:lolder :lol :lol[der] [count] :colder と同じですが、クイックフィックスリストの代わりに現在のウィンドウのロケーションリストを使用します。
:cnewer :cnew E381 :cnew[er] [count] 新しいエラーリストに移動します。[count] が指定されている場合は、[count] 回実行します。既に最も新しいエラーリストにある場合は、エラーメッセージが表示されます。
:lnewer :lnew :lnew[er] [count] :cnewer と同じですが、クイックフィックスリストの代わりに現在のウィンドウのロケーションリストを使用します。
:chistory :chi :[count]chi[story] エラーリストのリストを表示します。現在のリストは ">" でマークされます。出力は次のようになります。
  error list 1 of 3; 43 errors   :make
> error list 2 of 3; 0 errors    :helpgrep tag
  error list 3 of 3; 15 errors   :grep ex_help *.c
[count] が指定されている場合は、count番目のクイックフィックスリストが現在のリストになります。例
" Make the 4th quickfix list current
:4chistory
:lhistory :lhi :[count]lhi[story] ロケーションリストのリストを表示します。それ以外は、:chistory と同じです。
新しいエラーリストを追加すると、現在のリストになります。
":colder" を使用した後、":make" または ":grep" を使用して新しいエラーリストを追加すると、1つの新しいリストが上書きされます。これは、":grep" grep で参照している場合に特に便利です。より新しいエラーリストを保持したい場合は、最初に ":cnewer 99" を使用してください。
クイックフィックスとロケーションリストのスタック内のリストの数を取得するには、リスト番号を特殊な値 '$' に設定した getqflist() および getloclist() 関数をそれぞれ使用できます。例
echo getqflist({'nr' : '$'}).nr
echo getloclist(3, {'nr' : '$'}).nr
スタック内の現在のリストの番号を取得するには
echo getqflist({'nr' : 0}).nr

4. :make の使用 :make_makeprg

:mak :make :mak[e][!] [arguments] 1. 関連するすべての QuickFixCmdPre 自動コマンドが実行されます。2. 'autowrite' オプションがオンの場合は、変更されたバッファをすべて書き込みます。3. エラーファイル名は 'makeef' から作成されます。'makeef' に "##" が含まれていない場合、この名前のファイルが既に存在する場合は、削除されます。4. 'makeprg' オプションで指定されたプログラム(デフォルトは "make")が、オプションの [arguments] を付けて起動され、出力がエラーファイルに保存されます(Unix の場合は画面にもエコーされます)。5. エラーファイルは 'errorformat' を使用して読み込まれます。6. 関連するすべての QuickFixCmdPost 自動コマンドが実行されます。以下の例を参照してください。7. [!] が指定されていない場合は、最初のエラーにジャンプします。8. エラーファイルが削除されます。9. :cnext:cprevious などのコマンドを使用して、上記のようにエラーを移動できます。このコマンドはコメントを受け付けません。すべての " 文字は引数の一部と見なされます。プログラム出力のエンコーディングが 'encoding' オプションと異なる場合は、'makeencoding' オプションを使用してエンコーディングを指定できます。
:lmak :lmake :lmak[e][!] [arguments] ":make" と同じですが、クイックフィックスリストの代わりに現在のウィンドウのロケーションリストが使用されます。
":make" コマンドは、'makeprg' オプションで指定されたコマンドを実行します。これは、'shell' オプションで指定されたシェルにコマンドを渡すことによって行われます。これは、次のように入力するのとほぼ同じように機能します。
":!{makeprg} [arguments] {shellpipe} {errorfile}".
{makeprg} は、'makeprg' オプションで指定された文字列です。"make" だけでなく、任意のコマンドを使用できます。文字 '%' および '#' は、コマンドラインで通常どおり展開されます。"%<" を使用して拡張子なしの現在のファイル名を挿入したり、"#<" を使用して拡張子なしの代替ファイル名を挿入したりできます。たとえば
:set makeprg=make\ #<.o
[arguments] は、":make" の後に入力されるすべてのものです。{shellpipe} は、'shellpipe' オプションです。{errorfile} は、'makeef' オプションであり、## は一意にするために置換されます。
コマンドが引数の後にいくつかの追加文字を必要とする場合は、{makeprg} 内でプレースホルダー "$*" を引数リストに使用できます。$* はすべての引数で置き換えられます。例
:set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}
またはより簡単には
:let &mp = 'latex \\nonstopmode \\input\{$*}'
"$*" は複数回指定できます。たとえば
:set makeprg=gcc\ -o\ $*\ $*
'shellpipe' オプションのデフォルトは、Win32 では "2>&1| tee" です。これは、コンパイラの出力がファイルに保存され、画面に直接表示されないことを意味します。Unix の場合は、"| tee" が使用されます。コンパイラの出力は、画面に表示されると同時にファイルに保存されます。使用されるシェルに応じて、"|& tee" または "2>&1| tee" がデフォルトであるため、stderr 出力が含まれます。
'shellpipe' が空の場合、{errorfile} 部分は省略されます。これは、コンパイラ自体がエラーファイルに書き込む場合に便利です。
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 による例) もう 1 つのオプションは 'makeencoding' を使用することです。

5. :vimgrep および :grep の使用 grep lid

Vim には、パターンの一致を検索する方法が 2 つあります。内部と外部です。内部 grep の利点は、すべてのシステムで動作し、強力な Vim 検索パターンを使用することです。Vim grep が必要な動作をしない場合は、外部の grep プログラムを使用できます。
内部メソッドは、ファイルがメモリに読み込まれるため、遅くなります。利点は次のとおりです。
ファイルが編集されているかのように、行区切りとエンコーディングが自動的に認識されます。
Vim 検索パターンを使用します。複数行のパターンを使用できます。
プラグインが有効になっている場合:圧縮されたファイルとリモートファイルを検索できます。 gzip netrw
これを実行できるようにするために、Vim は各ファイルを編集中のようにロードします。ファイル内に一致がない場合、関連付けられたバッファは再び破棄されます。多くのファイルを検索するときにメモリやファイル記述子が不足するのを避けるために、'hidden' オプションはここでは無視されます。ただし、:hide コマンド修飾子が使用されている場合、バッファはロードされたままになります。これにより、同じファイルの検索が大幅に高速化されます。
:copen (または :lgrep の場合は :lopen)を使用して、検索結果をリンク形式で含むバッファを開くことができることに注意してください。:silent コマンドを使用して、デフォルトのフルスクリーングレップ出力を抑制できます。:grep コマンドの ":grep!" 形式では、最初の一致に自動的にジャンプしません。これらのコマンドを組み合わせて、NewGrep コマンドを作成できます。
command! -nargs=+ NewGrep execute 'silent grep! <args>' | copen 42
5.1 Vim の内部 grep の使用
:vim :vimgrep E682 E683 :vim[grep][!] /{pattern}/[g][j][f] {file} ... ファイル {file} ... で {pattern} を検索し、エラーリストを一致するように設定します。'wildignore' に一致するファイルは無視されます。'suffixes' 内のファイルは最後に検索されます。
{pattern} は Vim の検索パターンです。/ で囲む代わりに、{pattern} に出現しない限り、任意の非 ID 文字('isident' 参照)を使用できます。'ignorecase' が適用されます。これを上書きするには、大文字小文字を無視する場合は /\c を、大文字小文字を区別する場合は /\C をパターンに含めます。'smartcase' は使用されません。{pattern} が空の場合(例: // が指定された場合)、最後に使用された検索パターンが使用されます。last-pattern
フラグ: 'g' 'g' フラグがない場合、各行は 1 回だけ追加されます。'g' がある場合、すべてのマッチが追加されます。
'j' 'j' フラグがない場合、Vim は最初の一致箇所にジャンプします。'j' がある場合、クイックフィックスリストのみが更新されます。[!] を使用すると、現在のバッファの変更は破棄されます。
'f' 'f' フラグが指定されている場合、あいまい文字列マッチングを使用して、一致する行が検索されます。この場合、{pattern} は正規表現ではなく、リテラル文字列として扱われます。あいまい文字列マッチングの詳細については、fuzzy-matching を参照してください。
QuickFixCmdPreQuickFixCmdPost がトリガーされます。マッチングのために開かれるファイルはバッファ番号を使用する場合がありますが、バッファ番号の消費を避けるために可能な場合は再利用されます。
:{count}vim[grep] ... コマンドの前に数字が置かれた場合、これは検索する最大マッチ数として使用されます。最初の一致のみを見つけたい場合は、":1vimgrep pattern file" を使用します。一致があるかどうかを確認し、見つかったらすぐに終了したい場合に便利です。
検索されたファイル名は、進行状況の目安として、およそ 1 秒ごとに表示されます。例
:vimgrep /an error/ *.c
:vimgrep /\<FileName\>/ *.h include/*
:vimgrep /myfunc/ **/*.c
"**" の使用については、starstar-wildcard を参照してください。
:vim[grep][!] {pattern} {file} ... 上記と同様ですが、パターンを非 ID 文字で囲む代わりに、空白で区切られたパターンを使用します。パターンは ID 文字で始まる必要があります。例
:vimgrep Error *.c
:lv :lvimgrep :lv[imgrep][!] /{pattern}/[g][j][f] {file} ... :lv[imgrep][!] {pattern} {file} ... ":vimgrep" と同様ですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:vimgrepa :vimgrepadd :vimgrepa[dd][!] /{pattern}/[g][j][f] {file} ... :vimgrepa[dd][!] {pattern} {file} ... ":vimgrep" と同様ですが、新しいエラーリストを作成する代わりに、一致箇所が現在のリストに追加されます。
:lvimgrepa :lvimgrepadd :lvimgrepa[dd][!] /{pattern}/[g][j][f] {file} ... :lvimgrepa[dd][!] {pattern} {file} ... ":vimgrepadd" と同様ですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
5.2 外部 grep
Vim は、コンパイラの統合(上記の :make を参照)と同様の方法で、"grep" および grep のようなプログラム(GNU id-utils など)と連携できます。
[Unix の豆知識: Unix の "grep" コマンドの名前は、":g/re/p" から来ています。ここで "re" は正規表現を表します。]
:gr :grep :gr[ep][!] [arguments] ":make" と同様ですが、'makeprg' の代わりに 'grepprg' を、'errorformat' の代わりに 'grepformat' を使用します。'grepprg' が "internal" の場合、これは :vimgrep のように動作します。この場合、パターンは区切り文字で囲む必要があることに注意してください。プログラムの出力エンコーディングが 'encoding' オプションと異なる場合は、'makeencoding' オプションを使用してエンコーディングを指定できます。
:lgr :lgrep :lgr[ep][!] [arguments] ":grep" と同様ですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
:grepa :grepadd :grepa[dd][!] [arguments] ":grep" と同様ですが、新しいエラーリストを作成する代わりに、一致箇所が現在のリストに追加されます。例
:call setqflist([])
:bufdo grepadd! something %
最初のコマンドは空の新しいエラーリストを作成します。2 番目のコマンドは、リストされた各バッファに対して "grepadd" を実行します。":grepadd" が最初のエラーにジャンプするのを避けるために ! を使用していることに注意してください。:bufdo ではこれは許可されていません。引数リストを使用し、一致箇所がないファイルのエラーを回避する例
:silent argdo try
  \ | grepadd! something %
  \ | catch /E480:/
  \ | endtry"
プログラムの出力エンコーディングが 'encoding' オプションと異なる場合は、'makeencoding' オプションを使用してエンコーディングを指定できます。
:lgrepa :lgrepadd :lgrepa[dd][!] [arguments] ":grepadd" と同様ですが、クイックフィックスリストの代わりに、現在のウィンドウのロケーションリストが使用されます。
5.3 外部 grep の設定
標準の "grep" プログラムがインストールされている場合、:grep コマンドはデフォルトでうまく機能する可能性があります。構文は標準コマンドと非常によく似ています
:grep foo *.c
.c 拡張子のすべてのファイルで、部分文字列 "foo" を検索します。:grep の引数は "grep" プログラムに直接渡されるため、"grep" がサポートするオプションを使用できます。
デフォルトでは、:grep は -n オプション(ファイルと行番号を表示)を指定して grep を呼び出します。これは 'grepprg' オプションで変更できます。'grepprg' を設定する必要があるのは、次の場合です。
a) "grep" という名前ではないプログラムを使用している場合 b) grep をフルパスで呼び出す必要がある場合 c) その他のオプション(例: 大文字小文字を区別しない検索)を自動的に渡したい場合
"grep" が実行されると、Vim は 'grepformat' オプションを使用して結果を解析します。このオプションは 'errorformat' オプションと同じように機能します。詳細についてはそちらを参照してください。grep が標準ではない形式で出力する場合、または特別な形式の他のプログラムを使用している場合は、デフォルトから 'grepformat' を変更する必要がある場合があります。
結果が解析されると、Vim は一致を含む最初のファイルをロードし、quickfix モードでコンパイラエラーにジャンプするのと同じ方法で、適切な行にジャンプします。その後、:cnext:clist などのコマンドを使用して、その他の一致箇所を確認できます。
5.4 id-utils で :grep を使用する
次のようにして、GNU id-utils で :grep を使用するように設定できます
: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() 関数を変更している間に、上位レベルから引数を取得する必要がある別の関数が見つかります。ここでまた ":vimgrep" を使用して、これらの関数を見つけることができます。1 つの関数の作業が完了したら、次を使用できます
:colder
前の関数に戻ります。
これはツリーをブラウズするようなものです。":vimgrep" は 1 レベル深く入り、ブランチのリストを作成します。":colder" は前のレベルに戻ります。":vimgrep" と "colder" を組み合わせて使用すると、ツリーのような方法ですべての場所をブラウズできます。これを一貫して行うと、"todo" リストを書き留める必要なく、すべての場所を見つけることができます。

6. コンパイラの選択 compiler-select

:comp :compiler E666 :comp[iler][!] {name} コンパイラ {name} を使用するためのオプションを設定します。"!" がない場合、オプションは現在のバッファに設定されます。"!" がある場合、グローバルオプションが設定されます。"file.foo" で ":compiler foo" を使用し、別のバッファで ":compiler! bar" を使用した場合、Vim は "file.foo" で引き続き "foo" を使用します。
"compiler" ディレクトリにある Vim プラグインは、選択されたコンパイラを使用するためのオプションを設定します。:compiler の場合はローカルオプションが設定され、:compiler! の場合はグローバルオプションが設定されます。current_compiler
古いバージョンの Vim をサポートするために、プラグインは常に "b:current_compiler" ではなく "current_compiler" を使用します。コマンドが実際に行うことは次のとおりです。
"current_compiler" および "b:current_compiler" 変数を削除します。
"CompilerSet" ユーザーコマンドを定義します。"!" がある場合は ":set" を実行し、"!" がない場合は ":setlocal" を実行します。
":runtime! compiler/{name}.{vim,lua}" を実行します。プラグインは "CompilerSet" を使用してオプションを設定し、"current_compiler" 変数をコンパイラの名前に設定する必要があります。
"CompilerSet" ユーザーコマンドを削除します。
"b:current_compiler" を "current_compiler" の値に設定します。
"!" がない場合、"current_compiler" の古い値が復元されます。
コンパイラプラグインの作成については、write-compiler-plugin を参照してください。
compiler-make プラグインを使用して、コンパイラプラグインの効果を取り消します。
g/b:`c_cppcheck_params` を使用して、cppcheck のパラメータを設定します。デフォルトのグローバル設定には以下が含まれます。
--verbose: 詳細な出力を有効にします。
--force: すべての構成のチェックを強制します。
--inline-suppr: インライン抑制を許可します。
--enable=...: 警告、スタイル、パフォーマンス、移植性、情報、および欠落しているインクルードなど、特定のチェックを有効にします。
-j: 利用可能な場合は複数のプロセッサを使用します。利用可能かどうかはgetconfコマンドで判断します (unusedFunctionチェックを省略する必要があります)。
C++ファイル (filetype == 'cpp') の場合、CppcheckがファイルをC++として扱うように、--language=c++オプションが追加されます。
現在のディレクトリにcompile_commands.jsonが存在する場合、コマンドラインに--projectパラメータとして追加されます。それ以外の場合、デフォルトでは&path内のディレクトリがインクルードディレクトリとして渡されます。これらは、-Iフラグのリストとしてg/b:c_cppcheck_includesで設定できます。Tim Popeのvim-apathyプラグイン [0] は&pathを展開できます。また、gitリポジトリ内のフォルダも追加するには、以下を使用してください。
let &l:path = join(systemlist('git ls-tree -d --name-only -r HEAD'), ',')
[0] https://github.com/tpope/vim-apathy
.NET CLIコンパイラはデフォルトでエラーと警告の両方を出力します。g:dotnet_errors_only変数をv:trueに設定することで、出力をエラーのみに制限できます。
関連するプロジェクト名が各エラーと警告に含まれます。プロジェクト名を抑制するには、g:dotnet_show_project_file変数をv:falseに設定します。
例: 出力をエラーのみに制限し、プロジェクト名を抑制する
let dotnet_errors_only = v:true
let dotnet_show_project_file = v:false
compiler dotnet
GCCコンパイラには設定できる変数が1つあります。
g:compiler_gcc_ignore_unmatched_lines GCC用に定義されたパターンに一致しない行を無視します。makeから実行されるコマンドの出力が誤検出を生成する場合に役立ちます。
よく使用されるコンパイラオプションは、g:javac_makeprg_params変数を設定することで、'makeprg'に追加できます。例:
let g:javac_makeprg_params = "-Xlint:all -encoding utf-8"

GNU MAKE compiler-make

デフォルトのmakeプログラムは "make" であるため、makeのコンパイラプラグインである:compiler makeは、'makeprg''errorformat'オプションをデフォルト値にリセットし、以前のコンパイラプラグインによって設定された可能性のある変数を未定義にします。
GROFFコンパイラプラグインは、入力としてmomマクロセット(groff_mom manpageに記載)を使用し、出力ファイルタイプの拡張子がmakeに渡されることを期待します(例: :make html または :make pdf)。
追加の引数は、b:groff_compiler_argsまたはg:groff_compiler_argsで設定することでgroffに渡すことができます。groffに渡されるlanguage引数は、'spelllang'を使用して設定されます。b:groff_compiler_langを設定することで上書きできます。デフォルトのエンコーディングはUTF-8であり、b:groff_compiler_encodingまたはg:groff_compiler_encodingを設定することで変更できます。
Pandocコンパイラプラグインは、出力ファイルタイプの拡張子がmakeに渡されることを期待します(例: :make html または :make pdf)。
追加の引数をpandocに渡すことができます。
makeに追加することで (例: :make html --self-contained)。
または、b:pandoc_compiler_argsまたはg:pandoc_compiler_argsで設定することで。
--from引数は、バッファのファイルタイプを使用して推測されます。b:pandoc_compiler_fromを設定することで上書きできます。--metadata lang引数は、'spelllang'を使用して設定されます。--from=markdownが想定されており、タイトルヘッダーまたはYAMLブロックにタイトルが設定されていない場合は、ファイル名(拡張子なし)がタイトルとして使用されます。
Perlコンパイラプラグインは実際にはコンパイルしませんが、Perlの内部構文チェック機能を呼び出し、出力から起こりうるエラーを解析して、クイックフィックスモードで修正できるようにします。
警告は、チェック対象のファイル内の "no warnings" または "$^W = 0" に関係なく強制されます。これを無効にするには、g:perl_compiler_force_warningsをゼロ値に設定します。例:
let g:perl_compiler_force_warnings = 0

PYUNIT COMPILER compiler-pyunit

これは実際にはコンパイラではなく、Python言語の単体テストフレームワークです。バージョン2.0以降の標準Pythonディストリビューションに含まれています。古いバージョンでは、https://pyunit.sourceforge.netから入手できます。
フレームワークを使用してテストを実行すると、発生したエラーはVimによって解析され、クイックフィックスモードで表示されます。
残念ながら、テストを実行する標準的な方法はありません。alltests.pyスクリプトが非常によく使用されているようですが、それだけです。'makeprg'オプションの有用な値は次のとおりです。setlocal makeprg=./alltests.py " テストスイートを実行する setlocal makeprg=python\ %:S " 単一のテストケースを実行する

TEX COMPILER compiler-tex

ディストリビューションに含まれるTeXのコンパイラ($VIMRUNTIME/compiler/tex.vim)は、可能であればmakeコマンドを使用します。コンパイラが現在のディレクトリに "Makefile" または "makefile" という名前のファイルを見つけた場合、*TeXファイルをmakeで処理したいと想定し、makefileが適切な処理を行います。この場合、コンパイラは*TeX出力用の'errorformat'を設定し、'makeprg'は変更しません。"Makefile" も "makefile" も見つからない場合、コンパイラはmakeを使用しません。b:tex_ignore_makefileまたはg:tex_ignore_makefile変数を定義することで、コンパイラにmakefileを無視させることができます(存在のみがチェックされます)。
コンパイラがmakeを使用しないことを選択した場合、入力処理に適切なプログラムを選択する必要があります。b:tex_flavorまたはg:tex_flavor(この優先順位)変数が存在する場合、:makeのTeXフレーバー(実際には実行されるコマンドの名前)を定義し、両方の変数が存在しない場合は、デフォルトで"latex"になります。例: AMS-TeXで記述されたmypaper.texから\input-edされたchapter2.texを編集している場合
:let b:tex_flavor = 'amstex'
:compiler tex
[編集...]
:make mypaper
引数として処理するファイルの名前を指定する必要があることに注意してください(\input-edまたは\include-edファイルを編集するときに正しいファイルを処理するため; 引数なしで%を代用する移植性のあるソリューションを歓迎します)。これは、ソースではなくターゲットを指定するmakeのセマンティクスにはありませんが、拡張子".tex"なしでファイル名を指定して、「コンパイラに応じてfilename.dviまたはfilename.pdfまたはfilename.some_result_extensionをmakeする」という意味で使用できます。
注: texコマンドライン構文は、MikTeX(Srinath Avadhanulaの提案)とteTeX(Artem Chuprinaが確認)の両方で使用できるように設定されています。errorformat-LaTeXからの提案は、さまざまなシェルやOSで動作するように維持するには複雑すぎ、利用可能な他のTeXオプションを使用することもできません。TeXが "-interaction=nonstopmode" をサポートしていない場合は、コマンドラインから\nonstopmodeを表現する別の方法で報告してください。

TYPST COMPILER compiler-typst

VimにはTypstファイル用のコンパイラプラグインが含まれています。このコンパイラは、Typstファイルタイププラグイン ft-typst-plugin によってTypstバッファで自動的に有効になります。現在のTypstファイルをコンパイルするには、:makeを実行します。
g:typst_cmd
デフォルトでは、VimはTypstコンパイラを実行するコマンドとして "typst" を使用します。これは、g:typst_cmd変数を設定することで変更できます。
let g:typst_cmd = "/path/to/other/command"

7. エラー形式 error-file-format

errorformat E372 E373 E374 E375 E376 E377 E378 'errorformat'オプションは、認識される形式のリストを指定します。エラーメッセージと一致する最初の形式が使用されます。コンパイラが生成するさまざまなメッセージ、または複数のコンパイラのエントリに複数の形式を追加できます。efm-entriesを参照してください。
'errorformat'の各エントリは、形式を記述するscanfのような文字列です。まず、scanfがどのように機能するかを知る必要があります。Cコンパイラのドキュメントを参照してください。以下に、Vimが理解する%項目を示します。その他は無効です。
'errorformat'の特殊文字は、コンマとバックスラッシュです。それらの扱いについては、efm-entriesを参照してください。リテラルの"%"は "%%" で一致することに注意してください。したがって、バックスラッシュでエスケープされません。:makeおよび:grep出力では、すべてのNUL文字がSOH (0x01) に置き換えられることに注意してください。
注: デフォルトでは、大文字と小文字の違いは無視されます。大文字と小文字を区別して一致させる場合は、パターンに "\C" を追加してください /\C
Vimは任意の長さの行を読み取りますが、最初の4095バイトのみが使用され、残りは無視されます。項目は1023バイトまでしか使用できません。
基本項目
%f ファイル名 (文字列を検索) %b バッファ番号 (数値を検索) %o モジュール名 (文字列を検索) %l 行番号 (数値を検索) %e 最終行番号 (数値を検索) %c カラム番号 (エラーが発生した文字カラムを表す数値、バイトインデックス、<tab> は1文字カラムとして扱う) %v 仮想カラム番号 (エラーが発生した画面カラムを表す数値 (1 <tab> == 8 画面カラム)) %k 最終カラム番号 (エラーが発生した文字カラムを表す数値、バイトインデックス、または %v と併用した場合はエラーが発生した画面の最終カラムを表す数値) %t エラーの種類 (1文字を検索): e - エラーメッセージ w - 警告メッセージ i - 情報メッセージ n - 注釈メッセージ %n エラー番号 (数値を検索) %m エラーメッセージ (文字列を検索) %r 1行のファイルメッセージの「残り」にマッチ %O/P/Q %p ポインタ行 ('-', '.', ' ' またはタブの並びを検索し、その長さをカラム番号として使用) %*{conv} 任意の scanf による非代入変換 %% 単一の '%' 文字 %s 検索テキスト (文字列を検索)
"%f" 変換は、現在の 'isfname' 設定に依存する場合があります。"~/" はホームディレクトリに展開され、環境変数は展開されます。
"%f" と "%m" 変換は、文字列の終端を検出する必要があります。これは通常、続く文字と項目にマッチすることによって行われます。何も続かない場合は、行の残りの部分がマッチします。"%f" の後に '%' またはバックスラッシュが続く場合は、'isfname' 文字の並びを探します。
Windows では、"%f:" を使用している場合でも、先頭の "C:" は "%f" に含まれます。これは、1つのアルファベット文字のファイル名が検出されないことを意味します。
"%b" 変換は、バッファ番号を解析するために使用されます。これは、スクラッチバッファや名前のないバッファ内の行を参照する場合に便利です。マッチする番号のバッファが存在しない場合、その行はエラーのない行として使用されます。
"%p" 変換は、通常、"^" が後に続きます。これは、以下のような行を出力するコンパイラで使用されます。
^
または
---------^
エラーのカラムを示すためです。これは、複数行のエラーメッセージで使用します。役立つ例については、errorformat-javac を参照してください。
"%s" 変換は、エラー行を見つけるために検索するテキストを指定します。テキストはリテラル文字列として使用されます。エラー行を正確に一致させるためにテキストに "^" と "$" のアンカーが追加され、テキストは "\V" アトムを接頭辞として「非常に非マジック」になります。 "%s" 変換は、エラー出力に行番号が含まれていない行を見つけるために使用できます。 "grep" シェルコマンドの出力のように。パターンが存在する場合、行番号は使用されません。
"%o" 変換は、クイックフィックスエントリのモジュール名を指定します。存在する場合は、ファイル名の代わりにクイックフィックスエラーウィンドウで使用されます。モジュール名は表示目的でのみ使用され、ファイルにジャンプするときはファイル名が使用されます。
ディレクトリの変更
次の大文字の変換文字は、特殊なフォーマット文字列のタイプを指定します。それらのうち最大1つを、コンマ区切りの単一のフォーマットパターンの先頭にプレフィックスとして指定できます。一部のコンパイラは、%f で読み取られる各ファイル名にプリペンドする必要があるディレクトリ名で構成されるメッセージを生成します (例: GNU make)。次のコードを使用して、これらのディレクトリ名をスキャンできます。それらは内部ディレクトリスタックに格納されます。E379
%D "ディレクトリに入る" フォーマット文字列。ディレクトリ名を検索する後続の %f が必要 %X "ディレクトリを離れる" フォーマット文字列。後続の %f が必要
"ディレクトリに入る" または "ディレクトリを離れる" フォーマットを定義する場合、"%D" または "%X" はそのサブ文字列の先頭に指定する必要があります。Vim はディレクトリの変更を追跡し、相対パスを持つエラーのあるファイルが見つかるたびに、現在のディレクトリをプリペンドします。詳細、ヒント、および制限事項については、quickfix-directory-stack を参照してください。
複数行メッセージ errorformat-multi-line
複数行メッセージを生成するプログラムの出力を読み込むことができます。つまり、複数行にわたるエラー文字列です。可能なプレフィックスは次のとおりです。%E 複数行エラーメッセージの開始 %W 複数行警告メッセージの開始 %I 複数行情報メッセージの開始 %N 複数行注釈メッセージの開始 %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/python3.8/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
ここで %C 文字列は %A の前に指定されていることに注意してください。これは、式 ' %.%#' (これは正規表現 ' .*' を表します) はスペースで始まり、行の最後まで任意の文字が続くすべての行に一致するため、行 7 も隠蔽し、それ以外の場合は個別のエラーメッセージをトリガーするからです。エラーフォーマット文字列は、最初に一致が発生するまで、常にパターンごとに解析されます。efm-%>
%> アイテムを使用すると、'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 が前のエラー行に一致したというだけでは、cc と dd が複数行のエラーフォーマット文字列であっても、現在の行で最初に dd が試行されるという意味ではありません。
これらのプレフィックスは、ファイル名が一度指定され、このファイル名を参照する複数のメッセージが続く場合に役立ちます。%O 単一行ファイルメッセージ: マッチした部分をオーバーリード %P 単一行ファイルメッセージ: ファイル %f をスタックにプッシュ %Q 単一行ファイルメッセージ: スタックから最後のファイルをポップ
例: 次のエラーログファイルを出力するコンパイラがあるとします (先頭の行番号なし)。
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 を参照してください。
メッセージの無視と全体の使用 efm-ignore
コード '+' または '-' は上記の大文字コードと組み合わせることができます。その場合、文字の前に配置する必要があります。たとえば、'%+A' または '%-G' のようにします。%- 一致する複数行を出力に含めない %+ 一致する行全体を %m エラー文字列に含める
1 つのプレフィックスは、'+' または '-' と組み合わせてのみ役立ちます。つまり、%G です。これは、コンパイラバージョン文字列やスキップできるその他のヘッダーなどの一般情報を含む行を解析します。%-G このメッセージを無視 %+G 一般メッセージ
パターンマッチング
scanf() のような "%*[]" 表記は、以前のバージョンの Vim との下位互換性のためにサポートされています。ただし、フォーマット文字列では (ほぼ) Vim がサポートする任意の正規表現を指定することも可能です。正規表現言語のメタ文字は、通常のマッチング文字列またはファイル名の一部である可能性があり (したがって、内部でエスケープする必要がある)、メタシンボルは先頭に '%' を付けて記述する必要があります: %\ 単一の '\' 文字。これは ":set errorformat=" 定義でエスケープ ("%\\") する必要があることに注意してください。%. 単一の '.' 文字。%# 単一の "*"(!) 文字。%^ 単一の '^' 文字。これは役に立たないことに注意してください。パターンはすでに行の先頭に一致しています。%$ 単一の '$' 文字。これは役に立たないことに注意してください。パターンはすでに行の末尾に一致しています。%[ [] 文字範囲の単一の '[' 文字。%~ 単一の '~' 文字。式で文字クラスを使用する場合 (概要については /\i を参照)、"\+" 量詞を含む項は scanf() "%*" 表記で記述できます。例: "%\\d%\\+" ("\d\+", "任意の数値") は "%*\\d" と同等です。重要事項: サブマッチの \(...\) グループ化は、内部変換用に予約されているため、フォーマット仕様では使用できません。
'errorformat' の複数のエントリ efm-entries
複数のコンパイラからの出力を検出できるように、複数のフォーマットパターンを'errorformat'にコンマで区切って入れることができます(注:コンマの後の空白は無視されます)。完全に一致する最初のパターンが使用されます。一致するものが見つからない場合は、最後のパターンのマッチング部分が使用されますが、ファイル名は削除され、エラーメッセージはメッセージ全体に設定されます。複数のコンパイラの出力に(正しくない方法で)一致する可能性があるパターンがある場合は、より制限の強いパターンの後に置いてください。
パターンにコンマを含めるには、バックスラッシュでエスケープします(":set" コマンドでは2つ入力する必要があります)。バックスラッシュ自体を含めるには、2つのバックスラッシュを記述します(":set" コマンドでは4つ入力する必要があります)。また、":set" の場合は、スペースの前にバックスラッシュを置く必要があります。
有効な一致 quickfix-valid
行が'errorformat'のエントリのいずれかと完全に一致しない場合、行全体がエラーメッセージに入れられ、エントリは「無効」とマークされます。これらの行は、":cn" および ":cp" コマンドでスキップされます(有効な行がまったくない場合を除く)。":cl!" を使用してすべてのエラーメッセージを表示できます。
エラーフォーマットにファイル名が含まれていない場合、Vimは正しいファイルに切り替えることができません。これは手動で行う必要があります。
たとえば、Amiga Aztecコンパイラの出力形式は次のとおりです。
filename>linenumber:columnnumber:errortype:errornumber:errormessage
filename エラーが検出されたファイルの名前 linenumber エラーが検出された行番号 columnnumber エラーが検出された列番号 errortype エラーの種類。通常は 'E' または 'W' の1文字 errornumber エラーの番号(マニュアルで参照用) errormessage エラーの説明
これは、次の'errorformat'エントリで一致させることができます:%f>%l:%c:%t:%n:%m
単一行のエラー出力を生成するCコンパイラの例をいくつか示します: %f:%l:\ %t%*[^0123456789]%n:\ %m (Manx/Aztec Cエラーメッセージの場合、scanf() は [0-9] を理解しません) %f\ %l\ %t%*[^0-9]%n:\ %m (SAS Cの場合) \"%f\"\\,%*[^0-9]%l:\ %m (汎用Cコンパイラの場合) %f:%l:\ %m (GCCの場合) %f:%l:\ %m,%Dgmake[%*\\d]:\ Entering\ directory\%f', %Dgmake[%*\\d]:\ Leaving\ directory\%f' (gmakeを使用するGCCの場合(行を連結!)) %f(%l)\ :\ %*[^:]:\ %m (古いSCO Cコンパイラ(pre-OS5)) %f(%l)\ :\ %t%*[^0-9]%n:\ %m (エラータイプと番号付きの idem) %f:%l:\ %m,In\ file\ included\ from\ %f:%l:,\^I\^Ifrom\ %f:%l%m (GCCの場合、いくつかの追加あり)
複数行メッセージの処理に関する詳細な例については、以下のerrorformat-Jikes および errorformat-LaTeXを参照してください。
スペースと二重引用符の前にあるバックスラッシュに注意してください。これは :set コマンドに必要です。コンマの前には2つのバックスラッシュがあります。1つは :set コマンド用で、もう1つはコンマをエラーフォーマットの区切り記号として認識しないようにするためです。
メッセージのフィルタリング
フォーマット文字列に適合しないエラーメッセージを生成するコンパイラがある場合は、エラーメッセージをこの形式に変換するプログラムを作成できます。このプログラムは、'makeprg'オプションを変更することで、":make"コマンドで使用できます。例えば
:set mp=make\ \\\|&\ error_filter
パイプ文字の前にあるバックスラッシュは、コマンド区切り記号として認識されないようにするために必要です。各スペースの前のバックスラッシュは、setコマンドに必要です。

8. ディレクトリスタック quickfix-directory-stack

Quickfixは、make出力から解析された使用済みディレクトリをすべて保存するためのスタックを保持します。GNU-makeの場合、これは非常に簡単です。GNU-makeは、入力および終了するすべてのディレクトリの絶対パスを常に印刷するからです。これがmakefileの'cd'コマンド経由で行われるか、パラメータ "-C dir"(makefileを読み込む前にディレクトリを変更する)で行われるかは関係ありません。スイッチ "-w"を使用して、処理の前後に作業ディレクトリを強制的に出力するようにGNU-makeに指示すると便利な場合があります。
GNU-makeを使用しない場合は、正しいディレクトリを維持するのがより複雑になります。たとえば、AIX-makeは作業ディレクトリに関する情報を何も出力しません。その場合は、makefileを強化する必要があります。LessTifのmakefileには、「Making {target} in {dir}」を出力するコマンドがあります。ここでの特別な問題は、ディレクトリを離れる情報が出力されないことと、絶対パスが出力されないことです。
相対パスと「ディレクトリを離れる」メッセージの欠落の問題を解決するために、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"になります。
これは、「ディレクトリを離れる」メッセージでのみ解決できます。
2)次のディレクトリとファイルがあるとします。./dir1 ./dir1/dir2 ./dir2
次のようになります。
Make出力 Vimが解釈するディレクトリ ------------------------ ---------------------------- Making all in dir1 ./dir1 Making all in dir2 ./dir1/dir2 Making all in dir2 ./dir1/dir2
これは、「ディレクトリを入力」メッセージに絶対ディレクトリを出力するか、「ディレクトリを離れる」メッセージを出力することで解決できます。
この問題を回避するには、絶対ディレクトリ名と「ディレクトリを離れる」メッセージを出力するようにしてください。
Makefileの例
Unix:libs: for dn in $(LIBDIRS); do \ (cd $$dn; echo "Entering dir '$$(pwd)'"; make); \ echo "Leaving dir"; \ done
上記の出力を処理するには、'errorformat'に%DEntering\ dir\ '%f',%XLeaving\ dirを追加します。
Vimは、「ディレクトリを離れる」メッセージのディレクトリ名が現在のディレクトリであるかどうかをチェックしないことに注意してください。これが、メッセージ「Leaving dir」を使用できる理由です。

9. 特定のエラーファイル形式 errorformats

errorformat-Jikes
IBM Researchが公開しているソースからバイトコードへのJavaコンパイラであるJikes(TM)は、単純な複数行のエラーメッセージを生成します。
生成されたメッセージに一致する'errorformat'文字列を以下に示します。次の行をユーザーのinit.vimに配置して、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" を付けて呼び出すと、単一行のエラーメッセージを生成し、以下で一致させることができます。
:setl efm=%f:%l:%v:%*\\d:%*\\d:%*\\s%m
errorformat-javac
この'errorformat'は、エラーの列を示すために "^" を含む行を出力するjavacでうまく機能すると報告されています。
:setl efm=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
または
:setl efm=%A%f:%l:\ %m,%+Z%p^,%+C%.%#,%-G%.%#
これは、最初にエラーをフィルタリングするUnixのMichael F. Lambによる別の方法です。
:setl errorformat=%Z%f:%l:\ %m,%A%p^,%-G%*[^sl]%.%#
:setl makeprg=javac\ %:S\ 2>&1\ \\\|\ vim-javac-filter
次の内容をパス内のどこか(たとえば、~/bin内)に「vim-javac-filter」として配置し、実行可能にする必要があります。
#!/bin/sed -f
/\^$/s/\t/\ /g;/:[0-9]\+:/{h;d};/^[ \t]*\^/G;
英語では、そのsedスクリプトは次のとおりです。
単一のタブを単一のスペースに変更し、
ファイル名、行番号、エラーメッセージを含む行を、ポインター行の直後に移動します。そうすることで、未使用のエラーテキストは「複数行メッセージ」というVimの概念を壊すことなく、また、「複数行メッセージの継続」として含める必要もありません。
errorformat-ant
ant(https://jakarta.apache.org/)の場合、上記のerrorformatは、javac出力行の先頭にある[javac]を尊重するように変更する必要があります。
:set efm=%A\ %#[javac]\ %f:%l:\ %m,%-Z\ %#[javac]\ %p^,%-C%.%#
'errorformat'は、antをjavacまたはjikesのいずれかと一緒に処理するように構成することもできます。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%.%#
errorformat-jade
jade(http://www.jclark.com/参照)エラーの解析は簡単です。
:set efm=jade:%f:%l:%c:%t:%m
errorformat-LaTeX
以下は、複数行にエラーメッセージを表示する(La)TeX組版システムに'errorformat'文字列を指定する方法の例です。":clist" および ":cc" などのコマンドの出力は、複数行を単一行に表示し、先頭の空白が削除されます。上記のLaTeXエラーフォーマットは、複数行エラーで構成されるコンパイラ出力に適応させるのは簡単であるはずです。
これらのコマンドは、vimrcファイルまたは他のVimスクリプトファイル、たとえば、LaTeXソースの編集時にのみロードされるLaTeX関連のものが含まれるスクリプトに配置できます。例のすべての行を(指定された順序で)コピーし、後でコメント行を削除するようにしてください。一部の行の先頭にある '\' 表記については、行継続を参照してください。
最初に、LaTeXが複数のエラーを報告するように、'makeprg'を準備します。最初のエラーが発生したときに停止しないでください。
:set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}
複数行エラーメッセージの開始
:set efm=%E!\ LaTeX\ %trror:\ %m,
       \%E!\ %m,
複数行警告メッセージの開始。最初の2つには行番号も含まれます。一部の正規表現の意味
"%.%#" (".*") は、(空の可能性のある)文字列に一致します
"%*\\d" ("\d\+") は、数値に一致します
\%+WLaTeX\ %.%#Warning:\ %.%#line\ %l%.%#,
\%+W%.%#\ at\ lines\ %l--%*\\d,
\%WLaTeX\ %.%#Warning:\ %m,
エラー/警告メッセージの可能性のある継続。最初のものでは行番号も含まれます
\%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出力ログでは、エラーのあるソースファイルの名前は行ごとに指定されていません。むしろ、括弧で囲まれたグローバルで指定されています。次のパターンは、これらの名前に一致させ、内部スタックに格納しようとします。パターンは、同じ入力行(次々と)をスキャンする可能性があり、末尾の "%r" 変換は、行末に達するまで次の実行で解析される行の「残り」を示します。
'('...')' で囲まれたファイル名を見過ごします。ファイルにエラーが含まれていないと思われるため、スタックにプッシュしないでください
\%+O(%f)%r,
ファイル名をスタックにプッシュします。名前は '(' の後に指定されます
\%+P(%f%r,
\%+P\ %\\=(%f%r,
\%+P%*[^()](%f%r,
\%+P[%\\d%[^()]%#(%f%r,
')' がスキャンされると、最後に保存されたファイル名をポップします
\%+Q)%r,
\%+Q%*[^()])%r,
\%+Q[%\\d%*[^()])%r
LaTeX の出力ログにあるファイル名は、場合によっては正しく解析できないことに注意してください。パーサーが、バランスの取れていない括弧によって混乱している可能性があります。上記の例は、最も関連性の高いケースのみをキャッチしようとしています。与えられた設定を、たとえば、すべての迷惑な「Overfull ...」警告がエラーとして認識されないように、自分の目的に合わせてカスタマイズできます。LaTeX コンパイラの出力をフィルタリングする代わりに、[La]TeX コンパイラによって生成された *.log ファイルを直接読み取ることも可能です。これには、考えられるエラーの原因に関するさらに役立つ情報が含まれています。ただし、このような複雑なファイルを適切に解析するには、外部フィルタを使用する必要があります。Vim にそのようなフィルタを認識させる方法については、上記の説明を参照してください。

10. クイックフィックスウィンドウのカスタマイズ quickfix-window-function

クイックフィックスウィンドウおよびロケーションリストウィンドウに表示される行のデフォルト形式は、次のとおりです。
<filename>|<lnum> col <col>|<text>
各行に表示される値は、getqflist() 関数によって返される「bufnr」、「lnum」、「col」、および「text」フィールドに対応します。
クイックフィックス/ロケーションリストによっては、表示されるテキストをカスタマイズする必要があります。たとえば、クイックフィックスエントリに対してファイル名のみが存在する場合、ファイル名の後の 2 つの "|" フィールド区切り文字は不要です。別のユースケースは、ファイル名に対して表示されるパスをカスタマイズすることです。デフォルトでは、現在のディレクトリツリーの下にないファイルの場合、完全なパス(長すぎる可能性があります)が表示されます。ファイルパスは、共通の親ディレクトリに簡略化する必要がある場合があります。
表示されるテキストは、'quickfixtextfunc' オプションを Vim 関数に設定することでカスタマイズできます。この関数は、dict 引数で呼び出され、クイックフィックスウィンドウまたはロケーションリストウィンドウに表示される文字列のリストを返す必要があります。dict 引数には、次のフィールドがあります。
クイックフィックスリストの場合は 1 に設定され、ロケーションリストの場合は 0 に設定されます。ロケーションリストの場合は winid が、ロケーションリストを含むウィンドウの ID に設定されます。クイックフィックスリストの場合は 0 に設定されます。getloclist() でロケーションリストのエントリを取得するために使用できます。id クイックフィックスまたはロケーションリスト識別子。start_idx テキストが返される最初のエントリのインデックス。end_idx テキストが返される最後のエントリのインデックス。
関数は、start_idx から end_idx までの各エントリに対して、クイックフィックスウィンドウに表示するテキストを 1 行返す必要があります。関数は、getqflist() 関数を使用し、クイックフィックスリスト識別子「id」を指定して、エントリに関する情報を取得できます。ロケーションリストの場合、getloclist() 関数を「winid」引数とともに使用できます。空のリストが返された場合、すべてのエントリを表示するためにデフォルトの形式が使用されます。返されたリスト内のアイテムが空の文字列の場合、対応するエントリを表示するためにデフォルトの形式が使用されます。
クイックフィックスまたはロケーションリスト固有のカスタマイズが必要な場合は、setqflist() または setloclist() 関数を使用して、リストの 'quickfixtextfunc' 属性を設定できます。これにより、グローバルの 'quickfixtextfunc' オプションがオーバーライドされます。
以下の例では、古いファイル(v:oldfiles)のリストをクイックフィックスウィンドウに表示します。各エントリに関連付けられた行番号、列番号、エラーテキスト情報がないため、'quickfixtextfunc' 関数はファイル名のみを返します。例
" create a quickfix list from v:oldfiles
call setqflist([], ' ', {'lines' : v:oldfiles, 'efm' : '%f',
                                    \ 'quickfixtextfunc' : 'QfOldFiles'})
func QfOldFiles(info)
    " get information about a range of quickfix entries
    let items = getqflist({'id' : a:info.id, 'items' : 1}).items
    let l = []
    for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
        " use the simplified file name
      call add(l, fnamemodify(bufname(items[idx].bufnr), ':p:.'))
    endfor
    return l
endfunc
メイン
コマンドインデックス
クイックリファレンス