Skip to content

Commit

Permalink
command-not-found: Restore idiomatic homebrewed handler loading on MacOS
Browse files Browse the repository at this point in the history
As is the convention in prezto, we cache the command-not-found handler to
avoid incurring the performance penalty of loading ruby interpreter on
every call. This restores the 'Homebrew way' of loading command-not-found
handler.

Further, the formally recommended command lookup mechanism in Homebrew
(viz., `brew command command-not-found-init`) is ruby based and is super
slow. To avoid performance penalty, we `find` it ourselves from
`TAP_DIRECTORY` defined internally in Homebrew.

This also reinstates support for custom taps or non-standard Homebrew location.
  • Loading branch information
indrajitr committed Dec 11, 2018
1 parent 3de1e24 commit 2286662
Showing 1 changed file with 22 additions and 3 deletions.
25 changes: 22 additions & 3 deletions modules/command-not-found/init.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,28 @@ if [[ -s '/etc/zsh_command_not_found' ]]; then
# Load command-not-found on Arch Linux-based distributions.
elif [[ -s '/usr/share/doc/pkgfile/command-not-found.zsh' ]]; then
source '/usr/share/doc/pkgfile/command-not-found.zsh'
# Load command-not-found on macOS when homebrew tap is configured.
elif [[ -s '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh' ]]; then
source '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh'
# Load command-not-found on macOS when Homebrew tap is configured.
# To avoid performance penalty, we do not use Homebrew's ruby based command
# lookup mechanism (viz., `brew command command-not-found-init`) and instead
# `find` it ourselves from `TAP_DIRECTORY` defined internally in Homebrew.
elif (( $+commands[brew] )); then
cnf_command="$(brew --repository 2> /dev/null)"/Library/Taps/homebrew/homebrew-command-not-found/cmd/brew-command-not-found-init.rb
if [[ -s "$cnf_command" ]]; then
cache_file="${TMPDIR:-/tmp}/prezto-brew-command-not-found-cache.$UID.zsh"

if [[ "$cnf_command" -nt "$cache_file" \
|| "${ZDOTDIR:-$HOME}/.zpreztorc" -nt "$cache_file" \
|| ! -s "$cache_file" ]]; then
# brew command-not-found-init is slow; cache its output.
brew command-not-found-init >! "$cache_file" 2> /dev/null
fi

source "$cache_file"

unset cache_file
fi

unset cnf_command
# Return if requirements are not found.
else
return 1
Expand Down

0 comments on commit 2286662

Please sign in to comment.