From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3291 invoked from network); 13 Apr 2000 08:41:02 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 13 Apr 2000 08:41:02 -0000 Received: (qmail 17270 invoked by alias); 13 Apr 2000 08:40:54 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 10727 Received: (qmail 17229 invoked from network); 13 Apr 2000 08:40:48 -0000 Date: Thu, 13 Apr 2000 10:40:36 +0200 (MET DST) Message-Id: <200004130840.KAA13428@beta.informatik.hu-berlin.de> From: Sven Wischnowsky To: zsh-workers@sunsite.auc.dk In-reply-to: "Bart Schaefer"'s message of Wed, 12 Apr 2000 16:06:33 +0000 Subject: PATCH: Re: Question Bart Schaefer wrote: > ... > > integer i=0 > while read -E > do > (( ++i == LINES-2 )) && > { i=0; read -q '?Continue? [no] ' done > > (The above reveals a possible bug: "read -q" prints a prompt only if > standard input is a TTY, but it always reads from the TTY if there is > one. So I had to throw in that redirection.) Hm. This should fix it. It also copies the code to set up shout when a new SHTTY was opened from bin_vared(). Bye Sven Index: Src/builtin.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/builtin.c,v retrieving revision 1.5 diff -u -r1.5 builtin.c --- Src/builtin.c 2000/04/12 11:10:52 1.5 +++ Src/builtin.c 2000/04/13 08:40:08 @@ -3356,11 +3356,12 @@ bin_read(char *name, char **args, char *ops, int func) { char *reply, *readpmpt; - int bsiz, c = 0, gotnl = 0, al = 0, first, nchars = 1, bslash; + int bsiz, c = 0, gotnl = 0, al = 0, first, nchars = 1, bslash, keys = 0; int haso = 0; /* true if /dev/tty has been opened specially */ int isem = !strcmp(term, "emacs"), izle = zleactive && getkeyptr; char *buf, *bptr, *firstarg, *zbuforig; LinkList readll = newlinklist(); + FILE *oshout = NULL; if ((ops['k'] || ops['b']) && *args && idigit(**args)) { if (!(nchars = atoi(*args))) @@ -3385,8 +3386,11 @@ if (!zleactive) { if (SHTTY == -1) { /* need to open /dev/tty specially */ - SHTTY = open("/dev/tty", O_RDWR|O_NOCTTY); - haso = 1; + if ((SHTTY = open("/dev/tty", O_RDWR|O_NOCTTY)) != -1) { + haso = 1; + oshout = shout; + init_shout(); + } } /* We should have a SHTTY opened by now. */ if (SHTTY == -1) { @@ -3403,6 +3407,7 @@ setcbreak(); readfd = SHTTY; } + keys = 1; } else if (ops['u'] && !ops['p']) { /* -u means take input from the specified file descriptor. * * -up means take input from the coprocess. */ @@ -3419,9 +3424,9 @@ for (readpmpt = firstarg; *readpmpt && *readpmpt != '?'; readpmpt++); if (*readpmpt++) { - if (isatty(0)) { - zputs(readpmpt, stderr); - fflush(stderr); + if (keys || isatty(0)) { + zputs(readpmpt, (haso ? shout : stderr)); + fflush(haso ? shout : stderr); } readpmpt[-1] = '\0'; } @@ -3462,6 +3467,8 @@ settyinfo(&shttyinfo); if (haso) { close(SHTTY); + fclose(shout); + shout = oshout; SHTTY = -1; } } @@ -3493,6 +3500,8 @@ /* dispose of result appropriately, etc. */ if (haso) { close(SHTTY); + fclose(shout); + shout = oshout; SHTTY = -1; } } -- Sven Wischnowsky wischnow@informatik.hu-berlin.de