Nvim の :help
ページは、生成されたもので、ソースを tree-sitter-vimdoc パーサーで処理して作成されています。
タグと特別な検索
導入については、ユーザーマニュアルの
29.1節を参照してください。
tag tags タグとは、"tags" ファイルに現れる識別子です。これは、ジャンプ可能な一種のラベルです。たとえば、Cプログラムでは、各関数名がタグとして使用できます。タグコマンドを使用する前に、ctagsのようなプログラムで "tags" ファイルを生成する必要があります。
":tag" コマンドでは、カーソルがタグの位置に移動します。CTRL-]
コマンドでは、カーソルが置かれているキーワードがタグとして使用されます。カーソルがキーワード上にない場合は、カーソルの右側にある最初のキーワードが使用されます。
":tag" コマンドは、Cプログラムで非常に役立ちます。関数の呼び出しを見て、その関数が何をするのか知りたい場合は、関数名の中にカーソルを置き、CTRL-]
を押してください。これにより、関数の定義に移動します。簡単な戻り方は CTRL-T
コマンドです。また、後述のタグスタックについても読んでください。
:ta :tag E426 E429 :[count]ta[g][!]
{name}
tags ファイルの情報を使用して、
{name}
の定義にジャンプします。
{name}
をタグスタックにプッシュします。[!] については、
tag-! を参照してください。
{name}
は正規表現パターンにできます。詳しくは、
tag-regexp を参照してください。
{name}
に一致するタグが複数ある場合、[count] 番目のタグにジャンプします。[count] が省略された場合は、最初のタグにジャンプします。他の一致するタグへのジャンプについては、
tag-matchlist を参照してください。
g<LeftMouse>
g<LeftMouse>
<C-LeftMouse>
<C-LeftMouse> CTRL-] CTRL-]
カーソル下のキーワードの定義にジャンプします。":tag
{name}
" と同じで、
{name}
はカーソル下またはカーソルの後のキーワードです。
{name}
に一致するタグが複数ある場合、[count] 番目のタグにジャンプします。[count] が指定されていない場合は、最初のタグにジャンプします。他の一致するタグへのジャンプについては、
tag-matchlist を参照してください。
v_CTRL-]
{Visual}
CTRL-]
":tag
{name}
" と同じで、
{name}
はハイライトされているテキストです。
telnet-CTRL-]
CTRL-]
はデフォルトの telnet エスケープキーです。
CTRL-]
を押してタグにジャンプしようとすると、代わりに telnet プロンプトが表示されます。ほとんどのバージョンの telnet では、デフォルトのエスケープキーを変更または無効にできます。telnet の man ページを参照してください。
telnet -E {Hostname}
を使用してエスケープ文字を無効にするか、
telnet -e {EscapeCharacter} {Hostname}
を使用して別のエスケープ文字を指定できます。可能であれば、この問題を回避するために "telnet" の代わりに "ssh" を使用してみてください。
tag-priority タグに複数のマッチがある場合、以下の優先順位が使用されます:1. "FSC" 現在のファイルに完全に一致する静的タグ。2. "F C" 現在のファイルに完全に一致するグローバルタグ。3. "F " 他のファイルに完全に一致するグローバルタグ。4. "FS " 他のファイルに完全に一致する静的タグ。5. " SC" 現在のファイルに大文字小文字を区別しない一致をする静的タグ。6. " C" 現在のファイルに大文字小文字を区別しない一致をするグローバルタグ。7. " " 他のファイルに大文字小文字を区別しない一致をするグローバルタグ。8. " S " 他のファイルに大文字小文字を区別しない一致をする静的タグ。
現在のファイルが変更された場合、":tnext" を使用する際の混乱を避けるため、優先順位リストはほとんど変更されないことに注意してください。":tag {name}
" を使用する場合は変更されます。
大文字小文字を区別しない一致は、以下の場合は ":tag" コマンドでは見つかりません。
大文字小文字を区別しない一致は、以下の場合は見つかります。
パターンが使用されている場合("/"で始まる)
":tselect" の場合
大文字小文字を区別しないタグ検索を使用すると、タグファイルでのバイナリ検索が無効になり、速度が低下することに注意してください。これは、タグファイルをフォールドケースでソートすることで回避できます。説明については、
'tagbsearch' オプションを参照してください。
タグスタックには、ジャンプしたタグと、ジャンプ元の位置が記憶されます。タグは、
'tagstack' オプションが設定されている場合にのみスタックにプッシュされます。
:po :pop E555 E556 :[count]po[p][!] タグスタック内の [count] 個前のエントリにジャンプします(デフォルトは 1)。[! ]については
tag-! を参照してください。
:[count]ta[g][!] タグスタック内の [count] 個後のエントリにジャンプします(デフォルトは 1)。[! ]については
tag-! を参照してください。
:tags :tags タグスタックの内容を表示します。アクティブなエントリは '>' でマークされます。
":tags" の出力は以下のようになります。
# TO tag FROM line in file/text 1 1 main 1 harddisk2:text/vim/test > 2 2 FuncA 58 i = FuncA(10); 3 1 FuncC 357 harddisk2:text/vim/src/amiga.c
このリストは、ジャンプしたタグと、そのジャンプ前のカーソル位置を示しています。古いタグはリストの上部に、新しいタグは下部にあります。
'>' はアクティブなエントリを示します。これは、次の ":tag" コマンドで使用されるタグです。CTRL-T
および ":pop" コマンドは、アクティブなエントリの上の位置を使用します。
"TO" の下は、マッチリストの現在のマッチの番号です。":pop" や ":tag" を使用しても、これは変更されないことに注意してください。
タグコマンドの前にいた場所に戻れるように、行番号とファイル名が記憶されます。別のプログラム(例:Vimの別のインスタンス)によって行が削除/挿入された場合を除き、行番号は正しくなります。
現在のファイルの場合、"file/text" 列にはその位置にあるテキストが表示されます。インデントが削除され、長い行はウィンドウに収まるように切り捨てられます。
複数のコマンドで以前に使用したタグにジャンプできます。いくつか例を挙げます。
":pop" または CTRL-T
で、前のタグの前に移動 {count}
CTRL-T
で、{count}
個前のタグの前に移動 ":tag" で、後のタグに移動 ":0tag" で、最後に使用したタグに移動
これを使用する最も明白な方法は、プログラムのコールグラフをブラウズしているときです。次のコールグラフを考えてみてください。
main ---> FuncA ---> FuncC ---> FuncB
(説明:main は FuncA と FuncB を呼び出し、FuncA は FuncC を呼び出す)。FuncA の呼び出しで CTRL-]
を使用して main から FuncA に移動できます。次に、CTRL-]
で FuncC に移動できます。ここで main に戻りたい場合は、CTRL-T
を2回使用できます。その後、CTRL-]
で FuncB に移動できます。
":ta {name}
" または CTRL-]
コマンドを発行すると、このタグがスタックの現在の位置に挿入されます。スタックがいっぱいの場合(最大20エントリを保持可能)、最も古いエントリが削除され、それより古いエントリが1つ上にシフトします(インデックス番号が1つ減ります)。最後に使用したエントリが一番下になかった場合、最後に使用したエントリより下のエントリは削除されます。これは、コールグラフの古いブランチが失われることを意味します。上記の説明のコマンドの後、タグスタックは以下のようになります。
# TO tag FROM line in file/text 1 1 main 1 harddisk2:text/vim/test 2 1 FuncB 59 harddisk2:text/vim/src/main.c
tagstack-examples :tag
と同じようにタグスタックに書き込みますが、ユーザー定義のジャンパー#jump_to_tag 関数を使用します。
" Store where we're jumping from before we jump.
let tag = expand('<cword>')
let pos = [bufnr()] + getcurpos()[1:]
let item = {'bufnr': pos[0], 'from': pos, 'tagname': tag}
if jumper#jump_to_tag(tag)
" Jump was successful, write previous location to tag stack.
let winid = win_getid()
let stack = gettagstack(winid)
let stack['items'] = [item]
call settagstack(winid, stack, 't')
endif
タグスタックの現在のインデックスを4に設定します。
call settagstack(1005, {'curidx' : 4})
タグスタックに新しいアイテムをプッシュします。
let pos = [bufnr('myfile.txt'), 10, 1, 0]
let newtag = [{'tagname' : 'mytag', 'from' : pos}]
call settagstack(2, {'items' : newtag}, 'a')
E73 タグスタックが空の状態で使用しようとすると、エラーメッセージが表示されます。
一致するタグが複数ある場合、これらのコマンドを使用してタグ間をジャンプできます。これらのコマンドはタグスタックを変更せず、同じエントリを保持することに注意してください。
:ts :tselect :ts[elect][!] [name] タグファイルの情報を使って、[name]にマッチするタグをリスト表示します。[name]が指定されていない場合は、タグスタックの最後のタグ名が使用されます。[!については、
tag-! を参照してください。リスト中の現在の位置は、先頭の列に '>' が表示されます(該当する場合)。[name]には正規表現パターンを使用できます。
tag-regexp を参照してください。リスト表示で使用される優先順位については、
tag-priority を参照してください。出力例:
# pri kind tag file
1 F f mch_delay os_amiga.c
mch_delay(msec, ignoreinput)
> 2 F f mch_delay os_msdos.c
mch_delay(msec, ignoreinput)
3 F f mch_delay os_unix.c
mch_delay(msec, ignoreinput)
Type number and <Enter> (empty cancels):
"pri"列については、
tag-priority を参照してください。これは現在のファイルに依存するため、":tselect xxx" の結果は異なる場合があります。"kind"列は、タグファイルに含まれていた場合のタグの種類を示します。"info"列は、タグファイルで見つかった情報を示します。これは、タグファイルを作成したプログラムによって異なります。リストが長い場合は、
more-prompt が表示される場合があります。使用したいタグがすでに表示されている場合は、'q' を入力して番号を入力できます。
:sts :stselect :sts[elect][!] [name] ":tselect[!] [name]" を実行し、選択されたタグのためにウィンドウを分割します。
g] g]
CTRL-]
と同様ですが、":tag" の代わりに ":tselect" を使用します。
v_g]
{Visual}
g] "g]" と同様ですが、ハイライトされたテキストを識別子として使用します。
:tj :tjump :tj[ump][!] [name] ":tselect" と同様ですが、マッチが1つだけの場合は、直接タグにジャンプします。
:stj :stjump :stj[ump][!] [name] ":tjump[!] [name]" を実行し、選択されたタグのためにウィンドウを分割します。
g_CTRL-] g
CTRL-]
CTRL-]
と同様ですが、":tag" の代わりに ":tjump" を使用します。
v_g_CTRL-]
{Visual}
g
CTRL-]
"g
CTRL-]
" と同様ですが、ハイライトされたテキストを識別子として使用します。
:tn :tnext ]t :[count]tn[ext][!] [count]番目の次のマッチするタグにジャンプします(デフォルトは1)。[!については、
tag-! を参照してください。
:tp :tprevious [t :[count]tp[revious][!] [count]番目の前のマッチするタグにジャンプします(デフォルトは1)。[!については、
tag-! を参照してください。
:tN :tNext :[count]tN[ext][!] ":tprevious" と同じです。
:tr :trewind [T :[count]tr[ewind][!] 最初の一致するタグにジャンプします。[count] が指定された場合は、[count] 番目の一致するタグにジャンプします。[!については、
tag-! を参照してください。
:lt :ltag :lt[ag][!] [name] タグ [name] にジャンプし、マッチするタグを現在のウィンドウの新しいロケーションリストに追加します。[name] には正規表現パターンを使用できます。
tag-regexp を参照してください。[name] が指定されていない場合は、タグスタックの最後のタグ名が使用されます。タグ行を検索する検索パターンには、すべての特殊文字をエスケープするために "\V" がプレフィックスとして付けられます(非常にノーマジック)。マッチするタグを表示するロケーションリストは、タグスタックとは独立しています。[!については、
tag-! を参照してください。
他のメッセージがない場合、Vim はジャンプしたマッチするタグと、マッチするタグの数を表示します
tag 1 of 3 or more
"以上" は、Vim がまだすべてのタグファイルを試していないことを示します。":tnext" を数回使用したり、":tlast" を使用すると、より多くのマッチが見つかる場合があります。
他のメッセージのためにこのメッセージが表示されなかった場合、または現在の場所を知りたい場合は、このコマンドを再度実行すると(前回と同じタグにジャンプします)表示されます
:0tn
tag-skip-file ファイルが存在しない一致するタグが見つかった場合、この一致はスキップされ、次の一致するタグが使用されます。Vim は、不足しているファイルを通知するためにこれを報告します。マッチリストの最後に到達すると、エラーメッセージが表示されます。
tag-preview タグマッチリストはプレビューウィンドウでも使用できます。コマンドは上記と同じですが、先頭に "p" が付いています。
:pts :ptselect :pts[elect][!] [name] ":tselect[!] [name]" を実行し、新しいタグを「プレビュー」ウィンドウに表示します。詳細については、
:ptag を参照してください。
:ptj :ptjump :ptj[ump][!] [name] ":tjump[!] [name]" を実行し、新しいタグを「プレビュー」ウィンドウに表示します。詳細については、
:ptag を参照してください。
static-tag 静的タグとは、特定のファイルに対して定義されたタグです。C プログラムでは、これは静的関数である可能性があります。
Vi では、タグにジャンプすると、現在の検索パターンが設定されます。つまり、タグにジャンプした後の "n" コマンドは、タグにジャンプする前のパターンを検索しません。Vim はこれをバグと見なすため、この動作はしません。古い Vi の動作が必要な場合は、
'cpoptions' で 't' フラグを設定してください。
tag-binary-search Vim は、目的のタグをすばやく見つけるために、タグファイル内でバイナリ検索を使用します。ただし、これはタグファイルが ASCII バイト値でソートされている場合にのみ機能します。したがって、一致するものが見つからなかった場合は、線形検索で別の試行が行われます。線形検索のみが必要な場合は、
'tagbsearch' オプションをリセットしてください。または、タグファイルをソートする方が良いでしょう!
特定の名前を持つタグを探していない場合は、バイナリ検索が無効になることに注意してください。これは、大文字と小文字を区別しない場合や、固定された文字列で始まらない正規表現が使用されている場合に発生します。タグ検索が大幅に遅くなる可能性があります。前者は、タグファイルを大文字と小文字を区別せずにソートすることで回避できます。詳細については、
'tagbsearch' を参照してください。
tag-regexp ":tag" コマンドと ":tselect" コマンドは、正規表現引数を受け入れます。使用できる特殊文字については、
pattern を参照してください。引数が '/' で始まる場合は、パターンとして使用されます。引数が '/' で始まらない場合は、完全なタグ名として文字通りに扱われます。例:
:tag main
優先度の高い "main" というタグにジャンプします。
:tag /^get
"get" で始まる優先度の高いタグにジャンプします。
:tag /norm
"id_norm" を含む "norm" を含むすべてのタグをリスト表示します。引数が文字通りに存在し、正規表現として使用された場合に一致する場合は、文字通り一致する方が優先度が高くなります。たとえば、":tag /open" は、"open_file" や "file_open" よりも先に "open" に一致します。パターンを使用する場合、大文字と小文字は無視されます。大文字と小文字を区別して一致させたい場合は、パターンで "\C" を使用してください。
ファイル内のタグ winfixbuf autowrite
現在のファイルが変更されました!オプション オプション アクション
----------------------------------------------------------------------------- はい x x オフ x タグへ移動 いいえ いいえ x オフ x 他のファイルを読み込み、タグへ移動 いいえ はい はい オフ x 現在のファイルを破棄し、他のファイルを読み込み、タグへ移動 いいえ はい いいえ オフ オン 現在のファイルを書き込み、他のファイルを読み込み、タグへ移動 いいえ はい いいえ オフ オフ 失敗 はい x はい x x タグへ移動 いいえ いいえ いいえ オン x 失敗 いいえ はい いいえ オン x 失敗 いいえ はい いいえ オン オン 失敗 いいえ はい いいえ オン オフ 失敗 -----------------------------------------------------------------------------
タグが現在のファイルにある場合、コマンドは常に機能します。
タグが別のファイルにあり、現在のファイルが変更されていない場合は、他のファイルが現在のファイルになり、バッファに読み込まれます。
タグが別のファイルにあり、現在のファイルが変更され、コマンドに ! が追加されている場合は、現在のファイルへの変更は失われ、他のファイルが現在のファイルになり、バッファに読み込まれます。
タグが別のファイルにあり、現在のファイルが変更され、
'autowrite' オプションがオンになっている場合は、現在のファイルが書き込まれ、他のファイルが現在のファイルになり、バッファに読み込まれます。
タグが別のファイルにあり、現在のファイルが変更され、
'autowrite' オプションがオフになっている場合は、コマンドは失敗します。変更を保存したい場合は、":w" コマンドを使用してから、引数なしで ":tag" を使用してください。これは、タグがとにかくスタックにプッシュされるため機能します。変更を失いたい場合は、":tag!" コマンドを使用できます。
タグが別のファイルにあり、ウィンドウに
'winfixbuf' が含まれている場合、コマンドは失敗します。タグが同じファイルにある場合は、成功する可能性があります。
tag-security セキュリティ上の理由から、Vimではいくつかのコマンドが禁止されていることに注意してください。これは、現在のディレクトリ内のexrc/vimrcファイルに対して
'secure'オプションを使用するのと同じように機能します。
トロイの木馬と
サンドボックスを参照してください。
{tagaddress}
がバッファを変更すると、「警告:tagコマンドがバッファを変更しました!!!」という警告メッセージが表示されます。将来のバージョンでは、バッファの変更は不可能になります。これはすべてセキュリティ上の理由によるものです。誰かがタグファイルに悪意のあるコマンドを隠し、それが気付かれない可能性があるからです。例
:$d|/tag-function-name/
Viでは、":tag"コマンドはタグが検索されたときに最後の検索パターンを設定します。Vimではこれは行われず、
'cpoptions'に't'フラグが存在しない限り、以前の検索パターンが記憶されたままになります。
tags-option 'tags'オプションは、ファイル名のリストです。これらの各ファイルがタグ検索されます。これは、デフォルトのファイル "tags" とは異なるタグファイルを使用したり、共通のタグファイルにアクセスしたりするために使用できます。
リスト内の次のファイルは、次の場合には使用されません。
現在のバッファに一致する静的タグが見つかった場合。
一致するグローバルタグが見つかった場合。これは、大文字と小文字が無視されるかどうかにも依存します。大文字と小文字は、次の場合に無視されます。
'tagcase'が "followscs" で、
'smartcase'が設定されており、パターンに小文字の文字のみが含まれている場合。大文字と小文字が無視されない場合で、タグファイルに大文字と小文字が一致しない一致のみがある場合、次のタグファイルで大文字と小文字が一致する一致が検索されます。大文字と小文字が一致するタグが見つからない場合、大文字と小文字が一致しない最初のマッチが使用されます。大文字と小文字が無視される場合で、大文字と小文字が一致する、または一致しないグローバルタグが見つかった場合、これが使用され、それ以上のタグファイルは検索されません。
タグファイル名が "./" で始まる場合、'.' は現在のファイルのパスに置き換えられます。これにより、現在のディレクトリが何であれ、現在のファイルがあるディレクトリ内のタグファイルを使用することができます。 "./" を使用するアイデアは、どのタグファイルを最初に検索するかを定義できるということです:現在のディレクトリ ("tags,./tags") または現在のファイルのディレクトリ ("./tags,tags") です。
例
:set tags=./tags,tags,/home/user/commontags
この例では、タグは最初に現在のファイルがあるディレクトリ内のファイル "tags" で検索されます。次に、現在のディレクトリ内の "tags" ファイル。そこに見つからない場合は、ファイル "/home/user/commontags" でタグが検索されます。
これは、Vi互換にするために、
'cpoptions'に 'd' フラグを含めることでオフにすることができます。"./tags" は、現在のファイルのディレクトリ内のタグファイルではなく、現在のディレクトリ内のタグファイルになります。
カンマの代わりにスペースを使用することができます。その場合、スペースを文字列オプションに含めるには、バックスラッシュが必要です。
:set tags=tags\ /home/user/commontags
ファイル名にスペースを含めるには、3つのバックスラッシュを使用します。ファイル名にカンマを含めるには、2つのバックスラッシュを使用します。たとえば、以下を使用します。
:set tags=tag\\\ file,/home/user/common\\,tags
ファイル "tag file" と "/home/user/common,tags" の場合。
'tags'オプションの値は "tag\ file,/home/user/common\,tags" になります。
'tagrelative'オプションがオン(デフォルト)で、別のディレクトリのタグファイルを使用している場合、そのタグファイル内のファイル名は、タグファイルがあるディレクトリに対する相対パスになります。
ctags jtags タグファイルは、外部コマンド (たとえば "ctags") で作成できます。これには、各関数のタグが含まれます。"ctags" の一部のバージョンでは、各 "#defined" マクロ、typedef、enumなどのタグも作成されます。
タグファイル内の行は、次の2つの形式のいずれかである必要があります。
1. {tagname}
{TAB}
{tagfile}
{TAB}
{tagaddress}
2. {tagname}
{TAB}
{tagfile}
{TAB}
{tagaddress}
{term}
{field}
..
最初の形式は、Viと完全に互換性のある通常のタグです。これは、従来のctags実装で生成される唯一の形式です。これは、グローバルであり、他のファイルでも参照される関数によく使用されます。
タグファイル内の行は、<NL>
または <CR>
<NL>
で終わることができます。Macintoshでは、<CR>
も動作します。<CR>
および<NL>
文字は、行の中に現れることはありません。
2番目の形式は新しいものです。これには、各行の末尾にあるオプションフィールドに追加情報が含まれています。Viとの下位互換性があります。これは、新しいバージョンのctags(Universal ctagsやExuberant ctagsなど)でのみサポートされています。
{tagname}
識別子。通常は関数の名前ですが、任意の識別子にすることができます。
<Tab>
を含めることはできません。
{TAB}
1つの
<Tab>
文字。
注:以前のバージョンでは、ここに任意の空白文字を使用できました。これは、
{tagfile}
でスペースを使用できるようにするために廃止されました。
{tagfile}
{tagname}
の定義を含むファイル。絶対パスまたは相対パスを持つことができます。環境変数とワイルドカードを含めることができます(ワイルドカードの使用は疑わしいですが)。
<Tab>
を含めることはできません。
{tagaddress}
カーソルをタグの位置に移動させるExコマンド。制限はありますが(
tag-securityを参照)、任意のExコマンドにすることができます。Posixでは、ほとんど使用される行番号と検索コマンドのみが許可されています。
{term}
;" セミコロンと二重引用符の2文字。これはViによってコメントの始まりと解釈され、その後に続くものは無視されます。これはViとの下位互換性のためにあり、次のフィールドを無視します。例
APP file /^static int APP;$/;" v
{tagaddress}
が行番号または検索パターンでない場合、
{term}
は
|;"
である必要があります。ここで、バーはコマンド(バーを除く)を終了し、
;"
は、Viに残りの行を無視させるために使用されます。例
APP file.c call cursor(3, 4)|;" v
{field}
.. オプションフィールドのリスト。各フィールドは次の形式を持ちます。
<Tab>
{fieldname}
:{value}
{fieldname}
はフィールドを識別し、英字[a-zA-Z]のみを含めることができます。{value}
は任意の文字列ですが、<Tab>
を含めることはできません。これらの文字は特別です。"\t" は <Tab>
を表し、"\r" は <CR>
を表し、"\n" は <NL>
を表し、"\\" は単一の '\' 文字を表します。
':' を持たないフィールドが1つあります。これはタグの種類です。「kind:」が前に付いているかのように扱われます。上記の例では、これは "kind:v"(通常は変数)でした。ctagsが出力する種類については、ctagsのドキュメントを参照してください。ctagsでは、ctags --list-kinds
を使用できます。
現在、Vimで認識されるもう1つのフィールドは、"file:"(空の値)です。これは、静的タグに使用されます。
タグファイルの最初の行には、!_TAG_ で始まる行を含めることができます。これらは最初の行にソートされます。"!" で始まるまれなタグのみがそれらの前にソートできます。Vimは2つの項目を認識します。最初の項目は、ファイルがソートされたかどうかを示す行です。この行が見つかると、Vimはタグファイルのバイナリ検索を使用します。
!_TAG_FILE_SORTED<Tab>1<Tab>{anything}
タグファイルは、大文字と小文字が無視される場合に線形検索を避けるために、大文字と小文字を区別せずにソートされる場合があります。(大文字と小文字は、
'ignorecase'が設定されており、
'tagcase'が "followic" の場合、または
'tagcase'が "ignore" の場合に無視されます。)詳細については、
'tagbsearch'を参照してください。その場合、値 '2' を使用する必要があります。
!_TAG_FILE_SORTED<Tab>2<Tab>{anything}
Vimが認識するもう1つのタグは、タグファイルのエンコーディングです。
!_TAG_FILE_ENCODING<Tab>utf-8<Tab>{anything}
ここで、"utf-8" はタグに使用されるエンコーディングです。Vimは、検索されるタグを
'encoding'からタグファイルのエンコーディングに変換します。また、タグを一覧表示するときには、逆の処理が行われます。変換に失敗した場合、変換されていないタグが使用されます。
tag-search コマンドは任意のExコマンドにできますが、多くの場合、検索コマンドです。例
tag1 file1 /^main(argc, argv)/
tag2 file2 108
コマンドは常に
'magic'が設定されていない状態で実行されます。検索パターン内の特殊文字は、"^"(行頭)と"$"(
<EOL>
)のみです。
patternを参照してください。検索テキスト内の各バックスラッシュの前にバックスラッシュを付ける必要があることに注意してください。これは、Viとの下位互換性のためのものです。
E434 E435 コマンドが通常の検索コマンド("/"または"?"で始まり、終わる場合)、特別な処理が行われます。
検索は、ファイルの1行目から開始されます。検索の方向は、"/"の場合は順方向、"?"の場合は逆方向です。
'wrapscan'は関係なく、ファイル全体が常に検索されることに注意してください。
検索に失敗した場合、大文字と小文字を無視して再試行されます。それにも失敗した場合、次のものが検索されます。
"^tagname[ \t]*("
(タグの前に '^' が付加され、"[ \t]*(" が付加されたもの)。関数名を使用する場合、これにより関数名が0列にあるときに検出されます。これは、タグファイルが作成されてから関数の引数が変更された場合に役立ちます。この検索にも失敗した場合、別の検索が実行されます。
"^[#a-zA-Z_].*\<tagname[ \t]*("
これは、'#' で始まる行、または識別子であり、タグの後に空白と '(' が続く行を意味します。これにより、マクロ名と型が先頭に付加された関数名が検出されます。
tag-old-static 2019年3月(パッチ8.1.1092)まで、古い形式がサポートされていました:
{tagfile}
:{tagname}
{TAB}
{tagfile}
{TAB}
{tagaddress}
このフォーマットは静的タグ専用です。現在は廃止されており、2番目のフォーマットに置き換えられています。これは、Elvis 1.x、古いVimバージョン、およびctagsのいくつかのバージョンでのみサポートされています。静的タグは、多くの場合、ファイル
{tagfile}
内でのみ参照されるローカル関数に使用されます。静的タグの場合、
{tagfile}
の2つの出現箇所が完全に同一である必要があることに注意してください。また、静的タグの使用方法については、以下の
tags-optionを参照してください。
新しいVimバージョンに更新できるようになった時点で、2番目のフォーマットをサポートするctagsにも更新できるはずであるため、このサポートは削除されました。
これらのコマンドは、現在のファイルと、検出されたすべてのインクルードファイル(再帰的)で文字列を検索します。これは、変数、関数、またはマクロの定義を見つけるために使用できます。現在のバッファ内のみを検索する場合は、
pattern-searchesにリストされているコマンドを使用してください。
別のファイルをインクルードする行が検出されると、現在のバッファでの続行前にそのファイルが検索されます。インクルードされたファイルによってインクルードされたファイルも検索されます。インクルードファイルが見つからなかった場合は、警告なしに無視されます。見つからなかったファイルを確認するには、
:checkpathコマンドを使用してください。おそらく、
'path'オプションが正しく設定されていない可能性があります。
注意: インクルードファイルは検索されますが、そのファイルを編集している可能性のあるバッファは検索されません。現在のファイルの場合のみ、バッファ内の行が使用されます。
文字列には、任意のキーワードまたは定義済みマクロを使用できます。キーワードの場合、任意の照合が見つかります。定義済みマクロの場合、
'define'オプションと一致する行のみが見つかります。デフォルトは "^#\s*define" で、これはCプログラム用です。他の言語では、おそらくこれを変更する必要があります。C++の例については、
'define'を参照してください。文字列には改行を含めることはできず、行内の照合のみが見つかります。
定義済みマクロの一致が見つかった場合、行がバックスラッシュで終わるとき、行の表示は次の行から続行されます。
"[" で始まるコマンドは、現在のファイルの先頭から検索を開始します。"]" で始まるコマンドは、現在のカーソル位置から開始します。
'include'オプションは、別のファイルをインクルードする行を定義するために使用されます。デフォルトは "\^#\s*include" で、これはCプログラム用です。
注意: VimはC構文を認識しないため、
'include'オプションが "#ifdef/#endif" 内またはコメント内の行と一致する場合でも、とにかく検索されます。
'isfname'オプションは、一致したパターンの後にあるファイル名を認識するために使用されます。
'path'オプションは、絶対パスを持たないインクルードファイルのディレクトリを見つけるために使用されます。
'comments'オプションは、1行を表示したり、行にジャンプしたりするコマンドに使用されます。コメントを開始する可能性のあるパターンを定義します。これらの行は、[!] が使用されていない限り、検索では無視されます。ただし、例外が1つあります。行がパターン
"^# *define"
と一致する場合、コメントとは見なされません。
一致をリスト表示し、ジャンプするものを1つ選択する場合は、マッピングを使用してそれを行うことができます。以下に例を示します。
:map <F4> [I:let nr = input("Which one: ")<Bar>exe "normal " .. nr .. "[\t"<CR>
[i [i カーソル下のキーワードを含む最初の行を表示します。検索はファイルの先頭から開始します。コメントのように見える行は無視されます(
'comments'オプションを参照)。カウントが指定された場合、カウント番目の一致する行が表示され、コメント行は無視されません。
]i ]i "[i" と同様ですが、現在のカーソル位置から開始します。
:is :isearch :[range]is[earch][!] [count] [/]pattern[/] "[i" および "]i" と同様ですが、[range] 行で検索します(デフォルト: ファイル全体)。[/] および [!] については、
:search-args を参照してください。
[I [I カーソル下のキーワードを含むすべての行を表示します。見つかった行のファイル名と行番号が表示されます。検索はファイルの先頭から開始します。
]I ]I "[I" と同様ですが、現在のカーソル位置から開始します。
:il :ilist :[range]il[ist][!] [/]pattern[/] "[I" および "]I" と同様ですが、[range] 行で検索します(デフォルト: ファイル全体)。[/] および [!] については、
:search-args を参照してください。
[_CTRL-I [
CTRL-I
カーソル下のキーワードを含む最初の行にジャンプします。検索はファイルの先頭から開始します。コメントのように見える行は無視されます(
'comments'オプションを参照)。カウントが指定された場合、カウント番目の一致する行にジャンプし、コメント行は無視されません。
]_CTRL-I ]
CTRL-I
"[
CTRL-I
" と同様ですが、現在のカーソル位置から開始します。
:ij :ijump :[range]ij[ump][!] [count] [/]pattern[/] "[
CTRL-I
" および "]
CTRL-I
" と同様ですが、[range] 行で検索します(デフォルト: ファイル全体)。[/] および [!] については、
:search-args を参照してください。
CTRL-W
CTRL-I
CTRL-W_CTRL-I CTRL-W_i CTRL-W i カーソル下のキーワードを含む最初の行にカーソルがある新しいウィンドウを開きます。検索はファイルの先頭から開始します。コメントのように見える行は無視されます(
'comments'オプションを参照)。カウントが指定された場合、カウント番目の一致する行にジャンプし、コメント行は無視されません。
:isp :isplit :[range]isp[lit][!] [count] [/]pattern[/] "CTRL-W i" および "CTRL-W i" と同様ですが、[range] 行で検索します(デフォルト: ファイル全体)。[/] および [!] については、
:search-args を参照してください。
[d [d カーソル下のマクロを含む最初のマクロ定義を表示します。検索はファイルの先頭から開始します。カウントが指定された場合、カウント番目の一致する行が表示されます。
]d ]d "[d" と同様ですが、現在のカーソル位置から開始します。
:ds :dsearch :[range]ds[earch][!] [count] [/]string[/] "[d" および "]d" と同様ですが、[range] 行で検索します(デフォルト: ファイル全体)。[/] および [!] については、
:search-args を参照してください。
[D [D カーソル下のマクロを含むすべてのマクロ定義を表示します。見つかった行のファイル名と行番号が表示されます。検索はファイルの先頭から開始します。
]D ]D "[D" と同様ですが、現在のカーソル位置から開始します。
:dli :dlist :[range]dli[st][!] [/]string[/]
[D
および
]D
と同様ですが、[range] 行で検索します(デフォルト: ファイル全体)。[/] および [!] については、
:search-args を参照してください。
:dl
は
:dlist
ではなく、"l" フラグ付きの
:delete
のように機能することに注意してください。
[_CTRL-D [
CTRL-D
カーソル下のキーワードを含む最初のマクロ定義にジャンプします。検索はファイルの先頭から開始します。カウントが指定された場合、カウント番目の一致する行にジャンプします。
]_CTRL-D ]
CTRL-D
"[
CTRL-D
" と同様ですが、現在のカーソル位置から開始します。
:dj :djump :[range]dj[ump][!] [count] [/]string[/] "[
CTRL-D
" および "]
CTRL-D
" と同様ですが、[range] 行で検索します(デフォルト: ファイル全体)。[/] および [!] については、
:search-args を参照してください。
CTRL-W
CTRL-D
CTRL-W_CTRL-D CTRL-W_d CTRL-W d カーソル下のキーワードを含む最初のマクロ定義行にカーソルがある新しいウィンドウを開きます。検索はファイルの先頭から開始します。カウントが指定された場合、カウント番目の一致する行にジャンプします。
:dsp :dsplit :[range]dsp[lit][!] [count] [/]string[/] "CTRL-W d" と同様ですが、[range] 行で検索します(デフォルト: ファイル全体)。[/] および [!] については、
:search-args を参照してください。
:checkp[ath]! すべてのインクルードファイルをリストします。
:search-args 上記のコマンドの共通引数:[!] を含めると、コメントとして認識される行の中から一致するものを検索します。除外すると、行がコメントとして認識される場合(
'comments'に従う)、またはCコメント("//"の後または
/* */
内)の場合、一致は無視されます。ただし、行がコメントとして認識されても、コメントが行の途中で終わる場合は、一致が見逃される可能性があります。また、行がコメントであっても、(
'comments'に従って)認識されない場合は、それでも一致が見つかる可能性があります。例
/* comment
foobar */
"foobar" の一致が見つかります。これは、この行がコメントとして認識されないためです(たとえシンタックスハイライトが認識していても)。
注意:マクロ定義はほとんどコメントのように見えないため、[!] は ":dlist"、":dsearch"、":djump" には影響しません。[/] パターンは "/" で囲むことができます。 "/" なしでは、 "\<pattern\>" を使用して単語全体のみが一致します。2番目の "/" の後にのみ、次のコマンドを "|" で追加できます。例
:isearch /string/ | echo "the last one"
":djump"、":dsplit"、":dlist"、":dsearch" コマンドの場合、パターンは検索パターンとしてではなく、リテラル文字列として使用されます。
タグリストの生成に使用される関数は、
'tagfunc'オプションを設定することで指定されます。関数は、3つの引数で呼び出されます。pattern タグ検索中に使用されるタグ識別子またはパターン。flags 関数の動作を制御するフラグを含む文字列。info 次のエントリを含む辞書:buf_ffname 優先度に使用できるフルファイル名。user_data ユーザー定義のデータ文字列。tagfuncによって以前にタグスタックに格納された場合。
使用する際には、引数名の前に "a:" を付ける必要があることに注意してください。
現在、タグ関数には最大3つのフラグが渡される可能性があります。'c' 関数は、処理中の通常のコマンドによって呼び出されました(ニーモニック:タグ関数は、カーソル周辺のコンテキストを使用して、タグリストをより適切に生成することができます)。'i' インサートモードで、ユーザーがタグを補完していました(
i_CTRL-X_CTRL-]を使用するか、
'completeopt'に
t
が含まれている場合)。'r' tagfuncへの最初の引数は、
パターンとして解釈される必要があります(
tag-regexpを参照)。例えば、以下を使用する場合。
:tag /pat
これはインサートモードでの補完時にも渡されます。このフラグが存在しない場合、引数は通常、完全なタグ名として文字通りに扱われます。
'tagfunc'が設定されている場合、
tag-priorityで説明されているタグの優先度は適用されないことに注意してください。代わりに、優先度は関数によって返されるリスト内の要素の順序とまったく同じになります。
E987関数は、辞書エントリのリストを返す必要があります。各辞書には、少なくとも次のエントリが含まれている必要があり、各値は文字列である必要があります。name タグの名前。filename タグが定義されているファイルの名前。これは現在のディレクトリからの相対パスまたはフルパスです。cmd ファイル内のタグの位置を特定するために使用されるExコマンド。これは、Ex検索パターンまたは行番号のいずれかです。形式は
taglist()のものと似ており、その出力を結果の生成に使用できることに注意してください。次のフィールドはオプションです。kind タグの種類。user_data 操作間でタグを区別するために使用できる、タグスタックに格納されたユーザー定義のデータ文字列。
関数がリストではなく
v:nullを返す場合は、代わりに標準のタグ検索が実行されます。
以下は、
'tagfunc'に使用される関数の架空の例です。これは、
taglist()の出力を使用して、ファイル名の逆順でタグのリストを生成します。
function TagFunc(pattern, flags, info)
function CompareFilenames(item1, item2)
let f1 = a:item1['filename']
let f2 = a:item2['filename']
return f1 >=# f2 ?
\ -1 : f1 <=# f2 ? 1 : 0
endfunction
let result = taglist(a:pattern)
call sort(result, "CompareFilenames")
return result
endfunc
set tagfunc=TagFunc