Skip to content

Instantly share code, notes, and snippets.

@saitoha
Last active August 29, 2015 14:13
Show Gist options
  • Save saitoha/aa6485b2533639843508 to your computer and use it in GitHub Desktop.
Save saitoha/aa6485b2533639843508 to your computer and use it in GitHub Desktop.
vim: respect xenl/xn capability when writing a character on the last cell of terminal screen
diff -r 930ad67c0414 runtime/doc/term.txt
--- a/runtime/doc/term.txt Tue Jan 27 14:09:37 2015 +0100
+++ b/runtime/doc/term.txt Tue Jan 27 22:16:32 2015 +0900
@@ -224,10 +224,11 @@
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 @@
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'*
diff -r 930ad67c0414 src/option.c
--- a/src/option.c Tue Jan 27 14:09:37 2015 +0100
+++ b/src/option.c Tue Jan 27 22:16:32 2015 +0900
@@ -2979,6 +2979,7 @@
p_term("t_SI", T_CSI)
p_term("t_EI", T_CEI)
p_term("t_xs", T_XS)
+ p_term("t_xn", T_XN)
p_term("t_ZH", T_CZH)
p_term("t_ZR", T_CZR)
diff -r 930ad67c0414 src/screen.c
--- a/src/screen.c Tue Jan 27 14:09:37 2015 +0100
+++ b/src/screen.c Tue Jan 27 22:16:32 2015 +0900
@@ -7945,8 +7945,9 @@
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) */
+ * Don't do it! Mark the character invalid (update it when scrolled up) */
if (row == screen_Rows - 1 && col == screen_Columns - 1
+ && *T_XN == NUL
#ifdef FEAT_RIGHTLEFT
/* account for first command-line character in rightleft mode */
&& !cmdmsg_rl
diff -r 930ad67c0414 src/term.c
--- a/src/term.c Tue Jan 27 14:09:37 2015 +0100
+++ b/src/term.c Tue Jan 27 22:16:32 2015 +0900
@@ -200,6 +200,7 @@
{(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 @@
{(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 @@
{(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 @@
{(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 @@
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";
diff -r 930ad67c0414 src/term.h
--- a/src/term.h Tue Jan 27 14:09:37 2015 +0100
+++ b/src/term.h Tue Jan 27 22:16:32 2015 +0900
@@ -66,6 +66,7 @@
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 @@
#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) */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment