mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			151 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #compdef man apropos whatis
 | |
| 
 | |
| _man() {
 | |
|   local dirs expl mrd awk
 | |
| 
 | |
|   if (( $words[(I)-M] == (( $CURRENT - 1 )) )); then
 | |
|     _directories && return 0
 | |
|   fi
 | |
| 
 | |
|   if [[ $service == man ]] && (( $words[(I)-l] + $words[(I)--local-file] )); then
 | |
|     _files || return 0
 | |
|   fi
 | |
| 
 | |
|   if (( ! $#_manpath )); then
 | |
|     local mp
 | |
|     mp=( ${(s.:.)$(manpath 2>/dev/null)} )
 | |
|     [[ "$mp" == *:* ]] && mp=( ${(s.:.)mp} )
 | |
|     if (( $#mp )); then
 | |
|       _manpath=( $mp )
 | |
|     elif (( $#manpath )); then
 | |
|       _manpath=( $manpath )
 | |
|     fi
 | |
|   fi
 | |
| 
 | |
|   (( $#_manpath )) ||
 | |
|       _manpath=( /usr/man(-/) /(opt|usr)/(pkg|dt|share|X11R6|local)/(cat|)man(-/) )
 | |
| 
 | |
|   integer index=$words[(I)-M]
 | |
|   if (( index )); then
 | |
|     local opt
 | |
|     opt=$words[index+1]
 | |
|     _manpath=($opt)
 | |
|   fi
 | |
| 
 | |
|   # `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))
 | |
| 
 | |
|   # $sect is from the command line, the "3p" in "man 3p memcpy".
 | |
|   #   It may also be a |-joined (and later in the code "()"-enclosed) list of
 | |
|   #   section names.
 | |
|   #   TODO: disentangle this to always be an array.
 | |
|   # $sect_dirname is from the filesystem, the "3" in "/usr/share/man/man3"
 | |
|   # These are used by _man_pages
 | |
|   local sect sect_dirname
 | |
|   if [[ $OSTYPE = solaris* ]]; then
 | |
|     sect=${${words[(R)-s*]#-s}:-$words[$words[(i)-s]+1]}
 | |
|     sect="${sect//,/|}"
 | |
|   elif [[ -n ${sect:=$words[$words[(i)-S]+1]} || -n ${sect:=$MANSECT} ]]; then
 | |
|     sect="${sect//:/|}"
 | |
|     sect="${sect//,/|}"
 | |
|   elif (( CURRENT > 2 )); then
 | |
|     case $words[2] in
 | |
|       (-a) sect='*';;
 | |
|       (-*) ;;
 | |
|       (*)  sect=$words[2];;
 | |
|     esac
 | |
|   fi
 | |
| 
 | |
|   if [[ $sect = (<->*|1M|l|n) || $sect = *\|* ]]; then
 | |
|     () {
 | |
|       local -a sects=( ${(s.|.)sect} )
 | |
|       if [[ $sect != (l|n) ]]; then
 | |
|         sects=( ${sects%%[^0-9]#} )
 | |
|       fi
 | |
|       dirs=( $^_manpath/(sman|man|cat)${^sects}*/ )
 | |
|     }
 | |
|     if [[ $sect == *\|* ]]; then sect="($sect)"; fi
 | |
|     awk="\$2 == \"$sect\" {print \$1}"
 | |
|   else
 | |
|     dirs=( $^_manpath/(sman|man|cat)*/ )
 | |
|     awk='{print $1}'
 | |
|   fi
 | |
|   # Solaris 11 and on have a man-index directory that doesn't contain manpages
 | |
|   dirs=( ${dirs:#*/man-index/} )
 | |
|   if [[ $OSTYPE = solaris* && ( $words[CURRENT] = -s* || $words[CURRENT-1] == -s ) ]]; then
 | |
|     [[ $words[CURRENT] = -s* ]] && compset -P '-s'
 | |
|     sects=( ${(o)${dirs##*(man|cat)}%/} )
 | |
|     _wanted sections expl 'section' compadd -a sects
 | |
|   elif zstyle -t ":completion:${curcontext}:manuals" separate-sections; then
 | |
|     typeset -U sects
 | |
|     local ret=1
 | |
| 
 | |
|     sects=( ${(o)${dirs##*(man|cat)}%/} )
 | |
| 
 | |
|     (( $#sects )) || return 1
 | |
| 
 | |
|     _tags manuals.${^sects}
 | |
|     while _tags; do
 | |
|       for sect_dirname in $sects; do
 | |
|         _requested manuals.$sect_dirname expl "manual page, section $sect_dirname" _man_pages &&
 | |
|             ret=0
 | |
|       done
 | |
|       (( ret )) || return 0
 | |
|     done
 | |
|     ## To fall back to other sections' manpages when completing filenames, like
 | |
|     ## the 'else' codepath does:
 | |
|     #
 | |
|     # if (( ret )) && [[ $PREFIX$SUFFIX == */* ]]; then
 | |
|     #   sect_dirname=
 | |
|     #   _wanted manuals expl 'manual page' _man_pages && return
 | |
|     # fi
 | |
| 
 | |
|     return 1
 | |
|   else
 | |
|     sect_dirname=
 | |
|     _wanted manuals expl 'manual page' _man_pages
 | |
|   fi
 | |
| }
 | |
| 
 | |
| _man_pages() {
 | |
|   local pages sopt
 | |
| 
 | |
|   # What files corresponding to manual pages can end in.
 | |
|   local suf='.((?|<->*)(|.gz|.bz2|.Z|.lzma))'
 | |
| 
 | |
|   if [[ $PREFIX$SUFFIX = */* ]]; then
 | |
|     # Easy way to test for versions of man that allow file names.
 | |
|     # This can't be a normal man page reference.
 | |
|     # Try to complete by glob first.
 | |
|     if [[ -n $sect_dirname ]]; then
 | |
|       _path_files -g "*.*$sect_dirname*(|.gz|.bz2|.Z|.lzma)" "$expl[@]"
 | |
|     else
 | |
|       _path_files -g "*$suf" "$expl[@]" && return
 | |
|       _path_files "$expl[@]"
 | |
|     fi
 | |
|     return $?
 | |
|   fi
 | |
| 
 | |
|   pages=( ${(M)dirs:#*$sect_dirname/} )
 | |
|   pages=( ${^pages}/"*$sect${sect:+"*"}" );
 | |
|   pages=( ${^~pages}(N:t) )
 | |
| 
 | |
|   (($#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'.
 | |
| 
 | |
|   [[ $OSTYPE = solaris* ]] && sopt='-s '
 | |
|   if ((CURRENT > 2)) ||
 | |
|       ! zstyle -t ":completion:${curcontext}:manuals.$sect_dirname" insert-sections
 | |
|   then
 | |
|     compadd "$@" - ${pages%$~suf}
 | |
|   else
 | |
|     compadd "$@" -P "$sopt$sect_dirname " - ${pages%$~suf}
 | |
|   fi
 | |
| }
 | |
| 
 | |
| _man "$@"
 |