summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>2000-03-13 10:26:17 +0000
committerTanaka Akira <akr@users.sourceforge.net>2000-03-13 10:26:17 +0000
commit14bf99e4eed324b0d2c8563f63b07fc1a3b73d57 (patch)
tree1f1b9d9ccee4c2d5cac7cf5d2e2761d3e2b7f8ca
parent1f6af8de8cf9da8ee8d193a94c144b3541f713cf (diff)
downloadzsh-14bf99e4eed324b0d2c8563f63b07fc1a3b73d57.tar.gz
zsh-14bf99e4eed324b0d2c8563f63b07fc1a3b73d57.zip
Initial revision
-rw-r--r--Completion/Commands/_next_tags70
1 files changed, 70 insertions, 0 deletions
diff --git a/Completion/Commands/_next_tags b/Completion/Commands/_next_tags
new file mode 100644
index 000000000..8bd3f5921
--- /dev/null
+++ b/Completion/Commands/_next_tags
@@ -0,0 +1,70 @@
+#compdef -k complete-word \C-xn
+
+# Main widget/completer.
+
+_next_tags() {
+
+ if [[ $#funcstack -gt 1 ]]; then
+
+ # Called as completer, probably `remove' our helper function. A better
+ # test would be nice, but I think one should still be able to edit the
+ # current word between attempts to complete it.
+
+ [[ $_next_tags_pre != ${LBUFFER%${PREFIX}} ]] && unset _sort_tags
+
+ return 1
+ else
+ local comp
+
+ if [[ -z $compstate[old_list] ]]; then
+ comp=()
+ else
+ comp=(_next_tags _complete)
+ fi
+
+ (( $+_sort_tags )) || _next_tags_not=
+
+ _sort_tags=_next_tags_sort
+ _next_tags_pre="${LBUFFER%${PREFIX}}"
+ _next_tags_not="$_next_tags_not $_lastcomp[tags]"
+
+ _main_complete "$comp[@]"
+
+ [[ $compstate[insert] = automenu ]] &&
+ compstate[insert]=automenu-unambiguous
+
+ compstate[insert]=''
+ compstate[list]='list force'
+ fi
+}
+
+# Helper function for sorting tags. Most of this is copied from _tags.
+
+_next_tags_sort() {
+ local order tags tag nodef
+
+ zstyle -a ":completion:${curcontext}:" tag-order order ||
+ order=( 'arguments values' options globbed-files directories all-files )
+
+ # But we also remove the tags we've already tried...
+
+ tags=( "${(@)order:#(${(j:|:)~${=_next_tags_not}})}" )
+
+ # ... unless that would remove all offered tags.
+
+ [[ $#tags -ne $#order && "$tags" != *(${(j:|:)~argv})* ]] &&
+ tags=( $order ) _next_tags_not=
+
+ for tag in $tags; do
+ case $tag in
+ -) nodef=yes;;
+ *\(\)) "${${tag%%[ ]#\(\)}##[ ]#}" "$@";;
+ \!*) comptry "${(@)argv:#(${(j:|:)~${=tag[2,-1]}})}";;
+ ?*) comptry ${=tag};;
+ esac
+ done
+
+ [[ -z "$nodef" ]] && comptry "$@"
+}
+
+[[ -o kshautoload ]] || _next_tags "$@"