Расширение VSCode - как изменить текст файла - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть расширение, которое захватывает текст открытого файла и изменяет его.Как только текст будет изменен, как мне вернуть его обратно в файл, который отображается в VSCode?

    // this method is called when your extension is activated
    // your extension is activated the very first time the command is executed
    export function activate(context: vscode.ExtensionContext) {

        // Use the console to output diagnostic information (console.log) and errors (console.error)
        // This line of code will only be executed once when your extension is activated
        console.log('Congratulations, your extension "myExtension" is now active!');
        console.log(process.versions);

        // The command has been defined in the package.json file
        // Now provide the implementation of the command with  registerCommand
        // The commandId parameter must match the command field in package.json
        let disposable = vscode.commands.registerCommand('extension.myExtension', () => {
            // The code you place here will be executed every time your command is executed

            let activeEditor = vscode.window.activeTextEditor;
            if (!activeEditor) {
                return;
            }
            let text = activeEditor.document.getText();

            getAsyncApi(text).then( (textToInsertIntoDoc) => {

                let finaldoc = insertTextIntoDoc(text, textToInsertIntoDoc);

                // not what I want - just used to see new text
                vscode.window.showInformationMessage(textToInsertIntoDoc);
            });

        });

        context.subscriptions.push(disposable);
    }

Ответы [ 2 ]

0 голосов
/ 08 августа 2019

Из-за проблем, которые я прокомментировал в ответе выше, я закончил тем, что написал быструю функцию, которая делает вставку дружественной к нескольким курсорам, и если выделение было пустым, то не оставляло вставленный текст, выбранный впоследствии (то естьимеет такое же интуитивное поведение, как если бы вы нажали CTRL + V , или набрали текст на клавиатуре и т. д.)

Вызывать это просто:

// x is the cursor index, it can be safely ignored if you don't need it.
InsertText(x => 'Hello World'); 

Реализация:

function InsertText(getText: (i:number) => string, i: number = 0, wasEmpty: boolean = false) {

    let activeEditor = vscode.window.activeTextEditor;
    if (!activeEditor) { return; }

    let sels = activeEditor.selections;

    if (i > 0 && wasEmpty)
    {
        sels[i - 1] = new vscode.Selection(sels[i - 1].end, sels[i - 1].end);
        activeEditor.selections = sels; // required or the selection updates will be ignored! ?
    }

    if (i < 0 || i >= sels.length) { return; }

    let isEmpty = sels[i].isEmpty;
    activeEditor.edit(edit => edit.replace(sels[i], getText(i))).then(x => {

        InsertText(getText, i + 1, isEmpty);
    });
}
0 голосов
/ 03 декабря 2018

API, который вы можете использовать здесь: TextEditor.edit, определение которого

edit(callback: (editBuilder: TextEditorEdit) => void, options?: {   undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable<boolean>;

Он запрашивает обратный вызов в качестве первого параметра, и в обратном вызове вы можете внести изменения в документ, посетив editBuilder.

Я поместил расширение образца в https://github.com/Microsoft/vscode-extension-samples/tree/master/document-editing-sample, которое переворачивает содержимое в текущем выделении, что в основном является простым использованием TextEditor.edit.

...