Vim生活を快適にする5つのスクリプト

 Vimエディタはスクリプト経由で動作を変更することができる。そのため、生産性を上げることができるスクリプトや、ずっと欲しかった機能をVimに追加することができるスクリプトなど、何百というスクリプトがVimコミュニティによって作成されている。この記事では、中でも特に便利だと思われるものを5つ紹介する。

 スクリプトをインストールするには、大抵の場合、スクリプトを ~/.vim/pluginsディレクトリにコピーしてVimを再起動すればよい。スクリプトにはインストール方法についての説明が添えられることになっていて、実際ほとんどのスクリプトに添えられているので、さらに詳しいインストール方法については各スクリプトのページを確認してほしい。

writebackup:単純なリビジョン管理

 Vimは自動的に編集中の内容を保存するため、ファイルの編集中にファイルの保存のことについてそれほど神経質になる必要はない。Vimがたとえクラッシュしたとしても、ファイルの内容はスワップファイルを使って回復させることができる。とは言え、特に設定ファイルを編集するときなど、以前の版のファイルに戻る必要が生じることもある場合のためには、リビジョンを保存しておくことができると便利だ。

 writebackupスクリプトを利用すれば、Vimの中でほとんど手間をかけずにバックアップ用のファイルを作成することができる。writebackupスクリプトをインストールするには、~/.vim/pluginsにスクリプトをコピーして、Vimで:WriteBackupを実行するだけでよい。こうすることでファイルのリビジョンが保存され、後々、以前の版に戻す必要が生じたときに利用することができるようになる。

 バックアップファイルが保存されるとき、ファイル名に日付とアルファベットが追加される。例えば2007年5月17日にrevision.txtという名前のファイルを保存した場合には、revision.txt.20070517aという名前のファイルとして保存される。そしてその次の版が同じ日に保存された場合には、revision.txt.20070517bという名前のファイルとして保存されることになる。ただし一日に作成することのできるリビジョンは26個に限られていることに注意しよう。同じ日に27個目のリビジョンを保存しようとしたら、バックアップ用のファイルの名前が足りなくなったという警告が出る。

 :WriteBackupと入力するのが長すぎるなら、常套手段として以下のようにして~/.vimrcにコマンドのエイリアスを作成すると良いだろう。

map <F4> <Esc> :WriteBackup

 こうしておくと、コマンドモードでF4を入力するだけで:WriteBackupを実行することができるようになる。

 このようなエイリアスは、他のスクリプトの長いコマンドについても利用することができる。頻繁に使用するコマンドについては、実行するのに必要なキー入力の長さを減らすためのマップを作成しておくと良いかもしれない。

 さらに、Vimにはコマンドの補完機能があることも忘れてはいけない。コマンドの最初の数文字を入力して(この場合:Wri)Tabキーを押せば、Vimが候補を順番に表示していくので、この方法でもコマンドを最後まで入力する必要をなくすことができる。

writebackupVersionControl:さらなるリビジョン管理

 writebackupスクリプトには、writebackupVersionControlという姉妹スクリプトがある。writebackupVersionControlスクリプトは、writebackupスクリプトを使って書かれていて、Vimでのリビジョン管理をさらに便利なものにしている。

 writebackupスクリプトは、最新のリビジョンとまったく同じ以前のリビジョンがないかという確認を行わない。そのためまったく同一内容のリビジョンを複数保存してディスク空間を無駄にしてしまう可能性があった。そこでwritebackupVersionControlスクリプトをインストールすれば、:WriteBackupIsBackedupを実行して、最新版のファイルが以前のリビジョンのどれかと一致していないかどうかを確認することができる。一致しないことを確認したら、:WriteBackup(あるいは:WriteBackupに割り当てた何らかのショートカットキー)を実行して最新版を保存することができる。

 また、どのようなリビジョンがあるのかを確認したいときには:WriteBackupListVersionsを実行すれば、利用可能になっているリビジョンの一覧と、ファイルを最後に保存してからの経過時間が表示される。

 最新版とその直前のリビジョンの違いを確認する必要がある場合には、:WriteBackupDiffWithPredを使用すれば、ファイルの最新版ともっとも新しいバックアップに対してdiffを実行してその結果をVim内で表示することができる。

 2つのファイルに対してdiffを実行してみた後には、以前の版に戻したいということもあるかもしれない。そのようなときには:WriteBackupRestoreFromPredを使用すると、もっとも新しいリビジョンに戻すことができる。ただしさらにそれ以前のリビジョンに戻したい場合には手動で行なう必要がある。writebackupVersionControlスクリプトでは、古い版に戻す前にもっとも新しいリビジョンを示して本当に戻して良いのどうかをユーザに確認するので、最終的に気が変わった場合などには元に戻すのを直前にやめることができる。

SuperTab:VimでのTab補完

 Vimではデフォルトでは、Ctrl-p(補完候補を前方検索)とCtrl-n(補完候補を後方検索)を使うことで一度入力した単語を補完することができる。例えば「writebackupVersionControl」と一度入力したことがあれば、文字列のすべてを再び入力する必要はなく、「writeb」の後にCtrl-pを入力するだけでよい。これによりVimは単語を補完するか、あるいは「writeb」が複数の単語にマッチする場合には、すべての候補をドロップダウン表示する。

 これはとても便利な機能だが、このような自動補完のためにはTabキーを使用することに慣れている人もいる。その場合にはSuperTabスクリプトを使用すると、Tabキーでの自動補完(及び、その他少々)ができるようになる。

 SuperTabスクリプトを使用するには~/.vim/pluginsディレクトリにスクリプトをコピーしてVimを再起動するだけで良い。なおSuperTabスクリプトをインストールしてもCtrl-pCtrl-nを使用し続けることもでき、それらに加えて、補完候補の文字列を前方検索するためにTabを使用することが可能になる。

MultipleSearch:Vimでの複数検索

 Vimの検索機能はそのままでも優れているが、一度に複数の検索語をハイライトしたい場合にはMultipleSearchスクリプトを使うとよい。

 MultipleSearchは非常に単純だ。スクリプトをインストールしたら、:Search 検索語 を実行して最初の検索語を検索し、次に:search 別の検索語 を実行して2つめの検索語を検索すれば良いだけだ。なお各検索語は別の色でハイライトされる。

 検索語のハイライトを取り除くためには、:SearchResetを実行すればハイライトがクリアされる。

 MultipleSearchスクリプトには、:SearchBuffersコマンドと:SearchBuffersResetコマンドもある。これらは:Search:SearchResetと同じ機能だが、Vimのすべてのバッファを検索対象とする。

closetag:HTMLタグとXMLタグを自動的に閉じる

 私はVimを使うときは大抵、記事の執筆や編集をHTMLファイルで行なっているので、マップ機能を利用して<strong> や <code> のように非常によく使うHTML要素の開始タグを簡単に挿入することができるようにしている。しかしそのようなHTML要素の終了タグを挿入するためには、マップではなくclosetagスクリプトを使用している。

 CloseTagスクリプトを使用すると、ほぼすべてのHTML/XMLタグを一つのショートカットキーで閉じることができる。CloseTagを利用するためには、~/.vim/scriptsの下にclosetagスクリプトをインストールする。次にスクリプトが自動的に読み込まれるようにするために~/.vimrcを次のように編集する。

autocmd FileType html,xml,xsl source ~/.vim/scripts/closetag.vim

 また次のようにして、 ~/.vimrcの中にInsertCloseTag() 関数をインストールしても良いだろう。

function! InsertCloseTag()
  if &filetype == 'html'

    " list of tags which shouldn't be closed:
    let UnaryTags = ' Area Base Br DD DT HR Img Input LI Link Meta P Param '

    " remember current position:
    normal mz

    " loop backwards looking for tags:
    let Found = 0
    while Found == 0
      " find the previous <, then go forwards one character and grab the first
      " character plus the entire word:
      execute "normal ?\<LT>\<CR>l"
      normal "zyl
      let Tag = expand('<cword>')

      " if this is a closing tag, skip back to its matching opening tag:
      if @z == '/'
        execute "normal ?\<LT>" . Tag . "\<CR>"

      " if this is a unary tag, then position the cursor for the next
      " iteration:
      elseif match(UnaryTags, ' ' . Tag . ' ') > 0
        normal h

      " otherwise this is the tag that needs closing:
      else
        let Found = 1

      endif
    endwhile " not yet found match

    " create the closing tag and insert it:
    let @z = '</' . Tag . '>'
    normal `z
    if col('.') == 1
      normal "zP
    else
      normal "zp
    endif

  else " filetype is not HTML
    echohl ErrorMsg
    echo 'The InsertCloseTag() function is only intended to be used in HTML ' .
      \ 'files.'
    sleep
    echohl None

  endif " check on filetype

endfunction " InsertCloseTag()

 以上のようにしておくと、対象となるタイプのファイルを開いたとき、Vimが自動的にclosetagスクリプトを使用するようになる。closetagスクリプトにはタグを閉じるためのマップが含まれている。終了タグを挿入したいときには、Ctrl-Shift-_(読みにくい場合のために書いておくと、最後の文字は「アンダースコア」)を入力するだけでよい。

 スクリプトを見ると分かるように、閉じる必要のないタグは次のような行で定義している。

let UnaryTags = ' Area Base Br DD DT HR Img Input LI Link Meta P Param '

 自分が使用するタグのうち閉じるべきでないタグが他にもあるなら、この行にそのようなタグを追加しておこう。例えばファイル内に <img> タグがある場合、仮に上の行にImgが含まれていなかったとしたら、他の要素に対してclosetag関数を使用したときに、まず最初に <img> タグを閉じようとしてしまうだろう。

自分に合ったスクリプトを見つける

 以上はVimで利用可能なスクリプトのほんの一部に過ぎない。「Vimは本当に便利だが、これもできれば良いのに」と思うことがあれば、たいていの場合、まさにそのことを行うスクリプトを誰かがすでに書いている可能性が高い。例えば、VimでEmacs風のキーバインドを使うためのスクリプトまである(ただしこれは実際には少し気に触る部分もある)。

 プログラマ向けには、C、Python、Perl、Ruby、その他の言語のために、それぞれ専用のスクリプトがたくさんある。またVimのスクリプトのページにはその他にも非常に多くの役に立つスクリプトがあるだけでなく、いくつかの面白いがあまり役には立ちそうにないスクリプトもある。このページをしばらく眺めてみれば、必ず自分のニーズに合うスクリプトがいくつか見つかるだろう。

 それでもなお見つからない場合には、Vim用スクリプトの作成を始めるのに役立つリファレンス文書がVimの文書の中にある。

NewsForge.com 原文