* disowning stopped jobs @ 2001-06-25 9:00 Sven Wischnowsky 2001-06-25 9:12 ` Thomas Köhler 2001-06-25 15:08 ` Bart Schaefer 0 siblings, 2 replies; 10+ messages in thread From: Sven Wischnowsky @ 2001-06-25 9:00 UTC (permalink / raw) To: zsh-workers If one tries bash-2.04: % sleep 80 ^Z [1]+ Stopped sleep 80 % disown %1 bash: warning: deleting stopped job 1 with process group 988 I.e., it prints what Bart suggested we should print. I answered that by saying that this is slightly more complicated for us because there may also be a sub-job to be continued in such cases. Maybe we can `solve' (or, rather, circumvent) this problem by being more verbose, saying `warning: job is stopped, use `kill -CONT ...' to resume'. That way, users can even use cut&paste to make the job running. Below is a patch for this, which I won't commit until I get positive replies. Any better wording? Should we print the `kill ...' indented on its own line? (The list of pids can get a bit longer, because the patch makes it use the same loops used by killjb() for super-jobs where we send all processes the CONT signal.) Bye Sven diff -ur -r ../oz/Src/jobs.c ./Src/jobs.c --- ../oz/Src/jobs.c Sat Jun 23 22:12:56 2001 +++ ./Src/jobs.c Sat Jun 23 22:42:33 2001 @@ -1392,14 +1392,36 @@ printjob(job + jobtab, lng, 2); break; case BIN_DISOWN: - if (jobtab[job].stat & STAT_STOPPED) + if (jobtab[job].stat & STAT_STOPPED) { + char buf[20], *pids = ""; + + if (jobtab[job].stat & STAT_SUPERJOB) { + Process pn; + + for (pn = jobtab[jobtab[job].other].procs; pn; pn = pn->next) { + sprintf(buf, " -%d", pn->pid); + pids = dyncat(pids, buf); + } + for (pn = jobtab[job].procs; pn->next; pn = pn->next) { + sprintf(buf, " %d", pn->pid); + pids = dyncat(pids, buf); + } + if (!jobtab[jobtab[job].other].procs && pn) { + sprintf(buf, " %d", pn->pid); + pids = dyncat(pids, buf); + } + } else { + sprintf(buf, " -%d", jobtab[job].gleader); + pids = buf; + } zwarnnam(name, #ifdef USE_SUSPENDED - "warning: job is suspended", + "warning: job is suspended, use `kill -CONT%s' to resume", #else - "warning: job is stopped", + "warning: job is stopped, use `kill -CONT%s' to resume", #endif - NULL, 0); + pids, 0); + } deletejob(jobtab + job); break; } -- Sven Wischnowsky wischnow@informatik.hu-berlin.de ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: disowning stopped jobs 2001-06-25 9:00 disowning stopped jobs Sven Wischnowsky @ 2001-06-25 9:12 ` Thomas Köhler 2001-06-25 9:17 ` Sven Wischnowsky 2001-06-25 15:08 ` Bart Schaefer 1 sibling, 1 reply; 10+ messages in thread From: Thomas Köhler @ 2001-06-25 9:12 UTC (permalink / raw) To: zsh-workers [-- Attachment #1: Type: text/plain, Size: 3094 bytes --] On Mon, Jun 25, 2001 at 11:00:56AM +0200, Sven Wischnowsky <wischnow@informatik.hu-berlin.de> wrote: > If one tries bash-2.04: > > % sleep 80 > ^Z > [1]+ Stopped sleep 80 > % disown %1 > bash: warning: deleting stopped job 1 with process group 988 > > I.e., it prints what Bart suggested we should print. I answered that by > saying that this is slightly more complicated for us because there may > also be a sub-job to be continued in such cases. > > Maybe we can `solve' (or, rather, circumvent) this problem by being more > verbose, saying `warning: job is stopped, use `kill -CONT ...' to resume'. > That way, users can even use cut&paste to make the job running. Good idea, IMHO. > Below is a patch for this, which I won't commit until I get positive > replies. Well, I just have a minor quetion, see at end. [...] > diff -ur -r ../oz/Src/jobs.c ./Src/jobs.c > --- ../oz/Src/jobs.c Sat Jun 23 22:12:56 2001 > +++ ./Src/jobs.c Sat Jun 23 22:42:33 2001 > @@ -1392,14 +1392,36 @@ > printjob(job + jobtab, lng, 2); > break; > case BIN_DISOWN: > - if (jobtab[job].stat & STAT_STOPPED) > + if (jobtab[job].stat & STAT_STOPPED) { > + char buf[20], *pids = ""; > + > + if (jobtab[job].stat & STAT_SUPERJOB) { > + Process pn; > + > + for (pn = jobtab[jobtab[job].other].procs; pn; pn = pn->next) { > + sprintf(buf, " -%d", pn->pid); > + pids = dyncat(pids, buf); > + } > + for (pn = jobtab[job].procs; pn->next; pn = pn->next) { > + sprintf(buf, " %d", pn->pid); > + pids = dyncat(pids, buf); > + } > + if (!jobtab[jobtab[job].other].procs && pn) { > + sprintf(buf, " %d", pn->pid); > + pids = dyncat(pids, buf); > + } > + } else { > + sprintf(buf, " -%d", jobtab[job].gleader); > + pids = buf; > + } > zwarnnam(name, > #ifdef USE_SUSPENDED > - "warning: job is suspended", > + "warning: job is suspended, use `kill -CONT%s' to resume", ^^ > #else > - "warning: job is stopped", > + "warning: job is stopped, use `kill -CONT%s' to resume", ^^ > #endif > - NULL, 0); > + pids, 0); > + } > deletejob(jobtab + job); > break; > } Shouldn't there be a space between 'T' and '%' in the marked places? Or does "pids" contain a space at the beginning? (Just thrown in because it looks strange, I don't really know anything about that "pids" variable, what does dyncat() do to it?) Ciao, Thomas -- Thomas Köhler Email: jean-luc@picard.franken.de | LCARS - Linux <>< WWW: http://jeanluc-picard.de | for Computers IRC: jeanluc | on All Real PGP public key available from Homepage! | Starships [-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: disowning stopped jobs 2001-06-25 9:12 ` Thomas Köhler @ 2001-06-25 9:17 ` Sven Wischnowsky 2001-06-25 9:25 ` Thomas Köhler 0 siblings, 1 reply; 10+ messages in thread From: Sven Wischnowsky @ 2001-06-25 9:17 UTC (permalink / raw) To: zsh-workers [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain, Size: 685 bytes --] Thomas Köhler wrote: > ... > > Shouldn't there be a space between 'T' and '%' in the marked places? > Or does "pids" contain a space at the beginning? It does, look at the sprintf()s, they all have a space at the beginning so that concatenating them with dyncat() makes it look right and we don't have a space at the end of the string. > (Just thrown in because it looks strange, I don't really know anything > about that "pids" variable, what does dyncat() do to it?) It concatenates its arguments in `dynamic' memory, i.e., in heap-allocated memory (a zsh heap, not the system-heap). Bye Sven -- Sven Wischnowsky wischnow@informatik.hu-berlin.de ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: disowning stopped jobs 2001-06-25 9:17 ` Sven Wischnowsky @ 2001-06-25 9:25 ` Thomas Köhler 0 siblings, 0 replies; 10+ messages in thread From: Thomas Köhler @ 2001-06-25 9:25 UTC (permalink / raw) To: zsh-workers [-- Attachment #1: Type: text/plain, Size: 1180 bytes --] On Mon, Jun 25, 2001 at 11:17:58AM +0200, Sven Wischnowsky <wischnow@informatik.hu-berlin.de> wrote: > Thomas Köhler wrote: > > > ... > > > > Shouldn't there be a space between 'T' and '%' in the marked places? > > Or does "pids" contain a space at the beginning? > > It does, look at the sprintf()s, they all have a space at the beginning > so that concatenating them with dyncat() makes it look right and we > don't have a space at the end of the string. Ah, alright. So looks like all is fine then. Thanks for explaining :-) > > (Just thrown in because it looks strange, I don't really know anything > > about that "pids" variable, what does dyncat() do to it?) > > It concatenates its arguments in `dynamic' memory, i.e., in > heap-allocated memory (a zsh heap, not the system-heap). Ah. Perhaps worth a look some time... > Bye > Sven Ciao, Thomas -- Thomas Köhler Email: jean-luc@picard.franken.de | LCARS - Linux <>< WWW: http://jeanluc-picard.de | for Computers IRC: jeanluc | on All Real PGP public key available from Homepage! | Starships [-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: disowning stopped jobs 2001-06-25 9:00 disowning stopped jobs Sven Wischnowsky 2001-06-25 9:12 ` Thomas Köhler @ 2001-06-25 15:08 ` Bart Schaefer 2001-06-26 8:15 ` PATCH: " Sven Wischnowsky 1 sibling, 1 reply; 10+ messages in thread From: Bart Schaefer @ 2001-06-25 15:08 UTC (permalink / raw) To: zsh-workers On Jun 25, 11:00am, Sven Wischnowsky wrote: } Subject: disowning stopped jobs } } Maybe we can `solve' (or, rather, circumvent) this problem by being more } verbose, saying `warning: job is stopped, use `kill -CONT ...' to resume'. } That way, users can even use cut&paste to make the job running. } } Any better wording? Should we print the `kill ...' indented on its own } line? I think it's OK as it is, at least until we get some empirical feedback. What about my other suggestion, that `%job &!' should use `bg' and then handle the job table in exec.c ? -- 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] 10+ messages in thread
* PATCH: Re: disowning stopped jobs 2001-06-25 15:08 ` Bart Schaefer @ 2001-06-26 8:15 ` Sven Wischnowsky 2001-06-26 8:19 ` Sven Wischnowsky ` (2 more replies) 0 siblings, 3 replies; 10+ messages in thread From: Sven Wischnowsky @ 2001-06-26 8:15 UTC (permalink / raw) To: zsh-workers Bart Schaefer wrote: > On Jun 25, 11:00am, Sven Wischnowsky wrote: > } Subject: disowning stopped jobs > } > } Maybe we can `solve' (or, rather, circumvent) this problem by being more > } verbose, saying `warning: job is stopped, use `kill -CONT ...' to resume'. > } That way, users can even use cut&paste to make the job running. > } > } Any better wording? Should we print the `kill ...' indented on its own > } line? > > I think it's OK as it is, at least until we get some empirical feedback. Fine, I'm going to commit it to the development branch, should it go into 4.0.2, too? > What about my other suggestion, that `%job &!' should use `bg' and then > handle the job table in exec.c ? I looked into this shortly, it would require us to export getjob() and then should be relatively simple. But. Just had an idea. Why not give an option to disown, say `-c' for `continue', that makes it wake up stopped jobs before disowning them? With that, users could alias `disown' to `disown -c' to never have to worry about that anymore and in execcmd() we just would have to stick the `-c' into the list. Bye Sven Index: Src/jobs.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/jobs.c,v retrieving revision 1.11 diff -u -r1.11 jobs.c --- Src/jobs.c 2001/05/29 09:49:58 1.11 +++ Src/jobs.c 2001/06/26 08:12:37 @@ -1392,14 +1392,36 @@ printjob(job + jobtab, lng, 2); break; case BIN_DISOWN: - if (jobtab[job].stat & STAT_STOPPED) + if (jobtab[job].stat & STAT_STOPPED) { + char buf[20], *pids = ""; + + if (jobtab[job].stat & STAT_SUPERJOB) { + Process pn; + + for (pn = jobtab[jobtab[job].other].procs; pn; pn = pn->next) { + sprintf(buf, " -%d", pn->pid); + pids = dyncat(pids, buf); + } + for (pn = jobtab[job].procs; pn->next; pn = pn->next) { + sprintf(buf, " %d", pn->pid); + pids = dyncat(pids, buf); + } + if (!jobtab[jobtab[job].other].procs && pn) { + sprintf(buf, " %d", pn->pid); + pids = dyncat(pids, buf); + } + } else { + sprintf(buf, " -%d", jobtab[job].gleader); + pids = buf; + } zwarnnam(name, #ifdef USE_SUSPENDED - "warning: job is suspended", + "warning: job is suspended, use `kill -CONT%s' to resume", #else - "warning: job is stopped", + "warning: job is stopped, use `kill -CONT%s' to resume", #endif - NULL, 0); + pids, 0); + } deletejob(jobtab + job); break; } -- Sven Wischnowsky wischnow@informatik.hu-berlin.de ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH: Re: disowning stopped jobs 2001-06-26 8:15 ` PATCH: " Sven Wischnowsky @ 2001-06-26 8:19 ` Sven Wischnowsky 2001-06-26 16:40 ` Bart Schaefer 2001-10-10 2:40 ` Clint Adams 2 siblings, 0 replies; 10+ messages in thread From: Sven Wischnowsky @ 2001-06-26 8:19 UTC (permalink / raw) To: zsh-workers I wrote: > ... > > I looked into this shortly, it would require us to export getjob() and > then should be relatively simple. But. Just had an idea. Why not give > an option to disown, say `-c' for `continue', that makes it wake up > stopped jobs before disowning them? With that, users could alias > `disown' to `disown -c' to never have to worry about that anymore and in > execcmd() we just would have to stick the `-c' into the list. Err... of course users could already write their own little functions that call bg, then disown to get that. But it still seems useful to make this as convenient as possible -- maybe a setopt option (didn't someone suggest this lately?). Bye Sven -- Sven Wischnowsky wischnow@informatik.hu-berlin.de ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH: Re: disowning stopped jobs 2001-06-26 8:15 ` PATCH: " Sven Wischnowsky 2001-06-26 8:19 ` Sven Wischnowsky @ 2001-06-26 16:40 ` Bart Schaefer 2001-06-27 11:18 ` Sven Wischnowsky 2001-10-10 2:40 ` Clint Adams 2 siblings, 1 reply; 10+ messages in thread From: Bart Schaefer @ 2001-06-26 16:40 UTC (permalink / raw) To: zsh-workers On Jun 26, 10:15am, Sven Wischnowsky wrote: } Subject: PATCH: Re: disowning stopped jobs } } Just had an idea. Why not give an option to disown, say `-c' for } `continue', that makes it wake up stopped jobs before disowning them? I think I'd rather have a setopt, as presently `-c' would be interpreted by disown as a job spec. However, I don't feel strongly about it. -- 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] 10+ messages in thread
* Re: PATCH: Re: disowning stopped jobs 2001-06-26 16:40 ` Bart Schaefer @ 2001-06-27 11:18 ` Sven Wischnowsky 0 siblings, 0 replies; 10+ messages in thread From: Sven Wischnowsky @ 2001-06-27 11:18 UTC (permalink / raw) To: zsh-workers Bart Schaefer wrote: > On Jun 26, 10:15am, Sven Wischnowsky wrote: > } Subject: PATCH: Re: disowning stopped jobs > } > } Just had an idea. Why not give an option to disown, say `-c' for > } `continue', that makes it wake up stopped jobs before disowning them? > > I think I'd rather have a setopt, as presently `-c' would be interpreted > by disown as a job spec. However, I don't feel strongly about it. Hm, I was thinking the same after I'd sent that. Here is the patch, adding the option `AUTO_CONTINUE' (any better name?). It also makes the `%foo &!' and `%foo &|' forms make the job running automatically, independent of the option's setting. Bye Sven Index: Doc/Zsh/builtins.yo =================================================================== RCS file: /cvsroot/zsh/zsh/Doc/Zsh/builtins.yo,v retrieving revision 1.30 diff -u -r1.30 builtins.yo --- Doc/Zsh/builtins.yo 2001/06/14 09:49:02 1.30 +++ Doc/Zsh/builtins.yo 2001/06/27 11:20:09 @@ -230,6 +230,12 @@ no longer report their status, and will not complain if you try to exit an interactive shell with them running or stopped. If no var(job) is specified, disown the current job. + +If the var(job)s are currently stopped and the tt(AUTO_CONTINUE) option +is not set, a warning is printed containing information about how to +make them running after they have been disowned. If one of the latter +two forms is used, the var(job)s will automatically be made running, +independent of the setting of the tt(AUTO_CONTINUE) option. ) findex(echo) item(tt(echo) [ tt(-neE) ] [ var(arg) ... ])( Index: Doc/Zsh/options.yo =================================================================== RCS file: /cvsroot/zsh/zsh/Doc/Zsh/options.yo,v retrieving revision 1.20 diff -u -r1.20 options.yo --- Doc/Zsh/options.yo 2001/06/12 10:34:57 1.20 +++ Doc/Zsh/options.yo 2001/06/27 11:20:10 @@ -91,6 +91,14 @@ and the command is the name of a directory, perform the tt(cd) command to that directory. ) +pindex(AUTO_CONTINUE) +cindex(jobs, continuing automatically) +cindex(continuing jobs automatically) +item(tt(AUTO_CONT))( +With this option set, stopped jobs that are removed from the job table +with the tt(disown) builtin command are automatically sent a tt(CONT) +signal to make them running. +) pindex(AUTO_LIST) cindex(completion, listing choices) item(tt(AUTO_LIST) (tt(-9)) <D>)( Index: Src/exec.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/exec.c,v retrieving revision 1.32 diff -u -r1.32 exec.c --- Src/exec.c 2001/06/25 00:15:05 1.32 +++ Src/exec.c 2001/06/27 11:20:11 @@ -1645,7 +1645,7 @@ int nullexec = 0, assign = 0, forked = 0; int is_shfunc = 0, is_builtin = 0, is_exec = 0; /* Various flags to the command. */ - int cflags = 0, checked = 0; + int cflags = 0, checked = 0, oautocont = opts[AUTOCONTINUE]; LinkList redir; wordcode code; Wordcode beg = state->pc, varspc; @@ -1680,6 +1680,8 @@ * reference to a job in the job table. */ if (type == WC_SIMPLE && args && nonempty(args) && *(char *)peekfirst(args) == '%') { + if (how & Z_DISOWN) + opts[AUTOCONTINUE] = 1; pushnode(args, dupstring((how & Z_DISOWN) ? "disown" : (how & Z_ASYNC) ? "bg" : "fg")); how = Z_SYNC; @@ -1833,6 +1835,7 @@ if (cflags & BINF_BUILTIN) { zwarn("no such builtin: %s", cmdarg, 0); lastval = 1; + opts[AUTOCONTINUE] = oautocont; return; } break; @@ -1856,6 +1859,7 @@ if (errflag) { lastval = 1; + opts[AUTOCONTINUE] = oautocont; return; } @@ -1899,6 +1903,7 @@ if (errflag) { lastval = 1; + opts[AUTOCONTINUE] = oautocont; return; } @@ -1981,6 +1986,7 @@ if ((pid = zfork()) == -1) { close(synch[0]); close(synch[1]); + opts[AUTOCONTINUE] = oautocont; return; } if (pid) { close(synch[1]); @@ -2006,6 +2012,7 @@ } } addproc(pid, text); + opts[AUTOCONTINUE] = oautocont; return; } /* pid == 0 */ @@ -2373,6 +2380,7 @@ zsfree(STTYval); STTYval = 0; + opts[AUTOCONTINUE] = oautocont; } /* Arrange to have variables restored. */ Index: Src/jobs.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/jobs.c,v retrieving revision 1.12 diff -u -r1.12 jobs.c --- Src/jobs.c 2001/06/26 08:18:23 1.12 +++ Src/jobs.c 2001/06/27 11:20:12 @@ -1215,7 +1215,7 @@ int bin_fg(char *name, char **argv, char *ops, int func) { - int job, lng, firstjob = -1, retval = 0; + int job, lng, firstjob = -1, retval = 0, ofunc = func; if (ops['Z']) { int len; @@ -1299,6 +1299,8 @@ for (; (firstjob != -1) || *argv; (void)(*argv && argv++)) { int stopped, ocj = thisjob; + func = ofunc; + if (func == BIN_WAIT && isanum(*argv)) { /* wait can take a pid; the others can't. */ pid_t pid = (long)atoi(*argv); @@ -1326,6 +1328,13 @@ unqueue_signals(); return 1; } + /* If AUTO_CONTINUE is set (automatically make stopped jobs running + * on disown), we actually do a bg and then delete the job table entry. */ + + if (isset(AUTOCONTINUE) && func == BIN_DISOWN && + jobtab[job].stat & STAT_STOPPED) + func = BIN_BG; + /* We have a job number. Now decide what to do with it. */ switch (func) { case BIN_FG: @@ -1386,7 +1395,8 @@ if (func != BIN_BG) { waitjobs(); retval = lastval2; - } + } else if (ofunc == BIN_DISOWN) + deletejob(jobtab + job); break; case BIN_JOBS: printjob(job + jobtab, lng, 2); Index: Src/options.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/options.c,v retrieving revision 1.9 diff -u -r1.9 options.c --- Src/options.c 2001/06/12 10:34:57 1.9 +++ Src/options.c 2001/06/27 11:20:12 @@ -75,6 +75,7 @@ {NULL, "alwaystoend", 0, ALWAYSTOEND}, {NULL, "appendhistory", OPT_ALL, APPENDHISTORY}, {NULL, "autocd", OPT_EMULATE, AUTOCD}, +{NULL, "autocontinue", 0, AUTOCONTINUE}, {NULL, "autolist", OPT_ALL, AUTOLIST}, {NULL, "automenu", OPT_ALL, AUTOMENU}, {NULL, "autonamedirs", 0, AUTONAMEDIRS}, Index: Src/zsh.h =================================================================== RCS file: /cvsroot/zsh/zsh/Src/zsh.h,v retrieving revision 1.31 diff -u -r1.31 zsh.h --- Src/zsh.h 2001/06/12 10:34:57 1.31 +++ Src/zsh.h 2001/06/27 11:20:13 @@ -1314,6 +1314,7 @@ ALWAYSTOEND, APPENDHISTORY, AUTOCD, + AUTOCONTINUE, AUTOLIST, AUTOMENU, AUTONAMEDIRS, -- Sven Wischnowsky wischnow@informatik.hu-berlin.de ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH: Re: disowning stopped jobs 2001-06-26 8:15 ` PATCH: " Sven Wischnowsky 2001-06-26 8:19 ` Sven Wischnowsky 2001-06-26 16:40 ` Bart Schaefer @ 2001-10-10 2:40 ` Clint Adams 2 siblings, 0 replies; 10+ messages in thread From: Clint Adams @ 2001-10-10 2:40 UTC (permalink / raw) To: Sven Wischnowsky; +Cc: zsh-workers > Fine, I'm going to commit it to the development branch, should it go > into 4.0.2, too? [...] > Here is the patch, adding the option `AUTO_CONTINUE' (any better name?). > It also makes the `%foo &!' and `%foo &|' forms make the job running > automatically, independent of the option's setting. Someone just complained to me about the 4.0.2 behavior. I referred him to 4.1.0, but it seems to me that this is innocuous enough to be merged into the trunk in preparation for 4.0.3. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2001-10-10 2:40 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2001-06-25 9:00 disowning stopped jobs Sven Wischnowsky 2001-06-25 9:12 ` Thomas Köhler 2001-06-25 9:17 ` Sven Wischnowsky 2001-06-25 9:25 ` Thomas Köhler 2001-06-25 15:08 ` Bart Schaefer 2001-06-26 8:15 ` PATCH: " Sven Wischnowsky 2001-06-26 8:19 ` Sven Wischnowsky 2001-06-26 16:40 ` Bart Schaefer 2001-06-27 11:18 ` Sven Wischnowsky 2001-10-10 2:40 ` Clint Adams
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).