patch 8.0.1277: terminal window CR-NL conversions may cause problems
Problem: Terminal window CR-NL conversions may cause problems.
Solution: Avoid most conversions, only fetch the current backspace key value
from the tty. (mostly by Ozaki Kiichi, closes #2278)
diff --git a/src/terminal.c b/src/terminal.c
index 4c58397..0012b3b 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -181,11 +181,9 @@
static void term_report_winsize(term_T *term, int rows, int cols);
static void term_free_vterm(term_T *term);
-/* The characters that we know (or assume) that the terminal expects for the
- * backspace and enter keys. */
+/* The character that we know (or assume) that the terminal expects for the
+ * backspace key. */
static int term_backspace_char = BS;
-static int term_enter_char = CAR;
-static int term_nl_does_cr = FALSE;
/**************************************
@@ -651,30 +649,8 @@
term_write_job_output(term_T *term, char_u *msg, size_t len)
{
VTerm *vterm = term->tl_vterm;
- char_u *p;
- size_t done;
- size_t len_now;
- if (term_nl_does_cr)
- vterm_input_write(vterm, (char *)msg, len);
- else
- /* need to convert NL to CR-NL */
- for (done = 0; done < len; done += len_now)
- {
- for (p = msg + done; p < msg + len; )
- {
- if (*p == NL)
- break;
- p += utf_ptr2len_len(p, (int)(len - (p - msg)));
- }
- len_now = p - msg - done;
- vterm_input_write(vterm, (char *)msg + done, len_now);
- if (p < msg + len && *p == NL)
- {
- vterm_input_write(vterm, "\r\n", 2);
- ++len_now;
- }
- }
+ vterm_input_write(vterm, (char *)msg, len);
/* this invokes the damage callbacks */
vterm_screen_flush_damage(vterm_obtain_screen(vterm));
@@ -760,7 +736,8 @@
switch (c)
{
- case CAR: c = term_enter_char; break;
+ /* don't use VTERM_KEY_ENTER, it may do an unwanted conversion */
+
/* don't use VTERM_KEY_BACKSPACE, it always
* becomes 0x7f DEL */
case K_BS: c = term_backspace_char; break;
@@ -1534,7 +1511,8 @@
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;
+ 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
@@ -1557,30 +1535,11 @@
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 */
+ /* Job finished while waiting for a character. Push back the
+ * received character. */
if (c != K_IGNORE)
vungetc(c);
break;
@@ -1588,6 +1547,22 @@
if (c == K_IGNORE)
continue;
+#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 character typed, e.g. when Vim starts in a shell.
+ */
+ if (isatty(tty_fd))
+ {
+ ttyinfo_T info;
+
+ /* Get the current backspace character of the pty. */
+ if (get_tty_info(tty_fd, &info) == OK)
+ term_backspace_char = info.backspace;
+ }
+#endif
+
#ifdef WIN3264
/* On Windows winpty handles CTRL-C, don't send a CTRL_C_EVENT.
* Use CTRL-BREAK to kill the job. */