Description
zsh で git の補完が効かなくなった。 TAB を押下するたびに __git_func_wrap:3: : not found
というエラーが出力されて補完が使い物にならない。
$ zsh --version zsh 5.7.1 (x86_64-apple-darwin19.0) $ git --version git version 2.27.0 $ tig --version tig version 2.5.1 ncurses version 5.7.20081102 readline version 8.0
tig 2.5.1 に同梱されている bash/zsh 用の補完スクリプトが原因っぽい。巨大な Git リポジトリで tig の補完が遅くなる問題への対処として bash/zsh completion: reimplement and decrease runtime by factor 1863 · jonas/tig@26ab51d · GitHub でリファクタリングされたが、これが zsh でうまく動かないっぽい。
Solutions
Homebrew で tig 2.5.1 をインストールしている場合、以下の方法で git の補完が壊れることを防げる。 3. が最もスマートなやり方。
1. tig 用の補完スクリプトを削除する
zsh:12: command not found: __tig_main · Issue #940 · jonas/tig · GitHub で紹介されていた方法。単純だが tig の補完は一切効かなくなる。やや不便。
# These files(symlinks) are installed by `brew install tig` $ rm /usr/local/share/zsh/site-functions/_tig $ rm /usr/local/share/zsh/site-functions/tig-completion.bash
2. リファクタリング前の補完スクリプトで置き換える
tig の補完も使いたい場合の選択肢。古い補完スクリプトを取得するリビジョンは、 26ab51d28133354bfaa94d064bff37d29b3c30e3
より前の時点ならどこでも構わないが、候補を挙げるなら以下あたり。
- GitHub - jonas/tig at tig-2.5.0
- tig-2.5.0 tag Release tig-2.5.0 · jonas/tig · GitHub
- コミットでいうと tig-2.5.0 · jonas/tig@89c8fa2 · GitHub
- Merge pull request #990 from xaizek/two-memory-issues · jonas/tig@bf0cc12 · GitHub
26ab51d28133354bfaa94d064bff37d29b3c30e3
の一個前のコミット- つまり
26ab51d28133354bfaa94d064bff37d29b3c30e3^
(または26ab51d28133354bfaa94d064bff37d29b3c30e3~1
)
$ curl -o /usr/local/share/zsh/site-functions/tig-completion.bash https://raw.githubusercontent.com/jonas/tig/tig-2.5.0/contrib/tig-completion.bash $ curl -o /usr/local/share/zsh/site-functions/_tig https://raw.githubusercontent.com/jonas/tig/tig-2.5.0/contrib/tig-completion.zsh
3. Homebrew で tig 2.5.0 をインストールする
Homebrew でインストールした tig の補完スクリプトを上書きするのが気持ち悪い場合の選択肢。 Homebrew で古いバージョンの Formula をインストールする手順は installation - Homebrew install specific version of formula? - Stack Overflow の回答がいろいろ詳しいが、 URL を指定するやり方が一番簡単そう。
$ brew unlink tig $ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/bcdeb6b63d3cb57d0db05bed9a9b4ae14cba6df6/Formula/tig.rb
Homebrew でインストール可能な tig の過去バージョンと、そのバージョンをインストールする URL に必要なコミットハッシュ値は以下の方法で調べられる。
$ git clone https://github.com/Homebrew/homebrew-core.git $ cd homebrew-core $ git log -10 -p Formula/tig.rb
See also
全く同じ症状の人がいた。解決はしていないが、経緯と調べ方を知るのに役立った。