From 0426274fd46fb3a84e1ecf0c0d452d8a2f040997 Mon Sep 17 00:00:00 2001
From: nightwing <amirjanyan@gmail.com>
Date: Sat, 27 May 2017 19:17:44 +0400
Subject: [PATCH] [vim] exit character exit mode on <C-c>

---
 keymap/vim.js    | 7 +++++--
 test/vim_test.js | 7 +++++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/keymap/vim.js b/keymap/vim.js
index 0dbbae73..d4452c69 100644
--- a/keymap/vim.js
+++ b/keymap/vim.js
@@ -1110,7 +1110,9 @@
           }
         }
         if (bestMatch.keys.slice(-11) == '<character>') {
-          inputState.selectedCharacter = lastChar(keys);
+          var character = lastChar(keys);
+          if (!character) return {type: 'none'};
+          inputState.selectedCharacter = character;
         }
         return {type: 'full', command: bestMatch};
       },
@@ -2704,7 +2706,7 @@
       }
     }
     function lastChar(keys) {
-      var match = /^.*(<[\w\-]+>)$/.exec(keys);
+      var match = /^.*(<[^>]+>)$/.exec(keys);
       var selectedCharacter = match ? match[1] : keys.slice(-1);
       if (selectedCharacter.length > 1){
         switch(selectedCharacter){
@@ -2715,6 +2717,7 @@
             selectedCharacter=' ';
             break;
           default:
+            selectedCharacter='';
             break;
         }
       }
diff --git a/test/vim_test.js b/test/vim_test.js
index 9f0e5f76..7d8f16fe 100644
--- a/test/vim_test.js
+++ b/test/vim_test.js
@@ -1607,6 +1607,13 @@ testVim('r', function(cm, vim, helpers) {
   cm.setCursor(0, 4);
   helpers.doKeys('v', 'j', 'h', 'r', '<Space>');
   eq('wuuu  \n    her', cm.getValue(),'Replacing selection by space-characters failed');
+  cm.setValue("ox");
+  helpers.doKeys('r', '<C-c>');
+  eq('ox', cm.getValue());
+  helpers.doKeys('r', '<Del>');
+  eq('ox', cm.getValue());
+  helpers.doKeys('r', '<CR>');
+  eq('\nx', cm.getValue());
 }, { value: 'wordet\nanother' });
 testVim('r_visual_block', function(cm, vim, helpers) {
   cm.setCursor(2, 3);
-- 
GitLab