From f4fcea92fa4375189bb6f66ccb3359729cca24aa Mon Sep 17 00:00:00 2001
From: Yunchi Luo <mightyguava@gmail.com>
Date: Sat, 2 Mar 2013 14:45:59 -0500
Subject: [PATCH] [vim] Ctrl-C and Ctrl-[ exit dialog

---
 addon/dialog/dialog.js |  4 ++--
 keymap/vim.js          | 23 +++++++++++++++++++----
 2 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/addon/dialog/dialog.js b/addon/dialog/dialog.js
index 51fdc6443..71e228744 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 2f230db8e..a04f4d3fe 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});
           }
         }
       },
-- 
GitLab