Usr_10
Nvim の :help
ページは、生成されており、ソースを tree-sitter-vimdoc パーサーで解析したものです。
VIM USER MANUAL - Bram Moolenaar 著
大きな変更を加える
第4章では、小さな変更を加えるいくつかの方法が説明されました。この章では、繰り返される変更や、大量のテキストに影響を与える可能性のある変更について説明します。ビジュアルモードでは、テキストのブロックに対してさまざまな操作を行うことができます。本当に複雑な処理を行うには、外部プログラムを使用します。
コマンドの記録と再生
「.」コマンドは直前の変更を繰り返します。しかし、単一の変更よりも複雑なことをしたい場合はどうすればよいでしょうか?そこで、コマンドの記録が登場します。手順は3つあります。
1. 「q{register}」コマンドは、{register}
という名前のレジスタへのキーストロークの記録を開始します。レジスタ名は a から z の間でなければなりません。2. コマンドを入力します。3. 記録を終了するには、q (追加の文字なし) を押します。
これで、「@{register}」コマンドを入力することで、マクロを実行できます。
実際にこれらのコマンドを使用する方法を見てみましょう。次のようなファイル名のリストがあるとします。
stdio.h
fcntl.h
unistd.h
stdlib.h
そして、次のようなものが必要だとします。
#include "stdio.h"
#include "fcntl.h"
#include "unistd.h"
#include "stdlib.h"
まず、最初の行の最初の文字に移動します。次に、次のコマンドを実行します。
qa レジスタ a にマクロの記録を開始します。^ 行の先頭に移動します。i#include "<Esc> 行の先頭に文字列 #include " を挿入します。$ 行の末尾に移動します。a"<Esc> 行の末尾に二重引用符 (") を追加します。j 次の行に移動します。q マクロの記録を停止します。
一度作業が終わったので、「@a」コマンドを3回入力することで、変更を繰り返すことができます。「@a」コマンドの前には回数を指定でき、マクロはその回数だけ実行されます。この場合、次のように入力します。
3@a
移動と実行
変更したい行がさまざまな場所にあるかもしれません。カーソルをそれぞれの場所に移動して、「@a」コマンドを使用するだけです。それを一度実行したら、「@@」でもう一度実行できます。これは入力が少し簡単です。ここで「@b」でレジスタ b を実行すると、次の「@@」はレジスタ b を使用します。再生方法を「.」を使用する方法と比較すると、いくつかの違いがあります。まず、「.」は1つの変更しか繰り返せません。上記の例で見たように、「@a」は複数の変更を実行でき、移動もできます。次に、「.」は最後の変更しか記憶できません。レジスタを実行すると、任意の変更を加えた後でも、「@a」を使用して記録されたコマンドを再生できます。最後に、26個の異なるレジスタを使用できます。したがって、実行する26個の異なるコマンドシーケンスを記憶できます。
レジスタの使用
記録に使用されるレジスタは、yank コマンドや delete コマンドで使用したレジスタと同じです。これにより、記録と他のコマンドを組み合わせてレジスタを操作できます。レジスタ n にいくつかのコマンドを記録したとします。「@n」で実行すると、何か間違ったことに気づきます。もう一度記録を試すこともできますが、また別の間違いを犯すかもしれません。代わりに、このトリックを使用してください。
G ファイルの末尾に移動します。o<Esc> 空行を作成します。「np レジスタ n からテキストを貼り付けます。これで、ファイル内にテキストとして入力したコマンドが表示されます。{edits}
間違っていたコマンドを変更します。これはテキストの編集と同じです。0 行の先頭に移動します。「ny$ 修正されたコマンドをレジスタ n に yank します。dd スクラッチ行を削除します。
これで、修正されたコマンドを「@n」で実行できます。(記録したコマンドに行区切りが含まれている場合は、例の最後の2つの項目を調整して、すべての行を含めるようにしてください。)
レジスタへの追加
これまでは、レジスタ名に小文字を使用してきました。レジスタに追加するには、大文字を使用します。単語を変更するコマンドをレジスタ c に記録したとします。それは正しく機能しますが、変更する次の単語の検索を追加したいとします。これは、次のようにして行うことができます。
qC/word<Enter>q
最初に「qC」で、c レジスタに記録し、追加します。したがって、大文字のレジスタ名に書き込むことは、同じ文字 (小文字) のレジスタに追加することを意味します。
これは、記録、yank コマンド、delete コマンドの両方で機能します。たとえば、一連の行を a レジスタに収集したいとします。次のコマンドで最初の行を yank します。
"ayy
次に、2行目に移動して、次のように入力します。
"Ayy
すべての行に対してこのコマンドを繰り返します。これで、a レジスタには、yank した順序でそれらの行がすべて含まれます。
「:substitute」コマンドを使用すると、行全体に対して文字列置換を実行できます。このコマンドの一般的な形式は次のとおりです。
:[range]substitute/from/to/[flags]
このコマンドは、[range] で指定された行で、"from" 文字列を "to" 文字列に変更します。たとえば、次のコマンドで、すべての行の "Professor" を "Teacher" に変更できます。
:%substitute/Professor/Teacher/
注: 「:substitute」コマンドは、完全にスペルアウトされることはほとんどありません。ほとんどの場合、省略形の「:s」が使用されます。ここからは、省略形が使用されます。
コマンドの前の「%」は、コマンドがすべての行で動作することを指定します。範囲がない場合、「:s」は現在の行でのみ動作します。範囲の詳細については、次のセクション
10.3 を参照してください。
デフォルトでは、「:substitute」コマンドは各行の最初の出現箇所のみを変更します。たとえば、上記のコマンドは、次の行を変更します。
Professor Smith criticized Professor Johnson today.
を
Teacher Smith criticized Professor Johnson today.
行のすべての出現箇所を変更するには、g (global) フラグを追加する必要があります。次のコマンド
:%s/Professor/Teacher/g
は (元の行から開始して) 次のようになります。
Teacher Smith criticized Teacher Johnson today.
その他のフラグには、p (print) があり、「:substitute」コマンドが最後に変更した行を出力します。c (confirm) フラグは、置換を実行する前に確認を求めるように「:substitute」に指示します。次のように入力します。
:%s/Professor/Teacher/c
Vim は "Professor" の最初の出現箇所を見つけ、変更しようとしているテキストを表示します。次のプロンプトが表示されます。
replace with Teacher (y/n/a/q/l/^E/^Y)?
この時点で、次のいずれかの回答を入力する必要があります。
y Yes; この変更を行います。n No; この一致をスキップします。a All; この変更と、残りのすべての変更を、さらなる確認なしに行います。q Quit; これ以上の変更を行いません。l Last; この変更を行い、その後終了します。CTRL-E
テキストを1行上にスクロールします。CTRL-Y
テキストを1行下にスクロールします。
substitute コマンドの "from" 部分は、実際にはパターンです。検索コマンドで使用されるものと同じ種類です。たとえば、このコマンドは、行の先頭にある場合にのみ "the" を置換します。
:s/^the/these/
"from" または "to" 部分にスラッシュが含まれている場合は、その前にバックスラッシュを置く必要があります。より簡単な方法は、スラッシュの代わりに別の文字を使用することです。たとえばプラス記号。
:s+one/two+one or two+
「:substitute」コマンドや他の多くの : コマンドは、選択した行に適用できます。これは範囲と呼ばれます。範囲の単純な形式は
{number}
,
{number}
です。たとえば
:1,5s/this/that/g
行1から5までで substitute コマンドを実行します。5行目も含まれます。範囲は常にコマンドの前に置かれます。
単一の数値を使用して、特定の1行をアドレス指定できます。
:54s/President/Fool/
範囲を指定しないと、ファイル全体で動作するコマンドもあります。現在の行で動作させるには、「.」アドレスが使用されます。「:write」コマンドがそのように動作します。範囲がないと、ファイル全体が書き込まれます。現在の行のみをファイルに書き込むには
:.write otherfile
最初の行には常に番号1があります。最後の行はどうでしょうか?このために「$」文字が使用されます。たとえば、カーソルから末尾までの行を置換するには
:.,$s/yes/no/
以前に使用した「%」範囲は、実際には、最初から最後の行までの「1,$」を表す短縮形です。
範囲でのパターンの使用
本の一章を編集していて、"grey" のすべての出現箇所を "gray" に置き換えたいとします。ただし、次の章ではなく、この章でのみ置き換えたいとします。章の境界線のみが最初の列に単語 "Chapter" を含んでいることがわかっています。このコマンドは、その場合に機能します。
:?^Chapter?,/^Chapter/s=grey=gray=g
検索パターンが2回使用されていることがわかります。最初の "?^Chapter?" は、このパターンに一致する現在の位置より上の行を検索します。したがって、?pattern? 範囲は、後方検索に使用されます。同様に、"/^Chapter/" は、次の章の開始を前方検索するために使用されます。スラッシュとの混同を避けるために、ここでは substitute コマンドで "=" 文字が使用されました。スラッシュや別の文字も同様に機能します。
加算と減算
上記のコマンドには、わずかなエラーがあります。次の章のタイトルに "grey" が含まれている場合、それも置き換えられてしまいます。もしかすると、それがあなたが望んだことかもしれませんが、そうでない場合はどうでしょうか?次に、オフセットを指定できます。パターンを検索し、その上の行を使用するには
/Chapter/-1
1の代わりに任意の数値を使用できます。一致した行の下の2行目をアドレス指定するには
/Chapter/+2
オフセットは、範囲内の他の項目でも使用できます。これを見てください。
:.+3,$-5
これは、カーソルの3行下から始まり、ファイルの最後の行の5行前で終わる範囲を指定します。
マークの使用
特定の場所の行番号を調べて記憶し、範囲に入力する代わりに、マークを使用できます。第3章で述べたように、マークを付けます。たとえば、領域の先頭にマークを付けるには "mt" を、末尾にマークを付けるには "mb" を使用します。次に、この範囲を使用して、マーク間の行 (マーク付きの行を含む) を指定できます。
:'t,'b
ビジュアルモードと範囲
ビジュアルモードでテキストを選択できます。次に、":" を押してコロンコマンドを開始すると、次のようになります。
:'<,'>
これでコマンドを入力すると、視覚的に選択された行の範囲に適用されます。
注: 行の一部を選択するためにビジュアルモードを使用したり、テキストのブロックを選択するために CTRL-V
を使用したりする場合でも、コロンコマンドは行全体に適用されます。これは将来のVimのバージョンで変更される可能性があります。
'<' と '>' は実際にはマークであり、ビジュアル選択の開始位置と終了位置に配置されます。マークは、別のビジュアル選択が行われるまで、その位置に留まります。したがって、"'<" コマンドを使用して、ビジュアル領域が開始された位置にジャンプできます。また、マークを他の項目と組み合わせることができます。
:'>,$
これは、ビジュアル領域の末尾からファイルの末尾までの行を対象とします。
複数の行
変更したい行数がわかっている場合は、数値を入力してから ":" を入力できます。たとえば、"5:" と入力すると、次のようになります。
:.,.+4
次に、使用したいコマンドを入力できます。これは、"." (現在の行) から ".+4" (4行下) までの範囲を使用します。したがって、5行にわたります。
":global" コマンドは、Vim のより強力な機能の1つです。パターンの一致を見つけて、そこでコマンドを実行できます。一般的な形式は次のとおりです。
:[range]global/{pattern}/{command}
これは、":substitute" コマンドに似ています。ただし、一致したテキストを別のテキストで置換する代わりに、コマンド
{command}
が実行されます。
注: ":global" 用に実行されるコマンドは、コロンで始まるものでなければなりません。ノーマルモードのコマンドを直接使用することはできません。
:normal コマンドを使用すると、これを実現できます。
たとえば、"foobar" を "barfoo" に変更したいが、C++ スタイルのコメント内のみに限定したいとします。これらのコメントは "//" で始まります。次のコマンドを使用します。
:g+//+s/foobar/barfoo/g
これは、":g" で始まります。これは ":global" の短縮形であり、":s" が ":substitute" の短縮形であるのと同様です。次に、プラス記号で囲まれたパターンが続きます。検索するパターンにはスラッシュが含まれているため、プラス記号を使用してパターンを区切ります。次に、"foobar" を "barfoo" に変更する substitute コマンドが続きます。global コマンドのデフォルトの範囲はファイル全体です。したがって、この例では範囲が指定されていません。これは、範囲がない場合は1行で動作する ":substitute" とは異なります。このコマンドは、行の途中に "//" が表示される行にも一致し、置換が "//" の前にも行われるため、完璧ではありません。
":substitute" と同様に、任意のパターンを使用できます。後でより複雑なパターンを学習したら、ここで使用できます。
CTRL-V
を使用すると、テキストの矩形領域の選択を開始できます。テキストブロックに対して特別な処理を行うコマンドがいくつかあります。
ビジュアルブロックモードで "$" コマンドを使用することには特別な点があります。最後に使用された移動コマンドが "$" の場合、ビジュアル選択のすべての行は、カーソルがある行が短い場合でも、行の末尾まで拡張されます。これは、カーソルを水平方向に移動する移動コマンドを使用するまで有効です。したがって、"j" を使用すると保持され、"h" を使用すると停止します。
テキストの挿入
コマンド "I{string}<Esc>" は、ビジュアルブロックの左側に、各行にテキスト {string}
を挿入します。まず、CTRL-V
を押してビジュアルブロックモードに入ります。次に、カーソルを移動してブロックを定義します。次に、I を入力して挿入モードに入り、挿入するテキストを入力します。入力すると、テキストは最初の行にのみ表示されます。<Esc>
を押して挿入を終了すると、テキストはビジュアル選択に含まれる残りの行に魔法のように挿入されます。例
include one
include two
include three
include four
"one" の "o" にカーソルを移動し、
CTRL-V
を押します。"3j" で "four" まで下に移動します。これで、4行にわたるブロック選択ができました。次に、次のように入力します。
Imain.<Esc>
結果
include main.one
include main.two
include main.three
include main.four
ブロックがブロックまで拡張されない短い行にまたがっている場合、その行にはテキストは挿入されません。たとえば、このテキストの最初と最後の行にある "long" という単語を含むビジュアルブロックを選択し、2番目の行ではテキストが選択されていないようにします。
This is a long line
short
Any other long line
^^^^ 選択されたブロック
次に、コマンド "Ivery <Esc>
" を使用します。結果は次のようになります。
This is a very long line
short
Any other very long line
短い行にはテキストは挿入されませんでした。
挿入する文字列に改行が含まれている場合、"I" は通常の挿入コマンドのように動作し、ブロックの最初の行のみに影響します。
"A" コマンドは、ブロックの右側に追加することを除いて、同じように動作します。また、短い行にもテキストを挿入します。したがって、短い行にテキストを追加するかどうかを選択できます。"A" には特別なケースが1つあります。ビジュアルブロックを選択し、次に "$" を使用して、各行の末尾までブロックを拡張します。"A" を使用すると、各行の末尾にテキストが追加されます。上記の同じ例を使用し、次に "$A XXX<Esc>" と入力すると、次の結果が得られます。
This is a long line XXX
short XXX
Any other long line XXX
これは "$" コマンドを実際に使用する必要があります。Vim は、それが使用されたことを記憶します。他の移動コマンドを使用して、カーソルを最も長い行の末尾に移動して同じ選択を行っても、同じ結果は得られません。
テキストの変更
ビジュアルブロックの "c" コマンドは、ブロックを削除してから、挿入モードにして文字列を入力できるようにします。文字列は、ブロック内の各行に挿入されます。上記の "long" という単語の同じ選択から始め、次に "c_LONG_<Esc>" と入力すると、次のようになります。
This is a _LONG_ line
short
Any other _LONG_ line
"I" の場合と同様に、短い行は変更されません。また、新しいテキストに改行を入力することはできません。
"C" コマンドは、ブロックの左端から行末までのテキストを削除します。次に、挿入モードになり、文字列を入力できるようになり、それが各行の末尾に追加されます。もう一度同じテキストから開始し、"Cnew text<Esc>" と入力すると、次のようになります。
This is a new text
short
Any other new text
"long" という単語のみが選択されていても、その後のテキストも削除されることに注意してください。したがって、ビジュアルブロックの左端の位置だけが重要です。繰り返しになりますが、ブロックに到達しない短い行は除外されます。
ブロック内の文字を変更するその他のコマンド
~ 大文字と小文字を入れ替える (a -> A および A -> a) U 大文字にする (a -> A および A -> A) u 小文字にする (a -> a および A -> a)
文字による埋め込み
ブロック全体を1つの文字で埋めるには、"r" コマンドを使用します。再度、上記の同じ例のテキストから開始し、次に "rx" と入力します。
This is a xxxx line
short
Any other xxxx line
シフト
コマンド ">" は、選択したテキストを1シフト分だけ右に移動し、空白を挿入します。このシフトの開始点は、ビジュアルブロックの左端です。再び同じ例を使用すると、">" は次の結果になります。
This is a long line
short
Any other long line
シフト量は、
'shiftwidth' オプションで指定されます。4つのスペースを使用するように変更するには、次のとおりです。
:set shiftwidth=4
コマンド "<" は、ブロックの左端にある空白を1シフト分削除します。このコマンドは、そこにあるテキストの量によって制限されます。したがって、利用可能な空白がシフト量よりも少ない場合は、可能な限り削除します。
行の結合
コマンド "J" は、選択したすべての行を1行に結合します。したがって、改行を削除します。実際には、改行、先行空白、末尾空白は、1つの空白で置換されます。行の終わりには、2つのスペースが使用されます(
'joinspaces' オプションで変更可能)。ここでよく知っている例を使用してみましょう。"J" コマンドを使用した結果は次のとおりです。
This is a long line short Any other long line
"J" コマンドはブロック単位の選択を必要としません。"v" および "V" 選択でもまったく同じように動作します。
空白を変更したくない場合は、"gJ" コマンドを使用します。
電子メールメッセージを作成するときに、別のファイルを含めたい場合があります。これは、":read {filename}
" コマンドで行うことができます。ファイルの内容は、カーソル行の下に配置されます。このテキストから開始します。
こんにちは、ジョン、
バグを修正するdiffは次のとおりです。
さようなら、ピエール。
カーソルを2行目に移動して、次のように入力します。
:read patch
"patch" という名前のファイルが挿入され、次の結果になります。
こんにちは、ジョン、
バグを修正するdiffは次のとおりです。
2c2
< for (i = 0; i <= length; ++i)
---
> for (i = 0; i < length; ++i)
さようなら、ピエール。
":read" コマンドは範囲を受け入れます。ファイルは、この範囲の最後の行番号の下に配置されます。したがって、":$r patch" は、ファイル "patch" をファイルの末尾に追加します。最初の行の上にファイルを読み込みたい場合はどうすればよいでしょうか?これは、行番号ゼロで行うことができます。この行は実際には存在せず、ほとんどのコマンドで使用するとエラーメッセージが表示されます。ただし、このコマンドは許可されています。
:0read patch
ファイル "patch" は、ファイルの最初の行の上に配置されます。
行範囲の書き込み
行範囲をファイルに書き込むには、":write" コマンドを使用できます。範囲を指定しない場合は、ファイル全体を書き込みます。範囲を指定した場合は、指定された行のみが書き込まれます。
:.,$write tempo
これにより、カーソルからファイルの末尾までの行がファイル "tempo" に書き込まれます。このファイルが既に存在する場合は、エラーメッセージが表示されます。Vim は、既存のファイルを誤って上書きしないように保護します。何をしているのかを理解しており、ファイルを上書きする場合は、! を追加してください。
:.,$write! tempo
注意: ! は、":write" コマンドの直後に、空白を入れずに続ける必要があります。そうでない場合は、フィルターコマンドになります。これについては、この章で後ほど説明します。
ファイルへの追加
この章の最初のセクションでは、複数の行をレジスターに収集する方法について説明しました。同じことをファイル内の行を収集するために行うことができます。次のコマンドを使用して、最初の行を書き込みます。
:.write collection
次に、収集したい2行目にカーソルを移動し、次のように入力します。
:.write >>collection
">>" は、Vim に「コレクション」ファイルが新しいファイルとして書き込まれるのではなく、行が末尾に追加される必要があることを伝えます。これを何度でも繰り返すことができます。
プレーンテキストを入力している場合、各行の長さがウィンドウに収まるように自動的にトリミングされると便利です。テキストの挿入中にこれを行うには、
'textwidth' オプションを設定します。
:set textwidth=78
vimrcファイルの例では、このコマンドがすべてのテキストファイルに使用されていたことを覚えているかもしれません。したがって、そのvimrcファイルを使用している場合は、すでに使用していたことになります。
'textwidth'の現在の値を確認するには、
:set textwidth
これで、行は最大78文字までになるように折り返されます。ただし、行の途中にテキストを挿入したり、いくつかの単語を削除したりすると、行が長すぎたり短すぎたりするようになります。Vimはテキストを自動的に整形しません。現在の段落を整形するには、Vimに
gqap
これは、「gq」コマンドから始まり、これは演算子です。次に「ap」が続き、これは「段落」を表すテキストオブジェクトです。段落は、空行によって次の段落と区切られます。
注:空白文字を含む空行は、段落を区切りません。これは気づきにくい点です!
「ap」の代わりに、任意の移動コマンドまたはテキストオブジェクトを使用できます。段落が適切に区切られている場合は、このコマンドを使用してファイル全体を整形できます。
gggqG
「gg」は最初の行に移動し、「gq」は整形演算子、「G」は最後の行にジャンプする移動コマンドです。
段落が明確に定義されていない場合は、手動で選択した行だけを整形できます。カーソルを整形したい最初の行に移動します。「gqj」コマンドから始めます。これにより、現在の行とその下の行が整形されます。最初の行が短かった場合は、次の行の単語が追加されます。長すぎた場合は、単語が次の行に移動されます。カーソルは2行目に移動します。これで、「.」を使用してコマンドを繰り返すことができます。整形したいテキストの末尾に到達するまで続けます。
セクションヘッダーが小文字で記述されたテキストがあるとします。「section」という単語をすべて大文字にしたいとします。これは「gU」演算子を使用して行います。カーソルを最初の列に置いて開始します。
gUw
section header ----> SECTION header
「gu」演算子はまったく逆のことを行います。
guw
SECTION header ----> section header
また、「g~」を使用して大文字小文字を入れ替えることもできます。これらはすべて演算子であるため、任意の移動コマンド、テキストオブジェクト、およびVisualモードで機能します。演算子を行に対して機能させるには、演算子を2回繰り返します。削除演算子は「d」なので、行を削除するには「dd」を使用します。同様に、「gugu」は行全体を小文字にします。これは「guu」と短縮できます。「gUgU」は「gUU」と短縮され、「g~g~」は「g~~」と短縮されます。例:
g~~
Some GIRLS have Fun ----> sOME girls HAVE fUN
Vimには非常に強力なコマンドセットがあり、何でもできます。ただし、外部コマンドの方がより適切またはより高速に実行できることもあります。コマンド「!{motion}{program}」は、テキストのブロックを取得し、外部プログラムを通してフィルター処理します。言い換えれば、
{program}
で表されるシステムコマンドを実行し、
{motion}
で表されるテキストブロックを入力として渡します。次に、このコマンドの出力によって、選択したブロックが置き換えられます。Unixフィルターに慣れていない場合は、概要がわかりにくい可能性があるため、例を見てください。sortコマンドはファイルをソートします。次のコマンドを実行すると、ソートされていないファイルinput.txtがソートされ、output.txtに書き込まれます。これはUnixとWindowsの両方で機能します。
sort <input.txt >output.txt
Vimで同じことを実行します。ファイルの1行目から5行目をソートするとします。最初にカーソルを1行目に置きます。次に、次のコマンドを実行します。
!5G
「!」は、フィルター操作を実行していることをVimに伝えます。Vimエディターは、どのファイルの部分をフィルター処理するかを示す移動コマンドが続くことを期待します。「5G」コマンドは、Vimに5行目に移動するように指示するため、1行目(現在の行)から5行目をフィルター処理することがわかります。フィルター処理の準備として、カーソルは画面の下部に移動し、「!」プロンプトが表示されます。ここで、フィルタープログラムの名前(この場合は「sort」)を入力できます。したがって、完全なコマンドは次のようになります。
!5Gsort<Enter>
結果として、最初の5行でソートプログラムが実行されます。プログラムの出力によって、これらの行が置き換えられます。
line 55 line 11 line 33 line 22 line 11 --> line 33 line 22 line 44 line 44 line 55 last line last line
「!!」コマンドは、現在の行をフィルターを通してフィルター処理します。Unixでは、「date」コマンドは現在の日時を出力します。「!!date<Enter>」は、現在の行を「date」の出力に置き換えます。これは、ファイルにタイムスタンプを追加するのに役立ちます。
動作しない場合
シェルを起動し、テキストを送信し、出力をキャプチャするには、Vimがシェルの動作を正確に把握している必要があります。フィルター処理で問題が発生した場合は、次のオプションの値を確認してください。
Unixでは、シェルには「sh」のようなものと「csh」のようなものの2種類しかないため、これはほとんど問題になりません。Vimは
'shell'オプションを確認し、
'shell'のどこかに「csh」があるかどうかによって、関連するオプションを自動的に設定します。ただし、MS-Windowsにはさまざまなシェルがあり、フィルター処理を機能させるためにオプションを調整する必要がある場合があります。詳細については、オプションのヘルプを確認してください。
コマンド出力の読み取り
現在のディレクトリの内容をファイルに読み込むには、これを使用します。
Unixの場合
:read !ls
MS-Windowsの場合
:read !dir
「ls」または「dir」コマンドの出力がキャプチャされ、カーソルの下のテキストに挿入されます。これはファイルの読み取りと似ていますが、「!」はコマンドが続くことをVimに伝えるために使用されます。コマンドには引数を含めることができます。また、範囲を使用して、Vimが行を配置する場所を指示できます。
:0read !date -u
これにより、ファイルの先頭に現在の日時がUTC形式で挿入されます。(「-u」引数を受け入れるdateコマンドがある場合。)「!!date」の使用との違いに注意してください。これは行を置き換えますが、":read !date"は行を挿入します。
テキストをコマンドに書き込む
Unixコマンド「wc」は単語数を数えます。現在のファイルの単語数を数えるには、
:write !wc
これは以前と同じ書き込みコマンドですが、ファイル名の代わりに「!」文字と外部コマンドの名前が使用されます。書き込まれたテキストは、指定されたコマンドに標準入力として渡されます。出力は次のようになります。
「wc」コマンドは詳細ではありません。つまり、4行、47語、249文字があるということです。
この間違いに注意してください。
:write! wc
これにより、現在のディレクトリにファイル「wc」が強制的に書き込まれます。空白はここで重要です!
画面の再描画
外部コマンドがエラーメッセージを生成した場合、表示が乱れている可能性があります。Vimは非常に効率的で、再描画が必要な画面の部分だけを再描画します。しかし、別のプログラムが書き込んだ内容については認識できません。Vimに画面を再描画するには、
CTRL-L