VSCode 扩展 - 如何更改文件的文本

DFB*_*rry 15 visual-studio-code vscode-extensions

我有一个扩展程序,可以获取打开文件的文本并对其进行更改。更改文本后,如何将其放回 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);
}
Run Code Online (Sandbox Code Playgroud)

aam*_*rks 8

这是 Rebornix 扩展示例(包含在一组 Microsoft 扩展示例中)中主要功能的修订版,用于处理您提出的选择问题。它反转选择的内容(留下选择),或者如果选择为空,它将反转该选择处光标下的单词,而不保留任何选择。离开选择通常是有意义的,但您可以添加代码来删除选择。

    let disposable = vscode.commands.registerCommand('extension.reverseWord', function () {
        // Get the active text editor
        const editor = vscode.window.activeTextEditor;

        if (editor) {
            const document = editor.document;
            editor.edit(editBuilder => {
                editor.selections.forEach(sel => {
                    const range = sel.isEmpty ? document.getWordRangeAtPosition(sel.start) || sel : sel;
                    let word = document.getText(range);
                    let reversed = word.split('').reverse().join('');
                    editBuilder.replace(range, reversed);
                })
            }) // apply the (accumulated) replacement(s) (if multiple cursors/selections)
        }
    });

Run Code Online (Sandbox Code Playgroud)

诚然,虽然我可以通过设置.selection为似乎不适用于.selections[i]. 但是您可以在没有选择的情况下进行多项更改。

您不想做的是通过代码进行选择只是为了通过代码更改文本。用户进行选择,而您不进行选择(除非该功能的最终目的是进行选择)。

我来到这个问题是为了寻找一种应用textEdit[]数组的方法(通常由provideDocumentRangeFormattingEdits回调函数返回)。如果您在数组中构建更改,您可以在您自己的函数中将它们应用到您的文档:

        const { activeTextEditor } = vscode.window;

        if (activeTextEditor) {
            const { document } = activeTextEditor;
            if (document) {
                /*
                  build your textEdits similarly to the above with insert, delete, replace 
                  but not within an editBuilder arrow function
                const textEdits: vscode.TextEdit[] = [];
                textEdits.push(vscode.TextEdit.replace(...));
                textEdits.push(vscode.TextEdit.insert(...));
                */

                const workEdits = new vscode.WorkspaceEdit();
                workEdits.set(document.uri, textEdits); // give the edits
                vscode.workspace.applyEdit(workEdits); // apply the edits
            }
        }
Run Code Online (Sandbox Code Playgroud)

所以这是将编辑应用到文档的另一种方法。即使我在没有选择文本的情况下让 editBuilder 示例正常工作,我在其他情况下也遇到了选择问题。WorkspaceEdit 不会选择更改。


Reb*_*nix 7

您可以在这里使用的 API 是TextEditor.edit,其定义是

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

它要求回调作为第一个参数,在回调中,您可以通过访问 editBuilder 对文档进行编辑。

我在https://github.com/Microsoft/vscode-extension-samples/tree/master/document-editing-sample 中放了一个示例扩展,它反转当前选择中的内容,这基本上是一个简单的使用TextEditor.edit


Sha*_*iar 5

这是可以解决您的问题的代码片段:

activeEditor.edit((selectedText) => {
    selectedText.replace(activeEditor.selection, newText);
})
Run Code Online (Sandbox Code Playgroud)