petitviolet blog

    GradleをZshで補完する

    2014-12-18

    QiitaAndroidZshgradle

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

    from: https://qiita.com/petitviolet/items/11ae1c7791e6343a6c1e