zsh-workers
 help / color / mirror / code / Atom feed
* Re: experimental new style completion
@ 1999-01-22 16:30 Sven Wischnowsky
  0 siblings, 0 replies; 13+ messages in thread
From: Sven Wischnowsky @ 1999-01-22 16:30 UTC (permalink / raw)
  To: zsh-workers


Phil Pennock wrote:

> 
> Typing away merrily, Sven Wischnowsky produced the immortal words:
> [...]
> > +         eval b\=\( \$\{b:/\*\(${(j:|:)fignore}\)\} \)
> [...]
> > +         eval c\=\( \$\{c:/\*\(${(j:|:)fignore}\)\} \)
> 
> One has to wonder about a shell where /that/ is valid input.
> 
> Whilst it's nice and understandable to people who're extensively
> familiar, doesn't anyone else think it's time to sit back and try and
> look at this syntax objectively?
> 
> (At least, almost understandable... oh yeah, understandable)

;-)

Btw, this is the simple solution. I first tried to integrate it into
the globbing itself but failed utterly.

Bye
 Sven


--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: experimental new style completion
  1999-01-22 16:18 ` Phil Pennock
@ 1999-01-22 17:09   ` Bart Schaefer
  0 siblings, 0 replies; 13+ messages in thread
From: Bart Schaefer @ 1999-01-22 17:09 UTC (permalink / raw)
  To: Phil Pennock, zsh-workers

On Jan 22,  4:18pm, Phil Pennock wrote:
} Subject: Re: experimental new style completion
}
} Whilst it's nice and understandable to people who're extensively
} familiar, doesn't anyone else think it's time to sit back and try and
} look at this syntax objectively?

It surely is gory, but there's only so much that can be done to clarify
it, particularly with the constraint that it can't conflict with any
syntax used by either the Bourne or Korn shells.  However, it's not as
bad as you imply; there are stylistic issues.

	eval b\=\( \$\{b:/\*\(${(j:|:)fignore}\)\} \)

I wouldn't have used all those backslashes ... I prefer quotes:

	eval 'b=( ${b:/*('${(j:|:)fignore}')} )'

which leaves just two oddities:  The (|) glob alternation syntax and the
admittedly icky parameter flags syntax.  It becomes slightly more readable
if you replace the `:' with matching parens or braces:

	eval 'b=( ${b:/*('${(j(|))fignore}')} )'

Would it help to have written it this way?

	fignore_alternatives="${(j(|))fignore}"
	fignore_glob="*($fignore_alternatives)"
	eval 'b=( ${b:/'$fignore_glob'} )'

The final nasty bit here is the need to "eval" to strip the quoting from
the `|' characters in the alternatives, so that the glob will work right.

For those still confused, the whole mess is the same as:

	b_=()
	for i in "$b[@]"
	do
	    for j in "$fignore[@]"
	    do
	    	case "$i" in
		*${j}) continue 2 ;;
		esac
	    done
	    b_=("$b_[@]" "$i") 
	done
	b=("$b_[@]")

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: experimental new style completion
  1999-01-22 14:50 Sven Wischnowsky
@ 1999-01-22 16:18 ` Phil Pennock
  1999-01-22 17:09   ` Bart Schaefer
  0 siblings, 1 reply; 13+ messages in thread
From: Phil Pennock @ 1999-01-22 16:18 UTC (permalink / raw)
  To: zsh-workers

Typing away merrily, Sven Wischnowsky produced the immortal words:
[...]
> +         eval b\=\( \$\{b:/\*\(${(j:|:)fignore}\)\} \)
[...]
> +         eval c\=\( \$\{c:/\*\(${(j:|:)fignore}\)\} \)

One has to wonder about a shell where /that/ is valid input.

Whilst it's nice and understandable to people who're extensively
familiar, doesn't anyone else think it's time to sit back and try and
look at this syntax objectively?

(At least, almost understandable... oh yeah, understandable)
-- 
--> Phil Pennock ; GAT d- s+:+ a23 C++(++++) UL++++/I+++/S+++/B++/H+$ P++@$
L+++ E-@ W(+) N>++ o !K w--- O>+ M V !PS PE Y+ PGP+ t-- 5++ X+ R !tv b++>+++
DI+ D+ G+ e+ h* r y?


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: experimental new style completion
@ 1999-01-22 14:50 Sven Wischnowsky
  1999-01-22 16:18 ` Phil Pennock
  0 siblings, 1 reply; 13+ messages in thread
From: Sven Wischnowsky @ 1999-01-22 14:50 UTC (permalink / raw)
  To: zsh-workers


I wrote:

> ...
>
> Most importantly it contains a
> function showing the use of `compadd': with this function it is easy
> to get partial-path completion for almost anything (including what was 
> previously `-g' patterns).
>
> ...

I forgot to handle fignore inside this function.

Bye
 Sven

*** Src/example.old	Fri Jan 22 15:47:54 1999
--- Src/example	Fri Jan 22 15:48:18 1999
***************
*** 238,243 ****
--- 238,244 ----
        s=( "${(@)s:gs.**.*.}" )
        for i in $a; do
          b=( $~i/(#l)$~s )
+         eval b\=\( \$\{b:/\*\(${(j:|:)fignore}\)\} \)
          [[ $#b -ne 0 ]] && c=( $c $i )
        done
        if [[ $#c -eq 0 ]] then
***************
*** 245,250 ****
--- 246,252 ----
        elif [[ $#c -ne 1 ]] then
          a="$epre$pa"
          c=( $~c/(#l)$~s )
+         eval c\=\( \$\{c:/\*\(${(j:|:)fignore}\)\} \)
  	c=( ${c#$a} )
          for i in $c; do
            compadd -p "$pre$pa" -W "$a" -s "/${i#*/}" -f "${i%%/*}"
***************
*** 261,266 ****
--- 263,269 ----
    s=( $str$@ )
    s=( "${(@)s:gs.**.*.}" )
    b=( $~a(#l)$~s )
+   eval b\=\( \$\{b:/\*\(${(j:|:)fignore}\)\} \)
    compadd -p "$pre$pa" -W "$epre$pa" -f ${b#$a}
  }
  

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: experimental new style completion
@ 1999-01-22 13:15 Sven Wischnowsky
  0 siblings, 0 replies; 13+ messages in thread
From: Sven Wischnowsky @ 1999-01-22 13:15 UTC (permalink / raw)
  To: zsh-workers


The patch below fixes some small bugs in the new style completion
stuff:

  - a memory problem due to not copying -P/-S strings
  - a problem with the job table (the test for validity was too weak
    if there are functions being executed, maybe we should add this
    even without this new stuff).
  - a problem with resetting compnmatches in the completion wrapper
    function (OK, I admit that this was just wrong)
  - cond_position() failed too often

This patch also modifies the example file. It now contains some more
useful example functions (while keeping the old example functions
which weren't that interesting). Most importantly it contains a
function showing the use of `compadd': with this function it is easy
to get partial-path completion for almost anything (including what was 
previously `-g' patterns).
If you already have played with all this (has anyone?): I changed the
functions `defcomp' and `defpatcomp', they now get the name of the
function/variable as their first arguments and `defcomp' accepts more
than one command name.


Bye
 Sven

*** Src/Zle/zle_tricky.c.old	Fri Jan 22 12:57:16 1999
--- Src/Zle/zle_tricky.c	Fri Jan 22 13:06:24 1999
***************
*** 2776,2783 ****
      cm->str = (ms ? ms : s);
      cm->ipre = (ipre && *ipre ? ipre : NULL);
      cm->ripre = (ripre && *ripre ? ripre : NULL);
!     cm->pre = curcc->prefix;
!     cm->suf = curcc->suffix;
      cm->flags = mflags | isf;
      cm->brpl = bpl;
      cm->brsl = bsl;
--- 2776,2788 ----
      cm->str = (ms ? ms : s);
      cm->ipre = (ipre && *ipre ? ipre : NULL);
      cm->ripre = (ripre && *ripre ? ripre : NULL);
!     if (incompfunc) {
! 	cm->pre = dupstring(curcc->prefix);
! 	cm->suf = dupstring(curcc->suffix);
!     } else {
! 	cm->pre = curcc->prefix;
! 	cm->suf = curcc->suffix;
!     }
      cm->flags = mflags | isf;
      cm->brpl = bpl;
      cm->brsl = bsl;
***************
*** 4471,4477 ****
  	char *j, *jj;
  
  	for (i = 0; i < MAXJOB; i++)
! 	    if (jobtab[i].stat & STAT_INUSE) {
  		int stopped = jobtab[i].stat & STAT_STOPPED;
  
  		j = jj = dupstring(jobtab[i].procs->text);
--- 4476,4483 ----
  	char *j, *jj;
  
  	for (i = 0; i < MAXJOB; i++)
! 	    if ((jobtab[i].stat & STAT_INUSE) &&
! 		jobtab[i].procs && jobtab[i].procs->text) {
  		int stopped = jobtab[i].stat & STAT_STOPPED;
  
  		j = jj = dupstring(jobtab[i].procs->text);
*** Src/Zle/compctl.c.old	Fri Jan 22 12:05:17 1999
--- Src/Zle/compctl.c	Fri Jan 22 13:55:47 1999
***************
*** 1860,1869 ****
  	return 1;
      else {
  	char *octxt, *ocmd, *opre, *osuf, *oipre;
! 	long ocur, onm;
  
  	ocur = compcurrent;
- 	onm = compnmatches;
  	octxt = dupstring(compcontext);
  	ocmd = dupstring(compcommand);
  	opre = dupstring(compprefix);
--- 1860,1868 ----
  	return 1;
      else {
  	char *octxt, *ocmd, *opre, *osuf, *oipre;
! 	long ocur;
  
  	ocur = compcurrent;
  	octxt = dupstring(compcontext);
  	ocmd = dupstring(compcommand);
  	opre = dupstring(compprefix);
***************
*** 1873,1879 ****
  	runshfunc(list, w, name);
  
  	compcurrent = ocur;
- 	compnmatches = onm;
  	zsfree(compcontext);
  	compcontext = ztrdup(octxt);
  	zsfree(compcommand);
--- 1872,1877 ----
***************
*** 1976,1985 ****
  	    b += l;
  	if (e < 0)
  	    e += l;
! 	t = (b >= 0 && b < l && e >= 0 && e < l && i >= b && i <= e && b <= e);
  
! 	if (t && a[1])
  	    restrict_range(b, e);
  	return t;
      }
      return 0;
--- 1974,1988 ----
  	    b += l;
  	if (e < 0)
  	    e += l;
! 	t = (b >= 0 && e >= 0 && i >= b && i <= e && b <= e);
  
! 	if (t && a[1]) {
! 	    if (b > l)
! 		b = l;
! 	    if (e > l)
! 		e = l;
  	    restrict_range(b, e);
+ 	}
  	return t;
      }
      return 0;
*** Src/example.old	Fri Jan 22 12:08:32 1999
--- Src/example	Fri Jan 22 14:04:15 1999
***************
*** 13,33 ****
  typeset -A comps
  
  
! # These may be used to define completion handlers.
  
  defcomp() {
    if [[ $# -eq 1 ]] then
      comps[$1]="__$1"
    else
!     comps[$1]="$2"
    fi
  }
  
  defpatcomp() {
    if [[ ${+patcomps} == 1 ]] then
!     patcomps=("$patcomps[@]" "$1 $2" )
    else
!     patcomps=( "$1 $2" )
    fi
  }
  
--- 13,42 ----
  typeset -A comps
  
  
! # These may be used to define completion handlers. First argument is the
! # name of the function/variable containing the definition, the other
! # arguments are the command names for which this definition should be used.
! # With only one argument the function/variable-name __$1 is used.
  
  defcomp() {
+   local v
+ 
    if [[ $# -eq 1 ]] then
      comps[$1]="__$1"
    else
!     v="$1"
!     shift
!     for i; do
!       comps[$i]="$v"
!     done
    fi
  }
  
  defpatcomp() {
    if [[ ${+patcomps} == 1 ]] then
!     patcomps=("$patcomps[@]" "$2 $1" )
    else
!     patcomps=( "$2 $1" )
    fi
  }
  
***************
*** 157,168 ****
  
  # Do sub-completion for pre-command modifiers.
  
! defcomp - __precmd
! defcomp noglob __precmd
! defcomp nocorrect __precmd
! defcomp exec __precmd
! defcomp command __precmd
! defcomp builtin __precmd
  __precmd() {
    COMMAND="$1"
    shift
--- 166,172 ----
  
  # Do sub-completion for pre-command modifiers.
  
! defcomp __precmd - noglob nocorrect exec command builtin
  __precmd() {
    COMMAND="$1"
    shift
***************
*** 175,192 ****
    compsub
  }
  
  # Simple default, command, and math completion defined with variables.
  
! defcomp --default-- __default
! __default=( -f )
  
! defcomp --command-- __command
  __command=( -c )
  
! defcomp --math-- __math
  __math=( -v )
  
! defcomp --subscr-- __subscr
  __subscr() {
    compalso --math-- "$@"
    # ...probably other stuff
--- 179,295 ----
    compsub
  }
  
+ # Utility function for in-path completion.
+ # First argument should be an complist-option (e.g. -f, -/, -g). The other
+ # arguments should be glob patterns, one per argument.
+ # E.g.: files -g '*.tex' '*.texi'
+ # This is intended as a replacement for `complist -f', `complist -/', and
+ # `complist -g ...' (but don't use it with other options).
+ # This function behaves as if you have a matcher definition like:
+ #   compctl -M 'r:|[-.,_/]=* r:|=* m:{a-z}={A-Z} m:-=_ m:.=,'
+ # so you may want to modify this.
+ 
+ pfiles() {
+   local nm str pa pre epre a b c s rest
+ 
+   setopt localoptions nullglob rcexpandparam globdots extendedglob
+   unsetopt markdirs globsubst shwordsplit nounset
+ 
+   nm=$NMATCHES
+   if [[ $# -eq 0 ]] then
+     complist -f
+   elif [[ "$1" = -g ]] then
+     complist -g "$argv[2,-1]"
+     shift
+   else
+     complist $1
+     shift
+   fi
+   [[ -nmatches nm ]] || return
+ 
+   str="$PREFIX*$SUFFIX"
+ 
+   [[ -z "$1" ]] && 1='*'
+   if [[ $str[1] = \~ ]] then
+     pre="${str%%/*}/"
+     eval epre\=$pre
+     str="${str#*/}"
+     pa=''
+   else
+     pre=''
+     epre=''
+     if [[ $str[1] = / ]] then
+       str="$str[2,-1]"
+       pa='/'
+     else
+       pa=''
+     fi
+   fi
+   str="$str:gs/,/*,/:gs/_/*_/:gs./.*/.:gs/-/*[-_]/:gs/./*[.,]/:gs-*[.,]*[.,]*/-../-:gs.**.*."
+   while [[ "$str" = */* ]] do
+     rest="${str#*/}"
+     a="${epre}${pa}(#l)${str%%/*}(-/)"
+     a=( $~a )
+     if [[ $#a -eq 0 ]] then
+       return
+     elif [[ $#a -gt 1 ]] then
+       c=()
+       s=( $rest$@ )
+       s=( "${(@)s:gs.**.*.}" )
+       for i in $a; do
+         b=( $~i/(#l)$~s )
+         [[ $#b -ne 0 ]] && c=( $c $i )
+       done
+       if [[ $#c -eq 0 ]] then
+         return
+       elif [[ $#c -ne 1 ]] then
+         a="$epre$pa"
+         c=( $~c/(#l)$~s )
+ 	c=( ${c#$a} )
+         for i in $c; do
+           compadd -p "$pre$pa" -W "$a" -s "/${i#*/}" -f "${i%%/*}"
+         done
+ 	return
+       fi
+       a=( "$c[1]" )
+     fi
+     a="$a[1]"
+     pa="$pa${a##*/}/"
+     str="$rest"
+   done
+   a="$epre$pa"
+   s=( $str$@ )
+   s=( "${(@)s:gs.**.*.}" )
+   b=( $~a(#l)$~s )
+   compadd -p "$pre$pa" -W "$epre$pa" -f ${b#$a}
+ }
+ 
+ # Utility function for completing files of a given type or any file.
+ # In many cases you will want to call this one instead of pfiles().
+ 
+ files() {
+   local nm
+ 
+   nm=$NMATCHES
+   pfiles "$@"
+ 
+   [[ $# -ne 0 && -nmatches nm ]] && pfiles
+ }
+ 
  # Simple default, command, and math completion defined with variables.
  
! defcomp __default --default--
! __default() {
!   files
! }
  
! defcomp __command --command--
  __command=( -c )
  
! defcomp __math --math--
  __math=( -v )
  
! defcomp __subscr --subscr--
  __subscr() {
    compalso --math-- "$@"
    # ...probably other stuff
***************
*** 194,200 ****
  
  # A simple pattern completion, just as an example.
  
! defpatcomp '*/X11/*' __x_options
  __x_options() {
    complist -J options -k '(-display -name -xrm)'
  }
--- 297,303 ----
  
  # A simple pattern completion, just as an example.
  
! defpatcomp __x_options '*/X11/*'
  __x_options() {
    complist -J options -k '(-display -name -xrm)'
  }
***************
*** 214,227 ****
  	exec {f,}print{f,0,} ok prune ls'
      compreset
    elif [[ -position 1 ]] then
!     complist -g '. ..' -/
    elif [[ -mcurrent -1 -((a|c|)newer|fprint(|0|f)) ]] then
!     complist -f
    elif [[ -current -1 -fstype ]] then
      complist -k '(ufs 4.2 4.3 nfs tmp mfs S51K S52K)'
    elif [[ -current -1 -group ]] then
!     complist -g groups
    elif [[ -current -1 -user ]] then
      complist -u
    fi
  }
--- 317,450 ----
  	exec {f,}print{f,0,} ok prune ls'
      compreset
    elif [[ -position 1 ]] then
!     complist -g '. ..'
!     files -g '(-/)'
    elif [[ -mcurrent -1 -((a|c|)newer|fprint(|0|f)) ]] then
!     files
    elif [[ -current -1 -fstype ]] then
      complist -k '(ufs 4.2 4.3 nfs tmp mfs S51K S52K)'
    elif [[ -current -1 -group ]] then
!     complist -k groups
    elif [[ -current -1 -user ]] then
      complist -u
+   fi
+ }
+ 
+ # Various completions...
+ 
+ defcomp __gunzip gunzip zcat
+ __gunzip() {
+   files -g '*.[gG][z]'
+ }
+ 
+ defcomp gzip
+ __gzip() {
+   files -g '*~*.[gG][zZ]'
+ }
+ 
+ defcomp xfig
+ __xfig() {
+   files -g '*.fig'
+ }
+ 
+ defcomp __make make gmake
+ __make() {
+   complist -s "\$(awk '/^[a-zA-Z0-9][^/ 	]+:/ {print \$1}' FS=: [mM]akefile)"
+ }
+ 
+ defcomp __ps gs ghostview gview psnup psselect pswrap pstops pstruct lpr
+ __ps() {
+   files -g '*([pP][sS]|eps)'
+ }
+ 
+ defcomp __which which whence
+ __which=( -caF )
+ 
+ defcomp __rlogin rlogin rsh ssh
+ __rlogin() {
+   if [[ -position 1 ]] then
+     complist -k hosts
+   elif [[ -position 2 ]] then
+     complist -k '(-l)'
+   elif [[ -position 3 && -word 1 artus ]] then
+     complist -k '(puck root)'
+   fi
+ }
+ 
+ defcomp __dvi xdvi dvips dvibook dviconcat dvicopy dvidvi dviselect dvitodvi dvitype
+ __dvi() {
+   files -g '*.(dvi|DVI)'
+ }
+ 
+ defcomp __dirs rmdir df du dircmp cd
+ __dirs() {
+   files -/ '*(-/)'
+ }
+ 
+ defcomp __jobs fg bg jobs
+ __jobs=(-j -P '%?')
+ 
+ defcomp kill
+ __kill() {
+   if [[ -iprefix '-' ]] then
+     complist -k signals
+   else
+     complist -P '%?' -j
+   fi
+ }
+ 
+ defcomp __uncompress uncompress zmore
+ __uncompress() {
+   files -g '*.Z'
+ }
+ 
+ defcomp compress
+ __compress() {
+   files -g '*~*.Z'
+ }
+ 
+ defcomp __tex tex latex glatex slitex gslitex
+ __tex() {
+   files -g '*.(tex|TEX|texinfo|texi)'
+ }
+ 
+ defcomp __options setopt unsetopt
+ __options=(-M 'L:|[nN][oO]= M:_= M:{A-Z}={a-z}' -o)
+ 
+ defcomp __funcs unfunction
+ __funcs=(-F)
+ 
+ defcomp __aliases unalias
+ __aliases=(-a)
+ 
+ defcomp __vars unset
+ __vars=(-v)
+ 
+ defcomp __enabled disable
+ __enabled=(-FBwa)
+ 
+ defcomp __disabled enable
+ __disabled=(-dFBwa)
+ 
+ defcomp __pdf acroread
+ __pdf() {
+   files -g '*.(pdf|PDF)'
+ }
+ 
+ defcomp tar
+ __tar() {
+   local nm tf
+   compsave
+ 
+   tf="$2"
+   nm=$NMATCHES
+   if [[ ( -mword 1 *t*f* || -mword 1 *x*f* ) && -position 3 100000 ]] then
+     complist -k "( $(tar tf $tf) )"
+     compreset
+   elif [[ -mword 1 *c*f* && -position 3 100000 ]] then
+     files
+     compreset
+   elif [[ -mcurrent -1 *f* && -position 2 ]] then
+     files -g '*.(tar|TAR)'
    fi
  }

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: experimental new style completion
@ 1999-01-21 16:07 Sven Wischnowsky
  0 siblings, 0 replies; 13+ messages in thread
From: Sven Wischnowsky @ 1999-01-21 16:07 UTC (permalink / raw)
  To: zsh-workers


Another small fix to the new style completion stuff. This time it's
a memory problem: with -k you can give the code an array. When
building the things to put into the command line it uses the strings
in it before copying them. The only easy solution I currently see is
to move the call to dupstring() up, although that will sometimes
create copies that aren't needed. Hm.

Bye
 Sven

*** Src/Zle/zle_tricky.c.old	Thu Jan 21 17:02:28 1999
--- Src/Zle/zle_tricky.c	Thu Jan 21 17:03:05 1999
***************
*** 2552,2557 ****
--- 2552,2559 ----
      hn = (HashNode) t;
      pm = (Param) t;
  
+     if (incompfunc)
+ 	s = dupstring(s);
      if (!addwhat) {
  	test = 1;
      } else if (addwhat == -1 || addwhat == -5 || addwhat == -6 ||
***************
*** 2687,2694 ****
      }
      if (!test)
  	return;
-     if (incompfunc)
- 	s = dupstring(s);
      if (!ms && !ispattern && ai->firstm) {
  	if ((test = sl - pfxlen(ai->firstm->str, s)) < ai->prerest)
  	    ai->prerest = test;
--- 2689,2694 ----

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: experimental new style completion
@ 1999-01-21 12:02 Sven Wischnowsky
  0 siblings, 0 replies; 13+ messages in thread
From: Sven Wischnowsky @ 1999-01-21 12:02 UTC (permalink / raw)
  To: zsh-workers


Here is another little fixlet for the new style completion stuff. The
tokenizing in comp_str() failed for `$'s. Not wanting to change
tokenize() itself I added a little wrapper function in zle_tricky.c
(is there really no better way?).

Bye
 Sven

*** Src/Zle/zle_tricky.c.old	Thu Jan 21 12:59:33 1999
--- Src/Zle/zle_tricky.c	Thu Jan 21 12:58:27 1999
***************
*** 3348,3353 ****
--- 3348,3379 ----
      return 1;
  }
  
+ /* This should probably be moved into tokenize(). */
+ 
+ static char *
+ ctokenize(char *p)
+ {
+     char *r = p;
+     int bslash = 0;
+ 
+     tokenize(p);
+ 
+     for (p = r; *p; p++) {
+ 	if (*p == '\\')
+ 	    bslash = 1;
+ 	else {
+ 	    if (*p == '$') {
+ 		if (bslash)
+ 		    p[-1] = Bnull;
+ 		else
+ 		    *p = String;
+ 	    }
+ 	    bslash = 0;
+ 	}
+     }
+     return r;
+ }
+ 
  /**/
  char *
  comp_str(int *ipl, int *pl)
***************
*** 3358,3368 ****
      char *str;
      int lp, ls, lip;
  
!     tokenize(p);
      remnulargs(p);
!     tokenize(s);
      remnulargs(s);
!     tokenize(ip);
      remnulargs(ip);
      ls = strlen(s);
      lip = strlen(ip);
--- 3384,3394 ----
      char *str;
      int lp, ls, lip;
  
!     ctokenize(p);
      remnulargs(p);
!     ctokenize(s);
      remnulargs(s);
!     ctokenize(ip);
      remnulargs(ip);
      ls = strlen(s);
      lip = strlen(ip);

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: experimental new style completion
@ 1999-01-21 10:53 Sven Wischnowsky
  0 siblings, 0 replies; 13+ messages in thread
From: Sven Wischnowsky @ 1999-01-21 10:53 UTC (permalink / raw)
  To: zsh-workers


While working on my last patch I found a bug: completion inside
`((...))' reported a wrong CONTEXT.

Bye
 Sven

*** Src/Zle/zle_tricky.c.old	Thu Jan 21 11:48:50 1999
--- Src/Zle/zle_tricky.c	Thu Jan 21 11:49:06 1999
***************
*** 3240,3246 ****
  		zsfree(compcontext);
  		zsfree(compcommand);
  		compcommand = "";
! 		if (lincmd)
  		    compcontext = (insubscr ? "subscript" : "command");
  		else if (linredir)
  		    compcontext = "redirect";
--- 3240,3253 ----
  		zsfree(compcontext);
  		zsfree(compcommand);
  		compcommand = "";
! 		if (inwhat == IN_MATH) {
! 		    if (insubscr) {
! 			compcontext = "subscript";
! 			compcommand = varname ? varname : "";
! 		    } else
! 			compcontext = "math";
! 		    usea = 0;
! 		} else if (lincmd)
  		    compcontext = (insubscr ? "subscript" : "command");
  		else if (linredir)
  		    compcontext = "redirect";
***************
*** 3249,3262 ****
  		    case IN_ENV:
  			compcontext = "value";
  			compcommand = varname;
- 			usea = 0;
- 			break;
- 		    case IN_MATH:
- 			if (insubscr) {
- 			    compcontext = "subscript";
- 			    compcommand = varname ? varname : "";
- 			} else
- 			    compcontext = "math";
  			usea = 0;
  			break;
  		    case IN_COND:
--- 3256,3261 ----

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: experimental new style completion
@ 1999-01-21 10:36 Sven Wischnowsky
  0 siblings, 0 replies; 13+ messages in thread
From: Sven Wischnowsky @ 1999-01-21 10:36 UTC (permalink / raw)
  To: zsh-workers


Bart Schaefer wrote:

> May I suggest that there's no reason to abbreviate names of this sort.
> 
>  `command' (not `cmd')      we are completing in command position
>  `argument' (not `arg')     we are completing in argument position
>  `redirect' (not `redir')   ... after a redirection operator
>  `math'                     ... in a math environment
>  `subscript' (not `subscr') ... in a subscript
>  `value'                    ... in the value of an variable assignment
>  `condition'                ... inside `[[...]]'
> 

The patch below does this.

> Also ... I may be mistaken, but isn't it possible to be in both the command
> position and after a redirection operator (e.g. readnullcmd) or in both a
> math context and inside a subscript?  Is a single context identifier enough?

This is not changed by the patch. The intended usage is to call a
provided shell function or alias that generates the matches for
`included' context types (see the use of `compalso' in the example
file). Anyway after thinking more about this I see a real use for this 
only with `math' and `subscript' and probaly using the `math' stuff in 
some cases in conditions. `command' and `redirection' are mutually
exclusive as far as I can see.

Bye
 Sven

*** Src/Zle/zle_tricky.c.old	Thu Jan 21 10:47:03 1999
--- Src/Zle/zle_tricky.c	Thu Jan 21 11:03:02 1999
***************
*** 3241,3249 ****
  		zsfree(compcommand);
  		compcommand = "";
  		if (lincmd)
! 		    compcontext = (insubscr ? "subscr" : "cmd");
  		else if (linredir)
! 		    compcontext = "redir";
  		else
  		    switch (inwhat) {
  		    case IN_ENV:
--- 3241,3249 ----
  		zsfree(compcommand);
  		compcommand = "";
  		if (lincmd)
! 		    compcontext = (insubscr ? "subscript" : "command");
  		else if (linredir)
! 		    compcontext = "redirect";
  		else
  		    switch (inwhat) {
  		    case IN_ENV:
***************
*** 3253,3270 ****
  			break;
  		    case IN_MATH:
  			if (insubscr) {
! 			    compcontext = "subscr";
  			    compcommand = varname ? varname : "";
  			} else
  			    compcontext = "math";
  			usea = 0;
  			break;
  		    case IN_COND:
! 			compcontext = "cond";
  			break;
  		    default:
  			if (cmdstr) {
! 			    compcontext = "arg";
  			    compcommand = cmdstr;
  			} else {
  			    compcontext = "value";
--- 3253,3270 ----
  			break;
  		    case IN_MATH:
  			if (insubscr) {
! 			    compcontext = "subscript";
  			    compcommand = varname ? varname : "";
  			} else
  			    compcontext = "math";
  			usea = 0;
  			break;
  		    case IN_COND:
! 			compcontext = "condition";
  			break;
  		    default:
  			if (cmdstr) {
! 			    compcontext = "argument";
  			    compcommand = cmdstr;
  			} else {
  			    compcontext = "value";
*** Src/example.old	Thu Jan 21 10:47:18 1999
--- Src/example	Thu Jan 21 11:25:50 1999
***************
*** 42,47 ****
--- 42,53 ----
  
  alias compsub='do-complete "$@" || return 1'
  
+ # This searches $1 in the array for normal completions and calls the result.
+ 
+ compalso() {
+   1="$comps[$1]"
+   [[ -z "$1" ]] || call-complete "$@"
+ }
  
  # This generates matches. The first argument is something we got from one
  # of the associative arrays above. This is expected to be either the name
***************
*** 81,87 ****
    # For arguments we use the `do-complete' function below called via the
    # convenience alias `compsub'.
  
!   if [[ $CONTEXT == arg || $CONTEXT == cmd ]] then
      compsub
    else
      # Let's see if we have a special completion definition for the other
--- 87,93 ----
    # For arguments we use the `do-complete' function below called via the
    # convenience alias `compsub'.
  
!   if [[ $CONTEXT == argument || $CONTEXT == command ]] then
      compsub
    else
      # Let's see if we have a special completion definition for the other
***************
*** 90,100 ****
      comp=''
  
      case $CONTEXT in
!     redir)  comp="$comps[--redir--]";;
      math)   comp="$comps[--math--]";;
!     subscr) comp="$comps[--subscr--]";;
      value)  comp="$comps[--value--]";;
!     cond)   comp="$comps[--cond--]";;
      esac
  
      # If not, we use default completion, if any.
--- 96,106 ----
      comp=''
  
      case $CONTEXT in
!     redirect)  comp="$comps[--redir--]";;
      math)   comp="$comps[--math--]";;
!     subscript) comp="$comps[--subscr--]";;
      value)  comp="$comps[--value--]";;
!     condition)   comp="$comps[--cond--]";;
      esac
  
      # If not, we use default completion, if any.
***************
*** 114,120 ****
    # two strings we have search in the completion definition arrays (e.g.
    # a path and the last path name component).
  
!   if [[ $CONTEXT == cmd ]] then
      comp="$comps[--command--]"
      [[ -z "$comp" ]] || call-complete "$comp" "$@" || return 1
      return 0
--- 120,126 ----
    # two strings we have search in the completion definition arrays (e.g.
    # a path and the last path name component).
  
!   if [[ $CONTEXT == command ]] then
      comp="$comps[--command--]"
      [[ -z "$comp" ]] || call-complete "$comp" "$@" || return 1
      return 0
***************
*** 162,170 ****
    shift
    (( CURRENT-- ))
    if [[ CURRENT -eq 0 ]] then
!     CONTEXT=cmd
    else
!     CONTEXT=arg
    fi
    compsub
  }
--- 168,176 ----
    shift
    (( CURRENT-- ))
    if [[ CURRENT -eq 0 ]] then
!     CONTEXT=command
    else
!     CONTEXT=argument
    fi
    compsub
  }
***************
*** 178,185 ****
  __command=( -c )
  
  defcomp --math-- __math
- defcomp --subscr-- __math
  __math=( -v )
  
  # A simple pattern completion, just as an example.
  
--- 184,196 ----
  __command=( -c )
  
  defcomp --math-- __math
  __math=( -v )
+ 
+ defcomp --subscr-- __subscr
+ __subscr() {
+   compalso --math-- "$@"
+   # ...probably other stuff
+ }
  
  # A simple pattern completion, just as an example.
  

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: experimental new style completion
@ 1999-01-07  8:02 Sven Wischnowsky
  0 siblings, 0 replies; 13+ messages in thread
From: Sven Wischnowsky @ 1999-01-07  8:02 UTC (permalink / raw)
  To: zsh-workers


Bart Schaefer wrote:

> 
> On Jan 5,  4:43pm, Sven Wischnowsky wrote:
> } Subject: Re:  experimental new style completion
> }
> } - When completing in subscripts on the left side of an parameter
> }   assignment the CONTEXT is now set to `subscr' (this is still a bit
> }   hackish)
> 
> May I suggest that there's no reason to abbreviate names of this sort.

Yep. As I said, these parameters may change anyway (esp. if we put all 
of them into an associative array).

> Also ... I may be mistaken, but isn't it possible to be in both the command
> position and after a redirection operator (e.g. readnullcmd) or in both a
> math context and inside a subscript?  Is a single context identifier enough?

That's (partly) inherited from the current completion code. One
difference is that math and subscript are distinguished, the normal
code just treats both of them as mathematical environments. I haven't
thought about using multiple context names at once and I could be
convinced to do this for math/subscript and probably others.
But all this is new stuff anyway, the normal completion code doesn't
allow one to separately define completions for conds, math, subscript, 
redir, and value, so I suggest playing with it until we find out what
would be most useful.

Bye
 Sven


--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: experimental new style completion
  1999-01-05 15:43 Sven Wischnowsky
@ 1999-01-07  7:36 ` Bart Schaefer
  0 siblings, 0 replies; 13+ messages in thread
From: Bart Schaefer @ 1999-01-07  7:36 UTC (permalink / raw)
  To: zsh-workers

On Jan 5,  4:43pm, Sven Wischnowsky wrote:
} Subject: Re:  experimental new style completion
}
} - When completing in subscripts on the left side of an parameter
}   assignment the CONTEXT is now set to `subscr' (this is still a bit
}   hackish)

May I suggest that there's no reason to abbreviate names of this sort.

 `command' (not `cmd')      we are completing in command position
 `argument' (not `arg')     we are completing in argument position
 `redirect' (not `redir')   ... after a redirection operator
 `math'                     ... in a math environment
 `subscript' (not `subscr') ... in a subscript
 `value'                    ... in the value of an variable assignment
 `condition'                ... inside `[[...]]'

Also ... I may be mistaken, but isn't it possible to be in both the command
position and after a redirection operator (e.g. readnullcmd) or in both a
math context and inside a subscript?  Is a single context identifier enough?

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re:  experimental new style completion
@ 1999-01-05 15:43 Sven Wischnowsky
  1999-01-07  7:36 ` Bart Schaefer
  0 siblings, 1 reply; 13+ messages in thread
From: Sven Wischnowsky @ 1999-01-05 15:43 UTC (permalink / raw)
  To: zsh-workers


Below is the first patch that goes on top of my patch for the
experimental new style completion stuff. Of course all this is only
interesting if you have installed that patch.

Things changed:

- The example file now uses a normal array for pattern completions
  (dunno why I used an associative array in the first place... we even 
  had discussed this, sigh).
- The compadd builtin has some new options (to really make everything
  available):
  - `-W <path>' sets the path to use for checking file types. I used
    `-W' since this is one of the things `-W' does for compctl and
    complist.
  - `-a' makes the given completions be stored in the alternative set
    of completions. This has *nothing* to do with xor'ed
    completion. In this case the `alternative set' is the one built
    internally for matches with fignore ignored.
  - `--' ends the list of options. Anything after that will be
    considered to be a match to add (of course, this is important to
    have if all matches you want to add start with a `-').
- When completing in subscripts on the left side of an parameter
  assignment the CONTEXT is now set to `subscr' (this is still a bit
  hackish)
- The file compctl.mdd now contains definitions for complist, compadd, 
  and the conditions.
- The patch also contains some fixes for things that were not yet
  working (namely `compadd -n').

Bye
 Sven

*** Src/Zle/compctl.c.old	Tue Jan  5 14:52:10 1999
--- Src/Zle/compctl.c	Tue Jan  5 15:25:35 1999
***************
*** 1699,1707 ****
  bin_compadd(char *name, char **argv, char *ops, int func)
  {
      char *p, **sp, *e;
!     char *ipre = NULL, *ppre = NULL, *psuf = NULL;
      char *pre = NULL, *suf = NULL, *group = NULL;
!     int f = 0, q = 0, m = 0, ns = 0;
  
      if (!incompfunc) {
  	zerrnam(name, "can only be called from completion function", NULL, 0);
--- 1699,1707 ----
  bin_compadd(char *name, char **argv, char *ops, int func)
  {
      char *p, **sp, *e;
!     char *ipre = NULL, *ppre = NULL, *psuf = NULL, *prpre = NULL;
      char *pre = NULL, *suf = NULL, *group = NULL;
!     int f = 0, q = 0, m = 0, ns = 0, a = 0;
  
      if (!incompfunc) {
  	zerrnam(name, "can only be called from completion function", NULL, 0);
***************
*** 1756,1761 ****
--- 1756,1771 ----
  		sp = &psuf;
  		e = "string expected after -%c";
  		break;
+ 	    case 'W':
+ 		sp = &prpre;
+ 		e = "string expected after -%c";
+ 		break;
+ 	    case 'a':
+ 		a = 1;
+ 		break;
+ 	    case '-':
+ 		argv++;
+ 		goto ca_args;
  	    default:
  		zerrnam(name, "bad option: -%c", NULL, *p);
  		return 1;
***************
*** 1778,1788 ****
  	    }
  	}
      }
      if (!*argv) {
  	zerrnam(name, "missing completions", NULL, 0);
  	return 1;
      }
!     addmatches(ipre, ppre, psuf, pre, suf, group, f, q, m, ns, argv);
      return 0;
  }
  
--- 1788,1800 ----
  	    }
  	}
      }
+  ca_args:
      if (!*argv) {
  	zerrnam(name, "missing completions", NULL, 0);
  	return 1;
      }
!     addmatches(ipre, ppre, psuf, prpre, pre, suf, group,
! 	       f, q, m, ns, a, argv);
      return 0;
  }
  
*** Src/Zle/compctl.mdd.old	Tue Jan  5 14:15:24 1999
--- Src/Zle/compctl.mdd	Tue Jan  5 16:26:44 1999
***************
*** 1,5 ****
  moddeps="comp1"
  
! autobins="compctl"
  
  objects="compctl.o"
--- 1,7 ----
  moddeps="comp1"
  
! autobins="compctl complist compadd"
! 
! autoprefixconds="prefix iprefix position word mword current mcurrent string class words between mbetween after mafter nmatches"
  
  objects="compctl.o"
*** Src/Zle/zle_tricky.c.old	Tue Jan  5 14:19:02 1999
--- Src/Zle/zle_tricky.c	Tue Jan  5 16:11:22 1999
***************
*** 2394,2405 ****
  
  /**/
  void
! addmatches(char *ipre, char *ppre, char *psuf, char *pre, char *suf, char *group,
! 	   int flags, int quote, int menu, int nosort, char **argv)
  {
!     char *s, *t, *prpre;
      int lpl, lsl, i;
!     Aminfo ai = ainfo;
      Cmatch cm;
  
      if (menu && isset(AUTOMENU))
--- 2394,2406 ----
  
  /**/
  void
! addmatches(char *ipre, char *ppre, char *psuf, char *prpre, char *pre,
! 	   char *suf, char *group,
! 	   int flags, int quote, int menu, int nosort, int alt, char **argv)
  {
!     char *s, *t;
      int lpl, lsl, i;
!     Aminfo ai = (alt ? fainfo : ainfo);
      Cmatch cm;
  
      if (menu && isset(AUTOMENU))
***************
*** 2422,2431 ****
  		pre = dupstring(pre);
  	    if (suf)
  		suf = dupstring(suf);
! 	    if ((prpre = ppre)) {
  		singsub(&prpre);
  		untokenize(prpre);
! 	    }
  	    if (group) {
  		endcmgroup(NULL);
  		begcmgroup(group, nosort);
--- 2423,2433 ----
  		pre = dupstring(pre);
  	    if (suf)
  		suf = dupstring(suf);
! 	    if (!prpre && (prpre = ppre)) {
  		singsub(&prpre);
  		untokenize(prpre);
! 	    } else
! 		prpre = dupstring(prpre);
  	    if (group) {
  		endcmgroup(NULL);
  		begcmgroup(group, nosort);
***************
*** 2493,2499 ****
  		cm->flags = flags;
  		cm->brpl = brpl;
  		cm->brsl = brsl;
! 		addlinknode(matches, cm);
  
  		if (expl)
  		    expl->fcount++;
--- 2495,2501 ----
  		cm->flags = flags;
  		cm->brpl = brpl;
  		cm->brsl = brsl;
! 		addlinknode((alt ? fmatches : matches), cm);
  
  		if (expl)
  		    expl->fcount++;
***************
*** 2682,2688 ****
      }
      if (!test)
  	return;
! 
      if (!ms && !ispattern && ai->firstm) {
  	if ((test = sl - pfxlen(ai->firstm->str, s)) < ai->prerest)
  	    ai->prerest = test;
--- 2684,2691 ----
      }
      if (!test)
  	return;
!     if (incompfunc)
! 	s = dupstring(s);
      if (!ms && !ispattern && ai->firstm) {
  	if ((test = sl - pfxlen(ai->firstm->str, s)) < ai->prerest)
  	    ai->prerest = test;
***************
*** 3235,3241 ****
  		zsfree(compcommand);
  		compcommand = "";
  		if (lincmd)
! 		    compcontext = "cmd";
  		else if (linredir)
  		    compcontext = "redir";
  		else
--- 3238,3244 ----
  		zsfree(compcommand);
  		compcommand = "";
  		if (lincmd)
! 		    compcontext = (insubscr ? "subscr" : "cmd");
  		else if (linredir)
  		    compcontext = "redir";
  		else
***************
*** 4842,4851 ****
  	    for (bp = ap; bp[1] && matcheq(*ap, bp[1]); bp++, n--);
  	    ap = bp;
  	    /* Mark those, that would show the same string in the list. */
! 	    for (; bp[1] && !strcmp((*ap)->str, (bp[1])->str); bp++) {
! 		(bp[1])->flags |= CMF_NOLIST; nl++;
! 	    }
  	}
  	*cp = NULL;
      }
      if (np)
--- 4845,4856 ----
  	    for (bp = ap; bp[1] && matcheq(*ap, bp[1]); bp++, n--);
  	    ap = bp;
  	    /* Mark those, that would show the same string in the list. */
! 	    for (; bp[1] && !strcmp((*ap)->str, (bp[1])->str); bp++)
! 		(bp[1])->flags |= CMF_NOLIST;
  	}
+ 	for (ap = rp; *ap; ap++)
+ 	    if ((*ap)->flags & CMF_NOLIST)
+ 		nl++;
  	*cp = NULL;
      }
      if (np)
***************
*** 5781,5787 ****
  		}
  		if (n) {
  		    putc('\n', shout);
! 		    p = skipnolist(p + 1);
  		}
  	    }
  	}
--- 5786,5793 ----
  		}
  		if (n) {
  		    putc('\n', shout);
! 		    if (n && nl)
! 			p = skipnolist(p + 1);
  		}
  	    }
  	}
*** Src/example.old	Tue Jan  5 13:32:32 1999
--- Src/example	Tue Jan  5 16:28:15 1999
***************
*** 10,16 ****
  
  # One associative array for normal completions and one for patterns.
  
! typeset -A comps patcomps
  
  
  # These may be used to define completion handlers.
--- 10,16 ----
  
  # One associative array for normal completions and one for patterns.
  
! typeset -A comps
  
  
  # These may be used to define completion handlers.
***************
*** 24,30 ****
  }
  
  defpatcomp() {
!   patcomps[$1]="$2"
  }
  
  
--- 24,34 ----
  }
  
  defpatcomp() {
!   if [[ ${+patcomps} == 1 ]] then
!     patcomps=("$patcomps[@]" "$1 $2" )
!   else
!     patcomps=( "$1 $2" )
!   fi
  }
  
  
***************
*** 68,74 ****
  
    # An entry for `--first--' is the replacement for `compctl -T'
    # The `|| return 1' is used throughout: if a function producing matches
!   # non-zero this is interpreted as `do not try to produce more matches'
    # (this is the replacement for `compctl -t').
  
    comp="$comps[--first--]"
--- 72,78 ----
  
    # An entry for `--first--' is the replacement for `compctl -T'
    # The `|| return 1' is used throughout: if a function producing matches
!   # returns non-zero this is interpreted as `do not try to produce more matches'
    # (this is the replacement for `compctl -t').
  
    comp="$comps[--first--]"
***************
*** 104,110 ****
  # arguments).
  
  do-complete() {
!   local comp cmd1 cmd2
  
    # Completing in command position? If not we set up `cmd1' and `cmd2' as
    # two strings we have search in the completion definition arrays (e.g.
--- 108,114 ----
  # arguments).
  
  do-complete() {
!   local comp cmd1 cmd2 pat val
  
    # Completing in command position? If not we set up `cmd1' and `cmd2' as
    # two strings we have search in the completion definition arrays (e.g.
***************
*** 127,135 ****
  
    # See if there are any matching pattern completions.
  
!   for pat in "${(k)patcomps[@]}"; do
      if [[ "$cmd1" == $~pat || "$cmd2" == $~pat ]] then
!       call-complete "$patcomps[$pat]" "$@" || return 1
      fi
    done
  
--- 131,141 ----
  
    # See if there are any matching pattern completions.
  
!   for i in "$patcomps[@]"; do
!     pat="${i% *}"
!     val="${i#* }"
      if [[ "$cmd1" == $~pat || "$cmd2" == $~pat ]] then
!       call-complete "$val" "$@" || return 1
      fi
    done
  
***************
*** 163,175 ****
    compsub
  }
  
! # Simple default and command completion defined with variables.
  
  defcomp --default-- __default
  __default=( -f )
  
  defcomp --command-- __command
  __command=( -c )
  
  # A simple pattern completion, just as an example.
  
--- 169,185 ----
    compsub
  }
  
! # Simple default, command, and math completion defined with variables.
  
  defcomp --default-- __default
  __default=( -f )
  
  defcomp --command-- __command
  __command=( -c )
+ 
+ defcomp --math-- __math
+ defcomp --subscr-- __math
+ __math=( -v )
  
  # A simple pattern completion, just as an example.
  

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 13+ messages in thread

* experimental new style completion
@ 1998-12-18 15:59 Sven Wischnowsky
  0 siblings, 0 replies; 13+ messages in thread
From: Sven Wischnowsky @ 1998-12-18 15:59 UTC (permalink / raw)
  To: zsh-workers

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 26658 bytes --]


Hello

Below is a first implementation of the new style completion stuff we
were discussing. This is *very* experimental, it may change
completely, in some places it may be not working, it may be slow,
wrong, not powerful enough or too powerful, it may be... This is just
to give you something to play with over the next two weeks ;-)

Comments:

The thing below contains a patch and a file called `example' which 
will be created in the Src directory. This file contains a first
implementation of the main loop for completion and everything else you 
need to start. There should be more examples for completion functions
for commands, though...
The patch will apply on top of 3.1.5-pws3 plus all recent patches or
on top of 3.1.5-pws4.

To use all this new stuff you define a completion widget (since this
name is already used for Peter's `zle -c' stuff I need a different
name, but during this mail I will use it...), e.g.:

  zle -c my-comp expand-or-complete main-complete

`my-comp' is the name of the widget to be defined, `main-complete' is
the name of a shell function that will be called from the completion
code to generate the matches. The `expand-or-complete' can be the name 
of any the well known names of widgets that call the completion
code. The newly defined widget will behave like the widget thus named, 
except for generating the matches (for which it uses the shell
function, not the compctl's).

[Peter, would this be interesting to use for your `zle -C' stuff?]

In fact the behaviour is inherited by using most of the existing code
(this is one of the reasons why the patch is so relatively small). The 
shell function will generate the matches, anything else, including
displaying the matches, inserting them into the command line, deciding 
to use RECEXACT, AUTOMENU, and whatever else is still done by the
shell itself.

To use the above widget you then use:

  bindkey `\C-i' my-comp

(Or whichever key you like.)

Inside the shell function the completion code sets some variables to
report context information and it makes available two new builtins to
produce the matches and a couple of condition codes.

The variables are:

  PREFIX   the prefix of the current word from the command line
  IPREFIX  an ignored prefix (see below)
  SUFFIX   the suffix of the current word
  COMMAND  the name of the command we are currently completing for
  CONTEXT  the context we are currently completing in, this can be
           any of:

             `cmd'    we are completing in command position
             `arg'    we are completing in argument position
	     `redir'  ... after a redirection operator
	     `math'   ... in a math environment
	     `subscr' ... in a subscript
	     `value'  ... in the value of an variable assignment
	     `cond'   ... inside `[[...]]'

  argv     the positional parameters are set to the *arguments* of the
           command we are completing for (*not* including the command
           name)
  CURRENT  this is the index into `argv' pointing to the current word
  NMATCHES this is the number of matches produced (and accepted) so far

These variables are settable, the example file contains two convenient 
aliases to save and restore them. The completion code uses a wrapper
function to rest them to their old values at the end of each function
executed from the completion widget.

The conditions work on the contents of these variables, probably
changing them, they are modelled directly after the `compctl -x'
condition code:

  -prefix str
     is true if PREFIX starts with str

  -iprefix str
    like `-prefix', but makes the matched portion be
    ignored; this is done by appending the matched
    portion to IPREFIX and removing it from PREFIX

  -position beg [end]
    is true if we are currently in position `beg' (or between `beg'
    and `end' if that is given); if `end' is given COMMAND, CONTEXT,
    CURRENT, and argv are changed so that they contain only the range
    of words between these positions
    (as always when one of these condition takes an integer argument
    an expression may be given, like `-position a+1')

  -word index str
    is true if the `index'th argument is `str'

  -mword index pat
    like `-word' but with pattern matching

  -current index str
  -mcurrent index pat
    like `-word' and `-mword' but the `index' is take relative to the
    current position

  -string str
  -string index str
    true if the current word contains `str'; anything up to the
    `index'th occurrence of `str' is ignored (or anything up to the
    last occurrence if no `index' is given, again this sets IPREFIX
    and PREFIX)

  -class str
  -class index str
    like `-string' but the `str' is taken as a character class

  -words min [max]
    true if we have at least `min' arguments (and less than or equal
    to `max' arguments if that is given)

  -between s1 s2
    true if we are between an argument equal to `s1' and before an
    argument equal to `s2' (if there is such an argument)

  -mbetween p1 p2
    like `-between' but with pattern matching

  -after str
    true if we are after an argument equal to `str'

  -mafter pat
    like `-after' but with pattern matching

  -nmatches num
    true if we have generated `num' matches

Of course, tests can also be done by using the normal condition stuff
and the above variables (probably changing them), but these condition
codes may be faster and/or easier to use.

The builtins are:

complist ...

  This gets almost the same arguments as compctl, except the more
  complicated ones (like xor'ed completions, `-x', `-l', ...).
  When using this builtin the completion code uses the current values
  of the variables above, so that the combination of this builtin and
  the condition codes make life really simple...

compadd [options] matches...

  This allows access to the structure used internally used for storing 
  matches. When using this builtin the variables are not used and the
  completion code does not check if the strings added match what is
  one the command line, so you should know what you are doing.

  Supported options are:

    -q, -Q, -U, -P str, -S str, -J name, -V name
      these are used like the options with the same names in compctl and 
      complist

    -f 
      if this option is given the strings are treated like filenames
      (showing files types with LISTTYPES)

    -n
      this keeps the strings from appearing in the list of matches

    -i str
      this gives an ignored previous to use when inserting the match;
      such a string is not listed and inserted before a prefix given
      with the `-p' option

    -p str
      this gives another prefix that is not listed; but it is inserted 
      and used for testing file types

    -s str
      like `-p' but giving a suffix

  Note that this builtin is the most experimental part. Here, almost
  everything may change and many things may still be not working.

I suggest to have a look at the example file to see how all this can
be used.

Mixed comments:

- I have put the whole thing into the compctl module for now.
- I haven't used an associative array for the variables since I would
  then like to put [LR]BUFFER and so on into it and I didn't want to
  change to many parts of the shell for this first version.
  Also: using separate variables makes handling them so easy...
- When using `complist' the completion code still does normal completion 
  after `~', `=', and `$' (unless that is in IPREFIX, of course).
- Also, when using `complist' the global matches defined by `compctl -M' 
  are used, this at least should be changed one day.
- Later we may add a way to access the matches produced and to control 
  what is done with the collected data (inserting, listing, ...)
- With `complist' you can make functions be called with `-K' and `-y'
  put they can't use `read' to get at the comamnd line data. This is
  because the new style completion uses a different way to store them
  (the above parameters).
- When using conditions that change the parameter values the behavior
  may be irritating since following tests use the changed values. To
  avoid this you have to put the test into a separte function so that
  the previous state is automatically restored by the completion code
  or you have to restore the state by hand. Since I expect that many
  users will want to put all their tests for a command in one function
  (making things better readable) restoring by hand and forgetting to
  do so in the right places will become inconvenient.
- The condition codes behave a bit different from their `compctl -x'
  counterparts since they can only access the arguments (not the
  command name).
- The attentive reader of the patch will notice some hunks in zsh.h
  and in mem.c. This implement a way to re-use older heaps. In fact
  there are functions that allow one to temporarily switch to another
  heap, go back to an older heap, and to temporarily switch to another 
  heap. The patch for zsh.h implements some macros like HEAPALLOC that 
  make it easy to use this mechanism.

Whew.

Ok. Have a look at it, if you like. Play with it if you like. And then 
I would be glad about all comments, suggestions, and criticisms I get.

Like Peter I will now leave for the next two weeks, so...

  fröhliche Weihnachten und einen guten Rutsch ins neue Jahr!

Bye
 Sven

begin 600 newcomp.tar.gz
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
+?O\#D`GKB0#(``"?
`
end

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~1999-01-22 17:18 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-01-22 16:30 experimental new style completion Sven Wischnowsky
  -- strict thread matches above, loose matches on Subject: below --
1999-01-22 14:50 Sven Wischnowsky
1999-01-22 16:18 ` Phil Pennock
1999-01-22 17:09   ` Bart Schaefer
1999-01-22 13:15 Sven Wischnowsky
1999-01-21 16:07 Sven Wischnowsky
1999-01-21 12:02 Sven Wischnowsky
1999-01-21 10:53 Sven Wischnowsky
1999-01-21 10:36 Sven Wischnowsky
1999-01-07  8:02 Sven Wischnowsky
1999-01-05 15:43 Sven Wischnowsky
1999-01-07  7:36 ` Bart Schaefer
1998-12-18 15:59 Sven Wischnowsky

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).