pockestrap

Programmer's memo

mv hoge hoge.bak したあと元に戻したい。

やりたい

$ mv hoge hoge.bak

# 何らかの作業

$ mv hoge.bak hoge

とか、一時的にバックアップして元に戻すことって割とあると思います。

そんな時に、一々打ち直すのはめんどくさい。なので、てきとーにシェルの関数を書きました。

やった

function swap_last_arg()
{
  local last_arg="${${(z)BUFFER}[-1]}"
  local last_1_arg="${${(z)BUFFER}[-2]}"
  local other="${${(z)BUFFER}[0, -3]}"
  BUFFER="${other} ${last_arg} ${last_1_arg}"
}
zle -N swap_last_arg
bindkey "\C-s" swap_last_arg

こんな感じ。最後の行はCtrl-Sにこれを割り当てているだけなので、お好きなキーに割り当てて使ってください。

つかう

$ mv hoge hoge.bak

# 何らかの作業

# シェルのヒストリからこれを呼び出す。
$ mv hoge hoge.bak

# Ctrl-Sをタイプすると…
$ mv hoge.bak hoge


# こんな感じにオプションがついていても大丈夫です。
$ mv -v hoge hoge.bak

現在のバッファの、最後の引数と最後から二番目の引数を交換します。 前の方にならばオプションがついていても問題ありません。

別にmvに限ったものではないので、他のコマンドでも利用できると思います[要出典]。

しくみ

"${(z)hoge}"の様にすると、hoge変数の中身をzshの単語分割規則に従って単語分割してくれるようなので、それを利用しています。 zshすごい。