vim tips その4

前回にひき続いてvimのtipsを紹介していきましょう。
今回はより快適に作業するためにvimが編集作業をどのように扱うのかをバッファ・ファイルについてと、より効率的に作業するためにウインドウやタブの概念について説明します。

バッファを理解する

vimがメモリ上に保持して展開している内容のことをバッファと呼びます。
vimで何かしらのファイルをオープンした時、ファイルの内容をバッファに読み込みます。
編集を行っているときは実際にはバッファの内容をオンメモリで編集しており、リアルタイムにファイルに書きだされているわけではないのです。したがって当然バッファの編集を行った場合、バッファの内容とファイルの内容には差がでます。
当然最終的には編集したバッファの内容をファイルに書き出すことで、作業した内容の永続化処理をおなうことになります。

つまりウインドウから我々ユーザが見ている内容はvimのバッファの内容ということになります。
感覚的にはウインドウはバッファを除くビューポートのような働きをしていることになります。

試しにvimから複数のファイルパスを引数に与えて起動してみましょう。

vim a.txt b.txt

するとvimは内部でそれぞれのファイルに対応するバッファを展開します。
この様子は下記のexコマンドを実行することで、展開しているバッファの様子を確認することができます。
(exコマンドには前回説明しましたので、わからない方は参照してみてください。)

:ls

exコマンドを実行すると下記のように表示されます。

:ls
  1 %a   "a.txt"                        line 1
  2      "b.txt"                        line 0
Press ENTER or type command to continue

1,2と各バッファに項番がふられている様子と、それぞれのバッファに対応しているファイルパスが確認できます。
またaactiveを表し、現在参照しているバッファを指しています。

このようにvimではバッファを複数持つことができるので毎回ファイルを開き直さなくても編集可能なようになっています。
続いて各種バッファに対する操作についても見ていきます。

バッファを移動する

各バッファについてはexコマンドを用いて移動することができます。それぞれについて説明します。

exコマンド 意味
:bnext 次のバッファに移動する
:bprev 前のバッファに移動する
:bfirst 最初のバッファに移動する
:blast 最後のバッファに移動する
:buffer{N} N番目のバッファに移動する
:buffer {bufname} 指定の名称のバッファに移動する

バッファを操作する

展開しているバッファすべてに対してexコマンドを適用するようなこともでき、:bufdoで実現することができます。
一気にファイルを操作することができて非常に便利です。

またバッファは当然削除することもできます。
ここに関してはバッファ自体が削除されるだけで、実際に永続化されているファイルも削除されるわけではありません。

exコマンド 意味
:bufdo 展開しているバッファ全てに対してexコマンドを実行する
:bdelete {n} {m} {l} 指定した項番のバッファを削除する
:{n},{m} bdelete 指定した項番の間にあるバッファを全て削除する

引数リストを理解する

バッファリストと少し似たような概念として引数リストがあり、これは名前が示すように、vimが展開している引数のリストになります。

現在の引数リストを表示するには下記のように実行します。

:args

先ほどと同様にvimにオープンするファイルを引数にあげて起動した状態から:argsコマンドを叩くとどのようになるかを確認します。
結果としては下記のように、引数として与えたファイルが列挙される形で表示されます。
カギカッコでくくられているファイルは現在アクティブである引数を表しています。

[a.txt] b.txt

引数リストに関して覚えておくべきことは、それが常に同じ状態を持っていることではないこと、それと引数リストを設定することができることです。
引数リストを設定するというのは実際には、exコマンドを用いて新たにバッファを追加するという事になります。

引数リストの設定については下記のようになります

:args {arglist}

上記のような性質から当然、引数リストの内容は常に変更可能であり、:argsの出力結果がバッファリストの内容と一致するという保証はないです。
次に引数リストを用いてバッファをオープンする方法を見ましょう。

余談ですが、引数リストに関してはviの機能で、バッファリストに関してはvimで拡張された機能になります。
なので似たような振る舞いを保つ機能が2つ存在しているかのようになっているのですが、引数リストを応用することで便利なことができます。

引数リストを用いてバッファを操作する

先に述べたように引数リストを指定することでバッファを新たに展開することができます。
これの便利なところは指定する表現にglobを使用することができる点です。

たとえば特定のフォルダ配下のすべてのファイルをバッファに展開したい場合は下記のようになります。

:args **/*

知っている方にはおなじみで直感的にわかりやすいと思います。
また当然glob表現であるため、その表現を利用できます。

例えばtxtファイルだけをバッファに展開したい場合は下記のようになります。

:args **/*.txt

また:argsコマンドはバッククォートを展開することができるので、例えばプロジェクトのファイルリストを保持しているファイルがある場合、下記のようなコマンドを用いてプロジェクトのファイルを引数リストに展開することも可能になります。

:args `cat filelist`

また先にすべてのバッファに対してexコマンドを適用するコマンド:bufdoを取り上げましたが、引数リストに関しても同様に引数リストに存在するもの全てに対してexコマンドを適用するコマンド:argdoが存在します。

この2つに関して言えることはバッファリストに関しては、展開しているすべてのバッファを含んでしまうことになりますが、引数リストに関しては作業状況に応じて変更することが可能なものです。
引数リストはテンポラリな作業場のようにして使うことができるのです。

隠しバッファを理解する

隠しバッファとは一言で言うと、編集中(ダーティー)なバッファのことです。
あるファイルを展開して、それを編集した後に、保存処理などを行わないで終了しようとすると警告がでます。
これを意図的に無視することができ、編集したものを一時的においておき、別のバッファに映るときに隠しバッファを利用することができます。

例えば、あるバッファを編集し、それを隠しバッファとして次のバッファに映るときには下記のようにタイプします

:bnext!

!マークをつけることで隠しバッファとすることができます。

これが何に利用できるのかということなんですが、展開している全バッファに対して一気に操作を適用するときに利用します。(というかこれしないと:bufdoなどが使えないです)

vimには隠しバッファを利用するかしないかの設定をグローバルに保持しており、それは下記のコマンドで有効にすることができます。

:set hidden

:bufdoなどの複数バッファにコマンドを展開するコマンドの共同に関して隠しバッファを利用しない場合、下記のようなフローになります。

1. 先頭のバッファの内容に変更を適用する
2. ユーザに対してインタラクティブに保存を求める
3. 次のバッファに移動する

なのですが項目2.で:bufdoが止まってしまうため使用できないのです。

よって隠しバッファを有効にすることでダーティな状態を許容することができ、項目2.がなくなり:bufdoが適用可能になります。

ウインドウを理解する

vimにおけるウインドウはバッファを参照するビューポートのような働きをします。
もちろんウインドウを複数作成することができるのですが、そのウインドウが覗き見ているバッファの内容はなんでも良いです。
これによって異なるウインドウから同じバッファを見ることなども可能になります。

ウインドウの操作について見て行きましょう。

ウインドウの分割

コマンド 意味
Ctrl-w s ウインドウを水平に分割する
Ctrl-w v ウインドウを垂直に分割する
:split {filename} 指定のファイルを新しいウインドウでオープンする

またウインドウで新しいバッファを覗き見たい場合は:edit {filename}の用にタイプすることで可能です。

続いてカーソルをウインドウの間で移動するには下記のようにします。

フォーカスの移動

コマンド 意味
Ctrl-w w 次のウインドウに移動する
Ctrl-w h 左のウインドウに移動する
Ctrl-w j 下のウインドウに移動する
Ctrl-w l 右のウインドウに移動する
Ctrl-w k 上のウインドウに移動する

ウインドウを閉じる

ノーマルコマンド exコマンド 意味
Ctrl-w c :clo[se] 現在アクティブなウインドウを閉じる
Ctrl-w o :on[ly] 現在アクティブなウインドウ以外のウインドウを全て閉じる

ウインドウのサイズを変更する

コマンド 意味
{N} Ctrl-w _ 高さをN行に指定する
{N} Ctrl-w | 幅をN行に指定する
Ctrl-w = すべての高さと幅を同じにする
Ctrl-w _ アクティブなウインドウの幅を最大化する
Ctrl-w | アクティブなウインドウの高さを最大化する

またウインドウに関してもバッファや引数リスト同様に、全ウインドウに対してexコマンドを実行するコマンドが存在し:windoで実行することができますので、覚えておくと良いと思います。

タブを理解する

vimではタブもまた保持することができ、vimにおけるタブとはウインドウのコレクションになります。
特に難しいことはないと思いますので、ここでは各種コマンドをご紹介するに留めたいと思います。

タブを操作する

コマンド 意味
:tabedit {filename} タブを開く(同時に新しいウインドウ・バッファで開かれることになります)
Ctrl-w T 新しいタブを開いてウインドウをそこに移動する
{N}gt 番号指定でタブを移動する
gt 次のタブへ移動する
gT 前タブへ移動する
:tabclose アクティブなタブをクローズする
:tabonly アクティブなタブ以外のタブをすべてクローズする

いかがでしたでしょうか。
作業を効率化するために自分なりのタブやウインドウの設定を見つけていくことで快適な作業環境を構築できるんじゃないかなと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください