aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/term.txt24
-rw-r--r--src/nvim/tui/tui.c25
2 files changed, 39 insertions, 10 deletions
diff --git a/runtime/doc/term.txt b/runtime/doc/term.txt
index 2a6b09a9ff..951947d865 100644
--- a/runtime/doc/term.txt
+++ b/runtime/doc/term.txt
@@ -134,11 +134,25 @@ 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.
+If your terminfo definition is missing them, then Nvim will decide whether to
+add them to your terminfo definition, using the ISO 8613-6:1994/ITU T.416:1993
+control sequences for setting RGB colours, but modified to use semicolons
+instead of colons unless the terminal is known to follow the standard.
+(Semicolons cause ambiguities that the standard avoided by specifying colons
+as a sub-parameter delimiter. A historical misunderstanding meant that many
+terminal emulators ended up using semicolons for many years, though.)
+
+A new convention, pioneered in 2016 by tmux, is the "Tc" terminfo extension.
+If your terminal's terminfo definition has this flag, Nvim will add
+constructed "setrgbf" and "setrgbb" capabilities as if they had been in the
+terminfo definition.
+
+If your terminal's terminfo definition does not (yet) have this flag, Nvim
+will fall back to looking at the TERM and other environment variables. For
+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, it will also add constructed "setrgbf"
+and "setrgbb" capabilities.
*xterm-resize*
Nvim can resize the terminal display on some terminals that implement an
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 387a340588..2996d634a2 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -1212,6 +1212,18 @@ static int unibi_find_ext_str(unibi_term *ut, const char *name)
return -1;
}
+static int unibi_find_ext_bool(unibi_term *ut, const char *name)
+ {
+ size_t max = unibi_count_ext_bool(ut);
+ for (size_t i = 0; i < max; ++i) {
+ const char * n = unibi_get_ext_bool_name(ut, i);
+ if (n && 0 == strcmp(n, name)) {
+ return (int)i;
+ }
+ }
+ return -1;
+}
+
/// Several entries in terminfo are known to be deficient or outright wrong,
/// unfortunately; and several terminal emulators falsely announce incorrect
/// terminal types. So patch the terminfo records after loading from an
@@ -1497,7 +1509,7 @@ static void augment_terminfo(TUIData *data, const char *term,
bool iterm_pretending_xterm = xterm && iterm_env;
bool true_xterm = xterm && !!xterm_version;
bool tmux_wrap = screen && !!os_getenv("TMUX");
- bool truecolor = colorterm
+ bool old_truecolor_env = colorterm
&& (0 == strcmp(colorterm, "truecolor") || 0 == strcmp(colorterm, "24bit"));
// Only define this capability for terminal types that we know understand it.
@@ -1519,17 +1531,20 @@ static void augment_terminfo(TUIData *data, const char *term,
// 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.
+ int Tc = unibi_find_ext_bool(ut, "Tc");
+ // "standard" means using colons like ISO 8613-6:1994/ITU T.416:1993 says.
bool has_standard_rgb = vte_version >= 3600 // per GNOME bug #685759
|| iterm || iterm_pretending_xterm // per analysis of VT100Terminal.m
|| 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.
+ bool has_non_standard_rgb = -1 != Tc
+ // terminfo is definitive if it says something.
+ ? unibi_get_ext_bool(ut, (size_t)Tc)
+ : 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
- || truecolor;
+ || old_truecolor_env;
data->unibi_ext.set_rgb_foreground = unibi_find_ext_str(ut, "setrgbf");
if (-1 == data->unibi_ext.set_rgb_foreground) {
if (has_standard_rgb) {