Vim
VimGolf
VimGolf解説

VimGolf 解説: 汎用なマクロ

More than 1 year has passed since last update.

VimGolfとは

簡単に言うとショートコーディング、コードゴルフのVim版。実行結果でなく Start, Goal のテキストが与えられて、どれだけ短いキーストローク数で変更できるかを競う。
サイト: https://www.vimgolf.com/

過去の解説など https://qiita.com/tags/VimGolf解説


解説する問題はこれです
https://vimgolf.com/challenges/524e1a20b81fe50002000008

start
attr_reader :align, :variables, :with
attr_accessor :spaces, :to, :complete, :challenge
# vim: set expandtab:
goal
attr_reader :align,
            :variables,
            :with
attr_accessor :spaces,
              :to,
              :complete,
              :challenge
# vim: set expandtab:

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


以下解説


解答(現状最短解)

19 ストローク
qq/,<CR>a<CR><Tab><Esc>Bjdwq4@qZZ

解説

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

qq

  • q{0-9a-zA-Z"}: Record typed characters into register {0-9a-zA-Z"}

2ストローク目にタイプされた "q" のレジスタに記録。次に q が押されるまでにタイプした文字をマクロとして記録するので、
/,<CR>a<CR><Tab><Esc>Bjdw この11文字が入る。

/,<CR>

  • /{pattern}[/] Search forward for the

, という文字列を検索、そこまで移動。

a<CR><Tab><Esc>

  • a: カーソル後に挿入モード。

<CR><Tab> を入力した編集後はこうなる。

attr_reader :align,
               |:variables, :with
attr_accessor :spaces, :to, :complete, :challenge
# vim: set expandtab:# vim: set expandtab:

|はカーソル位置

Bjdw

  • B: [count] words backward. |exclusive| motion.
  • dw: delete word.

手前のWORD(非空白文字)の先頭まで飛びます。→ 下の行に移動。 → 次の文字まで空白削除。

attr_reader :align,
            :variables, :with
attr_accessor :spaces, :to, :complete, :challenge
# vim: set expandtab:# vim: set expandtab:

|はカーソル位置

4@q

  • @{0-9a-z".=*+}: Execute the contents of register {0-9a-z".=*+} [count] times

qに登録したマクロを 4回実行する。

ここで全て連続してマクロを呼び出せるようになっているところがポイント :thumbsup:

  • , までの移動 /,<CR>
    • f, だと2行目の編集がうまくいかない。
  • インデント整形 <Tab>Bjdw
    • スペース4つ挿入 だと2行目のインデントが崩れる。

ZZ

保存して終了。

終わり

VimGolf は小さなテクニックの発見が多くてよいです。一時的なテキスト一括編集もよく行うので僕はマクロを重宝してます。