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


繰り返し

*usr_26.txt*	For Vim バージョン 8.1.  Last change: 2006 Apr 24

		     VIM USER MANUAL - by Bram Moolenaar

				   繰り返し

ほとんどの編輯作業は手順が決まつてゐます。同じ變更を繰り返したいと思ふことはよくあります。この章では、變更を繰り返すための便利な方法をいくつか說明します。

|26.1|ビジュアルモードを使つて繰り返す
|26.2|加算と減算
|26.3|複數のファイルを變更する
|26.4|シェルスクリプトから Vim を使ふ

ビジュアルモードを使つて繰り返す

ビジュアルモードを使へば好きな範圍のテキストを變更できるのでとても便利です。選擇範圍は强調表示されるので、變更される範圍が正しいかどうか確認できます。しかし、何度も範圍選擇するのは少し面倒です。"gv" コマンドを使へば同じ範圍を再選擇できます。同じ範圍に對して別の變更を加へることができます。

例へば、"2001" を "2002" に變更し、"2000" を "2001" に變更してみます:

The financial results for 2001 are better
than for 2000.  The income increased by 50%,
even though 2001 had more rain than 2000.
                2000        2001
income          45,403      66,234

まず "2001" を "2002" に變更します。ビジュアルモードでテキストを選擇し、次のコマンドを實行します:

:s/2001/2002/g

次に "gv" で同じ範圍を再選擇します。カーソルの位置は氣にしなくて大丈夫です。そして、":s/2000/2001/g" で 2 囘目の變更を加へます。

同じ方法で何度でも變更を繰り返せます。

加算と減算

ある數字を變更し、それと同じ數だけ他の數字を變更したいやうな場合があります。例へば上の例ではすべての年に 1 を加へました。變更したいすべての年に對して置換コマンドを實行しなくても、CTRL-A を使つて同じことができます。

上記例文から、年を檢索します:

/19[0-9][0-9]\|20[0-9][0-9]

そして CTRL-A を押すと、年が 1 つ增えます:

The financial results for 2002 are better
than for 2000.  The income increased by 50%,
even though 2001 had more rain than 2000.
                2000        2001
income          45,403      66,234

"n" で次の年を檢索し、"." を押して CTRL-A を繰り返します ("." を押す方が簡單ですよね)。"n" と "." を繰り返し、全ての年を更新します。

Hint:hlsearch’ オプションを設定して檢索にヒットした場所を確認できるやうにすると、先の方まで見通せるので作業がはかどります。

加算する量を增やしたい場合は CTRL-A の前に數値を指定します。例へば、次のテキストで:

1.  item four
2.  item five
3.  item six

カーソルを "1." のところに動かして次のやうに入力します:

3 CTRL-A

"1." が "4." に變はります。"." を使つて同じ變更を繰り返せます。

もう 1 つ例を示します:

006 foo bar
007 foo bar

これらの數字に對して CTRL-A を使ふと次のやうになります:

007 foo bar
010 foo bar

7 + 1 = 10? これは、"007" の先頭が 0 で始まつてゐるため、8 進數と認識されてしまつたのです。この表記方法は C 言語などで使はれてゐます。先頭が 0 で始まつてゐる數字を 8 進數として扱ひたくない場合は、次のやうに設定してください:

:set nrformats-=octal

CTRL-X コマンドを使ふと同じ方法で減算できます。

複數のファイルを變更する

あるプログラムに "x_cnt" といふ變數があり、それを "x_counter" に變更したい場合を考へます。變數は複數の C ファイルで使はれてゐるので、すべてのファイルを變更しなければなりません。その方法を說明します。

關聯ファイルを引數リストに加へます:

:args *.c

すべての C ファイルが檢索され、1 つ目のファイルが開きます。これで、すべてのファイルに對して置換コマンドを實行できます:

:argdo %s/\<x_cnt\>/x_counter/ge | update

":argdo" コマンドの引數にはコマンドを指定できます。指定されたコマンドは引數リスト內のすべてのファイルに對して實行されます。

"%s" はファイル全體を置換するコマンドです。"\<x_cnt\>" で "x_cnt" を檢索してゐます。"‘\<’" と "‘\>’" を使つて單語全體がマッチするやうにしてゐます。つまり "px_cnt" や "x_cnt2" は置換されません。

置換コマンドに指定された "g" フラグは、1 つの行で複數の "x_cnt" が見つかつた場合に、すべての "x_cnt" を置換するための指定です。"e" フラグは "x_cnt" が見つからなかつた場合でもエラーメッセージを表示しないための指定です。エラーが起こるとその場で ":argdo" が止まつてしまひます。

"‘|’" はコマンドの區切りです。"update" コマンドを使つて、變更があつたときだけファイルを保存してゐます。置換する "x_cnt" が見つからなければ保存は實行されません。

他にも、すべてのウィンドウに對してコマンドを實行する ":windo" コマンド、すべてのバッファに對してコマンドを實行する ":bufdo" コマンドがあります。バッファリストにはあなたの豫想以上にファイルが入つてゐるかもしれないので注意してください。":buffers" コマンド (or ":ls") で確認できます。

シェルスクリプトから Vim を使ふ

例へば、たくさんのファイルがあつて、"‘-person-’" を "‘Jones’" に置換して印刷する必要があるとします。どのやうに實行すればいいでせう。すべてを手作業で實行するのも 1 つの方法ですが、シェルスクリプトを書いて濟ます方法もあります。

スクリーンエディタとして Vim を使ふとき、ノーマルモードコマンドを使へば簡單に處理できます。しかし、バッチ處理したい場合は、ノーマルモードコマンドでは分かり難くなつてしまひますし、コマンドファイルにコメントも書けません。代はりに Ex モードを使ひます。Ex モードのコマンドはバッチファイルを書くのに適してゐます。("Ex コマンド" はコマンドライン (:) コマンドの別名です)

必要となる Ex コマンドは次のとほりです:

%s/-person-/Jones/g
write tempfile
quit

これらのコマンドを "change.vim" に保存します。そして、Vim をバッチモードで起動します:

for file in *.txt; do
  vim -e -s $file < change.vim
  lpr -r tempfile
done

for-done ループは閒にある行を繰り返し實行するためのシェル構文です。繰り返すたびに $file 變數に異なるファイル名が設定されます。

2 行目では、Vim を Ex モード (-e 引數) で起動して $file を開き、"change.vim" からコマンドを讀み込んでゐます。-s 引數を指定して Vim をサイレントモードにしてゐるので、":" プロンプトやその他のプロンプトは表示されません。

"lpr -r tempfile" コマンドで出力結果の "tempfile" を印刷し、そのファイルを削除してゐます ("-r" 引數が削除指示)。

標準入力からの讀み込み

Vim は標準入力からテキストを讀み込めます。標準入力からはコマンドを讀み込むのが普通なので、さうでないことを Vim に傳へなくてはなりません。ファイルを指定する場所に "‘-’" 引數を指定してください。例:

ls | vim -

"ls" コマンドの出力結果を、ファイルに保存せずに直接編輯できます。

標準入力からテキストを讀み込む場合でも、"-S" 引數を使へば、スクリプトを讀み込ませることができます。

producer | vim -S change.vim -

ノーマルモードスクリプト

ノーマルモードコマンドをスクリプトの中で使ひたい場合は、次のやうにすればできます:

vim -s script file.txt ...

Note:
"-s" 引數は "-e" の有無で違ふ意味になります。この例の場合は、"script" をノーマルモードコマンドとして實行するといふ意味になります。"-e" といつしよに指定された場合はサイレントモードの指定になり、"-s" にファイルを指定することはできません。

"script" の中のコマンドは、實際に入力したのと同じやうに實行されます。改行は <Enter> として解釋されるので注意してください。次の行へ移動するノーマルモードコマンドとして實行されます。

スクリプトを作る方法はスクリプトファイルを開いてコマンドを入力するだけですが、コマンドの結果を自分で想像しなければならないので、少し難しい作業になります。 實際に編輯をしてみて、その操作手順を記錄する方法もあります。次のコマンドを使ひます:

vim -w script file.txt ...

入力したすべてのキーが "script" に保存されます。多少のミスがあつてもそのまま操作を續けて、後からスクリプトを編輯できます。

"-w" 引數は既存のスクリプトに追記します。したがつて、スクリプトの記錄を少しづつ進めることができます。スクリプトをスクラッチから作成したい場合は "-W" 引數を使つてください。既存のファイルが上書きされます。


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