diff options
author | bfredl <bjorn.linse@gmail.com> | 2022-08-02 14:53:20 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-02 14:53:20 +0200 |
commit | 0806c882cdeb1d07006c7dec843cec68dc3fe7f4 (patch) | |
tree | 159c17ca45c0c0f11973455dc41fadd7907debb1 /src | |
parent | def0ced4c7207ee38d77f146e1527f283e44b6f2 (diff) | |
parent | 9092540315bef8a685a06825073d05c394bf6575 (diff) | |
download | rneovim-0806c882cdeb1d07006c7dec843cec68dc3fe7f4.tar.gz rneovim-0806c882cdeb1d07006c7dec843cec68dc3fe7f4.tar.bz2 rneovim-0806c882cdeb1d07006c7dec843cec68dc3fe7f4.zip |
Merge pull request #19584 from bfredl/terminal_c_BSL_c_O
implement <c-\><c-o> key for terminal mode
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/edit.c | 4 | ||||
-rw-r--r-- | src/nvim/screen.c | 6 | ||||
-rw-r--r-- | src/nvim/state.c | 7 | ||||
-rw-r--r-- | src/nvim/terminal.c | 26 |
4 files changed, 33 insertions, 10 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c index e7a8f81813..5861e4c52b 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -1223,10 +1223,10 @@ bool edit(int cmdchar, bool startln, long count) // the value of `restart_edit` before `ex_normal` returns. restart_edit = 'i'; force_restart_edit = true; + return false; } else { - terminal_enter(); + return terminal_enter(); } - return false; } // Don't allow inserting in the sandbox. diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 80f6f75fea..0d3b936c48 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -6026,7 +6026,11 @@ int showmode(void) msg_puts_attr(_(" INSERT"), attr); } else if (restart_edit == 'I' || restart_edit == 'i' || restart_edit == 'a' || restart_edit == 'A') { - msg_puts_attr(_(" (insert)"), attr); + if (curbuf->terminal) { + msg_puts_attr(_(" (terminal)"), attr); + } else { + msg_puts_attr(_(" (insert)"), attr); + } } else if (restart_edit == 'R') { msg_puts_attr(_(" (replace)"), attr); } else if (restart_edit == 'V') { diff --git a/src/nvim/state.c b/src/nvim/state.c index be8017ea83..d6cca71ad8 100644 --- a/src/nvim/state.c +++ b/src/nvim/state.c @@ -211,12 +211,15 @@ void get_mode(char *buf) buf[i++] = 'o'; // to be able to detect force-linewise/blockwise/charwise operations buf[i++] = (char)motion_force; + } else if (curbuf->terminal) { + buf[i++] = 't'; + if (restart_edit == 'I') { + buf[i++] = 'T'; + } } else if (restart_edit == 'I' || restart_edit == 'R' || restart_edit == 'V') { buf[i++] = 'i'; buf[i++] = (char)restart_edit; - } else if (curbuf->terminal) { - buf[i++] = 't'; } } diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index fc02d9d53a..c23aff00cb 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -82,6 +82,7 @@ typedef struct terminal_state { int save_rd; // saved value of RedrawingDisabled bool close; bool got_bsl; // if the last input was <C-\> + bool got_bsl_o; // if left terminal mode with <c-\><c-o> } TerminalState; #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -388,12 +389,11 @@ void terminal_check_size(Terminal *term) } /// Implements MODE_TERMINAL state. :help Terminal-mode -void terminal_enter(void) +bool terminal_enter(void) { buf_T *buf = curbuf; assert(buf->terminal); // Should only be called when curbuf has a terminal. - TerminalState state, *s = &state; - memset(s, 0, sizeof(TerminalState)); + TerminalState s[1] = { 0 }; s->term = buf->terminal; stop_insert_mode = false; @@ -443,7 +443,9 @@ void terminal_enter(void) s->state.check = terminal_check; state_enter(&s->state); - restart_edit = 0; + if (!s->got_bsl_o) { + restart_edit = 0; + } State = save_state; RedrawingDisabled = s->save_rd; apply_autocmds(EVENT_TERMLEAVE, NULL, NULL, false, curbuf); @@ -467,7 +469,11 @@ void terminal_enter(void) if (curbuf->terminal == s->term && !s->close) { terminal_check_cursor(); } - unshowmode(true); + if (restart_edit) { + showmode(); + } else { + unshowmode(true); + } ui_busy_stop(); if (s->close) { bool wipe = s->term->buf_handle != 0; @@ -477,6 +483,8 @@ void terminal_enter(void) do_cmdline_cmd("bwipeout!"); } } + + return s->got_bsl_o; } static void terminal_check_cursor(void) @@ -564,6 +572,14 @@ static int terminal_execute(VimState *state, int key) } FALLTHROUGH; + case Ctrl_O: + if (s->got_bsl) { + s->got_bsl_o = true; + restart_edit = 'I'; + return 0; + } + FALLTHROUGH; + default: if (key == Ctrl_BSL && !s->got_bsl) { s->got_bsl = true; |