neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 6e2b514813f465c1f4da0ee00357dd63c44d1593
parent ef0c522077abe7186bb05370394f3eb4624a3384
Author: tao <2471314@gmail.com>
Date:   Mon, 17 Nov 2025 10:44:30 +0800

fix(system): handle SIGINT in --headless mode #36557

Problem:
When running with `--headless --listen ./hello`, pressing Ctrl-C
doesn’t log anything and doesn’t clean up the socket file.

Solution:
handle SIGINT like SIGTERM.
Diffstat:
Msrc/nvim/os/signal.c | 11+++++++++--
Mtest/functional/autocmd/signal_spec.lua | 3+++
2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/nvim/os/signal.c b/src/nvim/os/signal.c @@ -27,7 +27,7 @@ # include "nvim/os/os_win_console.h" #endif -static SignalWatcher spipe, shup, squit, sterm, susr1, swinch, ststp; +static SignalWatcher spipe, shup, sint, squit, sterm, susr1, swinch, ststp; #ifdef SIGPWR static SignalWatcher spwr; #endif @@ -50,6 +50,7 @@ void signal_init(void) signal_watcher_init(&main_loop, &spipe, NULL); signal_watcher_init(&main_loop, &shup, NULL); + signal_watcher_init(&main_loop, &sint, NULL); signal_watcher_init(&main_loop, &squit, NULL); signal_watcher_init(&main_loop, &sterm, NULL); signal_watcher_init(&main_loop, &ststp, NULL); @@ -70,6 +71,7 @@ void signal_teardown(void) signal_stop(); signal_watcher_close(&spipe, NULL); signal_watcher_close(&shup, NULL); + signal_watcher_close(&sint, NULL); signal_watcher_close(&squit, NULL); signal_watcher_close(&sterm, NULL); signal_watcher_close(&ststp, NULL); @@ -90,6 +92,7 @@ void signal_start(void) signal_watcher_start(&spipe, on_signal, SIGPIPE); #endif signal_watcher_start(&shup, on_signal, SIGHUP); + signal_watcher_start(&sint, on_signal, SIGINT); #ifdef SIGQUIT signal_watcher_start(&squit, on_signal, SIGQUIT); #endif @@ -114,6 +117,7 @@ void signal_stop(void) signal_watcher_stop(&spipe); #endif signal_watcher_stop(&shup); + signal_watcher_stop(&sint); #ifdef SIGQUIT signal_watcher_stop(&squit); #endif @@ -163,6 +167,8 @@ static char *signal_name(int signum) #endif case SIGHUP: return "SIGHUP"; + case SIGINT: + return "SIGINT"; #ifdef SIGUSR1 case SIGUSR1: return "SIGUSR1"; @@ -191,7 +197,7 @@ static void deadly_signal(int signum) snprintf(IObuff, IOSIZE, "Nvim: Caught deadly signal '%s'\n", signal_name(signum)); - if (p_awa && signum != SIGTERM) { + if (p_awa && signum != SIGTERM && signum != SIGINT) { autowrite_all(); } @@ -225,6 +231,7 @@ static void on_signal(SignalWatcher *handle, int signum, void *data) #ifdef MSWIN os_clear_hwnd(); #endif + case SIGINT: case SIGTERM: #ifdef SIGQUIT case SIGQUIT: diff --git a/test/functional/autocmd/signal_spec.lua b/test/functional/autocmd/signal_spec.lua @@ -66,6 +66,9 @@ describe("'autowriteall' on signal exit", function() it('dont write if SIGQUIT & awa off', function() test_deadly_sig('sigquit', false, false) end) + it('dont write if SIGINT & awa on', function() + test_deadly_sig('sigint', true, false) + end) end) describe('autocmd Signal', function()