Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

[vim] バッファ 入門

$
0
0

概要

vimを長らく使っていながら、バッファの仕組みをロクに使わずに、1ファイル1プロセスで編集したまま長い年月が経過してしまった。

iTerm2を始めとするターミナルで画面分割をすることで、複数ファイルの編集も容易に行えるが、やはりバッファを使った複数ファイル操作に慣れておくことで、関連するvimの機能やvimプラグインをさらに活用できる。

ということで、この記事ではvimのバッファをロクに使ったことがない私が、学びながらその過程をメモして、同じような立場の人が役立てるようにする。

※ この記事は、まだまだ未熟なvimmerの私が勉強しながらそれをまとめたモノです。誤りや誤解が生じかねない表現がある場合、ご指摘頂ければ速やかに修正します。

とりあえず複数ファイル開こうや

作業用ディレクトリに以下の3つのファイルを作る。無いようなRubyのコードだけど今回はまったく関係ないので読まなくて良い。

a.rb
defadd(a,b)a+bend
b.rb
require_relative'a'defget_totaladd2,3end
c.rb
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)が画面上に表示されている。

a.rb
defadd(a,b)a+bend

これをb.rbや、c.rbに切り替えたい。そんなときに使うコマンドが、:bprev:bnext:bfirst:blastだ。

コマンド効果
:bprev1つ前のバッファに切り替え
:bnext1つ後のバッファに切り替え
:bfirst先頭のバッファに切り替え
:blast末尾のバッファに切り替え

a.rbを開いてる状態で、b.rbにバッファを切り替えよう。

:vnext

b.rbに切り替わった。

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それぞれに拘りがあると思うので使いやすければ何でも良い。

.vimrc
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を適当に編集して保存せずに

a.rb
defsub(a,b)a-bend

おっと、呼び出し元のb.rbも編集しないとな、:bnextで切り替えっと

E37: No write since last change (add !to override)

は?(激怒)

どうやらvimでは、バッファを保存せずに閉じると警告が出るようだ。よくある「保存してますがよろしいですか?」的なヤツ。

役立つときは役立つ警告だけど、サクサクバッファを切り替えたいときにこれが邪魔になりかねない。そういう場合は.vimrcに以下を追記することで、バッファを保存せずに切り替えることを許可できる。

.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

この辺は無理せずディレクトリツリーなプラグインを入れたほうが幸せになるぞ!

スクリーンショット 2018-05-26 21.00.07.png

稚拙なvim記事ですがよろしければ

参考


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>