summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--Completion/Unix/Command/_mkdir25
2 files changed, 15 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 4af9acfe1..9ccfc461b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2017-09-04  Daniel Shahaf  <d.s@daniel.shahaf.name>
 
+	* 41621: Completion/Unix/Command/_mkdir: Honour the 'command'
+	and 'builtin' precommand modifiers.
+
 	* 41620 (tweaked per 41622): Completion/Unix/Command/_mkdir:
 	Don't offer a linux-specific option in the 'zsh' variant.
 
diff --git a/Completion/Unix/Command/_mkdir b/Completion/Unix/Command/_mkdir
index afa9cc1f8..2850b405d 100644
--- a/Completion/Unix/Command/_mkdir
+++ b/Completion/Unix/Command/_mkdir
@@ -9,22 +9,21 @@ args=(
   '(-)*: :->directories'
 )
 
-_pick_variant -r variant gnu=gnu zsh='\(eval\)' $OSTYPE --help
 # It can still happen that there is a precommand command or builtin in the line.
 # In such cases, the variant has to be modified suitably, after further checking
 # the variant of the _command_ mkdir.
-
-# I currently don't know of any way to find out what precommands are present on
-# the line. The variant should be modified like this once a way is found out:
-
-# if [[ $variant == zsh ]]; then
-#   if [[ $precommand = *command* ]]; then
-#     _mkdir_command () { command mkdir "$@" }
-#     _pick_variant -c _mkdir_command -r variant gnu=gnu unix --help
-#   fi
-# elif [[ $precommand = *builtin* ]]; then
-#   variant=zsh
-# fi
+# 
+# $precommands is defined in _main_complete
+if (( ${+precommands[(r)command]} )); then
+  _mkdir_command () { command mkdir "$@" }
+  _pick_variant -c _mkdir_command -r variant gnu=gnu unix --help
+  unfunction _mkdir_command
+elif (( ${+precommands[(r)builtin]} )) || (( ${+builtins[mkdir]} )) || [[ "$(type -w mkdir)" == "*: builtin" ]]; then
+  variant=zsh
+else
+  _pick_variant -r variant gnu=gnu zsh='\(eval\)' $OSTYPE --help
+fi
+# Now $variant is set.
 
 case $variant in
   gnu|freebsd*|dragonfly*)