Up: 目次   [Index]


タグと特別な檢索

*tagsrch.txt*   For Vim バージョン 8.1.  Last change: 2019 Nov 07


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

タグと特別な檢索

初めにユーザーマニュアルのセクション |29.1| を參照すること。

1. タグへのジャンプ|tag-commands|
2. タグスタック|tag-stack|
3. タグマッチリスト|tag-matchlist|
4. タグの詳細|tag-details|
5. タグファイルの書式|tags-file-format|
6. インクルードファイルの檢索|include-search|
7. ’tagfunc’ を使ふ|tag-function|

1. タグへのジャンプ

タグとは "tags" ファイルに現はれる識別子である。タグはラベルのやうなものであり、そこにジャンプすることができる。例へば: C のプログラムではそれぞれの函數名をタグとして使ふことができる。タグ機能を使ふ前には、ctags のやうなプログラムによつて "tags" ファイルを生成しなければならない。

":tag" コマンドはカーソルをタグ上に移動する。CTRL-] コマンドはカーソルの下にあるキーワードをタグとして使用する。もしカーソルがキーワード上になければ、カーソル位置から右側で最初に現れるキーワードを使用する。

":tag" コマンドはCプログラムでよく機能する。もし函數呼び出しを見つけた時にその函數が何をするのか疑問に思つたら、カーソルを函數名の上に置いて CTRL-] を叩けばよい。これで函數定義に導いてもらへるだらう。簡單に戾る方法は CTRL-T コマンドを使ふことである。後述するタグスタックについても讀むとよい。

:[count]ta[g][!] {name}

tags ファイル內の情報を用ゐて、{name} の定義へジャンプする。{name} はタグスタックに積まれる。[!] については |tag-!| を參照。

{name} は正規表現を使用できる。|tag-regexp| を參照。

{name} に對してマッチするタグが複數ある場合、[count] 番目のタグへジャンプする。[count] が指定されないときは最初のタグへジャンプする。他のマッチするタグへジャンプするには |tag-matchlist| を參照。

g<LeftMouse> または
<C-LeftMouse> または
CTRL-]

カーソルの下のキーワードを定義してゐる場所にジャンプする。":tag {name}" と同樣であるが、{name} はカーソルの下、もしくは次に現はれるキーワードである。

{name} に對してマッチするタグが複數ある場合、[count] 番目のタグへジャンプする。[count] が指定されないときは最初のタグへジャンプする。他のマッチするタグへジャンプするには |tag-matchlist| を參照。

{Visual}CTRL-]

":tag {name}" と同樣であるが、{name} はハイライトされてゐるテキストである。

CTRL-] は telnet の標準エスケープキーである。タグにジャンプしようと CTRL-] を打つと、代はりに telnet のプロンプトが立ち上がるだらう。telnet のたいていのバージョンは、標準エスケープキーを變更、もしくは使用不可能にできる。telnet のマニュアルを參照すること。エスケープキーを使用不可能にするには ’telnet -E {ホスト名}’、エスケープ文字を他の文字にするには ’telnet -e {エスケープ文字} {ホスト名}’ を使用する。もし可能なら telnet の代はりに ssh を使ふことで、この問題を囘避できる。

タグのマッチが複數ある場合、以下の優先度が使はれる:

  1. "FSC" カレントファイル內の全一致する static タグ。
  2. "F C" カレントファイル內の全一致する global タグ。
  3. "F " 別のファイル內の全一致する global タグ。
  4. "FS " 別のファイル內の全一致する static タグ。
  5. " SC" カレントファイル內の大文字、小文字を無視した一致をする static タグ。
  6. " C" カレントファイル內の大文字、小文字を無視した一致をする global タグ。
  7. " " 別のファイル內の大文字、小文字を無視した一致をする global タグ。
  8. " S " 別のファイル內の大文字、小文字を無視した一致をする static タグ。

Note:
カレントファイルが變はつても、優先度のリストはほとんどの場合變化しないので注意すること。これは ":tnext" を使ふときの混亂を避けるためである。優先度のリストは ":tag {name}" を使つたときに變化する。

以下の場合は ":tag " で大文字小文字を無視した檢索は行はれません:

以下の場合は大文字小文字を無視した檢索が行はれます:

Note:
大文字小文字を無視したタグ檢索はタグファイル內での二分探索を無效にし速度の低下を引き起こします。これは大文字小文字を保持したままタグファイルを竝び替へる事で囘避できます。’tagbsearch’ オプションの說明を參照

2. タグスタック

タグスタック上にはジャンプ先のタグと、どこから來たのかといふ情報が記憶される。タグは ’tagstack’ オプションが設定されてゐるときにだけ積まれる。

g<RightMouse> または
<C-RightMouse> または
CTRL-T

タグスタック中の [count] 分だけ古いエントリにジャンプする (デフォルトは 1)。

:[count]po[p][!]

タグスタック中の [count] 分だけ古いエントリにジャンプする (デフォルトは 1)。

[!] については |tag-!| を參照。

:[count]ta[g][!]

タグスタック中の [count] 分だけ新しいエントリにジャンプする (デフォルトは 1)。

[!] については |tag-!| を參照。

: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" コマンドは 1 つ上のタグを使ふ。

"TO" の列にはマッチリスト中の現在のマッチ數を表示する。これは ":pop" や ":tag" を使つても變化しないので注意すること。

行番號とファイル名は、タグコマンドを實行する前にゐた位置に戾ることができるやうに記憶される。行番號は行の削除や插入が行はれた時にも正しく維持される。ただし、別のプログラム(例へば、Vim の別インスタンス)で編輯した場合を除く。

ジャンプ前の位置がカレントファイル內であれば、"file/text" の列にその行が表示される。インデントは取り除かれ、長い行はウィンドウに收まるやうに切り詰められる。

前に使つたタグにジャンプするコマンドはいくつかある。例へば:

":pop" or 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 ずつ減る)。もし最後に使はれたエントリが一番下になかつた場合、最後に使はれたエントリより下にあるものは削除される。つまり古いタグ經路は失はれる。上のパラグラフの說明を實行したあとのタグスタックは次のやうな狀態になる:

# 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

|gettagstack()| 函數は指定されたウィンドウのタグスタックを返す。|settagstack()| 函數はウィンドウのタグスタックを變更する。

タグスタックを使はうとしたとき、タグスタックに何も入つてゐないとエラーが表示される。

3. タグマッチリスト

以下のコマンドは複數のタグがマッチしたときに、タグの閒を移動するために使ふことができる。これらのコマンドはタグスタックを變更せず、同じエントリを保つことに注意すること。

:ts[elect][!] [name]

タグファイルの情報を用ゐて、[name] にマッチするタグをリスト表示する。

[name] を省略した場合、タグスタック上の最後のタグが使はれる。

[!] については |tag-!| を參照。

最初の列に ’>’ があるものはリスト中の現在の位置を指し示してゐる (それがあるならば)。[name] は正規表現を取り得る。|tag-regexp| を參照。リストに使はれてゐるプロパティは |tag-priority| を參照。 出力例:

 nr 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)
Enter nr of choice (<CR> to abort):

"pri" については |tag-priority| を參照。この例は現在のファイルに依存してゐるため、":tselect xxx" を使つたときには違ふ結果が得られることに注意すること。

"kind" はタグファイルからタグの種類が得られる場合のみ、その情報を示す。

"info" はタグファイルから得られる情報が表示される。この情報はタグファイルを生成したプログラムに依存する。

リストが長い場合には |more-prompt| が表示される。もしすでに使ひたいタグを見つけてゐるのなら、’q’ のあとに "nr" の番號を入力すればよい。

:sts[elect][!] [name]

":tselect[!] [name]" を實行し、ウィンドウを分割して選擇された tag を表示する。

g]

CTRL-] と動作は似てゐるが、":tag" の代はりに ":tselect" を用ゐる。

{Visual}g]

"g]" と同じ。ただし、選擇されたテキストが檢索に使はれる。

:tj[ump][!] [name]

":tselect" と動作は似てゐるが、適合する tag が 1 つだけのときには直接移動する。

:stj[ump][!] [name]

":tjump[!] [name]" を實行し、ウィンドウを分割して選擇された tag を表示する。

g CTRL-]

CTRL-]と動作は似てゐるが、":tag" の代はりに ":tjump" を用ゐる。

{Visual}g CTRL-]

"g CTRL-]" と同じ。ただし、選擇されたテキストが檢索に使はれる。

:[count]tn[ext][!]

適合する tag のうち、[count] 番目の tag に移動する。(省略時は 1)

[!] に關しては |tag-!| を參照。

:[count]tp[revious][!]

適合する tag のうち、[count] 分だけ前の tag に移動する。(省略時は 1)

[!] に關しては |tag-!| を參照。

:[count]tN[ext][!]

":tprevious" と同樣。

:[count]tr[ewind][!]

適合した tag のうち最初の tag に移動する。もし [count] が與へられてゐたら、[count] 番目の tag に移動する。

[!] については |tag-!| を參照。

:[count]tf[irst][!]

":trewind" と同じ。

:tl[ast][!]

適合した tag のうち最後の tag に移動する。

[!] に關しては |tag-!| を參照。

:lt[ag][!] [name]

タグ [name] にジャンプし、マッチするタグ全てをカレントウィンドウの新しいロケーションリストに追加する。[name] は正規表現でもよい (|tag-regexp| を參照)。[name] が指定されないときはタグスタックにある最後のタグ名が使はれる。タグにマッチする行を特定するための檢索パターンには、特別な文字を全てエスケープするために "\V" がつけられる (very nomagic)。マッチするタグを保持するロケーションリストはタグスタックとは獨立してゐる。

[!] については |tag-!| を參照。

他にメッセージがないとき、Vim は今までに移動した tag と tag の數を表示する:

tag 1 of 3 or more

" or more" は、Vim がまだすべての tag ファイルを檢索してゐないことを示すために用ゐられる。":tnext" を數回用ゐるか、":tlast" を使用したとき、さらに tag が見つけられるだらう。

他のメッセージがあつたときや、現在の場所を知りたいときには次のコマンドで再び表示することができる。(最後に行つた移動と同じ tag に移動する。):

:0tn

マッチしたタグに對するファイルが見つからなかつた場合、スキップされて次にマッチするタグが使はれる。Vim はファイルがないことを通知する。もしリストの終端に達してゐたならば、エラーメッセージが與へられる。

タグマッチリストはプレビューウィンドウ內でも使用できる。そのコマンドは上記のものに似てゐるが、先頭に "p" がつく。

{|+quickfix| が無效なときは利用できない}

:pts[elect][!] [name]

":tselect[!] [name]" を實行し、"Preview" ウィンドウに新しいタグを表示する。詳細は |:ptag| を參照すること。

:ptj[ump][!] [name]

":tjump[!] [name]" を實行し、"Preview" ウィンドウに新しいタグを表示する。詳細は |:ptag| を參照すること。

:[count]ptn[ext][!]

プレビューウィンドウで ":tnext" を實行する。|:ptag| を參照すること。

:[count]ptp[revious][!]

プレビューウィンドウで ":tprevious" を實行する。|:ptag| を參照すること。

:[count]ptN[ext][!]

":ptprevious" と同じ。

:[count]ptr[ewind][!]

プレビューウィンドウで ":trewind" を實行する。|:ptag| を參照すること。

:[count]ptf[irst][!]

":ptrewind" と同じ。

:ptl[ast][!]

プレビューウィンドウで ":tlast" を實行する。|:ptag| を參照すること。

4. タグの詳細

static タグは特別なファイルのために定義されたタグである。C プログラムでは static 函數が當てはまる。

Vi はタグにジャンプするときに現在の檢索パターンを設定する。これはタグにジャンプしたあとの "n" コマンドは、その前の檢索パターンと同じ檢索を行はないといふことである。Vim ではこのやうなバグとも考へられることはしない。檢索履歷にある檢索パターンで檢索できる。もし古い Vi の振る舞ひを望むならば、’cpoptions’ に ’t’ を設定する。

Vim は希望のタグをすばやく見つけるために、タグファイル內で二分探索を行ふ(|+tag_binary| がコンパイル時に有效になつてゐれば)。しかしこれはタグファイルが ASCII コードでソートされてゐる場合にのみ機能する。したがつて、もし適合しないものが見つかつた場合は、その他の方法として線形探索が行はれる。もし線形探索のみを利用したいならば、’tagbsearch’ オプションをリセットすればよい。さうでなければ: タグファイルをソートすること!

Note:
檢索が明確な名前をもつたタグでない場合は二分探索は利用できないことに注意すること。これは大文字小文字を無視した檢索や固定文字列で始まらない正規表現による檢索で發生する。そのときはタグ檢索はかなり遲くなるだらう。先人はタグファイルを大文字と小文字を區別せずにソートすることで囘避できた。詳細は ’tagbsearch’ を參照のこと。

":tag" と ":tselect" コマンドは引數に正規表現を受け付ける。使用できる特殊文字については |pattern| を參照すること。引數が ’/’ で始まる場合はパターンとして使はれる。もし引數が ’/’ で始まらなければ、完全なタグ名の文字列として扱はれる。 例:

:tag main

最も優先度の高い "main" といふタグにジャンプする。

:tag /^get

最も優先度の高い "get" で始まるタグにジャンプする。

:tag /norm

"norm" を含むすべてのタグを列擧する。これは "id_norm" といふタグも含まれる。

もし引數と全く同じタグと、正規表現によつてマッチしたタグがあつた場合、引數と同じタグが優先される。例へば、":tag /open" は "open_file" や "file_open" よりも前に "open" にマッチする。

正規表現を使ふときは大文字・小文字は區別されない。大文字・小文字を區別したいなら正規表現の中で "\C" を使ふこと。

もしタグが現在のファイル上にあるならば、いつも機能するだらう。さうでなければ、實行結果は現在のファイルが變更されてゐるか、コマンドに ! がつけられてゐるか、’autowrite’ オプションが設定されてゐるかに依存する:

タグが現在のファイル內變更あり!autowrite オプション動作
yesxxxタグに行く
nonoxx對象ファイルを讀み込み、タグに行く
noyesyesx現在のファイルを捨て、對象ファイルを讀み込んでタグに行く
noyesnoon現在のファイルを保存し、對象ファイルを讀み込んでタグに行く
noyesnooff失敗する

Note:
Vim はセキュリティの都合上、いくつかのコマンドを禁止してゐることに注意すること。これはちやうど現在のディレクトリにある exrc/vimrc ファイルに ’secure’ オプションが使はれてゐるのと同じやうに機能する。|trojan-horse| と |sandbox| を參照すること。{tagaddress} がバッファを變更したとき、次のやうなエラーメッセージが表示される:

"WARNING: tag command changed a buffer!!!"

將來のバージョンではバッファを變更することは不可能になるだらう。これらはすべてセキュリティの理由である: 誰かが氣づかれないやうに實行される厄介なコマンドをタグファイルに隱してゐるかもしれない。例へば:

:$d|/tag-function-name/

Vi では ":tag" コマンドによつてタグを檢索すると、最新の檢索パターンを上書きする。Vim では ’cpoptions’ に ’t’ フラグが設定されてゐなければ、前の檢索パターンは引き續き記憶される。檢索パターンはいつも檢索履歷にあるので、もし檢索に失敗したらそこを修正するとよい。

Emacs スタイルのタグファイルは、Vim のコンパイル時に |+emacs_tags| 機能を有效にした場合にのみ使用できる。すまないが、Emacs タグファイルについての說明はここではしない。それは下位互換のためにのみ提供してゐる :-)。

Emacs タグファイルの行は非常に長くなることがある。Vim は行の約 510 バイトまでしか扱はない。行が無視されたかどうかは ’verbose’ を 5 以上にしてゐればわかる。Non-Emacs タグファイルではどんな長さでも良い。

tags’ オプションはファイル名のリストで構成される。これらのファイルからタグが檢索される。デフォルトの "tags" ファイルよりも、異なる tags ファイルがよく使はれるだらう。共通の tags ファイルにもよくアクセスするだらう。

以下のやうなときは、リストの次のファイルを使はない:

これは大文字小文字が無視されるかどうかにも依存します。大文字小文字は以下の場合に無視されます:

大文字小文字が無視されず、タグファイルが大文字小文字を除外したマッチのみとなる場合、續くタグファイルは大文字小文字をマッチして檢索されます。大文字小文字をマッチしてタグファイルが見つからない場合、大文字小文字を除外してマッチした最初の結果が使用されます。もし大文字小文字が無視されグローバルのタグでマッチした、もしくは大文字小文字を除外してマッチした場合、タグファイルの檢索は行はれず見附かつたそのファイルが使用されます。

タグファイル名が "./" で始まるとき、’.’ は現在のファイルのパスで置き換へられる。これにより、現在のファイルがあるディレクトリの tags ファイルを使用することができる(たとへ現在のディレクトリがどこであらうと)。"./" を使用する槪念は、どのタグファイルを最初に檢索するかを決定することである: 現在のディレクトリにするか ("tags,./tags")、現在のファイルがあるディレクトリにするか("./tags,tags")である。

例:

:set tags=./tags,tags,/home/user/commontags

この例では、現在のファイルがあるディレクトリの "tags" ファイルがまず檢索される。次に現在のディレクトリにある "tags" ファイルが檢索される。もしまだ見つからなければ、"/home/user/commontags" が檢索される。

これは ’cpoptions’ に ’d’ フラグを含めることで Vi 互換のやうにすることができる。"./tags" は現在のファイルがあるディレクトリの tags ファイルではなく、現在のディレクトリの 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’ オプションをオンにし(デフォルト)、他のディレクトリでタグファイルを使用すると、タグファイル內に記述されたファイル名はタグファイルがあるディレクトリを基準として相對パスになる。

5. タグファイルの書式

tags ファイルは "ctags" のやうな外部コマンドによつて生成される。それはそれぞれの函數へのタグを含んでゐる。"ctags" のあるバージョンでは "#defined" マクロや typedef、enum などに對してもタグを作ることができる。

tags ファイルを生成するプログラム:

ctags

ほとんどの Unix システムにある。C 言語のみ對應し、基本的な機能を提供する。

exuberant ctags

これはとてもよいものだ。C 言語、C++、Java、Fortran、Eiffel、そしてその他に對應してゐる。多くの項目にタグを生成することができる。

http://ctags.sourceforge.net を參照。

etags

Emacs に連携する。多言語に對應してゐる。

JTags

Java 用、Java で書かれてゐる。 http://www.fleiner.com/jtags/ で入手できる。

ptags.py

Python 用、Python で書かれてゐる。Python のソースディレクトリ Tools/scripts/ptags.py にある。

ptags

Perl 用、Perl で書かれてゐる。これはここで見つかる。 http://www.eleves.ens.fr:8080/home/nthiery/Tags/

gnatxref

Ada 用。http://www.gnuada.org/ を參照。 gnatxref は gnat パッケージの一部である。

tags ファイルは次の 2 つの形式のどれかで構成されなければならない:

  1. {tagname} {TAB} {tagfile} {TAB} {tagaddress}
  2. {tagname} {TAB} {tagfile} {TAB} {tagaddress} {term} {field} ..

以前には古い形式がサポートされてゐた、|tag-old-static| を參照。

最初の形式は通常のタグで、Viで完全に互換性がある。傳統的なctagsによつてのみ作られる形式である。これはしばしばグローバルな函數や他のファイルを參照する場合に使用される。

タグファイルの行は <LF> または <CR><LF> で終はる。Macintosh では <CR> も機能する。<CR> と <NL> は行內に決して現れない。

2 番目の形式は新しい。各行の末尾にある任意的なフィールドに追加の情報を含む。これは以前の Vi とも互換性がある。新しいバージョンの ctags にのみサポートされてゐる(Exuberant ctags とか)。

{tagname}

識別子。普通は函數名であるが、どんな識別子でも構はない。<Tab> を含めることはできない。

{TAB}

1 文字の <Tab>。

Note:
以前のバージョンではここでどんな空白文字も許可してゐた。これは {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> を表す
"\\" は \ を表す

’:’ を持たないフィールドがある。これはタグの一種である。"kind:" を先頭につけたものとして扱はれる。kinds については、それを提供する ctags のドキュメントを參照。

現在 Vim が認識できるその他のフィールドは "file:" (値はなし)だけである。これは static タグに使はれる。

tags ファイルの先頭行には、

!_TAG_

で始まる行を含めることができる。これらは極稀な "!" で始まるタグを除けば先頭行にソートされる。Vim は 2 つのタグを認識する。1 つはファイルがソートされてゐるかどうかを示す行で、この行が見つかつた場合には、Vim は tags ファイルに對して二分探索を使用する:

!_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’ からタグファイルのエンコーディングに變換する。そして、タグをリストするときに元に戾す。變換が失敗したときは元のままのタグが使はれる。

コマンドはどんな Ex コマンドでも使用可能であるが、檢索コマンドがよく使はれるであ ろう。

例:

tag1    file1   /^main(argc, argv)/ ~
tag2    file2   108 ~

コマンドは常に ’magic’ がセットされない狀態で實行される。檢索パターンで使用できる特殊文字は "^" (行頭) と "$" (<EOL>) だけである。|pattern| を參照すること。檢索文字列中のバックスラッシュの前にはバックスラッシュをつけなければならないことに注意すること。これは以前の Vi と互換性がある。

もしコマンドが普通の檢索コマンド ("/" か "?" で始まり、終はる) であるならば、いくつかの特別な扱ひをされる:

舊式のフォーマットは 2019 年 3 月 (patch 8.1.1092) までサポートされてゐた:

{tagfile}:{tagname} {TAB} {tagfile} {TAB} {tagaddress}

この形式は static タグにのみ使用できる。現在では廢れてをり、2 番目の形式に置き換へられてゐる。これは Elvis 1.x と古いバージョンの Vim、それといくつかのバージョンの ctags によつてのみサポートされてゐる。static タグはローカル函數によく用ゐられ、{tagfile} 內のみ參照する。static タグでは 2 つの {tagfile} は正確に一致してゐなければならないことに注意すること。static タグがどのやうに使はれるかについては |tags-option| を參照すること。

新しいバージョンの Vim に更新するときに、2 番目の形式をサポートする ctags に更新できるべきでもあるので、このサポートは削除された。

6. インクルードファイルの檢索

これらのコマンドは對象となる文字列を現在のファイルと、遭遇するすべてのインクルードファイルを再歸的に探す。これは變數や函數、マクロの定義を探すのに利用できる。現在のバッファに對してだけ檢索をしたいのならば、|pattern-searches| に列擧されてゐるコマンドを使ふとよい。

これらのコマンドは、コンパイル時に |+find_in_path| 機能を使用不可にした場合には利用できない。

他のファイルをインクルードする行に遭遇すると、現在のバッファを續けて檢索する前にインクルードファイルを檢索する。インクルードファイルによつてインクルードされるファイルも同樣に檢索される。インクルードファイルが見つからなかつた場合は默つて無視する。見つからなかつたファイルを知りたいときは |:checkpath| コマンドを使ふ。たぶん ’path’ オプションが正しく設定されてゐないのだらう。

Note:
インクルードファイルはファイルが檢索され、そのファイルを編輯中のバッファが存在しても對象にならない。バッファにある行は、現在のファイルにのみ適用される。

檢索文字列は任意のキーワードや定義されたマクロが指定できる。キーワードの場合はマッチするものを見つける。定義されたマクロの場合は ’define’ オプションにマッチする行だけが見つけられる。デフォルトは C プログラム用の "^#\s*define" である。他の言語の場合はおそらく變更したいだらう。C++ 用の例は ’define’ を參照。その文字列に改行を含めることはできない。一行內にマッチするものだけが見つかる。

定義されたマクロが見つかつた場合、行末がバックスラッシュのときは次の行も表示する。

"[" で始まるコマンドは現在のファイルの先頭から檢索を開始する。"]" で始まるコマンドは現在のカーソル位置から檢索を開始する。

include’ オプションは他のファイルをインクルードする行を定義する。デフォルトは C プログラム用の "\^#\s*include" である。

Note:
Vim は C の構文を認識しない。もし ’include’ オプションにマッチする行が "#ifdef/#endif" の閒やコメント行であつても、とにかく檢索される。’isfname’ オプションはマッチパターンに續くファイル名を認識するために使用される。

path’ オプションは絕對パスを持たないインクルードファイルを探すためのディレクトリを指定する。

comments’ オプションは單一行を表示するコマンド、もしくは行にジャンプするコマンドで使用される。これはコメントの開始パターンを定義する。それらの行は [!] を使用しない限り檢索において無視される。ひとつの例外: 行が "^# *define" といふパターンにマッチしたとき、コメントであるとはみなされない。

もしマッチしたリストを表示して、その中からジャンプ先を選擇したいならば、マッピングが利用できる。例:

:map <F4> [I:let nr = input("Which one: ")<Bar>exe "normal " . nr ."[\t"<CR>
[i

カーソルの下にあるキーワードを含む 1 行を表示する。檢索はファイルの先頭から開始する。コメントとみなせる行は無視される(’comments’ オプションを參照すること)。數字が與へられた場合は、先頭から指定した個數目にマッチした行を表示する。この場合はコメント行は無視されない。

]i

"[i" と同樣だが、檢索が現在のカーソル位置から開始される。

:[range]is[earch][!] [count] [/]pattern[/]

"[i" や "]i" と同樣だが、[range] で指定された範圍から檢索する (デフォルト: ファイル全體)。

[/] と [!] については |:search-args| を參照。

[I

カーソルの下にあるキーワードを含む行をすべて表示する。結果にはファイル名と行番號が表示される。檢索はファイルの先頭から開始される。

]I

"[I" と同樣だが、檢索が現在のカーソル位置から開始される。

:[range]il[ist][!] [/]pattern[/]

"[I" や "]I" と同樣だが、[range] で指定された範圍から檢索する (デフォルト: ファイル全體)。

[/] と [!] については |:search-args| を參照。

[ CTRL-I

カーソルの下にあるキーワードを含む最初の 1 行にジャンプする。檢索はファイルの先頭から開始する。コメントとみなせる行は無視される (’comments’ オプションを參照すること)。數字が與へられた場合は、先頭から指定した個數目にマッチした行にジャンプする。この場合はコメント行は無視されない。

] CTRL-I

"[ CTRL-I" と同樣だが、檢索が現在のカーソル位置から開始される。

:[range]ij[ump][!] [count] [/]pattern[/]

"[ CTRL-I" や "] CTRL-I" と同樣だが、[range] で指定された範圍から檢索する(デフォルト: ファイル全體)。

[/] と [!] については |:search-args| を參照。

CTRL-W CTRL-I または
CTRL-W i

新しいウィンドウを開き、カーソルの下にあつたキーワードを含む最初の 1 行に移動する。檢索はファイルの先頭から開始する。コメントとみなせる行は無視される(’comments’ オプションを參照すること)。數字が與へられた場合は、先頭から指定した個數目にマッチした行にジャンプする。この場合はコメント行は無視されない。

:[range]isp[lit][!] [count] [/]pattern[/]

"CTRL-W i" や "CTRL-W i" と同樣だが、[range] で指定された範圍から檢索する(デフォルト: ファイル全體)。

[/] と [!] については |:search-args| を參照。

[d

カーソルの下にあるマクロを含む最初のマクロ定義を表示する。檢索はファイルの先頭から開始する。數字が與へられた場合は、先頭から指定した個數目にマッチした行を表示する。

]d

"[d" と同樣だが、檢索が現在のカーソル位置から開始される。

:[range]ds[earch][!] [count] [/]string[/]

"[d" や "]d" と同樣だが、[range] で指定された範圍から檢索する(デフォルト: ファイル全體)。

[/] と [!] については |:search-args| を參照。

[D

カーソルの下にあるマクロを含むすべてのマクロ定義を表示する。結果にはファイル名と行番號が表示される。檢索はファイルの先頭から開始される。

]D

"[D" と同樣だが、檢索が現在のカーソル位置から開始される。

:[range]dli[st][!] [/]string[/]

‘[D‘ や ‘]D‘ と同樣だが、[range] で指定された範圍から檢索する (デフォルト: ファイル全體)。

[/] と [!] については |:search-args| を參照。

Note:
:dl‘ は ‘:dlist‘ ではなく、‘:delete‘ に "l" レジスタを指定したものとして機能する。

[ CTRL-D

カーソルの下にあるキーワードを含む最初のマクロ定義にジャンプする。檢索はファイルの先頭から開始する。數字が與へられた場合は、先頭から指定した個數目にマッチした行にジャンプする。

] CTRL-D

"[ CTRL-D" と同樣だが、檢索が現在のカーソル位置から開始される。

:[range]dj[ump][!] [count] [/]string[/]

"[ CTRL-D" や "] CTRL-D" と同樣だが、[range] で指定された範圍から檢索する (デフォルト: ファイル全體)。

[/] と [!] については |:search-args| を參照。

CTRL-W CTRL-D または
CTRL-W d

新しいウィンドウを開き、カーソルの下にあつたキーワードを含む最初のマクロ定義に移動する。檢索はファイルの先頭から開始する。數字が與へられた場合は、先頭から指定した個數目にマッチした行にジャンプする。

:[range]dsp[lit][!] [count] [/]string[/]

"CTRL-W d" と同樣だが、[range] で指定された範圍から檢索する (デフォルト: ファイル全體)。

[/] と [!] については |:search-args| を參照。

:che[ckpath]

ファイルが見つからないすべてのインクルードファイル名をリスト表示する。

:che[ckpath]!

すべてのインクルードファイル名をリスト表示する。

上記コマンドに共通の引數:

[!]

使用した場合は、コメントとみなせる行に對しても檢索をする。使用しなかつた場合は ’comments’ によつてコメントとみなされる行や C コメント("//" の後ろか /* */ の閒)にあるものは無視される。コメントとみなされた行が、途中からコメントでなくなるやうなときは見逃すかもしれないことに注意。

また、コメント行であつても、(’comments’ によつて) 認識されないでとにかくマッチするかもしれない。例:

/* comment
foobar */

"foobar" に對する檢索はマッチする。これは行がコメントとして認識されないためである(たとへ構文强調表示が認識したとしても)。

Note:
マクロ定義はたいていコメントと誤認されることはないので、":dlist" や ":dsearch"、":djump" に [!] を使用することは大差がない。

[/]

パターンは ’/’ で圍むことができる。’/’ なしの場合、"\<pattern\>" といふパターンを使ふことによつて、完全な語だけがマッチする。2 つ目の ’/’ の後にだけ、’|’ を使ふことによつて次のコマンドを追加できる。例:

:isearch /string/ | echo "the last one"

":djump", ":dsplit", ":dlist", ":dsearch" コマンドではパターンは檢索パターンとしてではなく文字通りに使はれる。

7. ’tagfunc’ を使ふ

|:tag|、|:tselect| のやうなコマンド、および |CTRL-]| のやうなノーマルモードタグコマンドに使はれるタグのリストを生成する函數を Vim に提供することが可能である。

タグリストの生成に使用される函數は、’tagfunc’ オプションを設定することによつて指定される。函數は 3 つの引數で呼び出される:

現在、タグ函數には 2 つのフラグを渡すことができる:

’c’この函數は、處理中の通常のコマンドによつて呼び出された。(ニーモニック: タグ函數は、カーソルの周りのコンテキストを使用して、タグリストを生成するためのより良い作業を實行できる。)
’i’插入モードで、ユーザーはタグを補完していた (|i_CTRL-X_CTRL-]| で)

Note:
tagfunc’ が設定されてゐる場合、|tag-priority| に記述されてゐるタグの優先順位は適用されない。代はりに、優先順位は、函數によつて返されるリスト內の要素の順序とまつたく同じである。

函數は辭書エントリのリストを返すべきである。各辭書は少なくとも次のエントリを含み、各値は文字列でなければならない:

nameタグ名。
filenameタグが定義されてゐるファイルの名前。カレントディレクトリからの相對パスか、フルパスのどちらかである。
cmdファイル內のタグを見つけるために使用される Ex コマンド。これはEx檢索パターンまたは行番號のどちらかである。

Note:
フォーマットは |taglist()| のものと似てをり、これにより、結果を生成するためにその出力を使用することが可能になる。 以下のフィールドはオプションである:

kindタグの種類。
user_dataオペレーション閒でタグの曖昧さを解消するために使用できる、タグスタックに格納されたカスタムデータの文字列。

函數がリストの代はりに、|v:null| を返した場合、標準のタグ檢索が代はりに實行される。

タグスタックを ’tagfunc’ の內部から變更することはできない。

以下は、’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

Up: 目次   [Index]