From 584bc520dfbc0e6a7e949b885bb9b949f99a1ff9 Mon Sep 17 00:00:00 2001 From: David Paleino Date: Thu, 17 Sep 2009 18:06:24 +0200 Subject: [PATCH] Support "man cmd subcmd" completion in contrib/man (Debian: #545411) --- CHANGES | 1 + contrib/man | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 3b08b100..53a369fc 100644 --- a/CHANGES +++ b/CHANGES @@ -36,6 +36,7 @@ bash-completion (1.x) * Improve qemu completion (Debian: #534901) * Added sshfs completion (shares the same as scp) (Debian: #545978) * Fixed obvious brokenness (typos) in contrib/mdadm + * Support "man cmd subcmd" completion in contrib/man (Debian: #545411) [ Ville Skyttä ] * Split yum completion to contrib/_yum (no longer installed by default, the diff --git a/contrib/man b/contrib/man index 89bf877a..883214ff 100644 --- a/contrib/man +++ b/contrib/man @@ -8,7 +8,7 @@ -o $UNAME = OpenBSD ] && _man() { - local cur i prev sect manpath manext mansect uname + local cur i prev sect manpath manext mansect uname version subcommands manext="@([0-9lnp]|[0-9][px]|man|3pm)?(.@(gz|bz2|lzma))" mansect="@([0-9lnp]|[0-9][px]|3pm)" @@ -16,6 +16,7 @@ _man() COMPREPLY=() cur=`_get_cword` prev=${COMP_WORDS[COMP_CWORD-1]} + version=$(man --version | cut -d\ -f2) if [[ "$prev" == -l ]]; then _filedir $manext @@ -52,6 +53,19 @@ _man() manpath="${manpath//://*man$sect/ } ${manpath//://*cat$sect/ }" fi + # Check whether $prev has "subcommand" manpages -- not always right! (try man hg ssh, then $ hg ssh) + # Unfortunately, there's no way to check whether a completion is a valid subcommand or not. + # man cmd subcmd is only supported from man-db 2.5.6 + if ([ ${version:0:1} -eq 2 ] && [ ${version:2:1} -eq 5 ] && [ ${version:4:1} -gt 5 ]) || + ([ ${version:0:1} -eq 2 ] && [ ${version:2:1} -gt 5 ]) || + [ ${version:0:1} -gt 2 ]; then + subcommands=$(whatis -w "$prev-*" | awk '{print $1}' | sed -e "s/$prev-//g" | tr "\n" " ") + if [ -n "$subcommands" ]; then + COMPREPLY=( $( compgen -W "$subcommands" -- $cur ) ) + return 0 + fi + fi + # redirect stderr for when path doesn't exist COMPREPLY=( $( eval command ls "$manpath" 2>/dev/null ) ) # weed out directory path names and paths to man pages