summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-11-24 15:09:07 +0100
committerBram Moolenaar <Bram@vim.org>2016-11-24 15:09:07 +0100
commit2cab0e191055a8145ccd46cd52869fbb9798b971 (patch)
tree0c3a83114c182262e07fa5434beeac799358e824
parent182707ac10d77359bf7a87c6b23ce4025d5b0ad4 (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.txt2
-rw-r--r--runtime/doc/starting.txt4
-rw-r--r--src/evalfunc.c4
-rw-r--r--src/globals.h2
-rw-r--r--src/main.c14
-rw-r--r--src/structs.h2
-rw-r--r--src/version.c2
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,