diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-11-24 15:09:07 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-11-24 15:09:07 +0100 |
commit | 2cab0e191055a8145ccd46cd52869fbb9798b971 (patch) | |
tree | 0c3a83114c182262e07fa5434beeac799358e824 | |
parent | 182707ac10d77359bf7a87c6b23ce4025d5b0ad4 (diff) |
patch 8.0.0096v8.0.0096
Problem: When the input or output is not a tty Vim appears to hang.
Solution: Add the --ttyfail argument. Also add the "ttyin" and "ttyout"
features to be able to check in Vim script.
-rw-r--r-- | runtime/doc/eval.txt | 2 | ||||
-rw-r--r-- | runtime/doc/starting.txt | 4 | ||||
-rw-r--r-- | src/evalfunc.c | 4 | ||||
-rw-r--r-- | src/globals.h | 2 | ||||
-rw-r--r-- | src/main.c | 14 | ||||
-rw-r--r-- | src/structs.h | 2 | ||||
-rw-r--r-- | src/version.c | 2 |
7 files changed, 25 insertions, 5 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index b34bf48087..1a11a41411 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -8416,6 +8416,8 @@ tgetent Compiled with tgetent support, able to use a termcap timers Compiled with |timer_start()| support. title Compiled with window title support |'title'|. toolbar Compiled with support for |gui-toolbar|. +ttyin input is a terminal (tty) +ttyout output is a terminal (tty) unix Unix version of Vim. user_commands User-defined commands. vertsplit Compiled with vertically split windows |:vsplit|. diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt index 8ce3c63d2a..34500fc0ce 100644 --- a/runtime/doc/starting.txt +++ b/runtime/doc/starting.txt @@ -421,6 +421,10 @@ a slash. Thus "-R" means recovery and "-/R" readonly. not connected to a terminal. This will avoid the warning and the two second delay that would happen. {not in Vi} + *--ttyfail* +--ttyfail When the stdin or stdout is not a terminal (tty) then exit + right away. + *-d* -d Start in diff mode, like |vimdiff|. {not in Vi} {not available when compiled without the |+diff| diff --git a/src/evalfunc.c b/src/evalfunc.c index 1257aa0594..846a914165 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -5959,6 +5959,10 @@ f_has(typval_T *argvars, typval_T *rettv) } else if (STRICMP(name, "vim_starting") == 0) n = (starting != 0); + else if (STRICMP(name, "ttyin") == 0) + n = mch_input_isatty(); + else if (STRICMP(name, "ttyout") == 0) + n = stdout_isatty; #ifdef FEAT_MBYTE else if (STRICMP(name, "multi_byte_encoding") == 0) n = has_mbyte; diff --git a/src/globals.h b/src/globals.h index c15e4f9bb9..0b6abb0e85 100644 --- a/src/globals.h +++ b/src/globals.h @@ -643,6 +643,8 @@ EXTERN int exiting INIT(= FALSE); EXTERN int really_exiting INIT(= FALSE); /* TRUE when we are sure to exit, e.g., after * a deadly signal */ +EXTERN int stdout_isatty INIT(= TRUE); /* is stdout a terminal? */ + #if defined(FEAT_AUTOCHDIR) EXTERN int test_autochdir INIT(= FALSE); #endif diff --git a/src/main.c b/src/main.c index acc51f182a..f3c471a852 100644 --- a/src/main.c +++ b/src/main.c @@ -973,7 +973,7 @@ common_init(mparm_T *paramp) * (needed for :! to * work). mch_check_win() will also handle the -d or * -dev argument. */ - paramp->stdout_isatty = (mch_check_win(paramp->argc, paramp->argv) != FAIL); + stdout_isatty = (mch_check_win(paramp->argc, paramp->argv) != FAIL); TIME_MSG("window checked"); /* @@ -1828,6 +1828,7 @@ command_line_scan(mparm_T *parmp) /* "--literal" take files literally */ /* "--nofork" don't fork */ /* "--not-a-term" don't warn for not a term */ + /* "--ttyfail" exit if not a term */ /* "--noplugin[s]" skip plugins */ /* "--cmd <cmd>" execute cmd before vimrc */ if (STRICMP(argv[0] + argv_idx, "help") == 0) @@ -1857,6 +1858,8 @@ command_line_scan(mparm_T *parmp) p_lpl = FALSE; else if (STRNICMP(argv[0] + argv_idx, "not-a-term", 10) == 0) parmp->not_a_term = TRUE; + else if (STRNICMP(argv[0] + argv_idx, "ttyfail", 7) == 0) + parmp->tty_fail = TRUE; else if (STRNICMP(argv[0] + argv_idx, "cmd", 3) == 0) { want_argument = TRUE; @@ -2489,7 +2492,7 @@ check_tty(mparm_T *parmp) if (!input_isatty) silent_mode = TRUE; } - else if (parmp->want_full_screen && (!parmp->stdout_isatty || !input_isatty) + else if (parmp->want_full_screen && (!stdout_isatty || !input_isatty) #ifdef FEAT_GUI /* don't want the delay when started from the desktop */ && !gui.starting @@ -2504,7 +2507,7 @@ check_tty(mparm_T *parmp) * input buffer so fast I can't even kill the process in under 2 * minutes (and it beeps continuously the whole time :-) */ - if (netbeans_active() && (!parmp->stdout_isatty || !input_isatty)) + if (netbeans_active() && (!stdout_isatty || !input_isatty)) { mch_errmsg(_("Vim: Error: Failure to start gvim from NetBeans\n")); exit(1); @@ -2517,11 +2520,13 @@ check_tty(mparm_T *parmp) exit(1); } #endif - if (!parmp->stdout_isatty) + if (!stdout_isatty) mch_errmsg(_("Vim: Warning: Output is not to a terminal\n")); if (!input_isatty) mch_errmsg(_("Vim: Warning: Input is not from a terminal\n")); out_flush(); + if (parmp->tty_fail && (!stdout_isatty || !input_isatty)) + exit(1); if (scriptin[0] == NULL) ui_delay(2000L, TRUE); TIME_MSG("Warning delay"); @@ -3287,6 +3292,7 @@ usage(void) #endif main_msg(_("-T <terminal>\tSet terminal type to <terminal>")); main_msg(_("--not-a-term\t\tSkip warning for input/output not being a terminal")); + main_msg(_("--ttyfail\t\tExit if input or output is not a terminal")); main_msg(_("-u <vimrc>\t\tUse <vimrc> instead of any .vimrc")); #ifdef FEAT_GUI main_msg(_("-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc")); diff --git a/src/structs.h b/src/structs.h index c749a3691d..1b73e37c28 100644 --- a/src/structs.h +++ b/src/structs.h @@ -3225,8 +3225,8 @@ typedef struct #endif int want_full_screen; - int stdout_isatty; /* is stdout a terminal? */ int not_a_term; /* no warning for missing term? */ + int tty_fail; /* exit if not a tty */ char_u *term; /* specified terminal name */ #ifdef FEAT_CRYPT int ask_for_key; /* -x argument */ diff --git a/src/version.c b/src/version.c index 731a6850d4..e259000c0f 100644 --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 96, +/**/ 95, /**/ 94, |