patch 8.0.0932: terminal may not use right characters for BS and Enter
Problem: Terminal may not use right characters for BS and Enter.
Solution: Get the characters from the tty.
diff --git a/src/os_unix.c b/src/os_unix.c
index c56de66..40e0762 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -365,6 +365,11 @@
# endif
}
+/* Why is NeXT excluded here (and not in os_unixx.h)? */
+#if defined(ECHOE) && defined(ICANON) && (defined(HAVE_TERMIO_H) || defined(HAVE_TERMIOS_H)) && !defined(__NeXT__)
+# define NEW_TTY_SYSTEM
+#endif
+
/*
* Write s[len] to the screen.
*/
@@ -3385,11 +3390,7 @@
{
static int first = TRUE;
- /* Why is NeXT excluded here (and not in os_unixx.h)? */
-#if defined(ECHOE) && defined(ICANON) && (defined(HAVE_TERMIO_H) || defined(HAVE_TERMIOS_H)) && !defined(__NeXT__)
- /*
- * for "new" tty systems
- */
+#ifdef NEW_TTY_SYSTEM
# ifdef HAVE_TERMIOS_H
static struct termios told;
struct termios tnew;
@@ -3451,7 +3452,6 @@
# endif
#else
-
/*
* for "old" tty systems
*/
@@ -3492,48 +3492,72 @@
void
get_stty(void)
{
- char_u buf[2];
- char_u *p;
+ ttyinfo_T info;
+ char_u buf[2];
+ char_u *p;
- /* Why is NeXT excluded here (and not in os_unixx.h)? */
-#if defined(ECHOE) && defined(ICANON) && (defined(HAVE_TERMIO_H) || defined(HAVE_TERMIOS_H)) && !defined(__NeXT__)
- /* for "new" tty systems */
+ if (get_tty_info(read_cmd_fd, &info) == OK)
+ {
+ intr_char = info.interrupt;
+ buf[0] = info.backspace;
+ buf[1] = NUL;
+ add_termcode((char_u *)"kb", buf, FALSE);
+
+ /* If <BS> and <DEL> are now the same, redefine <DEL>. */
+ p = find_termcode((char_u *)"kD");
+ if (p != NULL && p[0] == buf[0] && p[1] == buf[1])
+ do_fixdel(NULL);
+ }
+}
+
+/*
+ * Obtain the characters that Backspace and Enter produce on "fd".
+ * Returns OK or FAIL.
+ */
+ int
+get_tty_info(int fd, ttyinfo_T *info)
+{
+#ifdef NEW_TTY_SYSTEM
# ifdef HAVE_TERMIOS_H
struct termios keys;
# else
struct termio keys;
# endif
+ if (
# if defined(HAVE_TERMIOS_H)
- if (tcgetattr(read_cmd_fd, &keys) != -1)
+ tcgetattr(fd, &keys) != -1
# else
- if (ioctl(read_cmd_fd, TCGETA, &keys) != -1)
+ ioctl(fd, TCGETA, &keys) != -1
# endif
+ )
{
- buf[0] = keys.c_cc[VERASE];
- intr_char = keys.c_cc[VINTR];
+ info->backspace = keys.c_cc[VERASE];
+ info->interrupt = keys.c_cc[VINTR];
+ if (keys.c_iflag & ICRNL)
+ info->enter = NL;
+ else
+ info->enter = CAR;
+ if (keys.c_oflag & ONLCR)
+ info->nl_does_cr = TRUE;
+ else
+ info->nl_does_cr = FALSE;
+ return OK;
+ }
#else
/* for "old" tty systems */
struct sgttyb keys;
- if (ioctl(read_cmd_fd, TIOCGETP, &keys) != -1)
+ if (ioctl(fd, TIOCGETP, &keys) != -1)
{
- buf[0] = keys.sg_erase;
- intr_char = keys.sg_kill;
-#endif
- buf[1] = NUL;
- add_termcode((char_u *)"kb", buf, FALSE);
-
- /*
- * If <BS> and <DEL> are now the same, redefine <DEL>.
- */
- p = find_termcode((char_u *)"kD");
- if (p != NULL && p[0] == buf[0] && p[1] == buf[1])
- do_fixdel(NULL);
+ info->backspace = keys.sg_erase;
+ info->interrupt = keys.sg_kill;
+ info->enter = CAR;
+ info->nl_does_cr = TRUE;
+ return OK;
}
-#if 0
- } /* to keep cindent happy */
#endif
+ return FAIL;
}
#endif /* VMS */