2010-09-18 10:18:26 +08:00
function __fish_complete_man
2016-11-27 21:27:22 -08:00
# Try to guess what section to search in. If we don't know, we
2017-03-18 21:55:02 -07:00
# use [^)]*, which should match any section.
set -l section ""
set -l token ( commandline -ct )
set -l prev ( commandline -poc )
2016-11-27 21:27:22 -08:00
set -e prev [ 1 ]
while set -q prev [ 1 ]
switch $prev [ 1 ]
case '-**'
2010-09-18 10:18:26 +08:00
2016-11-27 21:27:22 -08:00
case '*'
set section $prev [ 1 ]
end
set -e prev [ 1 ]
end
2016-05-29 14:31:12 +02:00
set section $section "[^)]*"
# If we don't have a token but a section, list all pages for that section.
# Don't do it for all sections because that would be overwhelming.
if test -z " $token " -a " $section " != "[^)]*"
set token "."
end
2006-02-15 12:22:28 +10:00
2016-11-27 21:27:22 -08:00
if test -n " $token "
# Do the actual search
apropos $token ^ /dev/null | awk '
2017-01-26 20:00:43 -08:00
BEGIN { FS = "[\t ]- " ; OFS = "\t" ; }
# BSD/Darwin
/^ [ ^ ( \t ] +\( '$section' \) / {
split ( $1 , pages, ", " ) ;
for ( i in pages) {
page = pages[ i] ;
sub ( /[ \t ] +/, "" , page) ;
paren = index( page , "(" ) ;
name = substr( page , 1 , paren - 1 ) ;
sect = substr( page , paren + 1 , length( page ) - paren - 1 ) ;
print name, sect ": " $2 ;
}
}
# man-db
/^ [ ^ ( \t ] + +\( '$section' \) / {
split ( $1 , t, " " ) ;
sect = substr( t [ 2 ] , 2 , length( t [ 2 ] ) - 2 ) ;
print t[ 1 ] , sect ": " $2 ;
}
# man-db RHEL 5 with [aliases]
/^ [ ^ ( \t ] + +\[ .*\] +\( '$section' \) / {
split ( $1 , t, " " ) ;
sect = substr( t [ 3 ] , 2 , length( t [ 3 ] ) - 2 ) ;
print t[ 1 ] , sect ": " $2 ;
}
# Solaris 11
# Does not display descriptions
# Solaris apropos outputs embedded backspace in descriptions
/^ [ 0 - 9 ] +\. [ ^ ( \t ] *\( '$section' \) / {
split ( $1 , t, " " )
paren = index( t [ 2 ] , "(" ) ;
name = substr( t [ 2 ] , 1 , paren - 1 ) ;
sect = substr( t [ 2 ] , paren + 1 , length( t [ 2 ] ) - paren - 1 ) ;
print name, sect
}
'
2017-01-25 15:34:59 +01:00
# Fish commands are not given by apropos
set -l files $__fish_datadir /man/man1/*.1
2017-03-18 21:55:02 -07:00
string replace -r '.*/([^/]+)\.1$' '$1\t1: fish command' -- $files
2016-05-29 14:31:12 +02:00
else
return 1
2016-11-27 21:27:22 -08:00
end
2016-05-29 14:31:12 +02:00
return 0
2006-02-15 12:22:28 +10:00
end