📚
zsh で diff -u のファイル名補完ができなかったのを解決した
問題解決編
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月にメーリングリストにパッチが投稿されていたことがわかりました。
このパッチは本体に取り込まれているので、_diff_options のファイルを fpath
の通ったところに置けば OK です。(2024年10月7日現在、この修正が含まれたリリースはありません)
おまけ
このパッチでは環境変数 OSTYPE
が darwin22 以上であることを判定しています。
当初、私の環境では OSTYPE
は darwin21.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