diff options
-rw-r--r-- | src/nvim/msgpack_rpc/remote_ui.c | 2 | ||||
-rw-r--r-- | src/nvim/tui/tui.c | 11 | ||||
-rw-r--r-- | src/nvim/ui.c | 4 | ||||
-rw-r--r-- | test/functional/ui/screen.lua | 2 |
4 files changed, 16 insertions, 3 deletions
diff --git a/src/nvim/msgpack_rpc/remote_ui.c b/src/nvim/msgpack_rpc/remote_ui.c index 35a76ac901..e582bf9550 100644 --- a/src/nvim/msgpack_rpc/remote_ui.c +++ b/src/nvim/msgpack_rpc/remote_ui.c @@ -218,6 +218,8 @@ static void remote_ui_mode_change(UI *ui, int mode) Array args = ARRAY_DICT_INIT; if (mode == INSERT) { ADD(args, STRING_OBJ(cstr_to_string("insert"))); + } else if (mode == REPLACE) { + ADD(args, STRING_OBJ(cstr_to_string("replace"))); } else { assert(mode == NORMAL); ADD(args, STRING_OBJ(cstr_to_string("normal"))); diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c index 7baff1318e..2659125d2d 100644 --- a/src/nvim/tui/tui.c +++ b/src/nvim/tui/tui.c @@ -61,7 +61,7 @@ typedef struct { struct { int enable_mouse, disable_mouse; int enable_bracketed_paste, disable_bracketed_paste; - int enter_insert_mode, exit_insert_mode; + int enter_insert_mode, enter_replace_mode, exit_insert_mode; int set_rgb_foreground, set_rgb_background; } unibi_ext; } TUIData; @@ -105,6 +105,7 @@ UI *tui_start(void) data->unibi_ext.enable_bracketed_paste = -1; data->unibi_ext.disable_bracketed_paste = -1; data->unibi_ext.enter_insert_mode = -1; + data->unibi_ext.enter_replace_mode = -1; data->unibi_ext.exit_insert_mode = -1; // write output to stderr if stdout is not a tty @@ -413,6 +414,10 @@ static void tui_mode_change(UI *ui, int mode) if (data->showing_mode != INSERT) { unibi_out(ui, data->unibi_ext.enter_insert_mode); } + } else if (mode == REPLACE) { + if (data->showing_mode != REPLACE) { + unibi_out(ui, data->unibi_ext.enter_replace_mode); + } } else { assert(mode == NORMAL); if (data->showing_mode != NORMAL) { @@ -810,12 +815,16 @@ static void fix_terminfo(TUIData *data) // iterm data->unibi_ext.enter_insert_mode = (int)unibi_add_ext_str(ut, NULL, TMUX_WRAP("\x1b]50;CursorShape=1;BlinkingCursorEnabled=1\x07")); + data->unibi_ext.enter_replace_mode = (int)unibi_add_ext_str(ut, NULL, + TMUX_WRAP("\x1b]50;CursorShape=2;BlinkingCursorEnabled=1\x07")); data->unibi_ext.exit_insert_mode = (int)unibi_add_ext_str(ut, NULL, TMUX_WRAP("\x1b]50;CursorShape=0;BlinkingCursorEnabled=0\x07")); } else { // xterm-like sequences for blinking bar and solid block data->unibi_ext.enter_insert_mode = (int)unibi_add_ext_str(ut, NULL, TMUX_WRAP("\x1b[5 q")); + data->unibi_ext.enter_replace_mode = (int)unibi_add_ext_str(ut, NULL, + TMUX_WRAP("\x1b[3 q")); data->unibi_ext.exit_insert_mode = (int)unibi_add_ext_str(ut, NULL, TMUX_WRAP("\x1b[2 q")); } diff --git a/src/nvim/ui.c b/src/nvim/ui.c index 2e8fc7a6bb..7e155f9b4f 100644 --- a/src/nvim/ui.c +++ b/src/nvim/ui.c @@ -476,7 +476,9 @@ static void ui_mode_change(void) return; } /* Get a simple UI mode out of State. */ - if (State & INSERT) + if ((State & REPLACE) == REPLACE) + mode = REPLACE; + else if (State & INSERT) mode = INSERT; else mode = NORMAL; diff --git a/test/functional/ui/screen.lua b/test/functional/ui/screen.lua index 4b39a74957..1d616ed853 100644 --- a/test/functional/ui/screen.lua +++ b/test/functional/ui/screen.lua @@ -341,7 +341,7 @@ function Screen:_handle_mouse_off() end function Screen:_handle_mode_change(mode) - assert(mode == 'insert' or mode == 'normal') + assert(mode == 'insert' or mode == 'replace' or mode == 'normal') self._mode = mode end |