概要
zshでcompinitした際に、下記のようなエラーが出ることがあります
# compinit
zsh compinit: insecure directories and files, run compaudit for list.
Ignore insecure directories and files and continue [y] or abort compinit [n]?
これは検索すると、compaudit
で出てくるディレクトリのオーナーやパーミッションを設定し直すことで解消できる、といった例を多く見かけます。
シングルユーザーの場合はこれで問題ないのですが、同じシステムを複数ユーザーで使っている場合は
誰か一人しかディレクトリのオーナーになれないので、毎回y
を入力するか、chown
をする必要があります。
※chownをする方法はこちらでも紹介されていました。
※そもそもcompinit -u
とすれば無視することもできますが、 zplug
を使っている場合はこれがラップされているので修正が困難です。
Macの場合 /usr/local/share/zsh/
がこの問題として上がる例が多いみたいです。
このディレクトリはHomebrewで入れたパッケージの補完スクリプトなどが入る場所ですね。
今回は、chown
せずに、補完を効かせつつこのエラーを出なくする方法を紹介します。
今の結論
zplug load
の前に↓をやる
rsync -a /usr/local/share/zsh/ ~/.zsh # sync auto completion scripts
fpath=("${(@)fpath:#/usr/local/share/zsh/site-functions}") # remove from $fpath
fpath=($fpath ~/.zsh)
何をやっているか
/usr/local/share/zsh/
を~/.zsh
にコピー
rsync -a /usr/local/share/zsh/ ~/.zsh
毎回rsync
してるのは、Homebrewで新しいパッケージ入れた後でも反映できるようにするためです
重くなる懸念があれば、一度だけcp -R /usr/local/share/zsh/ ~/.zsh
としたり、rehash
みたいなaliasにしてもいいかもしれません。
fpathの更新
デフォルトでzshのモジュールとして読み込まれるパスは$fpath
に一覧が入っています。
# echo $fpath
/usr/local/share/zsh/site-functions /usr/share/zsh/site-functions /usr/share/zsh/5.7.1/functions ...
なので
fpath=("${(@)fpath:#/usr/local/share/zsh/site-functions}") # remove from $fpath
fpath=(~/.zsh $fpath)
として、/usr/local/share/zsh/site-functions
を$fpath
から削除し、rsyncした~/.zsh
を追加しています。
ひとまずこれで、複数ユーザーでもHomebrewで入れたパッケージの補完を効かせつつ insecure directories...
エラーが出ないようになりました。
参考
https://qiita.com/suin/items/7b49abadc387801e8d6f
https://stackoverflow.com/questions/3435355/remove-entry-from-array