マップ

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


キーマッピング、略語、およびユーザー定義コマンド。
この項目については、ユーザーマニュアルの 05.324.7、および 40.1 セクションで説明しています。

1. キーマッピング mapping macro

キーマッピングは、入力されたキーの意味を変更するために使用されます。最も一般的な用途は、関数キーに対して一連のコマンドを定義することです。例
:map <F2> a<C-R>=strftime("%c")<CR><Esc>
これは、カーソルの後に現在の年月日と時刻を(<>表記 <> で)追加します。

1.1 マップコマンド :map-commands

新しいマッピングを入力したり、マッピングを削除したり、マッピングを一覧表示したりするためのコマンドがあります。「map」の様々な形式とそのモードとの関係については、map-overview を参照してください。
{lhs} は左辺 {lhs}{rhs} は右辺 {rhs} を意味します。
:map {lhs} {rhs} mapmode-nvo :map
:nm[ap] {lhs} {rhs} mapmode-n :nm :nmap :vm[ap] {lhs} {rhs} mapmode-v :vm :vmap :xm[ap] {lhs} {rhs} mapmode-x :xm :xmap :smap {lhs} {rhs} mapmode-s :smap
:om[ap] {lhs} {rhs} mapmode-o :om :omap :map! {lhs} {rhs} mapmode-ic :map!
:im[ap] {lhs} {rhs} mapmode-i :im :imap :lm[ap] {lhs} {rhs} mapmode-l :lm :lma :lmap :cm[ap] {lhs} {rhs} mapmode-c :cm :cmap :tma[p] {lhs} {rhs} mapmode-t :tma :tmap mapコマンドが適用されるモードに対して、キーシーケンス{lhs}{rhs}にマップします。{rhs}を含む結果は、その後、マッピングに対してさらにスキャンされます。これにより、マッピングのネストと再帰的な使用が可能になります。 **注:** スペースは有効なノーマルモードコマンドであるため、末尾のスペースは{rhs}に含まれます。map-trailing-whiteを参照してください。
:nore :norem :no[remap] {lhs} {rhs} mapmode-nvo :no :noremap :nor :nn[oremap] {lhs} {rhs} mapmode-n :nn :nnoremap :vn[oremap] {lhs} {rhs} mapmode-v :vn :vnoremap :xn[oremap] {lhs} {rhs} mapmode-x :xn :xnoremap :snor[emap] {lhs} {rhs} mapmode-s :snor :snore :snoremap :ono[remap] {lhs} {rhs} mapmode-o :ono :onoremap :no[remap]! {lhs} {rhs} mapmode-ic :no! :noremap! :ino[remap] {lhs} {rhs} mapmode-i :ino :inor :inoremap :ln[oremap] {lhs} {rhs} mapmode-l :ln :lnoremap :cno[remap] {lhs} {rhs} mapmode-c :cno :cnor :cnoremap :tno[remap] {lhs} {rhs} mapmode-t :tno :tnoremap mapコマンドが適用されるモードに対して、キーシーケンス{lhs}{rhs}にマップします。ネストされたマッピングと再帰的なマッピングを回避するために、{rhs}のマッピングを許可しません。コマンドを再定義するために頻繁に使用されます。**注:** i_CTRL-]c_CTRL-]を除き、{rhs}内のキーは省略形をトリガーしません。**注:** {rhs}<Plug>が出現する場合、リマッピングが許可されていなくても、この部分は常に適用されます。
:unm[ap] {lhs} mapmode-nvo :unm :unmap :nun[map] {lhs} mapmode-n :nun :nunmap :vu[nmap] {lhs} mapmode-v :vu :vunmap :xu[nmap] {lhs} mapmode-x :xu :xunmap :sunm[ap] {lhs} mapmode-s :sunm :sunmap :ou[nmap] {lhs} mapmode-o :ou :ounmap :unm[ap]! {lhs} mapmode-ic :unm! :unmap! :iu[nmap] {lhs} mapmode-i :iu :iunmap :lu[nmap] {lhs} mapmode-l :lu :lunmap :cu[nmap] {lhs} mapmode-c :cu :cun :cunmap :tunma[p] {lhs} mapmode-t :tunma :tunmap mapコマンドが適用されるモードに対して、{lhs}のマッピングを削除します。マッピングは、適用される他のモードでは定義されたままになる可能性があります。{lhs}がマッピングの{rhs}と一致する場合にも機能します。これは、省略形が適用された場合のためです。**注:** 末尾のスペースは{lhs}に含まれます。map-trailing-whiteを参照してください。
:mapc[lear] mapmode-nvo :mapc :mapclear :nmapc[lear] mapmode-n :nmapc :nmapclear :vmapc[lear] mapmode-v :vmapc :vmapclear :xmapc[lear] mapmode-x :xmapc :xmapclear :smapc[lear] mapmode-s :smapc :smapclear :omapc[lear] mapmode-o :omapc :omapclear :mapc[lear]! mapmode-ic :mapc! :mapclear! :imapc[lear] mapmode-i :imapc :imapclear :lmapc[lear] mapmode-l :lmapc :lmapclear :cmapc[lear] mapmode-c :cmapc :cmapclear :tmapc[lear] mapmode-t :tmapc :tmapclear mapコマンドが適用されるモードのすべてのマッピングを削除します。バッファローカルのマッピングを削除するには、<buffer>引数を使用します :map-<buffer> **警告:** これにより、default-mappingsも削除されます。
:map mapmode-nvo :nm[ap] mapmode-n :vm[ap] mapmode-v :xm[ap] mapmode-x :sm[ap] mapmode-s :om[ap] mapmode-o :map! mapmode-ic :im[ap] mapmode-i :lm[ap] mapmode-l :cm[ap] mapmode-c :tma[p] mapmode-t mapコマンドが適用されるモードのすべてのキーマッピングを一覧表示します。他のモードも含むため、「:map」と「:map!」が最も頻繁に使用されます。
:map {lhs} mapmode-nvo :map_l
:nm[ap] {lhs} mapmode-n :nmap_l
:vm[ap] {lhs} mapmode-v :vmap_l
:xm[ap] {lhs} mapmode-x :xmap_l
:sm[ap] {lhs} mapmode-s :smap_l
:om[ap] {lhs} mapmode-o :omap_l
:map! {lhs} mapmode-ic :map_l!
:im[ap] {lhs} mapmode-i :imap_l
:lm[ap] {lhs} mapmode-l :lmap_l
:cm[ap] {lhs} mapmode-c :cmap_l
:tma[p] {lhs} mapmode-t :tmap_l
{lhs}で始まるキーシーケンスに対する、mapコマンドが適用されるモードでのキーマッピングを一覧表示します。
これらのコマンドは、キーまたはキーシーケンスを文字列にマッピングするために使用されます。これを使用して、ファンクションキーにコマンドシーケンスを配置したり、あるキーを別のキーに変換したりすることができます。現在のマッピングの保存と復元方法については、:mkexrcを参照してください。
曖昧なマッピング
2つのマッピングが同じ文字シーケンスで始まる場合、それらは曖昧になります。例:
:imap aa foo
:imap aaa bar
Vimが "aa" を読み込んだ場合、"aa" または "aaa" をマッピングする必要があるかどうかを判断するために、別の文字を取得する必要があります。これは、"aa" を入力した後、そのマッピングはまだ展開されず、Vimが別の文字を待っていることを意味します。スペースを入力すると、"foo" とスペースが挿入されます。"a"を入力すると、"bar"が挿入されます。
末尾の空白
map-trailing-white
このunmapコマンドは機能しません。
:map @@ foo
:unmap @@ | print
コマンドセパレータ「|」の前にある空白文字を含む「@@ 」のアンマッピングを試みるためです。末尾に空白文字がある他の例:
unmap @@ 
unmap @@     " comment
エラーが発生しますが、unmap @@の末尾の空白文字は見えないため、非常に識別が困難です。
一般的な解決策は、マッピングされたキーの直後にコマンドセパレータ「|」を配置することです。その後、空白文字とコメントを続けることができます。
unmap @@|    " comment

1.2 特殊引数 :map-arguments

"<buffer>"、"<nowait>"、"<silent>"、"<script>"、"<expr>"、および"<unique>"は、任意の順序で使用できます。他の引数の前に、コマンドの直後に表示する必要があります。
:map-local :map-<buffer> :map-buffer E224 E225 これらのコマンドの最初の引数が"<buffer>"の場合、マッピングは現在のバッファのみに有効になります。例:
:map <buffer>  ,w  /[.,;]<CR>
その後、別のバッファで ",w" を別のものに変換することができます。
:map <buffer>  ,w  /[#&!]<CR>
ローカルバッファマッピングはグローバルマッピングの前に使用されます。より長いグローバルマッピングが存在する場合に短いローカルマッピングを有効にしないようにするには、下記の<nowait>を参照してください。 "<buffer>"引数は、マッピングをクリアするためにも使用できます。
:unmap <buffer> ,w
:mapclear <buffer>
ローカルマッピングは、バッファが削除されたときにはクリアされますが、アンロードされたときにはクリアされません。ローカルオプション値と同様です。map-precedenceも参照してください。
:map-<nowait> :map-nowait ","に対してバッファローカルマッピングを定義する場合、","で始まるグローバルマッピングが存在することがあります。その場合、","のマッピングを使用するのか、より長いマッピングを使用するのかをVimが認識するために、別の文字を入力する必要があります。これを回避するために、<nowait>引数を追加します。すると、マッピングが一致したときにマッピングが使用され、Vimはさらに文字が入力されるのを待ちません。ただし、文字が既にタイプされている場合は、それらが使用されます。これは、<nowait>マッピングが完全に一致し、部分一致の前に見つかった場合に機能します。これは以下の場合に機能します。
一致するバッファローカルマッピングが1つしかない場合(これらは常にグローバルマッピングの前に見つかるため)。
部分的に一致する別のバッファローカルマッピングがありますが、先に定義されている場合(最後に定義されたマッピングが最初に検出される)。
:map-<silent> :map-silent コマンドラインにエコーされないマッピングを定義するには、最初の引数として"<silent>"を追加します。例:
:map <silent> ,h /Header<CR>
このマッピングを使用すると、検索文字列はエコーされません。ただし、実行されたコマンドからのメッセージは引き続き表示されます。それらも無効にするには、実行されたコマンドに ":silent" を追加します。
:map <silent> ,h :exe ":silent normal /Header\r"<CR>
コマンドの効果も無効になる場合があります。たとえば、マッピングがコマンドライン補完の別のエントリを選択する場合、表示されません。プロンプトは引き続き表示されます(たとえば、inputdialog()の場合)。省略形に"<silent>"を使用することは可能ですが、コマンドラインの再描画が失敗します。
:map-<script> :map-script これらのコマンドの最初の引数が"<script>"であり、新しいマッピングまたは省略形の定義に使用される場合、マッピングは{rhs}内の文字を、"<SID>"で始まるスクリプトにローカルに定義されたマッピングのみを使用して再マッピングします。これは、スクリプト外のマッピング(たとえば、mswin.vimでCTRL-Vが再マッピングされている場合)が干渉するのを防ぐために使用できますが、スクリプトで定義された他のマッピングは使用します。注記: ":map <script>"と":noremap <script>"は同じです。"<script>"はコマンド名を無効にします。再マッピングが(主に)無効になっていることが明確なため、":noremap <script>"の方が好ましいです。
:map-<unique> :map-unique E226 E227 これらのコマンドの最初の引数が"<unique>"であり、新しいマッピングまたは省略形の定義に使用される場合、マッピングまたは省略形が既に存在する場合は、コマンドは失敗します。例:
:map <unique> ,w  /[#&!]<CR>
ローカルマッピングを定義する場合、グローバルマップに既に存在する等しいものが存在するかどうかについてもチェックされます。失敗する例:
:map ,w  /[#&!]<CR>
:map <buffer> <unique> ,w  /[.,;]<CR>
キーをマッピングして、元のマッピングを実行する場合は、maparg()を参照してください。
:map-<expr> :map-expression これらのコマンドの最初の引数が"<expr>"であり、新しいマッピングまたは省略形の定義に使用される場合、引数は式です。式は評価されて、使用される{rhs}が取得されます。例:
:inoremap <expr> . <SID>InsertDot()
s:InsertDot()関数の結果が挿入されます。カーソル前のテキストをチェックし、条件を満たしたときにオムニ補完を開始できます。グローバル名前空間を汚染しないように、スクリプトローカル関数の使用が推奨されます。マッピングが定義されたスクリプトを見つけるために、RHSに<SID>を使用してください。
省略形の場合、v:charは、省略形をトリガーするためにタイプされた文字に設定されます。これを使用して、{lhs}の展開方法を決定できます。v:charを挿入または変更しないでください。
マッピングを何も行わないようにする場合は、式を空文字列として評価できます。Vimがメインループを通過する必要がある変更があった場合(たとえば、表示を更新する場合)、「\<Ignore>」を返します。これは "nothing" と似ていますが、Vimを入力待ちのループから返します。
式は、前のコマンドが実行される前に、タイプヘッドを検索しているときに評価される可能性があることに注意してください。たとえば:
func StoreColumn()
  let g:column = col('.')
  return 'x'
endfunc
nnoremap <expr> x StoreColumn()
nmap ! f!x
"f!"の実行前に"x"が評価されるため、"g:column"には"f!"を実行する前の値が表示されます。これは、式でマッピングされた文字の前に<Ignore>を挿入することで解決できます。
nmap ! f!<Ignore>x
副作用に非常に注意してください!式は文字を取得している間に評価されるため、コマンドが機能しなくなる可能性があります。そのため、<expr>マッピングでは、以下がブロックされます。
バッファテキストの変更textlock
別のバッファの編集。
:normalコマンド。
カーソルの移動は許可されますが、後で復元されます。
cmdlineが変更された場合、古いテキストとカーソル位置が復元されます。マッピングでこれらのいずれかを実行する場合は、返された文字を実行するか、代わりに<Cmd>マッピングを使用してください。
getchar()を使用できます。タイプヘッドがある場合は消費されます。たとえば、これらのマッピングがあるとします。
inoremap <expr> <C-L> nr2char(getchar())
inoremap <expr> <C-L>x "foo"
ここでCTRL-Lを入力しても、まだ何も起こりません。Vimはどのマッピングを使用するかを決定するために次の文字を必要とします。「x」を入力すると、2番目のマッピングが使用され、「foo」が挿入されます。他のキーを入力すると、最初のマッピングが使用され、getchar()が入力されたキーを取得して返します。
次に、増加するリスト番号を挿入する例を示します。
let counter = 0
inoremap <expr> <C-L> ListItem()
inoremap <expr> <C-R> ListReset()
func ListItem()
  let g:counter += 1
  return g:counter .. '. '
endfunc
func ListReset()
  let g:counter = 0
  return ''
endfunc
CTRL-Lは次の番号を挿入し、CTRL-Rはカウントをリセットします。CTRL-Rは空の文字列を返すため、何も挿入されません。
他のテキストの前に単一バイトとして0x80を使用しても機能しないことに注意してください。特殊キーとして認識されます。
<Cmd> :map-cmd <Cmd>擬似キーは、「コマンドマッピング」を開始し、モードを変更せずにコマンドを直接実行します。マッピングの{rhs}で":...<CR>"を使用する可能性のある場所で、代わりに"<Cmd>...<CR>"を使用できます。例:
noremap x <Cmd>echo mode(1)<CR>
これは、VisualモードとOperator-pendingモードでの:<C-U>、またはInsertモードでの<C-O>:よりも柔軟性があります。コマンドは常にNormalモードになるのではなく、現在のモードで直接実行されるためです。Visualモードは保持されるため、gvを使ったトリックは必要ありません。コマンドはコマンドラインモードで直接呼び出すことができます(それ以外の場合はタイマーハックが必要です)。Insertモードの途中で<Cmd>を使用する例:
nnoremap <F3> aText <Cmd>echo mode(1)<CR> Added<Esc>
<expr>マッピングとは異なり、<Cmd>コマンドには特別な制限はありません。まるで(無制限の)autocommandが呼び出されたか、非同期イベントが処理されたかのように実行されます。
注記
<Cmd>はモードの変更を回避するため(":"とは異なり)、CmdlineEnterイベントとCmdlineLeaveイベントはトリガーされません。これにより、パフォーマンスが向上します。
同じ理由で、<C-R><C-W>などのkeycodesは、プレーンなマッピングされていないキーとして解釈されます。
コマンドはエコーされません。<silent>は必要ありません。
{rhs}は、マッピングが再帰的であっても、省略形や他のマッピングの対象になりません。
Visualモードでは、Visual領域の一端を取得するためにline('v')col('v')を使用できます。カーソルは他端にあります。
E1255 E1136 <Cmd>コマンドは終了する必要があります。つまり、マッピング定義の{rhs}では<CR>が続く必要があります。Command-lineモードは入力されません。{rhs}にリテラル<CR>を使用するには、<lt>を使用します。
マッピングセットは7つあります。
ノーマルモードの場合:コマンド入力時。
ビジュアルモードの場合:ビジュアル領域がハイライトされている状態でコマンドを入力する場合。
セレクトモードの場合:ビジュアルモードに似ていますが、テキストを入力すると選択範囲が置き換えられます。
オペレータ保留モードの場合:「d」、「y」、「c」など、オペレータが保留されている場合。下記参照:omap-info
挿入モードの場合。これらは置換モードでも使用されます。
コマンドラインモードの場合:「: 」または「/」コマンドを入力する場合。
ターミナルモードの場合::terminal バッファに入力する場合。
特殊なケース:ノーマルモードでコマンドのカウントを入力している間は、ゼロのマッピングが無効になります。これにより、ゼロをマッピングしても、ゼロを含むカウントを入力できなくなるのを防ぐことができます。
map-overview map-modes どのマップコマンドがどのモードで機能するかについての概要。詳細は下記。
コマンド モード
:map :noremap :unmap ノーマル、ビジュアル、セレクト、オペレータ保留 :nmap :nnoremap :nunmap ノーマル :vmap :vnoremap :vunmap ビジュアルとセレクト :smap :snoremap :sunmap セレクト :xmap :xnoremap :xunmap ビジュアル :omap :onoremap :ounmap オペレータ保留 :map! :noremap! :unmap! 挿入とコマンドライン :imap :inoremap :iunmap 挿入 :lmap :lnoremap :lunmap 挿入、コマンドライン、Lang-Arg :cmap :cnoremap :cunmap コマンドライン :tmap :tnoremap :tunmap ターミナル
表形式の情報:map-table
モード | ノーマル | 挿入 | コマンド | ビジュアル | セレクト | オペレータ保留 | ターミナル | Lang |
コマンド +------+-----+-----+-----+-----+-----+------+------+
[nore]map | はい | - | - | はい | はい | はい | - | - | n[nore]map | はい | - | - | - | - | - | - | - | [nore]map! | - | はい | はい | - | - | - | - | - | i[nore]map | - | はい | - | - | - | - | - | - | c[nore]map | - | - | はい | - | - | - | - | - | v[nore]map | - | - | - | はい | はい | - | - | - | x[nore]map | - | - | - | はい | - | - | - | - | s[nore]map | - | - | - | - | はい | - | - | - | o[nore]map | - | - | - | - | - | はい | - | - | t[nore]map | - | - | - | - | - | - | はい | - | l[nore]map | - | はい | はい | - | - | - | - | はい |
コマンド モード
ノーマル ビジュアル+セレクト オペレータ保留
:map :noremap :unmap :mapclear はい はい はい :nmap :nnoremap :nunmap :nmapclear はい - - :vmap :vnoremap :vunmap :vmapclear - はい - :omap :onoremap :ounmap :omapclear - - はい
:nunmap は、お寺の外でも使用できます。mapmode-x mapmode-s 一部のコマンドはビジュアルモードとセレクトモードの両方で機能し、一部は一方のモードでのみ機能します。「ビジュアル」という表記は、多くの場合、ビジュアルモードとセレクトモードの両方に適用されます。Select-mode-mapping 注意:セレクトモードで印刷可能な文字をマッピングすると、ユーザーを混乱させる可能性があります。印刷可能な文字には、:xmap と :smap を明示的に使用することをお勧めします。または、マッピングを定義した後に :sunmap を使用します。
コマンド モード
ビジュアル セレクト
:vmap :vnoremap :vunmap :vmapclear はい はい :xmap :xnoremap :xunmap :xmapclear はい - :smap :snoremap :sunmap :smapclear - はい
mapmode-ic mapmode-i mapmode-c mapmode-l 一部のコマンドは挿入モードとコマンドラインモードの両方で機能し、一部は機能しません。
コマンド モード
挿入 コマンドライン Lang-Arg
:map! :noremap! :unmap! :mapclear! はい はい - :imap :inoremap :iunmap :imapclear はい - - :cmap :cnoremap :cunmap :cmapclear - はい - :lmap :lnoremap :lunmap :lmapclear はい* はい* はい*
* 'iminsert' が 1 の場合、下記のlanguage-mapping を参照してください。
元の Vi には、ノーマル/ビジュアル/オペレータ保留モードと挿入/コマンドラインモードの別々のマッピングがありませんでした。そのため、":map" と ":map!" コマンドは、複数のモードのマッピングを入力および表示します。Vim では、":nmap"、":vmap"、":omap"、":cmap"、":imap" コマンドを使用して、各モードのマッピングを個別に作成できます。
omap-info
オペレータ保留マッピングを使用して、任意のオペレータで使用できる移動コマンドを定義できます。簡単な例
:omap { w
"y{" を "yw" のように、"d{" を "dw" のように機能させます。
開始カーソル位置を無視して異なるテキストを選択するには、omap でビジュアルモードを開始して、操作するテキストを選択できます。現在の行の関数名で操作する例
onoremap <silent> F :<C-U>normal! 0f(hviw<CR>
CTRL-U (<C-U>) は、Vim が挿入する可能性のある範囲を削除するために使用されます。ノーマルモードのコマンドは最初の「(」文字を探し、その前の最初の単語を選択します。通常は関数名です。
ノーマルモードとビジュアルモードのマッピングを入力しますが、オペレータ保留モードには入力しない場合は、まず3つのモードすべてに対して定義し、次にオペレータ保留モードに対してアンマップします。
:map    xx something-difficult
:ounmap xx
同様に、ビジュアルモードとオペレータ保留モード、またはノーマルモードとオペレータ保留モードのマッピング。
language-mapping
":lmap" は、以下に適用されるマッピングを定義します。
挿入モード
コマンドラインモード
検索パターンを入力する場合
"r" や "f" など、テキスト文字を受け入れるコマンドの引数
input() 行用 一般的に:バッファ内のテキストの一部である文字を入力する場合(Vim コマンド文字ではない場合)。「Lang-Arg」は別のモードというわけではなく、ここではこの状況で使用されています。'keymap' オプションを使用して、関連する言語マッピングのセットをロードする最も簡単な方法です。45.5 を参照してください。挿入モードとコマンドラインモードでは、CTRL-^ コマンドi_CTRL-^ c_CTRL-^でマッピングを無効にできます。これらのコマンドは、'iminsert' オプションの値を変更します。通常の command line(検索パターンではない)の入力を開始すると、CTRL-^ が入力されるまでマッピングは無効になります。最後に使用された状態は、挿入モードと検索パターンのそれぞれについて記憶されます。挿入モードの状態は、"f" や "t" のようなコマンドの引数として文字を入力する場合にも使用されます。言語マッピングは、既にマッピングされている文字には適用されません。入力された文字にのみ使用されます。これは、マッピングを入力する時点で言語マッピングが既に完了していたことを前提としています。同様に、マクロを適用するのではなく、マクロを記録する際に言語マッピングが適用されます。

1.4 マッピングの一覧表示 map-listing

マッピングを一覧表示する場合、最初の2列の文字は次のとおりです。
文字 モード
<Space> ノーマル、ビジュアル、セレクト、オペレータ保留 n ノーマル v ビジュアルとセレクト s セレクト x ビジュアル o オペレータ保留 ! 挿入とコマンドライン i 挿入 l ":lmap" マッピング(挿入、コマンドライン、Lang-Arg 用) c コマンドライン t ターミナルジョブ
{rhs} の直前に、特別な文字が表示される場合があります。* は再マッピングできないことを示し、& はスクリプトローカルのマッピングのみが再マッピング可能であることを示し、@ はバッファローカルのマッピングを示します。
{lhs} の後の最初の空白以外の文字から行末(または '|')までは、{rhs} の一部と見なされます。これにより、{rhs} をスペースで終わらせることができます。
注:ビジュアルモードのマッピングを使用する場合は、現在のバッファの最後に選択されたビジュアル領域の先頭である "'<" マークを使用できます。'<
:filter コマンドを使用して、一覧表示するマッピングを選択できます。パターンは、生の形式の{lhs}{rhs} に対して照合されます。nvim_set_keymap() または nvim_buf_set_keymap() を使用して説明を追加した場合、パターンは説明にも照合されます。
:map-verbose
'verbose' が 0 以外の場合、キーマップの一覧表示には、最後に定義された場所も表示されます。例
:verbose map <C-W>*
n  <C-W>*      * <C-W><C-S>*
        Last set from ~/.config/nvim/init.vim
詳細は :verbose-cmd を参照してください。

1.5 特殊キーのマッピング :map-special-keys

ファンクションキーをマップするには、その内部コードを使用します。このようなマッピングを入力するには、CTRL-K を入力してからファンクションキーを押すか、「<F2>」、「<F10>」、「<Up>」、「<S-Down>」、「<S-F7>」などの形式を使用します(キーの表を参照key-notation<Up> 以降のすべてのキーを使用できます)。

1.6 特殊文字 :map-special-chars

map_backslash map-backslash マッピングと略語の特殊文字として、ここで言及されているのはCTRL-V のみであることに注意してください。'cpoptions' に 'B' が含まれていない場合、バックスラッシュもCTRL-V のように使用できます。その場合、<>表記を完全に使用できます<>。しかし、「<C-V>」をCTRL-V のように使用して、その後に続くものの特別な意味をエスケープすることはできません。
バックスラッシュをマップするか、{rhs} にバックスラッシュをそのまま使用するには、特殊シーケンス「<Bslash>」を使用できます。これにより、ネストされたマッピングを使用する場合にバックスラッシュを二重にする必要がなくなります。
map_CTRL-C map-CTRL-C {lhs}CTRL-C を使用することは可能ですが、Vim がキーを待機している場合にのみ機能し、Vim が何かでビジー状態の場合は機能しません。Vim がビジー状態の場合、CTRL-C はコマンドを中断/キャンセルします。MS-Windows の GUI バージョンを使用する場合、CTRL-C をマップして、クリップボードにコピーコマンドを許可することができます。Vim を中断するにはCTRL-Break を使用します。
map_space_in_lhs map-space_in_lhs `{lhs}`にスペースを含めるには、スペースの前に`CTRL-V`(スペース一つにつき`CTRL-V`を2回入力)を付け加えます。map_space_in_rhs map-space_in_rhs スペースから始まる `{rhs}` を作成したい場合は、"<Space>"を使用します。完全にVi互換にするには(ただし、読みづらくなります)、<>表記を使用せず、`<>` `{rhs}` の前に `CTRL-V` を1つ(`CTRL-V`を2回入力する必要があります)付け加えます。map_empty_rhs map-empty_rhs `CTRL-V`(2回入力)の後に何も入力しないことで、空の `{rhs}` を作成できます。残念ながら、これはvimrcファイル内では実行できません。`<Nop>` 何も生成しないマッピングを取得するより簡単な方法は、`{rhs}`に "<Nop>" を使用することです。たとえば、ファンクションキー8を無効にするには
:map  <F8>  <Nop>
:map! <F8>  <Nop>
map-multibyte
マルチバイト文字のマッピングは可能ですが、文字全体のみです。先頭バイトのみをマッピングすることはできません。これは、このシナリオにおける問題を防ぐために行われました。
:set encoding=latin1
:imap <M-C> foo
:set encoding=utf-8
`<M-C>` のマッピングは latin1 エンコーディングで定義されており、0xc3 バイトになります。UTF-8 エンコーディングで á (0xe1 `<M-a>`) という文字を入力すると、これは 0xc3 0xa1 の2バイトになります。0xc3 バイトをマッピングしたくない場合、á文字を入力できなくなるためです。
<Leader> mapleader "g:mapleader" 変数を使用するマッピングを定義するには、特別な文字列 "<Leader>" を使用できます。これは "g:mapleader" の文字列値に置き換えられます。"g:mapleader" が設定されていないか空の場合、代わりにバックスラッシュが使用されます。例
map <Leader>A  oanother line<Esc>
以下のようになります
map \A  oanother line<Esc>
しかし、その後
let mapleader = ","
以下のようになります
map ,A  oanother line<Esc>
"g:mapleader" の値は、マッピングが定義された時点で使用されます。"g:mapleader" をその後変更しても、既に定義されているマッピングには影響しません。
<LocalLeader> maplocalleader `<LocalLeader>` は `<Leader>` と同じですが、"mapleader" の代わりに "maplocalleader" を使用します。`<LocalLeader>` は、バッファにローカルなマッピングに使用されます。例
:map <buffer> <LocalLeader>A  oanother line<Esc>
グローバルプラグインでは `<Leader>` を使用し、ファイルタイププラグインでは `<LocalLeader>` を使用します。"mapleader" と "maplocalleader" は同じにすることができます。ただし、異なるものにすることで、グローバルプラグインのマッピングとファイルタイププラグインのマッピングが競合する可能性が低くなります。たとえば、"mapleader" をデフォルトのバックスラッシュのままにして、"maplocalleader" をアンダースコアに設定できます。
map-<SID>
スクリプトでは、スクリプトにローカルなマッピングを定義するために、特別なキー名 "<SID>" を使用できます。詳細は `<SID>` を参照してください。
<Plug>
特別なキー名 "<Plug>" は、キーシーケンスと一致しない内部マッピングに使用できます。これは、`using-<Plug>` プラグインで役立ちます。
<MouseMove>
特別なキー名 "<MouseMove>" は、マウスの動きを処理するために使用できます。これは `'mousemoveevent'` で有効にする必要があります。マウスの位置を取得するには `getmousepos()` 関数を使用できます。
<Char> <Char-> 10進数、8進数、または16進数で文字をマッピングするには、`<Char>` 構造体を使用できます。`<Char-123>` 文字 123 `<Char-033>` 文字 27 `<Char-0x7f>` 文字 127 `<S-Char-114>` 文字 114 ('r') シフト ('R') これは `'keymap'` ファイルで(マルチバイト)文字を指定するのに役立ちます。大文字と小文字の違いは無視されます。
map-comments
これらのコマンドの後にコメントを付けることはできません。なぜなら、`"` 文字は `{lhs}` または `{rhs}` の一部と見なされるからです。ただし、`|"` を使用できます。これは、コメントを含む新しい空のコマンドを開始するためです。
map_bar map-bar `|` 文字はマップコマンドを次のコマンドから区切るために使用されるため、`{rhs}` に `|` を含めるには特別な処理を行う必要があります。3つの方法があります。
例で使用すると機能します
`<Bar>` 常に :map _l :!ls `<Bar>` more^M \| 'b' が `'cpoptions'` にない場合 :map _l :!ls \| more^M ^V| 常に :map _l :!ls ^V| more^M
(ここで ^V は `CTRL-V` を表します。`CTRL-V` を1つ取得するには、2回入力する必要があります。ここで <> 表記 "<C-V>" は使用できません)。
'cpoptions' のデフォルト設定を使用する場合、これら3つのすべてが機能します。
'b' が `'cpoptions'` に存在する場合、`\|` は `\` で終わるマッピングと、その後ろの別のコマンドとして認識されます。これは Vi と互換性がありますが、他のコマンドと比較すると論理的ではありません。
map_return map-return Exコマンドを含むマッピングがある場合、実行するにはその後に改行文字を配置する必要があります。これには `<CR>` の使用をお勧めします(`<>` を参照)。例
:map  _ls  :!ls -l %:S<CR>:echo "the end"<CR>
挿入モードまたはコマンドラインモードで入力する文字のマッピングを回避するには、最初に `CTRL-V` を入力します。map-error
エラーが発生した場合(エラーメッセージが表示されるか、ビープ音が鳴る可能性があります)、マッピングの残りの部分は実行されません。これは Vi と互換性があります。
@zZtTfF[]rm'`"v と `CTRL-X` の2番目の文字(引数)はマッピングされません。これは、同じ名前のコマンドがマッピングされている場合でも、すべての名前付きレジスタとマークを使用できるようにするためです。

1.7 マッピングするキー map-which-keys

何かをマッピングする場合は、`{lhs}` に使用するキーを選択する必要があります。Vimコマンドに使用されているキーは避ける必要があります。そうしないと、それらのコマンドを使用できなくなります。いくつかの提案を以下に示します。
ファンクションキー `<F2>`、`<F3>` など。シフトファンクションキー `<S-F1>`、`<S-F2>` なども同様です。`<F1>` は既にヘルプコマンドに使用されていることに注意してください。
メタキー(ALTキーを押しながら)。キーボードによっては、アクセント付き文字も使用できます。:map-alt-keys
`_` または `、` 文字、それに続く任意の他の文字を使用します。`_` と `、` コマンドは Vim に存在しますが(`_` と `,` を参照)、おそらくそれらを使用することはありません。
別のコマンドの同義語であるキーを使用します。たとえば:`CTRL-P` と `CTRL-N`。追加の文字を使用すると、より多くのマッピングが可能になります。
`<Leader>` で定義されたキーと1つ以上の他のキーを使用します。これは特にスクリプトで役立ちます。mapleader
使用されていないキー、したがってビルトイン関数を失うことなくマッピングできるキーについては、「index」ファイルを参照してください。また、`:help `{key}`^D" を使用して、キーがコマンドに使用されているかどうかを確認することもできます。(`{key}` は確認したい特定のキー、^D は `CTRL-D` です)。

1.8 例 map-examples

いくつかの例(入力方法:「<CR>」には4文字入力します)。
:map <F3>  o#include
:map <M-g> /foo<CR>cwbar<Esc>
:map _x    d/END/e<CR>
:map! qq   quadrillion questions
カウントの乗算
マッピングをトリガーする前にカウントを入力すると、それはカウントが`{lhs}`の前に入力されたようになります。たとえば、このマッピングの場合
:map <F4>  3w
2<F4>と入力すると、「23w」になります。したがって、2 * 3単語ではなく23単語移動します。カウントを乗算する場合は、式レジスタを使用します。
:map <F4>  @='3w'<CR>
引用符内の部分は、実行される式です。@=

1.9 マッピングの使用 map-typing

Vim は、入力した内容とマッピングされたシーケンスの先頭部分を比較します。不完全な一致がある場合、完全一致するか、一致がなくなるまで、さらに文字を取得します。例:「qq」をマッピングする場合、別の文字を入力するまで最初の 'q' は画面に表示されません。これは、Vim が次の文字が 'q' かどうかを知ることができないためです。'timeout' オプションがオンの場合(デフォルト)、Vim は1秒間(または 'timeoutlen' オプションで指定された時間)のみ待ちます。その後、'q' はそのまま解釈されると仮定します。ゆっくりと入力する場合、またはシステムが遅い場合は、'timeout' オプションをリセットします。その後、'ttimeout' オプションを設定することをお勧めします。
map-precedence
バッファローカルマッピング(`:map-<buffer>` を使用して定義)は、グローバルマッピングよりも優先されます。バッファローカルマッピングがグローバルマッピングと同じである場合、Vim はバッファローカルマッピングを使用します。さらに、`<nowait>` で定義された完全なマッピングは、より長いマッピングに同じプレフィックスがあっても、すぐに使用されます。たとえば、次の2つのマッピングがあるとします。
:map <buffer> <nowait> \a   :echo "Local \a"<CR>
:map                   \abc :echo "Global \abc"<CR>
\a と入力すると、バッファローカルマッピングがすぐに使用されます。Vim は、ユーザーが \abc と入力する可能性があるかどうかを確認するために、さらに文字を待ちません。
map-keys-fails
キーコードが認識されない状況があります。
Vim はキーコードの一部のみを読み取ることができます。ほとんどの場合、最初の文字だけです。これは、一部の Unix バージョンで xterm で発生します。
キーコードは、マッピングされている文字の後ろにあります。例:「<F1><F1>」または「g<F1>」。
その結果、この状況ではキーコードが認識されず、マッピングが失敗します。この問題を回避するには、2つの対策が必要です。
'cpoptions' から 'K' フラグを削除します。これにより、Vim はファンクションキーの残りの文字を待ちます。
`<F1>` から `<F4>` を使用する場合、生成される実際のキーコードは `<xF1>` から `<xF4>` に対応する場合があります。`<xF1>` から `<F1>`、`<xF2>` から `<F2>` などへのマッピングがありますが、これらは別の半分のマッピングの後では認識されません。`<F1>` から `<F4>` のキーコードが正しいことを確認してください。
:set <F1>=<type CTRL-V><type F1>
`<F1>` を4文字で入力します。「=」の後の部分は、実際のキーで実行する必要があり、文字通りのテキストでは実行できません。別の解決策として、2番目の特殊キーのマッピングに実際のキーコードを使用する方法があります。
:map <F1><Esc>OP :echo "yes"<CR>
実際の `<Esc>` を入力しないでください。Vim はキーコードを認識し、`<F1>` に置き換えます。
recursive_mapping
`{lhs}` を `{rhs}` に含める場合、再帰的なマッピングになります。`{lhs}` が入力されると、`{rhs}` に置き換えられます。`{rhs}` に含まれる `{lhs}` が見つかった場合、`{rhs}` に置き換えられ、以降も同様です。これにより、コマンドを無限に繰り返すことができます。唯一の問題は、これ停止させる唯一の方法はエラーを起こすことだけです。迷路を解くためのマクロはこれを使用しています。例を参照してください。1つの例外があります。`{rhs}` が `{lhs}` で始まる場合、最初の文字は再度マッピングされません(これは Vi と互換性があります)。たとえば
:map ab abcd
"a" コマンドを実行し、テキストに "bcd" を挿入します。`{rhs}` の "ab" は再度マッピングされません。
2つのキーの意味を交換したい場合は、`:noremap` コマンドを使用する必要があります。たとえば
:noremap k j
:noremap j k
これにより、カーソルの上下コマンドが交換されます。
通常の`:map`コマンドでは、テキストが`{lhs}`の一部ではないと判明するまでマッピングが行われます。例えば、以下のように使用した場合
:map x y
:map y x
Vimはxをyに、次にyをxなどに置き換えます。これが'maxmapdepth'回(デフォルトは1000回)行われると、Vimは「再帰的マッピング」というエラーメッセージを表示します。
:map-undo
マッピングされたシーケンスの中にundoコマンドを含めると、マクロを実行する前の状態にテキストが戻ります。これは、マッピングされたシーケンスにundoコマンドが1つだけ存在する場合、元のViと互換性があります(マッピングされたシーケンスにundoコマンドが2つあることは、元のViでは意味がなく、最初のundoコマンドを実行する前のテキストに戻ります)。

1.10 ALTキーのマッピング :map-alt-keys

読みやすいマッピングコマンドのために、`<A-k>`形式を使用できます。`<A-k>`と`<A-K>`は異なり、後者は大文字を使用します。実際、`<A-K>`と`<A-S-K>`は同じです。"A"の代わりに"M"を使用することもできます。実際のMeta修飾キーをお持ちの場合は、:map-meta-keysを参照してください。
GUIのNvimはALTキー自体を処理するため、ALTキーを使用したキーマッピングは常に機能します。しかし、ターミナルでは、Nvimはバイトシーケンスを取得し、ALTキーが押されたかどうかを判断する必要があります。ターミナルは、ALTキーが押されたことを示すためにESCを使用する場合があります。'ttimeoutlen'ミリ秒以内にESCの後に`{key}`が続く場合、ESCは<ALT-{key}>として解釈されます。そうでない場合は、2つのキー入力`<ESC>` `{key}`として解釈されます。

1.11 METAキーのマッピング :map-meta-keys

Meta修飾キーを使用したキーのマッピングは、Altキーを使用する場合と非常によく似ています。キーボードでMeta修飾キーを生成するキーは、キーボードと構成によって異なります。
`<M-a>`のマッピングは実際にはAltキーを使用するためです。これは混乱を招く可能性があります!これは変更できません。後方互換性がなくなります。
Meta修飾子には「T」文字が使用されます。例えば、挿入モードでMeta-bをマッピングするには
:imap <T-b> terrible
1.12 SUPERキーまたはCOMMANDキーのマッピング :map-super-keys :map-cmd-key
Super/Command修飾子は、ターミナルまたはGUIがサポートしている場合に使用できます。「D」文字がSuper/Command修飾子に使用されます。
例えば、挿入モードでCommand-bをマッピングするには
:imap <D-b> barritone

1.13 演算子のマッピング :map-operator

演算子は`{motion}`コマンドの前に使用されます。独自の演算子を定義するには、まず'operatorfunc'オプションを設定し、次にg@演算子を呼び出すマッピングを作成する必要があります。ユーザーが`{motion}`コマンドを入力すると、指定された関数が呼び出されます。
g@ E774 E775 g@{motion} 'operatorfunc'オプションで設定された関数を呼び出します。`{motion}`によって移動されたテキストの先頭に'[マークが、テキストの最後の文字に']マークが配置されます。関数は、1つの文字列引数で呼び出されます。「line」`{motion}`は行単位でした。「char」`{motion}`は文字単位でした。「block」`{motion}`はブロック単位のビジュアルでした。型は強制できます。強制モーションを参照してください。
`<F4>`でスペースの数を数える例を以下に示します。
nnoremap <expr> <F4> CountSpaces()
xnoremap <expr> <F4> CountSpaces()
" doubling <F4> works on a line
nnoremap <expr> <F4><F4> CountSpaces() .. '_'
function CountSpaces(context = {}, type = '') abort
  if a:type == ''
    let context = #{
      \ dot_command: v:false,
      \ extend_block: '',
      \ virtualedit: [&l:virtualedit, &g:virtualedit],
      \ }
    let &operatorfunc = function('CountSpaces', [context])
    set virtualedit=block
    return 'g@'
  endif
  let save = #{
    \ clipboard: &clipboard,
    \ selection: &selection,
    \ virtualedit: [&l:virtualedit, &g:virtualedit],
    \ register: getreginfo('"'),
    \ visual_marks: [getpos("'<"), getpos("'>")],
    \ }
  try
    set clipboard= selection=inclusive virtualedit=
    let commands = #{
      \ line: "'[V']",
      \ char: "`[v`]",
      \ block: "`[\<C-V>`]",
      \ }[a:type]
    let [_, _, col, off] = getpos("']")
    if off != 0
      let vcol = getline("'[")->strpart(0, col + off)->strdisplaywidth()
      if vcol >= [line("'["), '$']->virtcol() - 1
        let a:context.extend_block = '$'
      else
        let a:context.extend_block = vcol .. '|'
      endif
    endif
    if a:context.extend_block != ''
      let commands ..= 'oO' .. a:context.extend_block
    endif
    let commands ..= 'y'
    execute 'silent noautocmd keepjumps normal! ' .. commands
    echomsg getreg('"')->count(' ')
  finally
    call setreg('"', save.register)
    call setpos("'<", save.visual_marks[0])
    call setpos("'>", save.visual_marks[1])
    let &clipboard = save.clipboard
    let &selection = save.selection
    let [&l:virtualedit, &g:virtualedit] = get(a:context.dot_command ? save : a:context, 'virtualedit')
    let a:context.dot_command = v:true
  endtry
endfunction
`<expr>`マッピングは、任意の接頭辞付きの数とレジスタを取得できるようにするために使用されます。これにより、コマンドラインを使用する必要がなくなり、CmdlineEnterとCmdlineLeaveのautocommandがトリガーされるのを回避できます。
`['から']'までのマークを使用してVisualモードを使用することで、正確なテキストを正確にヤンクできるように、'selection'オプションが一時的に「inclusive」に設定されていることに注意してください。
また、その値に`unnamed`または`unnamedplus`項目が含まれている場合、`"*`または`"+`レジスタを上書きすることを避けるために、'clipboard'オプションが一時的に空になっていることにも注意してください。
`mode()`関数は、演算子を適用した後の状態を返します。
現在の行のテキストの周囲に引用符を追加するノーマルモード演算子を作成するためにラムダ関数を使用する例を以下に示します。
nnoremap <F4> <Cmd>let &opfunc='{t ->
                        \ getline(".")
                        \ ->split("\\zs")
                        \ ->insert("\"", col("'']"))
                        \ ->insert("\"", col("''[") - 1)
                        \ ->join("")
                        \ ->setline(".")}'<CR>g@

2. 略語 abbreviation abbreviations Abbreviations

略語は、挿入モード、置換モード、コマンドラインモードで使用されます。略語である単語を入力すると、その単語に相当する単語に置き換えられます。これは、頻繁に使用される長い単語の入力を節約するために使用できます。また、明白なスペルミスを自動的に修正するために使用できます。例
:iab ms Microsoft :iab tihs this
略語には3つの種類があります。
full-id 「full-id」型は、キーワード文字(文字と'iskeyword'オプションの文字)のみで構成されます。これは最も一般的な略語です。
例:「foo」、「g3」、「-1」
end-id 「end-id」型はキーワード文字で終わりますが、他のすべての文字はキーワード文字ではありません。
例:「#i」、「..f」、「$/7」
non-id 「non-id」型はキーワード以外の文字で終わります。他の文字は、スペースとタブを除く任意の種類の文字にすることができます。
例:「def#」、「4/7$」
略語にすることができない文字列の例:「a.b」、「#def」、「a b」、「_$r」
略語は、キーワード以外の文字を入力した場合にのみ認識されます。これは、挿入モードを終了する`<Esc>`や、コマンドを終了する`<CR>`の場合もあります。略語を終了するキーワード以外の文字は、展開された略語の後に挿入されます。例外は`<C-]>`文字で、追加の文字を挿入せずに略語を展開するために使用されます。
:ab hh        hello
"hh<Space>"は"hello<Space>"に展開されます。"hh<C-]>"は"hello"に展開されます。
カーソル前の文字は、略語と一致する必要があります。各タイプには追加のルールがあります。
full-id 一致の前にキーワード以外の文字があるか、行または挿入の開始位置です。例外:略語が1文字のみの場合、スペースまたはタブ以外のキーワード以外の文字の前にある場合は認識されません。ただし、コマンドラインでは、"'<,'>"(またはその他のマーク)は、コマンドラインがその後に始まるかのように無視されます。
end-id 一致の前にキーワード文字、スペース、タブがあるか、行または挿入の開始位置です。
non-id 一致の前にスペース、タブ、行または挿入の開始位置があります。
例:(`{CURSOR}`はキーワード以外の文字を入力する場所です)
:ab foo   four old otters
" foo{CURSOR}"は" four old otters"に展開されます。" foobar{CURSOR}"は展開されません。"barfoo{CURSOR}"は展開されません。
:ab #i #include
"#i{CURSOR}"は"#include"に展開されます。">#i{CURSOR}"は展開されません。
:ab ;; <endofline>
"test;;"は展開されません。"test ;;"は"test `<endofline>`"に展開されます。
挿入モードで略語を回避するには:略語をトリガーする文字の前に`CTRL-V`を入力します。例:`CTRL-V` `<Space>`。または、略語の一部を入力し、`<Esc>`で挿入モードを終了し、「a」で挿入モードを再入力して残りを入力します。
コマンドラインモードで略語を回避するには:略語のどこかで`CTRL-V`を2回入力して、置き換えられないようにします。通常文字の前にある`CTRL-V`は、それ以外の場合はほとんど無視されます。
略語の後にカーソルを移動することができます。
:iab if if ()<Left>
さらに複雑なこともできます。たとえば、略語の後にタイプされたスペースを消費するには
func Eatchar(pat)
   let c = nr2char(getchar(0))
   return (c =~ a:pat) ? '' : c
endfunc
iabbr <silent> if if ()<Left><C-R>=Eatchar('\s')<CR>
デフォルトの略語はありません。
略語は再帰的ではありません。":ab f f-o-o"を問題なく使用できます。ただし、略語をマッピングできます。
:abbreviate-local :abbreviate-<buffer> マッピングと同様に、略語はバッファにローカルにすることができます。これは主にfiletype-pluginファイルで使用されます。Cプラグインファイルの例
:abb <buffer> FF  for (i = 0; i < ; ++i)
:ab :abbreviate :ab[breviate] すべての略語を一覧表示します。最初の列の文字は、略語が使用されるモードを示します。'i'は挿入モード、'c'はコマンドラインモード、'!'は両方です。これらはマッピングと同じです。map-listingを参照してください。
:abbreviate-verbose
'verbose'が0より大きい場合、略語を一覧表示すると、最後に定義された場所も表示されます。例
:verbose abbreviate
!  teh                 the
        Last set from /home/abcd/vim/abbr.vim
詳細は :verbose-cmd を参照してください。
:ab[breviate] `{lhs}` `{lhs}`で始まる略語を一覧表示します。入力された`{lhs}`が展開されないようにするには、`CTRL-V`を挿入する必要がある場合があります(2回入力します)。これは、コマンドラインの略語がここで適用されるためです。
:ab[breviate] [`<expr>`] [`<buffer>`] `{lhs}` `{rhs}` `{lhs}`を`{rhs}`に追加します。`{lhs}`が既に存在する場合は、新しい`{rhs}`に置き換えられます。`{rhs}`にはスペースを含めることができます。オプションの`<expr>`引数については、:map-<expr>を参照してください。オプションの`<buffer>`引数については、:map-<buffer>を参照してください。
:una :unabbreviate :una[bbreviate] [`<buffer>`] `{lhs}` リストから`{lhs}`の略語を削除します。見つからない場合は、`{lhs}`が`{rhs}`と一致する略語を削除します。これは、展開後でも略語を削除できるようにするためです。展開を回避するには、`CTRL-V`を挿入します(2回入力します)。
:norea :noreabbrev :norea[bbrev] [`<expr>`] [`<buffer>`] [lhs] [rhs] ":ab"と同じですが、この`{rhs}`については再マッピングされません。
:ca :cab :cabbrev :ca[bbrev] [`<expr>`] [`<buffer>`] [lhs] [rhs] ":ab"と同じですが、コマンドラインモードのみです。
:cuna :cunabbrev :cuna[bbrev] [`<buffer>`] `{lhs}` ":una"と同じですが、コマンドラインモードのみです。
:cnorea :cnoreabbrev :cnorea[bbrev] [`<expr>`] [`<buffer>`] [lhs] [rhs] ":ab"と同じですが、コマンドラインモードのみで、この`{rhs}`については再マッピングされません。
:ia :iabbrev :ia[bbrev] [<expr>] [<buffer>] [lhs] [rhs] ":ab" と同じですが、挿入モード専用です。
:iuna :iunabbrev :iuna[bbrev] [<buffer>] {lhs} ":una" と同じですが、挿入モード専用です。
:inorea :inoreabbrev :inorea[bbrev] [<expr>] [<buffer>] [lhs] [rhs] ":ab" と同じですが、挿入モード専用で、この{rhs}のマッピングは行われません。
:abc :abclear :abc[lear] [<buffer>] すべての略語を削除します。
:iabc :iabclear :iabc[lear] [<buffer>] 挿入モードのすべての略語を削除します。
:cabc :cabclear :cabc[lear] [<buffer>] コマンドラインモードのすべての略語を削除します。
CTRL-Vの使用
略語のrhsには特殊文字を使用できます。ほとんどの非表示文字の特別な意味を避けるために、CTRL-Vを使用する必要があります。必要なCTRL-Vの数は、略語の入力方法によって異なります。これはマッピングにも適用されます。ここで例を使用しましょう。
<Esc>文字を入力するために "esc" を略語にしたいとします。Vimで":ab"コマンドを入力する際には、次のように入力する必要があります(ここで^VはCTRL-V、^[は<Esc>です)。
入力内容: ab esc ^V^V^V^V^V^[
すべてのキーボード入力は^Vクォート解釈の対象となるため、最初の、3番目、5番目の^V文字は、2番目と4番目の^V、および^[をコマンドラインに入力できるようにするだけです。
表示内容: ab esc ^V^V^[
コマンドラインには^[の前に2つの実際の^Vが含まれています。vimrcファイルにこのように記述することもできます。最初の^Vは2番目の^Vを引用符で囲むためです。:abコマンドは^Vを独自の引用符文字として使用するため、引用符で囲まれた空白または|文字を略語に含めることができます。:abコマンドは^[文字に対して特別な処理を行わないため、引用符で囲む必要はありません。(ただし、引用符で囲んでも害はありません。そのため、7個[8個ではありません!]の^Vを入力しても機能します。)
保存形式: esc ^V^[
解析後、略語の短縮形("esc")と長縮形(2文字 "^V^[")が略語テーブルに保存されます。引数なしで:abコマンドを指定すると、略語はこのように表示されます。
後で、ユーザーが"esc"と入力したため略語が展開されると、長縮形はキーボード入力と同じ種類の^V解釈の対象となります。そのため、^Vは^[文字が「挿入モード終了」文字として解釈されるのを防ぎます。代わりに、^[がテキストに挿入されます。
展開結果: ^[
[Steve Kirkendallによる例]

3. ローカルマッピングと関数 script-local

複数のVimスクリプトファイルを使用する場合、1つのスクリプトで使用されるマッピングと関数が、他のスクリプトと同じ名前を使用する危険性があります。これを回避するために、それらをスクリプトに対してローカルにすることができます。
<SID> <SNR> E81 文字列"<SID>"は、マッピングまたはメニューで使用できます。これは、同じスクリプト内のマッピングから呼び出したいスクリプトローカル関数がある場合に役立ちます。mapコマンドを実行すると、Vimは"<SID>"を特別なキーコード<SNR>に置き換え、その後ろにスクリプトの一意の番号とアンダースコアを付けます。例
:map <SID>Add
は、"<SNR>23_Add"というマッピングを定義します。
スクリプトで関数を定義する場合、名前の先頭に "s:" を付けることで、スクリプトに対してローカルにすることができます。しかし、マッピングがスクリプトの外側から実行されると、関数がどのスクリプトで定義されたかを知りません。この問題を回避するには、"s:"の代わりに"<SID>"を使用します。マッピングの場合と同じ変換が行われます。これにより、関数への呼び出しをマッピングで定義することが可能になります。
ローカル関数が実行されると、定義されたスクリプトのコンテキストで実行されます。これは、新しく定義する関数とマッピングも"s:"または"<SID>"を使用でき、関数自体が定義されたときと同じ一意の番号が使用されることを意味します。"s:var" ローカルスクリプト変数も使用できます。
autocommandまたはユーザーコマンドを実行すると、定義されたスクリプトのコンテキストで実行されます。これにより、コマンドがローカル関数やローカルマッピングを呼び出すことが可能になります。
<SID>が正しく展開できないコンテキストで値が使用される場合は、expand()関数を使用します。
let &includexpr = expand('<SID>') .. 'My_includeexpr()'
それ以外の場合、スクリプトコンテキストの外で"<SID>"を使用するとエラーになります。
複雑なスクリプトで使用するためにスクリプト番号を取得する必要がある場合は、この関数を使用できます。
func s:ScriptNumber()
  return matchstr(expand('<SID>'), '<SNR>\zs\d\+\ze_')
endfunc
関数をリスト表示したり、マッピングを表示したりする際、"<SNR>"が表示されます。これは、それらが何に定義されているかを調べるのに役立ちます。
:scriptnamesコマンドを使用して、どのスクリプトがソースされ、それらの<SNR>番号がいくつであるかを確認できます。

4. ユーザー定義コマンド user-commands

独自のExコマンドを定義できます。ユーザー定義コマンドは、組み込みコマンドのように動作できます(範囲や引数を持つことができます。引数はファイル名やバッファ名として補完できますなど)。ただし、コマンドが実行されると、通常のExコマンドに変換されてから実行されます。
まずは:ユーザーマニュアルの40.2セクションを参照してください。
E183 E841 user-cmd-ambiguous すべてのユーザー定義コマンドは、組み込みコマンドと混同しないように、大文字で始める必要があります。例外は、これらの組み込みコマンドです。:Next これらはユーザー定義コマンドに使用できません。
ユーザーコマンドの他の文字は大文字、小文字、または数字にすることができます。数字を使用する場合は、数値引数を取る他のコマンドが曖昧になる可能性があることに注意してください。たとえば、コマンド":Cc2"は、引数なしのユーザーコマンド":Cc2"、または引数"2"を持つコマンド":Cc"のいずれかになります。これらの問題を回避するには、コマンド名と引数の間にスペースを入れることをお勧めします。
ユーザー定義コマンドを使用する場合、コマンドを省略できます。ただし、省略形が一意でない場合は、エラーが発生します。さらに、組み込みコマンドは常に優先されます。
:command Rename ...
:command Renumber ...
:Rena                                " Means "Rename"
:Renu                                " Means "Renumber"
:Ren                                " Error - ambiguous
:command Paste ...
スクリプトでは、ユーザー定義コマンドの完全な名前を使用することをお勧めします。
:com[mand] :com :command すべてのユーザー定義コマンドをリストします。コマンドをリスト表示する際、最初の列の文字は次のとおりです。! コマンドに-bang属性があります " コマンドに-register属性があります | コマンドに-bar属性があります b コマンドは現在バッファに対してローカルです(属性の詳細については後述)リストは、:filterを使用してコマンド名でフィルタリングできます。たとえば、名前に"Pyth"を含むすべてのコマンドをリスト表示します。
filter Pyth command
:com[mand] {cmd} {cmd}で始まるユーザー定義コマンドをリストします。
:command-verbose
'verbose'がゼロ以外の場合、コマンドをリストすると、最後に定義された場所と、すべての補完引数も表示されます。例
:verbose command TOhtml
名前 引数 範囲 補完 定義
TOhtml 0 % :call Convert2HTML(<line1>, <line2>)
最後に設定された場所:/usr/share/vim/vim-7.0/plugin/tohtml.vim
詳細は :verbose-cmd を参照してください。
E174 E182 :com[mand][!] [{attr}...] {cmd} {repl} ユーザーコマンドを定義します。コマンドの名前は{cmd}で、置換テキストは{repl}です。コマンドの属性(下記参照)は{attr}です。コマンドが既に存在する場合はエラーが報告されます。ただし、!を指定した場合は、コマンドが再定義されます。ただし、例外があります。スクリプトを再度ソースする際、そのスクリプトで以前に定義されていたコマンドは、黙って置き換えられます。
:delc[ommand] {cmd} :delc :delcommand E184 ユーザー定義コマンド{cmd}を削除します。
:delc[ommand] -buffer {cmd} E1237
現在バッファに対して定義されたユーザー定義コマンド{cmd}を削除します。
:comc[lear] :comc :comclear すべてのユーザー定義コマンドを削除します。
コマンド属性
command-attributes
ユーザー定義コマンドは、Nvimで他のExコマンドと同じように扱われます。引数を持つことも、範囲を指定することもできます。引数は、ファイル名、バッファなどとして補完できます。これがどのように機能するかは、コマンドの属性(コマンドの定義時に指定されます)によって異なります。
スクリプトでユーザーコマンドを定義する場合、スクリプトに対してローカルな関数を呼び出し、スクリプトに対してローカルなマッピングを使用できます。ユーザーがユーザーコマンドを呼び出すと、定義されたスクリプトのコンテキストで実行されます。<SID>がコマンドで使用されている場合は、これが重要です。
多数の属性があり、引数の処理、補完の動作、範囲の処理、特殊なケースの4つのカテゴリに分類されます。属性は、カテゴリ別に以下で説明されています。
引数の処理
E175 E176 :command-nargs デフォルトでは、ユーザー定義コマンドは引数を取りません(引数が指定されている場合はエラーが報告されます)。ただし、-nargs属性を使用して、コマンドが引数を取ることができるように指定できます。有効なケースは次のとおりです。
-nargs=0 引数は許可されません(デフォルト)-nargs=1 正確に1つの引数が必要です。スペースを含みます-nargs=* 任意の数の引数が許可されます(0、1、または複数)。空白で区切られます-nargs=? 0個または1個の引数が許可されます-nargs=+ 引数を指定する必要がありますが、任意の数が許可されます
このコンテキストでは、引数は(エスケープされていない)スペースまたはタブで区切られていると見なされます。ただし、引数が1つの場合は、空白は引数の一部になります。
引数は式ではなくテキストとして使用されることに注意してください。「s:var」は、コマンドが定義されたスクリプト(呼び出された場所ではなく!)のスクリプトローカル変数を使用します。例:script1.vim
:let s:error = "None"
:command -nargs=1 Error echoerr <args>
script2.vim
:source script1.vim
:let s:error = "Wrong!"
:Error s:error
script2.vim を実行すると、「None」が出力されます。意図した結果ではありません!関数呼び出しが代替手段となる場合があります。
補完動作
:command-completion E179 E180 E181 :command-complete
デフォルトでは、ユーザー定義コマンドの引数は補完されません。ただし、次の属性のいずれかを指定することで、引数の補完を有効にできます。
-complete=arglist 引数リスト内のファイル名 -complete=augroup autocmd グループ -complete=breakpoint :breakadd サブオプション -complete=buffer バッファ名 -complete=color カラースキーム -complete=command Exコマンド(および引数) -complete=compiler コンパイラ -complete=diff_buffer diff バッファ名 -complete=dir ディレクトリ名 -complete=dir_in_path 'cdpath' 内のディレクトリ名 -complete=environment 環境変数名 -complete=event autocommand イベント -complete=expression Vim 式 -complete=file ファイル名とディレクトリ名 -complete=file_in_path 'path' 内のファイル名とディレクトリ名 -complete=filetype ファイルタイプ名 'filetype' -complete=function 関数名 -complete=help ヘルプ項目 -complete=highlight ハイライトグループ -complete=history :history サブオプション -complete=keymap キーボードマッピング -complete=locale ローカル名(locale -a の出力として) -complete=lua Lua 式 :lua -complete=mapclear バッファ引数 -complete=mapping マッピング名 -complete=menu メニュー -complete=messages :messages サブオプション -complete=option オプション -complete=packadd オプションパッケージ pack-add 名 -complete=runtime 'runtimepath' 内のファイル名とディレクトリ名 -complete=scriptnames ソースされたスクリプト名 -complete=shellcmd シェルコマンド -complete=shellcmdline 最初はシェルコマンド、その後はファイル名です。:!cmd と同じ動作 -complete=sign :sign サブオプション -complete=syntax シンタックスファイル名 'syntax' -complete=syntime :syntime サブオプション -complete=tag タグ -complete=tag_listfiles タグ、`CTRL-D` を押すとファイル名が表示されます -complete=user ユーザー名 -complete=var ユーザー変数 -complete=custom,{func} ` {func}` で定義されたカスタム補完 -complete=customlist,{func} ` {func}` で定義されたカスタム補完
補完するものが何もない場合(-nargs=0、デフォルト)に補完を指定すると、エラー E1208 が発生します。**注:** 一部の補完方法は環境変数を展開する場合があります。
カスタム補完
:command-completion-custom
:command-completion-customlist E467 E468 「custom,`{func}`」または「customlist,`{func}`」補完引数を使用して、カスタマイズされた補完スキームを定義できます。`{func}` 部分は、次のシグネチャを持つ関数である必要があります。
:function {func}(ArgLead, CmdLine, CursorPos)
関数はこれらの引数をすべて使用する必要はありません。関数は、戻り値として補完候補を提供する必要があります。
「custom」引数の場合は、関数は改行で区切られた文字列で、補完候補を1行ずつ返す必要があります。
「customlist」引数の場合は、関数はVimリストとして補完候補を返す必要があります。リスト内の文字列以外の項目は無視されます。
関数引数は次のとおりです。ArgLead 現在補完されている引数の先頭部分 CmdLine コマンドライン全体 CursorPos その中のカーソル位置(バイトインデックス) 関数はこれらを使用してコンテキストを判断できます。「custom」引数の場合は、(暗黙のパターン) ArgLeadに対して候補をフィルタリングする必要はありません。Vimは関数からの返却後に正規表現エンジンで候補をフィルタリングし、ほとんどの場合、これがより効率的です。'wildoptions' に「fuzzy」が含まれている場合、候補はファジーマッチングを使用してフィルタリングされます。「customlist」引数の場合は、Vimは返された補完候補をフィルタリングせず、ユーザーが提供した関数が候補をフィルタリングする必要があります。
次の例は、Fingerコマンドにユーザー名を表示します。
:com -complete=custom,ListUsers -nargs=1 Finger !finger <args>
:fun ListUsers(A,L,P)
:    return system("cut -d: -f1 /etc/passwd")
:endfun
次の例は、'path' オプションで指定されたディレクトリからファイル名を補完します。
:com -nargs=1 -bang -complete=customlist,EditFileComplete
                    \ EditFile edit<bang> <args>
:fun EditFileComplete(A,L,P)
:    return split(globpath(&path, a:A), "\n")
:endfun
この例は、スペースを含むファイル名では機能しません!
範囲処理
E177 E178 :command-range :command-count デフォルトでは、ユーザー定義コマンドは行番号範囲を受け付けません。ただし、コマンドが行範囲を受け入れる(-range 属性)、または任意の個数値を受け入れる(行番号の位置で-range=N、:split コマンドのように)、または「count」引数として(-count=N、:Next コマンドのように)ことを指定できます。その場合、個数は<count>で利用できます。
可能な属性は次のとおりです。
-range 範囲を許可、デフォルトは現在の行 -range=% 範囲を許可、デフォルトはファイル全体 (1,$) -range=N 行番号の位置で指定される個数(デフォルトN)(:split のように)。行番号をゼロにすることができます。 -count=N 行番号の位置、または最初の引数として指定される個数(デフォルトN)(:Next のように)。 -count -count=0 と同じように動作します。
-range=N と -count=N は相互に排他的です。一方のみを指定する必要があります。
:command-addr
範囲内の特殊文字(`.`、`$`、`%`など)は、デフォルトでは現在の行、最後の行、バッファ全体に対応していますが、引数、(ロードされた)バッファ、ウィンドウ、またはタブページに関連付けることができます。
可能な値は次のとおりです(2列目はリストで使用される省略名です)。-addr=lines 行範囲(-range のデフォルト)-addr=arguments arg 引数の範囲 -addr=buffers buf バッファの範囲(ロードされていないバッファも)-addr=loaded_buffers load ロード済みバッファの範囲 -addr=windows win ウィンドウの範囲 -addr=tabs tab タブページの範囲 -addr=quickfix qf クイックフィックスエントリの範囲 -addr=other ? その他の種類の範囲。「lines」と同様に「.」、「$」、「%」を使用できます(-count のデフォルト)
インクリメンタルプレビュー
:command-preview ` {nvim-api}` コマンドは、プレビューハンドラーを定義することで 'inccommand' (入力中の)プレビューを表示できます(Luaからのみ、nvim_create_user_command() を参照)。
プレビューコールバックが実行される前に、ハイライトの問題を避けるため、Nvim は一時的に 'cursorline''cursorcolumn' を無効にします。
プレビューコールバックは、このシグネチャを持つLua関数である必要があります。
function cmdpreview(opts, ns, buf)
ここで、「opts」はnvim_create_user_command() コールバックに渡されたものと同じ形式で、「ns」はハイライトのプレビュー名前空間ID、「buf」はプレビュールーチンがプレビュー結果を表示するために直接変更するバッファです(「inccommand=split」の場合、または「inccommand=nosplit」の場合はnil)。
コマンドプレビュールーチンは、このプロトコルを実装する必要があります。
1. プレビューに必要なターゲットバッファを変更します(nvim_buf_set_text()nvim_buf_set_lines() を参照)。2. プレビューバッファが提供されている場合、プレビューバッファに必要なテキストを追加します。3. ターゲットバッファに必要なハイライトを追加します。プレビューバッファが提供されている場合、プレビューバッファにも必要なハイライトを追加します。すべてのハイライトは、プレビューコールバックの引数として提供されるプレビュー名前空間に追加する必要があります(nvim_buf_add_highlight()nvim_buf_set_extmark() を参照して、名前空間にハイライトを追加する方法を確認してください)。4. Nvim の動作を制御する整数 (0、1、2) を返します。0: プレビューは表示されません。1: プレビューウィンドウなしでプレビューが表示されます(「inccommand=split」の場合でも)。2: プレビューが表示され、プレビューウィンドウが開きます(「inccommand=split」の場合)。「inccommand=nosplit」の場合、これは 1 と同じです。
プレビューが終了すると、Nvim はプレビュー中に加えられたすべてバッファへの変更を破棄し、プレビュー名前空間のすべてのハイライトをクリアします。
インクリメンタルコマンドプレビューをサポートする、行の末尾の空白をトリミングするコマンドの例を次に示します。
-- If invoked as a preview callback, performs 'inccommand' preview by
-- highlighting trailing whitespace in the current buffer.
local function trim_space_preview(opts, preview_ns, preview_buf)
  vim.cmd('hi clear Whitespace')
  local line1 = opts.line1
  local line2 = opts.line2
  local buf = vim.api.nvim_get_current_buf()
  local lines = vim.api.nvim_buf_get_lines(buf, line1 - 1, line2, false)
  local preview_buf_line = 0
  for i, line in ipairs(lines) do
    local start_idx, end_idx = string.find(line, '%s+$')
    if start_idx then
      -- Highlight the match
      vim.api.nvim_buf_add_highlight(
        buf,
        preview_ns,
        'Substitute',
        line1 + i - 2,
        start_idx - 1,
        end_idx
      )
      -- Add lines and set highlights in the preview buffer
      -- if inccommand=split
      if preview_buf then
        local prefix = string.format('|%d| ', line1 + i - 1)
        vim.api.nvim_buf_set_lines(
          preview_buf,
          preview_buf_line,
          preview_buf_line,
          false,
          { prefix .. line }
        )
        vim.api.nvim_buf_add_highlight(
          preview_buf,
          preview_ns,
          'Substitute',
          preview_buf_line,
          #prefix + start_idx - 1,
          #prefix + end_idx
        )
        preview_buf_line = preview_buf_line + 1
      end
    end
  end
  -- Return the value of the preview type
  return 2
end
-- Trims all trailing whitespace in the current buffer.
local function trim_space(opts)
  local line1 = opts.line1
  local line2 = opts.line2
  local buf = vim.api.nvim_get_current_buf()
  local lines = vim.api.nvim_buf_get_lines(buf, line1 - 1, line2, false)
  local new_lines = {}
  for i, line in ipairs(lines) do
    new_lines[i] = string.gsub(line, '%s+$', '')
  end
  vim.api.nvim_buf_set_lines(buf, line1 - 1, line2, false, new_lines)
end
-- Create the user command
vim.api.nvim_create_user_command(
  'TrimTrailingWhitespace',
  trim_space,
  { nargs = '?', range = '%', addr = 'lines', preview = trim_space_preview }
)
特別なケース
:command-bang :command-bar :command-register :command-buffer :command-keepscript
いくつかの特別なケースもあります。
-bang コマンドは ! 修飾子を受け入れることができます(:q や :w のように)-bar コマンドの後に | と別のコマンドを付けることができます。コマンド引数の内部では | は許可されません。「」を使用してコメントを開始することも確認します。 -register コマンドへの最初の引数は、オプションのレジスタ名にすることができます(:del、:put、:yank のように)。 -buffer コマンドは現在のバッファでのみ使用できます。 -keepscript 詳細メッセージにユーザーコマンドが定義された場所を使用せず、ユーザーコマンドが呼び出された場所を使用します。
-count 属性と -register 属性の場合、オプションの引数が提供されると、引数リストから削除され、置換テキストに個別に使用できます。これらの引数は省略できますが、これは非推奨の機能です。新しいスクリプトには完全な名前を使用してください。
置換テキスト
ユーザー定義コマンドの置換テキスト`{repl}`は、<…>表記法を使用して特別なエスケープシーケンスについてスキャンされます。エスケープシーケンスは入力されたコマンドラインの値に置き換えられ、その他のテキストは変更されずにコピーされます。結果の文字列は Ex コマンドとして実行されます。置換を回避するには、最初の < の代わりに `<lt>` を使用します。したがって、「<bang>」をそのまま含めるには「<lt>bang>」を使用します。
有効なエスケープシーケンスは次のとおりです。
<line1>
<line1> コマンド範囲の開始行。<line2>
<line2> コマンド範囲の最終行。<range>
<range> コマンド範囲内の項目の数:0、1、または 2 <count>
<count> 提供された任意の個数('-range' と '-count' 属性について説明されているとおり)。<bang>
<bang> ('-bang' 属性を参照)コマンドが ! 修飾子付きで実行された場合は ! に展開され、それ以外の場合は何も展開されません。<mods> <q-mods> :command-modifiers <mods> コマンド修飾子が指定されている場合、その修飾子を展開します。指定されていない場合は、何も展開しません。サポートされている修飾子は :aboveleft:belowright:botright:browse:confirm:hide:horizontal:keepalt:keepjumps:keepmarks:keeppatterns:leftabove:lockmarks:noautocmd:noswapfile:rightbelow:sandbox:silent:tab:topleft:unsilent:verbose、および :vertical です。:filter はサポートされていないことに注意してください。例
command! -nargs=+ -complete=file MyEdit
            \ for f in expand(<q-args>, 0, 1) |
            \ exe '<mods> split ' .. f |
            \ endfor
function! SpecialEdit(files, mods)
    for f in expand(a:files, 0, 1)
        exe a:mods .. ' split ' .. f
    endfor
endfunction
command! -nargs=+ -complete=file Sedit
            \ call SpecialEdit(<q-args>, <q-mods>)
<reg> <register> <reg> ('-register' 属性を参照)指定されている場合はオプションのレジスタを、指定されていない場合は何も展開しません。<register> はこれの同義語です。<args>
<args> コマンド引数を、提供されたとおりにそのまま展開します(ただし、上記のように、カウントやレジスタによっては引数の一部が消費される場合があり、その場合は<args>の一部にはなりません)。<lt> 単一の '<'(小なり)文字。これらのエスケープシーケンスのリテラルコピーを取得する場合(たとえば、<bang>を取得する場合)に必要です。この場合は<lt>bang>を使用します。
<q-args>
エスケープシーケンスの先頭2文字が "q-" の場合(例:<q-args>)、その値は式で使用できる有効な値となるように引用符で囲まれます。引数を1つの値として使用します。引数がない場合、<q-args> は空文字列です。q-args-example を以下で参照してください。<f-args>
コマンドがその引数をユーザー定義関数に渡せるように、特別な形式<f-args>(「関数引数」)があります。これは、コマンド引数をスペースとタブで分割し、各引数を個別に引用符で囲み、<f-args> シーケンスは、引用符で囲まれた引数のコンマ区切りリストで置き換えられます。以下の Mycmd の例を参照してください。引数が指定されていない場合、<f-args> は削除されます。<f-args> の引数に空白文字を埋め込むには、バックスラッシュを前に付けます。<f-args> は、バックスラッシュのペア(\\)を1つのバックスラッシュに置き換えます。バックスラッシュの後に空白文字またはバックスラッシュ以外の文字が続く場合、変更されません。また、f-args-example も以下で参照してください。概要
コマンド <f-args>
XX ab "ab" XX a\b 'a\b' XX a\ b 'a b' XX a\ b 'a ', 'b' XX a\\b 'a\b' XX a\\ b 'a\', 'b' XX a\\\b 'a\\b' XX a\\\ b 'a\ b' XX a\\\\b 'a\\b' XX a\\\\ b 'a\\', 'b' XX [なし]
「引数なし」の状況を処理する必要がある場合は、引数なしで関数を呼び出せるようにする必要があります。
ユーザーコマンドの例
" Delete everything after here to the end
:com Ddel +,$d
" Rename the current buffer
:com -nargs=1 -bang -complete=file Ren f <args>|w<bang>
" Replace a range with the contents of a file
" (Enter this all as one line)
:com -range -nargs=1 -complete=file
      Replace <line1>-pu_|<line1>,<line2>d|r <args>|<line1>d
" Count the number of lines in the range
:com! -range -nargs=0 Lines  echo <line2> - <line1> + 1 "lines"
f-args-example
ユーザー関数の呼び出し(<f-args>の例)
:com -nargs=* Mycmd call Myfunc(<f-args>)
次のように実行された場合
:Mycmd arg1 arg2
これは次を呼び出します
:call Myfunc("arg1","arg2")
q-args-example
より実質的な例
:function Allargs(command)
:   let i = 0
:   while i < argc()
:          if filereadable(argv(i))
:             execute "e " .. argv(i)
:             execute a:command
:      endif
:      let i = i + 1
:   endwhile
:endfunction
:command -nargs=+ -complete=command Allargs call Allargs(<q-args>)
Allargs コマンドは、Vim コマンドを任意の数引数として受け取り、引数リスト内のすべてのファイルに対して実行します。使用例(エラーを無視する「e」フラグと、変更されたバッファを書き込む「update」コマンドの使用に注意してください)
:Allargs %s/foo/bar/ge|update
これは次を呼び出します
:call Allargs("%s/foo/bar/ge|update")
メイン
コマンド索引
クイックリファレンス