about summary refs log tree commit diff
path: root/Completion/Commands
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-10-26 15:36:10 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-10-26 15:36:10 +0000
commite0b26186f1d3c1a3a580eb7e8a8199c25536f4e6 (patch)
treee4247c2507fa1a135740a3cd02e7405cbdbfa69a /Completion/Commands
parent56f338eb8bfd4bcdbf14b495ff8a34425c3527d4 (diff)
downloadzsh-e0b26186f1d3c1a3a580eb7e8a8199c25536f4e6.tar.gz
zsh-e0b26186f1d3c1a3a580eb7e8a8199c25536f4e6.tar.xz
zsh-e0b26186f1d3c1a3a580eb7e8a8199c25536f4e6.zip
manual/8424
Diffstat (limited to 'Completion/Commands')
-rw-r--r--Completion/Commands/_bash_completions2
-rw-r--r--Completion/Commands/_history_complete_word123
-rw-r--r--Completion/Commands/_read_comp8
3 files changed, 105 insertions, 28 deletions
diff --git a/Completion/Commands/_bash_completions b/Completion/Commands/_bash_completions
index 5f3adc1e0..ee663fc30 100644
--- a/Completion/Commands/_bash_completions
+++ b/Completion/Commands/_bash_completions
@@ -30,7 +30,7 @@ local key=$KEYS[-1]
 case $key in
   '!') _main_complete _command_names
        ;;
-  '$') compgen -E
+  '$') compadd - "${(@k)parameters[(R)*export*]}"
        ;;
   '@') _main_complete _hosts
        ;;
diff --git a/Completion/Commands/_history_complete_word b/Completion/Commands/_history_complete_word
index f459046d2..1112339af 100644
--- a/Completion/Commands/_history_complete_word
+++ b/Completion/Commands/_history_complete_word
@@ -1,31 +1,108 @@
-#compdef -k complete-word \e/
+#compdef -K _history-complete-older complete-word \e/ _history-complete-newer complete-word \e,
+#
+# Complete words from the history
+#
+# by Adam Spiers, with help gratefully received from
+# Sven Wischnowsky and Bart Schaefer
+#
+# Available configuration keys:
+#
+#   history_list -- display lists of available matches
+#   history_stop -- prevent looping at beginning and end of matches
+#                   during menu-completion
+#   history_sort -- sort matches lexically (default is to sort by age)
+#   history_remove_all_dups --
+#                   remove /all/ duplicate matches rather than just
+#                   consecutives
+#
 
-local expl
+_history_complete_word () {
+  local expl direction
 
-if [[ -n "$compstate[old_list]" && -n "$compconfig[history_stop]" ]]; then
-  if [[ -z "$_hist_menu_end" &&
-        compstate[old_insert] -lt _hist_menu_length ]]; then
-    compstate[old_list]=keep
-    compstate[insert]=$((compstate[old_insert]+1))
+  if [[ $WIDGET = *newer ]]; then
+    direction=older
   else
-    _hist_menu_end=yes
-    if [[ "$compconfig[history_stop]" = verbose ]]; then
-      _message 'end of history reached'
-    else
-      compstate[old_list]=keep
-      compstate[insert]=_hist_menu_length
+    direction=newer
+  fi
+
+  [[ -z "$compconfig[history_list]" ]] && compstate[list]=''
+
+  if [[ -n "$compstate[old_list]" &&
+    ( -n "$compconfig[history_stop]" || "$compstate[insert]" = menu ) ]]; then
+    # array of matches is newest -> oldest (reverse of history order)
+    if [[ "$direction" == 'older' ]]; then
+      if [[ compstate[old_insert] -eq $_hist_menu_length ||
+            "$_hist_stop" == 'oldest' ]]; then
+        _hist_stop='oldest'
+        [[ "$compconfig[history_stop]" = verbose ]] &&
+          _message 'beginning of history reached'
+      elif [[ "$_hist_stop" == 'newest' ]]; then
+        zle -Rc
+        _history_complete_word_gen_matches
+      else
+        compstate[old_list]=keep
+        (( compstate[insert] = compstate[old_insert] + 1 ))
+      fi
+    elif [[ "$direction" == 'newer' ]]; then
+      if [[ compstate[old_insert] -eq 1 || "$_hist_stop" == 'newest' ]]; then
+        _hist_stop='newest'
+        [[ "$compconfig[history_stop]" = verbose ]] &&
+          _message 'end of history reached'
+      elif [[ "$_hist_stop" == 'oldest' ]]; then
+        zle -Rc
+        _history_complete_word_gen_matches
+      else
+        compstate[old_list]=keep
+        (( compstate[insert] = compstate[old_insert] - 1 ))
+      fi
     fi
+  else
+    _hist_stop=''
+    _hist_old_prefix="$PREFIX"
+    _history_complete_word_gen_matches
   fi
-else
-  if [[ -n "$compconfig[history_sort]" ]]; then
-    _description expl 'history word'
+
+  [[ -n "$compstate[nmatches]" ]]
+}
+
+_history_complete_word_gen_matches () {
+  if [[ -n "$compconfig[history_list]" ]]; then
+    if [[ -n "$compconfig[history_sort]" ]]; then
+      _description expl 'history word'
+    else
+      _description -V expl 'history word'
+    fi
   else
-    _description -V expl 'history word'
+    if [[ -n "$compconfig[history_sort]" ]]; then
+      expl=()
+    else
+      expl=('-V' '')
+    fi
   fi
-  compgen "$expl[@]" -Q -H 0 ''
-  if [[ -n "$compconfig[history_stop]" ]]; then
-    compstate[insert]=1
-    _hist_menu_length="$compstate[nmatches]"
-    _hist_menu_end=''
+
+  [[ -n "$_hist_stop" ]] && PREFIX="$_hist_old_prefix"
+
+  local rem_dups
+  if [[ -n "$compconfig[history_remove_all_dups]" ]]; then
+    rem_dups=''
+  else
+    rem_dups='-1'
   fi
-fi
+
+  compadd "$expl[@]" $rem_dups -Q - "${(@)historywords:#[\$'\"]*}"
+
+  _hist_menu_length="$compstate[nmatches]"
+
+  case "$direction" in 
+    newer)  compstate[insert]=$_hist_menu_length
+	    [[ -n "$_hist_stop" ]] && (( compstate[insert]-- ))
+            ;;
+    older)  compstate[insert]=1
+	    [[ -n "$_hist_stop" ]] && (( compstate[insert]++ ))
+            ;;
+  esac
+
+  [[ -n "$_hist_stop" ]] && _hist_stop=''
+}
+
+_history_complete_word "$@"
diff --git a/Completion/Commands/_read_comp b/Completion/Commands/_read_comp
index a32879b56..8a46d8af2 100644
--- a/Completion/Commands/_read_comp
+++ b/Completion/Commands/_read_comp
@@ -6,9 +6,9 @@
 # evaluate to generate the completions; unambiguous strings in the function
 # name are automatically completed.
 #
-# Else it is taken to be a set of arguments for compgen to generate a list
+# Else it is taken to be a set of arguments for compadd to generate a list
 # of choices.  The possibilities are the same as the flags for generating
-# completions given in the zshcompctl manual page.  Note the arguments are
+# completions given in the zshcompwid manual page.  Note the arguments are
 # verbatim:  include minus signs, spaces, quotes, etc.
 #
 # On subsequent calls, the same completion will be re-performed.  To
@@ -37,7 +37,7 @@ if [[ compstate[matcher] -gt 1 ||
   if [[ $_read_comp = _* ]]; then
     eval $_read_comp
   else
-    eval "compgen $_read_comp"
+    eval "compadd $_read_comp"
   fi
   return
 fi
@@ -154,5 +154,5 @@ zle -cR ''
 if [[ $str = _* ]]; then
   eval $str
 else
-  eval "compgen $str"
+  eval "compadd $str"
 fi