LoginSignup
21
22

More than 5 years have passed since last update.

GradleをZshで補完する

Last updated at Posted at 2014-12-18

快適なAndroid(Studio)ライフを送りたい

内容

ZshでもGradleコマンドを補完出来るようにした

gradle_zsh_complete.gif

参考

zsh補完関数を自作すると便利 - はこべブログ ♨

動機

Android開発を爆速にする10のコマンドラインスクリプト - クックパッド開発者ブログ
この記事でGradleにも補完があるのを知ったが、
紹介されていたGradle tab completion for Bash. Works on both Mac and Linux.
を見るとBash用の補完関数だった...。

普段Zshを使っているので、Gradleを使う時だけBashを使うなんて嫌だしZsh用に移植したい

コード

ほとんどは上のBash版と同じ

/path/to/_gradle
# refs: https://gist.github.com/nolanlawson/8694399 : bash-version
_gradle() {
  local cur="$1"
  local gradle_cmd='gradle'
  if [[ -x ./gradlew ]]; then
    gradle_cmd='./gradlew'
  fi
  if [[ -x ../gradlew ]]; then
    gradle_cmd='../gradlew'
  fi

  local completions=''
  local cache_dir="$HOME/.gradle_tabcompletion"
  mkdir -p $cache_dir

  local gradle_files_checksum='hoge';
  if [[ -f build.gradle ]]; then # top-level gradle file
    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 # no top-level gradle file
    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 # not cached! boo-urns!
    completions=$($gradle_cmd --no-color --quiet tasks | grep --color=none ' - ' | awk '{print $1}' | tr '\n' ' ')
    if [[ ! -z $completions ]]; then
      echo $completions > $cache_dir/$gradle_files_checksum
    fi
  fi

  local -a commands
  commands=( "${(z)completions}" )
  compadd $commands
  return 1;
}

compdef _gradle gradle
compdef _gradle gradlew
compdef _gradle ./gradlew

gistにも置いた
配列にしてcompaddすればいいっぽいことを学んだ
#compdef gradleとファイルの頭に書いてもいいが、gradlegradlew./gradlewに対応させられるかどうか検証するもの面倒だったのでこうした

Bashの場合

上のリンクにあるBash用のやつ、コメントにもあるように

-    if [[ -x `which md5 2 > /dev/null` ]]; then # mac
+    if [[ -x `which md5 2> /dev/null` ]]; then # mac

と修正しないとBashでも動かないはず

使い方

このファイルは

~/.zshrc
source /path/to/_gradle

このように~/.zshrcにでも書いておけば読み込んでくれる

簡単にするならこれで試せるはず

curl -o </path/to/_gradle> https://gist.githubusercontent.com/petitviolet/910c0b54b067405d0aa3/raw/6cc95427f82f0673b6248de7e58ee6eb901099ff/_gradle
echo 'source </path/to/_gradle>` >> ~/.zshrc

なお、初回のみタスクの読み込みに時間がかかるが、2回目以降はファイルキャッシュを読み込むため比較的速くなる

21
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
22