aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/terminal.c6
-rw-r--r--test/functional/terminal/buffer_spec.lua10
2 files changed, 16 insertions, 0 deletions
diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c
index 43f68f7321..ea3617098b 100644
--- a/src/nvim/terminal.c
+++ b/src/nvim/terminal.c
@@ -782,6 +782,12 @@ static int terminal_execute(VimState *state, int key)
FALLTHROUGH;
default:
+ if (key == Ctrl_C) {
+ // terminal_enter() always sets `mapped_ctrl_c` to avoid `got_int`. 8eeda7169aa4
+ // But `got_int` may be set elsewhere, e.g. by interrupt() or an autocommand,
+ // so ensure that it is cleared.
+ got_int = false;
+ }
if (key == Ctrl_BSL && !s->got_bsl) {
s->got_bsl = true;
break;
diff --git a/test/functional/terminal/buffer_spec.lua b/test/functional/terminal/buffer_spec.lua
index 365a4f8035..767a3dc205 100644
--- a/test/functional/terminal/buffer_spec.lua
+++ b/test/functional/terminal/buffer_spec.lua
@@ -312,6 +312,16 @@ describe(':terminal buffer', function()
pcall_err(command, 'write test/functional/fixtures/tty-test.c')
)
end)
+
+ it('external interrupt (got_int) does not hang #20726', function()
+ eq({ mode = 't', blocking = false }, api.nvim_get_mode())
+ command('call timer_start(0, {-> interrupt()})')
+ feed('<Ignore>') -- Add input to separate two RPC requests
+ eq({ mode = 't', blocking = false }, api.nvim_get_mode())
+ feed([[<C-\><C-N>]])
+ eq({ mode = 'nt', blocking = false }, api.nvim_get_mode())
+ command('bd!')
+ end)
end)
describe(':terminal buffer', function()