今回も前回に引き続き、vi/vimの使いこなしについてのレシピをお届けします。特に、複雑なテキスト編集が必要な場合や、ログの整形、コーディングなどには大きな効果を発揮するでしょう。普段他のテキストエディタを使っている人にこそお勧めです。
同じ操作の繰り返し
vi/vimの基本的な操作の中には、「直前の操作を繰り返す」というものがあります([.]を使います)。この機能を使いこなすことで、複雑な操作を楽に行うことができます。
たとえば、各行で行頭の8文字を削除したい、という操作を行いたいとしましょう。全ての行に処理するのであればsedやawkで処理した方が楽ですが、今回は「人間の目にはすぐわかるが、正規表現で表現しにくい、特定行の行頭の8文字だけを削除したい」という操作だと思ってください。
こうした削除操作をgeditやKateなどで行うと、「問題の行へ移動する→行頭へ移動する→[Del]キーを8回押す」という操作を延々と繰り返す必要があります[1]。これでは面倒なので、同じことをvi/vimで行うと良いでしょう。
次のように操作します。
まず、問題の行へ移動します。これは通常通りに移動すれば良いでしょう。なお、vimでは行の移動は[j][k]だけでなくカーソルキーを利用することもできますし、Emacs風の[Ctrl]+[n]もしくは[Ctrl]+[p]すら利用できます。もちろん特定の行に移動したければ行番号+[G](たとえば20行目へ移動したければ[2][0][G])でも構いません。
行頭へ移動するために[0]を押下します。
先頭の8文字を削除するために[8][x]と操作しましょう。ここがポイントです。vi/vimでは直前の編集操作を[.]で代用できますから、この部分の操作([8][x])は以降は[.]で代用できます。以降は行の移動と[.]の繰り返しで効率良く操作が可能なはずです。
この操作は次のような操作にも有効です。
OSのISOイメージなど、複数のURLからファイルをダウンロードしたい場合、とりあえずURLの羅列されたファイルが存在するとします。ここでは例としてKnoppix日本語版のISOイメージを例に取りましょう。URLを列挙したファイルは次のようになります。
これらのISOイメージをダウンロードするにはどうするのが良いでしょう? Firefoxでひとつひとつダウンロードしても良いですが、単純に考えるのであれば、各ファイルをwgetする、というのが容易な手段です。
これをvimで編集し、簡易スクリプトにしてみましょう。
vimを開いて[i]を押してエディットモードにし、上記のURLを貼り付けます([編集]→[貼り付け])。貼り付けたら[ESC]でコマンドモードに戻ります(図1)。
シェルスクリプトにする場合、ファイルの先頭にshebangが必要ですので、[1Gi]として、ファイルの先頭に移動して編集モードにします。ここで「#!/bin/bash」と入力して[Enter]で改行します。
URLの列挙部分の先頭に「wget 」と入れることができれば良いのですが、普通のエディタでは延々と移動→「wget 」と入力→移動→「wget 」と入力……と、同じような操作を繰り返さなければいけません。
viの場合も移動をしないといけないのは同じですが(今回の例であれば[3g0i]と操作して「wget 」と入力すれば良いでしょう)、次の行へ移動し([j0])、さらに前述の[.]を使うことで、『「wget 」と入力』の部分の手間が大きく減らすことができるでしょう。事実上、操作は[j0.]を繰り返すことになります(図2)。
あとはファイルを保存して終了し([:w wgetsamp.sh][:q])、できあがったファイルに実行権限を与えれば完成です[2]。
今回の例では数行なので通常のエディタであっても大した手間ではありませんが、行数が増えれば増えるほど、vi/vimの操作の利点が表に出てくるはずです。
自動補完
vimの便利な機能として、Kateなどのものと同じように、自動的に単語を補完する機能があります。vim-fullがインストールされている環境では、単語の入力途中で[Ctrl]+[n]と入力することで入力補完を機能させることができます(図3)。
また、これだけでは入力の都度[Ctrl]+[n]を押下する必要がありますが、autocomplpop.vimを利用することで、自動的に補完候補をポップアップさせることができるようになります。
インストールのために、~/.vim/pluginというディレクトリが必要なので、次のコマンドで作成しましょう。
あとは作成した~/.vim/plugin/ディレクトリにautocomplpop.vimをダウンロードし、vimを再起動すれば自動補完を利用することができます。
vimではこのような「プラグイン」という形で機能を拡張することができ、必要に応じて動作や機能を拡張することができるようになっています。http://www.vim.org/scripts/などでプラグインを探すことができます。
なお読み込まれているプラグインの一覧は、「:scriptnames」とすることで得ることができます。
範囲選択・矩形選択・範囲指定置換
vimには正規表現置換機能が搭載されています。この機能と範囲選択・矩形選択を組み合わせることで、非常に効率のよいテキスト編集を行うことができます(気の利いたテキストエディタにはほとんど備わっている機能ですが、vimのものは特に強力な部類に属するでしょう。さらに、ターミナル上で動作させることができる、という点も魅力なはずです)。
範囲選択と置換
vimでは[V]を押してからカーソルを移動させると、特定の範囲を選択することができます。この状態で置換操作(:s/『置換前文字列』/『置換後文字列』/g)などとすると、選択された範囲の中のみに機能します。
特定の範囲に対してテキストの置換を行いたい場合に非常に有効なはずです。
たとえば前述のURLリストであれば、特定の行だけを[V]を用いて範囲選択を行い、「:s/ftp:/http:/g」などを実行すれば、特定の行だけをHTTPによるダウンロードに変更することができるでしょう(図4)。
矩形選択と挿入
範囲選択のバリエーションとなるのが矩形選択です。
前述の通り、気の利いたエディタであれば備わっている機能ですが(たとえばKateでは[編集]→[ブロック選択]となっています)、テキストの編集には大変役に立つはずです。
vimでは[Ctrl]+[v]で利用できます。この状態でカーソルを移動させると、「ブロック型の」選択範囲になるはずです(図5)。この状態でもやはり置換を行うことができますし、[I]を押してテキストを入力し、[ESC]を2回押すと、矩形選択した範囲に一度に文字を入力することができます。
操作が少々わかりにくいので、スクリーンショットとともに見ていきましょう。
先ほどのwgetスクリプトを修正し、ダウンロードをバックグラウンドで行うように変更したいものとします。これには「wget URL」としている箇所を、「wget -b URL」とする必要があります。
そこでまず、[Ctrl]+[V]を用いて、(図6)のようにURLの先頭部分を3行とも選択します。
この状態で[I]を押し、「-b 」を入力します。(図7)のように、最初の一行目のみに「-b 」が追加された状態になるはずです。
ここで[ESC]を2回押します。これによって(図8)のように、すべての行に反映が行われるはずです。同じような位置に同様の修正を加える場合、[.]による繰り返しよりも便利に利用できるでしょう。