zsh-workers
 help / color / mirror / code / Atom feed
* Re: PATCH: Re: CVS completer (Re: PATCH: Re: Completion/User functions again)
@ 1999-08-02  9:47 Sven Wischnowsky
  0 siblings, 0 replies; 9+ messages in thread
From: Sven Wischnowsky @ 1999-08-02  9:47 UTC (permalink / raw)
  To: zsh-workers


Bart Schaefer wrote:

> There's still a bug, which may be a more general completion problem:  If the
> initial prefix of the completion contains a metacharacter (such as '#') that
> is inserted quoted, the completer thereafter does not match.  E.g.
> 
> zsh% cvs add <C-d>
> F#bar F#baz
> zsh% cvs add <TAB>
> zsh% cvs add F\#<TAB>
> (BEEP)
> zsh% cvs add F\#<C-d>
> (BEEP)
> zsh% cvs add F\#<C-b><DEL><C-e>
> zsh% cvs add F#<C-d>
> F#bar F#baz
> zsh% cvs add F#<TAB>
> zsh% cvs add F\#

Indeed. Due to the changed quoting rules in the completion code, we
should do the quoting of ppre and psuf in addmatches() earlier and
avoid quoting lpre/lsuf a second time altogether.

Bye
 Sven

diff -u os/Zle/zle_tricky.c Src/Zle/zle_tricky.c
--- os/Zle/zle_tricky.c	Mon Aug  2 11:44:54 1999
+++ Src/Zle/zle_tricky.c	Mon Aug  2 11:42:26 1999
@@ -3726,7 +3726,7 @@
 addmatches(Cadata dat, char **argv)
 {
     char *s, *ms, *lipre = NULL, *lisuf = NULL, *lpre = NULL, *lsuf = NULL;
-    char **aign = NULL, **dparr = NULL, oaq = autoq;
+    char **aign = NULL, **dparr = NULL, oaq = autoq, *oppre = dat->ppre;
     char *oqp = qipre, *oqs = qisuf, qc;
     int lpl, lsl, pl, sl, bpl, bsl, llpl = 0, llsl = 0, nm = mnum;
     int oisalt = 0, isalt, isexact, doadd, ois = instring, oib = inbackt;
@@ -3847,12 +3847,21 @@
 	    else if (lisuf)
 		dat->isuf = lisuf;
 	    if (dat->ppre) {
-		dat->ppre = dupstring(dat->ppre);
+		if (!(dat->aflags & CAF_QUOTE)) {
+		    dat->ppre = quotename(dat->ppre, NULL);
+		    if ((dat->flags & CMF_FILE) &&
+			dat->ppre[0] == '\\' && dat->ppre[1] == '~')
+			chuck(dat->ppre);
+		} else
+		    dat->ppre = dupstring(dat->ppre);
 		lpl = strlen(dat->ppre);
 	    } else
 		lpl = 0;
 	    if (dat->psuf) {
-		dat->psuf = dupstring(dat->psuf);
+		if (!(dat->aflags & CAF_QUOTE))
+		    dat->psuf = quotename(dat->psuf, NULL);
+		else
+		    dat->psuf = dupstring(dat->psuf);
 		lsl = strlen(dat->psuf);
 	    } else
 		lsl = 0;
@@ -3877,7 +3886,7 @@
 		    dat->pre = dupstring(dat->pre);
 		if (dat->suf)
 		    dat->suf = dupstring(dat->suf);
-		if (!dat->prpre && (dat->prpre = dat->ppre)) {
+		if (!dat->prpre && (dat->prpre = oppre)) {
 		    singsub(&(dat->prpre));
 		    untokenize(dat->prpre);
 		} else
@@ -3901,22 +3910,6 @@
 		    dat->rems = NULL;
 		} else if (dat->rems)
 		    dat->rems = dupstring(dat->rems);
-
-		/* Probably quote the prefix and suffix for testing. */
-		if (!(dat->aflags & CAF_QUOTE)) {
-		    if (!cp && (dat->aflags & CAF_MATCH)) {
-			lpre = quotename(lpre, NULL);
-			lsuf = quotename(lsuf, NULL);
-		    }
-		    if (dat->ppre) {
-			dat->ppre = quotename(dat->ppre, NULL);
-			if ((dat->flags & CMF_FILE) &&
-			    dat->ppre[0] == '\\' && dat->ppre[1] == '~')
-			    chuck(dat->ppre);
-		    }
-		    if (dat->psuf)
-			dat->psuf = quotename(dat->psuf, NULL);
-		}
 	    }
 	    /* Walk through the matches given. */
 	    for (; (s = *argv); argv++) {

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


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

* Re: PATCH: Re: CVS completer (Re: PATCH: Re: Completion/User functions again)
  1999-07-27 14:11                     ` Tanaka Akira
@ 1999-07-28 16:05                       ` Tanaka Akira
  0 siblings, 0 replies; 9+ messages in thread
From: Tanaka Akira @ 1999-07-28 16:05 UTC (permalink / raw)
  To: zsh-workers

In article <rsqwvvmdvxe.fsf@crane.jaist.ac.jp>,
  Tanaka Akira <akr@jaist.ac.jp> writes:

> I found a problem of return status of _cvstargets, etc.

Hm. When entries has just one elements, the argument such as
'(_cvs)' is supplied to compgen -g and it is treated as glob
qualifiers. The completer should not use parenthesises in this case.

This patch also tries to complete arguments for some options.

--- Completion/User/_cvs	Wed Jul 28 14:37:08 1999
+++ Completion/User/_cvs	Wed Jul 28 14:45:23 1999
@@ -35,16 +35,17 @@
 	_cvstargets
 	;;
       annotate|ann) # "+lr:D:fR"
-	_complete_opts l '' r: '' D: '' f '' R '' || _cvstargets
+	_complete_opts l '' r: "$complete_r" D: "$complete_D" f '' R '' ||
+	_cvstargets
 	;;
       checkout|co|get) # "+ANnk:d:flRpQqcsr:D:j:P"
-	_complete_opts A '' N '' n '' k: "$complete_k" d: '' f '' l '' R ''\
-	  p '' Q '' q '' c '' s '' r: "$complete_r" D: "$complete_D" j: '' \
-	  P '' ||
+	_complete_opts A '' N '' n '' k: "$complete_k" d: '_files -/' f '' \
+	  l '' R '' p '' Q '' q '' c '' s '' r: "$complete_r" D: "$complete_D" \
+	  j: "$complete_r" P '' ||
 	_cvsrepositories
 	;;
       commit|ci|com) # "+nlRm:fF:r:"
-	_complete_opts n '' l '' R '' m: "$complete_m" f '' F: '' \
+	_complete_opts n '' l '' R '' m: "$complete_m" f '' F: _files \
 	  r: "$complete_r" ||
 	_cvstargets_modified
 	;;
@@ -56,15 +57,15 @@
 	_cvstargets_modified || _cvstargets
 	;;
       edit) # "+lRa:"
-	_complete_opts l '' R '' a: '' || _cvstargets
+	_complete_opts l '' R '' a: 'compadd edit unedit commit all none' ||
+	_cvstargets
 	;;
       editors) # "+lR"
 	_complete_opts l '' R '' || _cvstargets
 	;;
-      export|exp|ex) # "+ANnk:d:flRpQqcsr:D:j:P"
-	_complete_opts A '' N '' n '' k: "$complete_k" d: '' f '' l '' R '' \
-	  p '' Q '' q '' c '' s '' r: "$complete_r" D: "$complete_D" j: '' \
-	  P '' ||
+      export|exp|ex) # "+Nnk:d:flRQqr:D:"
+	_complete_opts N '' n '' k: "$complete_k" d: '_files -/' f '' l '' \
+	  R '' Q '' q '' r: "$complete_r" D: "$complete_D" ||
 	_cvsrepositories
 	;;
       history|hi|his) # "+Tacelow?D:b:f:m:n:p:r:t:u:x:X:z:"
@@ -74,7 +75,7 @@
 	_cvstargets
 	;;
       import|im|imp) # "+Qqdb:m:I:k:W:"
-	_complete_opts Q '' q '' d '' b: '' m: "$complete_m" I: '' \
+	_complete_opts Q '' q '' d '' b: '' m: "$complete_m" I: _files \
 	  k: "$complete_k" W: '' ||
 	case $[CURRENT-com] in
 	  1) _cvsrepositories;;
@@ -113,8 +114,8 @@
 	;;
       update|up|upd) # "+ApPflRQqduk:r:D:j:I:W:"
 	_complete_opts A '' p '' P '' f '' l '' R '' Q '' q '' d '' u '' \
-	  k: "$complete_k" r: "$complete_r" D: "$complete_D" j: '' I: '' \
-	  W: '' ||
+	  k: "$complete_k" r: "$complete_r" D: "$complete_D" j: "$complete_r" \
+	  I: '' W: '' ||
 	_cvstargets
 	;;
       watch)
@@ -126,7 +127,9 @@
 	      _complete_opts l '' R '' || _cvstargets
 	      ;;
 	    add|remove) # "+lRa:"
-	      _complete_opts l '' R '' a: '' || _cvstargets
+	      _complete_opts l '' R '' \
+	        a: 'compadd edit unedit commit all none' || \
+	      _cvstargets
 	      ;;
 	  esac
 	fi
@@ -247,11 +250,11 @@
 _cvsdirs () {
   if [[ -d ${pref}CVS ]]; then
     _cvsdirentries
-    if (( $#entries )); then
-      compgen "$@" -g '('${(j:|:)entries:q}')'
-    else
-      false
-    fi
+    case $#entries in
+      0) false;;
+      1) compgen "$@" -g "${entries:q}";;
+      *) compgen "$@" -g '('${(j:|:)entries:q}')';;
+    esac
   else
     _files
   fi
@@ -262,11 +265,11 @@
   _cvsprefix
   if [[ -d ${pref}CVS ]]; then
     _cvsentries
-    if (( $#entries )); then
-      compgen -g '('${(j:|:)entries:q}')'
-    else
-      false
-    fi
+    case $#entries in
+      0) false;;
+      1) compgen -g "${entries:q}";;
+      *) compgen -g '('${(j:|:)entries:q}')';;
+    esac
   else
     _files
   fi
@@ -277,11 +280,11 @@
   _cvsprefix
   if [[ -d ${pref}CVS ]]; then
     _cvsentries_modified
-    if (( $#entries )); then
-      compgen -g '('${(j:|:)entries:q}')'
-    else
-      false
-    fi
+    case $#entries in
+      0) false;;
+      1) compgen -g "${entries:q}";;
+      *) compgen -g '('${(j:|:)entries:q}')';;
+    esac
   else
     _files 
   fi
-- 
Tanaka Akira


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

* Re: PATCH: Re: CVS completer (Re: PATCH: Re: Completion/User functions again)
  1999-07-27 13:58                   ` Tanaka Akira
@ 1999-07-27 14:11                     ` Tanaka Akira
  1999-07-28 16:05                       ` Tanaka Akira
  0 siblings, 1 reply; 9+ messages in thread
From: Tanaka Akira @ 1999-07-27 14:11 UTC (permalink / raw)
  To: zsh-workers

In article <rsqzp0idwjv.fsf@crane.jaist.ac.jp>,
  Tanaka Akira <akr@jaist.ac.jp> writes:

> My latest version of _cvs is follows:

I found a problem of return status of _cvstargets, etc.

Index: Completion/User/_cvs
===================================================================
RCS file: /projects/zsh/zsh/Completion/User/_cvs,v
retrieving revision 1.1.1.1.2.7
diff -u -F^( -r1.1.1.1.2.7 _cvs
--- _cvs	1999/07/27 11:48:15	1.1.1.1.2.7
+++ _cvs	1999/07/27 14:10:03
@@ -249,6 +249,8 @@
     _cvsdirentries
     if (( $#entries )); then
       compgen "$@" -g '('${(j:|:)entries:q}')'
+    else
+      false
     fi
   else
     _files
@@ -262,6 +264,8 @@
     _cvsentries
     if (( $#entries )); then
       compgen -g '('${(j:|:)entries:q}')'
+    else
+      false
     fi
   else
     _files
@@ -275,6 +279,8 @@
     _cvsentries_modified
     if (( $#entries )); then
       compgen -g '('${(j:|:)entries:q}')'
+    else
+      false
     fi
   else
     _files 

-- 
Tanaka Akira


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

* Re: PATCH: Re: CVS completer (Re: PATCH: Re: Completion/User functions again)
  1999-07-27 13:49                 ` Bart Schaefer
@ 1999-07-27 13:58                   ` Tanaka Akira
  1999-07-27 14:11                     ` Tanaka Akira
  0 siblings, 1 reply; 9+ messages in thread
From: Tanaka Akira @ 1999-07-27 13:58 UTC (permalink / raw)
  To: zsh-workers

In article <990727134938.ZM26449@candle.brasslantern.com>,
  "Bart Schaefer" <schaefer@candle.brasslantern.com> writes:

> Neither 7292 nor 7293 applied cleanly to the _cvs file from 7290.  I don't
> have time this morning to attempt to figure it out.

Sorry, It's mistake.

My latest version of _cvs is follows:
------------------------------------------------------------
#compdef cvs

_cvs () {
  setopt localoptions extendedglob

  typeset -A commands
  commands=(add "ad new"            admin "adm rcs"         annotate ann
	    checkout "co get"       commit "ci com"         diff "di dif"
	    edit ""                 editors ""              export "exp ex"
	    history "hi his"        import "im imp"         init ""
	    log "lo rlog"           login "logon lgn"       logout ""
	    rdiff patch             release "re rel"        remove "rm delete"
	    status "st stat"        rtag "rt rfreeze"       tag "ta freeze"
	    unedit ""               update "up upd"         watch ""
	    watchers "")

  local com="${words[(i)(${(j:|:)${(kv)=commands}})]}"

  local showlist='compstate[list]=list; compstate[force_list]=yes'
  local showhint="$showlist ; compstate[insert]=''"
  local complete_D="compadd today yesterday week\\ ago month\\ ago"
  local complete_k="compadd kv kvl k o b v"
  local complete_r="_cvsrevisions"
  local complete_m="compadd -UX 'Enter log message' -n ''; $showhint"

  if (( com < CURRENT )); then
    case "$words[$com]" in
      add|ad|new) # "+k:m:"
	_complete_opts k: "$complete_k" m: "$complete_m" || _cvsaddp
	;;
      admin|adm|rcs) # "+ib::c:a:A:e:l::u::LUn:N:m:o:s:t::IqxV:k:"
	_complete_opts i '' b:: '' c: '' a: '' A: '' e: '' l:: '' u:: '' L '' \
	  U '' n: '' N: '' m: "$complete_m" o: '' s: '' t:: '' I '' q '' x '' \
	    V: '' k: "$complete_k" ||
	_cvstargets
	;;
      annotate|ann) # "+lr:D:fR"
	_complete_opts l '' r: '' D: '' f '' R '' || _cvstargets
	;;
      checkout|co|get) # "+ANnk:d:flRpQqcsr:D:j:P"
	_complete_opts A '' N '' n '' k: "$complete_k" d: '' f '' l '' R ''\
	  p '' Q '' q '' c '' s '' r: "$complete_r" D: "$complete_D" j: '' \
	  P '' ||
	_cvsrepositories
	;;
      commit|ci|com) # "+nlRm:fF:r:"
	_complete_opts n '' l '' R '' m: "$complete_m" f '' F: '' \
	  r: "$complete_r" ||
	_cvstargets_modified
	;;
      diff|di|dif) # "+abcdefhilnpstuw0123456789BHNRC:D:F:I:L:U:V:W:k:r:"
	_complete_opts a '' b '' c '' d '' e '' f '' h '' i '' l '' n '' p '' \
	  s '' t '' u '' w '' 0 '' 1 '' 2 '' 3 '' 4 '' 5 '' 6 '' 7 '' 8 '' \
	  9 '' B '' H '' N '' R '' C: '' D: "$complete_D" F: '' I: '' L: '' \
	  U: '' V: '' W: '' k: "$complete_k" r: "$complete_r" ||
	_cvstargets_modified || _cvstargets
	;;
      edit) # "+lRa:"
	_complete_opts l '' R '' a: '' || _cvstargets
	;;
      editors) # "+lR"
	_complete_opts l '' R '' || _cvstargets
	;;
      export|exp|ex) # "+ANnk:d:flRpQqcsr:D:j:P"
	_complete_opts A '' N '' n '' k: "$complete_k" d: '' f '' l '' R '' \
	  p '' Q '' q '' c '' s '' r: "$complete_r" D: "$complete_D" j: '' \
	  P '' ||
	_cvsrepositories
	;;
      history|hi|his) # "+Tacelow?D:b:f:m:n:p:r:t:u:x:X:z:"
	_complete_opts T '' a '' c '' e '' l '' o '' w '' \? '' \
	  D: "$complete_D" b: '' f: '' m: "$complete_m" n: '' p: '' r: '' \
	  t: '' u: '' x: '' X: '' z: '' ||
	_cvstargets
	;;
      import|im|imp) # "+Qqdb:m:I:k:W:"
	_complete_opts Q '' q '' d '' b: '' m: "$complete_m" I: '' \
	  k: "$complete_k" W: '' ||
	case $[CURRENT-com] in
	  1) _cvsrepositories;;
	  2) compadd -UX "Enter vendor tag name" -n '' && eval "$showhint";;
	  3) compadd -UX "Enter release tag name" -n '' && eval "$showhint";;
	  *) compadd -UX "No futher arguments used" -n '' && eval "$showhint";;
	  esac
	;;
      init)
	break
	;;
      login|logon|lgn|logout)
	_complete_opts || _files
	;;
      rdiff|patch|pa) # "+V:k:cuftsQqlRD:r:"
	_complete_opts V: '' k: "$complete_k" c '' u '' f '' t '' s '' Q '' \
	  q '' l '' R '' D: "$complete_D" r: "$complete_r" ||
	_cvstargets
	;;
      release|re|rel) # "+Qdq"
	_complete_opts Q '' d '' q '' || _files -/
	;;
      remove|rm|delete) # "+flR"
	_complete_opts f '' l '' R '' || _cvsremovep
	;;
      status|st|stat) # "+vlR"
	_complete_opts v '' l '' R '' || _cvstargets
	;;
      tag|ta|freeze) # "+FQqlRcdr:D:bf"
	_complete_opts F '' Q '' q '' l '' R '' c '' d '' r: "$complete_r" \
	  D: "$complete_D" b '' f '' ||
	_cvstargets
	;;
      unedit) # "+lR"
	_complete_opts l '' R '' || _cvstargets
	;;
      update|up|upd) # "+ApPflRQqduk:r:D:j:I:W:"
	_complete_opts A '' p '' P '' f '' l '' R '' Q '' q '' d '' u '' \
	  k: "$complete_k" r: "$complete_r" D: "$complete_D" j: '' I: '' \
	  W: '' ||
	_cvstargets
	;;
      watch)
	if (( CURRENT == com + 1 )); then
	  compadd on off add remove
	else
	  case "$words[com+1]" in
	    on|off) # "+lR"
	      _complete_opts l '' R '' || _cvstargets
	      ;;
	    add|remove) # "+lRa:"
	      _complete_opts l '' R '' a: '' || _cvstargets
	      ;;
	  esac
	fi
	;;
      watchers) # "+lR"
	_complete_opts l '' R '' || _cvstargets
	;;
      *) _files;;
    esac
    return
  fi

  case ${+cvs_roots} in
    0)
      cvs_roots=()
      if [[ -f ~/.cvspass ]]; then
	cvs_roots=(
	  $(cut -d ' ' -f 1 ~/.cvspass)
	)
      fi
      ;;
  esac

  _complete_opts \
    H '' Q '' q '' r '' w '' l '' n '' t '' v '' f '' a '' \
    b: "compadd /usr/local/bin" \
    T: "compadd $TMPPREFIX:h $TMPDIR /tmp" \
    e: "compadd vi" \
    d: "compadd $cvs_roots || _files -/" \
    z: "compadd 9'" \
    s: "_cvs_user_variable" \
   || 
  compadd ${(k)commands} ||
  compadd ${(kv)=commands}
}

_cvsrevisions () {
  compadd - ${${${(M)${(f)"$(cvs -q status -vl .)"}:#	*}##[ 	]##}%%[ 	]*}
}

_cvsrepositories () {
  local root=$CVSROOT
  [[ -f CVS/Root ]] && root=$(<CVS/Root)

  if [[ $root = :* || ! -d $root ]]; then
    compadd -UX "Enter repository name" -n '' &&
    { compstate[list]=list; compstate[force_list]=yes; compstate[insert]='' }
  else
    compadd - \
      $root/^CVSROOT(:t) \
      ${${(M)${(f)"$(<$root/CVSROOT/modules)"}:#[^#]*}%%[ 	]*}
  fi
}

_cvsprefix () {
  #if [[ -prefix */ ]]; then
  if [[ x"$PREFIX" == x*/* ]]; then
    qpref="${PREFIX%/*}/"
    pref=$~qpref
  else
    qpref=
    pref=./
  fi
}

_cvsdirentries () {
  setopt localoptions nullglob unset
  if [[ -f ${pref}CVS/Entries ]]; then
    entries=( ${${${(M)${(f)"$(<${pref}CVS/Entries)"}:#D/*}#D/}%%/*} )
  else
    entries=()
  fi
}

_cvsentries () {
  setopt localoptions nullglob unset
  if [[ -f ${pref}CVS/Entries ]]; then
    entries=( ${${${${(f)"$(<${pref}CVS/Entries)"}:#D}#(D|)/}%%/*} )
  else
    entries=()
  fi
}

_cvsentries_modified () {
  if (( $+_cvsentries_modified_disable_stat )) ||
    ! { zmodload -e stat || zmodload stat }; then
    _cvsentries
    return
  fi

  entries=()
  local line Entries
  typeset -A mtime

  if [[ -f "${pref}CVS/Entries" ]]; then
    Entries="$(<${pref}CVS/Entries)"
  else
    return
  fi

  local LANG=C
  local OLDTZ="$TZ"; if ! (( $+TZ )); then unset OLDTZ; fi; export TZ=GMT

  mtime=( ${(s:/:)${(j:/:)${${${${(M)${(f)Entries}:#/*}#/}%/*/*}/\\/*\\///}}} )
  entries=( ${${${(M)${(f)Entries}:#D/*}#D/}%%/*} )
  builtin stat -n +mtime -F '%a %b %e %T %Y' "$pref${(@k)^mtime}" |
  while read line
  do
    line=${line#$pref}
    if [[ x"$mtime[${line%% *}]" != x"${line#* }" ]]; then
      entries=($entries "${line%% *}")
    fi
  done

  if (( $+OLDTZ )); then TZ="$OLDTZ"; else unset TZ; fi
}

_cvsdirs () {
  if [[ -d ${pref}CVS ]]; then
    _cvsdirentries
    if (( $#entries )); then
      compgen "$@" -g '('${(j:|:)entries:q}')'
    fi
  else
    _files
  fi
}

_cvstargets () {
  local qpref pref entries
  _cvsprefix
  if [[ -d ${pref}CVS ]]; then
    _cvsentries
    if (( $#entries )); then
      compgen -g '('${(j:|:)entries:q}')'
    fi
  else
    _files
  fi
}

_cvstargets_modified () {
  local qpref pref entries
  _cvsprefix
  if [[ -d ${pref}CVS ]]; then
    _cvsentries_modified
    if (( $#entries )); then
      compgen -g '('${(j:|:)entries:q}')'
    fi
  else
    _files 
  fi
}

_cvsremovep () {
  local qpref pref entries
  _cvsprefix
  if [[ -d ${pref}CVS ]]; then
    _cvsentries
    setopt localoptions unset
    local omit
    omit=( ${pref}*(D:t) )
    eval 'entries=( ${entries:#('${(j:|:)omit:q}')} )'
    compadd -P "$qpref" - ${entries:q} ||
    _cvsdirs
  else
    _files
  fi
}

_cvsaddp () {
  local qpref pref entries
  _cvsprefix
  if [[ -d ${pref}CVS ]]; then
    _cvsentries
    setopt localoptions unset
    local all omit
    all=( ${pref}*~${pref}CVS(D:t) )
    omit=( CVS $entries ${=cvsignore} )
    [[ -r ~/.cvsignore ]] && omit=( $omit $(<~/.cvsignore) )
    [[ -r ${pref}.cvsignore ]] && omit=( $omit $(<${pref}.cvsignore) )
    compgen -g '*~(*/|)('${(j:|:)omit:q}')' ||
    { _cvsdirentries; compgen -g '('${(j:|:)entries:q}')' }
  else
    _files
  fi
}

_cvs "$@"
------------------------------------------------------------
-- 
Tanaka Akira


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

* Re: PATCH: Re: CVS completer (Re: PATCH: Re: Completion/User functions again)
  1999-07-27 11:45               ` Tanaka Akira
@ 1999-07-27 13:49                 ` Bart Schaefer
  1999-07-27 13:58                   ` Tanaka Akira
  0 siblings, 1 reply; 9+ messages in thread
From: Bart Schaefer @ 1999-07-27 13:49 UTC (permalink / raw)
  To: Tanaka Akira, zsh-workers

On Jul 27,  8:45pm, Tanaka Akira wrote:
} Subject: Re: PATCH: Re: CVS completer (Re: PATCH: Re: Completion/User func
}
} So, I removed compset -P from _cvs.

Neither 7292 nor 7293 applied cleanly to the _cvs file from 7290.  I don't
have time this morning to attempt to figure it out.

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


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

* Re: PATCH: Re: CVS completer (Re: PATCH: Re: Completion/User functions again)
  1999-07-27 10:07             ` Tanaka Akira
@ 1999-07-27 11:45               ` Tanaka Akira
  1999-07-27 13:49                 ` Bart Schaefer
  0 siblings, 1 reply; 9+ messages in thread
From: Tanaka Akira @ 1999-07-27 11:45 UTC (permalink / raw)
  To: zsh-workers

In article <rsqd7xexv75.fsf@crane.jaist.ac.jp>,
  Tanaka Akira <akr@jaist.ac.jp> writes:

> Although _cvsremovep has same problem too, this fix is not applicable
> because compgen -g does not generate nonexisting filenames.
> 
> Any ideas?

Hm. compset -P is bit dangerous for quoted characters.

is27e1u11% autoload -U compinit; compinit -D
is27e1u11% _tst () { compset -P '*/'; compadd tst }
is27e1u11% compdef _tst tst
is27e1u11% tst \#/<TAB>

Then, I get:

is27e1u11% tst \\\#/tst 

So, I removed compset -P from _cvs.

--- Completion/User/_cvs	Tue Jul 27 19:08:44 1999
+++ Completion/User/_cvs	Tue Jul 27 20:44:07 1999
@@ -196,6 +196,8 @@
   setopt localoptions nullglob unset
   if [[ -f ${pref}CVS/Entries ]]; then
     entries=( ${${${(M)${(f)"$(<${pref}CVS/Entries)"}:#D/*}#D/}%%/*} )
+  else
+    entries=()
   fi
 }
 
@@ -203,6 +205,8 @@
   setopt localoptions nullglob unset
   if [[ -f ${pref}CVS/Entries ]]; then
     entries=( ${${${${(f)"$(<${pref}CVS/Entries)"}:#D}#(D|)/}%%/*} )
+  else
+    entries=()
   fi
 }
 
@@ -213,6 +217,7 @@
     return
   fi
 
+  entries=()
   local line Entries
   typeset -A mtime
 
@@ -242,52 +247,59 @@
 _cvsdirs () {
   if [[ -d ${pref}CVS ]]; then
     _cvsdirentries
-    compadd -fW "$pref" - $entries
+    if (( $#entries )); then
+      compgen "$@" -g '('${(j:|:)entries:q}')'
+    fi
   else
-    _files -W "$pref"
+    _files
   fi
 }
 
 _cvstargets () {
   local qpref pref entries
-  _cvsprefix; compset -P '*/'
+  _cvsprefix
   if [[ -d ${pref}CVS ]]; then
     _cvsentries
-    compgen -W "$pref" -g "(${(j:|:)entries})"
+    if (( $#entries )); then
+      compgen -g '('${(j:|:)entries:q}')'
+    fi
   else
-    _files -W "$pref"
+    _files
   fi
 }
 
 _cvstargets_modified () {
   local qpref pref entries
-  _cvsprefix; compset -P '*/'
+  _cvsprefix
   if [[ -d ${pref}CVS ]]; then
     _cvsentries_modified
-    compgen -W "$pref" -g "(${(j:|:)entries})"
+    if (( $#entries )); then
+      compgen -g '('${(j:|:)entries:q}')'
+    fi
   else
-    _files -W "$pref"
+    _files 
   fi
 }
 
 _cvsremovep () {
   local qpref pref entries
-  _cvsprefix; compset -P '*/'
+  _cvsprefix
   if [[ -d ${pref}CVS ]]; then
     _cvsentries
     setopt localoptions unset
     local omit
     omit=( ${pref}*(D:t) )
-    eval 'compadd -fW "$pref" - ${entries:#('${(j:|:)omit}')}' ||
+    eval 'entries=( ${entries:#('${(j:|:)omit:q}')} )'
+    compadd -P "$qpref" - ${entries:q} ||
     _cvsdirs
   else
-    _files -W "$pref"
+    _files
   fi
 }
 
 _cvsaddp () {
   local qpref pref entries
-  _cvsprefix; compset -P '*/'
+  _cvsprefix
   if [[ -d ${pref}CVS ]]; then
     _cvsentries
     setopt localoptions unset
@@ -296,10 +308,10 @@
     omit=( CVS $entries ${=cvsignore} )
     [[ -r ~/.cvsignore ]] && omit=( $omit $(<~/.cvsignore) )
     [[ -r ${pref}.cvsignore ]] && omit=( $omit $(<${pref}.cvsignore) )
-    compgen -W "$pref" -g "*~*/(${(j:|:)omit})" ||
-    _cvsdirs
+    compgen -g '*~(*/|)('${(j:|:)omit:q}')' ||
+    { _cvsdirentries; compgen -g '('${(j:|:)entries:q}')' }
   else
-    _files -W "$pref"
+    _files
   fi
 }
 
-- 
Tanaka Akira


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

* Re: PATCH: Re: CVS completer (Re: PATCH: Re: Completion/User functions again)
  1999-07-27  7:48           ` PATCH: " Bart Schaefer
  1999-07-27  8:12             ` Peter Stephenson
@ 1999-07-27 10:07             ` Tanaka Akira
  1999-07-27 11:45               ` Tanaka Akira
  1 sibling, 1 reply; 9+ messages in thread
From: Tanaka Akira @ 1999-07-27 10:07 UTC (permalink / raw)
  To: zsh-workers

In article <990727074804.ZM25420@candle.brasslantern.com>,
  "Bart Schaefer" <schaefer@candle.brasslantern.com> writes:

> zsh% cvs add <C-d>
> F#bar F#baz
> zsh% cvs add <TAB>
> zsh% cvs add F\#<TAB>
> (BEEP)
> zsh% cvs add F\#<C-d>
> (BEEP)
> zsh% cvs add F\#<C-b><DEL><C-e>
> zsh% cvs add F#<C-d>
> F#bar F#baz
> zsh% cvs add F#<TAB>
> zsh% cvs add F\#

I tried to fix this problem by using compgen -g instead of compadd for
_cvsaddp, _cvstargets and _cvstargets_modified.

Although _cvsremovep has same problem too, this fix is not applicable
because compgen -g does not generate nonexisting filenames.

Any ideas?

--- Completion/User/_cvs	Tue Jul 27 18:16:28 1999
+++ /home/fs114/akr/arch/sunos5/usr/local/share/zsh/functions/_cvs	Tue Jul 27 19:01:03 1999
@@ -182,22 +182,14 @@
 }
 
 _cvsprefix () {
-  local f
-  qpref=$PREFIX
-  if [[ $qpref != */ ]]; then
-    if [[ $qpref = */* ]]; then
-      qpref=$qpref:h
-    else
-      qpref=
-    fi
-  fi
-  pref=$~qpref
-  if [[ ! -d "$pref" ]]; then
+  #if [[ -prefix */ ]]; then
+  if [[ x"$PREFIX" == x*/* ]]; then
+    qpref="${PREFIX%/*}/"
+    pref=$~qpref
+  else
     qpref=
-    pref=
+    pref=./
   fi
-  [[ -n "$pref" && "$pref" != */ ]] && qpref=$qpref/ pref=$pref/
-  [[ -z "$pref" ]] && pref=./
 }
 
 _cvsdirentries () {
@@ -248,56 +240,54 @@
 }
 
 _cvsdirs () {
-  local qpref pref entries
-  _cvsprefix
   if [[ -d ${pref}CVS ]]; then
     _cvsdirentries
-    compadd -fP "$qpref" -W "$pref" - $entries
+    compadd -fW "$pref" - $entries
   else
-    _files
+    _files -W "$pref"
   fi
 }
 
 _cvstargets () {
   local qpref pref entries
-  _cvsprefix
+  _cvsprefix; compset -P '*/'
   if [[ -d ${pref}CVS ]]; then
     _cvsentries
-    compadd -fP "$qpref" -W "$pref" - $entries
+    compgen -W "$pref" -g "(${(j:|:)entries})"
   else
-    _files
+    _files -W "$pref"
   fi
 }
 
 _cvstargets_modified () {
   local qpref pref entries
-  _cvsprefix
+  _cvsprefix; compset -P '*/'
   if [[ -d ${pref}CVS ]]; then
     _cvsentries_modified
-    compadd -fP "$qpref" -W "$pref" - $entries
+    compgen -W "$pref" -g "(${(j:|:)entries})"
   else
-    _files
+    _files -W "$pref"
   fi
 }
 
 _cvsremovep () {
   local qpref pref entries
-  _cvsprefix
+  _cvsprefix; compset -P '*/'
   if [[ -d ${pref}CVS ]]; then
     _cvsentries
     setopt localoptions unset
     local omit
     omit=( ${pref}*(D:t) )
-    eval 'compadd -fP "$qpref" -W "$pref" - ${entries:#('${(j:|:)omit}')}' ||
+    eval 'compadd -fW "$pref" - ${entries:#('${(j:|:)omit}')}' ||
     _cvsdirs
   else
-    _files
+    _files -W "$pref"
   fi
 }
 
 _cvsaddp () {
   local qpref pref entries
-  _cvsprefix
+  _cvsprefix; compset -P '*/'
   if [[ -d ${pref}CVS ]]; then
     _cvsentries
     setopt localoptions unset
@@ -306,10 +296,10 @@
     omit=( CVS $entries ${=cvsignore} )
     [[ -r ~/.cvsignore ]] && omit=( $omit $(<~/.cvsignore) )
     [[ -r ${pref}.cvsignore ]] && omit=( $omit $(<${pref}.cvsignore) )
-    compgen -P "$qpref" -W "$pref" -g "*~*/(${(j:|:)omit})" ||
+    compgen -W "$pref" -g "*~*/(${(j:|:)omit})" ||
     _cvsdirs
   else
-    _files
+    _files -W "$pref"
   fi
 }
 
-- 
Tanaka Akira


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

* Re: PATCH: Re: CVS completer (Re: PATCH: Re: Completion/User functions again)
  1999-07-27  7:48           ` PATCH: " Bart Schaefer
@ 1999-07-27  8:12             ` Peter Stephenson
  1999-07-27 10:07             ` Tanaka Akira
  1 sibling, 0 replies; 9+ messages in thread
From: Peter Stephenson @ 1999-07-27  8:12 UTC (permalink / raw)
  To: zsh-workers

"Bart Schaefer" wrote:
> The following simplifies some of the parameter expansions (use inner quoted
> substitutions instead of multiple (@) flags) and fixes a bug where no matches
> were generated for `cvs commit' when the `stat' module is not available (now
> you may get too many matches, but at least you get some).

I had to apply this by hand to the modified versions.  Could both of you
try

http://www.ifh.de/~pws/computing/_cvs.tar.gz

(just the _cvs* files) to see if this is correct?

-- 
Peter Stephenson <pws@ibmth.df.unipi.it>       Tel: +39 050 844536
WWW:  http://www.ifh.de/~pws/
Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy


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

* PATCH: Re: CVS completer (Re: PATCH: Re: Completion/User functions again)
  1999-07-26 17:10         ` Tanaka Akira
@ 1999-07-27  7:48           ` Bart Schaefer
  1999-07-27  8:12             ` Peter Stephenson
  1999-07-27 10:07             ` Tanaka Akira
  0 siblings, 2 replies; 9+ messages in thread
From: Bart Schaefer @ 1999-07-27  7:48 UTC (permalink / raw)
  To: zsh-workers

On Jul 27,  2:10am, Tanaka Akira wrote:
} 
} I think _cvs* are only for cvs, there is no necessity to make these
} autoloadable except _cvs.

The following simplifies some of the parameter expansions (use inner quoted
substitutions instead of multiple (@) flags) and fixes a bug where no matches
were generated for `cvs commit' when the `stat' module is not available (now
you may get too many matches, but at least you get some).  The code obviously
was attempting to generate the same output as _cvstargets but had computed
the lines in the CVS/Entries file only in the `stat'-available branch.

There's still a bug, which may be a more general completion problem:  If the
initial prefix of the completion contains a metacharacter (such as '#') that
is inserted quoted, the completer thereafter does not match.  E.g.

zsh% cvs add <C-d>
F#bar F#baz
zsh% cvs add <TAB>
zsh% cvs add F\#<TAB>
(BEEP)
zsh% cvs add F\#<C-d>
(BEEP)
zsh% cvs add F\#<C-b><DEL><C-e>
zsh% cvs add F#<C-d>
F#bar F#baz
zsh% cvs add F#<TAB>
zsh% cvs add F\#

Watch out for tabs converted to spaces in the following ...

Index: Completion/User/_cvs
===================================================================
@@ -157,7 +157,7 @@
 _cvsentries () {
   setopt localoptions nullglob unset
   if [[ -f ${pref}CVS/Entries ]]; then
-      entries=( "${(@)${(@)${(@)${(f@)$(<${pref}CVS/Entries)}:#D}#(D|)/}%%/*}" )
+      entries=( ${${${${(f)"$(<${pref}CVS/Entries)"}:#D}#(D|)/}%%/*} )
   fi
 }
 
@@ -168,26 +168,27 @@
   local line Entries
   typeset -A mtime
 
+  if [[ -f "${pref}CVS/Entries" ]]; then
+    Entries="$(<${pref}CVS/Entries)"
+  fi
+
   if ! zmodload -e stat; then zmodload stat; fi
   if zmodload -e stat; then
-    if [[ -f "${pref}CVS/Entries" ]]; then
-      Entries="$(<${pref}CVS/Entries)"
-      mtime=( "${(@s:/:)${(j:/:)${(@)${(@)${(@)${(M@)${(f@)Entries}:#/*}#/}%/*/*}/\/*\///}}}" )
-      entries=( "${(@)${(@)${(M@)${(f@)Entries}:#D/*}#D/}%%/*}" )
-      builtin stat -n +mtime -F '%a %b %e %T %Y' "$pref${(@k)^mtime}" |
-      while read line
-      do
-	line=${line#$pref}
-	if [[ x"$mtime[${line%% *}]" == x"${line#* }" ]]; then
-	  #print up-to-date "${line%% *}"
-	else
-	  #print locally-modified "${line%% *}"
-	  entries=($entries "${line%% *}")
-	fi
-      done
-    fi
+    mtime=( ${(s:/:)${(j:/:)${${${${(M)${(f)Entries}:#/*}#/}%/*/*}/\\/*\\///}}} )
+    entries=( ${${${(M)${(f)Entries}:#D/*}#D/}%%/*} )
+    builtin stat -n +mtime -F '%a %b %e %T %Y' "$pref${(@k)^mtime}" |
+    while read line
+    do
+      line=${line#$pref}
+      if [[ x"$mtime[${line%% *}]" == x"${line#* }" ]]; then
+        #print up-to-date "${line%% *}"
+      else
+        #print locally-modified "${line%% *}"
+        entries=($entries "${line%% *}")
+      fi
+    done
   else
-    entries=( "${(@)${(@)${(@)${(f@)Entries}:#D}#(D|)/}%%/*}" )
+    entries=( ${${${${(f)Entries}:#D}#(D|)/}%%/*} )
   fi
 
   if (( $+OLDTZ )); then TZ="$OLDTZ"; else unset TZ; fi
@@ -210,7 +211,7 @@
 }
 
 _cvsrevisions () {
-  compadd - "${(@)${(@)${(@M)${(@f)$(cvs -q status -vl .)}:#	*}##[ 	]##}%%[ 	]*}"
+  compadd - ${${${(M)${(f)"$(cvs -q status -vl .)"}:#	*}##[ 	]##}%%[ 	]*}
 }
 
 _cvsrepositories () {
@@ -222,7 +223,7 @@
   else
     compadd - \
       $root/^CVSROOT(:t) \
-      "${(@)${(@M)${(@f)$(<$root/CVSROOT/modules)}:#[^#]*}%%[ 	]*}"
+      ${${(M)${(f)"$(<$root/CVSROOT/modules)"}:#[^#]*}%%[ 	]*}
   fi
 }
 


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


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

end of thread, other threads:[~1999-08-02  9:47 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-08-02  9:47 PATCH: Re: CVS completer (Re: PATCH: Re: Completion/User functions again) Sven Wischnowsky
  -- strict thread matches above, loose matches on Subject: below --
1999-07-21 11:27 Sven Wischnowsky
1999-07-21 15:54 ` Bart Schaefer
1999-07-25  9:23   ` Tanaka Akira
1999-07-26  4:48     ` Tanaka Akira
1999-07-26 16:26       ` Tanaka Akira
1999-07-26 17:10         ` Tanaka Akira
1999-07-27  7:48           ` PATCH: " Bart Schaefer
1999-07-27  8:12             ` Peter Stephenson
1999-07-27 10:07             ` Tanaka Akira
1999-07-27 11:45               ` Tanaka Akira
1999-07-27 13:49                 ` Bart Schaefer
1999-07-27 13:58                   ` Tanaka Akira
1999-07-27 14:11                     ` Tanaka Akira
1999-07-28 16:05                       ` Tanaka Akira

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).