Mercurial > vim
changeset 6482:ccb6962585f1 v7.4.569
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)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 14 Jan 2015 12:44:41 +0100 |
parents | 2f8c3790366e |
children | 6922222a8ad3 |
files | src/getchar.c src/globals.h src/structs.h src/testdir/test_mapping.in src/testdir/test_mapping.ok src/ui.c src/version.c |
diffstat | 7 files changed, 28 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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);
--- 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 */
--- 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 */
--- 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 <c-c> <ctrl-c> +:cnoremap <c-c> dummy +:cunmap <c-c> +GA +TEST2: CTRL-C |A| + +:nunmap <c-c> : " langmap should not get remapped in insert mode :inoremap { FAIL_ilangmap
--- a/src/testdir/test_mapping.ok +++ b/src/testdir/test_mapping.ok @@ -1,4 +1,6 @@ test starts here: vim +TEST2: CTRL-C |<ctrl-c>A| + + +
--- 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; }