diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index ed84f009..536d9784 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -896,9 +896,9 @@ var EditSession = function(text, mode) { // and multipleWidth characters. var len = displayed.length; displayed.join(""). - // Get all the tabs. - replace(/4/g, function(m) { - len -= tabSize - 1; + // Get all the tabs spaces. + replace(/5/g, function(m) { + len -= 1; }). // Get all the multipleWidth characters. replace(/2/g, function(m) { @@ -950,8 +950,8 @@ var EditSession = function(text, mode) { var c = str.charCodeAt(i); // Tab if (c == 9) { - arr.push(TAB); tabSize = this.getScreenTabSize(arr.length); + arr.push(TAB); for (var n = 1; n < tabSize; n++) { arr.push(TAB_SPACE); } @@ -1173,7 +1173,7 @@ var EditSession = function(text, mode) { docColumn -= 1; } } else { - screenColumn += 2; + screenColumn += 1; remaining -= 1; } } else { diff --git a/lib/ace/selection.js b/lib/ace/selection.js index 5c2a45bb..1be40c41 100644 --- a/lib/ace/selection.js +++ b/lib/ace/selection.js @@ -50,7 +50,7 @@ var Selection = function(session) { this.clearSelection(); this.selectionLead = this.doc.createAnchor(0, 0); this.selectionAnchor = this.doc.createAnchor(0, 0); - + var _self = this; this.selectionLead.on("change", function(e) { _self._dispatchEvent("changeCursor"); @@ -59,7 +59,7 @@ var Selection = function(session) { if (e.old.row == e.value.row) _self.$updateDesiredColumn(); }); - + this.selectionAnchor.on("change", function() { if (!_self.$isEmpty) _self._dispatchEvent("changeSelection"); @@ -382,19 +382,14 @@ var Selection = function(session) { }; this.moveCursorBy = function(rows, chars) { - if (this.session.getUseWrapMode()) { - var screenPos = this.session.documentToScreenPosition( - this.selectionLead.row, - this.selectionLead.column - ); - var screenCol = (chars == 0 && this.$desiredColumn) || screenPos.column; - var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenCol); - - this.moveCursorTo(docPos.row, docPos.column + chars, chars == 0); - } else { - var docColumn = (chars == 0 && this.$desiredColumn) || this.selectionLead.column; - this.moveCursorTo(this.selectionLead.row + rows, docColumn + chars, chars == 0); - } + var screenPos = this.session.documentToScreenPosition( + this.selectionLead.row, + this.selectionLead.column + ); + var screenCol = (chars == 0 && this.$desiredColumn) || screenPos.column; + var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenCol); + + this.moveCursorTo(docPos.row, docPos.column + chars, chars == 0); }; this.moveCursorToPosition = function(position) { @@ -408,11 +403,9 @@ var Selection = function(session) { }; this.moveCursorToScreen = function(row, column, preventUpdateDesiredColumn) { - if (this.session.getUseWrapMode()) { - var pos = this.session.screenToDocumentPosition(row, column); - row = pos.row; - column = pos.column; - } + var pos = this.session.screenToDocumentPosition(row, column); + row = pos.row; + column = pos.column; this.moveCursorTo(row, column, preventUpdateDesiredColumn); }; diff --git a/lib/ace/test/edit_session_test.js b/lib/ace/test/edit_session_test.js index 3cb061bb..0e6f4663 100644 --- a/lib/ace/test/edit_session_test.js +++ b/lib/ace/test/edit_session_test.js @@ -140,18 +140,19 @@ var Test = { assert.equal(session.documentToScreenColumn(0, 0), 0); assert.equal(session.documentToScreenColumn(0, 4), 4); assert.equal(session.documentToScreenColumn(0, 5), 5); - assert.equal(session.documentToScreenColumn(0, 6), 9); - assert.equal(session.documentToScreenColumn(0, 12), 15); - assert.equal(session.documentToScreenColumn(0, 13), 19); + assert.equal(session.documentToScreenColumn(0, 6), 8); + assert.equal(session.documentToScreenColumn(0, 12), 14); + assert.equal(session.documentToScreenColumn(0, 13), 16); session.setTabSize(2); assert.equal(session.documentToScreenColumn(0, 0), 0); assert.equal(session.documentToScreenColumn(0, 4), 4); assert.equal(session.documentToScreenColumn(0, 5), 5); - assert.equal(session.documentToScreenColumn(0, 6), 7); - assert.equal(session.documentToScreenColumn(0, 12), 13); - assert.equal(session.documentToScreenColumn(0, 13), 15); + assert.equal(session.documentToScreenColumn(0, 6), 6); + assert.equal(session.documentToScreenColumn(0, 7), 7); + assert.equal(session.documentToScreenColumn(0, 12), 12); + assert.equal(session.documentToScreenColumn(0, 13), 14); }, "test: convert document to screen coordinates with leading tabs": function() { @@ -179,7 +180,7 @@ var Test = { session.setUseWrapMode(true); session.setWrapLimitRange(2, 2); session.adjustWrapLimit(80); - + assert.position(session.documentToScreenPosition(0, 1), 1, 0); assert.position(session.documentToScreenPosition(0, 2), 2, 0); assert.position(session.documentToScreenPosition(0, 4), 2, 1); @@ -194,10 +195,20 @@ var Test = { assert.equal(session.screenToDocumentColumn(0, 5), 5); assert.equal(session.screenToDocumentColumn(0, 6), 5); assert.equal(session.screenToDocumentColumn(0, 7), 5); - assert.equal(session.screenToDocumentColumn(0, 8), 5); - assert.equal(session.screenToDocumentColumn(0, 9), 6); + assert.equal(session.screenToDocumentColumn(0, 8), 6); + assert.equal(session.screenToDocumentColumn(0, 9), 7); assert.equal(session.screenToDocumentColumn(0, 15), 12); - assert.equal(session.screenToDocumentColumn(0, 19), 13); + assert.equal(session.screenToDocumentColumn(0, 19), 16); + + session.setTabSize(2); + + assert.equal(session.screenToDocumentColumn(0, 0), 0); + assert.equal(session.screenToDocumentColumn(0, 4), 4); + assert.equal(session.screenToDocumentColumn(0, 5), 5); + assert.equal(session.screenToDocumentColumn(0, 6), 6); + assert.equal(session.screenToDocumentColumn(0, 12), 12); + assert.equal(session.screenToDocumentColumn(0, 13), 12); + assert.equal(session.screenToDocumentColumn(0, 14), 13); }, "test: screenToDocument with soft wrap and multi byte characters": function() { @@ -217,7 +228,7 @@ var Test = { session = new EditSession(["ぁ a"]); session.setUseWrapMode(true); session.adjustWrapLimit(80); - + assert.position(session.screenToDocumentPosition(0, 1), 0, 0); assert.position(session.screenToDocumentPosition(0, 2), 0, 1); assert.position(session.screenToDocumentPosition(0, 3), 0, 2); @@ -227,13 +238,12 @@ var Test = { "test: wrapLine split function" : function() { var splits; - var computeWrapSplits = EditSession.prototype.$computeWrapSplits; var c = 0; function computeAndAssert(line, assertEqual, wrapLimit, tabSize) { wrapLimit = wrapLimit || 12; tabSize = tabSize || 4; - splits = computeWrapSplits.call(EditSession.prototype, line, wrapLimit, tabSize); + var splits = EditSession.prototype.$computeWrapSplits(line, wrapLimit, tabSize); // console.log("String:", line, "Result:", splits, "Expected:", assertEqual); assert.ok(splits.length == assertEqual.length); for (var i = 0; i < splits.length; i++) { @@ -297,7 +307,7 @@ var Test = { assert.equal(session.$getDisplayTokens("\t").length, 4); assert.equal(session.$getDisplayTokens("abc").length, 3); - assert.equal(session.$getDisplayTokens("abc\t").length, 7); + assert.equal(session.$getDisplayTokens("abc\t").length, 4); }, "test issue 83": function() {