変更
Nvim :help
ページは、ソース から tree-sitter-vimdoc パーサーを使用して 生成 されています。
このファイルでは、テキストを削除または変更するコマンドについて説明します。このコンテキストでは、テキストの変更とは、1つのコマンドを使用してテキストを削除し、他のテキストに置き換えることを意味します。 これらのコマンドはすべて元に戻すことができます。 非 Ex コマンドは "." コマンドで繰り返すことができます。
["x]<Del> または
<Del> x dl ["x]x カーソルの下および後の [カウント] 文字を [レジスタ x に] 削除します(
行単位ではありません)。 "dl" と同じ動作をします。
<Del>
キーは [カウント] を取りません。代わりに、カウントの最後の文字を削除します。改行の削除(行の結合)については、
'whichwrap' を参照してください。
X dh ["x]X カーソルの前の [カウント] 文字を [レジスタ x に] 削除します(
行単位ではありません)。 "dh" と同じ動作をします。
'whichwrap' も参照してください。
d ["x]d{motion}
{motion}
が移動したテキストを [レジスタ x に] 削除します。例外については以下を参照してください。
dd ["x]dd [カウント] 行を [レジスタ x に]
行単位で削除します。
D ["x]D カーソル位置から行末まで、さらに [カウント] - 1 行を [レジスタ x に] 削除します。 "d$" の同義語です。(
行単位ではありません)
{Visual}
["x]x または
v_x v_d v_<Del> {Visual}
["x]d または
{Visual}
["x]<Del> 強調表示されたテキストを [レジスタ x に] 削除します (
{Visual}
については
ビジュアルモード を参照)。
{Visual}
["x]CTRL-H または
v_CTRL-H v_<BS> {Visual}
["x]<BS> 選択モードの場合: 強調表示されたテキストを [レジスタ x に] 削除します。
{Visual}
["x]X または
v_X v_D v_b_D {Visual}
["x]D 強調表示された行を [レジスタ x に] 削除します (
{Visual}
については
ビジュアルモード を参照)。ビジュアルブロックモードでは、"D" は強調表示されたテキストと行末までのすべてのテキストを削除します。
:d :de :del :delete :dl :dp :[range]d[elete] [x] [範囲] の行を [レジスタ x に] 削除します (デフォルト: 現在の行)。 :dl delete and list :dell idem :delel idem :deletl idem :deletel idem :dp delete and print :dep idem :delp idem :delep idem :deletp idem :deletep idem
:[range]d[elete] [x]
{count}
[範囲] から始まる
{count}
行を削除します (デフォルト: 現在の行
cmdline-ranges) [レジスタ x に]。
これらのコマンドはテキストを削除します。 これらは
.
コマンドで繰り返すことができ (
:d
を除く)、元に戻すことができます。 テキストのブロックを削除するには、ビジュアルモードを使用します。 レジスタの説明については、
レジスタ を参照してください。
d{motion} コマンドの例外: モーションが行単位ではなく、モーションの開始と終了が同じ行になく、開始前に空白のみがあり、モーションの終了後に空白以外がない場合、削除は行単位になります。 つまり、削除によって、残ると予想される空白行も削除されます。モーションを文字単位に強制するには、
o_v 演算子を使用します。
空のテキスト領域を削除しようとすると (例: 最初の列で "d0")、
'cpoptions' に 'E' フラグが含まれている場合、エラーになります。
J J 最低2行の[カウント]行を結合します。 インデントを削除し、最大2つのスペースを挿入します(下記参照)。バッファの最後の行にある場合は失敗します。 [カウント] が大きすぎる場合は、使用可能な行数に減らされます。
v_J
{Visual}
J 強調表示された行を結合します。最低2行です。 インデントを削除し、最大2つのスペースを挿入します(下記参照)。
gJ gJ 最低2行の[カウント]行を結合します。 スペースを挿入または削除しないでください。
v_gJ
{Visual}
gJ 強調表示された行を結合します。最低2行です。 スペースを挿入または削除しないでください。
:j :join :[range]j[oin][!] [flags] [範囲] の行を結合します。 "J" と同じですが、[!] を付けると結合でスペースの挿入や削除が行われません。 [範囲] の開始値と終了値が等しい場合、このコマンドは何もしません。 デフォルトの動作では、現在の行と下の行を結合します。 [flags] については、
ex-flags を参照してください。
:[range]j[oin][!]
{count}
[flags] [範囲] から始まる
{count}
行を結合します (デフォルト: 現在の行
cmdline-ranges)。 "J" と同じですが、[!] を付けると結合でスペースの挿入や削除が行われません。 [flags] については、
ex-flags を参照してください。
これらのコマンドは、行間の <EOL>
を削除します。 これにより、複数の行が1行に結合されます。 これらのコマンド (:j
を除く) は繰り返したり、元に戻したりできます。
これらのコマンド ("gJ" を除く) は、末尾に空白がない場合、または次の行が ')' で始まる場合を除き、
<EOL>
の代わりに1つのスペースを挿入します。 これらのコマンド ("gJ" を除く) は、次の行の先頭の空白を削除します。
'joinspaces' オプションがオンの場合、これらのコマンドは '.'、'!'、または '?' の後に2つのスペースを挿入します。
'formatoptions' の 'B' フラグと 'M' フラグは、マルチバイト文字の前後にスペースを挿入する動作を変更します
fo-table。
'[' マークは結合された最初の行の末尾に、']' は結果の行の末尾に設定されます。
R R 置き換えモードに入ります: 入力した各文字は、カーソルの下の文字から始まる既存の文字を置き換えます。 入力したテキストを [カウント] - 1 回繰り返します。 詳細については、
置き換えモード を参照してください。
gR gR 仮想置換モードに入ります: 入力した各文字は、画面スペースの既存の文字を置き換えます。 したがって、
<Tab>
は一度に複数の文字を置き換える場合があります。 入力したテキストを [カウント] - 1 回繰り返します。 詳細については、
仮想置換モード を参照してください。
c ["x]c{motion}
{motion}
テキストを [レジスタ x に] 削除し、挿入を開始します。
'cpoptions' に 'E' フラグが含まれていて、削除するテキストがない場合 (例: カーソルが 'x' の直後にある場合の "cTx")、エラーが発生し、挿入モードは開始されません (これは Vi と互換性があります)。
'cpoptions' に 'E' フラグが含まれていない場合、"c" コマンドは、削除するテキストがなくても常に挿入モードを開始します。
C ["x]C カーソル位置から行末まで、さらに [カウント] - 1 行を [レジスタ x に] 削除し、挿入を開始します。 c$ の同義語です (
行単位ではありません)。
s ["x]s [カウント] 文字を [レジスタ x に] 削除し、挿入を開始します (s は Substitute の略です)。 "cl" の同義語です (
行単位ではありません)。
S ["x]S [カウント] 行を [レジスタ x に] 削除し、挿入を開始します。 "cc" の同義語です
行単位。
{Visual}
["x]c または
v_c v_s {Visual}
["x]s 強調表示されたテキストを [レジスタ x に] 削除し、挿入を開始します (
{Visual}
については
ビジュアルモード を参照)。
v_r
{Visual}
r{char} 選択したすべての文字を
{char}
に置き換えます。
CTRL-C
は文字通り挿入されます。
v_C
{Visual}
["x]C 強調表示された行を [レジスタ x に] 削除し、挿入を開始します。 ビジュアルブロックモードでは、動作が異なります
v_b_C。
v_S
{Visual}
["x]S 強調表示された行を [レジスタ x に] 削除し、挿入を開始します (
{Visual}
については
ビジュアルモード を参照)。
v_R
{Visual}
["x]R 現在
{Visual}
["x]S と同じです。 次のバージョンでは、動作が異なる場合があります。
注記
挿入モードと置換モードは <Esc>
で終了できます。
これらのモードの他の特殊文字については、"挿入モードと置換モード" のセクション
mode-ins-repl を参照してください。
[カウント] の効果は、Vim が挿入モードまたは置換モードを終了した後に発生します。
'cpoptions' オプションに '$' が含まれていて、変更が1行以内にある場合、Vim は削除されるテキストを表示し続け、最後の削除された文字に '$' を配置します。
レジスタの説明については、
レジスタ を参照してください。
置換モードは挿入モードとほぼ同じですが、入力したすべての文字が1文字を削除するという点が異なります。 行末に達すると、Vim はそれ以降の文字を追加します (挿入モードと同様)。 置換モードでは、バックスペースキーは元のテキストを復元します (存在する場合)。 ("挿入モードと置換モード" のセクション
mode-ins-repl を参照)。
cw cW 特殊なケース: カーソルが単語内にある場合、"cw" と "cW" は単語の後の空白を含めず、単語の末尾までのみを変更します。 これは、Vim が "cw" を単語の変更として解釈し、単語には後続の空白が含まれていないためです。
"cw" に単語の後のスペースを含める場合は、次のマッピングを使用します
:map cw dwi
または "caw" を使用します (
aw を参照)。
:c :ch :change :{range}c[hange][!] テキストの行を別のテキストに置き換えます。 置換を停止するには、"." のみの行を入力します。
{range}
がない場合、このコマンドは現在の行のみを変更します。 [!] を追加すると、このコマンドが実行されている間、
'autoindent' が切り替わります。
r r{char} カーソルの下の文字を
{char}
に置き換えます。
{char}
が
<CR>
または
<NL>
の場合、改行がその文字を置き換えます。実際の
<CR>
に置き換えるには、
CTRL-V
<CR>
を使用します。
CTRL-V
<NL>
は
<Nul>
に置き換えます。
{char}
が
CTRL-E
または
CTRL-Y
の場合、
i_CTRL-Eおよび
i_CTRL-Yと同様に、下または上の行の文字が使用されます。これは回数指定でも機能するため、
10r<C-E>
は下の行から10文字をコピーします。
[count]を指定すると、Vimは[count]文字を[count]個の
{char}
に置き換えます。ただし、
{char}
が
<CR>
または
<NL>
の場合は、Vimは1つの
<CR>
のみを挿入します。"5r<CR>"は5文字を1つの改行に置き換えます。
{char}
が
<CR>
または
<NL>
の場合、Vimは自動インデントを実行します。これは、置き換えられる文字を削除してから"i<CR><Esc>"を実行するのと同じように機能します。
{char}
はダイグラフ
digraph-argとして入力できます。
:lmapマッピングは
{char}
に適用されます。挿入モードでの
CTRL-^
コマンドを使用して、これをオン/オフに切り替えることができます
i_CTRL-^。
'encoding'がUnicodeの場合の合成文字の使用については、
utf-8-char-argを参照してください。
gr gr{char} カーソルの下の仮想文字を
{char}
に置き換えます。これはファイル空間ではなく、画面空間で置き換えます。詳細については、
gRおよび
仮想置換モードを参照してください。
rと同様に、回数指定を指定できます。
{char}
は
rと同様に入力できますが、ほとんどの
CTRL-k
キーなど、挿入モードで特別な意味を持つ文字は使用できません。
gr-default Nvimは"gr"をプレフィックスとするデフォルトのマッピングを作成します。これは
grの動作を阻害する可能性があります。組み込みの動作を復元するには、以下を使用してください。
nnoremap <nowait> gr gr
digraph-arg rや
tなどのノーマルモードコマンドの引数は1文字です。
'cpo'に'D'フラグが含まれていない場合、この文字は
ダイグラフのように入力することもできます。最初に
CTRL-K
を入力し、次に2つのダイグラフ文字を入力します。
case 以下のコマンドは文字の大文字小文字を変更します。現在アクティブな
ロケールが使用されます。
:languageを参照してください。ここで重要なのはLC_CTYPEの値です。
~ ~
'notildeop'オプション:カーソルの下の文字の大文字小文字を切り替え、カーソルを右に移動します。[count]が指定されている場合は、その文字数だけ実行します。
~
{motion}
'tildeop'オプション:
{motion}
テキストの大文字小文字を切り替えます。
g~ g~{motion}
{motion}
テキストの大文字小文字を切り替えます。
g~g~
g~g~ g~~ g~~ 現在の行の大文字小文字を切り替えます。
v_~
{Visual}
~ 強調表示されたテキストの大文字小文字を切り替えます(
{Visual}
については
ビジュアルモードを参照)。
v_U
{Visual}
U 強調表示されたテキストを大文字にします(
{Visual}
については
ビジュアルモードを参照)。
gU 大文字 gU{motion}
{motion}
テキストを大文字にします。例:
:map! <C-F> <Esc>gUiw`]a
これは挿入モードで機能します。CTRL-F
を押すと、カーソルの前の単語が大文字になります。小文字で単語を入力してから大文字にするのに便利です。
v_u
{Visual}
u 強調表示されたテキストを小文字にします(
{Visual}
については
ビジュアルモードを参照)。
gu 小文字 gu{motion}
{motion}
テキストを小文字にします。
g? rot13 g?{motion}
{motion}
テキストをRot13エンコードします。
v_g?
{Visual}
g? 強調表示されたテキストをRot13エンコードします(
{Visual}
については
ビジュアルモードを参照)。
g?g?
g?g? g?? g?? 現在の行をRot13エンコードします。
1行をタイトルケースに変換するには、単語の最初の文字をすべて大文字にします。
:s/\v<(.)(\w*)/\u\1\L\2/g
加算と減算
CTRL-A CTRL-A カーソル位置またはその後の数字またはアルファベット文字に[count]を加算します。
v_CTRL-A
{Visual}
CTRL-A
強調表示されたテキスト内の数字またはアルファベット文字に[count]を加算します。
v_g_CTRL-A
{Visual}
g
CTRL-A
強調表示されたテキスト内の数字またはアルファベット文字に[count]を加算します。複数の行が強調表示されている場合、各行は追加の[count]ずつ増加します(そのため、事実上[count]の増分シーケンスが作成されます)。たとえば、次の数字のリストがある場合
1.
1.
1.
1.
2番目の「1.」に移動し、3行を視覚的に選択してg
CTRL-A
を押すと、次のようになります。
1.
2.
3.
4.
CTRL-X CTRL-X カーソル位置またはその後の数字またはアルファベット文字から[count]を減算します。
v_CTRL-X
{Visual}
CTRL-X
強調表示されたテキスト内の数字またはアルファベット文字から[count]を減算します。
v_g_CTRL-X
{Visual}
g
CTRL-X
強調表示されたテキスト内の数字またはアルファベット文字から[count]を減算します。複数の行が強調表示されている場合、各値は追加の[count]ずつ減少します(そのため、事実上[count]の減分シーケンスが作成されます)。
CTRL-A
およびCTRL-X
コマンドは、(符号付き)10進数、符号なし2進数/8進数/16進数、およびアルファベット文字に対して機能します。
これは
'nrformats'オプションに依存します。
'nrformats'に「bin」が含まれている場合、Vimは「0b」または「0B」で始まる数字を2進数と見なします。
'nrformats'に「octal」が含まれている場合、Vimは「0」で始まる数字を8進数と見なします。ただし、数字に「8」または「9」が含まれている場合は除きます。その他の数字は10進数であり、前にマイナス記号が付く場合があります。カーソルが数字の上にある場合、コマンドはその数字に適用されます。それ以外の場合、Vimはカーソルの右側の数字を使用します。
'nrformats'に「hex」が含まれている場合、Vimは「0x」または「0X」で始まる数字を16進数と見なします。数字の右端の文字の大文字小文字は、結果の16進数のcaseを決定します。現在の数字に文字がない場合、Vimは以前に検出されたcaseを使用します。
'nrformats'に「alpha」が含まれている場合、Vimはカーソルの下または後のアルファベット文字を変更します。これは、アルファベット順のインデックスを持つリストを作成するのに便利です。
10進数の場合、先行する負符号は増減に考慮されますが、2進数、8進数、および16進数の値の場合は考慮されません。符号を無視するには、CTRL-A
またはCTRL-X
を使用する前に数字を視覚的に選択します。
先行ゼロを持つ数字(すべての8進数と16進数を含む)の場合、Vimは可能な限り数字の文字数を保持します。「0077」に対する
CTRL-A
は「0100」になり、「0x100」に対する
CTRL-X
は「0x0ff」になります。例外が1つあります。ゼロで始まる数字が8進数ではない(「8」または「9」が含まれている)ことが判明したが、
'nrformats'に「octal」が含まれている場合、結果が8進数として認識されるのを避けるために先行ゼロが削除されます。
'nrformats'に「octal」が含まれている場合、先行ゼロを持つ10進数は、8進数と混同される可能性があるため、誤りを招くことに注意してください。
同様に、
'nrformats'に「bin」と「hex」の両方が含まれている場合、先行する「0x」または「0X」を持つ2進数は、 '0b'は有効な16進数であるため、2進数ではなく16進数として解釈される可能性があります。「0x0b11」の`CTRL-A`は「0x0b100」ではなく「0x0b12」になります。
'nrformats'に「bin」が含まれていて「hex」が含まれていない場合、「0x0b11」の「0b11」の`CTRL-A`は「0x0b100」になります。
カーソルの下の数字が大きすぎて64ビットに収まらない場合、表現できる最も近い数字に丸められ、加算/減算はスキップされます。たとえば、18446744073709551616に対するCTRL-X
は18446744073709551615になります。18446744073709551618などのより大きな数字の場合も同じです。
CTRL-A
コマンドはマクロで非常に便利です。例:番号付きリストを作成するには、次の手順を使用します。
1.最初のリストエントリを作成し、数字で始まることを確認します。 2. qa - レジスタ 'a'への記録を開始します 3. Y - エントリをヤンクします 4. p - エントリのコピーを最初のエントリの下に配置します 5. CTRL-A
- 番号を増やします 6. q - 記録を停止します 7. <count>
@a - ヤンク、配置、および増分を<count>
回繰り返します
:[range]le[ft] [indent] [range]の行を左揃えにします。行のインデントを[indent](デフォルトは0)に設定します。
">" および "<" コマンドは、プログラム内のインデントを変更するのに便利です。これらのコマンドで挿入または削除する空白のサイズは、
'shiftwidth' オプションで設定します。通常、
'shiftwidth' オプションは8ですが、例えば3に設定してインデントを小さくすることもできます。左へのシフトは、インデントがない場合に停止します。右へのシフトは、空行には影響しません。
'expandtab' オプションがオフの場合(デフォルト)、Vimはインデントを作成するために可能な限り
<Tab>
を使用します。">><<" を使用すると、スペースで構成されたインデントを、
<Tab>
(および必要に応じていくつかのスペース)で構成された同じインデントに置き換えることができます。
'expandtab' オプションがオンの場合、Vimはスペースのみを使用します。この場合、">><<" を使用してインデント内の
<Tab>
をスペースに置き換えることができます(または
:retab!
を使用します)。
行を複数の
'shiftwidth' 分移動するには、ビジュアルモードまたは
:
コマンドを使用します。例えば
Vjj4> move three lines 4 indents to the right
:<<< move current line 3 indents to the left
:>> 5 move 5 lines 2 indents to the right
:5>> move line 5 2 indents to the right
フィルターとは、標準入力からテキストを受け取り、何らかの方法で変更し、標準出力に送信するプログラムです。以下のコマンドを使用して、フィルターを介してテキストを送信し、フィルター出力に置き換えることができます。フィルターの例としては、行をアルファベット順にソートする "sort" や、Cプログラムファイルをフォーマットする "indent" などがあります(フィルターのように動作するバージョンのindentが必要です。すべてのバージョンがそうとは限りません)。
'shell' オプションは、Vimがフィルターコマンドを実行するために使用するシェルを指定します。フィルターコマンドは "." で繰り返すことができます。Vimは
:!
コマンドの後にコメント('"'で始まる)を認識しません。
! !{motion}{filter}
{motion}
で指定されたテキスト行を外部プログラム
{filter}
でフィルター処理します。
!! !!{filter} [count]行を外部プログラム
{filter}
でフィルター処理します。
v_!
{Visual}
!{filter} 強調表示された行を外部プログラム
{filter}
でフィルター処理します (
{Visual}
については
ビジュアルモード を参照)。
:{range}![!]{filter} [!][arg]
:range!{range}
で指定された行を外部プログラム
{filter}
でフィルター処理します。Vimはオプションの感嘆符を最後に指定されたコマンドに置き換え、オプションの [arg] を追加します。Vimはフィルターコマンドの出力を一時ファイルに保存し、そのファイルをバッファに読み込みます
一時ファイル。Vimは
'shellredir' オプションを使用して、フィルター出力を一時ファイルにリダイレクトします。ただし、
'shelltemp' オプションがオフの場合、可能な場合はパイプが使用されます(Unixの場合)。
'cpoptions' に 'R' フラグが含まれている場合、フィルター処理された行のマークは、
:keepmarks コマンドが使用されない限り削除されます。例
:keepmarks '<,'>!sort
フィルタリング後の行数がフィルタリング前よりも少ない場合、不足している行のマークは comunque 削除されます。
== == ={motion} と同様に [count] 行をフィルター処理します。
v_=
{Visual}
= ={motion} と同様に、強調表示された行をフィルター処理します。
Nvim一時ディレクトリは、最初に利用可能なシステム一時ディレクトリに作成されます。Unix:$TMPDIR、/ tmp、カレントディレクトリ、$ HOME。 Windows:$ TMPDIR、$ TMP、$ TEMP、$ USERPROFILE、カレントディレクトリ。
unixでは、セキュリティの問題(シンボリックリンク攻撃など)を回避するために、一時ディレクトリは権限0700(現在のユーザーのみがアクセス可能)で作成されます。終了時に、Nvimは一時ディレクトリとその内容を削除します。
E5431エラーまたは
ログメッセージが表示された場合
E5431: tempdir disappeared (2 times)
これは、システム上の外部プロセスがNvim一時ディレクトリを削除したことを意味します。通常、これは「アンチウイルス」または誤って設定されたクリーンアップサービスによって発生します。
Nvimにsetuidビットが設定されている場合、問題が発生する可能性があります。一時ファイルはsetuidユーザーが所有していますが、フィルターコマンドはおそらく元のユーザーとして実行されます。
4.2 置換
:substitute
:s :su :[range]s[ubstitute]/{pattern}/{string}/[flags] [count] [range]内の各行について、
{pattern}
のマッチを
{string}
に置き換えます。
{pattern}
については
パターンを参照してください。
{string}
はリテラル文字列、または特別な何かを指定できます。
sub-replace-specialを参照してください。[range]と[count]が省略されている場合、現在の行のみを置き換えます。[count]が指定されている場合、[range]の最後の行から始まる[count]行を置き換えます。[range]が省略されている場合、現在の行から開始します。
E939 E1510 [count]は正の数である必要があります(最大2147483647)
cmdline-rangesも参照してください。
:[range]s[ubstitute] [flags] [count] :[range]&[&][flags] [count]
:&最後の:substituteを同じ検索パターンと置換文字列で繰り返しますが、同じフラグは使用しません。[flags]を追加できます。
:s_flagsを参照してください。
:substitute
の後では '&' フラグを使用できないことに注意してください。これはパターンの区切り文字として認識されます。
:substitute
と 'c'、 'g'、 'i'、 'I'、 'r' フラグの間のスペースは必須ではありませんが、スクリプトでは混乱を避けるためにスペースを設けることをお勧めします。以下の:substituteを繰り返す2文字および3文字のコマンドも参照してください
:substitute-repeat。
:[range]~[&][flags] [count]
:~最後の置換を同じ置換文字列で繰り返しますが、最後に使用した検索パターンを使用します。これは
:&r
に似ています。[flags]については
:s_flagsを参照してください。
& &
:s
の同義語(最後の置換を繰り返す)。フラグは記憶されないため、実際には動作が異なる場合があることに注意してください。フラグを保持するには、
:&&
を使用できます。
g& g&
:%s//~/&
の同義語(最後の置換を、すべての行で最後の検索パターンを使用して、同じフラグで繰り返す)。たとえば、最初に
:s/pattern/repl/flags
で置換を実行し、次に
/search
で何か他のものを検索すると、
g&
は
:%s/search/repl/flags
を実行します。ニーモニック:グローバル置換。
:&& [&] 最初にしなければならない:前の置換コマンドからフラグを保持します。例
:&&
:s/this/that/&
:s
と:&
はフラグを保持しないことに注意してください。
[c] 各置換を確認します。Vimは一致する文字列を強調表示します(
hl-IncSearchを使用)。次のように入力できます。
:s_c'y' このマッチを置換する 'l' このマッチを置換して終了する(「最後」) 'n' このマッチをスキップする
<Esc>
置換を終了する 'a' これと残りのすべてのマッチを置換する 'q' 置換を終了する
CTRL-E
画面を上にスクロールする
CTRL-Y
画面を下にスクロールする
:s_e [e] 検索パターンが失敗した場合、エラーメッセージを発行せず、特に、エラーが発生しなかったかのようにマップを続行します。これは、「一致しません」エラーがマッピングを壊さないようにするために最も役立ちます。ただし、Vimは次のエラーメッセージを抑制しません。 正規表現は文字で区切ることはできません \ の後には /、?、または&が必要です。 前の置換正規表現がありません 後続文字 中断されました
:s_g [g] 行内のすべてのオカレンスを置き換えます。この引数を指定しないと、各行の最初のオカレンスのみが置き換えられます。
'gdefault' オプションがオンの場合、このフラグはデフォルトでオンになり、[g]引数でオフになります。
[p] 最後の置換を含む行を出力します。
:s_p
[#] [p] と同様に、行番号を先頭に付けて出力します。
:s_#
:s_r [r] 引数なしの
:&
または
:s
と組み合わせてのみ有効です。
:&r
は
:~
と同じように動作します。検索パターンが空の場合、最後の置換または
:global
の検索パターンの代わりに、以前に使用された検索パターンを使用します。最後に検索を実行したコマンドが置換または
:global
であった場合、効果はありません。最後のコマンドが "/" などの検索コマンドであった場合、そのコマンドのパターンを使用します。引数付きの
:s
では、これは既に発生しています
:s/blue/red/
/green
:s//red/ or :~ or :&r
最後のコマンドは "green" を "red" に置換します。
:s/blue/red/
/green
:&
最後のコマンドは "blue" を "red" に置換します。
パターンの「マジック」を変更するフラグがないことに注意してください。代わりに異なるコマンドが使用されるか、
/\v などを使用できます。理由は、フラグはパターンをスキップすることによってのみ見つけることができ、パターンをスキップするには「マジック」を知る必要があるためです。板挟みです!
置換コマンドの {pattern}
が空の場合、コマンドは最後の置換または :global
コマンドのパターンを使用します。どちらも存在しないが、以前の検索パターンが存在する場合、そのパターンが使用されます。[r] フラグを使用すると、コマンドは最後の置換、:global
、または検索コマンドのパターンを使用します。
{string}
が省略された場合、置換は空であるかのように行われます。したがって、一致したパターンは削除されます。
{pattern}
の後の区切り文字も省略できます。例
:%s/TESTING
これはすべての行から "TESTING" を削除しますが、1行につき1つだけです。
Vi との互換性のために、これらの2つの例外が許可されています: "\/{string}/" と "\?{string}?" は "//{string}/r" と同じ動作をします。"\&{string}&" は "//{string}/" と同じ動作をします。
パターン区切り文字 E146 パターンと置換文字列を囲む '/' の代わりに、別の1バイト文字を使用できます。これは、検索パターンまたは置換文字列に '/' を含めたい場合に便利です。例
:s+/+//+
ほとんどの文字を使用できますが、英数字、'\'、'"'、'|' は使用できません。
パターンの定義については、
パターン を参照してください。ビジュアルブロックモードでは、パターン内で
/\%V を使用して、置換をブロック内でのみ動作させます。そうでなければ、とにかく行全体で動作します。
置換の特殊文字 :s\= {string}
が "\=" で始まる場合、式として評価されます。
置換式 を参照してください。複雑な置換や特殊文字に使用できます。
置換は再帰で4レベルに制限されています。
E1290
それ以外の場合、{string}
内のこれらの文字は特別な意味を持ちます
マジック 非マジック アクション
& \& 一致したパターン全体に置換されます
s/\&\& & & に置換されます \0 一致したパターン全体に置換されます
\0 s/\0 \1 最初の () のペアで一致したパターンに置換されます
s/\1\2 2番目の () のペアで一致したパターンに置換されます
s/\2.. ..
s/\3\9 9番目の () のペアで一致したパターンに置換されます
s/\9~ \~ 前回の置換の
{string}
に置換されます
s~\~ ~ ~ に置換されます
s/\~\u 次の文字を大文字にします
s/\u\U \E まで、後続の文字を大文字にします
s/\U \l 次の文字を小文字にします
s/\l\L \E まで、後続の文字を小文字にします
s/\L \e \u、\U、\l、\L の終わり (
注: <Esc>
ではありません!)
s/\e\E \u、\U、\l、\L の終わり
s/\E
<CR>
この時点で改行します (
<CR>
は
CTRL-V
<Enter>
として入力します)
s<CR>\r 同上
s/\r\<CR> キャリッジリターン (
CTRL-M
) を挿入します (
<CR>
は
CTRL-V
<Enter>
として入力します)
s/\<CR>\n
<NL>
(ファイル内では
<NUL>
) を挿入します (改行はしません)
s/\n\b
<BS>
を挿入します
s/\b\t
<Tab>
を挿入します
s/\t\\ 単一のバックスラッシュを挿入します
s/\\\x x は上記以外の任意の文字です。将来の拡張のために予約されています
特別な意味は、
substitute() 関数の3番目の引数
{sub}
内でも使用されますが、以下の例外があります
~ はチルダを文字通り挿入します。
<CR>
と \r はキャリッジリターン (CTRL-M
) を挿入します。
\<CR> は特別な意味を持ちません。\x の1つにすぎません。
例
:s/a\|b/xxx\0xxx/g modifies "a b" to "xxxaxxx xxxbxxx"
:s/\([abc]\)\([efg]\)/\2\1/g modifies "af fa bg" to "fa fa gb"
:s/abcde/abc^Mde/ modifies "abcde" to "abc", "de" (two lines)
:s/$/\^M/ modifies "abcde" to "abcde^M"
:s/\w\+/\u\0/g modifies "bla bla" to "Bla Bla"
:s/\w\+/\L\u\0/g modifies "BLA bla" to "Bla Bla"
注: "\L\u" は単語の最初の文字を大文字にするために使用できます。これは Vi や古いバージョンの Vim と互換性がありません。古いバージョンでは、"\u" は "\L" をキャンセルします。"\U\l" についても同様です。
注: 以前のバージョンでは、CTRL-V
は特殊な方法で処理されていました。これは Vi と互換性がないため、削除されました。代わりにバックスラッシュを使用してください。
コマンド テキスト 結果
:s/aa/a^Ma/ aa a<改行>a :s/aa/a\^Ma/ aa a^Ma :s/aa/a\\^Ma/ aa a\<改行>a
(ここで ^M を得るには、CTRL-V
<CR>
と入力する必要があります)
"\1"、"\2" などの番号付けは、パターン内でどの "\(" が最初に来るか (左から右へ) に基づいて行われます。括弧グループが複数回一致する場合、最後の一致が "\1"、"\2" などに使用されます。例
:s/\(\(a[a-d] \)*\)/\2/ modifies "aa ab x" to "ab x"
"\2" は "\(a[a-d] \)" 用です。最初に "aa " に一致し、次に "ab " に一致します。
\([ab]\)\|\([cd]\) のように括弧を '|' と組み合わせて使用すると、括弧内の最初または2番目のパターンが一致しなかったため、\1 または \2 は空になります。例
:s/\([ab]\)\|\([cd]\)/\1x/g modifies "a b c d" to "ax bx x x"
これらのコマンドは、指定されたフラグで前の :substitute
コマンドを繰り返します。最初の文字は常に "s" で、その後に1つまたは2つの可能なフラグ文字が続きます。たとえば、:sce
は :s///ce
のように動作します。表には可能な組み合わせがリストされています。コマンドは別のコマンドの省略形であるため、すべてのフラグが使用できるわけではありません。
:substitute コマンドのリスト | c e g i I n p l r | c :sc :sce :scg :sci :scI :scn :scp :scl | e | g :sgc :sge :sg :sgi :sgI :sgn :sgp :sgl :sgr | i :sic :sie :si :siI :sin :sip :sir | I :sIc :sIe :sIg :sIi :sI :sIn :sIp :sIl :sIr | n | p | l | r :src :srg :sri :srI :srn :srp :srl :sr
例外: :scr は :scriptnames
:se は :set
:sig は :sign
:sil は :silent
:sn は :snext
:sp は :split
:sl は :sleep
:sre は :srewind
sub-replace-special で述べられている文字の特殊な意味は、"<CR>" を除いて適用されません。
<NL>
文字は改行として使用され、二重引用符で囲まれた文字列 "\n" で取得できます。実際の
<NL>
文字(ファイルでは NUL になります)を取得するには、バックスラッシュを前に付けます。
結果が
リスト の場合、項目は改行で区切って結合されます。そのため、各項目は1行になりますが、それ自体に改行を含めることができます。
submatch() 関数を使用して、一致したテキストを取得できます。一致したテキスト全体は "submatch(0)" でアクセスできます。最初の () のペアと一致したテキストは "submatch(1)" でアクセスできます。以降の () 内のサブ一致も同様です。
注意: 区切り文字は式に含まれていてはなりません!"@" や ":" のような文字の使用を検討してください。式の結果に区切り文字が含まれていても問題ありません。
例
:s@\n@\="\r" .. expand("$HOME") .. "\r"@
これは、行末を $HOME の値を含む新しい行に置き換えます。
s/E/\="\<Char-0x20ac>"/g
これは、各 'E' 文字をユーロ記号に置き換えます。詳細は
<Char-> を参照してください。
4.3 タブの変更
タブの変更
:ret :retab :retab! :[range]ret[ab][!] [new_tabstop]
<Tab>
を含むすべての空白シーケンスを、指定された新しいタブストップ値を使用して新しい空白文字列に置き換えます。新しいタブストップサイズを指定しない場合、またはゼロの場合は、Vim は
'tabstop' の現在の値を使用します。
'tabstop' の現在の値は、既存のタブの幅を計算するために常に使用されます。! を指定すると、Vim は通常のスペースのみの文字列も適切な場所にタブで置き換えます。
'expandtab' がオンの場合、Vim はすべてのタブを適切な数のスペースに置き換えます。このコマンドは
'tabstop' を指定された新しい値に設定し、ファイル全体(デフォルト)で実行された場合、目に見える変更は行われません。注意: このコマンドは、C プログラムの文字列内の
<Tab>
文字を変更します。これを避けるには "\t" を使用してください(これはいずれにしても良い習慣です)。
:retab!
は、スペースのシーケンスを
<Tab>
文字に変更することもあり、printf() を混乱させる可能性があります。カンマで区切られたタブ幅のリストを、単一のタブストップの代わりに使用できます。リストの各値は、1つのタブストップの幅を表し、最後の値はそれ以降のすべてのタブストップに適用されます。
retab の例 タブストップが8に設定されて保存されているファイルを、タブストップを4に設定して編集する場合の、自動コマンドと ":retab" を使用した例。
警告: 文字列内の空白が変更される可能性があります!
'softtabstop' オプションも参照してください。
:auto BufReadPost *.xx retab! 4
:auto BufWritePre *.xx retab! 8
:auto BufWritePost *.xx retab! 4
:auto BufNewFile *.xx set ts=4
5. テキストのコピーと移動 コピーと移動
引用符 "{register} 次の削除、ヤンク、または貼り付けに
{register}
を使用します。大文字を使用して、削除とヤンクを追加します。レジスタ ".", "%", "#"、および ":" は貼り付けでのみ機能します。
:reg :registers :reg[isters] すべての番号付きレジスタと名前付きレジスタのタイプと内容を表示します。レジスタが
:redir 用に書き込まれている場合は、リストされません。タイプは次のいずれかになります。"c" は
文字単位 のテキスト "l" は
行単位 のテキスト "b" は
ブロック単位 のテキスト
:reg[isters]
{arg}
{arg}
に記載されている番号付きレジスタと名前付きレジスタの内容を表示します。例えば
:reg 1a
レジスタ '1' と 'a' を表示するには、{arg}
にスペースを使用できます。
y ヤンク ["x]y{motion}
{motion}
テキストを [レジスタ x に] ヤンクします。ヤンクする文字がない場合 (例: 1 列目の "y0")、
'cpoptions' に 'E' フラグが含まれているとエラーになります。
yy ["x]yy [カウント] 行を [レジスタ x に]
行単位 でヤンクします。
zy ["x]zy{motion}
{motion}
テキストを [レジスタ x に] ヤンクします。テキストブロックを選択する場合にのみ
y
とは異なります。
v_zy を参照してください。
v_y
{Visual}
["x]y 強調表示されたテキストを [レジスタ x に] ヤンクします (
{Visual}
については
ビジュアルモード を参照)。
v_Y
{Visual}
["x]Y 強調表示された行を [レジスタ x に] ヤンクします (
{Visual}
については
ビジュアルモード を参照)。
v_zy
{Visual}
["x]zy 強調表示されたテキストを [レジスタ x に] ヤンクします。選択したブロックの各行の末尾にある空白はヤンクされません。
zp
と組み合わせて使用すると特に便利です。(
{Visual}
については
ビジュアルモード を参照)
:y :yank E850 :[range]y[ank] [x] [範囲] 行を [レジスタ x に] ヤンクします。
:[range]y[ank] [x]
{count}
[範囲] の最後の行番号から始まる
{count}
行を [レジスタ x に] ヤンクします (デフォルト: 現在の行
cmdline-ranges)。
P ["x]P [レジスタ x からの] テキストをカーソルの前 [カウント] 回貼り付けます。
<MiddleMouse> ["x]<MiddleMouse> レジスタからのテキストをカーソルの前に[カウント]回貼り付けます。別のものが指定されていない限り、*レジスタを使用します。カーソルを新しいテキストの最後に残します。マウスの使用は、
'mouse' に 'n' または 'a' が含まれている場合にのみ機能します。スクロールホイールがあり、誤ってテキストを貼り付けることが多い場合は、これらのマッピングを使用して、マウスの中ボタンでの貼り付けを無効にすることができます
:map <MiddleMouse> <Nop>
:imap <MiddleMouse> <Nop>
複数クリックバージョンも無効にすることをお勧めします。
ダブルクリックを参照してください。
gp ["x]gp "p" と同じですが、カーソルを新しいテキストの直後に残します。
gP ["x]gP "P" と同じですが、カーソルを新しいテキストの直後に残します。
:pu :put :[line]pu[t] [x] [レジスタ x からの] テキストを [行] の後 (デフォルトは現在の行) に貼り付けます。これは常に
行単位 で動作するため、このコマンドを使用してヤンクされたブロックを新しい行として貼り付けることができます。レジスタが指定されていない場合、
'cb' オプションによって異なります。
'cb' に "unnamedplus" が含まれている場合、+ レジスタから貼り付けます
quoteplus。そうでない場合、
'cb' に "unnamed" が含まれている場合、* レジスタから貼り付けます
quotestar。そうでない場合、名前のないレジスタから貼り付けます
quote_quote。レジスタは '=' の後にオプションの式を続けることもできます。式はコマンドの最後まで続きます。コマンドが終了しないように、'|' 文字と '"' 文字をエスケープする必要があります。例
:put ='path' .. \",/test\"
'=' の後に式がない場合、Vim は前の式を使用します。":dis =" で確認できます。
:[line]pu[t]! [x] [レジスタ x からの] テキストを [行] の前 (デフォルトは現在の行) に貼り付けます。
["x]]p or
]p ]<MiddleMouse> ["x]]<MiddleMouse> "p" と同じですが、インデントを現在の行に調整します。マウスの使用は、
'mouse' に 'n' または 'a' が含まれている場合にのみ機能します。
["x][P or
[P["x]]P or
]P["x][p or
[p [<MiddleMouse> ["x][
<MiddleMouse>
"P" と同じですが、インデントを現在の行に調整します。マウスの使用は、
'mouse' に 'n' または 'a' が含まれている場合にのみ機能します。
["x]zp or
zp zP ["x]zP "p" および "P" と同じですが、ブロックを貼り付けるときに末尾のスペースを追加しません。したがって、挿入されたテキストは必ずしも長方形になりません。
v_zy と組み合わせて使用すると特に便利です。
これらのコマンドを使用して、テキストをある場所から別の場所にコピーできます。最初にヤンク、削除、または変更コマンドを使用してレジスタにテキストを取得し、次に貼り付けコマンドを使用してレジスタの内容を挿入します。Vim はバッファを変更するときにすべてのレジスタを保持するため (CTRL-^
コマンドは2つのファイルを切り替えるための簡単な方法です)、これらのコマンドを使用してテキストをあるファイルから別のファイルに移動することもできます。
行単位レジスタ 文字単位レジスタ 貼り付けコマンドは "." で繰り返すことができ ( :put を除く)、元に戻すことができます。レジスタにテキストを取得するために使用されたコマンドが
行単位 であった場合、Vim はカーソルがある行の下 ("p") または上 ("P") にテキストを挿入します。そうでない場合、Vim はカーソルの後 ("p") または前 ("P") にテキストを挿入します。":put" コマンドを使用すると、Vim は常に次の行にテキストを挿入します。"xp" コマンドシーケンスを使用して2つの文字を交換できます。"ddp" コマンドシーケンスを使用して2行を交換できます。"deep" コマンドシーケンスを使用して2つの単語を交換できます (最初の単語の前の空白にカーソルを置いて開始します)。貼り付けコマンドの後に "']" または "`]" コマンドを使用してカーソルを挿入されたテキストの最後に移動するか、"'[" または "`[" を使用してカーソルを先頭に移動できます。
put-Visual-mode v_p v_P ビジュアルモードで
p や
P のような put コマンドを使うと、Vim は選択されたテキストをレジスタの内容で置き換えようとします。これがうまくいくかどうかは、選択の種類とレジスタ内のテキストの種類によって異なります。ブロック単位の選択では、ブロックのサイズと、角が既存の文字上にあるかどうかも関係します。(実装の詳細: 実際には、最初にレジスタの内容を選択範囲の後に配置し、次に選択範囲を削除することで動作します。)
p を使用すると、以前に選択されたテキストが無名レジスタ(および場合によっては選択範囲やクリップボード)に配置されます。このテキストを他の場所に配置したい場合に便利です。ただし、同じ変更を繰り返すことはできません。
P を使用すると、無名レジスタは変更されず(選択範囲やクリップボードも変更されず)、同じ変更を繰り返すことができます。ただし、削除されたテキストは使用できません。必要な場合は、別のレジスタで
p を使用できます。例えば、コピーするテキストをヤンクし、置き換えるテキストをビジュアル選択し、"0p を使用します。これは何度でも繰り返すことができ、無名レジスタは毎回変更されます。
blockwise-putレジスタに1行のテキスト(文字単位)が含まれている場合、ブロック単位のビジュアル選択を使用すると、そのレジスタを配置すると、選択された各行にそのテキストが繰り返し貼り付けられ、ブロック単位で選択された領域がレジスタテキストの複数のコピーに置き換えられます。例えば
yw
で単語 "TEXT" をレジスタにヤンクします
このテキストで "v" でマークされたビジュアルブロックを選択します: aaavvaaa bbbvvbbb cccvvccc
p
を押すと、次のようになります: aaaTEXTaaa bbbTEXTbbb cccTEXTccc
blockwise-register レジスタにテキストを取得するためにブロック単位のビジュアルモードコマンドを使用する場合、テキストのブロックは、現在行と次行のカーソル列の前("P")または後("p")に挿入されます。Vim はテキストブロック全体を同じ列から開始するようにします。したがって、挿入されたテキストは、ヤンクまたは削除されたときと同じように見えます。Vim は、これを可能にするために、一部の
<Tab>
文字をスペースに置き換える場合があります。ただし、ブロックの幅が
<Tab>
幅の倍数ではなく、挿入されたブロックの後のテキストに
<Tab>
が含まれている場合、そのテキストの位置ずれが発生する可能性があります。
zP/|zp| を使用すると、末尾のスペースを追加せずにブロック単位でヤンクされたレジスタを貼り付けることができます。
文字単位のヤンクコマンドの後、Vim はカーソルをバッファの先頭に最も近いヤンクされた最初の文字に置きます。つまり、"yl" はカーソルを移動しませんが、"yh" はカーソルを1文字左に移動します。理由: Vi では、"y" コマンドの後に後方への移動を行うと、再表示がスキップされるため、カーソルが最初にヤンクされた文字に移動しない場合がありました。Vim では、Posix で指定されているように、常に最初の文字に移動します。行単位のヤンクコマンドでは、カーソルは最初の行に置かれますが、列は変更されないため、最初にヤンクされた文字にない場合があります。
レジスタには10種類あります:
registers {register} E354 1. 無名レジスタ "" 2. 10個の番号付きレジスタ "0 から "9 3. 小さな削除レジスタ "-" 4. 26個の名前付きレジスタ "a から "z または "A から "Z 5. 3つの読み取り専用レジスタ ":, "., "% 6. 代替バッファレジスタ "#" 7. 式レジスタ "=" 8. 選択レジスタ "* と "+" 9. ブラックホールレジスタ "_" 10. 最後の検索パターンレジスタ "/"
1. 無名レジスタ ""
quote_quote quotequote Vim は、特定のレジスタが使用されたかどうかに関係なく(例: "xdd)、"d"、"c"、"s"、"x" コマンドで削除されたテキスト、またはヤンク "y" コマンドでコピーされたテキストでこのレジスタを埋めます。これは、無名レジスタが最後に使用されたレジスタを指しているかのようです。したがって、大文字のレジスタ名を使用して追加する場合、無名レジスタには名前付きレジスタと同じテキストが含まれます。例外は '_' レジスタです: "_dd は削除されたテキストをどのレジスタにも保存しません。Vim は、レジスタを指定しない put コマンド(p または P)に無名レジスタの内容を使用します。さらに、名前 '"' を使用してアクセスできます。これは、2つの二重引用符を入力する必要があることを意味します。 "" レジスタへの書き込みは、レジスタ "0 に書き込みます。
2. 番号付きレジスタ "0 から "9
quote_number quote0 quote1 quote2 quote3 quote4 quote9 Vim はこれらのレジスタをヤンクおよび削除コマンドからのテキストで埋めます。コマンドが ["x] で別のレジスタを指定していない限り、番号付きレジスタ 0 には、最新のヤンクコマンドからのテキストが含まれます。番号付きレジスタ 1 には、最新の削除または変更コマンドによって削除されたテキストが含まれます(コマンドが別のレジスタを指定した場合でも)。ただし、テキストが1行未満の場合は例外です(その場合は小さな削除レジスタが使用されます)。削除演算子に次の移動コマンドを使用する場合:
%、
(、
)、
`、
/、
?、
n、
N、
{、
} は例外です。レジスタ "1 は常に使用されます(これは Vi と互換性があります)。削除が行内にある場合、"-" レジスタも使用されます。これらの文字はマップされる可能性があることに注意してください。例えば、
% は matchit プラグインによってマップされています。連続する削除または変更ごとに、Vim はレジスタ 1 の以前の内容をレジスタ 2 に、2 を 3 にシフトし、レジスタ 9 の以前の内容を失います。
3. 小さな削除レジスタ "-
quote_- quote- このレジスタには、コマンドが ["x] でレジスタを指定していない限り、1行未満を削除するコマンドからのテキストが含まれます。
4. 名前付きレジスタ "a から "z または "A から "Z
quote_alpha quotea Vim は、ユーザーが指定した場合にのみ、これらのレジスタを埋めます。以前の内容を置き換えるには小文字で、以前の内容に追加するには大文字で指定します。
'cpoptions' に '>' フラグが存在する場合、追加されたテキストの前に改行が挿入されます。
5. 読み取り専用レジスタ ":, ". and "% これらは '%', ':' と '.' です。"p"、"P"、":put" コマンド、および
CTRL-R
でのみ使用できます。
quote_. quote. E29 ". 最後に挿入されたテキストが含まれています(挿入モードコマンド
CTRL-A
および
CTRL-@
で挿入されたものと同じです)。
注意: これはコマンドラインで
CTRL-R
では機能しません。テキストを配置する代わりに挿入するのと同様に、少し異なった動作をします(
'textwidth' やその他のオプションが挿入される内容に影響します)。
quote_% quote% "% 現在のファイルの名前が含まれています。
quote_: quote: E30 ": 最近実行されたコマンドラインが含まれています。例: "@:" を使用して、前のコマンドラインコマンドを繰り返します。コマンドラインの少なくとも1文字が入力された場合にのみ、コマンドラインはこのレジスタに格納されます。したがって、コマンドが完全にマッピングからのものである場合、変更されません。
quote_# quote# 6. 代替ファイルレジスタ "#" 現在のウィンドウの代替ファイルの名前が含まれています。
CTRL-^ コマンドの動作が変わります。このレジスタは書き込み可能です。主にプラグインが変更した後に復元できるようにするためです。バッファ番号を受け入れます
let altbuf = bufnr(@#)
...
let @# = altbuf
バッファ番号を渡し、このバッファが存在しない場合は、エラー
E86 が発生します。既存のバッファ名と一致するものも受け入れることができます
let @# = 'buffer_name'
指定された名前に一致するバッファが複数ある場合はエラー
E93 が発生し、一致するバッファがない場合はエラー
E94 が発生します。
7. 式レジスタ "=
quote_= quote= @= これは実際にはテキストを格納するレジスタではなく、レジスタを使用するコマンドで式を使用する方法です。式レジスタは読み書き可能です。
" または
CTRL-R
の後に '=' を入力すると、カーソルはコマンドラインに移動し、そこで任意の式を入力できます(
expression を参照)。式用の特別な履歴を含め、すべてのコマンドライン編集コマンドを使用できます。
<CR>
を入力してコマンドラインを終了すると、Vim は式の結果を計算します。
<Esc>
で終了すると、Vim は式を破棄します。式を入力しない場合、Vim は前の式を使用します("/" コマンドと同様)。
式は文字列に評価される必要があります。数値は常に自動的に文字列に変換されます。"p" および ":put" コマンドの場合、結果が浮動小数点数であれば文字列に変換されます。結果がリストの場合、各要素は文字列に変換され、行として使用されます。辞書は文字列に変換されます。 Funcref はエラーメッセージになります(変換するには string() を使用します)。
"p" コマンドに "= レジスタが使用される場合、文字列は <NL>
文字で分割されます。文字列が <NL>
で終わる場合、行単位のレジスタと見なされます。
8. 選択レジスタ "* と "+" これらのレジスタは、GUI 用に選択されたテキストを格納および取得するために使用します。
quotestar および
quoteplus を参照してください。クリップボードが使用できないか機能しない場合は、代わりに無名レジスタが使用されます。 Unix システムと Mac OS X については、
primary-selection を参照してください。
9. ブラックホールレジスタ "_
quote_このレジスタに書き込んでも何も起こりません。これは、通常のレジスタに影響を与えることなくテキストを削除するために使用できます。このレジスタから読み取ると、何も返されません。
@/ :let
コマンド
:let-@ を使用してレジスタに書き込むことができます。例
:let @/ = "the"
レジスタを指定せずに put コマンドを使用すると、Vim は最後に埋められたレジスタを使用します(これは無名レジスタの内容でもあります)。混乱している場合は、
:dis
コマンドを使用して、Vim が何を配置するかを確認します(このコマンドは、すべての名前付きレジスタと番号付きレジスタを表示します。無名レジスタは '"' とラベル付けされています)。
次の3つのコマンドは、常に行全体を対象として機能します。
:[range]co[py]
{address}
:co :copy [range] で指定された行を、
{address}
で指定された行の下にコピーします。
:[range]m[ove]
{address}
:m :mo :move E134 [range] で指定された行を、
{address}
で指定された行の下に移動します。
:le :left :[range]le[ft] [indent] [range] 内の行を左揃えにします。行のインデントを [indent] に設定します(デフォルトは 0)。
gq gq{motion}
{motion}
が移動する行を整形します。整形は次の 3 つの方法のいずれかで行われます。1.
'formatexpr' が空でない場合、式が評価されます。これはバッファごとに異なる場合があります。 2.
'formatprg' が空でない場合、外部プログラムが使用されます。 3. それ以外の場合、整形は内部で行われます。
3 番目の場合、
'textwidth' オプションは、整形された各行の長さを制御します(下記参照)。
'textwidth' オプションが 0 の場合、整形された行の長さは画面の幅になります(最大幅は 79)。
'formatoptions' オプションは、整形のタイプを制御します
fo-table。カーソルは、最後に整形された行の最初の空白以外の文字に置かれます。
注意: 以前は "Q" コマンドがこの機能を実行していました。整形に "Q" を使用したい場合は、次のマッピングを使用してください
:nnoremap Q gq
gqgq
gqgq gqq gqq 現在の行を整形します。カウントを指定すると、その行数を整形します。
gwgw
gwgw gww gww 現在の行を "gw" と同様に整形します。
v_gw
{Visual}
gw 強調表示されたテキストを "gw" と同様に整形します。(
{Visual}
については
Visual-mode を参照)。
例:現在の段落を整形するには、次のようにします:
gqapgqap
"gq" コマンドは、モーションコマンドがカーソルを移動する行にカーソルを残します。これにより、"." で整形を繰り返すことができます。これは "gqj"(現在行と次の行を整形)と "gq}"(段落の終わりまで整形)でうまく機能します。
注意: 'formatprg' が設定されている場合、"gq" は(フィルタコマンドを使用した場合と同様に)最初に整形された行にカーソルを残します。
整形は空行を変更しません(ただし、空白のみの行は変更します!)。
format-formatexpr'formatexpr' オプションは、バッファの再フォーマットを実行する Vim スクリプト関数に設定できます。整形はファイルのタイプに大きく依存するため、これは通常
ftplugin 内で行われる必要があります。
autoload スクリプトを使用するのが理にかなっています。対応するスクリプトは実際に必要な場合にのみロードされ、スクリプトは
<filetype>
format.vim という名前でなければなりません。
たとえば、$VIMRUNTIME ディレクトリにある Vim に付属の XML ファイルタイププラグインは、
'formatexpr' オプションを次のように設定します
setlocal formatexpr=xmlformat#Format()
つまり、xmlformat#Format() 関数を定義する対応するスクリプトは、
$VIMRUNTIME/autoload/xmlformat.vim
ディレクトリにあります。
選択したテキストから末尾の空白を削除するサンプルスクリプトを以下に示します。これを autoload ディレクトリ(例:~/.vim/autoload/format.vim)に配置します
func! format#Format()
" only reformat on explicit gq command
if mode() != 'n'
" fall back to Vim's internal reformatting
return 1
endif
let lines = getline(v:lnum, v:lnum + v:count - 1)
call map(lines, {key, val -> substitute(val, '\s\+$', '', 'g')})
call setline('.', lines)
" do not run internal formatter!
return 0
endfunc
その後、次を実行することで整形を有効にできます
setlocal formatexpr=format#Format()
注意: この関数は、挿入モードから呼び出されたときに明示的にゼロ以外の値を返します(これは基本的に、テキストが
'textwidth' 制限を超えて挿入されることを意味します)。これにより、Vim は内部フォーマッタを使用してテキストを再フォーマットするようになります。
ただし、
gq コマンドを使用してテキストを再フォーマットする場合、関数は選択された行を受け取り、それらの行から末尾の空白をトリミングし、元の場所に配置します。 1 行を複数行に分割する場合は、何も上書きしないように注意してください。
挿入モードまたは置換モードからのテキストの再フォーマットを許可する場合は、関数が再帰的に呼び出される可能性があるため、非常に注意する必要があります。デバッグには、
'debug' オプションを設定すると役立ちます。
right-justify Vim にはテキストを右揃えにするコマンドはありません。"par" のような外部コマンド(例:段落の終わりまで整形するには "!}par")を使用するか、
'formatprg' を "par" に設定することができます。
コメントの書式設定の概要は、ユーザーマニュアルのセクション
30.6 にあります。
Vim は、特別な方法でコメントを自動的に挿入および整形できます。Vim は、行の先頭にある特定の文字列(空白を無視)によってコメントを認識します。3種類のコメントを使用できます
各行の先頭で繰り返されるコメント文字列。例として、"#" で始まるシェルスクリプトで使用されるタイプのコメントがあります。
最初の行にのみ出現し、後続の行には出現しないコメント文字列。例として、ダッシュ付きのこのリストがあります。
開始文字列、終了文字列、およびその間にオプションの行を持つ 3 つの部分からなるコメント。開始、中間、終了の文字列は異なります。例として、C スタイルのコメントがあります
/*
* this is a C comment
*/
'comments' オプションは、カンマで区切られた部分のリストです。各部分はコメント文字列のタイプを定義します。部分は次のように構成されます。
{flags}
:{string}
{string}
は、出現する必要があるリテラルテキストです。
{flags}
: n ネストされたコメント。混合部分でのネストが許可されます。
'comments' が "n:),n:>" の場合、"> ) >" で始まる行はコメントです。
b {string}
の後に空白(<Space>
、<Tab>
、または <EOL>
)が必要です。
f 最初の行にのみコメント文字列があります。次の行にコメントを繰り返さないで、インデントを保持します(例:箇条書きリスト)。
s 3 つの部分からなるコメントの開始
m 3 つの部分からなるコメントの中間
e 3 つの部分からなるコメントの終了
l 左揃え。's' または 'e' と一緒に使用すると、開始または終了の左端の文字が、中間部分の左端の文字と一致します。これはデフォルトであり、省略できます。詳細については、以下を参照してください。
r 右揃え。上記と同じですが、左端ではなく右端です。詳細については、以下を参照してください。
O "O" コマンドでこのコメントを考慮しません。
x 中間コメント文字列が自動的に挿入された場合、新しい行の最初のアクションとして終了コメント文字列の最後の文字を入力するだけで、3 つの部分からなるコメントを終了できるようにします。詳細については、以下を参照してください。
{digits}
's' または 'e' と一緒に使用する場合:自動的に挿入された中間または終了コメントリーダーに {digit}
量のオフセットを追加します。オフセットは左揃えから始まります。詳細については、以下を参照してください。
-{digits} {digits}
と同様ですが、インデントを減らします。これは、開始または終了部分に削除できるインデントがある場合にのみ機能します。
文字列に 'f'、's'、'm'、または 'e' フラグがない場合、Vim はコメント文字列が各行の先頭で繰り返されるとみなします。フラグフィールドは空にすることができます。
{string}
の前後のテキスト内の空白は {string}
の一部であるため、空白がコメント文字列の必須部分でない限り、先頭または末尾の空白を含めないでください。
あるコメントリーダーが別のコメントリーダーの一部である場合は、全体の後にある部分を指定します。たとえば、"-" と "->" の両方を含めるには、次のようにします
:set comments=f:->,f:-
3 つの部分からなるコメントは、常に開始、中間、終了として指定する必要があり、間に他の部分は存在しません。3 つの部分からなるコメントの例を以下に示します
sr:/*,mb:*,ex:*/
C コメントの場合。" *ptr" をコメントとして認識しないようにするために、中間文字列には 'b' フラグが含まれています。3 つの部分からなるコメントの場合、Vim は開始文字列と中間文字列の後のテキストで終了文字列を探します。Vim が終了文字列を見つけると、コメントは次の行に続きません。3 つの部分からなるコメントには中間文字列が必要です。そうでないと、Vim は中間行を認識できません。
上記の 3 つの部分からなるコメント定義では "x" フラグが使用されていることに注意してください。C コメントで Return を押すと、Vim は新しい行に中間コメントリーダー " * " を挿入します。このコメントを閉じるには、新しい行に何かを入力する前に "/" と入力するだけです。これにより、中間コメントリーダーが終了コメントリーダーに置き換えられ、指定された配置が適用され、" */"
だけが残ります。最初に Backspace を押す必要はありません。
中間部分と一致するものがあるが、より長い一致する終了部分もある場合、終了部分が使用されます。これにより、中間部分がスペースで終わる必要がなくなり、C スタイルのコメントが機能します。
コメントを目立たせるために配置フラグがどのように機能するかについての例を以下に示します(一種 1 のように見えます)。コメント文字列を考えてみましょう
:set comments=sr:/***,m:**,ex-2:******/
/*** ~
**<--right aligned from "r" flag ~
** ~
offset 2 spaces for the "-2" flag-->** ~
******/ ~
この場合、最初のコメントが入力され、改行が4回押され、次に "/" が押されてコメントが終了します。
3パートコメントのより詳細な点をいくつか紹介します。配置とオフセットフラグが考慮されるのは、開始コメントの後に新しい行を開くとき、終了コメントの前に新しい行を開くとき、そして3ピースコメントを自動的に終了するときの3回です。"e" で使用されるのと同じ配置フラグを使用すると、開始部分と終了部分のインデントが同じになります。コメント部分ごとに1つの配置のみを使用することを意図していますが、オフセット番号は "r" および "l" フラグをオーバーライドします。
'cindent' を有効にすると、多くの場合、配置フラグがオーバーライドされます。
gq や
= のような異なる方法を使用して再インデントすると、配置フラグも参照されません。同じ動作を他のフォーマットオプションで定義できます。1つの考慮事項は、
'cindent' には、コンテキストに基づいたコメントのインデントのための追加オプションがありますが、多くの3ピースインデント配置を複製できないことです。ただし、
'indentexpr' は、3ピースコメントでより適切に機能する機能を備えています。
その他の例
"b:*" Includes lines starting with "*", but not if the "*" is
followed by a non-blank. This avoids a pointer dereference
like "*str" to be recognized as a comment.
"n:>" Includes a line starting with ">", ">>", ">>>", etc.
"fb:-" Format a list that starts with "- ".
デフォルトでは、"b:#" が含まれています。これは、"#include" で始まる行はコメント行として認識されないことを意味します。しかし、"# define" で始まる行は認識されます。これは妥協案です。
fo-t t
'textwidth' を使用してテキストを自動的に折り返します
fo-cc
'textwidth' を使用してコメントを自動的に折り返し、現在のコメントリーダーを自動的に挿入します。
fo-rr 挿入モードで
<Enter>
を押した後、現在のコメントリーダーを自動的に挿入します。
fo-oo ノーマルモードで 'o' または 'O' を押した後、現在のコメントリーダーを自動的に挿入します。特定の場所でコメントが不要な場合は、
CTRL-U
を使用してすばやく削除します。
i_CTRL-U fo-// 'o' が含まれている場合:ステートメントの後の // コメントにはコメントリーダーを挿入せず、// が行の先頭にある場合にのみ挿入します。
fo-qq "gq" でコメントのフォーマットを許可します。フォーマットは、空白行またはコメントリーダーのみを含む行を変更しないことに注意してください。このような行の後、またはコメントリーダーが変更されたときに、新しい段落が開始されます。
fo-ww 末尾の空白は、段落が次の行に続くことを示します。空白以外の文字で終わる行は、段落を終了します。
fo-aa 段落の自動フォーマット。テキストが挿入または削除されるたびに、段落が再フォーマットされます。
auto-format を参照してください。'c' フラグが存在する場合、これは認識されたコメントに対してのみ発生します。
fo-nn テキストのフォーマット時に、番号付きリストを認識します。これは実際には
'formatlistpat' オプションを使用するため、あらゆる種類のリストを使用できます。番号の後のテキストのインデントは、次の行に使用されます。デフォルトでは、番号の後に '.'、':'、')'、']'、または '}' が続く場合があります。
'autoindent' も設定する必要があることに注意してください。"2" とうまく連携しません。例
1. the first item
wraps
2. the second item
fo-2 2 テキストのフォーマット時に、段落の最初の行のインデントの代わりに、段落の2行目のインデントを段落の残りの部分に使用します。これは、最初の行のインデントが残りとは異なる段落をサポートします。
'autoindent' も設定する必要があることに注意してください。例
first line of a paragraph
second line of the same paragraph
third line.
これはコメント内でも機能し、コメントリーダーを無視します。
fo-vv 挿入モードでの Vi 互換の自動折り返し:現在の挿入コマンド中に自分で入力した空白でのみ行を改行します。(
注:これは 100% Vi 互換ではありません。Vi にはこの領域に「予期しない機能」またはバグがあります。行の列ではなく画面の列を使用します。)
fo-bb 'v' と同様ですが、折り返しマージンまたはその前に空白を入力した場合にのみ自動的に折り返します。挿入を開始したときに
'textwidth' より行が長かった場合、または
'textwidth' に到達する前に挿入に空白を入力しない場合、Vim は自動折り返しを実行しません。
fo-ll 挿入モードでは長い行は改行されません。挿入コマンドの開始時に
'textwidth' より行が長かった場合、Vim は自動的にフォーマットしません。
fo-mm また、255 を超えるマルチバイト文字でも改行します。これは、すべての文字がそれ自体で単語であるアジアのテキストに役立ちます。
fo-MM 行を結合するときに、マルチバイト文字の前後にスペースを挿入しません。'B' フラグをオーバーライドします。
fo-BB 行を結合するときに、2 つのマルチバイト文字の間にスペースを挿入しません。'M' フラグによってオーバーライドされます。
fo-11 1 文字の単語の後に行を改行しません。代わりに、その前で改行されます(可能な場合)。
fo-]]
'textwidth' を厳密に尊重します。このフラグが設定されていると、改行禁止ルールによって不可能にならない限り、行は
'textwidth' より長くすることはできません。主に CJK スクリプト用であり、
'encoding' が "utf-8" の場合にのみ機能します。
fo-jj 意味がある場合は、行を結合するときにコメントリーダーを削除します。例えば、
int i; // インデックス
// リスト内
を結合すると
int i; // リスト内のインデックス
fo-p p ピリオドの後に続く単一のスペースで行を改行しません。これは、2 つのスペースで区切られた文を含む散文のために、
'joinspaces' および
cpo-J を補完することを目的としています。たとえば、
'textwidth' を 28 に設定すると
Surely you're joking, Mr. Feynman!
を結合すると
Surely you're joking,
Mr. Feynman!
の代わりに
Surely you're joking, Mr.
Feynman!
't' と 'c' を使用すると、Vim が自動折り返しを実行するタイミングを指定できます
値 アクション
"" 自動フォーマットなし(手動フォーマットには "gq" を使用できます) "t" テキストの自動フォーマット、ただしコメントはフォーマットしません "c" コメントの自動フォーマット、ただしテキストはフォーマットしません(C コードに適しています) "tc" テキストとコメントの自動フォーマット
'comments' オプションに "/*", "*"、および/または "*/" が含まれている場合、Vim にはこれらのタイプのコメントをもう少し巧妙に扱うための組み込み機能があります。"/*" または "*/" の前または後に新しい行を開くと(
'formatoptions' に 'r' または 'o' が存在する場合)、行の正しい開始位置が自動的に設定されます。フォーマットと自動折り返しでも同じことが起こります。"/*" または "*" で始まり "*/" を含む行の後に行を開くと、コメントリーダーは挿入されず、新しい行のインデントはコメントの開始を含む行から取得されます。例:
/*
* Your typical comment.
*/
The indent on this line is the same as the start of the above
comment.
これはすべて、特にさまざまなタイプのファイルにさまざまな設定を準備するための新しい :autocmd コマンドと組み合わせて、非常にクールなものになるはずです。
いくつかの例:C コードの場合(コメントのみフォーマット)
:set fo=croq
メール/ニュースの場合(すべてフォーマット、"o" コマンドでコメントを開始しない)
:set fo=tcrq
'formatoptions' に 'a' フラグが存在する場合、テキストの挿入または削除時にテキストが自動的にフォーマットされます。これは、テキスト段落の編集に適しています。これを使用する方法に関するいくつかのヒント
段落を適切に定義する必要があります。最も単純なのは、空白行で区切られた段落です。空白行で区切られていない場合は、'w' フラグを使用し、最後の行を除く段落の各行の末尾にスペースを追加することを検討してください。
bla bla foobar bla bla foobar bla foobar bla bla bla foobar bla bla foobar bla bla foobar
コメントのみを自動フォーマットするには、'c' フラグを追加します。ソースコードで役立ちます。
'textwidth' を目的の幅に設定します。ゼロの場合、79 が使用されるか、画面の幅がこれより小さい場合は画面の幅が使用されます。
そして、いくつかの警告
テキストの一部が段落で適切に区切られていない場合、このテキストを変更すると、とにかくフォーマットされます。次のようにすることを検討してください
:set fo-=a
'w' フラグ(末尾のスペースは段落が続くことを意味する)を使用し、
dd で段落の最後の行を削除すると、段落は次の段落と結合されます。
変更されたテキストは元に戻すために保存されます。フォーマットも変更です。したがって、各フォーマットアクションは元に戻すためにテキストを保存します。これにより、かなりのメモリが消費される可能性があります。
長い段落や複雑なインデントを持つ段落のフォーマットは、時間がかかる場合があります。
:sor :sort :[range]sor[t][!] [b][f][i][l][n][o][r][u][x] [/{pattern}/] [range] 内の行をソートします。範囲が指定されていない場合、すべての行がソートされます。
[!] を指定すると、順序が逆になります。
[i] を指定すると、大文字と小文字が区別されません。
[l] を指定すると、ソートは現在の照合ロケールを使用します。実装の詳細:文字列の比較には strcoll() が使用されます。照合ロケールを確認または設定するには、
:language を参照してください。例
:language collate en_US.UTF-8
:%sort l
v:collate を使用して現在のロケールを確認することもできます。ロケールを使用したソートでは、通常、大文字と小文字が区別されません。これは Mac では正しく機能しません。
オプション [n][f][x][o][b] は相互に排他的です。
[n] を指定すると、行の最初の10進数({pattern}
の一致の後または内部)でソートが実行されます。1つの先頭の '-' は数値に含まれます。
[f] を指定すると、行内の浮動小数点数値でソートが行われます。浮動小数点数値の値は、テキスト({pattern}
の一致の後または内部)を str2float() 関数に渡したときと同様に決定されます。
[x] を指定すると、行内の最初の16進数({pattern}
の一致の後または内部)でソートが行われます。先頭の "0x" または "0X" は無視されます。先頭の '-' は1つだけ数値に含まれます。
[o] を指定すると、行内の最初の8進数({pattern}
の一致の後または内部)でソートが行われます。
[b] を指定すると、行内の最初の2進数({pattern}
の一致の後または内部)でソートが行われます。
[u](u は unique の略)を指定すると、連続する同一行の最初の行のみが保持されます([i] が使用されている場合は大文字と小文字を区別しません)。このフラグがない場合、連続する同一行は元の順序で保持されます。先頭と末尾の空白は、行を異なるものとみなす場合があることに注意してください。
/{pattern}/ が指定されていて [r] フラグがない場合、
{pattern}
と一致したテキストはスキップされ、一致した後のテキストでソートが行われます。
'ignorecase' はパターンに適用されますが、
'smartcase' は使用されません。スラッシュの代わりに、任意の文字以外の文字を使用できます。たとえば、2番目のカンマ区切りのフィールドでソートするには
:sort /[^,]*,/
仮想列10のテキストでソートするには(タブとスペースの違いを無視します)
:sort /.*\%10v/
行の最初の数値でソートするには、その前に何があっても
:sort /.\{-}\ze\d/
(説明: ".\{-}" は任意のテキストに一致し、"\ze" は一致の終わりを設定し、\d は数字に一致します。)[r] を指定すると、上記のようにスキップするのではなく、一致する
{pattern}
でソートが行われます。たとえば、各行の最初の3文字だけでソートするには
:sort /\a\a\a/ r
{pattern}
が使用されている場合、{pattern}
に一致しない行は現在の順序で保持されますが、{pattern}
に一致する行とは別に保持されます。逆順でソートした場合、ソートされた行の後に逆順に配置されます。そうでない場合は、ソートされた行の直前に元の順序で配置されます。
{pattern}
が空の場合(例:// が指定されている場合)、最後の検索パターンが使用されます。これにより、最初にパターンを試すことができます。
:sort
を :global
と一緒に使用しても、一致する行はソートされません。これはまったく役に立ちません。
:sort
は、l フラグが使用されていない限り、現在のロケールを使用しません。Vim は「安定した」ソートを実行します。
ソートは中断できますが、処理の後半で中断すると、行が重複する可能性があります。これは、使用されているシステムライブラリ関数にも依存します。