Homebrew の zsh で補完が効かなくなったので対処


いつの間にか zsh で補完できなくなった

気がついたら zsh で補完できなくなっていた。

zsh は Homebrew でインストールしたものを使っている。 zsh のバージョンが上がったタイミングかもしれない。



zsh の設定には prezto を使っているので、まずは prezto を無効にしてみると…


prezto の問題なのか調べてみると、以下の issue を発見した。

compinit insecure fails silently disabling all tab completion

On this line:

# Load and initialize the completion system ignoring insecure directories. autoload -Uz compinit && compinit -i

compinit fails silently for cases where homebrew is owned by somebody other than the user. This then causes all tab completion to fail silently.

compinit -i がエラーになっているのか…

compinit について調べてみると、commpinit -i はファイルの所有者が root かカレントユーザーでない場合は無視する指定であることがわかった。

For security reasons compinit also checks if the completion system would use files not owned by root or by the current user, or files in directories that are world- or group-writable or that are not owned by root or by the current user. If such files or directories are found, compinit will ask if the completion system should really be used. To avoid these tests and make all files found be used without asking, use the option -u, and to make compinit silently ignore all insecure files and directories use the option -i. This security check is skipped entirely when the -C option is given.
via zsh: 20. Completion System


compinit -icompinit -C に変更することでも解決できるようだけど、 セキュリティチェックを無効にするのは気が引けるし、 prezto の更新時に conflict が発生するだろうから別の方法をとりたい。

compaudit で問題のあるファイルの一覧が得られるようなので以下のコマンドを実行した。 (もちろん、compaudit の出力は確認して覚えのないものが紛れ込んでいないか確認は必要。)

$ compaudit | sudo xargs chown root

ちにみに、OS X 付属の /bin/zsh では問題はないので /bin/zsh を使うのもアリかもしれない。

2015-07-08 追記

Homebrew の使い方が間違っていただけっぽい。 brew コマンドは sudo を付けて実行してたから(^◇^;)

GitHub · Build software better, together.

Homebrew is designed to work without using sudo.