about summary refs log tree commit diff
path: root/Completion
diff options
context:
space:
mode:
Diffstat (limited to 'Completion')
-rw-r--r--Completion/Core/_main_complete5
-rw-r--r--Completion/Core/_prefix23
2 files changed, 28 insertions, 0 deletions
diff --git a/Completion/Core/_main_complete b/Completion/Core/_main_complete
index ebe256588..a6714cea6 100644
--- a/Completion/Core/_main_complete
+++ b/Completion/Core/_main_complete
@@ -20,6 +20,7 @@ setopt localoptions nullglob rcexpandparam extendedglob
 unsetopt markdirs globsubst shwordsplit nounset ksharrays
 
 local comp post ret=1 _compskip _prio_num=1 format _comp_ignore \
+      _completers _completers_left \
       context state line opt_args val_args curcontext="$curcontext" \
       _last_nmatches=-1 _last_menu_style _def_menu_style _menu_style sel \
       _saved_exact="${compstate[exact]}" \
@@ -63,11 +64,15 @@ fi
 
 # And now just call the completer functions defined.
 
+_completers=( "$@" )
+_completers_left=( "$@" )
+
 for comp; do
   if "$comp"; then
     ret=0
     break;
   fi
+  shift 1 _completers_left
 done
 
 if (( $compstate[nmatches] )); then
diff --git a/Completion/Core/_prefix b/Completion/Core/_prefix
new file mode 100644
index 000000000..6306b4aa0
--- /dev/null
+++ b/Completion/Core/_prefix
@@ -0,0 +1,23 @@
+#autoload
+
+# Try to ignore the suffix. A bit like e-o-c-prefix.
+
+[[ -n "$SUFFIX" ]] || return 1
+
+local curcontext="${curcontext/:[^:]#:/:prefix:}" comp i
+
+zstyle -a ":completion:${curcontext}:" completer comp ||
+  comp=( "${(@)_completers[1,-${#_completers_left}-1][(R)_prefix,-1]}" )
+
+if zstyle -t ":completion:${curcontext}:" add-space; then
+  ISUFFIX=" $SUFFIX"
+else
+  ISUFFIX="$SUFFIX"
+fi
+SUFFIX=''
+
+for i in "$comp[@]"; do
+  [[ "$i" != _prefix ]] && "$i" && return 0
+done
+
+return 1