Skip to content

Commit c313b6f

Browse files
committed
Fix MacVim Ctrl-C handling in Normal and Command-Line modes
Vim has a "ctrl_c_interrupts" mode that gets turned on in misc modes (e.g. Normal / Command-Line mode) when <C-C> is not mapped. In this mode, Ctrl-C has special behavior and is hard-coded (i.e. not remappable). There is an old bug in how MacVim handles Ctrl-C under this mode. It's trying to be smart and aggressively clears the input queue (even non-text-related ones) without adding anything to the input queue. Previously it kind of worked due to a coincidence in how Vim's GUI handled input logic, but it was fragile. The recent Vim refactor that changed Vim GUI's input handling broke this. Instead, don't do any of these smart input queue clearing and just do what other Vim GUI code does and call `trash_input_buf()`, set `set_int`, and then add the Ctrl-C to the input queue. MacVim still has `Cmd-.` for an aggressive interrupt in case Vim is hung (which shouldn't happen to begin with). Fix #846
1 parent 1c34fb4 commit c313b6f

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

src/MacVim/MMBackend.m

+10-8
Original file line numberDiff line numberDiff line change
@@ -1270,17 +1270,19 @@ - (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data
12701270
unsigned len = *((unsigned*)bytes); bytes += sizeof(unsigned);
12711271

12721272
if (ctrl_c_interrupts && 1 == len) {
1273-
// NOTE: the flag ctrl_c_interrupts is 0 e.g. when the user has
1274-
// mappings to something like <C-c>g. Also it seems the flag
1275-
// intr_char is 0 when MacVim was started from Finder whereas it is
1276-
// 0x03 (= Ctrl_C) when started from Terminal.
1273+
// NOTE: The flag ctrl_c_interrupts is set when it has special
1274+
// interrupt behavior in Vim and would cancel all other input. This
1275+
// is a hard-coded behavior in Vim. It usually happens when not in
1276+
// Insert mode, and when <C-C> is not mapped in the current mode
1277+
// (even if <C-C> is mapped to itself, ctrl_c_interrupts would not
1278+
// be set).
1279+
// Also it seems the flag intr_char is 0 when MacVim was started
1280+
// from Finder whereas it is 0x03 (= Ctrl_C) when started from
1281+
// Terminal.
12771282
char_u *str = (char_u*)bytes;
12781283
if (str[0] == Ctrl_C || (str[0] == intr_char && intr_char != 0)) {
1279-
ASLogDebug(@"Got INT, str[0]=%#x ctrl_c_interrupts=%d "
1280-
"intr_char=%#x", str[0], ctrl_c_interrupts, intr_char);
1284+
trash_input_buf();
12811285
got_int = TRUE;
1282-
[inputQueue removeAllObjects];
1283-
return;
12841286
}
12851287
}
12861288

0 commit comments

Comments
 (0)