vim-jp / vimdoc-ja / usr_26

usr_26 - Vimドキュメント

メインヘルプファイルに戻る
usr_26.txt    For Vim バージョン 8.2.  Last change: 2006 Apr 24

                     VIM USER MANUAL - by Bram Moolenaar

                                   繰り返し


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

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

次章: usr_27.txt  検索コマンドと正規表現
前章: usr_25.txt  テキストの整形
目次: usr_toc.txt

==============================================================================
26.1  ビジュアルモードを使って繰り返す

ビジュアルモードを使えば好きな範囲のテキストを変更できるのでとても便利です。選
択範囲は強調表示されるので、変更される範囲が正しいかどうか確認できます。しか
し、何度も範囲選択するのは少し面倒です。"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" で二回目の変更を加えます。
同じ方法で何度でも変更を繰り返せます。

==============================================================================
26.2  加算と減算

ある数字を変更し、それと同じ数だけ他の数字を変更したいような場合があります。例
えば上の例ではすべての年に 1 を加えました。変更したいすべての年に対して置換コ
マンドを実行しなくても、CTRL-A を使って同じことができます。
上記例文から、年を検索します:

        /19[0-9][0-9]\|20[0-9][0-9]<Enter>

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

        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" と "." を繰り返し、全ての年を更新します。
ヒント: 'hlsearch' オプションを設定して検索にヒットした場所を確認できるように
すると、先の方まで見通せるので作業がはかどります。

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

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

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

        3 CTRL-A

"1." が "4." に変わります。"." を使って同じ変更を繰り返せます。

もう一つ例を示します:

        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 コマンドを使うと同じ方法で減算できます。

==============================================================================
26.3  複数のファイルを変更する

あるプログラムに "x_cnt" という変数があり、それを "x_counter" に変更したい場合
を考えます。変数は複数の C ファイルで使われているので、すべてのファイルを変更
しなければなりません。その方法を説明します。
関連ファイルを引数リストに加えます:

        :args *.c

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

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

":argdo" コマンドの引数にはコマンドを指定できます。指定されたコマンドは引数リ
スト内のすべてのファイルに対して実行されます。
"%s" はファイル全体を置換するコマンドです。"\<x_cnt\>" で "x_cnt" を検索してい
ます。"\<" と "\>" を使って単語全体がマッチするようにしています。つまり
"px_cnt" や "x_cnt2" は置換されません。
置換コマンドに指定された "g" フラグは、一つの行で複数の "x_cnt" が見つかった場
合に、すべての "x_cnt" を置換するための指定です。"e" フラグは "x_cnt" が見つか
らなかった場合でもエラーメッセージを表示しないための指定です。エラーが起こると
その場で ":argdo" が止まってしまいます。
"|" はコマンドの区切りです。"update" コマンドを使って、変更があったときだけ
ファイルを保存しています。置換する "x_cnt" が見つからなければ保存は実行されま
せん。

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

==============================================================================
26.4  シェルスクリプトから Vim を使う

例えば、たくさんのファイルがあって、"-person-" を "Jones" に置換して印刷する必
要があるとします。どのように実行すればいいでしょう。すべてを手作業で実行するの
も一つの方法ですが、シェルスクリプトを書いて済ます方法もあります。
スクリーンエディタとして 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 変数に異なるファイル名が設定されます。
二行目では、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" 引数を
使ってください。既存のファイルが上書きされます。

==============================================================================

次章: usr_27.txt  検索コマンドと正規表現

Copyright: see manual-copyright  vim:tw=78:ts=8:noet:ft=help:norl:
関連キーワード:  usr, コマンド, 変更, Vim, 実行, スクリプト, 方法, 入力, 置換, 範囲