From 1172f5cb3d7f70b08e6c1cb9ad23e9680c4c5fe1 Mon Sep 17 00:00:00 2001 From: Robert Krahn Date: Sun, 26 May 2013 18:55:38 -0700 Subject: [PATCH] emacs: adding mark-ring --- lib/ace/keyboard/emacs.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/ace/keyboard/emacs.js b/lib/ace/keyboard/emacs.js index 71d4d0b7..f0df7d87 100644 --- a/lib/ace/keyboard/emacs.js +++ b/lib/ace/keyboard/emacs.js @@ -96,15 +96,31 @@ exports.handler.attach = function(editor) { editor.session.$useEmacsStyleLineStart = true; editor.session.$emacsMark = null; + editor.session.$emacsMarkRing = editor.session.$emacsMarkRing || []; editor.emacsMarkMode = function() { return this.session.$emacsMark; } editor.setEmacsMarkMode = function(p) { + var prevMark = this.session.$emacsMark; + if (prevMark) + this.session.$emacsMarkRing.push(prevMark); this.session.$emacsMark = p; } + editor.pushEmacsMark = function(p, activate) { + var prevMark = this.session.$emacsMark; + if (prevMark) + this.session.$emacsMarkRing.push(prevMark); + if (activate) this.session.$emacsMark = p; + else this.session.$emacsMarkRing.push(p); + } + + editor.getLastEmacsMark = function(p) { + return this.session.$emacsMark || this.session.$emacsMarkRing.reverse()[0]; + } + editor.on("click", $resetMarkMode); editor.on("changeSession", $kbSessionChange); editor.renderer.screenToTextCoordinates = screenToTextBlockCoordinates; @@ -141,6 +157,8 @@ var $kbSessionChange = function(e) { if (!e.session.hasOwnProperty('$emacsMark')) e.session.$emacsMark = null; + if (!e.session.hasOwnProperty('$emacsMarkRing')) + e.session.$emacsMarkRing = []; } var $resetMarkMode = function(e) { @@ -168,6 +186,10 @@ exports.handler.onCopy = function(e, editor) { delete editor.$handlesEmacsOnCopy; } +exports.handler.onPaste = function(e, editor) { + editor.pushEmacsMark(editor.getCursorPosition()); +} + exports.handler.bindKey = function(key, command) { if (!key) return;