挿入

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


挿入モード テキストの挿入と置換 mode-ins-repl
このファイルのほとんどは挿入モードと置換モードに関するものです。最後に、他の方法でテキストを挿入するためのいくつかのコマンドがあります。
最もよく使われるコマンドの概要は、ユーザマニュアルの24章 usr_24.txt にあります。
また、カーソルを文字が存在しない位置に移動するための 'virtualedit' オプションも参照してください。表を編集するのに便利です。

1. 特殊キー ins-special-keys

挿入モードと置換モードでは、以下の文字は特別な意味を持ちます。他の文字は直接挿入されます。これらの特殊文字をバッファに挿入するには、CTRL-V を前に付けます。<Nul> 文字を挿入するには、"CTRL-V CTRL-@" または "CTRL-V 000" を使用します。一部のシステムでは、CTRL-C を挿入するには "CTRL-V 003" を使用する必要があります。注: CTRL-V がマップされている場合は、代わりに CTRL-Q を使用できる場合があります i_CTRL-Q
テキスト挿入時に特別な言語モードで作業している場合は、'langmap' オプション、'langmap'を参照して、このモードのオンとオフを頻繁に切り替えるのを避ける方法を確認してください。
文字 アクション
<Esc> または CTRL-[ 挿入モードまたは置換モードを終了し、ノーマルモードに戻ります。省略形を完了します。注: <Esc> キーが押しにくい場合は、代わりに CTRL-[ を試してください。 i_META i_ALT ALT (META) は、キーバインドされていない場合、<Esc> のように動作する場合があります。たとえば、<A-x> が挿入モードでキーバインドされていない場合、<Esc>x のように動作します。 i_CTRL-C
CTRL-C 挿入モードを終了し、ノーマルモードに戻ります。省略形はチェックしません。InsertLeave 自動コマンドイベントはトリガーされません。
i_CTRL-@
CTRL-@ 直前に挿入したテキストを挿入し、挿入を停止します。
i_CTRL-A
CTRL-A 直前に挿入したテキストを挿入します。
i_CTRL-H i_<BS> i_BS <BS> または CTRL-H カーソルの前の文字を削除します(行の結合については、i_backspacing を参照してください)。 i_<Del> i_DEL <Del> カーソルの下の文字を削除します。カーソルが行末にあり、'backspace' オプションに "eol" (デフォルト)が含まれている場合、<EOL> を削除します。次の行が現在の行の後に追加されます。 i_CTRL-W
CTRL-W カーソルの前の単語を削除します(行の結合については、i_backspacing を参照してください)。単語の定義については、「単語移動」のセクション、word-motions を参照してください。 i_CTRL-W-default
デフォルトでは、削除前に新しいアンドゥポイントを設定します。 default-mappings i_CTRL-U
CTRL-U 現在の行でカーソルより前に入力されたすべての文字を削除します。新しい入力文字がなく、'backspace' が空でない場合は、現在の行のカーソルより前のすべての文字を削除します。C-インデントが有効になっている場合、行が空白になるとインデントが調整されます。行の結合については、i_backspacing を参照してください。 i_CTRL-U-default
デフォルトでは、削除前に新しいアンドゥポイントを設定します。 default-mappings i_CTRL-I i_<Tab> i_Tab <Tab> または CTRL-I タブを挿入します。'expandtab' オプションがオンの場合、同等の数のスペースが挿入されます(展開を避けるには CTRL-V <Tab> を使用します。CTRL-V がマップされている場合は CTRL-Q <Tab> を使用します i_CTRL-Q)。'smarttab' オプションと ins-expandtab も参照してください。 i_CTRL-J i_<NL> <NL> または CTRL-J 新しい行を開始します。 i_CTRL-M i_<CR> <CR> または CTRL-M 新しい行を開始します。 i_CTRL-K
CTRL-K {char1} [char2] ダイグラフを入力します(ダイグラフを参照)。{char1} が特殊キーの場合、そのキーのコードが <> 形式で挿入されます。たとえば、文字列 "<S-Space>" は、<C-K><S-Space> (2 つのキー) を入力することで入力できます。どちらの文字もマッピングの対象とはみなされません。
CTRL-N 次のキーワードを検索します(i_CTRL-N を参照)。CTRL-P 前のキーワードを検索します(i_CTRL-P を参照)。
CTRL-R {register} i_CTRL-R
レジスタの内容を挿入します。CTRL-R と次の文字の間には、レジスタの名前を入力する必要があることを示すために '"' が表示されます。テキストは入力したかのように挿入されますが、マッピングと省略形は使用されません。'textwidth''formatoptions'、または 'autoindent' のようなオプションを設定している場合、これは挿入される内容に影響します。これは、"p" コマンドやマウスでの貼り付けとは異なります。特殊レジスタ: '"' 最後に行った削除またはヤンクのテキストを含む無名レジスタ '%' 現在のファイル名 '#' 代替ファイル名 "*" クリップボードの内容(X11: プライマリ選択) '+' クリップボードの内容 '/' 最後に行った検索パターン ':' 最後に行ったコマンドライン '.' 最後に入力したテキスト i_CTRL-R_-
'-' 最後の小さな(1 行未満の)削除レジスタ。これは、挿入するリテラルテキストの代わりに配置するレジスタを記憶しているため、. を使用して繰り返すことができます。 i_CTRL-R_=
'=' 式レジスタ:式を入力するように求められます(を参照)。0x80 (10進数で 128) は特殊キーに使用されることに注意してください。たとえば、これを使用してカーソルを上に移動できます:CTRL-R ="\<Up>" テキストを文字通りに挿入するには、CTRL-R CTRL-R を使用します。結果が List の場合、項目は行として使用されます。内部に改行を含めることもできます。結果が Float の場合、自動的に String に変換されます。append() または setline() が呼び出されると、アンドゥシーケンスが中断されます。レジスタについては、レジスタ を参照してください。
CTRL-R CTRL-R {register} i_CTRL-R_CTRL-R
レジスタの内容を挿入します。単一の CTRL-R を使用する場合と同様に動作しますが、テキストはタイプされたかのようにではなく、文字通りに挿入されます。これは、レジスタに <BS> のような文字が含まれている場合に異なります。例:レジスタ a に "ab^Hc" が含まれている場合
CTRL-R a                results in "ac".
CTRL-R CTRL-R a                results in "ab^Hc".
'textwidth''formatoptions' などのオプションは引き続き適用されます。これらも回避する場合は、後述の CTRL-R CTRL-O を使用します。'.' レジスタ(最後に入力したテキスト)は、タイプされたように挿入されます。このコマンドの後、'.' レジスタには、タイプしたかのようにレジスタからのテキストが含まれます。
CTRL-R CTRL-O {register} i_CTRL-R_CTRL-O
レジスタの内容を文字通りに挿入し、自動インデントを行いません。マウスで貼り付ける場合と同じ動作をします <MiddleMouse>。レジスタが行単位の場合、これは P のように、現在の行の上にテキストを挿入します。'.' レジスタ(最後に入力したテキスト)は、タイプされたように挿入されます。このコマンドの後、'.' レジスタには、入力されたコマンドが含まれ、テキストは含まれません。つまり、リテラル "^R^O" であり、レジスタからのテキストではありません。置換モードでは文字を置き換えません!
CTRL-R CTRL-P {register} i_CTRL-R_CTRL-P
レジスタの内容を文字通りに挿入し、[<MiddleMouse> のようにインデントを修正します。'.' レジスタ(最後に入力したテキスト)は、タイプされたように挿入されます。このコマンドの後、'.' レジスタには、入力されたコマンドが含まれ、テキストは含まれません。つまり、リテラル "^R^P" であり、レジスタからのテキストではありません。置換モードでは文字を置き換えません!
i_CTRL-T
CTRL-T 現在の行の先頭に、1 つの shiftwidth のインデントを挿入します。インデントは常に 'shiftwidth' に丸められます。 i_CTRL-D
CTRL-D 現在の行の先頭から、1 つの shiftwidth のインデントを削除します。インデントは常に 'shiftwidth' に丸められます。
i_0_CTRL-D
0 CTRL-D 現在の行のすべてのインデントを削除します。
i_^_CTRL-D
^ CTRL-D 現在の行のすべてのインデントを削除します。インデントは次の行で復元されます。これはラベルを挿入するときに便利です。
i_CTRL-V
CTRL-V 次の非数字を文字通りに挿入します。文字の10進数、8進数、16進数の値を入力することも可能ですi_CTRL-V_digitCTRL-V の直後に入力された文字は、マッピングの対象とは見なされません。特殊キーの場合、CTRL修飾子をキーに含めることで制御文字を生成できます。キーに対応する制御文字がない場合は、そのキー表記が挿入されます。注: CTRL-V が(例えば、テキストを貼り付けるために)マッピングされている場合は、代わりに CTRL-Q を使用できることが多いですi_CTRL-Q
i_CTRL-Q
CTRL-Q CTRL-V と同じです。注: 一部のターミナル接続では CTRL-Q が無視される可能性があり、その場合は機能しません。GUIでは機能します。

CTRL-SHIFT-V i_CTRL-SHIFT-V i_CTRL-SHIFT-Q

CTRL-SHIFT-Q CTRL-V と同じように機能しますが、CTRL修飾子をキーに含めようとしないでください。
CTRL-X CTRL-X モードに入ります。これは、単語を補完したり、ウィンドウをスクロールしたりするためのコマンドが与えられるサブモードです。i_CTRL-X および ins-completion を参照してください。
i_CTRL-E
CTRL-E カーソルの下にある文字を挿入します。i_CTRL-Y
CTRL-Y カーソルの上にある文字を挿入します。CTRL-ECTRL-Y では、長い行から文字をコピーできるように、'textwidth' は使用されないことに注意してください。
i_CTRL-_
CTRL-_ 'revins' を切り替えることで、挿入方向を切り替えます。
CTRL-_ は、入力したテキストの最後にカーソルを移動します。
このコマンドは、'allowrevins' オプションが設定されている場合にのみ使用できます。右から左モードの詳細については、rileft.txt を参照してください。
i_CTRL-^
CTRL-^ 入力言語文字の使用を切り替えます。言語 :lmap マッピングが定義されている場合
'iminsert' が 1 (langmap マッピングを使用) の場合、0 (langmap マッピングを使用しない) になります。
'iminsert' が別の値を持つ場合は、1 になり、langmap マッピングが有効になります。言語マッピングが定義されていない場合
'iminsert' が 2 (入力メソッドを使用) の場合、0 (入力メソッドを使用しない) になります。
'iminsert' が別の値を持つ場合は、2 になり、入力メソッドが有効になります。1 に設定すると、ステータス行に "b:keymap_name" 変数、'keymap' オプション、または "<lang>" の値が表示されます。言語マッピングは通常、キーボードが生成するものとは異なる文字を入力するために使用されます。'keymap' オプションを使用すると、多数の言語マッピングをインストールできます。
i_CTRL-]
CTRL-] 文字を挿入せずに、略語をトリガーします。
i_<Insert>
<Insert> 挿入モードと置換モードを切り替えます。
<BS>CTRL-W、および CTRL-U の効果は、'backspace' オプション('revins' が設定されていない場合)に依存します。これは、コンマで区切られた項目のリストです。
項目 アクション
indent 自動インデントを超えてバックスペースを許可する eol 行末を超えてバックスペースを許可する (行を結合する) start 挿入の開始位置を超えてバックスペースを許可する。CTRL-W および CTRL-U は開始位置で一度停止する
'backspace' が空の場合、Vi互換のバックスペースが使用されます。自動インデントの前、1列目より前、または挿入が開始された位置より前でバックスペースすることはできません。
下位互換性のために、値 "0"、"1"、"2"、および "3" も許可されています。'backspace' を参照してください。
'backspace' オプションに "eol" が含まれており、3つのキーのいずれかが使用されたときにカーソルが1列目にある場合、現在の行は前の行と結合されます。これにより、カーソルの前にある <EOL> が事実上削除されます。
i_CTRL-V_digit
CTRL-V を使用すると、文字の10進数、8進数、または16進数の値を直接入力できます。この方法で、改行(<NL>、値10)を除く任意の文字を入力できます。文字値を入力する方法は5つあります。
最初の文字 モード 最大文字数 最大値
(なし) 10進数 3 255 o または O 8進数 3 377 (255) x または X 16進数 2 ff (255) u 16進数 4 ffff (65535) U 16進数 8 7fffffff (2147483647)
通常、最大文字数を入力します。したがって、スペース(値32)を入力するには、<C-V>032と入力します。先頭のゼロを省略できます。その場合、数字の後にタイプされた文字は数字以外である必要があります。これは他のモードでも同様です。そのモードで無効な文字を入力するとすぐに、その前の値が使用され、「無効な」文字は通常の方法で処理されます。
値10を入力すると、ファイルに0として書き込まれます。10は <NL> であり、内部で <Nul> 文字を表すために使用されます。バッファをファイルに書き込むと、<NL> 文字は <Nul> に変換されます。<NL> 文字は各行の末尾に書き込まれます。したがって、<NL> 文字をファイルに挿入したい場合は、改行する必要があります。'fileformat' も参照してください。
i_CTRL-X insert_expand CTRL-X は、いくつかのコマンドを使用できるサブモードに入ります。これらのコマンドのほとんどはキーワード補完を行います。ins-completion を参照してください。
挿入モードを終了せずに、ウィンドウを上下にスクロールするために使用できる2つのコマンドがあります。
i_CTRL-X_CTRL-E
CTRL-X CTRL-E ウィンドウを1行上にスクロールします。補完を実行する場合は、こちらを参照してください:complete_CTRL-E
i_CTRL-X_CTRL-Y
CTRL-X CTRL-Y ウィンドウを1行下にスクロールします。補完を実行する場合は、こちらを参照してください:complete_CTRL-Y
CTRL-X が押された後、各 CTRL-E (CTRL-Y) は、ファイル内の現在のカーソルの位置から移動しない限り、ウィンドウを1行上 (下) にスクロールします。別のキーが押されるとすぐに、CTRL-X モードは終了し、そのキーは挿入モードとして解釈されます。

2. 特殊キー ins-special-special

次のキーは特殊です。これらは現在の挿入を停止し、何らかの処理を行い、その後挿入を再開します。これは、挿入モードを常に使用したい場合に非常に便利です。まるで、別個のノーマルモードを持たないエディターのようにです。関数キーをコマンドにマッピングしたい場合は、CTRL-O を使用できます。
これらのキーの前後の変更(挿入または削除された文字)は、別々に元に戻すことができます。最後の変更のみをやり直すことができ、常に "i" コマンドのように動作します。
文字 アクション

<Up> カーソルを1行上に移動します i_<Up>

<Down> カーソルを1行下に移動します i_<Down>
CTRL-G <Up> カーソルを1行上に移動し、挿入開始列に移動します i_CTRL-G_<Up>
CTRL-G k カーソルを1行上に移動し、挿入開始列に移動します i_CTRL-G_k
CTRL-G CTRL-K カーソルを1行上に移動し、挿入開始列に移動します i_CTRL-G_CTRL-K
CTRL-G <Down> カーソルを1行下に移動し、挿入開始列に移動します i_CTRL-G_<Down> CTRL-G j カーソルを1行下に移動し、挿入開始列に移動します i_CTRL-G_j CTRL-G CTRL-J カーソルを1行下に移動し、挿入開始列に移動します i_CTRL-G_CTRL-J <Left> カーソルを1文字左に移動します i_<Left>
<Right> カーソルを1文字右に移動します i_<Right>
<S-Left> カーソルを1単語前に移動します("b" コマンドと同様)i_<S-Left>
<C-Left> カーソルを1単語前に移動します("b" コマンドと同様)i_<C-Left>
<S-Right> カーソルを1単語先に移動します("w" コマンドと同様)i_<S-Right> <C-Right> カーソルを1単語先に移動します("w" コマンドと同様)i_<C-Right> <Home> カーソルを行の先頭文字に移動します i_<Home>
<End> カーソルを行の最後の文字の後に移動します i_<End>
<C-Home> カーソルをファイルの先頭文字に移動します i_<C-Home>
<C-End> カーソルをファイルの最後の文字の後に移動します i_<C-End>
<LeftMouse> カーソルをマウスのクリック位置に移動します i_<LeftMouse>
<S-Up> ウィンドウを1ページ上に移動します i_<S-Up>
<PageUp> ウィンドウを1ページ上に移動します i_<PageUp>
<S-Down> ウィンドウを1ページ下に移動します i_<S-Down>
<PageDown> ウィンドウを1ページ下に移動します i_<PageDown>
<ScrollWheelDown> ウィンドウを3行下に移動 i_<ScrollWheelDown> <S-ScrollWheelDown> ウィンドウを1ページ下に移動 i_<S-ScrollWheelDown>
<ScrollWheelUp> ウィンドウを3行上に移動 i_<ScrollWheelUp>
<S-ScrollWheelUp> ウィンドウを1ページ上に移動 i_<S-ScrollWheelUp>
<ScrollWheelLeft> ウィンドウを6列左に移動 i_<ScrollWheelLeft> <S-ScrollWheelLeft> ウィンドウを1ページ左に移動 i_<S-ScrollWheelLeft>
<ScrollWheelRight> ウィンドウを6列右に移動 i_<ScrollWheelRight> <S-ScrollWheelRight> ウィンドウを1ページ右に移動 i_<S-ScrollWheelRight>
CTRL-O コマンドを1つ実行し、挿入モードに戻る i_CTRL-O CTRL-\ CTRL-OCTRL-O と同様だが、カーソルを移動しない i_CTRL-\_CTRL-O
CTRL-G u アンドゥシーケンスを閉じ、新しい変更を開始する i_CTRL-G_u
CTRL-G U 次の左/右カーソル移動で新しいアンドゥブロックを開始しない。カーソルが同じ行内にとどまる場合。 i_CTRL-G_U
CTRL-O コマンドには、時々副作用があります。カーソルが行末を超えていた場合、その行の最後の文字に移動します。マッピングでは、<Esc> を使う方が良いことがよくあります。(まずテキストに「x」を挿入し、<Esc> を押すと、常にカーソルがその上に移動します。)または、CTRL-\ CTRL-O を使用しますが、その場合、カーソルが行末を超えている可能性があることに注意してください。CTRL-\ CTRL-O に続くコマンドはカーソルを移動させることができ、元の位置に戻らないことに注意してください。
CTRL-O コマンドはノーマルモードに移動します。その後、コマンドを使用して挿入モードに戻ると、通常はネストされません。したがって、「a<C-O>a」と入力してから <Esc> を押してノーマルモードに戻る場合、<Esc> を2回入力する必要はありません。例外は、コマンドを入力しない場合、たとえば、マッピングを実行したりスクリプトをソースしたりする場合です。これにより、挿入モードに一時的に切り替わるマッピングが機能します。
シフト付きカーソルキーはすべての端末で使用できるわけではありません。
もう1つの副作用は、「i」または「a」コマンドの前に指定されたカウントが無視されることです。これは、CTRL-O の後のコマンドの効果を繰り返すのが非常に複雑なためです。
CTRL-G u の使用例
:inoremap <C-H> <C-G>u<C-H>
これにより、バックスペースキーが新しいアンドゥシーケンスを開始するように再定義されます。これで、CTRL-O u で、バックスペースキーの効果をアンドゥできます。その前にタイプした内容を変更する必要はありません。別の例
:inoremap <CR> <C-]><C-G>u<CR>
これにより、各改行で新しいアンドゥブロックが開始されます。また、この前に省略形が展開されます。
CTRL-G U の使用例
inoremap <Left>  <C-G>U<Left>
inoremap <Right> <C-G>U<Right>
inoremap <expr> <Home> col('.') == match(getline('.'), '\S') + 1 ?
 \ repeat('<C-G>U<Left>', col('.') - 1) :
 \ (col('.') < match(getline('.'), '\S') ?
 \     repeat('<C-G>U<Right>', match(getline('.'), '\S') + 0) :
 \     repeat('<C-G>U<Left>', col('.') - 1 - match(getline('.'), '\S')))
inoremap <expr> <End> repeat('<C-G>U<Right>', col('$') - col('.'))
inoremap ( ()<C-G>U<Left>
これにより、挿入モードでカーソルキーを使用できるようになります。新しいアンドゥブロックを開始しないため、.(リドゥ)が期待どおりに機能します。また、次のようなテキストを入力します(上記の「(」のマッピングを使用)。
Lorem ipsum (dolor
は、.を使用して期待どおりに繰り返されます。
Lorem ipsum (dolor)
CTRL-O を使用すると、アンドゥが分割されます。その前後にタイプされたテキストは個別にアンドゥされます。これを避けたい場合(たとえば、マッピングで)、CTRL-R = i_CTRL-R を使用できる場合があります。たとえば、関数を呼び出す場合。
:imap <F2> <C-R>=MyFunc()<CR>
'whichwrap' オプションが適切に設定されている場合、行の最初/最後の文字の <Left> キーと <Right> キーは、カーソルを前/次の行にラップします。
CTRL-G j および CTRL-G k コマンドを使用して、列の前にテキストを挿入できます。例
int i;
int j;
カーソルを最初の「int」に置き、「istatic <C-G>j 」と入力します。結果は次のようになります。
static int i;
       int j;
すべての行の列の前に同じテキストを挿入する場合は、Visual ブロックコマンド「I」 v_b_I を使用します。

3. 'textwidth' および 'wrapmargin' オプション ins-textwidth

'textwidth' オプションを使用すると、行が長くなりすぎる前に自動的に改行できます。'textwidth' オプションを目的の最大行の長さに設定します。その後、より多くの文字(スペースまたはタブではない)を入力すると、最後の単語が新しい行に移動します(行の唯一の単語でない場合)。'textwidth' を 0 に設定すると、この機能は無効になります。
'wrapmargin' オプションもほぼ同じことを行います。違いは、'textwidth' が固定幅であるのに対し、'wrapmargin' は画面の幅に依存することです。'wrapmargin' を使用する場合、これは(列 - 'wrapmargin')に等しい値を持つ 'textwidth' を使用することと同じです。ここで、列は画面の幅です。
'textwidth''wrapmargin' の両方が設定されている場合は、'textwidth' が使用されます。
実際には改行したくないが、便利な場所で折り返して行を表示したい場合は、'linebreak' オプションを参照してください。
行は、挿入モードを使用している場合、または行に追加している場合にのみ自動的に改行されます。置換モードで、行の長さが変更されない場合、行は改行されません。
マージンの後に空白文字以外の文字を入力すると、長い行が改行されます。行が改行される状況は、'formatoptions' オプションに文字を追加することで制限できます。「l」挿入が開始されたときに、'textwidth' より長くなかった場合にのみ、行を改行します。「v」現在の挿入コマンド中に入力された空白文字でのみ、改行します。これは主に Vi 互換です。「lv」挿入が開始されたときに、行が 'textwidth' より長くなかった場合にのみ改行し、現在の挿入コマンド中に入力された空白文字でのみ改行します。'textwidth' 境界を越えながら空白文字以外の文字を入力する場合、「l」とは異なります。
通常、内部関数を使用して、改行する場所を決定します。異なる方法で実行する場合は、'formatexpr' オプションを改行を処理する式に設定します。
テキストのブロックをフォーマットする場合は、「gq」演算子を使用できます。「gq」と入力し、ブロックの終わりにカーソルを移動する移動コマンドを入力します。多くの場合、コマンド「gq}」は必要なことを実行します(段落の終わりまでフォーマット)。または、「gqap」を使用できます。これは、カーソルが現在どこにあるかに関係なく、段落全体をフォーマットします。または、Visual モードを使用できます。「v」を押して、ブロックの終わりに移動し、「gq」と入力します。gq も参照してください。

4. 'expandtab', 'smarttab' および 'softtabstop' オプション ins-expandtab

'expandtab' オプションがオンの場合、スペースを使用してタブの空白量を埋めます。実際の <Tab> を入力する場合は、最初に CTRL-V を入力します(CTRL-V がマッピングされている場合は CTRL-Q を使用します i_CTRL-Q)。'expandtab' オプションは、デフォルトではオフになっています。置換モードでは、1つの文字が複数のスペースで置き換えられることに注意してください。この結果、行の文字数が増加します。バックスペースは、一度に1つのスペースを削除します。バックスペースで戻ったスペース(最後のスペース)に対してのみ、元の文字が戻されます。
ins-smarttab
'smarttab' オプションがオンの場合、<Tab> は行の先頭に 'shiftwidth' ポジションを挿入し、他の場所に 'tabstop' ポジションを挿入します。つまり、<Tab> 文字の代わりにスペースが挿入されることがよくあります。'smarttab' がオフの場合、<Tab> は常に 'tabstop' ポジションを挿入し、'shiftwidth' は「>>」などの場合にのみ使用されます。
ins-softtabstop
'softtabstop' オプションがゼロ以外の場合、<Tab>'softtabstop' ポジションを挿入し、空白を削除するために使用される <BS>'softtabstop' ポジションを削除します。これは、'tabstop''softtabstop' に設定されているように感じますが、実際の <Tab> 文字は 'tabstop' ポジションを取得するため、他のアプリケーションで使用した場合でも、ファイルは正しく表示されます。
'softtabstop' がゼロ以外の場合、<BS> は、前に挿入された文字がスペースの場合を除き、前の 'softtabstop' 位置に移動するためにできるだけ多くの空白を削除しようとします。この場合、カーソルの前の文字のみを削除します。そうしないと、カーソルの前の1つの文字を常に削除することはできません。まず 'softtabstop' 文字を削除してから、必要な場所に移動するために余分なスペースを入力する必要があります。

5. 置換モード Replace Replace-mode mode-replace

ノーマルモードで「R」コマンドを使用して、置換モードに入ります。
置換モードでは、タイプするすべての文字について、行の1つの文字が削除されます。削除する文字がない場合(行の末尾)、入力された文字が追加されます(挿入モードと同様)。したがって、行の文字数は行末に達するまで同じままです。<NL> を入力すると、改行が挿入され、文字は削除されません。
<Tab> 文字には注意してください。その場所に通常の印刷文字を入力すると、文字数は同じままですが、列数は小さくなります。
置換モードで文字を削除した場合(<BS>, CTRL-W, または CTRL-Uを使用)、何が起こるかというと、変更が削除されます。置き換えられた文字が復元されます。既存のテキストを超えて入力した場合、追加した文字は削除されます。これは事実上、文字ごとのアンドゥです。
'expandtab' オプションがオンの場合、<Tab> は1つの文字を複数のスペースで置き換えます。この結果、行の文字数が増加します。バックスペースは、一度に1つのスペースを削除します。バックスペースで戻ったスペース(最後のスペース)に対してのみ、元の文字が戻されます。

6. 仮想置換モード vreplace-mode Virtual-Replace-mode

ノーマルモードで「gR」コマンドを使用して、仮想置換モードに入ります。
仮想置換モードは置換モードに似ていますが、ファイル内の実際の文字を置き換えるのではなく、画面上の領域を置き換えているため、ファイル内の後続の文字は決して移動するように見えません。
したがって、<Tab> を入力すると、複数の通常の文字が置き換えられる可能性があり、<Tab> の上に文字を入力すると、<Tab> が以前と同じ場所に並ぶため、何も置き換えられない場合があります。
<NL>を入力しても、ファイルの後半の文字が移動して見えることはありません。現在の行の残りの部分は<NL>で置き換えられ(つまり、削除され)、置き換えは次の行で継続されます。ファイルの末尾を超えない限り、新しい行は挿入されません。
CTRL-TCTRL-Dを使用すると、興味深い効果が見られます。カーソルの前の文字は通常どおり横にシフトしますが、行の後ろの文字は静止したままです。CTRL-Tは、シフトされた文字の下に古い行の一部を隠しますが、CTRL-Dはそれらを再び表示します。
置換モードと同様に、<BS>などを使用すると、置き換えられた文字が元に戻ります。これは、'smartindent'CTRL-TCTRL-D'expandtab''smarttab''softtabstop'などと組み合わせて使用できます。
'list'モードでは、仮想置換モードは、"L"が'cpoptions'に含まれていない限り、'list'モードではないかのように動作します。
カーソルより後の文字が移動して表示される唯一の状況は、リストモードの'list'と、'wrap'が設定されている場合(行の長さが画面の幅よりも短くまたは長くなった場合)です。その他の場合では、後続の文字が移動しないようにスペースが挿入されることがあります。
このモードは、表の<Tab>区切りの列を編集したり、すべての列を揃えたまま新しいデータを入力したりするのに非常に役立ちます。

7. 挿入モード補完 ins-completion

挿入モードおよび置換モードでは、入力されたキーワードまたは行の一部を補完するコマンドがいくつかあります。これは、複雑なキーワード(例:大文字とアンダースコアを含む関数名)を使用している場合に役立ちます。
補完は以下に対して実行できます。
1. 行全体 i_CTRL-X_CTRL-L 2. 現在のファイルのキーワード i_CTRL-X_CTRL-N 3. 'dictionary'のキーワード i_CTRL-X_CTRL-K 4. 'thesaurus'のキーワード、シソーラス形式 i_CTRL-X_CTRL-T 5. 現在およびインクルードされたファイルのキーワード i_CTRL-X_CTRL-I 6. タグ i_CTRL-X_CTRL-] 7. ファイル名 i_CTRL-X_CTRL-F 8. 定義またはマクロ i_CTRL-X_CTRL-D 9. Vimコマンドライン i_CTRL-X_CTRL-V 10. ユーザー定義補完 i_CTRL-X_CTRL-U 11. オムニ補完 i_CTRL-X_CTRL-O 12. スペル候補 i_CTRL-X_s 13. 'complete'のキーワード i_CTRL-N i_CTRL-P
さらに、i_CTRL-X_CTRL-Zはテキストを変更せずに補完を停止します。
これらはすべて、CTRL-NCTRL-Pを除き、CTRL-Xモードで実行されます。これは、挿入モードと置換モードのサブモードです。CTRL-XCTRL-Xコマンドの1つを入力すると、CTRL-Xモードに入ります。有効なCTRL-Xモードコマンドではないキーを入力すると、CTRL-Xモードを終了します。有効なキーは、CTRL-Xコマンド自体、CTRL-N(次へ)、およびCTRL-P(前へ)です。
現在の補完情報を取得するには、complete_info()を使用できます。また、一致する大文字小文字を調整する場合は、'infercase'オプションも参照してください。
complete_CTRL-E
補完がアクティブな場合は、CTRL-Eを使用して補完を停止し、最初に入力したテキストに戻ることができます。CTRL-Eは挿入されません。
complete_CTRL-Y
ポップアップメニューが表示されているときに、CTRL-Yを使用して補完を停止し、現在選択されているエントリを受け入れることができます。CTRL-Yは挿入されません。スペース、Enter、またはその他の印刷不可能な文字を入力すると、補完モードを終了し、入力した文字が挿入されます。
ポップアップメニューが表示されているときは、さらにいくつかの特殊なキーがあります。詳細については、popupmenu-keysを参照してください。
注: CTRL-Xモードで有効なキーはマップされません。これにより、:map <C-F> <C-X><C-F>が機能します。CTRL-Xモードを終了するキー(有効なCTRL-Xモードコマンドではないキー)はマップされます。また、'complete'を使用して補完を行う場合、マッピングは通常どおり適用されます。
E565
注: 補完がアクティブな間は、挿入モードを再帰的に使用することはできず、バッファテキストを変更することはできません。何らかの形で":normal i.."を呼び出すマッピングは、E565エラーを生成します。
補完コマンドの入力を少し簡単にするために、以下のマッピングが推奨されています(ただし、他のコマンドを隠してしまう場合があります)。
:inoremap <C-]> <C-X><C-]>
:inoremap <C-F> <C-X><C-F>
:inoremap <C-D> <C-X><C-D>
:inoremap <C-L> <C-X><C-L>
特殊なケースとして、レジスタ挿入を実行するためにCTRL-Rを入力しても(i_CTRL-Rを参照)、CTRL-Xモードは終了しません。これは主に、次の操作を決定するために '=' レジスタを使用して関数を呼び出すことができるようにするためです。レジスタの内容(または '=' レジスタ評価の結果)が有効なCTRL-Xモードキーではない場合、これらのキーが入力されたかのようにCTRL-Xモードは終了します。
たとえば、次のマッピングでは、現在の行が現在空白のみである場合は、<Tab>を実際に挿入するか、CTRL-N補完操作を開始/継続します。
function! CleverTab()
   if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$'
      return "\<Tab>"
   else
      return "\<C-N>"
   endif
endfunction
inoremap <Tab> <C-R>=CleverTab()<CR>
行全体の補完 compl-whole-line
i_CTRL-X_CTRL-L
CTRL-X CTRL-L カーソルより前の現在の行と同じ文字で始まる行を後方に検索します。インデントは無視されます。一致する行がカーソルの前に挿入されます。'complete'オプションは、一致するバッファを検索するために使用されます。ロード済みとアンロード済みの両方のバッファが使用されます。CTRL-LまたはCTRL-P 次の一致する行を後方に検索します。この行は、以前の一致する行を置き換えます。
CTRL-N 次の一致する行を前方に検索します。この行は、以前の一致する行を置き換えます。
CTRL-X CTRL-L 行を展開した後、ダブルCTRL-Xが使用されない限り、CTRL-X CTRL-Lを再度入力して、その行の次の行をさらに取得できます。ロードされたバッファでのみ機能します。
現在のファイルのキーワードの補完 compl-current
i_CTRL-X_CTRL-P
i_CTRL-X_CTRL-N
CTRL-X CTRL-N カーソルの前のキーワードで始まる単語を前方に検索します。見つかったキーワードがカーソルの前に挿入されます。
CTRL-X CTRL-P カーソルの前のキーワードで始まる単語を後方に検索します。見つかったキーワードがカーソルの前に挿入されます。
CTRL-N 次の一致するキーワードを前方に検索します。このキーワードは、以前の一致するキーワードを置き換えます。
CTRL-P 次の一致するキーワードを後方に検索します。このキーワードは、以前の一致するキーワードを置き換えます。
CTRL-X CTRL-N または CTRL-X CTRL-P ダブルCTRL-Xが使用されない限り、CTRL-X CTRL-NまたはCTRL-X CTRL-Pをさらに使用すると、他のコンテキストで以前の展開に続く単語がコピーされます。
カーソルの前にキーワード(アルファベット文字と'iskeyword'の文字で構成される名前)がある場合は、"\<"(単語の先頭を意味する)が先頭に追加された検索パターンとして使用されます。それ以外の場合は、"\<\k\k"が検索パターンとして使用されます(少なくとも2文字の任意のキーワードの先頭)。
置換モードでは、置換される文字数は、一致した文字列の長さによって異なります。これは、一致した文字列の文字を置換モードで入力するようなものです。
カーソルの前に有効なキーワード文字がない場合、少なくとも2文字の任意のキーワードが一致します。たとえば、printf("(%g, %g, %g)", vector[0], vector[1], vector[2]);を取得するには、printf("(%g, %g, %g)", vector[0], ^P[1], ^P[2]);と入力するだけです。
検索はファイルの末尾で折り返されます。'wrapscan'の値はここでは使用されません。
同じ補完の複数回繰り返しはスキップされます。したがって、各CTRL-NCTRL-Pで異なる一致が挿入されます(一致するキーワードが1つしかない場合を除く)。
単一文字の一致は、通常は本当に探しているものの邪魔になるため、決して含まれません。たとえば、printf("name = %s\n", name);を取得するには、printf("name = %s\n", n^P);またはprintf("name = %s\n", ^P);と入力するだけです。'\n'の'n'はスキップされます。
単語を展開した後、CTRL-X CTRL-PまたはCTRL-X CTRL-Nを使用して、他のコンテキストで展開の後に続く単語を取得できます。これらのシーケンスは、展開されたテキストを検索し、単語を追加してさらに展開します。これは、複雑な単語のシーケンスを繰り返す必要がある場合に役立ちます。CTRL-PCTRL-Nは少なくとも2文字の文字列のみを検索しますが、CTRL-X CTRL-PとCTRL-X CTRL-Nを使用して、1文字だけの単語を展開できます。たとえば、M&eacute;xicoを取得するには、M^N^P^X^P^X^Pと入力できます。CTRL-Nは展開を開始し、次の2つのCTRL-X CTRL-Pは、単一文字の "M"を取り戻し、単語"&eacute"と";xico"を取得します。
前の展開が'textwidth'よりも長くなったために分割された場合、現在の行のテキストのみが使用されます。
見つかった一致が行の末尾にある場合、次の行の最初の単語が挿入され、この単語が受け入れられた場合、「他の行からの単語」というメッセージが表示され、次のCTRL-X CTRL-PまたはCTRL-X CTRL-Nは、この単語で始まる行を検索します。
'dictionary'のキーワードの補完 compl-dictionary
i_CTRL-X_CTRL-K
CTRL-X CTRL-K 'dictionary'オプションで指定されたファイルで、カーソルの前のキーワードで始まる単語を検索します。これはCTRL-Nに似ていますが、現在のファイルではなく、辞書ファイルのみが検索されます。見つかったキーワードがカーソルの前に挿入されます。最初の一致が使用される前にすべての一致が見つかるため、これは非常に遅くなる可能性があります。デフォルトでは、'dictionary'オプションは空です。単語リストを見つけるための提案については、'dictionary'オプションを参照してください。'ignorecase''smartcase''infercase'が適用されます。
CTRL-KまたはCTRL-N 次の一致するキーワードを前方に検索します。このキーワードは、以前の一致するキーワードを置き換えます。
CTRL-P 次の一致するキーワードを後方に検索します。このキーワードは、以前の一致するキーワードを置き換えます。
'thesaurus'の単語の補完 compl-thesaurus
i_CTRL-X_CTRL-T
CTRL-X CTRL-T CTRL-X CTRL-Kと同じように動作しますが、特別な方法で動作します。'dictionary'の代わりに'thesaurus'オプションを使用します。シソーラスファイルで一致が見つかった場合、単語を補完しなくても、同じ行の残りのすべての単語が一致として含まれます。したがって、単語を完全に置き換えることができます。
CTRL-TまたはCTRL-N 次の一致するキーワードを前方に検索します。このキーワードは、以前の一致するキーワードを置き換えます。
CTRL-P 次の一致するキーワードを後方に検索します。このキーワードは、以前の一致するキーワードを置き換えます。
'thesaurus'オプションで使用されるファイルでは、ファイルの各行に、類似の意味を持つ単語が、キーワード以外の文字(空白が推奨)で区切られて含まれている必要があります。最大行長は510バイトです。
例として、'thesaurus'ファイルに次のような行があるとします。
angry furious mad enraged
「ang」という文字の後にカーソルを置き、CTRL-X CTRL-Tを入力すると、「angry」という単語が補完されます。後続のキーを押すと、単語が「furious」、「mad」などに変更されます。
その他の用途には、2つの言語間の翻訳や、キーワードによるAPI関数のグループ化などがあります。
このgithub issueに英単語リストが追加されました: https://github.com/vim/vim/issues/629#issuecomment-443293282 thesaurus_pkg.zipを展開し、thesaurus.txtファイルをどこか(例:~/.vim/thesaurus/english.txt)に置き、'thesaurus'オプションをこのファイル名に設定してください。
‘thesaurusfunc’ によるキーワード補完 compl-thesaurusfunc
‘thesaurusfunc’ オプションが設定されている場合、ユーザー指定の関数が呼び出され、補完候補のリストを取得します。このとき、‘thesaurus’ オプションは使用されません。関数の呼び出し方と戻り値については、complete-functions を参照してください。
以下は、「aiksaurus」コマンド(Magnus Groß 提供)を使用する例です。
func Thesaur(findstart, base)
  if a:findstart
    return searchpos('\<', 'bnW', line('.'))[1] - 1
  endif
  let res = []
  let h = ''
  for l in systemlist('aiksaurus ' .. shellescape(a:base))
    if l[:3] == '=== '
      let h = '(' .. substitute(l[4:], ' =*$', ')', '')
    elseif l ==# 'Alphabetically similar known words are: '
      let h = "\U0001f52e"
    elseif l[0] =~ '\a' || (h ==# "\U0001f52e" && l[0] ==# "\t")
      call extend(res, map(split(substitute(l, '^\t', '', ''), ', '), {_, val -> {'word': val, 'menu': h}}))
    endif
  endfor
  return res
endfunc
if exists('+thesaurusfunc')
  set thesaurusfunc=Thesaur
endif
カレントファイルおよびインクルードファイル内のキーワード補完 compl-keyword
‘include’ オプションは、インクルードファイル名を含む行を指定するために使用されます。‘path’ オプションは、インクルードファイルを検索するために使用されます。
i_CTRL-X_CTRL-I
CTRL-X CTRL-I カーソルの前にある文字と同じ文字で始まる、カレントファイルおよびインクルードファイル内の最初のキーワードを検索します。一致したキーワードがカーソルの前に挿入されます。
CTRL-N 次の一致するキーワードを前方検索します。このキーワードは、以前一致したキーワードを置き換えます。注意: CTRL-I<Tab> と同じです。これは補完が成功した後にタイプされる可能性が高いため、CTRL-I は次の一致を検索するために使用されません。
CTRL-P 前の一致するキーワードを後方検索します。このキーワードは、以前一致したキーワードを置き換えます。
CTRL-X CTRL-I CTRL-X CTRL-I をさらに使用すると、ダブル CTRL-X を使用しない限り、前の展開に続く単語が他のコンテキストでコピーされます。
タグの補完 compl-tag
i_CTRL-X_CTRL-]
CTRL-X CTRL-] カーソルの前にある文字と同じ文字で始まる最初のタグを検索します。一致したタグがカーソルの前に挿入されます。タグ名にどの文字を含めるかを決定するために、アルファベット文字と ‘iskeyword’ 内の文字が使用されます(キーワードの場合と同じ)。CTRL-] も参照してください。‘showfulltag’ オプションを使用すると、タグ定義の周囲からコンテキストを追加できます。CTRL-] または CTRL-N 次の一致するタグを前方検索します。このタグは、以前一致したタグを置き換えます。
CTRL-P 前の一致するタグを後方検索します。このタグは、以前一致したタグを置き換えます。
ファイル名の補完 compl-filename
i_CTRL-X_CTRL-F
CTRL-X CTRL-F カーソルの前にある文字と同じ文字で始まる最初のファイル名を検索します。一致したファイル名がカーソルの前に挿入されます。ファイル名にどの文字を含めるかを決定するために、アルファベット文字と ‘isfname’ 内の文字が使用されます。注意: ‘path’ オプションはここでは(まだ)使用されません。CTRL-F または CTRL-N 次の一致するファイル名を前方検索します。このファイル名は、以前一致したファイル名を置き換えます。
CTRL-P 前の一致するファイル名を後方検索します。このファイル名は、以前一致したファイル名を置き換えます。
定義またはマクロの補完 compl-define
‘define’ オプションは、定義を含む行を指定するために使用されます。‘include’ オプションは、インクルードファイル名を含む行を指定するために使用されます。‘path’ オプションは、インクルードファイルを検索するために使用されます。
i_CTRL-X_CTRL-D
CTRL-X CTRL-D カーソルの前にある文字と同じ文字で始まる最初の定義(またはマクロ)名を、カレントファイルおよびインクルードファイルで検索します。見つかった定義名がカーソルの前に挿入されます。CTRL-D または CTRL-N 次の一致するマクロ名を前方検索します。このマクロ名は、以前一致したマクロ名を置き換えます。
CTRL-P 前の一致するマクロ名を後方検索します。このマクロ名は、以前一致したマクロ名を置き換えます。
CTRL-X CTRL-D CTRL-X CTRL-D をさらに使用すると、ダブル CTRL-X を使用しない限り、前の展開に続く単語が他のコンテキストでコピーされます。
Vim コマンドの補完 compl-vim
補完は状況依存です。コマンドラインと同じように動作します。Ex コマンドとその引数を補完します。これは Vim スクリプトを作成するときに役立ちます。
i_CTRL-X_CTRL-V
CTRL-X CTRL-V カーソルの前にある項目の種類を推測し、最初の一致を見つけます。注意: CTRL-V がマップされている場合、i_CTRL-Q の代わりに CTRL-Q を使用できることがよくあります。CTRL-V または CTRL-N 次の一致を前方検索します。この一致は、以前の一致を置き換えます。
CTRL-P 前の一致を後方検索します。この一致は、以前の一致を置き換えます。
CTRL-X CTRL-V CTRL-X CTRL-V をさらに使用すると、CTRL-V と同じ動作になります。これにより、Vim コマンドの補完を行うキーをマップできます。例:
:imap <Tab> <C-X><C-V>
ユーザー定義の補完 compl-function
補完は、‘completefunc’ オプションでユーザーが定義できる関数によって行われます。関数の呼び出し方と例については、以下の complete-functions を参照してください。
i_CTRL-X_CTRL-U
CTRL-X CTRL-U カーソルの前にある項目の種類を推測し、最初の一致を見つけます。CTRL-U または CTRL-N 次の一致を使用します。この一致は、以前の一致を置き換えます。
CTRL-P 前の一致を使用します。この一致は、以前の一致を置き換えます。
Omni 補完 compl-omni
補完は、‘omnifunc’ オプションでユーザーが定義できる関数によって行われます。これは、ファイルタイプ固有の補完に使用されます。
関数の呼び出し方と例については、以下の complete-functions を参照してください。特定のファイルタイプに関する注意については、compl-omni-filetypes を参照してください。補完スクリプトは今後追加される予定です。www.vim.org を確認してください。現在、C++ の最初のバージョンがあります。
i_CTRL-X_CTRL-O
CTRL-X CTRL-O カーソルの前にある項目の種類を推測し、最初の一致を見つけます。CTRL-O または CTRL-N 次の一致を使用します。この一致は、以前の一致を置き換えます。
CTRL-P 前の一致を使用します。この一致は、以前の一致を置き換えます。
スペル候補 compl-spelling
カーソルの前またはカーソル位置にある単語が特定され、正しくスペルされた単語がその置き換えとして提案されます。カーソル位置の前または下の行にスペルが間違っている単語がある場合は、カーソルがその後に移動されます。そうでない場合は、スペルが間違っていなくても、カーソルの直前の単語が提案に使用されます。
注意: 多くの Unix 端末では、CTRL-S が表示を中断します。代わりに「s」を使用してください。表示を再開するには、CTRL-Q を入力します。
i_CTRL-X_CTRL-S i_CTRL-X_s CTRL-X CTRL-S または CTRL-X s カーソルの前にある単語を特定し、それに対する最初のスペル候補を見つけます。CTRL-S または CTRL-N 次の候補を使用します。これにより、以前の候補が置き換えられます。ここでは「s」を使用できないことに注意してください。
CTRL-P 前の候補を使用します。これにより、以前の候補が置き換えられます。
さまざまなソースからのキーワード補完 compl-generic
i_CTRL-N
CTRL-N カーソルの前にあるキーワードで始まる単語の次の一致を、‘complete’ オプションで指定された場所で検索します。見つかったキーワードがカーソルの前に挿入されます。
i_CTRL-P
CTRL-P カーソルの前にあるキーワードで始まる単語の前の候補を、‘complete’ オプションで指定された場所で検索します。見つかったキーワードがカーソルの前に挿入されます。
CTRL-N 次の一致するキーワードを前方に検索します。このキーワードは、以前の一致するキーワードを置き換えます。
CTRL-P 次の一致するキーワードを後方に検索します。このキーワードは、以前の一致するキーワードを置き換えます。
CTRL-X CTRL-N または CTRL-X CTRL-P ダブルCTRL-Xが使用されない限り、CTRL-X CTRL-NまたはCTRL-X CTRL-Pをさらに使用すると、他のコンテキストで以前の展開に続く単語がコピーされます。
補完の停止 compl-stop
i_CTRL-X_CTRL-Z
CTRL-X CTRL-Z テキストを変更せずに補完を停止します。

自動補完 compl-autocomplete

プラグインをインストールせずに基本的な「自動補完」を行うには、次のスクリプトを試してください。
local triggers = {"."}
vim.api.nvim_create_autocmd("InsertCharPre", {
  buffer = vim.api.nvim_get_current_buf(),
  callback = function()
    if vim.fn.pumvisible() == 1 or vim.fn.state("m") == "m" then
      return
    end
    local char = vim.v.char
    if vim.list_contains(triggers, char) then
      local key = vim.keycode("<C-x><C-n>")
      vim.api.nvim_feedkeys(key, "m", false)
    end
  end
})

補完候補を見つけるための関数 complete-functions

これは、‘completefunc’‘thesaurusfunc’、および ‘omnifunc’ に適用されます。
関数は 2 つの異なる方法で呼び出されます。
最初に、補完されるテキストの開始位置を見つけるために関数が呼び出されます。
次に、実際の一致を見つけるために関数が呼び出されます。
最初の呼び出しでは、引数は次のとおりです。a:findstart 1 a:base 空
関数は、補完が開始される列を返す必要があります。これは、ゼロからカーソル列「col('.')」までの数値である必要があります。これには、カーソルの直前にある文字を見て、補完される項目の一部である可能性がある文字を含める必要があります。この列とカーソル列の間にあるテキストは、一致するものに置き換えられます。返された値がカーソル列より大きい場合、カーソル列が使用されます。
負の戻り値: -2 警告なしでキャンセルし、補完モードを維持します。-3 警告なしでキャンセルし、補完モードを終了します。別の負の値: 補完がカーソル列で開始されます。
2 回目の呼び出しでは、引数は次のとおりです。a:findstart 0 a:base 一致させる必要があるテキスト。最初の呼び出しで見つかったテキスト(空の場合もあります)。
関数は、一致する単語のリストを返す必要があります。これらの候補には通常、「a:base」テキストが含まれます。一致するものがない場合は、空のリストを返します。カーソルは最初の呼び出しから移動している場合があり、テキストが変更されている場合があることに注意してください。
一致する単語以外の情報を返すには、リストを含む辞書を返します。辞書には次の項目を含めることができます。words 一致する単語のリスト(必須)。refresh 関数の再呼び出しを制御するための文字列(オプション)。現在認識されている唯一の値は「always」です。効果は、先頭のテキストが変更されるたびに関数が呼び出されることです。他の項目は無視されます。
補完の終了時の動作については、CompleteDonePre および CompleteDone の自動コマンドイベントを参照してください。
たとえば、関数には次を含めることができます。
let matches = ... list of words ...
return {'words': matches, 'refresh': 'always'}
complete-items
各リスト項目は、文字列または辞書型のいずれかです。文字列の場合、それは補完として使用されます。辞書型の場合、次の項目を含めることができます: word 挿入されるテキスト、mandatory abbr "word" の省略形;空でない場合は、"word" の代わりにメニューで使用されます menu ポップアップメニューの追加テキスト、"word" または "abbr" の後に表示されます info 項目の詳細情報、プレビューウィンドウに表示できます kind 補完の種類を示す1文字 icase ゼロ以外の場合、項目を比較して等しいかどうかを判断する際に大文字と小文字を無視します。省略した場合、ゼロが使用されるため、大文字と小文字だけが異なる項目は等しいとみなされます equal ゼロ以外の場合、常にこの項目を比較時に等しいとみなします。つまり、"equal=1" はこの項目のフィルタリングを無効にします。dup ゼロ以外の場合、同じ単語を持つ項目がすでに存在する場合でも、この一致が追加されます。empty ゼロ以外の場合、空の文字列である場合でも、この一致が追加されます user_data 項目に関連付けられ、v:completed_item で使用できるカスタムデータ。任意の型にできます。デフォルトは空の文字列です abbr_hlgroup hl-PmenuSel および hl-Pmenu または hl-PmenuMatchSel および hl-PmenuMatch のハイライト属性と組み合わされる追加のハイライトグループ。ポップアップメニューでストライクスルーなどのctermおよびguiプロパティ(優先度が高い)を補完項目に適用します。 abbreviation kind_hlgroup 補完の種類をハイライトする属性を特別に設定するための追加のハイライトグループ。このフィールドが存在する場合、hl-PmenuKind ハイライトグループをオーバーライドし、補完の種類のctermfgおよびguifgプロパティをカスタマイズできます。
"icase"、"equal"、"dup"、および "empty" を除くすべては文字列である必要があります。項目がこれらの要件を満たさない場合、エラーメッセージが表示され、リスト内のそれ以降の項目は使用されません。返されるリストには、文字列項目と辞書型項目を混在させることができます。
"menu" 項目はポップアップメニューで使用され、切り捨てられる可能性があるため、比較的短くする必要があります。"info" 項目は長くてもかまいません。'completeopt' に "preview" が含まれている場合、プレビューウィンドウに表示されます。"info" 項目は、ポップアップメニューが削除された後も表示されたままになります。これは関数の引数に便利です。"info" に単一のスペースを使用すると、プレビューウィンドウに表示されていたテキストを削除できます。プレビューウィンドウのサイズは3行ですが、'previewheight' の値が1または2の場合、それが使用されます。
"kind" 項目は、補完の種類を示す1文字を使用します。これにより、補完を異なる方法(異なる色またはアイコン)で表示できます。現在、次の型を使用できます: v 変数 f 関数またはメソッド m 構造体またはクラスのメンバー t typedef d #define またはマクロ
一致を検索するのに時間がかかる場合は、complete_add() を呼び出して、一致する項目をリストに追加してください。これらの項目は、返されるリストに表示されないようにする必要があります。complete_check() を時々呼び出して、一致を検索中にユーザーがキーを押せるようにします。ゼロ以外の値が返された場合、検索を停止します。
E840
関数はカーソルを移動できますが、後で復元されます。関数は別のウィンドウに移動したり、テキストを削除したりすることはできません。
月の名前を補完する例
fun! CompleteMonths(findstart, base)
  if a:findstart
    " locate the start of the word
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\a'
      let start -= 1
    endwhile
    return start
  else
    " find months matching with "a:base"
    let res = []
    for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
      if m =~ '^' .. a:base
        call add(res, m)
      endif
    endfor
    return res
  endif
endfun
set completefunc=CompleteMonths
同じ例ですが、今度は一致の検索が遅いと仮定します
fun! CompleteMonths(findstart, base)
  if a:findstart
    " locate the start of the word
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\a'
      let start -= 1
    endwhile
    return start
  else
    " find months matching with "a:base"
    for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
      if m =~ '^' .. a:base
        call complete_add(m)
      endif
      sleep 300m        " simulate searching for next match
      if complete_check()
        break
      endif
    endfor
    return []
  endif
endfun
set completefunc=CompleteMonths

挿入補完ポップアップメニュー ins-completion-menu

popupmenu-completion
Vim は単純なポップアップメニューに一致を表示できます。
メニューは、次の状況で使用されます。
'completeopt' オプションに "menu" または "menuone" が含まれている場合。
ターミナルが少なくとも8色をサポートしている場合。
少なくとも2つの一致がある場合。"menuone" を使用する場合は1つです。
'pumheight' オプションを使用して、最大の高さを設定できます。デフォルトでは、利用可能なすべてのスペースが使用されます。'pumwidth' オプションを使用して、最小幅を設定できます。デフォルトは15文字です。
状態は3つあります: 1. 完全一致が挿入された状態(例: CTRL-N または CTRL-P を使用した後)。2. カーソルキーを使用して別の一致を選択した状態。一致は挿入されておらず、ポップアップメニューのエントリが強調表示されているだけです。3. 一致の一部のみが挿入され、文字が入力されたか、バックスペースキーが使用された状態。一致のリストは、カーソルの前にある内容に合わせて調整されました。
通常は、最初の状態から開始し、最初の一致が挿入されます。'completeopt' に "longest" が含まれていて、複数の一致がある場合は、3番目の状態から開始します。
CTRL-NCTRL-P などを使用して別の一致を選択すると、最初の状態に移行します。これにより、一致のリストは変更されません。
元のテキストに戻ると、3番目の状態になります。すぐにそこに戻るには、補完の開始直後に CTRL-P を使用するマッピングを使用できます。
:imap <F7> <C-N><C-P>
popupmenu-keys
最初の状態では、これらのキーには特別な意味があります: <BS> および CTRL-H カーソルの前にある単語の1文字を削除し、一致を検索します。これにより、一致のリストが減少し、多くの場合1つのエントリになり、2番目の状態に切り替わります。特殊文字以外の文字: 一致を変更せずに補完を停止し、入力した文字を挿入します。
2番目と3番目の状態では、これらのキーには特別な意味があります: <BS> および CTRL-H カーソルの前にある短い単語の1文字を削除し、一致を検索します。これにより、より多くの一致が見つかる可能性があります。CTRL-L 現在の一致から1文字追加し、一致の数を減らす可能性があります。印刷可能な非空白文字: この文字を追加し、一致の数を減らします。
3つのすべての状態では、これらを使用できます: CTRL-Y はい: 現在選択されている一致を受け入れて補完を停止します。CTRL-E 補完を終了し、一致を選択する前の状態(入力された内容または最長の共通文字列)に戻ります。<PageUp> 数個前の一致を選択しますが、挿入しません。<PageDown> 数個後の一致を選択しますが、挿入しません。<Up> CTRL-P が使用されたかのように、前の一致を選択しますが、挿入しません。<Down> CTRL-N が使用されたかのように、次の一致を選択しますが、挿入しません。<Space> または <Tab> 一致を変更せずに補完を停止し、入力した文字を挿入します。
<Enter> キーの動作は、現在の状態によって異なります: 最初の状態: テキストをそのまま使用して改行を挿入します。2番目の状態: 現在選択されている一致を挿入します。3番目の状態: テキストをそのまま使用して改行を挿入します。
言い換えれば、カーソルキーを使用して一致のリストから別のエントリを選択した場合、<Enter> キーはその一致を挿入します。別の文字を入力した場合、<Enter> は改行を挿入します。
メニューの色は、次のハイライトグループで変更できます: Pmenu 通常の項目 hl-Pmenu PmenuSel 選択された項目 hl-PmenuSel PmenuSbar スクロールバー hl-PmenuSbar PmenuThumb スクロールバーのつまみ hl-PmenuThumb
ポップアップメニューが表示されている場合、特別なマッピングはありません。ただし、pumvisible() 関数をチェックする挿入モードマッピングを使用して、異なる動作をさせることができます。例:
:inoremap <Down> <C-R>=pumvisible() ? "\<lt>C-N>" : "\<lt>Down>"<CR>
マッピングで <expr> を使用して、文字を入力したとき、および特定の条件が満たされたときにポップアップメニューを使用できます。たとえば、ドットを入力する場合:
inoremap <expr> . MayComplete()
func MayComplete()
    if (can complete)
      return ".\<C-X>\<C-O>"
    endif
    return '.'
endfunc
詳細については、:map-<expr> を参照してください。

オムニ補完のファイルタイプ固有の注意点 compl-omni-filetypes

{filetype} に使用されるファイルは、'runtimepath' の autoload/{filetype}complete.vim である必要があります。したがって、「java」の場合、autoload/javacomplete.vim になります。
Cコードの補完には、tagsファイルが必要です。補完に必要な追加情報が追加されるため、Universal/Exuberant ctagsを使用する必要があります。次の場所で確認できます: Universal Ctags: https://ctags.io
Universal Ctagsが推奨され、Exuberant Ctagsは保守されていません。
システム関数を補完する場合は、次のようにします。ctagsを使用して、すべてのシステムヘッダーファイルのtagsファイルを生成します。
% ctags -R -f ~/.config/nvim/systags /usr/include /usr/local/include
vimrcファイルで、このtagsファイルを 'tags' オプションに追加します。
set tags+=~/.config/nvim/systags
CTRL-X CTRL-O を「.」や「->」を含まない名前の後で使用すると、tagsファイルから直接補完されます。これは、識別子(関数名を含む)に有効です。tagsファイルに表示されないローカル変数名を補完する場合は、代わりに CTRL-P を使用します。
「.」または「->」を含むものの後に CTRL-X CTRL-O を使用すると、Vimは変数の型を認識し、そのメンバーを特定しようとします。つまり、変数に有効なメンバーのみがリストされます。
メンバー名がすでに補完されている場合、CTRL-X CTRL-O は複合型に「.」または「->」を追加します。
VimにはCコンパイラーが含まれていないため、最も明白にフォーマットされた宣言のみが認識されます。プリプロセッサ関連のものは混乱を引き起こす可能性があります。同じ構造体名が複数の場所にある場合、可能なすべてのメンバーが含まれます。
CSS 2.1 仕様に従って、プロパティとその適切な値を補完します。
CTRL-X CTRL-O は、(X)HTMLファイルのさまざまな要素の補完を提供します。XHTML 1.0 Strictファイルの作成をサポートするように設計されていますが、他のバージョンのHTMLでも機能します。機能:
"<" の後、コンテキストに応じてタグ名を補完します(aタグ内のdivは提案されません)。「/>」は空のタグを示します。
タグ内では、適切な属性を補完します(aタグにwidth属性はありません)。属性の型も表示します。「*」は必須の属性を示します。
属性に可能な値の数が限られている場合は、それらの補完を支援します。
エンティティの名前を補完します。
<style> タグと含まれているCSSファイルから取得したデータを使用して、"class" および "id" 属性の値を補完します。
"style" 属性の値を補完している場合、または "style" タグ内で作業している場合は、ft-css-omni 補完に切り替えます。
イベント属性の値を補完している場合、または "script" タグ内で作業している場合は、ft-javascript-omni 補完に切り替えます。
"</" の後で使用した場合、CTRL-X CTRL-O は最後に開いたタグを閉じます。
注意: 初めて使用する場合、補完メニューが表示されるまでに少し時間がかかります。
これは、データファイルの読み込みに必要な時間です。注意: フォーマットが不適切なドキュメントでは、補完が失敗する可能性があります。その場合は、:make コマンドを実行して、フォーマットの問題を検出してみてください。
HTMLフレーバー html-flavor
デフォルトのHTML補完はファイルタイプに依存します。HTMLファイルの場合はHTML 4.01 Transitional('filetype' は "html")、XHTMLの場合はXHTML 1.0 Strict('filetype' は "xhtml")です。
他のタグの外で補完を行う場合、DOCTYPEを選択するオプションがあり、適切なデータファイルがロードされ、それ以降のすべての補完に使用されます。
データファイルの形式に関する詳細は、xml-omni-datafile を参照してください。一部のデータファイルはVimのウェブサイト(www)で見つけることができます。
b:html_omni_flavor は任意のXMLデータを持つファイルを指すことができることに注意してください。これにより、PHP(ft-php-omni)の補完を任意のXML方言と組み合わせて使用できます(そのためのデータファイルがある場合)。この変数を設定しない場合、XHTML 1.0 Strictが使用されます。
JavaScript言語のほとんどの要素とDOM要素の補完。
補完対象
変数
関数名;関数の引数を表示
関数の引数
変数の型を検出して、変数のプロパティを補完
コンテキストに応じてDOMオブジェクトとプロパティを補完
言語のキーワード
補完は、独立したJavaScriptファイル(&ft==javascript)、(X)HTMLの<script>タグ内、およびイベント属性の値(外部ファイルの解析を含む)で機能します。
DOM互換性
現在(2006年初頭)には、主に2つのブラウザ、MS Internet ExplorerとMozilla Firefoxがあります。これら2つのアプリケーションは、市場の90%以上をカバーしています。理論的には、標準はW3C組織(https://www.w3.org/)によって作成されていますが、必ずしも常に遵守/実装されているわけではありません。
IE        FF        W3C  Omni completion ~
+/-        +/-        +    +                     ~
+        +        -    +                     ~
+        -        -    -                     ~
-        +        -    -                     ~
ブラウザの実装状態に関わらず、要素が標準で定義されている場合、補完プラグインは提案リストに要素を配置します。主要な2つのエンジンが要素を実装している場合、たとえ標準に準拠していなくても提案されます。その他の要素は提案リストに表示されません。
PHPコードの補完には、外部ファイルからのデータとクラスを認識した補完のためのタグファイルが必要です。Universal/Exuberant ctags バージョン5.5.4以降を使用する必要があります。これはこちらにあります
Universal Ctags: https://ctags.io
スクリプトは以下を補完します
変数の後の $ 変数名
変数がオブジェクトとして宣言されている場合は "->" を追加します。タグファイルが利用可能な場合は、クラスの名前を表示します
"->" の後には、指定されたクラスに固有の関数と変数名のみを補完します。クラスの場所と内容を見つけるには、タグファイルが必要です。PHPは厳密に型付けされた言語ではないため、ユーザーは @var タグを使用してクラスを宣言できます。
/* @var $myVar myClass */
$myVar->
それでも、myClassの内容を見つけるにはタグファイルが必要です。
追加情報付きの関数名
組み込み関数の場合は、可能な引数のリストと、関数が返すデータの型 ( | の後)
ユーザー関数の場合は、引数と関数が定義されているファイルの名前(現在のファイルでない場合)
定数名
"new" 宣言後のクラス名
注:初めて補完を行う際、Vimは必要なすべてのデータをメモリにロードします。これには数秒かかる場合があります。次回以降の補完では、遅延は目立たなくなるはずです。
スクリプトは、カーソルが <?php ?> タグ内にあるかどうかを検出します。タグの外にある場合は、自動的にHTML/CSS/JavaScript補完に切り替わります。注:元のHTMLファイルのタグ補完とは異なり、タグ(およびタグのみ)の補完はコンテキストを認識しません。
注:Rubyコードのcompl-omniには、provider-ruby がインストールされている必要があります。
Rubyの補完は、補完リストを提供するために必要に応じてバッファを解析します。これらの補完は、"require" でロードされたモジュールと現在のバッファで定義されたモジュールから取得されます。
CTRL-X CTRL-O によって提供される補完は、コンテキストに依存します。
提供されるコンテキスト補完
1. クラス定義の内側ではない場合:クラス、定数、グローバル変数
2. クラス定義の内側:クラスで定義されたメソッドまたは定数
3. '.'、'::'、または ':' の後:逆参照されるオブジェクトに適用可能なメソッド
4. ':' または ':foo' の後:シンボル名("foo" で始まる)
Vimは、補完を提供するためにコードをロード/評価します。これにより、コードが実行される可能性があり、懸念事項になる可能性があります。これはデフォルトでは有効になっていません。この機能を有効にするには、以下を追加してください
let g:rubycomplete_buffer_loading = 1
<- 上記のコンテキスト1では、Vimはバッファ全体を解析して、補完結果にクラスのリストを追加できます。この機能はデフォルトでオフになっています。有効にするには、以下を追加してください
let g:rubycomplete_classes_in_global = 1
vimrcに
上記のコンテキスト2では、匿名クラスはサポートされていません。
上記のコンテキスト3では、Vimはオブジェクトでサポートされているメソッドを判別しようとします。
Vimは、Railsプロジェクト内のファイルのRails環境を検出してロードできます。この機能はデフォルトでは無効になっています。有効にするには、以下を追加してください
let g:rubycomplete_rails = 1
vimrcに
Vimは、約500の言語の構文を色分けして強調表示する機能を備えています。この強調表示の一部には、言語の一部であるキーワードを知ることが含まれています。多くのファイルタイプには、すでにカスタムの補完スクリプトが作成されていますが、syntaxcompleteプラグインは、他のすべてのファイルタイプに対して基本的な補完を提供します。これは、Vimがすでに色分けの強調表示方法を知っているテキストでオムニ補完リストを設定することによって行われます。これはどのファイルタイプでも使用でき、最小限の言語認識型補完を提供します。
構文コード補完を有効にするには、次を実行します。
setlocal omnifunc=syntaxcomplete#Complete
これを自動化するには、init.vim(":filetype" コマンドの後)に次のように記述します。
if has("autocmd") && exists("+omnifunc")
    autocmd Filetype *
                \        if &omnifunc == "" |
                \                setlocal omnifunc=syntaxcomplete#Complete |
                \        endif
endif
上記は、特定のプラグインがそのファイルタイプにまだ存在しない場合にのみ、補完をこのスクリプトに設定します。
各ファイルタイプには、さまざまな構文項目を含めることができます。このプラグインでは、リストに含めるまたは除外する構文グループをカスタマイズできます。PHPファイルタイプを見て、これがどのように機能するかを見てみましょう。
index.phpというファイルを編集する場合、次のコマンドを実行します
syntax list
最初に気付くことは、さまざまな構文グループがあるということです。PHP言語には、HTML、JavaScriptなど、さまざまな言語の要素を含めることができます。構文プラグインは、この場合、ファイルタイプである「php」で始まる構文グループのみを含めます。たとえば、これらの構文グループは、PHPでデフォルトで含まれています。phpEnvVar、phpIntVar、phpFunctions。
ファイルタイプ以外の構文項目も含める場合は、正規表現構文(autoload/syntaxcomplete.vimのバージョン13.0で追加)を使用して項目を追加できます。PHPファイルを編集しているときに「:syntax list」の出力を調べると、これらのエントリの一部が表示されます。
htmlArg,htmlTag,htmlTagName,javaScriptStatement,javaScriptGlobalObjects
PHPファイルを編集中にJavaScriptとHTMLのキーワード構文グループを取得するには、各言語に対して3つの異なる正規表現を使用できます。または、正規表現文字列を使用せずに、含めるグループを特定の値に制限することもできます。
let g:omni_syntax_group_include_php = 'php\w\+,javaScript\w\+,html\w\+'
let g:omni_syntax_group_include_php = 'phpFunctions,phpMethods'
この変数の基本的な形式は次のとおりです。
let g:omni_syntax_group_include_{filetype} = 'regex,comma,separated'
PHP言語には、構文を強調表示する方法を知っている膨大な数の項目があります。これらの項目は、オムニ補完リスト内で利用可能になります。
一部の人はこのリストが扱いにくいと感じたり、特定の項目にのみ関心がある場合があります。このリストを(必要に応じて)削除する方法は2つあります。表示したくない特定の構文グループが見つかった場合は、これらグループを識別する2つの異なる方法を使用できます。1つ目は、構文グループを名前で具体的にリストします。2つ目は、正規表現を使用して両方の構文グループを識別します。次のいずれかをvimrcに追加するだけです。
let g:omni_syntax_group_exclude_php = 'phpCoreConstant,phpConstant'
let g:omni_syntax_group_exclude_php = 'php\w*Constant'
カンマで区切って、このリストに構文グループを必要に応じて追加します。この変数の基本的な形式は次のとおりです。
let g:omni_syntax_group_exclude_{filetype} = 'regex,comma,separated'
これらの変数は必要なだけ作成でき、変数名の末尾のファイルタイプのみが異なります。
プラグインは、isKeywordオプションを使用して、構文項目の単語の境界を決定します。たとえば、Scheme言語では、補完には、"-"、call-with-output-fileが含まれている必要があります。ファイルタイプによっては、これが期待どおりの単語を提供しない場合があります。g:omni_syntax_use_iskeywordオプションを0に設定すると、構文プラグインは単語文字で分割されます。これは、vimrcに以下を追加することで制御できます。
let g:omni_syntax_use_iskeyword = 0
プラグイン開発者向けに、プラグインはパブリック関数OmniSyntaxListを公開しています。この関数を使用して、構文項目のリストを要求できます。SQLファイル(:e syntax.sql)を編集しているときは、":syntax list"コマンドを使用して、さまざまなグループと構文項目を確認できます。たとえば
syntax list
次のようなデータが生成されます。
sqlOperator xxx some prior all like and any escape exists in is not
or intersect minus between distinct
Operatorへのリンク
sqlType xxx varbit varchar nvarchar bigint int uniqueidentifier
date money long tinyint unsigned xml text smalldate
double datetime nchar smallint numeric time bit char
varbinary binary smallmoney
image float integer timestamp real decimal
ここにリストされている構文グループは2つあります。sqlOperatorとsqlTypeです。構文項目のリストを取得するには、OmniSyntaxListをさまざまな方法で呼び出すことができます。構文グループに関係なく、すべての構文項目を取得するには
echo OmniSyntaxList( [] )
sqlOperator構文グループの構文項目のみを取得するには
echo OmniSyntaxList( ['sqlOperator'] )
sqlOperatorグループとsqlTypeグループの両方のすべての構文項目を取得するには
echo OmniSyntaxList( ['sqlOperator', 'sqlType'] )
正規表現も使用できます
echo OmniSyntaxList( ['sql\w\+'] )
プラグイン内から、通常、出力をリストに割り当てます。
let myKeywords = []
let myKeywords = OmniSyntaxList( ['sqlKeyword'] )

SQL ft-sql-omni

SQL言語の補完には、ステートメント、関数、キーワードが含まれます。また、データベース内から直接取得したデータを使用して、テーブル、プロシージャ、ビュー、および列リストを動的に補完します。詳細な手順とチュートリアルについては、omni-sql-completion を参照してください。
SQL補完プラグインは、他の補完プラグインと組み合わせて使用できます。たとえば、PHPファイルタイプには独自の補完プラグインがあります。PHPはデータベースにアクセスして動的なWebサイトを生成するために使用されることが多いため、SQL補完プラグインも有効にできます。これにより、PHPコードとSQLコードを同時に補完できます。
Vim 7 は、XMLファイルのコンテキストに応じた補完機能を提供します。これは特別な xml-omni-datafile と、:XMLns および :XMLent の2つのコマンドに依存します。機能は以下のとおりです。
"<" の後に、コンテキストに応じてタグ名を補完する
タグ内で、適切な属性を補完する
属性が限られた数の値しか持たない場合、それらの値を補完するのを手助けする
エンティティの名前を補完する(xml-omni-datafile および現在のファイル内の "<!ENTITY" 宣言で定義されたもの)
"</" の後で使用した場合、CTRL-X CTRL-O は最後に開いたタグを閉じます。
XMLデータファイルの形式 xml-omni-datafile
XMLデータファイルは、'runtimepath' 内の "autoload/xml" ディレクトリに格納されます。Vimディストリビューションは、"$VIMRUNTIME/autoload/xml" ディレクトリにデータファイルの例を提供しています。それらは、コマンドで使用される意味のある名前を持っています。これは、競合を引き起こさない一意の名前である必要があります。たとえば、xhtml10s.vim という名前は、XHTML 1.0 Strict のデータファイルであることを意味します。
各ファイルには、g:xmldata_xhtml10s のような名前の変数が含まれています。これは、2つの部分からなる複合変数です。
1. "g:xmldata_" は、すべてのデータファイルに共通の一般的なプレフィックスです。2. "xhtml10s" は、ファイルの名前であり、記述されたXML方言の名前です。これは :XMLns コマンドの引数として使用されます。
2番目の部分は、ファイルの名前と完全に同じである必要があります。
変数は Dictionary です。キーはタグ名であり、各値は2つの要素を持つ List です。List の最初の要素は、可能な子要素の名前を持つ List です。2番目の要素は、属性の名前をキーとし、属性の可能な値を値とする Dictionary です。例:
let g:xmldata_crippled = {
\ "vimxmlentities": ["amp", "lt", "gt", "apos", "quot"],
\ 'vimxmlroot': ['tag1'],
\ 'tag1':
\ [ ['childoftag1a', 'childoftag1b'], {'attroftag1a': [],
\ 'attroftag1b': ['valueofattr1', 'valueofattr2']}],
\ 'childoftag1a':
\ [ [], {'attrofchild': ['attrofchild']}],
\ 'childoftag1b':
\ [ ['childoftag1a'], {'attrofchild': []}],
\ "vimxmltaginfo": {
\ 'tag1': ['Menu info', 'Long information visible in preview window']},
\ 'vimxmlattrinfo': {
\ 'attrofchild': ['Menu info', 'Long information visible in preview window']}}
この例は "autoload/xml/crippled.vim" ファイルに置かれ、このファイルの作成を支援できます。
<tag1 attroftag1b="valueofattr1">
    <childoftag1a attrofchild>
            &amp; &lt;
    </childoftag1a>
    <childoftag1b attrofchild="5">
        <childoftag1a>
            &gt; &apos; &quot;
        </childoftag1a>
    </childoftag1b>
</tag1>
この例では、4つの特別な要素が表示されています。
1. "vimxmlentities" - このXML方言のエンティティを含む List を持つ特別なキー。2. 属性の可能な値を含むリストに1つの要素しかなく、その要素が属性の名前と同じである場合、この属性はブール値として扱われ、'attrname="'ではなく "attrname" として挿入されます。3. "vimxmltaginfo" - タグ名をキーとし、追加のメニュー情報と長い説明のための2要素の List を値とする Dictionary を持つ特別なキー。4. "vimxmlattrinfo" - 属性名をキーとし、追加のメニュー情報と長い説明のための2要素の List を値とする Dictionary を持つ特別なキー。
注:データファイル内のタグ名には、名前空間記述を含めてはなりません。例については xsl.vim を確認してください。注:すべてのデータと関数は、グローバル変数/関数として公開されており、個人的な編集機能に使用できます。
DTD -> Vim dtd2vim
www 上に、DTDを解析し、Vim XMLオムニ補完用のXMLデータファイルを作成するスクリプト dtd2vim があります。
使用方法の詳細については、ファイルの冒頭を確認してください。このスクリプトには perl と
コマンド
:XMLns {name} [{namespace}] :XMLns
Vim は、どのデータファイルを使用し、どの名前空間を使用するかを知る必要があります。データファイルをロードし、データを適切な名前空間に関連付けるには、:XMLns コマンドを使用します。最初の(必須の)引数は、データの名前(xhtml10s、xsl)です。2番目の引数は、名前空間のコード(h、xsl)です。2番目の引数なしで使用すると、方言はデフォルトとして使用されます - 名前空間宣言なし。たとえば、.xsl ファイルで XML 補完を使用するには
:XMLns xhtml10s
:XMLns xsl xsl
:XMLent {name} :XMLent
デフォルトでは、エンティティはデフォルトの名前空間のデータファイルから補完されます。デフォルトの名前空間がない場合は、XMLent コマンドを使用する必要があります。
:XMLent xhtml10s
使用方法
この状況で使用する場合(前の部分の宣言後、| はカーソル位置)
<|
適切な XHTML タグに補完され、この状況では
<xsl:|
適切な XSL タグに補完されます。
autoload メカニズムを介して提供されるスクリプト xmlcomplete.vim には、XML ファイルで最後に開いたタグの名前を取得するために使用できる関数 xmlcomplete#GetLastOpenTag() があります(b:unaryTagsStack を定義する必要があります)。
:echo xmlcomplete#GetLastOpenTag("b:unaryTagsStack")

8. 挿入モードコマンド inserting

以下のコマンドを使用して、バッファに新しいテキストを挿入できます。これらはすべてアンドゥでき、"." コマンドで繰り返すことができます。
a
a カーソルの後にテキストを [count] 回追加します。カーソルが空の行の最初の列にある場合、挿入はそこから開始されます。ただし、'virtualedit' が設定されている場合は除きます!
A
A 行の最後にテキストを [count] 回追加します。ビジュアルブロックモードで "A" を使用するには、v_b_A を参照してください。
<insert> または i insert <Insert> i カーソルの前にテキストを [count] 回挿入します。挿入モードで CTRL-O を使用する場合、i_CTRL-O では count はサポートされていません。
I
I 行の最初の空白以外の文字の前にテキストを [count] 回挿入します。'cpoptions' に 'H' フラグが存在し、行に空白のみが含まれている場合、挿入は最後の空白の直前に開始されます。ビジュアルブロックモードで "I" を使用するには、v_b_I を参照してください。
gI
gI 1 列にテキストを [count] 回挿入します。
gi
gi 現在のバッファで挿入モードが最後に停止したときと同じ位置にテキストを挿入します。これは '^ マークを使用します。マークが行の末尾を過ぎている場合、"`^i" とは異なります。位置は挿入/削除された行に対して修正されますが、挿入/削除された文字に対しては修正されません。:keepjumps コマンド修飾子が使用されている場合、'^ マークは変更されません。
o
o カーソルの下に新しい行を開始し、テキストを挿入し、[count] 回繰り返します。
O
O カーソルの上に新しい行を開始し、テキストを挿入し、[count] 回繰り返します。
これらのコマンドは、テキストの挿入を開始するために使用されます。<Esc> で挿入モードを終了できます。挿入モードの他の特殊文字については、mode-ins-repl を参照してください。[count] の効果は、挿入モードが終了した後に発生します。
'autoindent' がオンの場合、新しい行のインデントは前の行から取得されます。'smartindent' または 'cindent' がオンの場合、C プログラムの行のインデントは自動的に調整されます。
'formatoptions' を設定して、新しい行を開くときにコメントリーダーをコピーできます。
'textwidth' を行の最大幅に設定できます。文字を追加するときに行が長くなりすぎると、自動的に改行が挿入されます。

9. Ex 挿入コマンド inserting-ex

:a :append :{range}a[ppend][!] 指定された行の下に複数のテキスト行を挿入します。{range} がない場合、テキストは現在の行の後ろに挿入されます。[!] を追加すると、このコマンドが実行されている間、'autoindent' が切り替わります。
:i :in :insert :{range}i[nsert][!] 指定された行の上に複数のテキスト行を挿入します。{range} がない場合、テキストは現在の行の前に挿入されます。[!] を追加すると、このコマンドが実行されている間、'autoindent' が切り替わります。
これらの2つのコマンドは、"." のみを含む行を入力するまで、行を求め続けます。バックスラッシュで始まる行に注意してください。 line-continuation を参照してください。
"|" コマンド区切り文字の後にタイプされたテキストが最初に使用されます。したがって、ex モードの次のコマンドは
:a|one
two
.
:visual
カーソル行の後ろに次のテキストを追加します
one
two
注:これらのコマンドは、:global または :vglobal と共に使用することはできません。":append" および ":insert" は、":if" と ":endif"、":for" と ":endfor"、":while" と ":endwhile" の間では正しく機能しません。
:start :startinsert :star[tinsert][!] このコマンドを実行した直後に挿入モード(または ターミナルモードターミナルバッファ内))を開始します。ノーマルモードで "i" を入力するのと同じように機能します。! が含まれている場合は、行に追加する "A" のように機能します。それ以外の場合、挿入はカーソル位置から開始されます。このコマンドを関数またはスクリプトで使用する場合、挿入は関数またはスクリプトが完了した後にのみ開始されることに注意してください。このコマンドは :normal からは機能しません。
:stopi :stopinsert :stopi[nsert] できるだけ早く挿入モードまたは ターミナルモード を停止します。挿入モードで <Esc> を入力するのと同じように機能します。オートコマンドで使用できます。例:
:au BufEnter scratch stopinsert
replacing-ex :startreplace :startr[eplace][!] このコマンドを実行した直後に置換モードを開始します。ノーマルモードで「R」と入力するのと同様に動作します。「!」が含まれている場合は、「$R」と入力した場合と同様に動作します(つまり、行末で置換モードを開始します)。それ以外の場合は、カーソル位置から置換が開始されます。関数やスクリプトでこのコマンドを使用する場合、置換は関数またはスクリプトが終了した後にのみ開始されることに注意してください。
:startgreplace
:startg[replace][!] :startreplaceと同様ですが、gRのように仮想置換モードを使用します。

10. ファイルの挿入 inserting-file

:r :re :read :r[ead] [++opt] [name] ファイル [name](デフォルト:現在のファイル)をカーソルの下に挿入します。[++opt]の可能な値については、++optを参照してください。
:{range}r[ead] [++opt] [name] ファイル [name](デフォルト:現在のファイル)を指定された行の下に挿入します。[++opt]の可能な値については、++optを参照してください。
:r! :read! :[range]r[ead] [++opt] !{cmd} {cmd}を実行し、その標準出力をカーソルの下または指定された行の下に挿入します。コマンドの出力を格納するために一時ファイルが使用され、それがバッファに読み込まれます。'shellredir'は、コマンドの出力を保存するために使用され、stderrを含めるかどうかを設定できます。{cmd}は ":!{cmd}"のように実行され、'!'は前のコマンド:!に置き換えられます。[++opt]の可能な値については、++optを参照してください。
これらのコマンドは、ファイルの内容、またはコマンドの出力をバッファに挿入します。これらはアンドゥできます。「.」コマンドで繰り返すことはできません。これらは行単位で動作し、挿入はカーソルがある行の下、または指定された行の下から開始されます。最初の行の上にテキストを挿入するには、コマンド ":0r {name}"を使用します。
":read"コマンドの後、カーソルは最初の新しい行の最初の非空白文字のままになります。Exモードでない場合は、カーソルは最後の新しい行のままになります(申し訳ありませんが、これはVi互換です)。
ファイル名が":r"で指定されている場合、それは代替ファイルになります。これは、たとえば、代わりにそのファイルを編集したい場合に使用できます:":e! #"。'cpoptions'オプションから「a」フラグを削除することで、これをオフにすることができます。
[++opt]引数のうち、1つは":read"専用の++edit引数です。これは、":read"コマンドが実際にファイルを編集する場合のようにバッファに読み込むために使用される場合に役立ちます。空のバッファでこのコマンドを使用してください。
:read ++edit filename
効果は、'fileformat''fileencoding''bomb'などのオプションが「filename」に対して検出されたものに設定されることです。単一の空行が残ることに注意してください。削除したいかもしれません。
file-read
'fileformat'オプションは、ファイルの<EOL>スタイルを設定します
'fileformat'文字名
"dos" <CR><NL>または<NL> DOS形式 "unix" <NL> Unix形式 "mac" <CR> Mac形式
'fileformat'が"dos"の場合、<NL>の前の<CR>は無視され、ファイルの末尾のCTRL-Zは無視されます。
'fileformat'が"mac"の場合、ファイル内の<NL>は内部的に<CR>で表現されます。これは、<NUL>を表すために使用される<NL>との混同を避けるためです。CR-used-for-NLを参照してください。
'fileformats'オプションが空でない場合、Vimは<EOL>のタイプを認識しようとします(file-formatsを参照)。ただし、'fileformat'オプションは変更されず、検出された形式はファイルの読み取り中にのみ使用されます。'fileencodings'でも同様のことが起こります。
非Win32システムでは、ファイルがDOS形式で読み込まれた場合、通常とは異なる処理が行われていることを示すために、メッセージ「[dos format]」が表示されます。MacintoshおよびWin32では、ファイルがUnix形式で読み込まれた場合、メッセージ「[unix format]」が表示されます。非Macintoshシステムでは、ファイルがMac形式で読み込まれた場合、メッセージ「[mac format]」が表示されます。
":r !"の使用方法の例
:r !uuencode binfile binfile
このコマンドは、「binfile」を読み込み、uuencodeして、現在のバッファに読み込みます。電子メールを編集していて、バイナリファイルを含めたい場合に便利です。
read-messages
ファイルを読み込むと、Vimは読み込んだファイルに関する情報を含むメッセージを表示します。表には、いくつかの項目の説明があります。その他の項目は自明です。長いバージョンまたは短いバージョンを使用するかどうかは、'shortmess'オプションによって異なります。
long short meaning
[readonly] {RO} ファイルは書き込み保護されています [fifo/socket] ストリームを使用 [fifo] fifoストリームを使用 [socket] ソケットストリームを使用 [CR missing] "dos" 'fileformat'で読み込んでいて、先行するCRのないNLが見つかりました。 [NL found] "mac" 'fileformat'で読み込んでいて、NLが見つかりました("unix"形式の可能性があります) [long lines split] 少なくとも1行が2つに分割されました [NOT converted] 'fileencoding'から'encoding'への変換が必要でしたが、できませんでした [converted] 'fileencoding'から'encoding'への変換が完了しました [READ ERRORS] ファイルのすべてを読み込むことができませんでした
メイン
コマンドインデックス
クイックリファレンス