# HG changeset patch # User Bram Moolenaar # Date 1421235881 -3600 # Node ID ccb6962585f1ea5e7f872d79e59565e7a95234db # Parent 2f8c3790366e6ebf334243265d28dde068960a2c updated for version 7.4.569 Problem: Having CTRL-C interrupt or not does not check the mode of the mapping. (Ingo Karkat) Solution: Use a bitmask with the map mode. (Christian Brabandt) diff --git a/src/getchar.c b/src/getchar.c --- a/src/getchar.c +++ b/src/getchar.c @@ -3708,8 +3708,13 @@ do_map(maptype, arg, mode, abbrev) if (!did_it) retval = 2; /* no match */ else if (*keys == Ctrl_C) + { /* If CTRL-C has been unmapped, reuse it for Interrupting. */ - mapped_ctrl_c = FALSE; + if (map_table == curbuf->b_maphash) + curbuf->b_mapped_ctrl_c &= ~mode; + else + mapped_ctrl_c &= ~mode; + } goto theend; } @@ -3744,7 +3749,12 @@ do_map(maptype, arg, mode, abbrev) /* If CTRL-C has been mapped, don't always use it for Interrupting. */ if (*keys == Ctrl_C) - mapped_ctrl_c = TRUE; + { + if (map_table == curbuf->b_maphash) + curbuf->b_mapped_ctrl_c |= mode; + else + mapped_ctrl_c |= mode; + } mp->m_keys = vim_strsave(keys); mp->m_str = vim_strsave(rhs); diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -958,7 +958,7 @@ EXTERN char_u *exe_name; /* the name of #ifdef USE_ON_FLY_SCROLL EXTERN int dont_scroll INIT(= FALSE);/* don't use scrollbars when TRUE */ #endif -EXTERN int mapped_ctrl_c INIT(= FALSE); /* CTRL-C is mapped */ +EXTERN int mapped_ctrl_c INIT(= FALSE); /* modes where CTRL-C is mapped */ EXTERN int ctrl_c_interrupts INIT(= TRUE); /* CTRL-C sets got_int */ EXTERN cmdmod_T cmdmod; /* Ex command modifiers */ diff --git a/src/structs.h b/src/structs.h --- a/src/structs.h +++ b/src/structs.h @@ -1802,6 +1802,7 @@ struct file_buffer cryptstate_T *b_cryptstate; /* Encryption state while reading or writing * the file. NULL when not using encryption. */ #endif + int b_mapped_ctrl_c; /* modes where CTRL-C is mapped */ }; /* file_buffer */ diff --git a/src/testdir/test_mapping.in b/src/testdir/test_mapping.in --- a/src/testdir/test_mapping.in +++ b/src/testdir/test_mapping.in @@ -8,6 +8,15 @@ STARTTEST :inoreab чкпр vim GAчкпр  +:" mapping of ctrl-c in insert mode +:set cpo-=< cpo-=k +:inoremap +:cnoremap dummy +:cunmap +GA +TEST2: CTRL-C |A| + +:nunmap : " langmap should not get remapped in insert mode :inoremap { FAIL_ilangmap diff --git a/src/testdir/test_mapping.ok b/src/testdir/test_mapping.ok --- a/src/testdir/test_mapping.ok +++ b/src/testdir/test_mapping.ok @@ -1,4 +1,6 @@ test starts here: vim +TEST2: CTRL-C |A| + + + diff --git a/src/ui.c b/src/ui.c --- a/src/ui.c +++ b/src/ui.c @@ -180,7 +180,7 @@ ui_inchar(buf, maxlen, wtime, tb_change_ /* ... there is no need for CTRL-C to interrupt something, don't let * it set got_int when it was mapped. */ - if (mapped_ctrl_c) + if ((mapped_ctrl_c | curbuf->b_mapped_ctrl_c) & State) ctrl_c_interrupts = FALSE; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 569, +/**/ 568, /**/ 567,