Next: , Previous: , Up: 目次   [Index]


大規模な編輯

*usr_10.txt*	For Vim バージョン 8.1.  Last change: 2006 Nov 05

		     VIM USER MANUAL - by Bram Moolenaar

			     大規模な編輯

4 章では、小さな變更を加へる方法について說明しました。この章では、同じ操作を再實行する方法や、廣汎圍のテキストを變更する方法を說明します。ビジュアルモードでは選擇範圍にさまざまな處理を實行できます。外部プログラムを使へばとても複雜な處理もできます。

|10.1|操作の記錄と再實行
|10.2|置換
|10.3|コマンドの範圍指定
|10.4|global コマンド
|10.5|矩形選擇
|10.6|ファイルの一部の保存と讀み込み
|10.7|テキストの整形
|10.8|大文字/小文字の變換
|10.9|外部プログラムを使ふ

操作の記錄と再實行

"." コマンドを使へば直前の變更を繰り返せますが、複數のコマンドを組み合はせた、もつと複雜な操作を繰り返すにはどうすればいいでせうか。それには記錄コマンドを使ひます。次の手順で記錄できます:

  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"

まづ、1 行目の行頭に移動してください。そして次のコマンドを實行します。

qaレジスタ a へのマクロの記錄を開始。
^行頭に移動。
i#include "<Esc>行頭に #include " を插入。
$行末に移動。
a"<Esc>行末に引用符 (") を追加。
j次の行に移動。
qマクロの記錄を終了。

さて、一回分の作業はこれで終はりました。"@a" コマンドを使つて變更を繰り返してみてください。

"@a" コマンドには繰り返し回數を指定できます。3 回繰り返すには、次のやうにします:

3@a

移動と實行

變更したい行がいろんな場所に分散してゐる場合は、それぞれの場所に移動してから "@a" コマンドを使ひます。一度でも再實行すると、次からは "@@" で同じマクロを再實行できます。"@@" の方が少しだけ入力が簡單です。例へば、"@b" でレジスタ b を實行すると、次に "@@" を實行したときはレジスタ b が使はれます。

マクロの實行と "." にはいくつか違ひがあります。まづ第一に、"." は 1 つの變更しか繰り返せません。上述の例のやうに、"@a" では複數の變更やカーソルの移動も繰り返せます。第 2 に、"." は直前の變更しか繰り返せません。レジスタを實行する方法なら、他の變更を加へた後でも、"@a" を使つて、記錄されたコマンドを繰り返せます。最後に、レジスタは 26 個あります。つまり、26 個のコマンド操作を記錄しておけるのです。

レジスタを使ふ

記錄に用ゐるレジスタはヤンクや削除で使つてゐるのと同じものです。そのため、レジスタを操作して、記錄されたコマンドと他のコマンドを合成することができます。

レジスタ n にいくつかのコマンドが記錄されてゐるとします。ところが、"@n" で實行してみると、ミスがあることに氣づきました。最初から記錄をやり直すこともできますが、また何か閒違へてしまふかもしれません。代はりに、次のやうなテクニックを使つてみませう。

Gファイルの最後にジャンプ。
o<Esc>空行を作成。
"npレジスタ n の內容をプット。記錄されたコマンドがテキストとして表示されます。
{edits}閒違つてゐる部分を修正。普通にテキストを編輯するのと同じです。
0行頭に移動。
"ny$修正したコマンドをレジスタ n にヤンク
dd不要になつた最終行を削除

さて、"@n" で正しいコマンドが實行されるやうになりました。(記錄されたコマンドに改行が含まれてゐる場合は、上記の最後の二項目はその全內容が含まれるやうにしてください)

レジスタに追記

これまで、レジスタ名には小文字を使つてきました。レジスタに追記するには大文字を使ひます。

單語を變更するためのコマンドがレジスタ c に記錄されてゐるとします。これは正しく動作するのですが、變更すべき次の單語を檢索する處理を追加したくなりました。次のやうにすればできます:

qC/word<Enter>q

レジスタ c に追記するために "qC" で記錄を開始してゐます。レジスタ名を大文字で書くと、同じレジスタに追記するといふ意味になるのです。

これは記錄コマンドだけでなく、ヤンクや削除コマンドでも同じです。例へば、いくつかの行をレジスタ a に集めたいとします。最初の行を次のコマンドでヤンクしませう:

"aY

次の行に移動し、このやうに入力します:

"AY

これを全ての行で實行します。レジスタ a にはヤンクした順にすべての行が保存されます。

置換

":substitute" コマンドを使ふと、指定した範圍內の文字列を置換できます。コマンドの書式は次のとほりです:

:[range]substitute/from/to/[flags]

このコマンドは [range] で指定された行範圍の中の文字列 "from" を文字列 "to" に置換します。例へば、次のコマンドを實行すると、すべての行の "Professor" が "Teacher" に置換されます:

:%substitute/Professor/Teacher/

Note:
":substitute" の綴りを完全に入力するやうな人はまづいません。普通は短縮形の ":s" が使はれます。以降ではこの短縮形を使ひます。

コマンドの前の "‘%’" はファイル全體を意味する範圍指定です。範圍指定がない場合は、現在行のみ置換されます。範圍指定については次の節で述べます |10.3|。

初期設定では、各行の最初に見つかつたものだけが變更されます。例へば、上のコマンドを實行すると、次の行は:

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=出力) フラグを指定すると、最後に變更された行が表示されます。c (confirm=確認) フラグを指定すると、1 つ 1 つ確認しながら置換できます。次のやうにして使ひます:

:%s/Professor/Teacher/c

"Professor" が現れる最初の場所が檢索され、置換される豫定のテキストが表示されます。そして、次のやうなプロンプトが表示されます:

Teacher に置換しますか? (y/n/a/q/l/^E/^Y)

ここでは次のいづれかの返答が必要です。

y Yes;置換する。
n No;置換せずにスキップ。
a All;置換する。以降すべて確認なしで置換する。
q Quit;置換を終了する。
l Last;置換をしてから終了する。
CTRL-E畫面を 1 行上にスクロールする。
CTRL-Y畫面を 1 行下にスクロールする。

置換コマンドの "from" の部分は實際にはパターン (正規表現) です。これは檢索コマンドで使ふのと同じものです。例へば、次のコマンドでは、行頭に現れる "the" のみが置換されます:

:s/^the/these/

"from" や "to" にスラッシュ (‘/’) を含めるには、バックスラッシュ (‘\’) を前置する必要がありますが、スラッシュの代はりに他の文字を使へばその必要はありません。例へばプラス (‘+’) など:

:s+one/two+one or two+

コマンドの範圍指定

":substitute" などの : コマンドは、實行する範圍を指定できます。これを範圍指定(range) と呼びます。

範圍指定の基本形式は {number},{number} です。例:

:1,5s/this/that/g

1 行目から 5 行目まで置換コマンドが實行されます。5 行目も範圍に入ります。範圍指定はコマンドの前に指定してください。

特定の 1 行だけ指定するには、數字を 1 つだけ指定します:

:54s/President/Fool/

一部のコマンドは範圍指定を省略するとファイル全體を處理します。そのやうなコマンドで現在行だけを處理するには "." を使ひます。例へば、":write" コマンドの範圍指定を省略するとファイル全體が保存されますが、現在行だけを保存するには、次のやうにします:

:.write otherfile

1 行目の行番號は 1 です。最終行は "$" で指定できます。例へば、現在行から最終行までの範圍で置換をするには、次のやうにします:

:.,$s/yes/no/

先程使つた "%" は "1,$"、つまり 1 行目から最終行までと同じことです。

パターンを使つた範圍指定

例へば、本のどこかの章を編輯してゐて、その章で使はれてゐる "grey" を全て"gray" に置換したいとします。ただし、その章だけを置換、つまり次章は變更したくありません。章は行頭が "Chapter" で始まる行で區切られてゐます。次のコマンドでそれができます:

:?^Chapter?,/^Chapter/s=grey=gray=g

パターン檢索が 2 回使はれてゐます。最初の "?^Chapter?" では現在行から上に向かつて檢索してゐます。この ‘?pattern?’ といふ範圍の書き方は後方檢索をするために使ひます。同樣に、"/^Chapter/" で前方檢索を行ひ、次章の先頭を檢索してゐます。

上の例では、說明をわかりやすくするために、置換コマンドの區切りに "=" を使つてゐます。スラッシュでも他の文字でも動作に違ひはありません。

加算と減算

實は上のコマンドには少しだけ閒違ひがあります。次章のタイトルに "grey" が含まれてゐると、それも置換されてしまひます。それが期待どほりの動作ならいいのですが、さうでなければ? その場合はオフセットを指定すればよいのです。

パターンを檢索し、その 1 行上の行を使ふには、次のやうにします:

/Chapter/-1

數字は 1 でなくても構ひません。ヒットした行の 2 行下を指定するなら、次のやうにします:

/Chapter/+2

オフセットは他の範圍指定にも使へます。例へば:

:.+3,$-5

これは、現在行の 3 行下から、最終行の 5 行上までの範圍を指定してゐます。

マークを使ふ

行番號を直接指定する代はりに、マークを使ふこともできます。

マークの使ひ方は 3 章で說明しました。例へば、範圍指定したい領域の先頭を "mt" でマークし、領域の末尾を "mb" でマークします。すると、マークを使つて次のやうに範圍指定をすることができます (マークのある行は範圍に含まれます):

:'t,'b

ビジュアルモードと範圍指定

ビジュアルモードでテキストを選擇し、":" を押してコマンドラインモードに入ると、次のやうな表示になります:

:'<,'>

この狀態でコマンドを入力すると、そのコマンドはビジュアル選擇した範圍に對して適用されます。

Note:
行の一部だけビジュアルモードで選擇した場合や、CTRL-V で矩形選擇した場合でも、コマンドは行全體に適用されます。これは將來、變更されるかも知れません。

實は、‘'<’ と ‘'>’ はマークです。ビジュアル選擇の始點と終點を示してゐます。このマークは、次にビジュアル選擇するまで同じ場所を指してゐます。そのため、 "'<" コマンドでその場所にジャンプすることもできます。マークと他の範圍指定方法を組み合はせることもできます:

:'>,$

これは、選擇範圍の終點からファイルの末尾までを範圍指定してゐます。

行數指定

變更したい行數が分かつてゐるなら、その數を入力してから ":" を押してください。例へば、"5:" と入力すると、次のやうな表示になります:

:.,.+4

續けて、使ひたいコマンドを入力してください。これは、"." (現在行) から ".+4" (4 行下) が範圍指定されてゐます。つまり範圍は 5 行といふことです。

global コマンド

":global" コマンドは Vim の中でも最も强力な機能の 1 つです。パターンにヒットする行を檢索し、その行で、任意のコマンドを實行できます。コマンドの書式は次のとほりです:

:[range]global/{pattern}/{command}

":substitute" コマンドに似てゐますが、文字列が置換されるのではなく、{command} コマンドが實行されます。

Note:
":global" で實行できるのは "‘:’" で始まるコマンドだけです。ノーマルモードコマンドはそのままでは使へません。|:normal| コマンドを使つてください。

例へば、C++ スタイルのコメント內の "foobar" を "barfoo" に置換したいとします。コメントは "//" で開始されてゐます。次のコマンドを使ひませう:

:g+//+s/foobar/barfoo/g

最初の ":g" は ":global" の短縮形です。":substitute" を ":s" と縮めるのと同じです。次に "+" 記號で圍まれたパターンがあります。今囘はスラッシュを含んだパターンを檢索するので、セパレータに "+" を使つてゐます。その後に、"foobar" を"barfoo" に置換するコマンドが續きます。

範圍指定を省略した場合、global コマンドはファイル全體に適用されます。そのため、上の例では範圍指定をしてゐません。この點は、":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

選擇範圍の途中に短い行があつて、その行の文字が選擇範圍に入つてなかつた場合は、その行には何も插入されません。例へば、以下のテキストで、1 行目と 3 行目の"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" コマンドも同樣の動作をします。ただし、テキストは右側に插入されます。そして、短い行にもテキストが插入されます。"I" と使ひ分ければ、短い行にテキストを插入するかどうかを選擇することができます。

"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 and A -> a)
U大文字化する (a -> A and A -> A)
u小文字化する (a -> a and A -> a)

1 つの文字で埋める

選擇範圍全體を 1 つの文字で埋めるには "r" コマンドを使ひます。またまた、上で用いた例ですが、今度は "long" を選擇した上で "rx" と入力します:

This is a xxxx line
short
Any other xxxx line

Note:
行末を越えて矩形選擇したい場合は、25 章の ’virtualedit’ の說明を參照してください。

シフト

">" コマンドを使ふと、選擇されたテキストを右側にシフトできます。閒は空白で埋められます。シフトの開始位置は矩形選擇の左端です。

また同じ例を使つて、今度は ">" を實行すると次のやうになります:

This is a     long line
short
Any other     long line

シフトされる桁數は ’shiftwidth’ オプションで設定します。これを 4 に變更するには次のやうにします:

:set shiftwidth=4

"<" コマンドを使ふと、選擇範圍の左側にある空白を 1 つのシフト分だけ削除できます。このコマンドは選擇範圍の左側にある空白の量によつて制限されます。つまり、空白がシフト量より少ない場合は、可能な範圍だけ空白が削除されます。

行の結合

"J" コマンドを使ふと、選擇範圍の行を 1 行に連結できます。つまり改行が削除されます。正確には、改行、行頭の空白、行末の空白、が 1 つの空白で置換されます(’joinspaces’ オプションで動作を變更できます)。

さて、また同じ例を使つて、今度は "J" を實行します:

This is a long line short Any other long line

"J" コマンドは矩形選擇以外でも使へます。"v" や "V" で選擇した場合も全く同じ動作をします。

空白を變更したくない場合は、"gJ" コマンドを使つてください。

ファイルの一部の保存と讀み込み

メールを書いてゐるとき、他のファイルを取り込みたいことがあるかもしれません。それには ":read {filename}" コマンドを使ひます。指定したファイルの內容が現在行の下にプットされます。

次の文章でやつてみませう。

Hi John,
Here is the diff that fixes the bug:
Bye, Pierre.

カーソルを 2 行目に移動し、次のコマンドを入力します:

:read patch

"patch" といふ名前のファイルが插入され、次のやうになります:

Hi John,
Here is the diff that fixes the bug:
2c2
<   for (i = 0; i <= length; ++i)
---
>   for (i = 0; i < length; ++i)
Bye, Pierre.

":read" コマンドに範圍指定すると、指定されたファイルが範圍指定された行の下にプットされます。例へば、":$r patch" なら、"patch" の內容がファイルの末尾に追加されます。

ファイルの先頭に讀み込むにはどうすればいいでせうか。それには、行番號 0 を指定します。そのやうな行は實際にはないので、他のコマンドに指定するとエラーになるかもしれませんが、このコマンドでは指定できます:

:0read patch

"patch" の內容がファイルの先頭にプットされます。

ファイルの一部だけ保存

ファイルの一部だけ保存するには、":write" コマンドを使ひます。範圍指定を省略するとファイル全體が保存されますが、範圍指定すると、指定した範圍の行だけが保存されます:

:.,$write tempo

このコマンドで、現在行から最終行までが "tempo" に保存されます。ファイルが既に存在してゐる場合はエラーメッセージが表示されるので、閒違つてファイルを上書きする心配はありません。ファイルを上書きしたい場合は、! を付けてください:

:.,$write! tempo

注意: ! は ":write" コマンドの直後に指定してください。閒に空白を入れると、フィルタコマンドになつてしまひます。フィルタコマンドについては後で說明します。

ファイルに追記する

この章の最初の節で、複數の行をレジスタに集める方法を說明しました。同じやうに、複數の行をファイルに集めることができます。まづ、次のコマンドで最初の行を保存してください:

:.write collection

次に、2 行目として保存したい行に移動し、次のやうに入力します:

:.write >>collection

新規ファイルとして保存するのではなく、"‘>>’" を使つて、ファイルの末尾に追記することを指示してゐます。あとは必要なだけこの操作を繰り返してください。

テキストの整形

文章を入力してゐるとき、行が畫面內に收まるやうに自動的に改行してくれたら便利ですよね。さうするには、’textwidth’ オプションを設定します:

:set textwidth=72

vimrc ファイルの見本 (|vimrc_example.vim|) で、テキストファイルが開かれたときにこのオプションが設定されるやうにしてゐたのを覺えてゐるでせうか。したがつて、vimrc ファイルの見本をそのまま使つてゐるなら、オプションは既に設定されてゐます。現在の ’textwidth’ の設定を確認するには、次のやうにします:

:set textwidth

これで、行が 72 文字より長くなつた行が改行されるやうになりました。ただし、行の途中からテキストを插入したときや、單語削除をしたときは、行が 72 文字よりも長くなつたり短くなつたりします。既存の文章が自動的に再整形されたりはしません。

現在の段落を整形するには、次のコマンドを使ひます:

gqap

これは "gq" といふオペレータで始まるコマンドです。次に "ap" といふテキストオブジェクトが指定されてゐます。これは "a paragraph" (1 つの段落) といふ意味です。

段落は、空行で區切られたテキストです。

Note:
空行 (改行文字だけの行) と空白行 (空白文字だけの行) は違ひます。段落の區切りは「空行」だけです。見た目では氣づきにくいので注意!

"ap" 以外のテキストオブジェクトや、移動コマンドも指定できます。段落が正しく分割されてゐるなら、次のコマンドでファイル全體を整形できます:

gggqG

これは、"gg" で 1 行目に移動し、"gq" で整形オペレータを指定、"G" でファイル末尾までジャンプしてゐます。

段落の區切りが明確でない場合は、手動で行を選擇して整形してください。整形したい範圍の最初の行に移動し、"gqj" コマンドを使ひます。現在行と次の行が整形されます。現在行が短い場合は、次の行の單語が現在行に移動します。現在行が長い場合は、現在行の單語が次の行に移動します。カーソルは次の行に移動してゐるので、"." でコマンドを再實行できます。あとは必要なだけ繰り返してください。

大文字/小文字の變換

"‘section header’" といふ小文字のテキストがあります。これを、"‘section’" だけ大文字にするには、"gU" オペレータを使ひます。カーソルを先頭に移動して、コマンドを實行してください:

                 gUw
<   section header      ---->      SECTION header

"gu" オペレータで小文字に變換できます:

                 guw
<    SECTION header     ---->      section header

"g~" を使ふと、大文字と小文字を切り替へることができます。今說明したのは全てオペレータなので、移動コマンドやテキストオブジェクトやビジュアルモードと組み合はせることができます。

オペレータを行に適用するには、オペレータを 2 回繰り返してください。例へば、"d" は削除オペレータなので、"dd" で 1 行削除になります。同じやうに、"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 でも Microsoft Windows でも動作します)

sort <input.txt >output.txt

さて、同じことを Vim でやつてみませう。1 行目から 5 行目までをソートしてみます。カーソルを 1 行目に移動して、次のコマンドを實行します:

!5G

"!" はフィルタを實行するためのコマンドです。次に、移動コマンドを實行し、フィルタに渡す範圍を指定してゐます。"5G" は 5 行目に移動するコマンドなので、1 行目(現在行) から 5 行目までがフィルタの範圍として指定されます。

カーソルが畫面の一番下に移動し、! プロンプトが表示されるので、フィルタプログラムの名前を入力してください。この場合なら "sort" ですね。したがつて、コマンドは全部で次のやうになります。

!5Gsort<Enter>

コマンドを實行すると、最初の五行が sort プログラムで處理され、元のテキストが、プログラムの出力で置き換へられます。

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" の出力で置き換へることができます。これはファイルに日附を插入するのに便利です。

うまく動作しない場合

シェルを起動し、テキストを入力し、出力を取り込むためには、シェルが正しく實行できるやうに設定されてゐる必要があります。フィルタ處理に問題がある場合は、以下のオプションを確認してください。

shell外部プログラムを實行するために使はれるプログラムの指定
shellcmdflagシェルにコマンドを渡すための引數指定
shellquoteコマンドを圍むためのクォート文字
shellxquoteコマンドとリダイレクトを圍むためのクォート文字
shelltypeシェルの種類 (Amiga 專用)
shellslashファイル名のバックスラッシュをスラッシュにする (MS-Windows 系專用)
shellredirコマンドの出力をファイルに保存するために指定する文字列

Unix では、設定する必要はほとんどありません。なぜなら、おそらく sh 系か csh 系のシェルが使はれてゐるからです。Vim は ’shell’ に "csh" といふ文字列が含まれてゐるかどうかでシェルの種類を判斷し、關聯したオプションを自動的に設定します。

しかし、MS-Windows ではいろんなシェルがあるので、フィルタを動作させるためには、オプションを設定する必要があるかもしれません。詳しくはオプションのヘルプを參照してください。

コマンドの出力を讀み込む

カレントディレクトリの內容を讀み込むには、次のやうにします。

Unix系:

:read !ls

MS-Windows系:

:read !dir

"ls" や "dir" コマンドの出力が取り込まれ、カーソルの下に插入されます。これはファイルの讀み込みに似てゐますが、"!" を使つてコマンドを指定してゐる點が違ひます。

コマンドに引數を指定することもできます。出力をプットする場所を指定することもできます:

:0read !date -u

これはファイルの先頭に現在の日附と時閒を UTC 形式で插入します ("-u" 引數が使へる date コマンドが必要ですよ。當たり前ですが...)。

Note:
"!!date" が現在行を置き換へるのに對して、":read !date" は行を插入するといふ點が違ひます。

コマンドにテキストを入力する

Unix の "wc" コマンドは單語を數へることができます。編輯中のファイル內の單語を數へるには、次のやうにします:

:write !wc

これは上述の write コマンドと似てゐますが、"!" を使つて外部プログラムを指定してゐる點が違ひます。テキストがコマンドの標準入力に渡され、次のやうな結果が表示されます:

4      47     249

"wc" コマンドは冗長なメッセージを出力しません。この出力は、行數が 4、單語數が 47、文字數が 249 であることを示してゐます。

次のやうな閒違ひに氣をつけてください:

:write! wc

これはカレントディレクトリの "wc" といふファイルに强制上書きするコマンドです。空白は重要ですよ!

畫面の再描畫

外部プログラムがエラーを起こした場合、畫面がめちやくちやになつてしまふことがあります。Vim は必要だと思はれる最小限の領域だけを再描畫しますが、他のプログラムの出力內容を完全に把握することはできません。次のコマンドで畫面を再描畫できます:

CTRL-L

Next: , Previous: , Up: 目次   [Index]