📚

zsh で diff -u のファイル名補完ができなかったのを解決した

2024/10/07に公開

問題解決編

macOS の Homebrew でインストールした zsh で、diff -u のファイル名補完ができないのにずっと悩んでいました。

具体的には

diff -u [TAB]

と1つ目のファイル名の補完はできるのですが、

diff -u foo.txt [TAB]

と2つ目のファイル名を補完しようとすると、

diff -u foo.txt -
option
-b  -- skip trailing white spaces
-c  -- output a context diff
-e  -- output an ed script
-f  -- output a reversed ed script
-r  -- recursively compare subdirectories

と、オプションを補完しようとしてしまいます。

これは macOS だけで起こり、Ubuntu など他の環境では起こりませんでした。

この問題、長い間悩んでいたのですが、2024年2月にメーリングリストにパッチが投稿されていたことがわかりました。
https://www.zsh.org/mla/workers/2024/msg00106.html

このパッチは本体に取り込まれているので、_diff_options のファイルを fpath の通ったところに置けば OK です。(2024年10月7日現在、この修正が含まれたリリースはありません)

おまけ

このパッチでは環境変数 OSTYPE が darwin22 以上であることを判定しています。

当初、私の環境では OSTYPEdarwin21.3.0 という値でした。

実際の Darwin のバージョンは 22.6.0 だったのでなぜ食い違うのかというのが気になったのですが、manに「The operating system, as determined at compile time.」とあるように、OSTYPE の値は zsh のコンパイル時に決まるようです。

zsh を再インストールしたところ、OSTYPE の値が現在の環境の値を返すようになりました。

おまけ2

macOS 標準添付の /bin/zsh のバージョンが最新リリースの 5.9 だったので、Homebrew の zsh は削除して /bin/zsh を使うようにしました。

Discussion