mirror of
https://github.com/dcarrillo/prezto.git
synced 2024-09-06 20:27:31 +00:00
* Add zsh-help function for easily searching the zsh documentation Looks up things in the zsh documentation. Usage: zsh-help [--all] search term(s) Option --all will seach for the term anywhere, not just at the start of a line. When not using --all it will search nicely for terms at the beginning of the line, which in the zsh man pages is where terms that are explained are located, allowing you to search the zsh man pages easily. * Improve zsh-help to search section headings before other text 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. Clean up some of the code a bit and format it to have a proper header for the zprezto project with author/email and description of the function.
103 lines
3.9 KiB
Plaintext
103 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="$(
|
|
cat <<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 $?
|
|
#}
|