diff --git a/demo/kitchen-sink/demo.js b/demo/kitchen-sink/demo.js index 9ae70f4f..4bc1c35e 100644 --- a/demo/kitchen-sink/demo.js +++ b/demo/kitchen-sink/demo.js @@ -407,7 +407,7 @@ event.addListener(container, "drop", function(e) { if (window.FileReader) { var reader = new FileReader(); reader.onload = function() { - var mode = getModeFromPath(file.name); + var mode = modelist.getModeFromPath(file.name); env.editor.session.doc.setValue(reader.result); modeEl.value = mode.name; diff --git a/lib/ace/keyboard/emacs.js b/lib/ace/keyboard/emacs.js index 4d3dfb7b..d6c54b72 100644 --- a/lib/ace/keyboard/emacs.js +++ b/lib/ace/keyboard/emacs.js @@ -50,6 +50,8 @@ var HashHandler = require("./hash_handler").HashHandler; exports.handler = new HashHandler(); var initialized = false; +var $formerLongWords; +var $formerLineStart; exports.handler.attach = function(editor) { if (!initialized) { @@ -82,7 +84,13 @@ exports.handler.attach = function(editor) { ); } // in emacs, gotowordleft/right should not count a space as a word.. + $formerLongWords = editor.session.$selectLongWords; editor.session.$selectLongWords = true; + // CTRL-A should go to actual beginning of line + $formerLineStart = editor.session.$useEmacsStyleLineStart; + editor.session.$useEmacsStyleLineStart = true; + + editor.session.$emacsMark = null; exports.markMode = function() { return editor.session.$emacsMark; @@ -94,14 +102,7 @@ exports.handler.attach = function(editor) { editor.on("click",$resetMarkMode); - editor.renderer.screenToTextCoordinates = screenToTextBlockCoordinates; - // kitchen sink seems to reload the session after loading the kb handler. - editor.on("changeSession",function(e) { - e.session.$selectLongWords = true; - if (! e.session.hasOwnProperty('$emacsMark')) { - e.session.$emacsMark = false; - } - }); + editor.on("changeSession",$kbSessionChange); editor.renderer.screenToTextCoordinates = screenToTextBlockCoordinates; @@ -113,11 +114,31 @@ exports.handler.detach = function(editor) { delete editor.renderer.screenToTextCoordinates; + editor.session.$selectLongWords = $formerLongWords; + editor.session.$useEmacsStyleLineStart = $formerLineStart; + + editor.removeEventListener("click",$resetMarkMode); + editor.removeEventListener("changeSession",$kbSessionChange); editor.unsetStyle("emacs-mode"); }; +var $kbSessionChange = function(e) { + if (e.oldSession) { + e.oldSession.$selectLongWords = $formerLongWords; + e.oldSession.$useEmacsStyleLineStart = $formerLineStart; + } + + $formerLongWords = e.session.$selectLongWords; + e.session.$selectLongWords = true; + $formerLineStart = e.session.$useEmacsStyleLineStart; + e.session.$useEmacsStyleLineStart = true; + + if (!e.session.hasOwnProperty('$emacsMark')) + e.session.$emacsMark = null; +} + var $resetMarkMode = function(e) { e.editor.session.$emacsMark = null; } diff --git a/lib/ace/selection.js b/lib/ace/selection.js index d80f9662..dd5435f1 100644 --- a/lib/ace/selection.js +++ b/lib/ace/selection.js @@ -517,17 +517,10 @@ var Selection = function(session) { ); var leadingSpace = beforeCursor.match(/^\s*/); - if (leadingSpace[0].length == column) { - this.moveCursorTo( - firstColumnPosition.row, firstColumnPosition.column - ); - } - else { - this.moveCursorTo( - firstColumnPosition.row, - firstColumnPosition.column + leadingSpace[0].length - ); - } + // TODO find better way for emacs mode to override selection behaviors + if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart) + firstColumnPosition.column += leadingSpace[0].length; + this.moveCursorToPosition(firstColumnPosition); }; /**