Path: utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!tut.cis.ohio-state.edu!comp.vuw.ac.nz!nickson From: nickson@comp.vuw.ac.nz (Ray Nickson) Newsgroups: gnu.bash.bug Subject: key binding/stty character conflict Message-ID: <8907122237.AA10749@comp.vuw.ac.nz> Date: 12 Jul 89 22:36:45 GMT Sender: daemon@tut.cis.ohio-state.edu Distribution: gnu Organization: GNUs Not Usenet Lines: 84 ENVIRONMENT: bash 1.01 or 1.02 on an HP300 running MORE/BSD4.3 (although I believe it applies to any BSD system). SYMPTOM: in the command-line editor, some commands don't work. BUG: there is a conflict between the shell's interpretation of certain keystrokes and the terminal driver's. In my case, ^C, ^\, ^Z and ^Y are bound (by stty) to INTR, QUIT, SUSP and DSUSP, so these keys (^Y in particular) are not available for the shell. FIX: we should save and zero the special characters before preparing the terminal for command-line editing, and restore them when running subprograms or editing. The following cdiff for version 1.02 has been tested in the above environment and appears to work; a similar patch to readline.c in 1.01 should also work. BTW: perhaps we should think about doing a full `tty sanity check and restore' like tcsh does??? -rgn -- nickson@comp.vuw.ac.nz ...!uunet!vuwcomp!nickson + 64 4 721000x8142 --------------------cut here-------------------- *** lib/readline.c.orig Wed Jul 12 15:17:01 1989 --- lib/readline.c Thu Jul 13 10:22:14 1989 *************** *** 1483,1494 **** int original_tty_flags = 0; struct sgttyb the_ttybuff; /* Put the terminal in CBREAK mode so that we can detect key presses. */ rl_prep_terminal () { int tty = fileno (rl_instream); ! /* We always get the latest tty values. Maybe stty changed them. */ ioctl (tty, TIOCGETP, &the_ttybuff); --- 1483,1498 ---- int original_tty_flags = 0; struct sgttyb the_ttybuff; + struct tchars the_tchars; + struct ltchars the_ltchars; /* Put the terminal in CBREAK mode so that we can detect key presses. */ rl_prep_terminal () { int tty = fileno (rl_instream); ! static struct tchars new_tchars = { -1, -1, -1, -1, -1, -1}; ! static struct ltchars new_ltchars = { -1, -1, -1, -1, -1, -1 }; ! /* We always get the latest tty values. Maybe stty changed them. */ ioctl (tty, TIOCGETP, &the_ttybuff); *************** *** 1503,1508 **** --- 1507,1517 ---- } the_ttybuff.sg_flags |= CBREAK; ioctl (tty, TIOCSETN, &the_ttybuff); + /* save the special characters so we can use them for shell bindings */ + ioctl (tty, TIOCGETC, &the_tchars); + ioctl (tty, TIOCGLTC, &the_ltchars); + ioctl (tty, TIOCSETC, &new_tchars); + ioctl (tty, TIOCSLTC, &new_ltchars); } /* Restore the terminal to its original state. */ *************** *** 1513,1518 **** --- 1522,1530 ---- the_ttybuff.sg_flags = original_tty_flags; ioctl (tty, TIOCSETN, &the_ttybuff); readline_echoing_p = 1; + /* restore special characters to saved values */ + ioctl (tty, TIOCSETC, &the_tchars); + ioctl (tty, TIOCSLTC, &the_ltchars); } #endif /* SYSV || HPUX */