Nvim :help
ページは、このスクリプトから ソース を使用し、tree-sitter-vimdoc パーサーによって生成されています。
ctags *.c"ctags" は独立したプログラムです。ほとんどの Unix システムには既にインストールされています。まだお持ちでない場合は、Universal ctags を次の場所で見つけることができます: https://ctags.io
:tag startlistこのコマンドは、関数 "startlist" が別のファイルにあっても見つけます。
CTRL-]
コマンドは、カーソル下の単語のタグにジャンプします。これにより、複雑な C コードを簡単に探索できます。たとえば、関数 "write_block" にいるとします。"write_line" を呼び出していることがわかりますが、"write_line" は何をしているのでしょうか? "write_line" の呼び出しにカーソルを置いて CTRL-]
を押すと、この関数の定義にジャンプします。"write_line" 関数は "write_char" を呼び出します。その機能を理解する必要があります。そこで、"write_char" の呼び出しにカーソルを置いて CTRL-]
を押します。これで "write_char" の定義に移動しました。+-------------------------------------+ |void write_block(char **s; int cnt) | |{ | | int i; | | for (i = 0; i < cnt; ++i) | | write_line(s[i]); | |} | | +-----------|-------------------------+ | CTRL-] | | +----------------------------+ +--> |void write_line(char *s) | |{ | | while (*s != 0) | | write_char(*s++); | |} | | +--------|-------------------+ | CTRL-] | | +------------------------------------+ +--> |void write_char(char c) | |{ | | putchar((int)(unsigned char)c); | |} | +------------------------------------+
CTRL-T
コマンドは前のタグに移動します。上記の例では、"write_char" の呼び出しにある "write_line" 関数に戻ります。このコマンドは、いくつのタグをジャンプバックするかを示すカウント引数を取ります。前に進み、今は戻ってきました。もう一度前に進みましょう。次のコマンドはリストの一番上のタグに移動します。:tagカウントを前に付けて、その数のタグをジャンプフォワードできます。例: ":3tag"。
CTRL-T
もカウントを前に付けることができます。これらのコマンドを使用すると、CTRL-]
でコールツリーを下り、CTRL-T
でバックアップすることができます。":tags" を使用して、現在地を確認します。:stag tagname現在のウィンドウを分割してカーソル下のタグにジャンプするには、次のコマンドを使用します。
CTRL-W ]カウントが指定されている場合、新しいウィンドウはその行数の高さになります。
:set tags=./tags,./../tags,./*/tagsこれは、現在のファイルと同じディレクトリ、1つ上のディレクトリレベル、およびすべてのサブディレクトリにあるタグファイルを見つけます。これはかなりの数のタグファイルですが、それでも十分ではない場合があります。たとえば、"~/proj/src" のファイルを編集している場合、タグファイル "~/proj/sub/tags" は見つかりません。このような状況のために、Vim はタグファイルのディレクトリツリー全体を検索する機能を提供しています。例:
:set tags=~/proj/**/tags
cd ~/proj ctags -R .これの良いところは、Universal/Exuberant ctags がさまざまなファイルタイプを認識することです。したがって、これは C や C++ プログラムだけでなく、Eiffel や Vim スクリプトでも機能します。これを調整するには、ctags のドキュメントを参照してください。これで、大きなタグファイルがどこにあるかを Vim に伝えるだけで済みます。
:set tags=~/proj/tags
:tnextこれを繰り返して、さらに一致する箇所を探します。多数ある場合は、ジャンプするものを選択できます。
:tselect tagnameVim は選択肢のリストを表示します。
<CR>
で中止)<Tab>
を押します。:tag write_<Tab>最初の一致が表示されます。それが望むものでない場合は、目的のものが見つかるまで
<Tab>
を押します。関数の名前の一部しかわからない場合があります。または、同じ文字列で始まり、異なる文字列で終わるタグが多数ある場合があります。その場合は、Vim にパターンを使用してタグを見つけるように指示できます。"block" を含むタグにジャンプしたいとします。最初に次のように入力します。:tag /block次に、コマンドライン補完を使用します。
<Tab>
を押します。Vim は "block" を含むすべてのタグを見つけ、最初の一致を使用します。タグ名の前の "/" は、Vim に続くものがリテラルのタグ名ではなく、パターンであることを示します。ここでは、検索パターンのすべての項目を使用できます。たとえば、"write_" で始まるタグを選択したいとします。:tselect /^write_"^" は、タグが "write_" で始まることを指定します。そうでない場合、タグ名の途中で一致が見つかる可能性があります。同様に、末尾の "$" は、パターンがタグの末尾まで一致することを保証します。
CTRL-]
はカーソル下の識別子の定義に移動するため、識別子名のリストを目次として使用できます。例を次に示します。最初に識別子のリストを作成します(これには Universal または Exuberant ctags が必要です)。ctags --c-types=f -f functions *.c次に、ファイルなしで Vim を起動し、このファイルを Vim で垂直分割ウィンドウで編集します。
vim :vsplit functionsウィンドウにはすべての関数のリストが表示されます。他にもいくつかありますが、無視して構いません。":setlocal ts=99" を実行して少し整理します。このウィンドウで、マッピングを定義します。
:nnoremap <buffer> <CR> 0ye<C-W>w:tag <C-R>"<CR>移動したい関数を含む行にカーソルを移動します。次に
<Enter>
を押します。Vim は別のウィンドウに移動し、選択した関数にジャンプします。:ptag write_charVim はウィンドウを開き、タグ "write_char" にジャンプします。その後、元の位置に戻ります。したがって、
CTRL-W
コマンドを使用する必要なく入力を続けることができます。関数の名前がテキストに表示されている場合、プレビューウィンドウでその定義を取得するには、次のようにします。CTRL-W }カーソル下の単語が定義されているテキストを自動的に表示するスクリプトがあります。CursorHold-example を参照してください。
:pcloseプレビューウィンドウで特定のファイルを編集するには、":pedit" を使用します。これは、たとえばヘッダーファイルを編集する場合に役立ちます。
:pedit defs.h最後に、":psearch" を使用して、現在のファイルおよびインクルードされたファイルから単語を検索し、プレビューウィンドウに一致箇所を表示できます。これは、タグファイルがないライブラリ関数を使用する場合に特に役立ちます。例:
:psearch popenこれにより、プレビューウィンドウに "stdio.h" ファイルが表示され、popen() の関数プロトタイプが表示されます。
FILE *popen __P((const char *, const char *));
プレビューウィンドウが開かれたときの高さを 'previewheight' オプションで指定できます。#ifdef USE_POPEN
fd = popen("ls", "r")
#else
fd = fopen("tmp", "w")
#endif
ただし、実際にははるかに長く、ネストされている可能性があります。カーソルを "#ifdef" に置いて % を押します。Vim は "#else" にジャンプします。もう一度 % を押すと "#endif" に移動します。さらに % を押すと、再び "#ifdef" に戻ります。構造がネストされている場合、Vim は対応する項目を見つけます。これは、"#endif" を忘れないようにするための良い方法です。"#if" - "#endif" の内部にいる場合は、次のようにしてその開始位置にジャンプできます。[#"#if" または "#ifdef" を探していない場合、Vim はビープ音を鳴らします。次の "#else" または "#endif" にジャンプするには、次のようにします。
]#これら2つのコマンドは、遭遇したすべての "#if" - "#endif" ブロックをスキップします。例:
[(
])
/* - */
コメントに対してのみ機能します。+-> +-> /* | [/ | * A comment about --+ [/ | +-- * wonderful life. | ]/ | */ <-+ | +-- foo = bar * 3; --+ | ]/ /* a short comment */ <-+
[IVimは、見つかった一致する行をリストします。現在のファイルだけでなく、すべてのインクルードされたファイル(およびそれらにインクルードされたファイルなど)も検索します。結果は次のようになります。
structs.h 1: 29 unsigned column; /* column number */タグまたはプレビューウィンドウを使用するよりも利点は、インクルードされたファイルが検索されることです。ほとんどの場合、これにより正しい宣言が見つかります。タグファイルが古くなっている場合や、インクルードされたファイルのタグがない場合にも有効です。ただし、"[I"が機能するためには、いくつかのことが正しく設定されている必要があります。まず、'include'オプションで、ファイルがどのようにインクルードされるかを指定する必要があります。デフォルト値はCおよびC++で機能します。他の言語の場合は、変更する必要があります。
:checkpath見つからなかったインクルードファイルが一覧表示されます。また、見つかったファイルによってインクルードされたファイルも一覧表示されます。出力例
:set path+=/usr/local/X11サブディレクトリが多数ある場合は、"*"ワイルドカードを使用できます。例
:set path+=/usr/*/includeこれにより、"/usr/local/include"と"/usr/X11/include"のファイルが見つかります。
:set path+=/projects/invent/**/includeこれは、次のディレクトリにあるファイルを見つけます
:checkpath!インクルードされたファイル、それらがインクルードするファイルなどの(非常に長い)リストが表示されます。リストを少し短くするために、Vimは以前に見つかったファイルに対して「(既にリストされています)」と表示し、そこに含まれるインクルードされたファイルは再びリストしません。
[<Tab>
CTRL-I
は<Tab>
を押すのと同じであるため、"[ CTRL-I
"も使用できます。3[<Tab>リストの3番目の項目にジャンプします。
CTRL-O
を使用して、開始位置に戻ることができることに注意してください。[Dこれも、インクルードされたファイルを検索します。'define'オプションは、"[D"の項目を定義する行がどのようなものかを指定します。CまたはC++以外の言語で動作するように変更できます。"[D"に関連するコマンドは次のとおりです。
gDヒント:定義に移動します。このコマンドは、ローカルに宣言された(C用語では「static」)変数または関数を見つけるのに非常に役立ちます。例(カーソルが「counter」上にある場合)
+-> static int counter = 0; | | int get_counter(void) gD | { | ++counter; +-- return counter; }
gdこれは、現在の関数の先頭に戻り、カーソル下の単語の最初の出現箇所を見つけます。実際には、最初の列の "{" の上の空行まで逆方向に検索します。そこから、識別子を前方に検索します。例(カーソルが「idx」上にある場合)
int find_entry(char *name) { +-> int idx; | gd | for (idx = 0; idx < table_len; ++idx) | if (strcmp(table[idx].name, name) == 0) +-- return idx; }