Improve ZSH completions handling

- Only display the completions caveats from the current shell (assuming
  it's one of Bash, ZSH or Fish)
- If the completions location isn't in the ZSH `FPATH` then link to the
  documentation explaining how to do so.

Fixes https://github.com/Homebrew/brew/issues/8984
This commit is contained in:
Mike McQuaid 2020-11-26 16:08:26 +00:00
parent 6936f56b13
commit 3002c810be
No known key found for this signature in database
GPG Key ID: 48A898132FD8EE70
3 changed files with 29 additions and 6 deletions

View File

@ -26,9 +26,20 @@ class Caveats
f.build = build f.build = build
end end
caveats << keg_only_text caveats << keg_only_text
caveats << function_completion_caveats(:bash)
caveats << function_completion_caveats(:zsh) valid_shells = [:bash, :zsh, :fish].freeze
caveats << function_completion_caveats(:fish) current_shell = Utils::Shell.preferred || Utils::Shell.parent
shells = if current_shell.present? &&
(shell_sym = current_shell.to_sym) &&
valid_shells.include?(shell_sym)
[shell_sym]
else
valid_shells
end
shells.each do |shell|
caveats << function_completion_caveats(shell)
end
caveats << plist_caveats caveats << plist_caveats
caveats << elisp_caveats caveats << elisp_caveats
caveats.compact.join("\n") caveats.compact.join("\n")
@ -117,10 +128,20 @@ class Caveats
#{root_dir}/etc/bash_completion.d #{root_dir}/etc/bash_completion.d
EOS EOS
when :zsh when :zsh
<<~EOS site_functions = root_dir/"share/zsh/site-functions"
zsh_caveats = +<<~EOS
zsh #{installed.join(" and ")} have been installed to: zsh #{installed.join(" and ")} have been installed to:
#{root_dir}/share/zsh/site-functions #{site_functions}
EOS EOS
unless PATH.new(ENV["HOMEBREW_FPATH"]).to_a.include?(site_functions.to_s)
zsh_caveats << <<~EOS
#{site_functions} is not in your zsh FPATH!
Add it by following these steps:
#{Formatter.url("https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh")}
EOS
end
zsh_caveats.freeze
when :fish when :fish
fish_caveats = +"fish #{installed.join(" and ")} have been installed to:" fish_caveats = +"fish #{installed.join(" and ")} have been installed to:"
fish_caveats << "\n #{root_dir}/share/fish/vendor_completions.d" if completion_installed fish_caveats << "\n #{root_dir}/share/fish/vendor_completions.d" if completion_installed

View File

@ -188,6 +188,8 @@ describe Caveats do
before do before do
allow_any_instance_of(Pathname).to receive(:children).and_return([Pathname.new("child")]) allow_any_instance_of(Pathname).to receive(:children).and_return([Pathname.new("child")])
allow_any_instance_of(Object).to receive(:which).with(any_args).and_return(Pathname.new("shell")) allow_any_instance_of(Object).to receive(:which).with(any_args).and_return(Pathname.new("shell"))
allow(Utils::Shell).to receive(:preferred).and_return(nil)
allow(Utils::Shell).to receive(:parent).and_return(nil)
end end
it "gives dir where bash completions have been installed" do it "gives dir where bash completions have been installed" do

View File

@ -62,7 +62,7 @@ HOMEBREW_LIBRARY="$HOMEBREW_REPOSITORY/Library"
# Copy and export all HOMEBREW_* variables previously mentioned in # Copy and export all HOMEBREW_* variables previously mentioned in
# manpage or used elsewhere by Homebrew. # manpage or used elsewhere by Homebrew.
for VAR in BROWSER DISPLAY EDITOR NO_COLOR PATH for VAR in BROWSER DISPLAY EDITOR NO_COLOR PATH FPATH
do do
# Skip if variable value is empty. # Skip if variable value is empty.
[[ -z "${!VAR}" ]] && continue [[ -z "${!VAR}" ]] && continue