From b42ee0965e7ab931c775af886286a3a34a34705d Mon Sep 17 00:00:00 2001 From: benhormann Date: Fri, 29 May 2020 08:07:16 +0100 Subject: [PATCH] [vim] Fix vim-mode-change event being signalled twice --- keymap/vim.js | 2 +- test/vim_test.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/keymap/vim.js b/keymap/vim.js index b5be59cc4..bca6d46d7 100644 --- a/keymap/vim.js +++ b/keymap/vim.js @@ -3203,7 +3203,7 @@ vim.visualMode = false; vim.visualLine = false; vim.visualBlock = false; - CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); + if (!vim.insertMode) CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); clearFakeCursor(vim); } diff --git a/test/vim_test.js b/test/vim_test.js index 7adace8e4..71284bdf5 100644 --- a/test/vim_test.js +++ b/test/vim_test.js @@ -1153,6 +1153,41 @@ testVim('s_visual_block', function(cm, vim, helpers) { eq('1hello{\n world\n', cm.getValue()); }, {value: '1234\n5678\nabcdefg\n'}); +// Test mode change event. It should only fire once per mode transition. +testVim('on_mode_change', function(cm, vim, helpers) { + var modeHist = []; + function callback(arg) { + var subMode = arg.subMode ? ':' + arg.subMode : ''; + modeHist.push(arg.mode + subMode); + } + helpers.doKeys('', ''); + cm.on('vim-mode-change', callback); + function test(key, mode) { + modeHist.length = 0; + helpers.doKeys(key); + eq(modeHist.join(';'), mode); + } + test('v', 'visual'); + test('c', 'insert'); + test('', 'normal'); + test('', 'visual:blockwise'); + test('I', 'insert'); + test('', 'normal'); + test('R', 'replace'); + test('x', ''); + test('', 'normal'); + test('v', 'visual'); + test('V', 'visual:linewise'); + test('', 'visual:blockwise'); + test('v', 'visual'); + test('', 'normal'); + test('a', 'insert'); + test('', 'normal'); + test('v', 'visual'); + test(':', ''); // Event for Command-line mode not implemented. + test('y', 'normal'); +}); + // Swapcase commands edit in place and do not modify registers. testVim('g~w_repeat', function(cm, vim, helpers) { // Assert that dw does delete newline if it should go to the next line, and