Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLineCommand.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import * as strings from '../../../../base/common/strings.js';
7
import { EditOperation, ISingleEditOperation } from '../../../common/core/editOperation.js';
8
import { Position } from '../../../common/core/position.js';
9
import { Selection } from '../../../common/core/selection.js';
10
import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from '../../../common/editorCommon.js';
11
import { ITextModel } from '../../../common/model.js';
12
13
export class InsertFinalNewLineCommand implements ICommand {
14
15
private readonly _selection: Selection;
16
private _selectionId: string | null;
17
18
19
constructor(selection: Selection) {
20
this._selection = selection;
21
this._selectionId = null;
22
}
23
24
public getEditOperations(model: ITextModel, builder: IEditOperationBuilder): void {
25
const op = insertFinalNewLine(model);
26
if (op) {
27
builder.addEditOperation(op.range, op.text);
28
}
29
this._selectionId = builder.trackSelection(this._selection);
30
}
31
32
public computeCursorState(model: ITextModel, helper: ICursorStateComputerData): Selection {
33
return helper.getTrackedSelection(this._selectionId!);
34
}
35
}
36
37
/**
38
* Generate edit operations for inserting a final new line if needed.
39
* Returns undefined if no edit is needed.
40
*/
41
export function insertFinalNewLine(model: ITextModel): ISingleEditOperation | undefined {
42
const lineCount = model.getLineCount();
43
const lastLine = model.getLineContent(lineCount);
44
const lastLineIsEmptyOrWhitespace = strings.lastNonWhitespaceIndex(lastLine) === -1;
45
46
if (!lineCount || lastLineIsEmptyOrWhitespace) {
47
return;
48
}
49
50
return EditOperation.insert(
51
new Position(lineCount, model.getLineMaxColumn(lineCount)),
52
model.getEOL()
53
);
54
}
55
56