概要
vimを長らく使っていながら、バッファの仕組みをロクに使わずに、1ファイル1プロセスで編集したまま長い年月が経過してしまった。
iTerm2
を始めとするターミナルで画面分割をすることで、複数ファイルの編集も容易に行えるが、やはりバッファを使った複数ファイル操作に慣れておくことで、関連するvimの機能やvimプラグインをさらに活用できる。
ということで、この記事ではvimのバッファをロクに使ったことがない私が、学びながらその過程をメモして、同じような立場の人が役立てるようにする。
※ この記事は、まだまだ未熟なvimmerの私が勉強しながらそれをまとめたモノです。誤りや誤解が生じかねない表現がある場合、ご指摘頂ければ速やかに修正します。
とりあえず複数ファイル開こうや
作業用ディレクトリに以下の3つのファイルを作る。無いようなRubyのコードだけど今回はまったく関係ないので読まなくて良い。
defadd(a,b)a+bend
require_relative'a'defget_totaladd2,3end
require_relative'b'pget_total
3つのファイルがあるディレクトリで、以下のコマンドを実行しよう。3つのファイル全てが1つのvimプロセスで読み込まれる。
$ vim *.rb
vimではメモリに展開したファイルの内容をバッファ
と呼ぶらしい。
vimプロセス上で、どんなバッファが読み込まれているかは:ls
コマンドで確認できる。
:ls1 %a"a.rb" line 12"b.rb" line 03"c.rb" line 0
Press ENTER or type command to continue
画面に表示するバッファを切り替えようや
vimプロセスを起動した段階では、対象の3ファイルのうち先頭のファイル(ここではa.rb
)が画面上に表示されている。
defadd(a,b)a+bend
これをb.rb
や、c.rb
に切り替えたい。そんなときに使うコマンドが、:bprev
:bnext
:bfirst
:blast
だ。
コマンド | 効果 |
---|---|
:bprev | 1つ前のバッファに切り替え |
:bnext | 1つ後のバッファに切り替え |
:bfirst | 先頭のバッファに切り替え |
:blast | 末尾のバッファに切り替え |
a.rb
を開いてる状態で、b.rb
にバッファを切り替えよう。
:vnext
b.rb
に切り替わった。
require_relative'a'defget_totaladd2,3end
同様に:bnext
を再度実行するとc.rb
が開かれ、続けて:bprev
を実行すると、またb.rb
に帰ってくる。
:bfirst
を実行すると常に先頭のa.rb
に、:blast
を実行すると常に末尾のc.rb
に切り替わることは想像に難くないだろう。
え?切り替えめんどくさくない?
誰だってそう思う。少ないタイプ数で高度な処理をこなせることに定評のあるvimで、何が楽しくて:bnext
だの長ったらしいコマンドを打ち込まなければならないのか。それもバッファを切り替えるたびに。
ということで、大抵のvimmerはそれらのコマンドにキーバインドを割り当てる。流行りは[b
とからしいが、ここでは私が採用したキーバインドの例をあげる。もちろんキーバインドにはvimmerそれぞれに拘りがあると思うので使いやすければ何でも良い。
nnoremap <silent><C-j>:bprev<CR>
nnoremap <silent><C-k>:bnext<CR>
<C-j>
と<C-k>
は、標準で割と空いてるのにホームポジション的に死ぬほど使いやすいので、他に頻出の操作を割あることがない場合はこれで良さそう。
これでバッファの切替がメタクソに早くなった。:bfirst
と:blast
は、個人的にはそんな使わない気がするので見送り。使うのであれば必要に応じて他のキーバインドを探す。
バッファたくさん開いたときはどうするのさ
なんやかんやでバッファリストが以下のようになったよしよう。
:ls1 %a"a.rb" line 12"b.rb" line 03"c.rb" line 04"d.rb" line 05"e.rb" line 06"f.rb" line 07"g.rb" line 08"h.rb" line 09"i.rb" line 010"j.rb" line 011"k.rb" line 0
Press ENTER or type command to continue
おいおい、俺はg.rb
を開きたいんだが、まさか:bnext
を6回叩かせる気かい?
(と言っても<C-k>
にバインドしていれば6<C-k>
で済むが)
そんなときは:ls
で出てきたバッファリストに目を通そう。左側にバッファごとに数字(バッファ番号)が振られているのがわかるだろう?
:b N
コマンドでは、バッファ番号を指定してバッファを開くことができる。よって、g.rb
を開きたい場合はこうだ。
:b7
一発でバッファ番号7が割り当てられたg.rb
に移動できる。ステキ!
さらに、ファイル名がわかっていて短いなら以下のほうが早い。
:bg.rb
ちなみにファイル名の入力はTab
でちゃんと補完されるので、そんなにバッファが多くないなら:b
からのTab何度かが一番早いかも。
ファイル編集中にバッファ切り替えられないぞオイ
a.rb
を適当に編集して保存せずに
defsub(a,b)a-bend
おっと、呼び出し元のb.rb
も編集しないとな、:bnext
で切り替えっと
E37: No write since last change (add !to override)
は?(激怒)
どうやらvimでは、バッファを保存せずに閉じると警告が出るようだ。よくある「保存してますがよろしいですか?」的なヤツ。
役立つときは役立つ警告だけど、サクサクバッファを切り替えたいときにこれが邪魔になりかねない。そういう場合は.vimrc
に以下を追記することで、バッファを保存せずに切り替えることを許可できる。
:set hidden
これでよりサクサクバッファを切り替えられるようになる。
ただし、保存漏れによる事故も起こりやすくなるので、保存を忘れないような工夫が大事。手前味噌だが以下の記事に役立つTipsが載ってる。
vim中級者未満が捗った設定やプラグイン[gif付き] - Qiita
不要になったバッファを消そう
c.rb
を削除しよう。削除すると言ってもファイルを削除するわけじゃく、バッファを削除する(≒編集を終了する)には、以下の:bd N
を使う。Nにはバッファ番号を指定する。
(現在開いているバッファを消すだけなら単に:bd
でも可)
c.rb
のバッファ番号が3であるとき
:bd3
:ls
で見ると、c.rb
が消えているのがわかる。
:ls1h"a.rb" line 22 %a"b.rb" line 14h"d.rb" line 15h"e.rb" line 16h"f.rb" line 17h"g.rb" line 18h"h.rb" line 19h"i.rb" line 110h"j.rb" line 111h"k.rb" line 1
Press ENTER or type command to continue
が、実はc.rb
のバッファは消えていないのだ。:bd
はバッファリストから消すコマンドである。(正確にはバッファに関連したオプション、変数、マッピングなどが消える)
事実、バッファリストから消したバッファも含めてた真のバッファリストを表示する:ls!
を実行するとc.rb
がしぶとく生き残っていることがわかる。
:ls!1h"a.rb" line 22 %a"b.rb" line 13u# "c.rb" line 14h"d.rb" line 15h"e.rb" line 16h"f.rb" line 17h"g.rb" line 18h"h.rb" line 19h"i.rb" line 110h"j.rb" line 111h"k.rb" line 1
Press ENTER or type command to continue
あとかたもなく消したいなら:bw [N]
を使おう。
:bw3
:ls!
を使っても表示されないことがわかる。
:ls!1h"a.rb" line 22 %a"b.rb" line 14h"d.rb" line 15h"e.rb" line 16h"f.rb" line 17h"g.rb" line 18h"h.rb" line 19h"i.rb" line 110h"j.rb" line 111h"k.rb" line 1
Press ENTER or type command to continue
言うてバッファ削除ってそんな使う?
バッファにファイルを追加したい
a.rb
しか開いていない状態で
:ls1 %a"a.rb" line 1
Press ENTER or type command to continue
b.rb
を開きたい場合は:e [パス]
コマンドを実行しよう。
:eb.rb
b.rb
がバッファに読み込まれ、かつアクティブな状態になっている。
:ls1 #h"a.rb" line 12 %a"b.rb" line 1
Press ENTER or type command to continue
この辺は無理せずディレクトリツリーなプラグインを入れたほうが幸せになるぞ!
稚拙なvim記事ですがよろしければ
- vimを長らく使ってるのに矢印キーを使う軟弱者にファイルを編集させない - Qiita
- VimGolfでvimの練習をしてvim力を向上させる - Qiita
- vim中級者未満が捗った設定やプラグイン[gif付き] - Qiita