2019年7月11日木曜日

行内のワードの入れ替え

ワードの入れ替えの問題を通し、キーストローク削減のヒントを得た。

Swap values
Well, swap the values...

問題


name=www-data, groups=developer

この行を以下のように書きかえる

name=developer, groups=www-data

www-dataとwww-dataを入れ替えればよい。

愚直な方法

大体こんな感じの答えを第一に考えてしまう

fwdt,fdvwpF,PZZ


  1. fwdt,
    www-dataの先頭へ移動し、www-dataを切り取る。
  2. fd
    developerの先頭へ移動する。
  3. vwp
    ビジュアルモードでdeveloperを選択し、先ほど切り取ったwww-dataに置き換える
    この際、developerが無名レジスタに入る。
  4. F,P
    ,の位置まで戻り、developerを前方に挿入する。
  5. ZZ
    保存して終了する。


この回答のスコアは15点である。
頭からしっぽへ、しっぽから頭へカーソルが移動しており、思考の流れと一致しているため、それほど悪くないと思われる。
しかし、もっと良い方法があるのだ。

解説

現時点での最高のキーストロークを以下に示す。

E8X)vbp<C-O>PZZ


  1. E8X
    連続した文字列の後端まで移動し、前方に8文字削除する。
    これは先ほどのfwdt,と等価であり、キーストロークを2回減らせている。
  2. )
    行末まで移動する。
    ここがポイントで、あえて$ではなく)を用いることにより、現在のカーソル位置をジャンプリストに残すことができる。
    また、先ほどは移動にfdを用いていたが、これでキーストロークを1回減らせている。
  3. vbp
    ビジュアルモードでdeveloperを選択し、先ほど切り取ったwww-dataに置き換える
    この際、developerが無名レジスタに入る。
  4. <C-O>P
    ジャンプリストに登録された,の位置まで戻り、developerを前方に挿入する。
    これは先ほどのF,Pと等価であり、キーストロークを1回減らせている。
  5. ZZ
    保存して終了する。

この回答のスコアは11点である。
だいぶ減らせていることが分かる。

キーストローク削減のヒント

  1. 移動系コマンドの代わりにジャンプリストを使う
    Ctrl-Oはジャンプリストの古い地点にジャンプする
    Crtl-Iはジャンプリストの新しい地点にジャンプする。

    大事なのは、ジャンプリストに登録されるコマンドは決まっているという点だ。

    以下のコマンドがjump-motionsであり、これらはジャンプリストに登録される。
    一部、object-motionsが含まれている。
    ', `, G, /, ?, n, N, %, (, ), [[, ]], {, }, :s, :tag, L, M, H

    以下のコマンドはvarious-motionsであり、これらもジャンプリストに登録される
    (普段使えていないコマンドもあり、全部確認できてはいないが)
    %, [(, [{, ]), ]}, ]m, ]M, [m, [M, [#, ]#, [*, [/, ]*, ]\

    以下のコマンドはword-motionsであり、これらはジャンプリストに登録されない
    w, W, e, E, b, B, ge, gE

    編集系コマンドのdwとかd$とかやってもCTRL-Oで戻れないけど、d)とするとCTRL-Oで戻れるのは、こういう仕組みがあったのかと納得した。
  2. dwやdt○の代わりにxコマンドを使う
    実際の編集では、いちいち文字数を数えたりしない。
    しかし、Vimgolfでは頭を柔らかくして、あえて実用的でないこともやる。

0 件のコメント:

コメントを投稿

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