2019年7月11日木曜日

矩形選択とマクロ、どっちにする?

プログラミングでよくある場面の問題。
矩形選択で処理するか、マクロで処理するか。
アプローチについて考察する。

Applying same text modification in several lines
Remove identical text at the beginning of several lines and the closing parenthesis.

問題

Assert.ThrowsAsync<Exception>(() => _auction.StartSellingItem());
Assert.ThrowsAsync<Exception>(() => _application.StartBiddingIn(_auction));
Assert.ThrowsAsync<Exception>(() => _auction.HasReceivedJoinRequestFromSniper());
Assert.ThrowsAsync<Exception>(() => _auction.AnnounceClosed());
Assert.ThrowsAsync<Exception>(() => _application.ShowsSniperHasLostAuction());
上のファイルを下のように変更せよ。
_auction.StartSellingItem();
_application.StartBiddingIn(_auction);
_auction.HasReceivedJoinRequestFromSniper();
_auction.AnnounceClosed();
_application.ShowsSniperHasLostAuction();

矩形選択によるアプローチ

クラス変数名の先頭にアンダーバーが付いており、それを目印にすれば、矩形選択で前半分をごっそり削れそうである。

これは私の最初の回答に手直しを加えたものである。
<C-V>Gt_x:%s/)//<CR>ZZ
  1. <C-V>Gt_
    削除範囲指定。
    矩形選択モードに入り、最終行まで移動し、アンダーバーまで選択する。
  2. x
    選択された範囲をごっそり削る。
  3. :%s/)//<CR>
    各行について、余分になったかっこを削る。
  4. ZZ
    ファイルを保存して終了する。

15ストローク、悪くはないと思う。
矩形選択は、並列的なアプローチといえるかもしれない。

マクロによるアプローチ①

マクロを使用した回答が提出されていた。
qqdt_$X+q4@qZZ
  1. qq
    マクロの記録を開始する。
  2. dt_
    アンダーバーの手前まで削除する。
  3. $X
    行末まで移動し、余分になったかっこを削る。
  4. +q
    次の行へ移動し、マクロの記録を停止する。
  5. 4@q
    4回記録したマクロを実行する。
  6. ZZ
    ファイルを保存して終了する。

14ストロークである。
矩形選択によるアプローチよりも、1キーストローク短くなっている。
矩形選択は、直列的なアプローチといえるかもしれない。

マクロによるアプローチ②

I$XBd0+<Esc>5@.ZZ
現状提出されているうち、最もスマートなやり方。
挿入した内容をマクロとして解釈するというテクニックが用いられている。
  1. I
    インサートモードに入る。
  2. $XBd0+
    これはコマンドとして実行させたい文字列である。
    インサートモードで入力したことにより、この文字列が "." レジスタに入る。
    この文字列は以下の操作を表す。
    1. $
      行末尾に移動する。
    2. X
      余分になるかっこをあらかじめ削除する。
    3. B
      アンダースコアまでカーソルを移動させる。
    4. d0
      アンダースコアの手前から行頭まで削除する。
      この際、挿入した文字列も一緒に削除される。
  3. <Esc>
    ノーマルモードに戻る。
  4. 5@.
    先ほど入力した文字列をマクロとして解釈し、5回実行する。
  5. ZZ
    ファイルを保存して終了する。

13ストロークである。
①よりも、さらに1キーストローク短くなっている。

何が違いをもたらしたのか

矩形選択によるアプローチでは、範囲の指定を行う入力が多くなる(赤で示す6文字)。
また、コマンドモードを使うとどうしてもキー入力が多くなってしまう。
<C-V>Gt_x:%s/)//<CR>ZZ

マクロによるアプローチ①では、繰り返しを指定する入力が必要となる(赤で示す6文字)。
qqdt_$X+q4@qZZ

マクロによるアプローチ②では、レジスタを使ったテクニックで繰り返しを指定する入力を短くしている(赤で示す5文字)。
I$XBd0+<Esc>5@.ZZ

この問題に限って言えば、結果的に考えてマクロの方が適していたといえるかもしれない。
今後矩形選択を用いた新記録が打ち立てられる可能性もあるかもしれないので、一概には言えない。

まとめ

どっちの方が優れているなんて結論は出せそうにないなぁ
しかしながら、「何らかのテクニックを駆使すればもっと短くできる」という点に面白さと勇気を感じることができるだろう。


0 件のコメント:

コメントを投稿

コメント表示は承認制に設定しています