Zshでサブコマンドにエイリアスをあてる

REPLを触っているとき過去の入力を遡ったり矢印キーを使って云々するってことはよくあること。

これがあると結構色々便利だったりする。

さて、Common Lispの処理系でREPLを起動するときあまりこれができないのでhogeという気持ちになってしまう。

普段使っているのはRoswellというもので、REPLを起動する際は

$ ros run

とする。

今回はこのros runに対してrlwrapを効かせたい。

エイリアスをあてる

zshの環境でエイリアスをあてるとき

alias '[target-command]=[original-commands]'

という書き方をするが、このtarget-commandにサブコマンド入りを入れることはできない。

具体的に

# これは動かない
alias 'pip install=pip install --user'

は機能しない。

ということでzshrcにて関数を定義してやる。

function ros() {
    if [[ "$1" == "run" ]]; then
        shift 1
        command rlwrap ros run "$@"
    else
        command ros "$@"
    fi
}      

これをしてやることによって、例えばros install hogehogeとすると普通のrosコマンドが機能し、第一引数にrunがある場合はrlwrap ros runが機能するよう条件分岐してくれる。

先ほどのpip installの例では

function pip() {
  if [[ "$1" == "install" ]]; then
    shift 1
    command pip install --user "$@"
  else
    command pip "$@"
  fi
}

となる。