tui: Enable mode-sensitive cursor by default.

Also give NVIM_TUI_ENABLE_CURSOR_SHAPE more granularity:
0 = do not change cursor shape
1 = non-blinking ("steady") cursor with mode-sensitive shape
2 = blinking cursor with mode-sensitive shape

Note: blink state is not changed for Konsole, instead user's terminal
preference makes the decision. (Can't do that for xterm-likes, DECSCUSR
forces us to choose blink-state.)

This is a temporary step until the TUI respects 'guicursor'
Ref: https://github.com/neovim/neovim/issues/2583#issuecomment-272988384
This commit is contained in:
Justin M. Keyes
2017-01-20 01:20:34 +01:00
parent 8684fdda3b
commit ef753a76b9
3 changed files with 20 additions and 14 deletions

View File

@@ -372,9 +372,10 @@ Used to set the 'shell' option, which determines the shell used by the
.Ic :terminal .Ic :terminal
command. command.
.It Ev NVIM_TUI_ENABLE_CURSOR_SHAPE .It Ev NVIM_TUI_ENABLE_CURSOR_SHAPE
If defined, change the cursor shape to a vertical bar while in insert mode. Set to 0 to prevent Nvim from changing the cursor shape.
Requires that the host terminal supports the DECSCUSR CSI escape sequence. Set to 1 to enable non-blinking mode-sensitive cursor (this is the default).
Has no effect in GUIs. Set to 2 to enable blinking mode-sensitive cursor.
Host terminal must support the DECSCUSR CSI escape sequence.
.Pp .Pp
Depending on the terminal emulator, using this option with Depending on the terminal emulator, using this option with
.Nm .Nm

View File

@@ -877,9 +877,11 @@ static void fix_terminfo(TUIData *data)
unibi_set_str(ut, unibi_set_a_background, XTERM_SETAB); unibi_set_str(ut, unibi_set_a_background, XTERM_SETAB);
} }
if (os_getenv("NVIM_TUI_ENABLE_CURSOR_SHAPE") == NULL) { const char * env_cusr_shape = os_getenv("NVIM_TUI_ENABLE_CURSOR_SHAPE");
if (env_cusr_shape && strncmp(env_cusr_shape, "0", 1) == 0) {
goto end; goto end;
} }
bool cusr_blink = env_cusr_shape && strncmp(env_cusr_shape, "2", 1) == 0;
#define TMUX_WRAP(seq) (inside_tmux ? "\x1bPtmux;\x1b" seq "\x1b\\" : seq) #define TMUX_WRAP(seq) (inside_tmux ? "\x1bPtmux;\x1b" seq "\x1b\\" : seq)
// Support changing cursor shape on some popular terminals. // Support changing cursor shape on some popular terminals.
@@ -891,22 +893,22 @@ static void fix_terminfo(TUIData *data)
// Konsole uses a proprietary escape code to set the cursor shape // Konsole uses a proprietary escape code to set the cursor shape
// and does not support DECSCUSR. // and does not support DECSCUSR.
data->unibi_ext.set_cursor_shape_bar = (int)unibi_add_ext_str(ut, NULL, data->unibi_ext.set_cursor_shape_bar = (int)unibi_add_ext_str(ut, NULL,
TMUX_WRAP("\x1b]50;CursorShape=1;BlinkingCursorEnabled=1\x07")); TMUX_WRAP("\x1b]50;CursorShape=1\x07"));
data->unibi_ext.set_cursor_shape_ul = (int)unibi_add_ext_str(ut, NULL, data->unibi_ext.set_cursor_shape_ul = (int)unibi_add_ext_str(ut, NULL,
TMUX_WRAP("\x1b]50;CursorShape=2;BlinkingCursorEnabled=1\x07")); TMUX_WRAP("\x1b]50;CursorShape=2\x07"));
data->unibi_ext.set_cursor_shape_block = (int)unibi_add_ext_str(ut, NULL, data->unibi_ext.set_cursor_shape_block = (int)unibi_add_ext_str(ut, NULL,
TMUX_WRAP("\x1b]50;CursorShape=0;BlinkingCursorEnabled=0\x07")); TMUX_WRAP("\x1b]50;CursorShape=0\x07"));
} else if (!vte_version || atoi(vte_version) >= 3900) { } else if (!vte_version || atoi(vte_version) >= 3900) {
// Assume that the terminal supports DECSCUSR unless it is an // Assume that the terminal supports DECSCUSR unless it is an
// old VTE based terminal. This should not get wrapped for tmux, // old VTE based terminal. This should not get wrapped for tmux,
// which will handle it via its Ss/Se terminfo extension - usually // which will handle it via its Ss/Se terminfo extension - usually
// according to its terminal-overrides. // according to its terminal-overrides.
data->unibi_ext.set_cursor_shape_bar = data->unibi_ext.set_cursor_shape_bar =
(int)unibi_add_ext_str(ut, NULL, "\x1b[5 q"); (int)unibi_add_ext_str(ut, NULL, cusr_blink ? "\x1b[5 q" : "\x1b[6 q");
data->unibi_ext.set_cursor_shape_ul = data->unibi_ext.set_cursor_shape_ul =
(int)unibi_add_ext_str(ut, NULL, "\x1b[3 q"); (int)unibi_add_ext_str(ut, NULL, cusr_blink ? "\x1b[3 q" : "\x1b[4 q");
data->unibi_ext.set_cursor_shape_block = data->unibi_ext.set_cursor_shape_block =
(int)unibi_add_ext_str(ut, NULL, "\x1b[2 q"); (int)unibi_add_ext_str(ut, NULL, cusr_blink ? "\x1b[1 q" : "\x1b[2 q");
} }
end: end:

View File

@@ -68,7 +68,8 @@
-- }) -- })
-- screen:set_default_attr_ignore( {{}, {bold=true, foreground=NonText}} ) -- screen:set_default_attr_ignore( {{}, {bold=true, foreground=NonText}} )
-- --
-- To help write screen tests, see screen:snapshot_util(). -- To help write screen tests, see Screen:snapshot_util().
-- To debug screen tests, see Screen:redraw_debug().
local helpers = require('test.functional.helpers')(nil) local helpers = require('test.functional.helpers')(nil)
local request, run, uimeths = helpers.request, helpers.run, helpers.uimeths local request, run, uimeths = helpers.request, helpers.run, helpers.uimeths
@@ -520,9 +521,11 @@ function Screen:_current_screen()
return table.concat(rv, '\n') return table.concat(rv, '\n')
end end
-- Utility to generate/debug tests. Call it where screen:expect() would be. -- Generates tests. Call it where Screen:expect() would be. Waits briefly, then
-- Waits briefly, then dumps the current screen state in the form of -- dumps the current screen state in the form of Screen:expect().
-- screen:expect(). Use snapshot_util({},true) to generate a text-only test. -- Use snapshot_util({},true) to generate a text-only (no attributes) test.
--
-- @see Screen:redraw_debug()
function Screen:snapshot_util(attrs, ignore) function Screen:snapshot_util(attrs, ignore)
self:sleep(250) self:sleep(250)
self:print_snapshot(attrs, ignore) self:print_snapshot(attrs, ignore)