blog.petitviolet.net

Gradleのtaskをpecoで選択する

2015-05-24

QiitaAndroidZshgradle

Gradle を使って Android 開発しているとき、Gradle の task を選択することが多く、以前書いた内容で TAB 補完は出来るようになった Android - Gradle を Zsh で補完する - Qiita

今回は、task を TAB 補完ではなく peco で選択出来るようにした gradle_comp.gif

手順

  1. カレントディレクトリに合ったgradleコマンドを探す
  2. gradle tasks --allを実行して文字列として取得
  3. 得られた文字列を TAB 補完の場合は Space 区切りにする
  4. peco で絞り込む場合は\n区切りに変換する

    • zsh のフラグを用いてソートする
/usr/local/bin/_gradle
#!/usr/bin/env zsh

# 使用するgradleコマンド
function gradle_command() {
  local gradle_cmd='gradle'
  if [[ -x ./gradlew ]]; then
    gradle_cmd='./gradlew'
  fi
  if [[ -x ../gradlew ]]; then
    gradle_cmd='../gradlew'
  fi
  echo $gradle_cmd
}

# gradleのtask一覧
function gradle_tasks() {
  local gradle_cmd=$(gradle_command)
  local completions=''
  local cache_dir="$HOME/.gradle_tabcompletion"
  mkdir -p $cache_dir

  # cacheするファイル名
  local gradle_files_checksum='hoge';
  if [[ -f build.gradle ]]; then
    if [[ -x `which md5 2> /dev/null` ]]; then # mac
      local all_gradle_files="$(find . -name build.gradle 2> /dev/null)"
      gradle_files_checksum="$(md5 -q -s "${all_gradle_files}")"
    else # linux
      gradle_files_checksum="$(find . -name build.gradle | xargs md5sum | md5sum)"
    fi
  else
    gradle_files_checksum='no_gradle_files'
  fi

  if [[ -f $cache_dir/$gradle_files_checksum ]]; then # cached! yay!
    completions=$(\cat $cache_dir/$gradle_files_checksum)
  else
    # ジョブ制御を無効化
    set +m
    # バックグラウンドでindicatorを回す
    loading 1000 & >/dev/null 2>&1
    set -m
    # indicatorのprocess id
    local LOADING_PID=$!
    completions=$($gradle_cmd --no-color --quiet tasks --all | grep --color=none ' - ' | awk '{print $1}' | tr '\n' ' ')
    # indicatorを殺す
    kill -INT $LOADING_PID
    if [[ ! -z $completions ]]; then
      echo $completions > $cache_dir/$gradle_files_checksum
    fi
  fi
  echo $completions
}

# pecoでtask選択
function peco-select-gradle-tasks() {
  local gradle_cmd=$(gradle_command)
  local completions=$(gradle_tasks)
  local selected_task=$(echo ${(o)${(z)completions}} | tr ' ' '\n' | peco)
  if [ -n "$selected_task" ]; then
    BUFFER="$gradle_cmd $selected_task"
    zle accept-line
  fi
  zle clear-screen
}

zle -N peco-select-gradle-tasks
bindkey "^g^t" peco-select-gradle-tasks

# gradleのtab補完
function _gradle() {
  local cur="$1"
  local completions=$(gradle_tasks)
  local -a tasks
  tasks=("${(z)completions}")
  compadd $tasks
  return 0;
}

compdef _gradle gradle
compdef _gradle gradlew
compdef _gradle ./gradlew

これをsource /path/to/scriptすれば使えるようになる ^g^tで gradle を peco で選べるようになったのでめっちゃ便利

from: https://qiita.com/petitviolet/items/3399019e74c446e379ca