発生箇所を見てみる。
$ locate compinit
/usr/share/zsh/functions/Completion/bashcompinit
/usr/share/zsh/functions/Completion/compinit
zsh
if [[ -f "$_comp_dumpfile" ]]; then
if [[ -n "$_i_check" ]]; then
read -rA _i_line < "$_comp_dumpfile"
if [[ _i_autodump -eq 1 && $_i_line[2] -eq $#_i_files &&
$ZSH_VERSION = $_i_line[4] ]]
then
builtin . "$_comp_dumpfile"
_i_done=yes
fi
else
builtin . "$_comp_dumpfile"
_i_done=yes
fi
fi
$_comp_dumpfile があやしい!
$ file ~/.zcompdump
/home/ore/.zcompdump: symbolic link to `/home/ore/Dropbox/dotfiles/.zcompdump'
ウッ 他の環境かなんかのゴミファイルが同期されてた……
unlink ~/.zcompdump
rm ~/Dropbox/dotfiles/.zcompdump
exec zsh
でOKになった。
## 実験
touch .zcompdump
dd if=/dev/zero of=.zcompdump bs=1024000 count=1
ln -s /dev/null ~/.zcompdump
あたりは ~/.zcompdump が正常なものに上書きされるので上記問題は出なかった。
であるので、zcompdumpとしては正常なんだけどzshバージョン差異などで解釈時にエラーが出ているということなんだと思った。
## .zcompdump とは?
compinit の実行を高速化するために、ダンプされた設定ファイルが生 成され、今後の起動ではこれが読まれる。これは初期設定であるが、 -D オプションをつけて compinit を呼べば無効にすることができ る。ダンプファイルは初期化ファイルと同じディレクトリ中(例えば $ZDOTDIR や $HOME)の .zcompdump である。あるいは、 `compinit -d dumpfile' で明示的にファイル名を与えることがで きる。次回の compinit 呼び出しでは、全初期化を行う代わりにダンプ ファイルを読む。
<a href="http://web.archive.org/web/20030620174341/http://dengaku.org/~naoki/zsh/Doc/zsh_19.html#SEC100">zsh: Completion System</a>
中身は補完コマンドの初期化設定。zshスクリプトとして読み込みできる。
source ~/.zcompdump
## よりゆるふわな結論
zshの補完で何かしらうまくいかないことがあったら~/.zcompdump を一旦消せ