diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index c2fbbf5b..f10badcf 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -1105,6 +1105,7 @@ var EditSession = function(text, mode) { CHAR_EXT = 2, PLACEHOLDER_START = 3, PLACEHOLDER_BODY = 4, + PUNCTUATION = 9, SPACE = 10, TAB = 11, TAB_SPACE = 12; @@ -1148,7 +1149,7 @@ var EditSession = function(text, mode) { // a split is simple. if (tokens[split] >= SPACE) { // Include all following spaces + tabs in this split as well. - while (tokens[split] >= SPACE) { + while (tokens[split] >= SPACE) { split ++; } addSplit(split); @@ -1203,16 +1204,16 @@ var EditSession = function(text, mode) { } // === ELSE === - // Search for the first non space/tab/placeholder token backwards. - for (split; split != lastSplit - 1; split--) { - if (tokens[split] >= PLACEHOLDER_START) { - split++; - break; - } + // Search for the first non space/tab/placeholder/punctuation token backwards. + var minSplit = Math.max(split - 10, lastSplit - 1); + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split --; } // If we found one, then add the split. - if (split > lastSplit) { - addSplit(split); + if (split > minSplit) { + while(split > minSplit && tokens[split] == PUNCTUATION) + split --; + addSplit(++split); continue; } @@ -1220,7 +1221,7 @@ var EditSession = function(text, mode) { split = lastSplit + wrapLimit; // The split is inside of a CHAR or CHAR_EXT token and no space // around -> force a split. - addSplit(lastSplit + wrapLimit); + addSplit(split); } return splits; } @@ -1246,11 +1247,13 @@ var EditSession = function(text, mode) { } } // Space - else if(c == 32) { + else if (c == 32) { arr.push(SPACE); + } else if((c > 39 && c < 48) || (c > 57 && c < 64)) { + arr.push(PUNCTUATION); } // full width characters - else if (isFullWidth(c)) { + else if (c >= 0x1100 && isFullWidth(c)) { arr.push(CHAR, CHAR_EXT); } else { arr.push(CHAR); @@ -1286,7 +1289,7 @@ var EditSession = function(text, mode) { screenColumn += this.getScreenTabSize(screenColumn); } // full width characters - else if (isFullWidth(c)) { + else if (c >= 0x1100 && isFullWidth(c)) { screenColumn += 2; } else { screenColumn += 1; diff --git a/lib/ace/edit_session/bracket_match.js b/lib/ace/edit_session/bracket_match.js index 05fe0307..a7f403e3 100644 --- a/lib/ace/edit_session/bracket_match.js +++ b/lib/ace/edit_session/bracket_match.js @@ -20,7 +20,7 @@ * the Initial Developer. All Rights Reserved. * * Contributor(s): - * Fabian Jakobs + * Fabian Jakobs * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -42,35 +42,35 @@ var TokenIterator = require("ace/token_iterator").TokenIterator; function BracketMatch() { - this.findMatchingBracket = function(position) { - if (position.column == 0) return null; + this.findMatchingBracket = function(position) { + if (position.column == 0) return null; - var charBeforeCursor = this.getLine(position.row).charAt(position.column-1); - if (charBeforeCursor == "") return null; + var charBeforeCursor = this.getLine(position.row).charAt(position.column-1); + if (charBeforeCursor == "") return null; - var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); - if (!match) { - return null; - } + var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); + if (!match) { + return null; + } - if (match[1]) { - return this.$findClosingBracket(match[1], position); - } else { - return this.$findOpeningBracket(match[2], position); - } - }; + if (match[1]) { + return this.$findClosingBracket(match[1], position); + } else { + return this.$findOpeningBracket(match[2], position); + } + }; - this.$brackets = { - ")": "(", - "(": ")", - "]": "[", - "[": "]", - "{": "}", - "}": "{" - }; + this.$brackets = { + ")": "(", + "(": ")", + "]": "[", + "[": "]", + "{": "}", + "}": "{" + }; - this.$findOpeningBracket = function(bracket, position) { - var openBracket = this.$brackets[bracket]; + this.$findOpeningBracket = function(bracket, position) { + var openBracket = this.$brackets[bracket]; var depth = 1; var iterator = new TokenIterator(this, position.row, position.column); @@ -91,14 +91,14 @@ function BracketMatch() { while (vIndex >= 0) { var char = value.charAt(vIndex); if (char == openBracket) { - depth -= 1; - if (depth == 0) { - return {row: iterator.getCurrentTokenRow(), - column: vIndex + iterator.getCurrentTokenColumn()}; - } + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: vIndex + iterator.getCurrentTokenColumn()}; + } } else if (char == bracket) { - depth += 1; + depth += 1; } vIndex -= 1; } @@ -115,41 +115,41 @@ function BracketMatch() { value = token.value; vIndex = token.value.length - 1; } - - return null; - }; + + return null; + }; - this.$findClosingBracket = function(bracket, position) { - var closingBracket = this.$brackets[bracket]; + this.$findClosingBracket = function(bracket, position) { + var closingBracket = this.$brackets[bracket]; var depth = 1; var iterator = new TokenIterator(this, position.row, position.column); var token = iterator.getCurrentToken(); if (!token) return null; - + // Create a pattern that matches any token with the same type as token.type. // Exception: if token.type includes "lparen", then also match "rparen". var typeRe = new RegExp("(\\.?[" + token.type.replace(".", "|").replace("lparen", "lparen|rparen") + "])+"); - + // Start searching in token, after after the character at position.column var vIndex = position.column - iterator.getCurrentTokenColumn(); - + while (true) { - + var value = token.value; var valueLength = value.length; while (vIndex < valueLength) { var char = value.charAt(vIndex); if (char == closingBracket) { - depth -= 1; - if (depth == 0) { - return {row: iterator.getCurrentTokenRow(), - column: vIndex + iterator.getCurrentTokenColumn()}; - } + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: vIndex + iterator.getCurrentTokenColumn()}; + } } else if (char == bracket) { - depth += 1; + depth += 1; } vIndex += 1; } @@ -162,12 +162,12 @@ function BracketMatch() { if (token == null) break; - + vIndex = 0; } - - return null; - }; + + return null; + }; } exports.BracketMatch = BracketMatch; diff --git a/lib/ace/keyboard/keybinding/vim.js b/lib/ace/keyboard/keybinding/vim.js index c3a321f5..90c7dc15 100644 --- a/lib/ace/keyboard/keybinding/vim.js +++ b/lib/ace/keyboard/keybinding/vim.js @@ -93,8 +93,8 @@ var vimStates = { }, vimcommand("(k|up)", "golineup"), vimcommand("(j|down)", "golinedown"), - vimcommand("(l|right)", "golineright"), - vimcommand("(h|left)", "golineleft"), + vimcommand("(l|right)", "gotoright"), + vimcommand("(h|left)", "gotoleft"), { key: "shift-g", exec: "gotoend" diff --git a/lib/ace/mode/coffee_highlight_rules.js b/lib/ace/mode/coffee_highlight_rules.js index a0aa173e..a249479e 100644 --- a/lib/ace/mode/coffee_highlight_rules.js +++ b/lib/ace/mode/coffee_highlight_rules.js @@ -54,7 +54,7 @@ define(function(require, exports, module) { var keywords = lang.arrayToMap(( "this|throw|then|try|typeof|super|switch|return|break|by)|continue|" + "catch|class|in|instanceof|is|isnt|if|else|extends|for|forown|" + - "finally|function|while|when|new|not|delete|debugger|do|loop|of|off|" + + "finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|" + "or|on|unless|until|and|yes").split("|") ); diff --git a/lib/ace/token_iterator.js b/lib/ace/token_iterator.js index 7924a435..407266b6 100644 --- a/lib/ace/token_iterator.js +++ b/lib/ace/token_iterator.js @@ -20,7 +20,7 @@ * the Initial Developer. All Rights Reserved. * * Contributor(s): - * Fabian Jakobs + * Fabian Jakobs * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -48,10 +48,10 @@ var TokenIterator = function(session, initialRow, initialColumn) { }; (function() { - - this.stepBackward = function() { - this.$tokenIndex -= 1; - + + this.stepBackward = function() { + this.$tokenIndex -= 1; + while (this.$tokenIndex < 0) { this.$row -= 1; if (this.$row < 0) @@ -60,18 +60,18 @@ var TokenIterator = function(session, initialRow, initialColumn) { this.$rowTokens = this.$session.getTokens(this.$row, this.$row)[0].tokens; this.$tokenIndex = this.$rowTokens.length - 1; } - - return this.$rowTokens[this.$tokenIndex]; - } - - this.stepForward = function() { - var rowCount = this.$session.getLength(); - this.$tokenIndex += 1; - - while (this.$tokenIndex >= this.$rowTokens.length) { - this.$row += 1; - if (this.$row >= rowCount) - return null; + + return this.$rowTokens[this.$tokenIndex]; + } + + this.stepForward = function() { + var rowCount = this.$session.getLength(); + this.$tokenIndex += 1; + + while (this.$tokenIndex >= this.$rowTokens.length) { + this.$row += 1; + if (this.$row >= rowCount) + return null; this.$rowTokens = this.$session.getTokens(this.$row, this.$row)[0].tokens; this.$tokenIndex = 0; @@ -104,8 +104,8 @@ var TokenIterator = function(session, initialRow, initialColumn) { } return column; - } - + } + }).call(TokenIterator.prototype); exports.TokenIterator = TokenIterator;