about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@zsh.org>2022-05-22 15:50:45 -0700
committerBart Schaefer <schaefer@zsh.org>2022-05-22 15:50:45 -0700
commit1e52cd968d7ffd9da3249ef01f6c41f8b29e4df3 (patch)
tree83a789d3a4d34bd3b6c2b4a8896b0680e949a7f4
parenta54d70457934662318feac9fcc750d2691250f33 (diff)
downloadzsh-1e52cd968d7ffd9da3249ef01f6c41f8b29e4df3.tar.gz
zsh-1e52cd968d7ffd9da3249ef01f6c41f8b29e4df3.tar.xz
zsh-1e52cd968d7ffd9da3249ef01f6c41f8b29e4df3.zip
50278: use `man -w` in preference to `manpath`; fix caching and precedence of -M
-rw-r--r--ChangeLog5
-rw-r--r--Completion/Unix/Command/_man45
2 files changed, 33 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 98e3089d5..b2cecc1a3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2022-05-22  Bart Schaefer  <schaefer@zsh.org>
+
+	* 50278: Completion/Unix/Command/_man: use `man -w` in preference
+	to `manpath` for portability; fix caching and precedence of -M
+
 2022-05-20  Arvid Norlander  <VorpalBlade@users.noreply.github.com>
 
 	* github #91: Completion/Unix/Command/_find: _find
diff --git a/Completion/Unix/Command/_man b/Completion/Unix/Command/_man
index dba1d13dc..190811e41 100644
--- a/Completion/Unix/Command/_man
+++ b/Completion/Unix/Command/_man
@@ -16,7 +16,7 @@
 _man() {
   local dirs expl mrd awk variant noinsert
   local -a context line state state_descr args modes
-  local -aU sects
+  local -aU sects _manpath
   local -A opt_args val_args sect_descs
 
   if [[ $service == man ]]; then
@@ -168,29 +168,40 @@ _man() {
   _arguments -s -S : $args '*::: :->man' && return 0
   [[ -n $state ]] || return 1
 
+  # Override man path
+  [[ -n ${opt_args[-M]} ]] &&
+  _manpath=( ${(s<:>)opt_args[-M]} )
+
+  # Restore cached man path to avoid $(manpath) if we can
   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 )
+    if (( ! $+_manpath_cache )); then
+      typeset -gHA _manpath_cache
     fi
+    if [[ -z $_manpath_cache[$MANPATH] ]]; then
+      local mp
+      mp=( ${(s.:.)$({ command man -w || manpath } 2>/dev/null)} )
+      [[ "$mp" == *:* ]] && mp=( ${(s.:.)mp} )
+      if (( $#mp )); then
+        _manpath_cache[$MANPATH]=${(j.:.)mp}
+      elif (( $#manpath )); then
+        _manpath_cache[$MANPATH]=$MANPATH
+      fi
+    fi
+    _manpath=( ${(s.:.)_manpath_cache[$MANPATH]} )
+  fi
+
+  # Augment man path
+  if [[ -n ${opt_args[-m]} ]]; then
+    [[ $variant == (netbsd|openbsd)* ]] &&
+    _manpath+=( ${(s<:>)opt_args[-m]} )
+  elif [[ $variant == aix* ]]; then
+    # _manpath declared -U so no need to test
+    _manpath+=( /usr/share/man )
   fi
 
   (( $#_manpath )) ||
       _manpath=( /usr/man(-/) /(opt|usr)/(pkg|dt|share|X11R6|local)/(cat|)man(-/) )
 
-  # Override man path
-  [[ -n ${opt_args[-M]} ]] &&
-  _manpath=( ${(s<:>)opt_args[-M]} )
-
-  # Augment man path
-  [[ $variant == (netbsd|openbsd)* ]] &&
-  [[ -n ${opt_args[-m]} ]] &&
-  _manpath+=( ${(s<:>)opt_args[-m]} )
-
   # `sman' is the SGML manual directory for Solaris 7.
   # 1M is system administrator commands on SVR4