はじめに

最近タスクランナーとしてroboを使う機会が増えてきているんだが、makeコマンドと違いzshの補完がされなくて不便。
ネットで探しても見つからなかったので、自分で作ってみた。

robo

ちなみにmakeコマンドではなくroboを使い始めたのは以下の通り。

  • 開発するプロジェクトのタスクランナーにmakeコマンドが利用されていて、自分独自のタスクを追加しづらいケースが増えてきた
  • タスクの書き方がYamlなので、CIの設定ファイルを書く感じと似ているため、個人的に学習コストが低かった
  • タスクをワンライナーにすれば実行時に引数を渡せるので、dockerコマンドみたいな引数をたくさん渡さなければいけないコマンドのエイリアスに便利
  • Golang製なので、インストールがバイナリ1個で楽ちん

インストールしなくても使えるmakeはやはり便利なので、 基本的にはmakeを利用しているのは変わらないが、ちょいちょいroboを利用する機会も増えてきたかなって感じ。

選択肢があることは良いことだ。

補完関数

出来たのは以下の通り。

function _robo() {
  local output="$(robo 2>&1)"
  if echo $output | grep -q "error loading configuration"; then
    return
  fi
  local values=()
  echo $output | while read line
  do
    if [ "$line" ]; then
      values+=$(echo $line | sed -e 's/   /[/' | sed -e 's/$/]/')
    fi
  done
  _values '' $values
}

roboコマンドを引数なしで実行した時に表示されるコマンド一覧の内容をごにょごにょする感じで実装している。
見て分かるとおり、grep sed など利用しているので、万が一使えない環境の人は別途インストールする必要がある。

有効にする方法

2通りあるっぽいのでお好みで。

  • zshのfunctionsディレクトリにファイルを配置する方法
  • zshrcに直接書いてしまう方法

配置方法によって、compdefの書き方が違うので気をつける必要あり。

ただし、以下の記述はかならず必要なので、zshrcに書くことを忘れないように。

# update compinit
autoload -U compinit
compinit

自分はこれにハマって、なかなか上手く適用されなくて苦労した。

おわりに

理屈が分かってしまえば、そんなに怖いものではなかったので、また必要であれば作ってみたいなと思う。