Skip to content

Instantly share code, notes, and snippets.

@irrationalRock
Created April 21, 2018 02:13
Show Gist options
  • Save irrationalRock/09b17d99301214381b9dc6d961c063a5 to your computer and use it in GitHub Desktop.
Save irrationalRock/09b17d99301214381b9dc6d961c063a5 to your computer and use it in GitHub Desktop.
doing some fixes
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