タイトルは少し端折っていて、正確には ~/.zshrc に以下の設定が必要です。

# $FPATH 以下にある補完コレクションを使う。
autoload -Uz compinit; compinit -u

これは Heroku CLI 固有の設定ではありません。ls や git などにも適用
される補完を有効にする設定です。

macOS High Sierra 付属の zsh の $FPATH デフォルト値です。

$ echo $FPATH | tr ':' '\n'
/usr/local/share/zsh/site-functions
/usr/share/zsh/site-functions
/usr/share/zsh/5.3/functions

このように補完が効きます。App の補完はうれしい。
Heroku CLI auto completion part2

ここに至った経緯 1/2

Heroku CLI は $ brew install heroku でインストールしており、
/usr/local/share/zsh/site-functions/_heroku があります。

そのため、初めはこんな設定をしていました。

FPATH=/usr/local/share/zsh/site-functions:$FPATH

でも前述したように /usr/local/share/zsh/site-functions は $FPATH
のデフォルト値に含まれているので不要でした。削除。

ここに至った経緯 2/2

別件で $ brew install heroku は obsolete で、
現在は $ brew install heroku/brew/heroku だと知りました。

$ heroku releases --app aqueous-reaches-70470
Warning: Unsupported install. Install heroku with `brew install heroku/brew/heroku`
=== aqueous-reaches-70470 Releases - Current: v3
v3  Deploy           [email protected]  2018/10/27 12:01:49 +0900 (~ 1m ago)
v2  Enable Logplex   [email protected]  2018/10/27 11:49:44 +0900 (~ 13m ago)
v1  Initial release  [email protected]  2018/10/27 11:49:43 +0900 (~ 13m ago)

Heroku CLI をインストールし直したら、補完設定が表示されました。

$ brew uninstall heroku --force
$ brew install heroku/brew/heroku
(snip)
==> heroku
To use the Heroku CLI's autocomplete --
  Via homebrew's shell completion:
    1) Follow homebrew's install instructions https://docs.brew.sh/Shell-Completion
        NOTE: For zsh, as the instructions mention, be sure compinit is autoloaded
              and called, either explicitly or via a framework like oh-my-zsh.
    2) Then run
      $ heroku autocomplete --refresh-cache

  OR

  Use our standalone setup:
    1) Run and follow the install steps:
      $ heroku autocomplete

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions have been installed to:
  /usr/local/share/zsh/site-functions

OR の前に書かれていることは、$FPATH を設定して
$ heroku autocomplete –refresh-cache しろとのこと。
~/.zcompdump と ~/Library/Caches/heroku 以下が更新されたようです。

~/Library/Caches/heroku 以下には App 名のキャッシュも含まれている
けど、このコマンドを実行しないと更新されないのかな。うーん。

OR の後に書かれていることもやってみました。

$ heroku autocomplete
Building the autocomplete cache... done

Setup Instructions for HEROKU CLI Autocomplete ---

1) Add the autocomplete env var to your zsh profile and source it
$ printf "$(heroku autocomplete:script zsh)" >> ~/.zshrc; source ~/.zshrc

NOTE: After sourcing, you can run `$ compaudit -D` to ensure no permissions conflicts are present

2) Test it out, e.g.:
$ heroku <TAB>                 # Command completion
$ heroku apps:info --<TAB>     # Flag completion
$ heroku apps:info --app=<TAB> # Flag option completion

Visit the autocomplete Dev Center doc at https://devcenter.heroku.com/articles/heroku-cli-autocomplete

Enjoy!

printf “$(heroku autocomplete:script zsh)” » ~/.zshrc したら、
~/.zshrc に以下が書き込まれました。

# heroku autocomplete setup
HEROKU_AC_ZSH_SETUP_PATH=/Users/masutaka/Library/Caches/heroku/autocomplete/zsh_setup && test -f $HEROKU_AC_ZSH_SETUP_PATH && source $HEROKU_AC_ZSH_SETUP_PATH;

先ほどの補完とほぼ同じで、違いは ‘…’ が表示されることくらいです。
Heroku CLI auto completion part2

面倒ですが、以下について調べてみました。

(1) /Users/masutaka/Library/Caches/heroku/autocomplete/zsh_setup の仕組み
$ heroku autocomplete がこのファイルを使うように誘導する。

(2) /usr/local/share/zsh/site-functions/_heroku の仕組み
$ brew install heroku/brew/heroku によって作られる。

(1) /Users/masutaka/Library/Caches/heroku/autocomplete/zsh_setup の仕組み

TAB キーに関数を割り当てつつ、シェル変数の設定をしています。
autoload -Uz compinit; compinit -u もやってくれます。

/usr/local/Cellar/heroku/7.18.3/libexec/node_modules/@heroku-cli/plugin-autocomplete/autocomplete/zsh は
ディレクトリで、_heroku というファイルがあります。
関数 _heroku を定義して実行するだけのようです。

(2) /usr/local/share/zsh/site-functions/_heroku の仕組み

シェル変数を設定し、関数 _heroku を定義して実行しています。

(1) と (2) の違い

ほぼ同じでした。(1) は TAB キーに関数 expand-or-complete-with-dots
を割り当てる点だけが違います。この関数は補完時に ‘…’ を表示するだけです。

測定はしていませんが、(1) は autoload -Uz compinit; compinit; も
実行するため、(2) より若干 zsh の起動が遅そうです。

zsh の起動はチリツモで遅くなるため、(1) を使う必要性は少なさそうです。

おまけ

参考までに、私の ~/.zshrc を貼っておきます。

https://github.com/masutaka/dotfiles-public/blob/master/.zshrc

preztooh-my-zsh などの zsh framework は使っていません。