From: Bram Moolenaar Date: Sat, 16 May 2020 21:15:08 +0000 (+0200) Subject: patch 8.2.0773: switching to raw mode every time ":" is used X-Git-Tag: v8.2.0773 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3b1f18f785f67c6cd110498c366e4d0c0fe11f27;p=vim patch 8.2.0773: switching to raw mode every time ":" is used Problem: Switching to raw mode every time ":" is used. Solution: When executing a shell set cur_tmode to TMODE_UNKNOWN, so that the next time TMODE_RAW is used it is set, but not every time. --- diff --git a/src/os_amiga.c b/src/os_amiga.c index 1e3fd4b20..58e462d5c 100644 --- a/src/os_amiga.c +++ b/src/os_amiga.c @@ -1387,7 +1387,11 @@ mch_call_shell( if ((mydir = CurrentDir(mydir)) != 0) // make sure we stay in the same directory UnLock(mydir); if (tmode == TMODE_RAW) + { + // The shell may have messed with the mode, always set it. + cur_tmode = TMODE_UNKNOWN; settmode(TMODE_RAW); // set to raw mode + } #ifdef FEAT_TITLE resettitle(); #endif diff --git a/src/os_unix.c b/src/os_unix.c index aea3d5a9e..9162f5bf8 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4521,7 +4521,11 @@ mch_call_shell_system( } if (tmode == TMODE_RAW) + { + // The shell may have messed with the mode, always set it. + cur_tmode = TMODE_UNKNOWN; settmode(TMODE_RAW); // set to raw mode + } # ifdef FEAT_TITLE resettitle(); # endif @@ -4571,6 +4575,9 @@ mch_call_shell_fork( out_flush(); if (options & SHELL_COOKED) settmode(TMODE_COOK); // set to normal mode + if (tmode == TMODE_RAW) + // The shell may have messed with the mode, always set it later. + cur_tmode = TMODE_UNKNOWN; if (unix_build_argv(cmd, &argv, &tofree1, &tofree2) == FAIL) goto error; diff --git a/src/os_win32.c b/src/os_win32.c index 52bc95de8..d77e21691 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -4899,7 +4899,11 @@ mch_call_shell( } if (tmode == TMODE_RAW) + { + // The shell may have messed with the mode, always set it. + cur_tmode = TMODE_UNKNOWN; settmode(TMODE_RAW); // set to raw mode + } // Print the return value, unless "vimrun" was used. if (x != 0 && !(options & SHELL_SILENT) && !emsg_silent diff --git a/src/term.c b/src/term.c index 9803a1bb9..1260c9a37 100644 --- a/src/term.c +++ b/src/term.c @@ -2862,7 +2862,7 @@ term_color(char_u *s, int n) #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS) || (s[0] == ESC && s[1] == '|') #endif - || (s[0] == CSI && (i = 1) == 1)) + || (s[0] == CSI && (i = 1) == 1)) && s[i] != NUL && (STRCMP(s + i + 1, "%p1%dm") == 0 || STRCMP(s + i + 1, "%dm") == 0) @@ -3447,14 +3447,14 @@ settmode(int tmode) if (full_screen) { /* - * When returning after calling a shell we want to really set the - * terminal to raw mode, even though we think it already is, because - * the shell program may have reset the terminal mode. + * When returning after calling a shell cur_tmode is TMODE_UNKNOWN, + * set the terminal to raw mode, even though we think it already is, + * because the shell program may have reset the terminal mode. * When we think the terminal is normal, don't try to set it to * normal again, because that causes problems (logout!) on some * machines. */ - if (tmode != TMODE_COOK || cur_tmode != TMODE_COOK) + if (tmode != cur_tmode) { #ifdef FEAT_TERMRESPONSE # ifdef FEAT_GUI diff --git a/src/term.h b/src/term.h index f1c3df534..b9535ee1d 100644 --- a/src/term.h +++ b/src/term.h @@ -209,6 +209,7 @@ extern char_u *(term_strings[]); // current terminal strings #define T_SSI (TERM_STR(KS_SSI)) // save icon text #define T_SRI (TERM_STR(KS_SRI)) // restore icon text -#define TMODE_COOK 0 // terminal mode for external cmds and Ex mode -#define TMODE_SLEEP 1 // terminal mode for sleeping (cooked but no echo) -#define TMODE_RAW 2 // terminal mode for Normal and Insert mode +#define TMODE_COOK 0 // terminal mode for external cmds and Ex mode +#define TMODE_SLEEP 1 // terminal mode for sleeping (cooked but no echo) +#define TMODE_RAW 2 // terminal mode for Normal and Insert mode +#define TMODE_UNKNOWN 9 // after executing a shell diff --git a/src/version.c b/src/version.c index fa8ba91ce..6a28ae35f 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 773, /**/ 772, /**/