aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/term.txt21
-rw-r--r--src/nvim/tui/tui.c48
2 files changed, 54 insertions, 15 deletions
diff --git a/runtime/doc/term.txt b/runtime/doc/term.txt
index c4eefe4e53..fcfb548723 100644
--- a/runtime/doc/term.txt
+++ b/runtime/doc/term.txt
@@ -82,11 +82,16 @@ operation; and it will override |terminfo| saying that it has fewer colours
available.
*true-color* *xterm-true-color*
-Nvim supports using true (24-bit) colours in the terminal. |terminfo| does
-not contain flags to say when terminals have true colour support. So Nvim
-simply assumes true colour support for (all) "xterm", "rxvt", "linux",
-"putty", and "iterm" terminal types, or when Konsole or a terminal emulator
-that sets the COLORTERM environment variable to "truecolor" is detected.
+Nvim supports using true (24-bit) colours in the terminal, on terminals that
+support it. It uses the same |terminfo| extensions that were proposed by
+RĂ¼diger Sonderfeld in 2013 for this: "setrgbf" and "setrgbb". If your
+terminfo definition specifies these, then nothing more is required.
+
+If your terminfo definition is missing them, then Nvim will on a wide range of
+terminals resort to using the ISO 8613-6:1994/ITU T.416:1993 control sequences
+for setting RGB colours. This includes the "rxvt", "linux", "st", and "iterm"
+terminal types, or when Konsole, genuine Xterm, or a terminal emulator that
+sets the COLORTERM environment variable to "truecolor" is detected.
*xterm-resize*
Nvim can resize the terminal display on some terminals that implement an
@@ -99,12 +104,14 @@ Nvim will adjust the shape of the cursor from a block to a line when in insert
mode (or as specified by the 'guicursor' option), on terminals that support
it. It uses the same |terminfo| extensions that were pioneered by tmux for
this: "Ss" and "Se". If your terminfo definition specifies these, as some
-(such as "xterm+tmux") do, then nothing more is required.
+(such as those based upon "xterm+tmux") do, then nothing more is required.
If your terminfo definition is missing them, then Nvim will on a wide range of
terminals resort to using the conventional DECSUSR control sequence for
adjusting the cursor shape. If Konsole is detected, Nvim will use the
-idiosyncratic Konsole terminal control sequences for this.
+idiosyncratic Konsole terminal control sequences for this. Similarly if the
+Linux kernel's built-in terminal emulator is detected, with its idiosyncratic
+control sequence.
Note: tmux itself accepts the conventional DECSUSR control sequence, the same
as many other terminals do. It has to translate this into whatever control
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 58c9e75de8..3c985bcbcb 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -2447,7 +2447,7 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
// Dickey ncurses terminfo has included the Ss and Se capabilities, pioneered
// by tmux, since 2011-07-14. So adding them to terminal types, that do
- // actually have such control sequences but lack the currect definitions in
+ // actually have such control sequences but lack the correct definitions in
// terminfo, is a fixup, not an augmentation.
data->unibi_ext.reset_cursor_style = unibi_find_ext_str(ut, "Se");
data->unibi_ext.set_cursor_style = unibi_find_ext_str(ut, "Ss");
@@ -2479,7 +2479,7 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
// form.
data->unibi_ext.set_cursor_style = (int)unibi_add_ext_str(ut, "Ss",
"\x1b[%?"
- "%p1%{4}%>" "%t%p1%{2}%-" // a bit of a bodge for extension values
+ "%p1%{4}%>" "%t%p1%{2}%-" // a bit of a bodge for extension values
"%e%p1" // the conventional codes are just passed through
"%;%d q");
if (-1 == data->unibi_ext.reset_cursor_style) {
@@ -2537,6 +2537,7 @@ static void augment_terminfo(TUIData *data, const char *term,
const char *colorterm, long vte_version, bool konsole, bool iterm)
{
unibi_term *ut = data->ut;
+ bool true_xterm = !!os_getenv("XTERM_VERSION");
bool xterm = term && STARTS_WITH(term, "xterm");
bool dtterm = term && STARTS_WITH(term, "dtterm");
bool linuxvt = term && STARTS_WITH(term, "linux");
@@ -2544,6 +2545,7 @@ static void augment_terminfo(TUIData *data, const char *term,
bool teraterm = term && STARTS_WITH(term, "teraterm");
bool putty = term && STARTS_WITH(term, "putty");
bool screen = term && STARTS_WITH(term, "screen");
+ bool st = term && STARTS_WITH(term, "st");
bool tmux_wrap = screen && !!os_getenv("TMUX");
bool truecolor = colorterm
&& (0 == strcmp(colorterm, "truecolor") || 0 == strcmp(colorterm, "24bit"));
@@ -2561,13 +2563,43 @@ static void augment_terminfo(TUIData *data, const char *term,
data->unibi_ext.reset_scroll_region = (int)unibi_add_ext_str(ut, NULL,
"\x1b[r");
}
- // See https://gist.github.com/XVilka/8346728 for more about this.
- if (putty || xterm || rxvt || linuxvt || konsole || iterm || truecolor) {
- data->unibi_ext.set_rgb_foreground = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[38;2;%p1%d;%p2%d;%p3%dm");
- data->unibi_ext.set_rgb_background = (int)unibi_add_ext_str(ut, NULL,
- "\x1b[48;2;%p1%d;%p2%d;%p3%dm");
+
+ // Dickey ncurses terminfo does not include the setrgbf and setrgbb
+ // capabilities, proposed by RĂ¼diger Sonderfeld on 2013-10-15. So adding
+ // them to terminal types, that do actually have such control sequences but
+ // lack the correct definitions in terminfo, is an augmentation, not a
+ // fixup. See https://gist.github.com/XVilka/8346728 for more about this.
+ bool has_standard_rgb = vte_version >= 3600 // per GNOME bug #685759
+ || true_xterm;
+ // "standard" means using colons like ISO 8613-6:1994/ITU T.416:1993 says.
+ bool has_non_standard_rgb =
+ linuxvt // Linux 4.8+ supports true-colour SGR.
+ || konsole // per commentary in VT102Emulation.cpp
+ // per http://lists.schmorp.de/pipermail/rxvt-unicode/2016q2/002261.html
+ || rxvt
+ || st // per experimentation
+ || iterm || truecolor;
+ data->unibi_ext.set_rgb_foreground = unibi_find_ext_str(ut, "setrgbf");
+ if (-1 == data->unibi_ext.set_rgb_foreground) {
+ if (has_standard_rgb) {
+ data->unibi_ext.set_rgb_foreground = (int)unibi_add_ext_str(ut, "setrgbf",
+ "\x1b[38:2:%p1%d:%p2%d:%p3%dm");
+ } else if (has_non_standard_rgb) {
+ data->unibi_ext.set_rgb_foreground = (int)unibi_add_ext_str(ut, "setrgbf",
+ "\x1b[38;2;%p1%d;%p2%d;%p3%dm");
+ }
+ }
+ data->unibi_ext.set_rgb_background = unibi_find_ext_str(ut, "setrgbb");
+ if (-1 == data->unibi_ext.set_rgb_background) {
+ if (has_standard_rgb) {
+ data->unibi_ext.set_rgb_background = (int)unibi_add_ext_str(ut, "setrgbb",
+ "\x1b[48:2:%p1%d:%p2%d:%p3%dm");
+ } else if (has_non_standard_rgb) {
+ data->unibi_ext.set_rgb_background = (int)unibi_add_ext_str(ut, "setrgbb",
+ "\x1b[48;2;%p1%d;%p2%d;%p3%dm");
+ }
}
+
if (iterm) {
data->unibi_ext.set_cursor_color = (int)unibi_add_ext_str(
ut, NULL, TMUX_WRAP(tmux_wrap, "\033]Pl%p1%06x\033\\"));