diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2016-07-30 01:17:09 +1200 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2016-07-30 02:09:30 +1200 |
commit | 4cbbd121c012b3962f12fdff0f1820c3b8636a44 (patch) | |
tree | 00149270df365ed0b7a1b9e9f4922fe7d5a80eb3 /bash/bash_completion.d/man.bash | |
parent | Change ca from Bash func to sh script (diff) | |
download | dotfiles-4cbbd121c012b3962f12fdff0f1820c3b8636a44.tar.gz dotfiles-4cbbd121c012b3962f12fdff0f1820c3b8636a44.zip |
Move bash completion setup into separate dir
Diffstat (limited to 'bash/bash_completion.d/man.bash')
-rw-r--r-- | bash/bash_completion.d/man.bash | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/bash/bash_completion.d/man.bash b/bash/bash_completion.d/man.bash new file mode 100644 index 00000000..f1762a01 --- /dev/null +++ b/bash/bash_completion.d/man.bash @@ -0,0 +1,63 @@ +# Autocompletion for man(1) +_man() { + + # Don't even bother if we don't have manpath(1) + hash manpath || return 1 + + # Snarf the word + local word + word=${COMP_WORDS[COMP_CWORD]} + + # If this is the second word, and the previous word started with a number, + # we'll assume that's the section to search + local section subdir + if ((COMP_CWORD > 1)) && [[ ${COMP_WORDS[COMP_CWORD-1]} == [0-9]* ]] ; then + section=${COMP_WORDS[COMP_CWORD-1]} + subdir=man${section%%[^0-9]*} + fi + + # Read completion results from a subshell and add them to the COMPREPLY + # array individually + while IFS= read -rd '' page ; do + COMPREPLY[${#COMPREPLY[@]}]=$page + done < <( + + # Do not return dotfiles, give us extended globbing, and expand empty + # globs to just nothing + shopt -u dotglob + shopt -s extglob nullglob + + # Start an array of pages + declare -a pages + + # Break manpath(1) output into an array of paths + IFS=: read -a manpaths -r < <(manpath 2>/dev/null) + + # Iterate through the manual page paths and add every manual page we find + for manpath in "${manpaths[@]}" ; do + [[ $manpath ]] || continue + if [[ $section ]] ; then + for page in "$manpath"/"$subdir"/"$word"*."$section"?(.[glx]z|.bz2|.lzma|.Z) ; do + pages[${#pages[@]}]=$page + done + else + for page in "$manpath"/man[0-9]*/"$word"*.* ; do + pages[${#pages[@]}]=$page + done + fi + done + + # Strip paths, .gz suffixes, and finally .<section> suffixes + pages=("${pages[@]##*/}") + pages=("${pages[@]%.@([glx]z|bz2|lzma|Z)}") + pages=("${pages[@]%.[0-9]*}") + + # Bail out if we ended up with no pages somehow to prevent us from + # printing + ((${#pages[@]})) || exit 1 + + # Print the pages array to stdout, quoted and null-delimited + printf '%q\0' "${pages[@]}" + ) +} +complete -F _man -o default man |