Vim のすゝめ

第2回 バッファとウインドウ

2012.09.18

報告書も Vim で書く、Vimmer の「ブイ」(仮名)です。第 2 回目の今回は「バッファとウインドウ」の機能について簡単に解説します。難しいことは解説しませんので初心者の方にもぜひ読んでもらいたいと思います。

vi は基本的に複数ファイルの編集ができません。しかし、最近のプログラムというのは巨大化しており、一度に数十ものファイルを編集するのも珍しくないのではないでしょうか。そのような場合、複数のエディタウインドウ間を行ったり来たりするのは大変です。Vim はバッファ機能やウインドウ機能があるので、一つの Vim プロセスで複数ファイルを参照するのも簡単に行うことができます [1]

1 Vim のバッファ機能

最初に、Vim のバッファ機能について解説します。

$ vim ~/.vimrc

上記のように、Vim の引数としてファイル名を指定した場合、Vim 内で ~/.vimrc ファイルが開かれます。.vimrc ファイルを編集中に、.gvimrc ファイル [2] を開きたくなったとしましょう。Vim のバッファ機能を知らない場合、GNOME Terminal などならば別のコンソールタブを作成して新しいシェル上で .gvimrc を開くか、tmux やscreen を用いて別のコンソールを作成し vimを起動するのではないかと思います。しかしそれはあまりに煩雑な作業です。あるファイルから別のファイルへコピー・ペーストする、という比較的よくある作業も大変になります。もし、現在使用している Vim で別のファイルも開けるならば、この作業も簡単になるはずです。もちろん Vim なら可能です。

今起動している Vim から別のファイルを開くには、次のコマンドを実行します。

:edit ~/.gvimrc

こうすると、Vim が表示するファイルが .vimrc から .gvimrc に切り換わります。ただし、.vimrc を編集中の場合、.vimrc を保存しない限り他のファイルを開くことはできないので注意してください [3]

もう一度 .vimrc を編集・閲覧したくなったとします。そういうときは、次のコマンドを実行します。

:buffer .vimrc

このコマンドを実行すると、編集するファイルが .vimrc に切り換わります。ただし、今度は .gvimrc を保存しない限り .vimrc を開くことはできません。:buffer とは別のバッファに切り換えるコマンドのことです。

ここでバッファについて説明します。バッファとは、Vim がファイルを読み込んだ後にファイルの内容をコピーするメモリ領域のことです。つまり、我々が Vim でファイルを編集するときは、ファイルそのものではなくファイルの内容を読み込んだバッファを編集しているのです。Vim や vi でファイルを保存するとき、:w コマンドを使用すると思いますが、このコマンドはバッファの内容をファイルに保存する機能です。このコマンドを実行することで、バッファの内容とファイルの内容の同期を取ることができるのです。

バッファが増えてきた場合、どのファイルをバッファに読み込んでいるかが分からなくなるかもしれません。そんなときは、次のコマンドを実行します。

:ls

:ls コマンドは buffer list の略です。Vim のバッファリストを表示します。

編集が終わり、バッファが要らなくなったら、次のコマンドでバッファを削除しましょう。

:bdelete バッファ名

2 Vim のウインドウ機能

さて、続いて Vim のウインドウ機能について解説します。Vim のウインドウとは、バッファの表示領域のことです。GUI の「ウインドウ」という用語とはちょっと違うので注意してください。1 つのウインドウにつき 1 つのバッファを表示することができます。つまり、ウインドウが 3 つあれば 3 つのバッファを同時に表示することができるのです。

Vim を起動したとき、ウインドウは 1 つしかありません。そのため、同時に表示できるバッファは 1 つに制限されています。ウインドウの数を増やすためには、現在のウインドウを次のコマンドで分割します。

:split
または
:vsplit

:split とは、現在のウインドウを横方向に分割し、上下 2 画面にするコマンドです。:vsplit とは、現在のウインドウを縦方向に分割し、左右 2 画面にするコマンドです。最近のディスプレイはワイドディスプレイであり、横方向に余裕があることが多いでしょう。その場合、縦方向に分割すると、ディスプレイの領域を有効に活用できます。

ただし、ウインドウを分割すると、1 つ 1 つのウインドウのサイズは小さくなります。Vim 全体の表示領域が大きくなるわけではないからです。しかし、最近のPC はディスプレイの物理サイズ・解像度ともに巨大となっているため、そのデメリットを緩和することができます。むしろ、巨大なディスプレイを有効活用する方法の 1 つと考えられているようです。

ウインドウを分割できたら、:edit:buffer を用いてそれぞれのウインドウに別のバッファの内容を表示することができるようになります。

もちろん、ウインドウ間での移動やウインドウの削除も用意されています。

ウインドウを移動するときは、<C-w>j, <C-w>k, <C-w>l, <C-w>h といったキーを入力します [4]。通常の移動と同様に、<C-w>j は下方向への移動、<C-w>l は右方向への移動です。ウインドウ操作のプレフィクスとして <C-w> が頭に付いただけです。

ウインドウを削除するには、削除したいウインドウで <C-w>c を押します。close の c と覚えましょう。ただし、ウインドウが開いているバッファは削除されません。ウインドウで開いているバッファが変更されている場合、保存するまで閉じることができません。現在開いているウインドウ以外を全て閉じるには、<C-w>o を押します。only の o です。:only コマンドでも同じ意味です。

ちなみに、みなさんは Vim や vi を終了させるとき、:quit コマンドまたは、その省略形である :q コマンドを使用すると思います。このコマンドは確かに Vim を終了させますが、ウインドウを複数開いているときは挙動が異なります。実はこのコマンドは、「ウインドウが複数開いている場合は、現在のウインドウを閉じ、ウインドウが無くなったら Vim を終了させる」というコマンドなのです [5]。よって、ウインドウを複数開いているとき、:quit を実行してもすぐに終了させることはできません。一気に終了したいときは、:qall または :qa コマンドを実行します。

経験上、同時に編集するバッファの数が 10 を越えてくると、その作業は破綻します。目的のバッファに素早く切り替えるのが難しくなるためです。そのような場合、不要なバッファをこまめに削除するか、バッファを管理するための外部プラグインを導入するのがセオリーとなっているようです。この記事ではプラグインについて触れませんが、バッファ管理がつらくなってきたら、それらのプラグインの導入を検討してみるのもよいでしょう。

次回は趣向を変えて「Vim を使いこなすために必要なたった一つの能力」について解説します。

[1]vi は :next であらかじめ引数に与えたファイルの編集を切り替たり、:edit で別のファイルを開くことができます。ただし、バッファリストやウインドウ機能がないので、その管理は煩雑となりがちです。
[2]GUI の Vim(GVim) 用の設定ファイルのことです。.gvimrc は CUI の Vimを起動したときには読み込まれません。
[3]:edit の代わりに :edit! を使うことで警告を無視することはできます。ただし、変更は保存されません。このような挙動になっているのは、Vim が別のファイルを開くとき、表示されていないバッファのメモリを解放するためです。バッファのメモリを解放するためには、バッファの内容を保存する必要があります。Emacs の場合、バッファを切り替えてもメモリは解放しません。よって、バッファを変更していてもバッファを切り替えることができます。Vim において、Emacs のようにバッファを切り替える場合、.vimrc 内に :set hidden と記述します。
[4]<C-w>j とは Vim 独自のキー記法で、CTRL キーを押しながら w キーを押し、その後 j を押すキー操作を表します。<CTRL-w>j と書かれることもありますが、意味は同じです。
[5]:help :quit を参照すると、明確に記述してあります。
This article is made by Vim.

著者プロフィール

v

ブイ。社内では数少ない Vim 使い。ブログ記事の執筆により、社内でのVim の知名度を上げ、Vim を使用する人を増やそうと計画しているらしい。

記事一覧Index