LoginSignup
1
1

More than 5 years have passed since last update.

VimGolf 解説: surround.vim の代替

Last updated at Posted at 2017-11-02

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"%#*:=}: インデントなしでレジスタから挿入

ここが今回のポイントで <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

過去解説した別の問題

参考記事

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1