aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/os/env.c17
-rw-r--r--src/nvim/tui/tui.c53
2 files changed, 56 insertions, 14 deletions
diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c
index 72bd0bf788..8f7a6e72b5 100644
--- a/src/nvim/os/env.c
+++ b/src/nvim/os/env.c
@@ -915,9 +915,20 @@ bool os_term_is_nice(void)
return true;
#else
const char *vte_version = os_getenv("VTE_VERSION");
- return (vte_version && atoi(vte_version) >= 3900)
- || NULL != os_getenv("KONSOLE_PROFILE_NAME")
- || NULL != os_getenv("KONSOLE_DBUS_SESSION");
+ if ((vte_version && atoi(vte_version) >= 3900)
+ || os_getenv("KONSOLE_PROFILE_NAME")
+ || os_getenv("KONSOLE_DBUS_SESSION")) {
+ return true;
+ }
+ const char *termprg = os_getenv("TERM_PROGRAM");
+ if (termprg && striequal(termprg, "iTerm.app")) {
+ return true;
+ }
+ const char *term = os_getenv("TERM");
+ if (term && strncmp(term, "rxvt", 4) == 0) {
+ return true;
+ }
+ return false;
#endif
}
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 6ea6376202..ae7551098d 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -43,6 +43,15 @@
#define OUTBUF_SIZE 0xffff
#define TOO_MANY_EVENTS 1000000
+#define STARTS_WITH(str, prefix) (!memcmp(str, prefix, sizeof(prefix) - 1))
+
+typedef enum TermType {
+ kTermUnknown,
+ kTermGnome,
+ kTermiTerm,
+ kTermKonsole,
+ kTermRxvt,
+} TermType;
typedef struct {
int top, bot, left, right;
@@ -77,6 +86,7 @@ typedef struct {
cursorentry_T cursor_shapes[SHAPE_IDX_COUNT];
HlAttrs print_attrs;
ModeShape showing_mode;
+ TermType term;
struct {
int enable_mouse, disable_mouse;
int enable_bracketed_paste, disable_bracketed_paste;
@@ -528,7 +538,6 @@ static void tui_mouse_off(UI *ui)
}
}
-/// @param mode one of SHAPE_XXX
static void tui_set_mode(UI *ui, ModeShape mode)
{
if (!cursor_style_enabled) {
@@ -537,14 +546,14 @@ static void tui_set_mode(UI *ui, ModeShape mode)
TUIData *data = ui->data;
cursorentry_T c = data->cursor_shapes[mode];
int shape = c.shape;
- bool inside_tmux = os_getenv("TMUX") != NULL;
+ bool is_tmux = os_getenv("TMUX") != NULL;
unibi_var_t vars[26 + 26] = { { 0 } };
-# define TMUX_WRAP(seq) (inside_tmux ? "\x1bPtmux;\x1b" seq "\x1b\\" : seq)
+# define TMUX_WRAP(seq) (is_tmux ? "\x1bPtmux;\x1b" seq "\x1b\\" : seq)
// Support changing cursor shape on some popular terminals.
const char *vte_version = os_getenv("VTE_VERSION");
- if (os_getenv("KONSOLE_PROFILE_NAME") || os_getenv("KONSOLE_DBUS_SESSION")) {
+ if (data->term == kTermKonsole) {
// Konsole uses a proprietary escape code to set the cursor shape
// and does not support DECSCUSR.
switch (shape) {
@@ -921,6 +930,24 @@ static void unibi_set_if_empty(unibi_term *ut, enum unibi_string str,
}
}
+static TermType detect_term(const char *term, const char *colorterm)
+{
+ if (STARTS_WITH(term, "rxvt")) {
+ return kTermRxvt;
+ }
+ if (os_getenv("KONSOLE_PROFILE_NAME") || os_getenv("KONSOLE_DBUS_SESSION")) {
+ return kTermKonsole;
+ }
+ const char *termprg = os_getenv("TERM_PROGRAM");
+ if (termprg && strstr(termprg, "iTerm.app")) {
+ return kTermiTerm;
+ }
+ if (colorterm && strstr(colorterm, "gnome-terminal")) {
+ return kTermGnome;
+ }
+ return kTermUnknown;
+}
+
static void fix_terminfo(TUIData *data)
{
unibi_term *ut = data->ut;
@@ -930,10 +957,9 @@ static void fix_terminfo(TUIData *data)
if (!term) {
goto end;
}
+ data->term = detect_term(term, colorterm);
-#define STARTS_WITH(str, prefix) (!memcmp(str, prefix, sizeof(prefix) - 1))
-
- if (STARTS_WITH(term, "rxvt")) {
+ if (data->term == kTermRxvt) {
unibi_set_if_empty(ut, unibi_exit_attribute_mode, "\x1b[m\x1b(B");
unibi_set_if_empty(ut, unibi_flash_screen, "\x1b[?5h$<20/>\x1b[?5l");
unibi_set_if_empty(ut, unibi_enter_italics_mode, "\x1b[3m");
@@ -945,7 +971,7 @@ static void fix_terminfo(TUIData *data)
unibi_set_if_empty(ut, unibi_from_status_line, "\x1b\\");
}
- if (STARTS_WITH(term, "xterm") || STARTS_WITH(term, "rxvt")) {
+ if (STARTS_WITH(term, "xterm") || data->term == kTermRxvt) {
const char *normal = unibi_get_str(ut, unibi_cursor_normal);
if (!normal) {
unibi_set_str(ut, unibi_cursor_normal, "\x1b[?25h");
@@ -982,7 +1008,7 @@ static void fix_terminfo(TUIData *data)
if ((colorterm && strstr(colorterm, "256"))
|| strstr(term, "256")
|| strstr(term, "xterm")) {
- // Assume TERM~=xterm or COLORTERM~=256 supports 256 colors.
+ // Assume TERM=~xterm or COLORTERM=~256 supports 256 colors.
unibi_set_num(ut, unibi_max_colors, 256);
unibi_set_str(ut, unibi_set_a_foreground, XTERM_SETAF);
unibi_set_str(ut, unibi_set_a_background, XTERM_SETAB);
@@ -990,8 +1016,13 @@ static void fix_terminfo(TUIData *data)
end:
// Fill some empty slots with common terminal strings
- data->unibi_ext.set_cursor_color = (int)unibi_add_ext_str(
- ut, NULL, "\033]12;#%p1%06x\007");
+ if (data->term == kTermiTerm) {
+ data->unibi_ext.set_cursor_color = (int)unibi_add_ext_str(
+ ut, NULL, "\033]Pl%p1%06x\033\\");
+ } else {
+ data->unibi_ext.set_cursor_color = (int)unibi_add_ext_str(
+ ut, NULL, "\033]12;#%p1%06x\007");
+ }
data->unibi_ext.enable_mouse = (int)unibi_add_ext_str(ut, NULL,
"\x1b[?1002h\x1b[?1006h");
data->unibi_ext.disable_mouse = (int)unibi_add_ext_str(ut, NULL,