changeset 12767:4d9cdb1d8bea v8.0.1261

patch 8.0.1261: program in terminal window gets NL instead of CR commit https://github.com/vim/vim/commit/1232624ae5b56c167c5982a2620f736c4bbc19ef Author: Bram Moolenaar <Bram@vim.org> Date: Sat Nov 4 20:12:14 2017 +0100 patch 8.0.1261: program in terminal window gets NL instead of CR Problem: Program in terminal window gets NL instead of CR. (Lifepillar) Solution: Check the tty setup more often. (closes https://github.com/vim/vim/issues/1998)
author Christian Brabandt <cb@256bit.org>
date Sat, 04 Nov 2017 20:15:04 +0100
parents 1260c3619ed6
children 98f7d469e365
files src/terminal.c src/version.c
diffstat 2 files changed, 27 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -38,6 +38,8 @@
  * in tl_scrollback are no longer used.
  *
  * TODO:
+ * - Termdebug: issue #2154 might be avoided by adding -quiet to gdb?
+ *   patch by Christian, 2017 Oct 23.
  * - in GUI vertical split causes problems.  Cursor is flickering. (Hirohito
  *   Higashi, 2017 Sep 19)
  * - double click in Window toolbar starts Visual mode (but not always?).
@@ -51,8 +53,6 @@
  *   Also: #2223
  * - implement term_setsize()
  * - Termdebug does not work when Vim build with mzscheme.  gdb hangs.
- * - Termdebug: issue #2154 might be avoided by adding -quiet to gdb?
- *   patch by Christian, 2017 Oct 23.
  * - MS-Windows GUI: WinBar has  tearoff item
  * - MS-Windows GUI: still need to type a key after shell exits?  #1924
  * - What to store in a session file?  Shell at the prompt would be OK to
@@ -1535,6 +1535,9 @@ terminal_loop(int blocking)
     int		c;
     int		termkey = 0;
     int		ret;
+#ifdef UNIX
+    int		tty_fd = curbuf->b_term->tl_job->jv_channel->ch_part[get_tty_part(curbuf->b_term)].ch_fd;
+#endif
 
     /* Remember the terminal we are sending keys to.  However, the terminal
      * might be closed while waiting for a character, e.g. typing "exit" in a
@@ -1547,26 +1550,6 @@ terminal_loop(int blocking)
     position_cursor(curwin, &curbuf->b_term->tl_cursor_pos);
     may_set_cursor_props(curbuf->b_term);
 
-#ifdef UNIX
-    {
-	int part = get_tty_part(curbuf->b_term);
-	int fd = curbuf->b_term->tl_job->jv_channel->ch_part[part].ch_fd;
-
-	if (isatty(fd))
-	{
-	    ttyinfo_T info;
-
-	    /* Get the current backspace and enter characters of the pty. */
-	    if (get_tty_info(fd, &info) == OK)
-	    {
-		term_backspace_char = info.backspace;
-		term_enter_char = info.enter;
-		term_nl_does_cr = info.nl_does_cr;
-	    }
-	}
-    }
-#endif
-
     while (blocking || vpeekc() != NUL)
     {
 	/* TODO: skip screen update when handling a sequence of keys. */
@@ -1576,6 +1559,26 @@ terminal_loop(int blocking)
 		break;
 	update_cursor(curbuf->b_term, FALSE);
 
+#ifdef UNIX
+	/*
+	 * The shell or another program may change the tty settings.  Getting
+	 * them for every typed character is a bit of overhead, but it's needed
+	 * for the first CR typed, e.g. when Vim starts in a shell.
+	 */
+	if (isatty(tty_fd))
+	{
+	    ttyinfo_T info;
+
+	    /* Get the current backspace and enter characters of the pty. */
+	    if (get_tty_info(tty_fd, &info) == OK)
+	    {
+		term_backspace_char = info.backspace;
+		term_enter_char = info.enter;
+		term_nl_does_cr = info.nl_does_cr;
+	    }
+	}
+#endif
+
 	c = term_vgetc();
 	if (!term_use_loop())
 	    /* job finished while waiting for a character */
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1261,
+/**/
     1260,
 /**/
     1259,