diff --git a/keymap/vim.js b/keymap/vim.js
index 2aa6e0f795fa55e161d36b3f051b8c8fb4de3fd6..bbff4d171685e9f52cf0d7622a0287e1ed1a786a 100644
--- a/keymap/vim.js
+++ b/keymap/vim.js
@@ -224,6 +224,11 @@
     cm.setOption("keyMap", "vim-insert");
   }
 
+  function dialog(cm, text, shortText, f) {
+    if (cm.openDialog) cm.openDialog(text, f);
+    else f(prompt(shortText, ""));
+  }
+
   // main keymap
   var map = CodeMirror.keyMap.vim = {
     // Pipe (|); TODO: should be *screen* chars, so need a util function to turn tabs into spaces?
@@ -294,6 +299,14 @@
       popCount();
       CodeMirror.commands.goLineStart(cm);
     },
+    "Shift-;": function(cm) {
+      var exModeDialog = '<input type="text" />';
+      dialog(cm, exModeDialog, 'ex mode:', function(command) {
+        if (command.match(/\d+/)) {
+          cm.setCursor(command-1, cm.getCursor().ch);
+        }
+      });
+    },
     nofallthrough: true, style: "fat-cursor"
   };