VimGolfについてはこちら: https://www.vimgolf.com/
解説する問題はこれ: https://vimgolf.com/challenges/5192f96ad8df110002000002
興味ある方は是非、下の解説を見ずに挑戦してみてください。
one two
three
(one) (two)
(three)
以下解説
解答(現状最短解)
14 ストローク
cw(<C-R><C-O>")<Esc>w.w.ZZ
解説
この14文字に詰まっているテクニックを解説する。
cw
- c: cut (action)
- w: word (text object)
この時点
| two
three
|はカーソル位置
<C-R><C-O>"
- <C-R>{0-9a-z"%#*:=} : レジスタから挿入
- <C-R><C-O>{0-9a-z"%#*:=}: インデントなしでレジスタから挿入
ここが今回のポイントで <C-R><C-R> でも貼り付けは出来るんですが、single-repeat の際に毎回one
が挿入さるはずです。
single-repeat もレジスタを使い動作を再現するんですが、<C-R><C-O> はそのコマンド自身がレジスタに格納されます。よって期待通り毎回 <C-R><C-O>が呼ばれその都度 cw でカットした文字列が挿入されます。
レジスタの中身を覗いてみるとわかりやすいです。
(one) two
three
w.w.
- w: 単語移動
-
.
: single-repeat(cw(<C-R><C-O>")
)
ZZ
保存して終了。
考察など
q
マクロを使わずに .(single-repeat)
を使えるように挿入するパターンは 前にも見たことがあって、VimGolf では定番なのかもしれません。
自分は surround.vim を使っていて他のエディタにも同様のプラグインを入れています。なので vwS(
でやってしまうところです。(そもそもエディタによって実装が違うところだしレジスタの機能も再現できているかわからないという点があります。)
レジスタから挿入はあまり使わない(OSのペーストもあるので)のですが、括弧でくくるだけでない場合にも力を発揮しそうなので意識したいなと思いました。
surround 関連の小ネタですが、Atom の vim-surround 用パッケージで
vim-mode-plus-keymaps-for-surround を気に入っています。
このプラグインでは括弧の指定を省いて一番内側の括弧が自動で指定される仕様になっています。
例えば cs'"
は cs"
、 ds(
は ds
のみで編集できます。(かわりにカーソル位置は意識しないといけません。)
終わり
他の問題を解説したものも紹介しておきます。
https://qiita.com/elzup/items/5b6992d21408ba35a3b4
過去解説した別の問題
- https://qiita.com/elzup/items/5b6992d21408ba35a3b4
- https://qiita.com/elzup/items/9e0ebcbe180744ed45ff
参考記事