大学4回生からプログラミングを始めて、Atoms、Sublime Text、VS Code、IntelliJといろんなエディタを触ってきましたが、社会人になってからVimをずっと使い続けています。

最初は慣れないキーストロークでノロノロコーディングするのが苦痛でしたが、今ではVim以外でトラックパッドを触るのがめんどくさいと感じるようになってきました。

といってもまだまだVimを使いこなせておらず、工夫すれば簡単に終わりそうな操作があってもコーディングに集中したく、Vimの使い方を調べることは少ないです。

しかし、よくある操作でいつもうまくできない「単語をコピーして入れ替える」についてやっとちゃんと調べることにしてみました。

参考

この本の抜粋になります。

よくある間違い

キーストロークバッファの内容
yiwcollection = getCollection();
process(somethingInTheWay, target);
jwwcollection = getCollection();
process(somethingInTheWay, target);
diwcollection = getCollection();
process(, target);
Pcollection = getCollection();
process(somethingInTheWay, target);

初期の頃にやっていたとてもあるあるの行動です。ただ単語を削除してヤンク(コピー)した単語をはりつけたいだけなのですが、単語を削除した際に無名レジスタに削除した単語が格納されてしまうため、そのままPut操作を行うと、削除した単語が貼り付けられてしまいます。

Visual modeを使った回避策

いままでよくやっていたのがこの方法です。

キーストロークバッファの内容
yiwcollection = getCollection();
process(somethingInTheWay, target);
jwwcollection = getCollection();
process(somethingInTheWay, target);
vecollection = getCollection();
process(somethingInTheWay, target);
pcollection = getCollection();
process(collection, target);

こうすると選択対象と削除とヤンクした単語の貼り付けが同時に行われるので、削除した単語がはりつけられることはなくなります。しかし、入れ替えたい対象が2箇所以上あった時に、この操作をした後にはすでに無名レジスタには somethingInTheWay が格納されてしまっています。

ブラックホールレジスタを使った回避策

Vimには "_ というブラックホールレジスタ(消去専用レジスタ)が用意されています。保存したいわけではなくただ削除したのであれば、このレジスタにつっこめばいいわけです。これを使うと、先ほどの問題が解決します。

キーストロークバッファの内容
yiwcollection = getCollection();
process(somethingInTheWay, target);
jwwcollection = getCollection();
process(somethingInTheWay, target);
"_diwcollection = getCollection();
process(, target);
Pcollection = getCollection();
process(collection, target);

ただちょっとめんどくさいですよね? いちいち単語を削除するときはブラックホールレジスタに入れんとあかんから "_ を削除前に指定して…と考えることが多くなります。

ヤンクレジスタを使った回避策

おそらくこれが正解です。

キーストロークバッファの内容
yiwcollection = getCollection();
process(somethingInTheWay, target);
jwwcollection = getCollection();
process(somethingInTheWay, target);
diwcollection = getCollection();
process(, target);
"0Pcollection = getCollection();
process(collection, target);

単語を y{motion}でヤンクした時には、無名レジスタに格納されるだけでなく、 "0 というヤンクレジスタにも格納されます。無名レジスタは削除操作なんかを行った時に簡単に上書きされるところから揮発性が高いです。しかし、ヤンクレジスタはヤンク時にしか上書きされないため、信頼性が高いです。

こうすることで、削除操作をおこなうときはレジスタのことを気にせずガンガン削除して、貼り付けたいときに「ヤンクしたやつを貼り付けたい」が実現するわけです。

2年触っているんですが、Vimは奥が深いですね…

まとめ

まだまだVimを使いこなせていない部分がたくさんあるので、めんどくさいと思う操作はちゃんと調べて工夫すべきと思う今日のこの頃でした。