Merge pull request #1058 from ajaxorg/feature/keyboardModifyNumbers

Feature/keyboard modify numbers
This commit is contained in:
Harutyun Amirjanyan 2012-10-27 10:39:24 -07:00
commit 23f4b201ce
2 changed files with 83 additions and 1 deletions

View file

@ -331,6 +331,16 @@ exports.commands = [{
bindKey: bindKey("Ctrl-/", "Command-/"),
exec: function(editor) { editor.toggleCommentLines(); },
multiSelectAction: "forEach"
}, {
name: "modifyNumberUp",
bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"),
exec: function(editor) { editor.modifyNumber(1); },
multiSelectAction: "forEach"
}, {
name: "modifyNumberDown",
bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"),
exec: function(editor) { editor.modifyNumber(-1); },
multiSelectAction: "forEach"
}, {
name: "replace",
bindKey: bindKey("Ctrl-R", "Command-Option-F"),

View file

@ -1309,7 +1309,7 @@ var Editor = function(renderer, session) {
/**
* Editor.toggleCommentLines()
*
* Given the currently selected range, this function either comments all lines or uncomments all lines (depending on whether it's commented or not).
* Given the currently selected range, this function either comments all the lines, or uncomments all of them.
**/
this.toggleCommentLines = function() {
var state = this.session.getState(this.getCursorPosition().row);
@ -1317,6 +1317,78 @@ var Editor = function(renderer, session) {
this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);
};
/**
* Editor.getNumberAt() -> Number
*
* Works like [[Editor.getTokenAt]], except it returns a number.
**/
this.getNumberAt = function( row, column ) {
var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g
_numberRx.lastIndex = 0
var s = this.session.getLine(row)
while(_numberRx.lastIndex < column - 1 ){
var m = _numberRx.exec(s)
if(m.index <= column && m.index+m[0].length >= column){
var number = {
value: m[0],
start: m.index,
end: m.index+m[0].length
}
return number
}
}
return null;
};
/**
* Editor.modifyNumber(amount)
* - amount (Number): The value to change the numeral by (can be negative to decrease value)
*
* If the character before the cursor is a number, this functions changes its value by `amount`.
**/
this.modifyNumber = function(amount) {
var row = this.selection.getCursor().row;
var column = this.selection.getCursor().column;
// get the char before the cursor
var charRange = new Range(row, column-1, row, column);
var c = this.session.getTextRange(charRange);
// if the char is a digit
if (!isNaN(parseFloat(c)) && isFinite(c)) {
// get the whole number the digit is part of
var nr = this.getNumberAt(row, column);
// if number found
if (nr) {
var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end;
var decimals = nr.start + nr.value.length - fp;
var t = parseFloat(nr.value);
t *= Math.pow(10, decimals);
if(fp !== nr.end && column < fp){
amount *= Math.pow(10, nr.end - column - 1);
} else {
amount *= Math.pow(10, nr.end - column);
}
t += amount;
t /= Math.pow(10, decimals);
var nnr = t.toFixed(decimals);
//update number
var replaceRange = new Range(row, nr.start, row, nr.end);
this.session.replace(replaceRange, nnr);
//reposition the cursor
this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));
}
}
};
/** related to: EditSession.remove
* Editor.removeLines()
*