diff --git a/addon/dialog/dialog.js b/addon/dialog/dialog.js
index 51fdc6443f99c565bb07769885e6accdd953fbc3..71e22874477f1b8df6cf64934aa639a633f973b9 100644
--- a/addon/dialog/dialog.js
+++ b/addon/dialog/dialog.js
@@ -25,7 +25,7 @@
     var inp = dialog.getElementsByTagName("input")[0], button;
     if (inp) {
       CodeMirror.on(inp, "keydown", function(e) {
-        if (options && options.onKeyDown && options.onKeyDown(e, inp.value)) { return; }
+        if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }
         if (e.keyCode == 13 || e.keyCode == 27) {
           CodeMirror.e_stop(e);
           close();
@@ -34,7 +34,7 @@
         }
       });
       if (options && options.onKeyUp) {
-        CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value);});
+        CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);});
       }
       if (options && options.value) inp.value = options.value;
       inp.focus();
diff --git a/keymap/vim.js b/keymap/vim.js
index 2f230db8e165ae6dc72b2fef19ccafe13cc47127..a04f4d3fef4bf04a3f80241f32f1bbba6b76988a 100644
--- a/keymap/vim.js
+++ b/keymap/vim.js
@@ -752,11 +752,16 @@
             cm.scrollIntoView(originalPos);
           }
         }
-        function onPromptKeyDown(e, query) {
-          if (CodeMirror.keyName(e) == 'Esc') {
+        function onPromptKeyDown(e, query, close) {
+          var keyName = CodeMirror.keyName(e);
+          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') {
             updateSearchQuery(cm, originalQuery);
             clearSearchHighlight(cm);
             cm.scrollIntoView(originalPos);
+
+            CodeMirror.e_stop(e);
+            close();
+            cm.focus();
           }
         }
         switch (command.searchArgs.querySrc) {
@@ -799,14 +804,24 @@
         function onPromptClose(input) {
           exCommandDispatcher.processCommand(cm, input);
         }
+        function onPromptKeyDown(e, input, close) {
+          var keyName = CodeMirror.keyName(e);
+          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') {
+            CodeMirror.e_stop(e);
+            close();
+            cm.focus();
+          }
+        }
         if (command.type == 'keyToEx') {
           // Handle user defined Ex to Ex mappings
           exCommandDispatcher.processCommand(cm, command.exArgs.input);
         } else {
           if (vim.visualMode) {
-            showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>' });
+            showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>',
+                onKeyDown: onPromptKeyDown});
           } else {
-            showPrompt(cm, { onClose: onPromptClose, prefix: ':' });
+            showPrompt(cm, { onClose: onPromptClose, prefix: ':',
+                onKeyDown: onPromptKeyDown});
           }
         }
       },