diff --git a/keymap/vim.js b/keymap/vim.js
index a4cfd5796559f171c1eae7d08cd4fd263a5280c9..355fee62d295cca1abe84742c2628a2489677b09 100644
--- a/keymap/vim.js
+++ b/keymap/vim.js
@@ -229,7 +229,7 @@
       function lookupKey(e) {
         var keyCode = e.keyCode;
         if (modifierCodes.indexOf(keyCode) != -1) { return; }
-        var hasModifier = e.ctrlKey || e.shiftKey || e.metaKey || e.ctrlKey;
+        var hasModifier = e.ctrlKey || e.shiftKey || e.metaKey;
         var key = CodeMirror.keyNames[keyCode];
         key = specialKey[key] || key;
         var name = '';
@@ -259,7 +259,8 @@
       // non-standard keyboard layouts.
       function handleKeyPress(cm, e) {
         var code = e.charCode || e.keyCode;
-        if (e.ctrlKey || e.metaKey || e.altKey) { return; }
+        if (e.ctrlKey || e.metaKey || e.altKey ||
+            e.shiftKey && code < 32) { return; }
         var name = String.fromCharCode(code);
 
         CodeMirror.signal(cm, 'vim-keypress', name);
@@ -691,6 +692,7 @@
           if (/^[1-9]\d*$/.test(keys)) { return true; }
 
           var keysMatcher = /^(\d*)(.*)$/.exec(keys);
+          if (!keysMatcher) { clearInputState(cm); return false; }
           var context = vim.visualMode ? 'visual' :
                                          'normal';
           var match = commandDispatcher.matchCommand(keysMatcher[2] || keysMatcher[1], defaultKeymap, vim.inputState, context);