On Wednesday 17 August 2005 04:22, Mikael Magnusson wrote:
> However, when
> i make these things directories instead of files, cd <tab><tab>
> doesn't add any trailing slashes. If i mkdir Øa Øb aa ab, then cd
> <tab><tab><tab> and so on adds trailing slashes after aa and ab, but
> not the first two. (with the same zsh -f sequence as earlier)
This makes ztat() unmetafy its argument; it effectively reverts 21631 (ztat()
was called in several places). This fixes this issue for me (also some others
like zstyle ignore-parents parent).
Index: Src/Zle/compcore.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/compcore.c,v
retrieving revision 1.75
diff -u -p -r1.75 compcore.c
--- Src/Zle/compcore.c 16 Aug 2005 17:25:49 -0000 1.75
+++ Src/Zle/compcore.c 18 Aug 2005 16:44:07 -0000
@@ -2471,24 +2471,17 @@ add_match_data(int alt, char *str, char
cm->modec = '\0';
if ((flags & CMF_FILE) && orig[0] && orig[strlen(orig) - 1] != '/') {
struct stat buf;
- char *pb, *blah;
- int blahl;
+ char *pb;
pb = (char *) zhalloc((cm->prpre ? strlen(cm->prpre) : 0) +
3 + strlen(orig));
sprintf(pb, "%s%s", (cm->prpre ? cm->prpre : "./"), orig);
- blah = ztrdup(pb);
-
- unmetafy(blah, &blahl);
-
- if (!ztat(blah, &buf, 1)) {
+ if (!ztat(pb, &buf, 1)) {
cm->mode = buf.st_mode;
if ((cm->modec = file_type(buf.st_mode)) == ' ')
cm->modec = '\0';
}
-
- free(blah);
}
if ((*compqstack == '\\' && compqstack[1]) ||
(autoq && *compqstack && compqstack[1] == '\\'))
Index: Src/Zle/compresult.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/compresult.c,v
retrieving revision 1.56
diff -u -p -r1.56 compresult.c
--- Src/Zle/compresult.c 10 Aug 2005 19:51:30 -0000 1.56
+++ Src/Zle/compresult.c 18 Aug 2005 16:44:08 -0000
@@ -849,27 +849,33 @@ do_ambiguous(void)
* parameter says if we have to do lstat() or stat(). I think this *
* should instead be done by use of a general function to expand a *
* filename (stripping backslashes), combined with the actual *
- * (l)stat(). */
+ * (l)stat(). *
+ * Make sure input is unmetafied */
/**/
mod_export int
ztat(char *nam, struct stat *buf, int ls)
{
- if (!(ls ? lstat(nam, buf) : stat(nam, buf)))
- return 0;
- else {
- char *p;
- VARARR(char, b, strlen(nam) + 1);
+ int ret;
- for (p = b; *nam; nam++)
- if (*nam == '\\' && nam[1])
- *p++ = *++nam;
+ nam = unmeta(nam);
+ if (!nam)
+ return -1;
+
+ if ((ret = ls ? lstat(nam, buf) : stat(nam, buf))) {
+ char *p, *q;
+
+ for (p = q = nam; *q; q++)
+ if (*q == '\\' && q[1])
+ *p++ = *++q;
else
- *p++ = *nam;
+ *p++ = *q;
*p = '\0';
- return ls ? lstat(b, buf) : stat(b, buf);
+ ret = ls ? lstat(nam, buf) : stat(nam, buf);
}
+
+ return ret;
}
/* Insert all matches in the command line. */
Attachment:
pgpH9CZNeCS0c.pgp
Description: PGP signature