changeset 6602:c77ef1bf9623 v7.4.627

updated for version 7.4.627 Problem: The last screen cell is not updated. Solution: Respect the "tn" termcap feature. (Hayaki Saito)
author Bram Moolenaar <bram@vim.org>
date Tue, 10 Feb 2015 19:20:37 +0100
parents 62d5e237962a
children b10090446bbb
files runtime/doc/term.txt src/option.c src/screen.c src/term.c src/term.h src/version.c
diffstat 6 files changed, 25 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/term.txt
+++ b/runtime/doc/term.txt
@@ -224,10 +224,11 @@ The options are listed below.  The assoc
 the last two characters of the option name.  Only one termcap code is
 required: Cursor motion, 't_cm'.
 
-The options 't_da', 't_db', 't_ms', 't_xs' represent flags in the termcap.
-When the termcap flag is present, the option will be set to "y".  But any
-non-empty string means that the flag is set.  An empty string means that the
-flag is not set.  't_CS' works like this too, but it isn't a termcap flag.
+The options 't_da', 't_db', 't_ms', 't_xs', 't_xn' represent flags in the
+termcap.  When the termcap flag is present, the option will be set to "y".
+But any non-empty string means that the flag is set.  An empty string means
+that the flag is not set.  't_CS' works like this too, but it isn't a termcap
+flag.
 
 OUTPUT CODES
 	option	meaning	~
@@ -281,6 +282,9 @@ OUTPUT CODES
 	t_vs	cursor very visible				*t_vs* *'t_vs'*
 								*t_xs* *'t_xs'*
 	t_xs	if non-empty, standout not erased by overwriting (hpterm)
+								*t_xn* *'t_xn'*
+	t_xn	if non-empty, character writing at the last cell of screen
+		didn't causes scrolling
 	t_ZH	italics mode					*t_ZH* *'t_ZH'*
 	t_ZR	italics end					*t_ZR* *'t_ZR'*
 
--- a/src/option.c
+++ b/src/option.c
@@ -2978,6 +2978,7 @@ static struct vimoption
     p_term("t_WS", T_CWS)
     p_term("t_SI", T_CSI)
     p_term("t_EI", T_CEI)
+    p_term("t_xn", T_XN)
     p_term("t_xs", T_XS)
     p_term("t_ZH", T_CZH)
     p_term("t_ZR", T_CZR)
--- a/src/screen.c
+++ b/src/screen.c
@@ -7968,9 +7968,11 @@ screen_char(off, row, col)
     if (row >= screen_Rows || col >= screen_Columns)
 	return;
 
-    /* Outputting the last character on the screen may scrollup the screen.
-     * Don't to it!  Mark the character invalid (update it when scrolled up) */
-    if (row == screen_Rows - 1 && col == screen_Columns - 1
+    /* Outputting a character in the last cell on the screen may scroll the
+     * screen up.  Only do it when the "xn" termcap property is set, otherwise
+     * mark the character invalid (update it when scrolled up). */
+    if (*T_XN == NUL
+	    && row == screen_Rows - 1 && col == screen_Columns - 1
 #ifdef FEAT_RIGHTLEFT
 	    /* account for first command-line character in rightleft mode */
 	    && !cmdmsg_rl
--- a/src/term.c
+++ b/src/term.c
@@ -200,6 +200,7 @@ static struct builtin_term builtin_termc
     {(int)KS_VB,	IF_EB("\033|f", ESC_STR "|f")},
     {(int)KS_MS,	"y"},
     {(int)KS_UT,	"y"},
+    {(int)KS_XN,	"y"},
     {(int)KS_LE,	"\b"},		/* cursor-left = BS */
     {(int)KS_ND,	"\014"},	/* cursor-right = CTRL-L */
 # ifdef TERMINFO
@@ -658,6 +659,7 @@ static struct builtin_term builtin_termc
 
     {(int)KS_MS,	"y"},		/* save to move cur in reverse mode */
     {(int)KS_UT,	"y"},
+    {(int)KS_XN,	"y"},
     {(int)KS_LE,	"\b"},
 #  ifdef TERMINFO
     {(int)KS_CM,	"\033|%i%p1%d;%p2%dH"},/* cursor motion */
@@ -772,6 +774,7 @@ static struct builtin_term builtin_termc
     {(int)KS_CSF,	IF_EB("\033[101;%dm", ESC_STR "[101;%dm")},	/* set screen foreground color */
     {(int)KS_MS,	"y"},
     {(int)KS_UT,	"y"},
+    {(int)KS_XN,	"y"},
     {(int)KS_LE,	"\b"},
 #  ifdef TERMINFO
     {(int)KS_CM,	IF_EB("\033[%i%p1%d;%p2%dH",
@@ -1207,6 +1210,7 @@ static struct builtin_term builtin_termc
     {(int)KS_UCS,	"[UCS]"},
     {(int)KS_MS,	"[MS]"},
     {(int)KS_UT,	"[UT]"},
+    {(int)KS_XN,	"[XN]"},
 #  ifdef TERMINFO
     {(int)KS_CM,	"[%p1%dCM%p2%d]"},
 #  else
@@ -1645,6 +1649,9 @@ set_termname(term)
 		if ((T_XS == NULL || T_XS == empty_option)
 							&& tgetflag("xs") > 0)
 		    T_XS = (char_u *)"y";
+		if ((T_XN == NULL || T_XN == empty_option)
+							&& tgetflag("xn") > 0)
+		    T_XN = (char_u *)"y";
 		if ((T_DB == NULL || T_DB == empty_option)
 							&& tgetflag("db") > 0)
 		    T_DB = (char_u *)"y";
--- a/src/term.h
+++ b/src/term.h
@@ -66,6 +66,7 @@ enum SpecialKey
     KS_CSF,	/* set foreground color */
     KS_CSB,	/* set background color */
     KS_XS,	/* standout not erased by overwriting (hpterm) */
+    KS_XN,	/* newline glitch */
     KS_MB,	/* blink mode */
     KS_CAF,	/* set foreground color (ANSI) */
     KS_CAB,	/* set background color (ANSI) */
@@ -144,6 +145,7 @@ extern char_u *(term_strings[]);    /* c
 #define T_CSF	(term_str(KS_CSF))	/* set foreground color */
 #define T_CSB	(term_str(KS_CSB))	/* set background color */
 #define T_XS	(term_str(KS_XS))	/* standout not erased by overwriting */
+#define T_XN	(term_str(KS_XN))	/* newline glitch */
 #define T_MB	(term_str(KS_MB))	/* blink mode */
 #define T_CAF	(term_str(KS_CAF))	/* set foreground color (ANSI) */
 #define T_CAB	(term_str(KS_CAB))	/* set background color (ANSI) */
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    627,
+/**/
     626,
 /**/
     625,