]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.0.1261: program in terminal window gets NL instead of CR v8.0.1261
authorBram Moolenaar <Bram@vim.org>
Sat, 4 Nov 2017 19:12:14 +0000 (20:12 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 4 Nov 2017 19:12:14 +0000 (20:12 +0100)
Problem:    Program in terminal window gets NL instead of CR. (Lifepillar)
Solution:   Check the tty setup more often. (closes #1998)

src/terminal.c
src/version.c

index 25c7d66cb9de8ef7dd5cf04c11926aaae63571de..c6b3860d36e887d745d706e42f13a650384596d8 100644 (file)
@@ -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,35 +1550,35 @@ terminal_loop(int blocking)
     position_cursor(curwin, &curbuf->b_term->tl_cursor_pos);
     may_set_cursor_props(curbuf->b_term);
 
-#ifdef UNIX
+    while (blocking || vpeekc() != NUL)
     {
-       int part = get_tty_part(curbuf->b_term);
-       int fd = curbuf->b_term->tl_job->jv_channel->ch_part[part].ch_fd;
+       /* TODO: skip screen update when handling a sequence of keys. */
+       /* Repeat redrawing in case a message is received while redrawing. */
+       while (must_redraw != 0)
+           if (update_screen(0) == FAIL)
+               break;
+       update_cursor(curbuf->b_term, FALSE);
 
-       if (isatty(fd))
+#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(fd, &info) == OK)
+           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
 
-    while (blocking || vpeekc() != NUL)
-    {
-       /* TODO: skip screen update when handling a sequence of keys. */
-       /* Repeat redrawing in case a message is received while redrawing. */
-       while (must_redraw != 0)
-           if (update_screen(0) == FAIL)
-               break;
-       update_cursor(curbuf->b_term, FALSE);
-
        c = term_vgetc();
        if (!term_use_loop())
            /* job finished while waiting for a character */
index 4fa6ea57880d3caec3e6bc444944f697ae93d34d..7d049d08f2d1129c95818483934e0bf33de97204 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1261,
 /**/
     1260,
 /**/