From 7571f04c03734923d61623565bdf0855c3ccfea0 Mon Sep 17 00:00:00 2001 From: Sven Wischnowsky Date: Thu, 21 Jun 2001 12:53:55 +0000 Subject: improve pattern matching to make match specs work for manual page completion (15029) --- ChangeLog | 5 +++ Completion/Unix/Command/_man | 105 ++++++++++++++++++++++++------------------- 2 files changed, 65 insertions(+), 45 deletions(-) diff --git a/ChangeLog b/ChangeLog index fd954ba26..3f6417747 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2001-06-21 Sven Wischnowsky + + * 15029: Completion/Unix/Command/_man: improve pattern matching + to make match specs work for manual page completion + 2001-06-21 Bart Schaefer * 15023, 15027: Src/parse.c: Accept newlines before the "in" diff --git a/Completion/Unix/Command/_man b/Completion/Unix/Command/_man index 26f41b606..24bcf7d38 100644 --- a/Completion/Unix/Command/_man +++ b/Completion/Unix/Command/_man @@ -1,47 +1,62 @@ #compdef man apropos whatis -local rep expl star approx mrd - -if [[ $service == man ]] && (( $words[(I)-l] + $words[(I)--local-file] )); then - _files || return 0 -fi - -if [[ $compstate[pattern_match] != [^*] ]]; then - # If a string other than *, we just want correction, so no `*'. - star='*' -fi - -if [[ -n $_comp_correct ]]; then - # If this is set, we are correcting with this many approximations. - approx="(#a${_comp_correct})" -fi - -if (( ! $#manpath )); then - local mp - mp=($(manpath 2>/dev/null)) - [[ "$mp" == *:* ]] && mp=( ${(s.:.)mp} ) - manpath=( $mp ) -fi - -(( $#manpath )) || manpath=( ${(s.:.)$(manpath 2>/dev/null)} ) || - manpath=( /usr/man(-/) /(opt|usr)/(dt|share|X11R6|local)/(cat|)man(-/) ) - -# `sman' is the SGML manual directory for Solaris 7. -# 1M is system administrator commands on SVR4 - -mrd=(${^manpath/\%L/${LANG:-En_US.ASCII}}/mandb(N)) -if [[ $words[2] = (<->*|1M|l|n) ]]; then - rep=( - $manpath/(sman|man|cat)${words[2]}/${~approx}$PREFIX${~star}$SUFFIX.*(:t) ) - (($#mrd)) && rep[$#rep+1]=($(awk "\$2 == \"$words[2]\" {print \$1}" $mrd)) -else - rep=( $manpath/(sman|man|cat)*/${~approx}$PREFIX${~star}$SUFFIX.*(:t) ) - (($#mrd)) && rep[$#rep+1]=($(awk '{print $1}' $mrd)) -fi - - -# Remove any compression suffix, then remove the minimum possible string -# beginning with .<->: that handles problem cases like files called -# `POSIX.1.5'. -(( $#rep )) && _wanted manuals expl 'manual page' \ - compadd - ${${rep%%.(bz2|z|gz|Z)}%.<->*} +_man() { + local dirs expl mrd awk + + if [[ $service == man ]] && (( $words[(I)-l] + $words[(I)--local-file] )); then + _files || return 0 + fi + + if (( ! $#manpath )); then + local mp + mp=($(manpath 2>/dev/null)) + [[ "$mp" == *:* ]] && mp=( ${(s.:.)mp} ) + manpath=( $mp ) + fi + + (( $#manpath )) || manpath=( ${(s.:.)$(manpath 2>/dev/null)} ) || + manpath=( /usr/man(-/) /(opt|usr)/(dt|share|X11R6|local)/(cat|)man(-/) ) + + # `sman' is the SGML manual directory for Solaris 7. + # 1M is system administrator commands on SVR4 + + mrd=(${^manpath/\%L/${LANG:-En_US.ASCII}}/mandb(N)) + + if [[ $words[2] = (<->*|1M|l|n) ]]; then + dirs=( $^manpath/(sman|man|cat)${words[2]}/ ) + awk="\$2 == \"$words[2]\" {print \$1}" + else + dirs=( $^manpath/(sman|man|cat)*/ ) + awk='{print $1}' + fi + + _wanted manuals expl 'manual page' _man_pages +} + +_man_pages() { + local matcher pages dummy + + zparseopts -E M+:=matcher + + if (( $#matcher )); then + matcher=( ${matcher:#-M} ) + matcher="$matcher" + else + matcher= + fi + + pages=( $dirs ) + compfiles -p pages '' '' "$matcher" '' dummy '*' + + pages=( $~pages(:t:r) ) + + (($#mrd)) && pages[$#pages+1]=($(awk $awk $mrd)) + + # Remove any compression suffix, then remove the minimum possible string + # beginning with .<->: that handles problem cases like files called + # `POSIX.1.5'. + + compadd "$@" - ${pages%.<->*} +} + +_man "$@" -- cgit 1.4.1