fix jumping to brackets in strings
This commit is contained in:
parent
d7c7cb1b4d
commit
e92b709eb2
1 changed files with 47 additions and 40 deletions
|
|
@ -1923,48 +1923,54 @@ var Editor = function(renderer, session) {
|
|||
var cursor = this.getCursorPosition();
|
||||
var iterator = new TokenIterator(this.session, cursor.row, cursor.column);
|
||||
var prevToken = iterator.getCurrentToken();
|
||||
var token;
|
||||
var token = prevToken;
|
||||
|
||||
//handle bracket as first char on line
|
||||
if (prevToken && prevToken.index===0)
|
||||
token = prevToken;
|
||||
else
|
||||
if (!token)
|
||||
token = iterator.stepForward();
|
||||
|
||||
if (!token)
|
||||
return;
|
||||
|
||||
|
||||
//get next closing tag or bracket
|
||||
var matchType;
|
||||
var found = false;
|
||||
var inverse;
|
||||
var depth = {};
|
||||
var i = cursor.column - token.start;
|
||||
var bracketType;
|
||||
var brackets = {
|
||||
")": "(",
|
||||
"(": "(",
|
||||
"]": "[",
|
||||
"[": "[",
|
||||
"{": "{",
|
||||
"}": "{"
|
||||
};
|
||||
|
||||
do {
|
||||
if (token.value.match(/[{}()\[\]]/g)) {
|
||||
for (var i=0; i<token.value.length; i++) {
|
||||
for (; i<token.value.length && !found; i++) {
|
||||
if (!brackets[token.value[i]]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
bracketType = brackets[token.value[i]]+'.'+token.type.replace("rparen", "lparen");
|
||||
|
||||
if (isNaN(depth[bracketType])) {
|
||||
depth[bracketType] = 0;
|
||||
}
|
||||
|
||||
switch (token.value[i]) {
|
||||
case '(':
|
||||
case '[':
|
||||
case '{':
|
||||
if (isNaN(depth[token.value[i]])) {
|
||||
depth[token.value] = 0;
|
||||
}
|
||||
|
||||
depth[token.value[i]]++;
|
||||
depth[bracketType]++;
|
||||
break;
|
||||
case ')':
|
||||
case ']':
|
||||
case '}':
|
||||
inverse = this.session.$brackets[token.value[i]];
|
||||
depth[bracketType]--;
|
||||
|
||||
if (isNaN(depth[inverse])) {
|
||||
depth[inverse] = 0;
|
||||
}
|
||||
|
||||
depth[inverse]--;
|
||||
|
||||
if (depth[inverse]===-1) {
|
||||
if (depth[bracketType]===-1) {
|
||||
matchType = 'bracket';
|
||||
found = true;
|
||||
}
|
||||
|
|
@ -1976,23 +1982,24 @@ var Editor = function(renderer, session) {
|
|||
depth[token.value] = 0;
|
||||
}
|
||||
|
||||
if (prevToken.value==='<') {
|
||||
if (prevToken.value === '<') {
|
||||
depth[token.value]++;
|
||||
} else if ( prevToken.value==='</') {
|
||||
} else if (prevToken.value === '</') {
|
||||
depth[token.value]--;
|
||||
}
|
||||
|
||||
if (depth[token.value]===-1) {
|
||||
if (depth[token.value] === -1) {
|
||||
matchType = 'tag';
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (found===false) {
|
||||
|
||||
if (!found) {
|
||||
prevToken = token;
|
||||
token = iterator.stepForward();
|
||||
i = 0;
|
||||
}
|
||||
} while (token && found===false);
|
||||
} while (token && !found);
|
||||
|
||||
//no match found
|
||||
if (!matchType) {
|
||||
|
|
@ -2005,9 +2012,9 @@ var Editor = function(renderer, session) {
|
|||
if (!range) {
|
||||
range = new Range(
|
||||
iterator.getCurrentTokenRow(),
|
||||
iterator.getCurrentTokenColumn(),
|
||||
iterator.getCurrentTokenColumn()+i-1,
|
||||
iterator.getCurrentTokenRow(),
|
||||
iterator.getCurrentTokenColumn()
|
||||
iterator.getCurrentTokenColumn()+i-1
|
||||
);
|
||||
if (!range)
|
||||
return;
|
||||
|
|
@ -2020,16 +2027,16 @@ var Editor = function(renderer, session) {
|
|||
var tag = token.value;
|
||||
else
|
||||
return;
|
||||
|
||||
|
||||
var range = new Range(
|
||||
iterator.getCurrentTokenRow(),
|
||||
iterator.getCurrentTokenColumn()-2,
|
||||
iterator.getCurrentTokenRow(),
|
||||
iterator.getCurrentTokenColumn()-2
|
||||
);
|
||||
|
||||
|
||||
//find matching tag
|
||||
if (range.compare(cursor.row, cursor.column)===0) {
|
||||
if (range.compare(cursor.row, cursor.column) === 0) {
|
||||
found = false;
|
||||
do {
|
||||
token = prevToken;
|
||||
|
|
@ -2039,11 +2046,11 @@ var Editor = function(renderer, session) {
|
|||
if (prevToken.type.indexOf('tag-close') !== -1) {
|
||||
range.setEnd(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn()+1);
|
||||
}
|
||||
|
||||
if (token.value===tag && token.type.indexOf('tag-name') !== -1) {
|
||||
if (prevToken.value==='<') {
|
||||
|
||||
if (token.value === tag && token.type.indexOf('tag-name') !== -1) {
|
||||
if (prevToken.value === '<') {
|
||||
depth[tag]++;
|
||||
} else if ( prevToken.value==='</') {
|
||||
} else if ( prevToken.value === '</') {
|
||||
depth[tag]--;
|
||||
}
|
||||
|
||||
|
|
@ -2051,17 +2058,17 @@ var Editor = function(renderer, session) {
|
|||
found = true;
|
||||
}
|
||||
}
|
||||
} while (prevToken && found===false);
|
||||
} while (prevToken && !found);
|
||||
}
|
||||
|
||||
|
||||
//we found it
|
||||
if (token && token.type.indexOf('tag-name')) {
|
||||
if (token && token.type.indexOf('tag-name')) {
|
||||
var pos = range.start;
|
||||
if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2)
|
||||
pos = range.end;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pos = range && range.cursor || pos;
|
||||
if (pos) {
|
||||
if (select) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue