LoginSignup
1

More than 5 years have passed since last update.

VimGolf 解説: 汎用なマクロ

Posted at

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

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