diff options
-rw-r--r-- | runtime/doc/options.txt | 2 | ||||
-rw-r--r-- | src/nvim/main.c | 2 | ||||
-rw-r--r-- | src/nvim/option.c | 20 | ||||
-rw-r--r-- | src/nvim/os/env.c | 14 | ||||
-rw-r--r-- | test/functional/ui/cursor_spec.lua | 9 |
5 files changed, 33 insertions, 14 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index bd9bc5820b..2d5551eafe 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -2796,7 +2796,7 @@ A jump table for the options with a short description can be found at |Q_op|. -blinkwait175-blinkoff150-blinkon175") global Configures the cursor style for each mode. Works in the GUI and some - terminals. Empty means "non-blinking block cursor in all modes": > + terminals. Unset to disable: > :set guicursor= < With tmux you might need this in ~/.tmux.conf (see terminal-overrides diff --git a/src/nvim/main.c b/src/nvim/main.c index 33e1551351..7ad42d6776 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -283,7 +283,7 @@ int main(int argc, char **argv) cmdline_row = (int)(Rows - p_ch); msg_row = cmdline_row; screenalloc(false); /* allocate screen buffers */ - set_init_2(); + set_init_2(params.headless); TIME_MSG("inits 2"); msg_scroll = TRUE; diff --git a/src/nvim/option.c b/src/nvim/option.c index 695d0edebf..458d80716c 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -939,11 +939,8 @@ void free_all_options(void) #endif -/* - * Initialize the options, part two: After getting Rows and Columns and - * setting 'term'. - */ -void set_init_2(void) +/// Initialize the options, part two: After getting Rows and Columns. +void set_init_2(bool headless) { int idx; @@ -966,8 +963,12 @@ void set_init_2(void) p_window = Rows - 1; } set_number_default("window", Rows - 1); - parse_shape_opt(SHAPE_CURSOR); /* set cursor shapes from 'guicursor' */ - (void)parse_printoptions(); /* parse 'printoptions' default value */ + if (!headless && !os_term_is_nice()) { + set_string_option_direct((char_u *)"guicursor", -1, (char_u *)"", + OPT_GLOBAL, SID_NONE); + } + parse_shape_opt(SHAPE_CURSOR); // set cursor shapes from 'guicursor' + (void)parse_printoptions(); // parse 'printoptions' default value } /* @@ -2842,9 +2843,10 @@ did_set_string_option ( } } - /* 'guicursor' */ - else if (varp == &p_guicursor) + // 'guicursor' + else if (varp == &p_guicursor) { errmsg = parse_shape_opt(SHAPE_CURSOR); + } else if (varp == &p_popt) errmsg = parse_printoptions(); diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index 1a97adfa21..839e0d1b51 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -889,3 +889,17 @@ bool os_setenv_append_path(const char *fname) } return false; } + +/// Returns true if the terminal can be assumed to silently ignore unknown +/// control codes. +bool os_term_is_nice(void) +{ +#if defined(__APPLE__) || defined(WIN32) + 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"); +#endif +} diff --git a/test/functional/ui/cursor_spec.lua b/test/functional/ui/cursor_spec.lua index c022a5649e..3ec3ffd08c 100644 --- a/test/functional/ui/cursor_spec.lua +++ b/test/functional/ui/cursor_spec.lua @@ -3,6 +3,7 @@ local Screen = require('test.functional.ui.screen') local clear, meths = helpers.clear, helpers.meths local eq = helpers.eq local command = helpers.command +local wait = helpers.wait describe('ui/cursor', function() local screen @@ -18,7 +19,7 @@ describe('ui/cursor', function() end) it("'guicursor' is published as a UI event", function() - command('redraw') + wait() screen:expect('', nil, nil, nil, true) -- Tickle the event-loop. local expected_cursor_style = { cmdline_hover = { @@ -149,13 +150,13 @@ describe('ui/cursor', function() -- Event is published ONLY if the cursor style changed. screen._cursor_style = nil - command('redraw') + wait() screen:expect('', nil, nil, nil, true) -- Tickle the event-loop. eq(nil, screen._cursor_style) -- Change the cursor style. meths.set_option('guicursor', 'n-v-c:ver35-blinkwait171-blinkoff172-blinkon173,ve:hor35,o:ver50,i-ci:block,r-cr:hor90,sm:ver42') - command('redraw') + wait() screen:expect('', nil, nil, nil, true) -- Tickle the event-loop. eq('vertical', screen._cursor_style.normal.cursor_shape) eq('horizontal', screen._cursor_style.visual_select.cursor_shape) @@ -171,6 +172,8 @@ describe('ui/cursor', function() meths.set_option('guicursor', '') command('redraw') screen:expect('', nil, nil, nil, true) -- Tickle the event-loop. + -- Empty 'guicursor' sets enabled=false. + eq(false, screen._cursor_style_enabled) for _, m in ipairs({ 'cmdline_insert', 'cmdline_normal', 'cmdline_replace', 'insert', 'showmatch', 'normal', 'replace', 'visual', 'visual_select', }) do |