prezto/modules/utility/functions/zsh-help
Indrajit Raychaudhuri 84e0787411 general: Remove redundant usage of cat
In general, the substitution ‘$(cat foo)’ may be replaced by the
equivalent but faster ‘$(<foo)’.

See: https://zsh.sourceforge.io/Doc/Release/Expansion.html#Command-Substitution
2023-05-04 13:58:37 -05:00

102 lines
3.9 KiB
Plaintext

#
# Provides a much easier way to search and access ZSH's manual. First checks for
# terms at the start of the manual, then checks if it's at start of a line allowing
# whitespace.
#
# Authors:
# Samantha McVey <samantham@posteo.net>
#
# function zsh-help {
local usage="$(<<EOF
usage: $0 [--help] [--zsh-help-debug] [--all] search term(s)
Options:
--all - search for the term anywhere, not just at the start of a line.
--help - show this help message
--zsh-help-debug - print out the regex search choosenq instead of searching
Looks up things in the zsh documentation. --all must come after --zsh-help-debug
if used together.
Uses less as the pager. Press 'n' to search forward 'N' to search backwards.
Case is ignored unless capital letters appear in the search term.
EOF
)"
#function zsh-help {
function _zsh-help-join { # Joins the arguments into a string delimited by $separator
local separator=$1;
local arr=$*;
arr=${arr:${#separator}+1}; # < Line needed so result doesn't start with
arr=${arr// /$separator}; # a separator.
<<<$arr
}
local case='-i'; local section='ZSHALL'; local debug=''; local pattern=''
function _zsh-help-try-query {
local case="$1"; local pattern="$2"; local i=''
local array=( ZSHBUILTINS ZSHALL ZSHMODULES )
for i in ${array}; do
if [[ ${debug} ]]; then printf "Looking in %s for: %s %s\n" "${i}" "${case}" "${pattern}" 1>&2; fi
if man --pager='' ${i} | grep -E ${case} "${pattern}" > /dev/null; then
printf "%s" "${i}"; return 0;
fi
done
return 1
}
# By default search only things at start of line
local first_prefix='^'
local prefix='^\s*'
if [[ ${1} == '--zsh-help-debug' ]]; then
shift; debug=1
fi
if [[ ${1} == "--all" ]]; then
shift; first_prefix='' # We're searching everything, so remove the prefix
fi
if [[ $# < 1 || $1 == "--help" ]]; then
printf "%s\n" "${usage}"
unfunction _zsh-help-join; unfunction _zsh-help-try-query; # unfunction so it's not in the global scope
return 1
fi
if [[ ${1} == "test" && $# == 1 ]]; then
case=''
pattern='^CONDITIONAL EXPRESSIONS$'
elif [[ ($1 == "-eq" || $1 == "-ne" || $1 == "-lt" || $1 == "-gt" || $1 == "-le" || $1 == "-ge") && $# == 1 ]]; then
case=''
pattern="${prefix}exp1\s+${1}\s+exp2"
elif [[ $1 == 'zstyle' ]]; then
pattern=$(_zsh-help-join '\s+' "$@")
section=ZSHMODULES
fi
# If it wasn't one of the special-cased things, check ZSHBUILTINS first. If
# not found there, we will search ZSHALL
if [[ ${pattern} == "" ]]; then
pattern="$(_zsh-help-join '\s+' "$@")"
# search for sections at the start of the man page first
section=$(_zsh-help-try-query "${case}" "${first_prefix}${pattern}")
# If it exists there, keep ZSHBUILTINS as the section
if (( $? == 0 )); then
pattern="${first_prefix}${pattern}"
elif [[ "${prefix}" ]]; then
# if not found, search for the term preceeded by whitetext
section=$(_zsh-help-try-query "${case}" "${prefix}${pattern}")
if (( $? == 0 )); then
pattern="${prefix}${pattern}"
else
pattern=""
fi
fi
if [[ ! ${pattern} ]]; then # Otherwise we use zshall
printf "Can't find term\n" 2>&1
unfunction _zsh-help-join; unfunction _zsh-help-try-query; # unfunction so it's not in the global scope
return 1;
fi
fi
local command="man --pager=\"less ${case} -p '${pattern}'\" \"${section}\""
if [[ ${debug} ]]; then
printf "\nFinal search term is:\n"; printf "%s\n" "${command}";
else
eval $command
fi
local rtrn=$?
unfunction _zsh-help-join; unfunction _zsh-help-try-query; # unfunction so it's not in the global scope
return $?
#}