From 0c4dab54f1544dff96c0e2d01f4c661e07f7fa49 Mon Sep 17 00:00:00 2001
From: David Adam <zanchey@ucc.gu.uwa.edu.au>
Date: Wed, 27 Nov 2013 17:58:43 +0800
Subject: [PATCH] __fish_complete_man: Use awk to parse output of apropos

Closes #960.

Uses pattern matching rather than OS detection. Works with BSD awk, GNU
awk and Solaris' nawk.
---
 share/functions/__fish_complete_man.fish | 28 +++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/share/functions/__fish_complete_man.fish b/share/functions/__fish_complete_man.fish
index a5e4fa40f..59c8c24eb 100644
--- a/share/functions/__fish_complete_man.fish
+++ b/share/functions/__fish_complete_man.fish
@@ -21,7 +21,33 @@ function __fish_complete_man
 		set section $section"[^)]*"
 
 		# Do the actual search
-		apropos (commandline -ct) ^/dev/null | sgrep \^(commandline -ct) | sed -n -e 's/\([^ ]*\).*(\('$section'\)) *- */\1'\t'\2: /p'
+		apropos (commandline -ct) ^/dev/null | awk '
+		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;
+		  }
+		}
+		# Linux
+		/^[^( \t]+ \('$section'\)/ {
+		  split($1, t, " ");
+		  sect = substr(t[2], 2, length(t[2]) - 2);
+		  print t[1], sect ": " $2;
+		}
+		# Solaris
+		/^[^( \t]+\t+[^\(\t]/ {
+		  split($1, t, " ");
+		  sect = substr(t[3], 2, length(t[3]) - 2);
+		  print t[2], sect ": " $2;
+		}
+		'
 	end
 end