Help us understand the problem. What is going on with this article?

GradleをZshで補完する

More than 3 years have passed since last update.

快適な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回目以降はファイルキャッシュを読み込むため比較的速くなる

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away