diff --git a/src/reader.cpp b/src/reader.cpp index 50b022a68..0267be555 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -2773,6 +2773,10 @@ void reader_data_t::handle_readline_command(readline_cmd_t c, readline_loop_stat set_command_line_and_position(&command_line, L"", 0); s_reset_abandoning_line(&screen, termsize_last().width - command_line.size()); + + // Post fish_cancel, allowing it to fire. + signal_clear_cancel(); + event_fire_generic(parser(), L"fish_cancel"); } break; } diff --git a/tests/pexpects/cancel_event.py b/tests/pexpects/cancel_event.py new file mode 100644 index 000000000..c68909974 --- /dev/null +++ b/tests/pexpects/cancel_event.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +import os +from pexpect_helper import SpawnedProc +import signal + +sp = SpawnedProc() +send, sendline, sleep, expect_str, expect_prompt = sp.send, sp.sendline, sp.sleep, sp.expect_str, sp.expect_prompt +expect_prompt() + +# Verify that cancel-commandline does what we expect - see #7384. +send("not executed") +sleep(0.05) +os.kill(sp.spawn.pid, signal.SIGINT) +sp.expect_str("not executed^C") +expect_prompt(increment=False) + +sendline("function cancelhandler --on-event fish_cancel ; echo yay cancelled ; end") +expect_prompt() +send("still not executed") +sleep(0.05) +os.kill(sp.spawn.pid, signal.SIGINT) +expect_str("still not executed^C") +expect_prompt("yay cancelled", increment=False)