Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: Re: Completing strings from history?



Bart Schaefer wrote:

> On Mar 27, 11:13am, Sven Wischnowsky wrote:
> } Subject: PATCH: Re: Completing strings from history?
> }
> } Ok, below is my first attempt at making _history_complete_words
> } smarter.  I didn't integrate Bart's changes, maybe that should be
> } done.
> } 
> } The behaviour is now to stop at the beginning/end once.  Going up or
> } down in the previously used direction will wrap around.
> 
> If it does that, then it's not necessary to integrate my changes; mine
> simply caused it to cycle without pausing.
> 
> } I hope with the style settings Bart and Adam reported the behaviour is 
> } now good enough...
> 
> I haven't tried it yet, but shouldn't there be some way to turn on menu
> behavior with a style rather than requiring `setopt menucomplete'?

I need comments from Adam about all the things I'm doing to his
function...

This patch changes things some more:

- the stop style is now boolean; if `true' it will make _h_c_w stop
  once before wrapping around, otherwise it wraps immediately, as in a 
  menu completion
- menu behaviour is now selected using the `menu' style or the options 
  (this is actually just an effect of looking at what _main_complete did)
- the list style is only used if it is set to `false'; then the list
  will not be shown, otherwise this is selected with the options as usual

The function now shows some kind of automatic automenu behaviour which 
seems to be sensible for this function (and doesn't get in the way
anyway, I think).

Plus this now uses the _history completer to do the work (that
contains code originally take from _h_c_w).


This is now almost a model of what could be possible with menu
completion implemented in shell code...

Bye
 Sven

Index: Completion/Commands/_history_complete_word
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Commands/_history_complete_word,v
retrieving revision 1.11
diff -u -r1.11 _history_complete_word
--- Completion/Commands/_history_complete_word	2001/03/27 09:14:52	1.11
+++ Completion/Commands/_history_complete_word	2001/03/28 12:13:21
@@ -7,9 +7,8 @@
 #
 # Available styles:
 #
-#   list --  display lists of available matches
-#   stop --  prevent looping at beginning and end of matches during
-#            menu-completion
+#   list --  avoid to display lists of available matches
+#   stop --  stop before looping at beginning and end of matches
 #   sort --  sort matches lexically (default is to sort by age)
 #   remove-all-dups --
 #            remove /all/ duplicate matches rather than just consecutives
@@ -19,7 +18,6 @@
   setopt localoptions ${_comp_options[@]}
 
   local expl direction stop curcontext="$curcontext"
-  local max slice hmax=$#historywords
 
   if [[ -z "$curcontext" ]]; then
     curcontext=history-words:::
@@ -33,26 +31,12 @@
     direction=older
   fi
 
-  zstyle -s ":completion:${curcontext}:history-words" stop stop
+  zstyle -t ":completion:${curcontext}:history-words" stop && stop=yes
 
-  zstyle -t ":completion:${curcontext}:history-words" list || compstate[list]=''
+  zstyle -T ":completion:${curcontext}:history-words" list || compstate[list]=''
 
-  if zstyle -s ":completion:${curcontext}:history-words" range max; then
-    if [[ $max = *:* ]]; then
-      slice=${max#*:}
-      max=${max%:*}
-    else
-      slice=$max
-    fi
-    [[ max -gt hmax ]] && max=$hmax
-  else
-    max=$hmax
-    slice=$max
-  fi
-
-  if [[ ( -n "$compstate[old_list]" ||
-          ( $LASTWIDGET = _history-complete-* && -n $_hist_stop ) ) &&
-        ( -n "$stop" || "$compstate[insert]" = menu ) ]]; then
+  if [[ $LASTWIDGET = _history-complete-* &&
+        ( -n "$compstate[old_list]" || -n $_hist_stop ) ]]; then
     if [[ "$direction" == older ]]; then
       if [[ $_hist_stop = new ]]; then
         PREFIX=$_hist_old_prefix
@@ -67,10 +51,13 @@
       elif [[ compstate[old_insert] -lt _hist_menu_length ]]; then
         compstate[old_list]=keep
         (( compstate[insert] = compstate[old_insert] + 1 ))
-      else
+      elif [[ -n $stop ]]; then
         _hist_stop=old
         _message 'beginning of history reached'
         return 1
+      else
+        compstate[old_list]=keep
+        compstate[insert]=1
       fi
     elif [[ "$direction" == 'newer' ]]; then
       if [[ $_hist_stop = old ]]; then
@@ -86,10 +73,13 @@
       elif [[ compstate[old_insert] -gt 1 ]]; then
         compstate[old_list]=keep
         (( compstate[insert] = compstate[old_insert] - 1 ))
-      else
+      elif [[ -n $stop ]]; then
         _hist_stop=new
         _message 'end of history reached'
         return 1
+      else
+        compstate[old_list]=keep
+        compstate[insert]=$_hist_menu_length
       fi
     fi
     return 0
@@ -103,47 +93,29 @@
 }
 
 _history_complete_word_gen_matches () {
-  local opt beg=2
 
   [[ -n "$_hist_stop" ]] && PREFIX="$_hist_old_prefix"
 
-  if zstyle -t ":completion:${curcontext}:history-words" remove-all-dups; then
-    opt=-
-  else
-    opt=-1
-  fi
-  if zstyle -t ":completion:${curcontext}:history-words" sort; then
-    opt="${opt}J"
-  else
-    opt="${opt}V"
-  fi
-
-  PREFIX="$IPREFIX$PREFIX"
-  IPREFIX=
-  SUFFIX="$SUFFIX$ISUFFIX"
-  ISUFFIX=
-
-  while [[ $compstate[nmatches] -eq 0 && beg -lt max ]]; do
-    _main_complete - history _wanted "$opt" history-words expl 'history word' \
-                                 compadd -Q -a 'historywords[beg,beg+slice]'
-    (( beg+=slice ))
-  done
+  _main_complete _history
 
-  zstyle -t ":completion:${curcontext}:history-words" list ||
-      compstate[list]=
+  zstyle -T ":completion:${curcontext}:history-words" list || compstate[list]=
 
   _hist_menu_length="$compstate[nmatches]"
+
+  if [[ $_lastcomp[insert] != *unambig* ]]; then
+    case "$direction" in 
+      newer)  compstate[insert]=$_hist_menu_length
+	      [[ -n "$_hist_stop" ]] && (( compstate[insert]-- ))
+              ;;
+      older)  compstate[insert]=1
+	      [[ -n "$_hist_stop" ]] && (( compstate[insert]++ ))
+              ;;
+    esac
+  fi
 
-  case "$direction" in 
-    newer)  compstate[insert]=$_hist_menu_length
-	    [[ -n "$_hist_stop" ]] && (( compstate[insert]-- ))
-            ;;
-    older)  compstate[insert]=1
-	    [[ -n "$_hist_stop" ]] && (( compstate[insert]++ ))
-            ;;
-  esac
+  _hist_stop=
 
-  [[ -n "$_hist_stop" ]] && _hist_stop=''
+  return
 }
 
 _history_complete_word "$@"
Index: Doc/Zsh/compsys.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/compsys.yo,v
retrieving revision 1.113
diff -u -r1.113 compsys.yo
--- Doc/Zsh/compsys.yo	2001/03/28 11:26:06	1.113
+++ Doc/Zsh/compsys.yo	2001/03/28 12:13:24
@@ -1470,9 +1470,11 @@
 )
 kindex(list, completion style)
 item(tt(list))(
-This style is used by the tt(_history_complete_word) bindable command to
-decide if the available matches should be shown.  Use the context prefix
-`tt(:completion:history-words)'.
+This style is used by the tt(_history_complete_word) bindable command.
+If it is set to `true' it has no effect, but if it is set to `false'
+the matches will not be listed, overriding the setting of the options
+that control listing behaviour, especially tt(AUTO_LIST). Use the
+context prefix `tt(:completion:history-words)'.
 )
 kindex(list-colors, completion style)
 item(tt(list-colors))(
@@ -1917,10 +1919,11 @@
 kindex(stop, completion style)
 item(tt(stop))(
 If set to `true', the tt(_history_complete_word) bindable
-command will always insert matches as if menu completion were started
-and will stop when the last match is inserted.  If this style is set
-to `tt(verbose)' a message will be displayed when the last match is
-reached.
+command will stop once when reaching the beginning or end of the
+history.  Invoking tt(_history_complete_word) will then wrap around to 
+the opposite end of the history.  If this style is set to `false' (the 
+default), tt(_history_complete_word) will loop immediately as in a
+menu completion.
 )
 kindex(subst-globs-only, completion style)
 item(tt(subst-globs-only))(

--
Sven Wischnowsky                         wischnow@xxxxxxxxxxxxxxxxxxxxxxx



Messages sorted by: Reverse Date, Date, Thread, Author