summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Wischnowsky <wischnow@users.sourceforge.net>2001-06-21 12:53:55 +0000
committerSven Wischnowsky <wischnow@users.sourceforge.net>2001-06-21 12:53:55 +0000
commit7571f04c03734923d61623565bdf0855c3ccfea0 (patch)
tree2dc50fd9c66283a12b52b0f1392336c4fd1835d7
parente25f86419eaae347d49728542d405972d44921fa (diff)
downloadzsh-7571f04c03734923d61623565bdf0855c3ccfea0.tar.gz
zsh-7571f04c03734923d61623565bdf0855c3ccfea0.zip
improve pattern matching to make match specs work for manual page completion (15029)
-rw-r--r--ChangeLog5
-rw-r--r--Completion/Unix/Command/_man105
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 <wischnow@zsh.org>
+
+ * 15029: Completion/Unix/Command/_man: improve pattern matching
+ to make match specs work for manual page completion
+
2001-06-21 Bart Schaefer <schaefer@zsh.org>
* 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 "$@"