Panda Noir

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

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

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

バッファとは

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

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

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

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

バッファって不便じゃないの?

タブになれていると、ひと目で今開いているファイルがわからないため、バッファが不便に思えます。しかし、あんがい現在どのファイルを開いているか把握するのはかんたんですので、そこまで困りません。

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

f:id:panda_noir:20180126201713p:plain

レジスタ

レジスタとは「名前付きクリップボード」のようなものです。

レジスタにはいくつも種類があります。次の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を組み合わせると最強っぽいぜ??」くらいのニュアンスで読んでいただけると幸いです。