diff options
Diffstat (limited to 'Completion/Zsh/Type/_command_names')
-rw-r--r-- | Completion/Zsh/Type/_command_names | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/Completion/Zsh/Type/_command_names b/Completion/Zsh/Type/_command_names index cd630b7a4..b1c35f013 100644 --- a/Completion/Zsh/Type/_command_names +++ b/Completion/Zsh/Type/_command_names @@ -41,11 +41,24 @@ fi args=( "$@" ) local -a cmdpath -if zstyle -a ":completion:${curcontext}" command-path cmdpath && - [[ $#cmdpath -gt 0 ]] -then + +zstyle -a ":completion:${curcontext}" command-path cmdpath + +# Using the current PATH doesn't necessarily make sense when completing commands +# to tools like sudo, which might set a different one. A common issue is that +# /**/sbin appear in the PATH used by the tool, but not in the one used by the +# unprivileged user who calls it. To do the right thing in the most common +# cases, we'll simply ensure that the sbin variants always appear here when not +# otherwise overridden (bash-completion's _sudo does something similar) +if (( ! $#cmdpath && $#_comp_priv_prefix )); then + cmdpath=( $path ${path/%\/bin//sbin} ) + cmdpath=( ${(u)^cmdpath}(/-N) ) +fi + +if (( $#cmdpath )); then local -a +h path local -A +h commands path=( $cmdpath ) fi + _alternative -O args "$defs[@]" |