Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

中級Vimmerなら覚えたい!バッファとレジスタ

Vimを長く使っていても意外と使ってなかったりするバッファとレジスタ。覚えるとかなり便利なのでご紹介しようと思います。

バッファとは

バッファというのは「現在開いているファイル」のことです。「タブと違うの?」と思われるかもしれません。タブは「バッファを表示するもの」にすぎません。

開いているバッファを確認する

現在のバッファ一覧は:lsで確認できます。

Vimで新しくファイルを開くとバッファにそのファイルが追加されます。Vimを起動して:e hoge.txtというように適当なファイルを開くとバッファにそのファイルが追加されていることがわかります。

バッファってタブより不便じゃないの?

タブになれていると、バッファはひと目で今開いているファイルがわからないため、不便に思えます。しかし、どのファイルを開いているか把握するのは意外とすぐにできるようになります。

また、denite.nvimの:Denite bufferに慣れると、バッファの方が高速で便利に感じます。

f:id:panda_noir:20180126201713p:plain

レジスタ

バッファに続いてレジスタについて解説します。レジスタとはVimの中でのみ使える「名前付きクリップボード」のようなものです。

レジスタにはいくつか種類があり、次の4つが基本的なレジスタとなります。

  1. 無名レジスタ
  2. 番号付きレジスタ
  3. 名前付きレジスタ
  4. クリップボード

ヤンク時、ペースト時にレジスタを指定することで同時に複数の内容を保持することができます。

レジスタにヤンクする

レジスタにヤンク(コピー)するには次のようにします。

yy // 無名レジスタ
"1yy // 番号付きレジスタ
"ayy // 名前付きレジスタ
""yy // 無名レジスタ
"+yy // クリップボード

ダブルクォーテーションのあとにつけた記号に応じたレジスタへヤンクされます。

ちなみに、無名レジスタはヤンクが起きるたびにヤンクされます。これは無名レジスタが「最後にヤンクした内容」を保持するレジスタのためです。そのため、「あとで使いたいな」と思った内容は無名ヤンク以外に格納しましょう。

レジスタの内容をペースト

レジスタの内容をペーストする方法はヤンクと同じです。

p //無名レジスタ
"1p // 番号付きレジスタ
"ap // 名前付きレジスタ
"+p // クリップボード

無名レジスタを使うと、最後にヤンクした内容がペーストされます。

小技: xXのときに無名レジスタを上書きさせない

xで1文字削除したときに、無名レジスタが上書きされてイライラしたこと、ありますよね?こんなときに使えるレジスタがあります。その名も「ブラックホールレジスタ」です。

このレジスタにヤンクした内容は破棄されます。ここにヤンクしたときは無名レジスタへの上書きは起こりません。

ブラックホールレジスタは_記号で定義されます。

nnoremap x "_x
nnoremap X "_X

こうするとxで削除した内容がブラックホールレジスタに格納されるので、無名レジスタへの上書きが起こりません。

dに関してもレジスタを指定できます。が、僕はよくddしたあとpするので、あえてブラックホールレジスタは指定していません。

denite.nvimを使う

denite.nvimのソースにはbufferとregisterがあります。これらを,b,rにマッピングしておくと、バッファもレジスタもかなり扱いやすくなります。

nnoremap <silent> ,b :<C-u>Denite buffer -mode=normal<CR>
nnoremap <silent> ,r :<C-u>Denite register -mode=normal<CR>

f:id:panda_noir:20180126201730p:plain

レジスタ一覧でエンターを押すとその内容がペーストされます。

f:id:panda_noir:20180126201758p:plain

追記: 2018/1/26

「バッファを表示するウィンドウ」を束ねるのがタブらしいですね。

ドキュメントを熟読しておらず、この辺あやふやだったので明言を避けてしまいました。申し訳ありません。

「バッファってやつとdenite.nvimを組み合わせると最強っぽいぜ??」くらいのニュアンスで読んでいただけると幸いです。