mirror of
https://github.com/neovim/neovim.git
synced 2025-10-05 01:16:31 +00:00
fix(input): only disable mapped CTRL-C interrupts when getting input (#18310)
This commit is contained in:
@@ -4661,7 +4661,6 @@ void global_exe(char_u *cmd)
|
||||
linenr_T old_lcount; // b_ml.ml_line_count before the command
|
||||
buf_T *old_buf = curbuf; // remember what buffer we started in
|
||||
linenr_T lnum; // line number according to old situation
|
||||
int save_mapped_ctrl_c = mapped_ctrl_c;
|
||||
|
||||
// Set current position only once for a global command.
|
||||
// If global_busy is set, setpcmark() will not do anything.
|
||||
@@ -4670,8 +4669,6 @@ void global_exe(char_u *cmd)
|
||||
|
||||
// When the command writes a message, don't overwrite the command.
|
||||
msg_didout = true;
|
||||
// Disable CTRL-C mapping, let it interrupt (potentially long output).
|
||||
mapped_ctrl_c = 0;
|
||||
|
||||
sub_nsubs = 0;
|
||||
sub_nlines = 0;
|
||||
@@ -4684,7 +4681,6 @@ void global_exe(char_u *cmd)
|
||||
os_breakcheck();
|
||||
}
|
||||
|
||||
mapped_ctrl_c = save_mapped_ctrl_c;
|
||||
global_busy = 0;
|
||||
if (global_need_beginline) {
|
||||
beginline(BL_WHITE | BL_FIX);
|
||||
|
@@ -2317,6 +2317,10 @@ static int vgetorpeek(bool advance)
|
||||
// try re-mapping.
|
||||
for (;;) {
|
||||
check_end_reg_executing(advance);
|
||||
// os_breakcheck() can call input_enqueue()
|
||||
if ((mapped_ctrl_c | curbuf->b_mapped_ctrl_c) & get_real_state()) {
|
||||
ctrl_c_interrupts = false;
|
||||
}
|
||||
// os_breakcheck() is slow, don't use it too often when
|
||||
// inside a mapping. But call it each time for typed
|
||||
// characters.
|
||||
@@ -2325,6 +2329,7 @@ static int vgetorpeek(bool advance)
|
||||
} else {
|
||||
os_breakcheck(); // check for CTRL-C
|
||||
}
|
||||
ctrl_c_interrupts = true;
|
||||
int keylen = 0;
|
||||
if (got_int) {
|
||||
// flush all input
|
||||
|
@@ -670,6 +670,7 @@ EXTERN bool ins_at_eol INIT(= false); // put cursor after eol when
|
||||
EXTERN bool no_abbr INIT(= true); // true when no abbreviations loaded
|
||||
|
||||
EXTERN int mapped_ctrl_c INIT(= 0); // Modes where CTRL-C is mapped.
|
||||
EXTERN bool ctrl_c_interrupts INIT(= true); // CTRL-C sets got_int
|
||||
|
||||
EXTERN cmdmod_T cmdmod; // Ex command modifiers
|
||||
|
||||
|
@@ -98,7 +98,7 @@ static void create_cursorhold_event(bool events_enabled)
|
||||
|
||||
/// Low level input function
|
||||
///
|
||||
/// wait until either the input buffer is non-empty or , if `events` is not NULL
|
||||
/// wait until either the input buffer is non-empty or, if `events` is not NULL
|
||||
/// until `events` is non-empty.
|
||||
int os_inchar(uint8_t *buf, int maxlen, int ms, int tb_change_cnt, MultiQueue *events)
|
||||
{
|
||||
@@ -106,6 +106,11 @@ int os_inchar(uint8_t *buf, int maxlen, int ms, int tb_change_cnt, MultiQueue *e
|
||||
return (int)rbuffer_read(input_buffer, (char *)buf, (size_t)maxlen);
|
||||
}
|
||||
|
||||
// No risk of a UI flood, so disable CTRL-C "interrupt" behavior if it's mapped.
|
||||
if ((mapped_ctrl_c | curbuf->b_mapped_ctrl_c) & get_real_state()) {
|
||||
ctrl_c_interrupts = false;
|
||||
}
|
||||
|
||||
InbufPollResult result;
|
||||
if (ms >= 0) {
|
||||
if ((result = inbuf_poll(ms, events)) == kInputNone) {
|
||||
@@ -127,6 +132,8 @@ int os_inchar(uint8_t *buf, int maxlen, int ms, int tb_change_cnt, MultiQueue *e
|
||||
}
|
||||
}
|
||||
|
||||
ctrl_c_interrupts = true;
|
||||
|
||||
// If input was put directly in typeahead buffer bail out here.
|
||||
if (typebuf_changed(tb_change_cnt)) {
|
||||
return 0;
|
||||
@@ -275,7 +282,7 @@ size_t input_enqueue(String keys)
|
||||
}
|
||||
|
||||
size_t rv = (size_t)(ptr - keys.data);
|
||||
process_interrupts();
|
||||
process_ctrl_c();
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -480,9 +487,9 @@ static void input_read_cb(Stream *stream, RBuffer *buf, size_t c, void *data, bo
|
||||
}
|
||||
}
|
||||
|
||||
static void process_interrupts(void)
|
||||
static void process_ctrl_c(void)
|
||||
{
|
||||
if ((mapped_ctrl_c | curbuf->b_mapped_ctrl_c) & get_real_state()) {
|
||||
if (!ctrl_c_interrupts) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user