aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2016-01-13 03:27:23 -0500
committerJustin M. Keyes <justinkz@gmail.com>2016-01-13 03:27:23 -0500
commit7f3999ac806daefa078b4db0781bfc1e190e135e (patch)
tree6386cdb6bf191873fc6ea1593a713e145810165a
parent5c87d40acdd02286baf492067031c93d93b7d389 (diff)
parent8eeda7169aa47881f0b6d697e291a1ef85c43e4e (diff)
downloadrneovim-7f3999ac806daefa078b4db0781bfc1e190e135e.tar.gz
rneovim-7f3999ac806daefa078b4db0781bfc1e190e135e.tar.bz2
rneovim-7f3999ac806daefa078b4db0781bfc1e190e135e.zip
Merge pull request #3996 from justinmk/ctrlc
vim-patch:7.4.569, 7.4.573
-rw-r--r--src/nvim/buffer_defs.h2
-rw-r--r--src/nvim/getchar.c19
-rw-r--r--src/nvim/globals.h2
-rw-r--r--src/nvim/misc1.c2
-rw-r--r--src/nvim/os/input.c3
-rw-r--r--src/nvim/terminal.c10
-rw-r--r--src/nvim/version.c4
-rw-r--r--test/functional/legacy/mapping_spec.lua47
8 files changed, 68 insertions, 21 deletions
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index 6b5bbe3b00..78d9a9484e 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -751,6 +751,8 @@ struct file_buffer {
Terminal *terminal; // Terminal instance associated with the buffer
dict_T *additional_data; // Additional data from shada file if any.
+
+ int b_mapped_ctrl_c; // modes where CTRL-C is mapped
};
/*
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index 44d6c086e7..89d22ad811 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -2940,8 +2940,12 @@ do_map (
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 CTRL-C has been unmapped, reuse it for Interrupting.
+ if (map_table == curbuf->b_maphash) {
+ curbuf->b_mapped_ctrl_c &= ~mode;
+ } else {
+ mapped_ctrl_c &= ~mode;
+ }
}
goto theend;
}
@@ -2966,9 +2970,14 @@ do_map (
*/
mp = xmalloc(sizeof(mapblock_T));
- /* If CTRL-C has been mapped, don't always use it for Interrupting. */
- if (*keys == Ctrl_C)
- mapped_ctrl_c = TRUE;
+ // If CTRL-C has been mapped, don't always use it for Interrupting.
+ if (*keys == Ctrl_C) {
+ 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/nvim/globals.h b/src/nvim/globals.h
index 40994d20b5..50eda6cb17 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -887,7 +887,7 @@ EXTERN int ctrl_x_mode INIT(= 0); /* Which Ctrl-X mode are we in? */
EXTERN int no_abbr INIT(= TRUE); /* TRUE when no abbreviations loaded */
-EXTERN int mapped_ctrl_c INIT(= FALSE); /* CTRL-C is mapped */
+EXTERN int mapped_ctrl_c INIT(= 0); // Modes where CTRL-C is mapped.
EXTERN cmdmod_T cmdmod; /* Ex command modifiers */
diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c
index 96ef6cbaef..b2cec82121 100644
--- a/src/nvim/misc1.c
+++ b/src/nvim/misc1.c
@@ -2352,7 +2352,7 @@ int get_keystroke(void)
int save_mapped_ctrl_c = mapped_ctrl_c;
int waited = 0;
- mapped_ctrl_c = FALSE; /* mappings are not used here */
+ mapped_ctrl_c = 0; // mappings are not used here
for (;; ) {
// flush output before waiting
ui_flush();
diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c
index ef6b5ff6f5..e632544856 100644
--- a/src/nvim/os/input.c
+++ b/src/nvim/os/input.c
@@ -19,6 +19,7 @@
#include "nvim/getchar.h"
#include "nvim/main.h"
#include "nvim/misc1.h"
+#include "nvim/misc2.h"
#define READ_BUFFER_SIZE 0xfff
#define INPUT_BUFFER_SIZE (READ_BUFFER_SIZE * 4)
@@ -357,7 +358,7 @@ static void read_cb(Stream *stream, RBuffer *buf, size_t c, void *data,
static void process_interrupts(void)
{
- if (mapped_ctrl_c) {
+ if ((mapped_ctrl_c | curbuf->b_mapped_ctrl_c) & get_real_state()) {
return;
}
diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c
index 6045acd1cb..0a7807d811 100644
--- a/src/nvim/terminal.c
+++ b/src/nvim/terminal.c
@@ -77,9 +77,7 @@
typedef struct terminal_state {
VimState state;
Terminal *term;
- int save_state; // saved value of State
int save_rd; // saved value of RedrawingDisabled
- bool save_mapped_ctrl_c; // saved value of mapped_ctrl_c;
bool close;
bool got_bs; // if the last input was <C-\>
} TerminalState;
@@ -362,12 +360,11 @@ void terminal_enter(void)
checkpcmark();
setpcmark();
- s->save_state = State;
+ int save_state = State;
s->save_rd = RedrawingDisabled;
State = TERM_FOCUS;
+ mapped_ctrl_c |= TERM_FOCUS; // Always map CTRL-C to avoid interrupt.
RedrawingDisabled = false;
- s->save_mapped_ctrl_c = mapped_ctrl_c;
- mapped_ctrl_c = true;
// go to the bottom when the terminal is focused
adjust_topline(s->term, buf, false);
// erase the unfocused cursor
@@ -380,11 +377,10 @@ void terminal_enter(void)
state_enter(&s->state);
restart_edit = 0;
- State = s->save_state;
+ State = save_state;
RedrawingDisabled = s->save_rd;
// draw the unfocused cursor
invalidate_terminal(s->term, s->term->cursor.row, s->term->cursor.row + 1);
- mapped_ctrl_c = s->save_mapped_ctrl_c;
unshowmode(true);
redraw(curbuf->handle != s->term->buf_handle);
ui_busy_stop();
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 95e8cb2d26..804f750e18 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -551,11 +551,11 @@ static int included_patches[] = {
576,
575,
574,
- // 573,
+ 573,
572,
// 571 NA
// 570 NA
- // 569,
+ 569,
568,
567,
566,
diff --git a/test/functional/legacy/mapping_spec.lua b/test/functional/legacy/mapping_spec.lua
index 4d377904f9..3f86ec60de 100644
--- a/test/functional/legacy/mapping_spec.lua
+++ b/test/functional/legacy/mapping_spec.lua
@@ -2,12 +2,12 @@
local helpers = require('test.functional.helpers')
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
-local execute, expect = helpers.execute, helpers.expect
+local execute, expect, wait = helpers.execute, helpers.expect, helpers.wait
describe('mapping', function()
before_each(clear)
- it('is working', function()
+ it('abbreviations with р (0x80)', function()
insert([[
test starts here:
]])
@@ -16,6 +16,46 @@ describe('mapping', function()
execute('inoreab чкпр vim')
feed('GAчкпр <esc>')
+ expect([[
+ test starts here:
+ vim ]])
+ end)
+
+ it('Ctrl-c works in Insert mode', function()
+ -- Mapping of ctrl-c in insert mode
+ execute('set cpo-=< cpo-=k')
+ execute('inoremap <c-c> <ctrl-c>')
+ execute('cnoremap <c-c> dummy')
+ execute('cunmap <c-c>')
+ feed('GA<cr>')
+ feed('TEST2: CTRL-C |')
+ wait()
+ feed('<c-c>A|<cr><esc>')
+ wait()
+ execute('unmap <c-c>')
+ execute('unmap! <c-c>')
+
+ expect([[
+
+ TEST2: CTRL-C |<ctrl-c>A|
+ ]])
+ end)
+
+ it('Ctrl-c works in Visual mode', function()
+ execute([[vnoremap <c-c> :<C-u>$put ='vmap works'<cr>]])
+ feed('GV')
+ -- XXX: For some reason the mapping is only triggered
+ -- when <C-c> is in a separate feed command.
+ wait()
+ feed('<c-c>')
+ execute('vunmap <c-c>')
+
+ expect([[
+
+ vmap works]])
+ end)
+
+ it('langmap', function()
-- langmap should not get remapped in insert mode.
execute('inoremap { FAIL_ilangmap')
execute('set langmap=+{ langnoremap')
@@ -37,8 +77,7 @@ describe('mapping', function()
-- Assert buffer contents.
expect([[
- test starts here:
- vim
+
+
+
+