Created
April 21, 2018 02:13
-
-
Save irrationalRock/09b17d99301214381b9dc6d961c063a5 to your computer and use it in GitHub Desktop.
doing some fixes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public run(accessor: ServicesAccessor, editor: ICodeEditor): void { | |
const primaryCursor = editor.getSelection(); | |
const allSelections = editor.getSelections(); | |
const model = editor.getModel(); | |
let rangeAll = []; | |
for(let i = 0; i < allSelections.length;i++){ | |
rangeAll.push(model.getLineContent(allSelections[i].selectionStartLineNumber)); | |
} | |
rangeAll.push(model.getLineContent(allSelections[0].selectionStartLineNumber-1)); | |
let result = editor.getModel().findPreviousMatch(rangeAll[rangeAll.length-1],editor.getPosition(),false,true,null,false); | |
//thinking of using this to get the right selection | |
//need to append it to | |
let rangesToMove = this._getRangesToMove(editor); | |
let effectiveRanges: Range[] = []; | |
let lastEdit = [result.range]; | |
for (let i = 0, count = rangesToMove.length - 1; i < count; i++) { | |
let range = rangesToMove[i]; | |
let nextRange = rangesToMove[i + 1]; | |
if (Range.intersectRanges(range, nextRange) === null) { | |
effectiveRanges.push(range); | |
} else { | |
rangesToMove[i + 1] = Range.plusRange(range, nextRange); | |
} | |
} | |
effectiveRanges.push(rangesToMove[rangesToMove.length-1]); | |
let endCursorState = this._getEndCursorState(primaryCursor, effectiveRanges); | |
let count = 1; | |
let edits: IIdentifiedSingleEditOperation[] = effectiveRanges.map(range => { | |
endCursorState.push(new Selection(range.startLineNumber-1, range.startColumn, range.endLineNumber-1, range.endColumn)); | |
return EditOperation.replaceMove(range, rangeAll[count++]); | |
}); | |
edits = edits.concat(lastEdit.map(range =>{ | |
return EditOperation.replace(range,rangeAll[0]); | |
})); | |
editor.pushUndoStop(); | |
editor.executeEdits(this.id, edits, endCursorState); | |
editor.pushUndoStop(); | |
} | |
_getEndCursorState(primaryCursor: Range, rangesToDelete: Range[]): Selection[] { | |
let endPrimaryCursor: Selection; | |
let endCursorState: Selection[] = []; | |
for (let i = 0, len = rangesToDelete.length; i < len; i++) { | |
let range = rangesToDelete[i]; | |
//see if this changse anything (does the same thing as done in edits callback) | |
let endCursor = new Selection(rangesToDelete[i].startLineNumber-1, rangesToDelete[i].startColumn, rangesToDelete[i].endLineNumber-1, rangesToDelete[i].endColumn); | |
if (range.intersectRanges(primaryCursor)) { | |
endPrimaryCursor = endCursor; | |
} else { | |
endCursorState.push(endCursor); | |
} | |
} | |
if (endPrimaryCursor) { | |
endCursorState.unshift(endPrimaryCursor); | |
} | |
return endCursorState; | |
} | |
_getRangesToMove(editor: ICodeEditor): Range[] { | |
let rangesToMove: Range[] = editor.getSelections(); | |
rangesToMove.sort(Range.compareRangesUsingStarts); | |
rangesToMove = rangesToMove.map(selection => { | |
if (selection.isEmpty()) { | |
//change this so that it takes whole line | |
return new Range(selection.startLineNumber, selection.startColumn, selection.endLineNumber, selection.endColumn); | |
} else { | |
return selection; | |
} | |
}); | |
return rangesToMove; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment