パーソナルツール

ファイル内の各行ごとに編集処理を実行する、何行かおきに編集処理を実行する。

作者: 小見 拓 最終変更 2012年01月08日 11時58分

編集中のテキストの各行それぞれに対して処理を行う方法と、 テキストの何行かおきにVimエディタの編集処理を実行する方法を紹介します。 この記事では、 各行をそれぞれ複製する方法、 各行間に空行を挿入する方法、 何行かおきにVimエディタの編集処理を実行する方法 を紹介していますが、これらの編集技法をセットで覚えておくと、非常に役に立ちます。 (Windows, Mac)

概要

編集中のテキストの 各行それぞれに対して処理を行う 方法と、
テキストの 何行かおきにVimエディタの編集処理を実行する 方法を紹介します。

この記事では、

を紹介していますが、これらの編集技法をセットで覚えておくと、非常に役に立ちます。

各行それぞれに対して処理を行う

「:global」と検索パターン「/^/」を組み合わせると、
バッファ内の各行それぞれに対して任意の処理を行えます。

" バッファ内の各行に「コマンド」を実行する。
:global/^/ {コマンド}

" 「:global」は、「:g」と省略しても実行できます。
:g/^/ {コマンド}

" 「:global」は範囲指定可能。選択した範囲のみを処理の対象にできる。
"  20行目から159行目にコマンドを適用する。
:20,159 global/^/ {コマンド}

上のフォーマットの中の「コマンド」の部分では、置換の「:substitute」コマンドや、
ノーマルモードの機能を呼び出す「:normal」コマンドなどが使用できます。

" 20行目から159行目に、置換処理を実行。
" (この例の場合は、:20,159 s/置換前テキスト/置換後テキスト/g と結果は変わりませんが、
" 後にでてくる、条件指定と組み合わせると、利用価値が出てくるので覚えておいてください。)
:20,159 global/^/ s/置換前テキスト/置換後テキスト/g

" 各行の文字「S」までを削除する。
:20,159 global/^/ normal dfS

各行をそれぞれ複製する

各行のテキストを、1行1行それぞれ複製します。

jp.nanasi.gui.header.color=green
jp.nanasi.gui.menu.color=green
jp.nanasi.gui.leftContent.color=green
jp.nanasi.gui.body.color=green
jp.nanasi.gui.footer.color=green

上図(↑)のようなテキストを、下図(↓)のように加工します。

jp.nanasi.gui.header.color=green
jp.nanasi.gui.header.color=green
jp.nanasi.gui.header.color=green
jp.nanasi.gui.header.color=green
jp.nanasi.gui.header.color=green
jp.nanasi.gui.menu.color=green
jp.nanasi.gui.menu.color=green
jp.nanasi.gui.menu.color=green
jp.nanasi.gui.menu.color=green
jp.nanasi.gui.menu.color=green
jp.nanasi.gui.leftContent.color=green
jp.nanasi.gui.leftContent.color=green
jp.nanasi.gui.leftContent.color=green
jp.nanasi.gui.leftContent.color=green
jp.nanasi.gui.leftContent.color=green
jp.nanasi.gui.body.color=green
jp.nanasi.gui.body.color=green
jp.nanasi.gui.body.color=green
jp.nanasi.gui.body.color=green
jp.nanasi.gui.body.color=green
jp.nanasi.gui.footer.color=green
jp.nanasi.gui.footer.color=green
jp.nanasi.gui.footer.color=green
jp.nanasi.gui.footer.color=green
jp.nanasi.gui.footer.color=green
....

上の章で紹介している「:global/^/」と「normal」を組み合わせて使えば、 行の複製を実現できます。

" ファイル全体の行を複製する。
:global/^/ normal yyp

この複製処理が利用されるような状況では、範囲の指定と、コピーする行数の指定が必要になる場合がほとんどなので、
実際には、次のようにコマンドを実行することになるでしょう。

" 24行目から98行目までの行を、それぞれ4行ずつ複製する。
:24,98 global/^/ normal yy4p

Note

複製したい行の数が1行だけである場合は、下記コマンドのどちらかを使用しても良い。

:g/^/copy .
:g/^/t .

各行間に空行を挿入する

テキストの各行の間に、空行を入れる方法を紹介します。

jp.nanasi.gui.header.color=green
jp.nanasi.gui.menu.color=green
jp.nanasi.gui.leftContent.color=green
jp.nanasi.gui.body.color=green
jp.nanasi.gui.footer.color=green

上図(↑)のテキストを、下図(↓)のテキストに加工します。

jp.nanasi.gui.header.color=green

jp.nanasi.gui.menu.color=green

jp.nanasi.gui.leftContent.color=green

jp.nanasi.gui.body.color=green

jp.nanasi.gui.footer.color=green

この処理の場合もやはり、「:global/^/」と「normal」を利用して実現します。

" ファイル全体の行を複製する。
:global/^/ normal i^M

Note

「^M」は、 Control-v Enter と順に押下すると入力できます。

制御文字入力

挿入する空白行の数を調節するには、繰り返しを利用するのが良いと思います。

" 4行ずつ、空白行を挿入する。
:global/^/ normal 4i^M

何行かおきにVimエディタの編集処理を実行する

ある行数の間隔で、Vimエディタのテキスト編集処理を実行する方法を紹介します。

まず、下記のコマンド入力を見てください。
この式では、「:global」で範囲を指定し、「if」で条件を指定し、最後に実行したい処理を「|」で繋げていますが、

" 「条件」にマッチした行に「コマンド」を実行する。
:global/^/ if {条件} | {コマンド}

この「条件」の部分に、「line(".") % 2 == 0」のような条件を指定すれば、
何行おきかでのVimエディタコマンドの実行を実現できます。

" 1行おきに、処理を実行する。
:global/^/ if line(".") % 2 == 0 | {コマンド}

実行例

実行例です。
次の式は、7行おきに置換処理を実行します。

" 7で割り切れる行のみ、後半の置換処理を実行する。
:global/^/ if line(".") % 7 == 0 | s/加工前テキスト/置換テキスト/g

処理対象の行の調整は、ifの条件でコントロールします。

" 例。57行目から、3行に1行ごとに、置換処理を実行する。
" 最初に、57行目移行を指定して、かつ、57行目から、3行ごとに置換されるように調整。
:57,$g/^/ if (line(".") - 57) % 3 == 0 | s/加工前テキスト/加工後テキスト/g

条件判定の式

条件判定の式に利用できそうなVimスクリプトのコードを一覧します。

ファンクション 説明
line('.') カレント行の行番号を返す。
line('$') 最終行の行番号を返す。
getline(68) 68行目のテキストを返す。
説明
X + Y 加算。
X - Y 減算。
X * Y 乗算。
X / Y 除算。
X % Y 剰余演算。余りを返す。

複数の条件を指定

複数の条件を指定する場合は、各条件式を「|」で区切ります。

" 「条件」にマッチした行に「コマンド」を実行する。
:global/^/ if {条件1} | if {条件2} | {コマンド}

略語を用意する

しかし、ここで紹介したコマンド入力は長くて、たまに利用する程度なら良いが、 頻繁に使用するには面倒です。
さらに、Vimを使う人全員がVimスクリプトをすらすら書けるわけでもありません。
(できる人は原理さえ知っておけば、即組み立てられる。)

そこで、上のテクニックを有効に活用するために、
入力を簡単にするための略語を定義しておくと、良いかもしれません。

" 略語の設定の例
" コマンドラインモードで「ga」や「ga2」と入力すると、展開される。
:cabbrev ga  g/^/
:cabbrev ga2 g/^/ if (line(".") % 2 == 1) <BAR>
:cabbrev ga3 g/^/ if (line(".") % 3 == 1) <BAR>
:cabbrev ga4 g/^/ if (line(".") % 4 == 1) <BAR>
:cabbrev ga5 g/^/ if (line(".") % 5 == 1) <BAR>

作成したスクリプトを置いておきます。
https://github.com/taku-o/downloads/raw/master/interval-linecommand.vim

ドキュメントアクション
コメント
blog comments powered by Disqus