aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/msgpack_rpc/remote_ui.c2
-rw-r--r--src/nvim/tui/tui.c11
-rw-r--r--src/nvim/ui.c4
-rw-r--r--test/functional/ui/screen.lua2
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