* Bug in _approximate with ~/ @ 2001-08-16 15:54 martin.ebourne 2001-08-16 17:45 ` Bart Schaefer 0 siblings, 1 reply; 5+ messages in thread From: martin.ebourne @ 2001-08-16 15:54 UTC (permalink / raw) To: zsh-workers Hi, I think I've found a weird bug in _approximate. This reproduces it: % zsh -f Thu 16 Aug 2001 16:51:12 % echo $ZSH_VERSION 4.0.2 % autoload -U compinit % compinit % zstyle ":completion:*" completer _complete _approximate % mkdir -p ~/test/test{1,2} % ~/test/f Press tab immediately after the 'f', and I get: % \! \! * - . 0 1 : @ X \[ e r test1/ test2/ w \{ \} ~/test/f Which wasn't quite what I expected! ;) Cheers, Martin. This e-mail message is CONFIDENTIAL and may contain legally privileged information. If you are not the intended recipient you should not read, copy, distribute, disclose or otherwise use the information in this e-mail. Please also telephone or fax us immediately and delete the message from your system. E-mail may be susceptible to data corruption, interception and unauthorised amendment, and we do not accept liability for any such corruption, interception or amendment or the consequences thereof. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Bug in _approximate with ~/ 2001-08-16 15:54 Bug in _approximate with ~/ martin.ebourne @ 2001-08-16 17:45 ` Bart Schaefer 2001-08-17 9:16 ` Sven Wischnowsky 0 siblings, 1 reply; 5+ messages in thread From: Bart Schaefer @ 2001-08-16 17:45 UTC (permalink / raw) To: martin.ebourne, zsh-workers On Aug 16, 4:54pm, martin.ebourne@arcordia.com wrote: } Subject: Bug in _approximate with ~/ } } % zstyle ":completion:*" completer _complete _approximate } % mkdir -p ~/test/test{1,2} } % ~/test/f } } Press tab immediately after the 'f', and I get: } } % \! } \! * - . 0 1 : @ X \[ } e r test1/ test2/ w \{ \} } ~/test/f } } Which wasn't quite what I expected! ;) ~/test/f is in command position. Therefore it gets compared to parameter names, reserved words, aliases, command names, file names, job specifiers (%1, %2, etc.), and some other things I've forgotten. It doesn't match any of the above, so you get offered a bunch of possibilites, some from each of those sources. If you were to menu-complete through the list so that you could see the suffixes that get auto-appended to each one, you'd get some idea where they came from; for example, X e r w : - and dot are commands. In _approximate there's this snippet: ### This distinction doesn't seem to be needed anymore # if [[ "$PREFIX" = \~*/* ]]; then # PREFIX="${PREFIX%%/*}/(#a${_comp_correct})${PREFIX#*/}" # else PREFIX="(#a${_comp_correct})$PREFIX" # fi This results in a PREFIX that looks like `(#a1)~/test/f'. _path_files does the right thing with this -- it peels off the (#a1), expands the tilde, and then applies (#a1) to each path element. However, none of the other completions that are attempted in command position are this intelligent -- they all interpret `(#a1)~/test/f' as `(#a1)()~/test/f', that is, allow one correction to the empty string as long as that does not match `/test/f'. Consequently you get all the one-letter commands, parameters, reserved words, etc. You're right, this is a bug. -- Bart Schaefer Brass Lantern Enterprises http://www.well.com/user/barts http://www.brasslantern.com Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Bug in _approximate with ~/ 2001-08-16 17:45 ` Bart Schaefer @ 2001-08-17 9:16 ` Sven Wischnowsky 2001-08-17 14:36 ` Bart Schaefer 0 siblings, 1 reply; 5+ messages in thread From: Sven Wischnowsky @ 2001-08-17 9:16 UTC (permalink / raw) To: zsh-workers Bart Schaefer wrote: > ... > > This results in a PREFIX that looks like `(#a1)~/test/f'. _path_files > does the right thing with this -- it peels off the (#a1), expands the > tilde, and then applies (#a1) to each path element. However, none of > the other completions that are attempted in command position are this > intelligent -- they all interpret `(#a1)~/test/f' as `(#a1)()~/test/f', > that is, allow one correction to the empty string as long as that does > not match `/test/f'. Consequently you get all the one-letter commands, > parameters, reserved words, etc. > > You're right, this is a bug. Hmhm. To be fixed in C-code where the globbing flags are moved farther into the prefix if needed. This also made me notice a slightly wrong test in _path_files. Bye Sven Index: Completion/Unix/Type/_path_files =================================================================== RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_path_files,v retrieving revision 1.10 diff -u -r1.10 _path_files --- Completion/Unix/Type/_path_files 2001/08/13 10:57:44 1.10 +++ Completion/Unix/Type/_path_files 2001/08/17 09:13:31 @@ -653,7 +653,7 @@ if zstyle -t ":completion:${curcontext}:paths" expand prefix && [[ nm -eq compstate[nmatches] && $#exppaths -ne 0 && - "$exppaths" != "$eorig" ]]; then + "$linepath$exppaths" != "$eorig" ]]; then PREFIX="${opre}" SUFFIX="${osuf}" compadd -Q "$mopts[@]" -S '' -M "r:|/=* r:|=*" -p "$linepath" -a exppaths Index: Src/Zle/compcore.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Zle/compcore.c,v retrieving revision 1.48 diff -u -r1.48 compcore.c --- Src/Zle/compcore.c 2001/07/25 10:45:59 1.48 +++ Src/Zle/compcore.c 2001/08/17 09:13:32 @@ -1782,21 +1782,23 @@ } else lsl = 0; if (dat->aflags & CAF_MATCH) { - int ml, gfl = 0; + int ml, gfl = 0, tildepat = 0; char *globflag = NULL; if (comppatmatch && *comppatmatch && - dat->ppre && lpre[0] == '(' && lpre[1] == '#') { + lpre[0] == '(' && lpre[1] == '#') { char *p; for (p = lpre + 2; *p && *p != ')'; p++); - if (*p == ')') { + if (*p == ')' && (dat->ppre || p[1] == '~')) { char sav = p[1]; p[1] = '\0'; globflag = dupstring(lpre); gfl = p - lpre + 1; + if (!dat->ppre) + tildepat = 1; p[1] = sav; lpre = p + 1; @@ -1859,7 +1861,11 @@ int is = (*comppatmatch == '*'); char *tmp = (char *) zhalloc(2 + llpl + llsl + gfl); - if (gfl) { + if (tildepat) { + tmp[0] = '~'; + strcpy(tmp + 1, globflag); + strcat(tmp, lpre + 1); + } else if (gfl) { strcpy(tmp, globflag); strcat(tmp, lpre); } else -- Sven Wischnowsky wischnow@informatik.hu-berlin.de ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Bug in _approximate with ~/ 2001-08-17 9:16 ` Sven Wischnowsky @ 2001-08-17 14:36 ` Bart Schaefer 2001-08-20 13:11 ` Sven Wischnowsky 0 siblings, 1 reply; 5+ messages in thread From: Bart Schaefer @ 2001-08-17 14:36 UTC (permalink / raw) To: Sven Wischnowsky, zsh-workers On Aug 17, 11:16am, Sven Wischnowsky wrote: } } Bart Schaefer wrote: } } > the other completions that are attempted in command position are this } > intelligent -- they all interpret `(#a1)~/test/f' as `(#a1)()~/test/f', } > that is, allow one correction to the empty string as long as that does } > not match `/test/f'. Consequently you get all the one-letter commands, } } Hmhm. To be fixed in C-code where the globbing flags are moved } farther into the prefix if needed. Is that really right? What if I actually type `(#a1)~/test/f' before I hit TAB? -- Bart Schaefer Brass Lantern Enterprises http://www.well.com/user/barts http://www.brasslantern.com Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Bug in _approximate with ~/ 2001-08-17 14:36 ` Bart Schaefer @ 2001-08-20 13:11 ` Sven Wischnowsky 0 siblings, 0 replies; 5+ messages in thread From: Sven Wischnowsky @ 2001-08-20 13:11 UTC (permalink / raw) To: zsh-workers Bart Schaefer wrote: > On Aug 17, 11:16am, Sven Wischnowsky wrote: > } > } Bart Schaefer wrote: > } > } > the other completions that are attempted in command position are this > } > intelligent -- they all interpret `(#a1)~/test/f' as `(#a1)()~/test/f', > } > that is, allow one correction to the empty string as long as that does > } > not match `/test/f'. Consequently you get all the one-letter commands, > } > } Hmhm. To be fixed in C-code where the globbing flags are moved > } farther into the prefix if needed. > > Is that really right? What if I actually type `(#a1)~/test/f' before I > hit TAB? Hrmpf, yes, I always forget that one might type something like that by hand. Still, since _approximate works by faking a different PREFIX, some things will never be possible, I fear. All this will become more manageable when all of this stuff is in shell code, I hope. Bye Sven Index: Completion/Base/Completer/_approximate =================================================================== RCS file: /cvsroot/zsh/zsh/Completion/Base/Completer/_approximate,v retrieving revision 1.5 diff -u -r1.5 _approximate --- Completion/Base/Completer/_approximate 2001/08/16 08:07:42 1.5 +++ Completion/Base/Completer/_approximate 2001/08/20 13:09:25 @@ -49,15 +49,16 @@ if (( ! $+functions[compadd] )); then compadd() { + local ppre="$argv[(I)-p]" + [[ ${argv[(I)-[a-zA-Z]#U[a-zA-Z]#]} -eq 0 && "${#:-$PREFIX$SUFFIX}" -le _comp_correct ]] && return - ### This distinction doesn't seem to be needed anymore - # if [[ "$PREFIX" = \~*/* ]]; then - # PREFIX="${PREFIX%%/*}/(#a${_comp_correct})${PREFIX#*/}" - # else + if [[ "$PREFIX" = \~* && ( ppre -eq 0 || "$argv[ppre+1]" != \~* ) ]]; then + PREFIX="~(#a${_comp_correct})${PREFIX[2,-1]}" + else PREFIX="(#a${_comp_correct})$PREFIX" - # fi + fi (( $_correct_group && $argv[(I)-*[JV]] )) && _correct_expl[_correct_group]=${argv[(R)-*[JV]]} Index: Src/Zle/compcore.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Zle/compcore.c,v retrieving revision 1.49 diff -u -r1.49 compcore.c --- Src/Zle/compcore.c 2001/08/17 09:25:22 1.49 +++ Src/Zle/compcore.c 2001/08/20 13:09:26 @@ -1782,23 +1782,21 @@ } else lsl = 0; if (dat->aflags & CAF_MATCH) { - int ml, gfl = 0, tildepat = 0; + int ml, gfl = 0; char *globflag = NULL; if (comppatmatch && *comppatmatch && - lpre[0] == '(' && lpre[1] == '#') { + dat->ppre && lpre[0] == '(' && lpre[1] == '#') { char *p; for (p = lpre + 2; *p && *p != ')'; p++); - if (*p == ')' && (dat->ppre || p[1] == '~')) { + if (*p == ')') { char sav = p[1]; p[1] = '\0'; globflag = dupstring(lpre); gfl = p - lpre + 1; - if (!dat->ppre) - tildepat = 1; p[1] = sav; lpre = p + 1; @@ -1861,11 +1859,7 @@ int is = (*comppatmatch == '*'); char *tmp = (char *) zhalloc(2 + llpl + llsl + gfl); - if (tildepat) { - tmp[0] = '~'; - strcpy(tmp + 1, globflag); - strcat(tmp, lpre + 1); - } else if (gfl) { + if (gfl) { strcpy(tmp, globflag); strcat(tmp, lpre); } else -- Sven Wischnowsky wischnow@informatik.hu-berlin.de ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2001-08-20 13:12 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2001-08-16 15:54 Bug in _approximate with ~/ martin.ebourne 2001-08-16 17:45 ` Bart Schaefer 2001-08-17 9:16 ` Sven Wischnowsky 2001-08-17 14:36 ` Bart Schaefer 2001-08-20 13:11 ` 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).