Merge pull request #1058 from ajaxorg/feature/keyboardModifyNumbers
Feature/keyboard modify numbers
This commit is contained in:
commit
23f4b201ce
2 changed files with 83 additions and 1 deletions
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue