VimGolf 解説: surround.vim の代替

More than 1 year has passed since last update.

VimGolfについてはこちら: https://www.vimgolf.com/

解説する問題はこれ: https://vimgolf.com/challenges/5192f96ad8df110002000002

興味ある方は是非、下の解説を見ずに挑戦してみてください。


start

one two

three


goal

(one) (two)

(three)


以下解説



解答(現状最短解)

14 ストローク

cw(<C-R><C-O>")<Esc>w.w.ZZ


解説

この14文字に詰まっているテクニックを解説する。


cw


  • c: cut (action)

  • w: word (text object)

この時点


cw

| two

three

|はカーソル位置


<C-R><C-O>"


  • <C-R>{0-9a-z"%#*:=} : レジスタから挿入

  • <C-R><C-O>{0-9a-z"%#*:=}: インデントなしでレジスタから挿入

http://vim-jp.org/vimdoc-ja/vimindex.html

ここが今回のポイントで <C-R><C-R> でも貼り付けは出来るんですが、single-repeat の際に毎回oneが挿入さるはずです。

single-repeat もレジスタを使い動作を再現するんですが、<C-R><C-O> はそのコマンド自身がレジスタに格納されます。よって期待通り毎回 <C-R><C-O>が呼ばれその都度 cw でカットした文字列が挿入されます。

レジスタの中身を覗いてみるとわかりやすいです。

1__takaya-uniform-map__vimgolf_put_5192f96ad8df110002000002__zsh_.png

<C-R><C-R> で貼り付け

1__takaya-uniform-map__vimgolf_put_5192f96ad8df110002000002__zsh_.png

<C-R><C-O> で貼り付け

(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/0829/items/6e16142be13a9007e91c