mirror of https://github.com/coder/code-server.git
54 lines
1.9 KiB
TypeScript
54 lines
1.9 KiB
TypeScript
|
/*---------------------------------------------------------------------------------------------
|
||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||
|
*--------------------------------------------------------------------------------------------*/
|
||
|
|
||
|
import * as vscode from 'vscode';
|
||
|
import { Node } from 'EmmetNode';
|
||
|
import { getNode, parseDocument, validate } from './util';
|
||
|
|
||
|
export function mergeLines() {
|
||
|
if (!validate(false) || !vscode.window.activeTextEditor) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const editor = vscode.window.activeTextEditor;
|
||
|
|
||
|
let rootNode = parseDocument(editor.document);
|
||
|
if (!rootNode) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
return editor.edit(editBuilder => {
|
||
|
editor.selections.reverse().forEach(selection => {
|
||
|
let textEdit = getRangesToReplace(editor.document, selection, rootNode!);
|
||
|
if (textEdit) {
|
||
|
editBuilder.replace(textEdit.range, textEdit.newText);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function getRangesToReplace(document: vscode.TextDocument, selection: vscode.Selection, rootNode: Node): vscode.TextEdit | undefined {
|
||
|
let startNodeToUpdate: Node | null;
|
||
|
let endNodeToUpdate: Node | null;
|
||
|
|
||
|
if (selection.isEmpty) {
|
||
|
startNodeToUpdate = endNodeToUpdate = getNode(rootNode, selection.start, true);
|
||
|
} else {
|
||
|
startNodeToUpdate = getNode(rootNode, selection.start, true);
|
||
|
endNodeToUpdate = getNode(rootNode, selection.end, true);
|
||
|
}
|
||
|
|
||
|
if (!startNodeToUpdate || !endNodeToUpdate || startNodeToUpdate.start.line === endNodeToUpdate.end.line) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
let rangeToReplace = new vscode.Range(startNodeToUpdate.start, endNodeToUpdate.end);
|
||
|
let textToReplaceWith = document.lineAt(startNodeToUpdate.start.line).text.substr(startNodeToUpdate.start.character);
|
||
|
for (let i = startNodeToUpdate.start.line + 1; i <= endNodeToUpdate.end.line; i++) {
|
||
|
textToReplaceWith += document.lineAt(i).text.trim();
|
||
|
}
|
||
|
|
||
|
return new vscode.TextEdit(rangeToReplace, textToReplaceWith);
|
||
|
}
|