mirror of
https://github.com/neovim/neovim.git
synced 2025-10-01 15:38:33 +00:00
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:
@@ -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
|
||||||
|
@@ -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:
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user