mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-05-19 22:46:03 +02:00
b242121983
This is aimed mostly at use of run-help as a standalone function rather than as a widget. When run-help is invoked outside widget context, there's no source line to search for the original command name, so this attempts searching the arguments.
130 lines
3.2 KiB
Bash
130 lines
3.2 KiB
Bash
#!/bin/zsh
|
|
#
|
|
# Figure out where to get the best help, and get it.
|
|
#
|
|
# Install this function by placing it in your FPATH and then
|
|
# adding to your .zshrc the lines:
|
|
# unalias run-help
|
|
# autoload -Uz run-help
|
|
#
|
|
|
|
emulate -RL zsh
|
|
|
|
local HELPDIR="${HELPDIR:-@runhelpdir@}"
|
|
|
|
[[ $1 == "." ]] && 1="dot"
|
|
[[ $1 == ":" ]] && 1="colon"
|
|
|
|
# Check whether Util/helpfiles has been used to generate zsh help
|
|
if [[ $# == 0 || $1 == "-l" ]]
|
|
then
|
|
if [[ -d $HELPDIR ]]
|
|
then
|
|
echo "Here is a list of topics for which special help is available:"
|
|
echo ""
|
|
print -rc $HELPDIR/*(:t)
|
|
else
|
|
echo "There is no list of special help topics available at this time."
|
|
fi
|
|
return 0
|
|
elif [[ -n "${HELPDIR:-}" && -r $HELPDIR/$1 && $1 != compctl ]]
|
|
then
|
|
${=PAGER:-more} $HELPDIR/$1
|
|
return $?
|
|
fi
|
|
|
|
# No zsh help; use "whence" to figure out where else we might look
|
|
local what places noalias newline='
|
|
'
|
|
integer i=0 didman=0
|
|
|
|
places=( "${(@f)$(builtin whence -va $1)}" )
|
|
if [[ $places = *"not found"* && $1 != ${(Q)1} ]]; then
|
|
# Different when unquoted, so try stripping quotes.
|
|
places=( "${(@f)$(builtin whence -va ${(Q)1})}" )
|
|
if (( ${#places} )); then
|
|
set -- "${(Q)@}"
|
|
fi
|
|
# Quotation is significant to aliases, so suppress lookup.
|
|
noalias=1
|
|
fi
|
|
|
|
{
|
|
while ((i++ < $#places))
|
|
do
|
|
what=$places[$i]
|
|
[[ -n $noalias && $what = *" is an alias "* ]] && continue
|
|
builtin print -r $what
|
|
case $what in
|
|
(*( is an alias for (noglob|nocorrect))*)
|
|
[[ ${what[(w)7]:t} != ${what[(w)1]} ]] &&
|
|
run_help_orig_cmd=${what[(w)1]} run-help ${what[(w)7]:t} ${(z)${what[(w)8,-1]}}
|
|
;;
|
|
(*( is an alias)*)
|
|
[[ ${what[(w)6]:t} != ${what[(w)1]} ]] &&
|
|
run_help_orig_cmd=${what[(w)1]} run-help ${what[(w)6]:t} ${(z)${what[(w)7,-1]}}
|
|
;;
|
|
(*( is a * function))
|
|
case ${what[(w)1]} in
|
|
(comp*) man zshcompsys;;
|
|
(zf*) man zshftpsys;;
|
|
(run-help) man zshcontrib;;
|
|
(*) builtin functions ${what[(w)1]} | ${=PAGER:-more};;
|
|
esac;;
|
|
(*( is a * builtin))
|
|
case ${what[(w)1]} in
|
|
(compctl) man zshcompctl;;
|
|
(comp*) man zshcompwid;;
|
|
(bindkey|vared|zle) man zshzle;;
|
|
(*setopt) man zshoptions;;
|
|
(cap|getcap|setcap) ;&
|
|
(clone) ;&
|
|
(ln|mkdir|mv|rm|rmdir|sync) ;&
|
|
(sched) ;&
|
|
(echotc|echoti|sched|stat|zprof|zpty|zsocket|zstyle|ztcp) man zshmodules;;
|
|
(zftp) man zshftpsys;;
|
|
(*) man zshbuiltins;;
|
|
esac
|
|
;;
|
|
(*( is hashed to *))
|
|
man ${what[(w)-1]:t}
|
|
;;
|
|
(*( is a reserved word))
|
|
man zshmisc
|
|
;;
|
|
(*)
|
|
if ((! didman++))
|
|
then
|
|
if whence "run-help-$1:t" >/dev/null
|
|
then
|
|
local cmd_args
|
|
builtin getln cmd_args &&
|
|
builtin print -z "$cmd_args"
|
|
cmd_args=( ${(z)${cmd_args:-"$*"}} )
|
|
|
|
# Discard the command itself & everything before it.
|
|
shift $cmd_args[(i)(${run_help_orig_cmd}|$1)] cmd_args 2>/dev/null ||
|
|
continue
|
|
|
|
# Discard options, parameter assignments & paths.
|
|
cmd_args=( ${cmd_args[@]:#([-+]*|*=*|*/*|\~*)} )
|
|
|
|
eval "run-help-$1:t ${(@q)cmd_args}"
|
|
else
|
|
POSIXLY_CORRECT=1 man $@:t
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
if ((i < $#places && ! didman))
|
|
then
|
|
builtin print -nP "%SPress any key for more help or q to quit%s"
|
|
builtin read -k what
|
|
[[ $what != $newline ]] && echo
|
|
[[ $what == [qQ] ]] && break
|
|
fi
|
|
done
|
|
} always {
|
|
unset run_help_orig_cmd
|
|
}
|