diff --git a/modules/utility/functions/zsh-help b/modules/utility/functions/zsh-help new file mode 100644 index 00000000..f6605ea0 --- /dev/null +++ b/modules/utility/functions/zsh-help @@ -0,0 +1,102 @@ +# +# 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 +# + +# function zsh-help { + +local usage="$( +cat <&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 $? +#}