about summary refs log tree commit diff
path: root/Doc/Zsh
diff options
context:
space:
mode:
authorMarlon Richert <marlon.richert@gmail.com>2023-05-18 23:44:54 +0300
committerOliver Kiddle <opk@zsh.org>2023-05-21 03:05:20 +0200
commitbb441f77a70bf7b5f13ab8f9113ba9b7a1593479 (patch)
tree517c9c0fd7ec9e64b2dfdcde7921b95d20993301 /Doc/Zsh
parenta95198e268ec1d432c37afc8dc4f8839acc0c8d0 (diff)
downloadzsh-bb441f77a70bf7b5f13ab8f9113ba9b7a1593479.tar.gz
zsh-bb441f77a70bf7b5f13ab8f9113ba9b7a1593479.tar.xz
zsh-bb441f77a70bf7b5f13ab8f9113ba9b7a1593479.zip
51758: Make dynamic dir completion easier to implement
Diffstat (limited to 'Doc/Zsh')
-rw-r--r--Doc/Zsh/expn.yo44
1 files changed, 17 insertions, 27 deletions
diff --git a/Doc/Zsh/expn.yo b/Doc/Zsh/expn.yo
index 19f5909ea..6f86d0c54 100644
--- a/Doc/Zsh/expn.yo
+++ b/Doc/Zsh/expn.yo
@@ -2066,34 +2066,24 @@ tt(/home/pws/perforce).  In this simple case a static name for the
 directory would be just as effective.
 
 example(zsh_directory_name+LPAR()RPAR() {
-  emulate -L zsh
-  setopt extendedglob
+  emulate -L zsh -o extendedglob
   local -a match mbegin mend
-  if [[ $1 = d ]]; then
-    # turn the directory into a name
-    if [[ $2 = (#b)(/home/pws/perforce/)([^/]##)* ]]; then
-      typeset -ga reply
-      reply=(p:$match[2] $(( ${#match[1]} + ${#match[2]} )) )
-    else
-      return 1
-    fi
-  elif [[ $1 = n ]]; then
-    # turn the name into a directory
-    [[ $2 != (#b)p:(?*) ]] && return 1
-    typeset -ga reply
-    reply=(/home/pws/perforce/$match[1])
-  elif [[ $1 = c ]]; then
-    # complete names
-    local expl
-    local -a dirs
-    dirs=(/home/pws/perforce/*(/:t))
-    dirs=(p:${^dirs})
-    _wanted dynamic-dirs expl 'dynamic directory' compadd -S\] -a dirs
-    return
-  else
-    return 1
-  fi
-  return 0
+  local base=/home/pws/perforce
+  case $1 in
+  ( d )  # Turn the directory into a name.
+    [[ $2 == (#b)($base/)([^/]##)* ]] &&
+        reply=( p:$match[2] $(( $#match[1] + $#match[2] )) )
+  ;;
+  ( n )  # Turn the name into a directory.
+    [[ $2 == (#b)p:(?*) ]] &&
+        reply=( $base/$match[1] )
+  ;;
+  ( c )  # Complete names.
+    local -a dirs=( $base/*(/:t) )
+    # Completion system populates $expl with flags for compadd.
+    compadd "$expl[@]" p:$^dirs
+  ;;
+  esac
 })
 
 texinode(Static named directories)(`=' expansion)(Dynamic named directories)(Filename Expansion)