首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用vscode vscode.window.activeTextEditor.edit函数在新行上生成代码

使用vscode vscode.window.activeTextEditor.edit函数在新行上生成代码
EN

Stack Overflow用户
提问于 2022-01-03 20:44:22
回答 1查看 198关注 0票数 1

你好,我正在编写一个vscode扩展,它根据单击按钮时使用的语言生成模板代码。然而,生成的代码并不在新的行上,尽管协调是正确的。

代码语言:javascript
运行
复制
import * as vscode from 'vscode';
import "typescript";
import "./constants";

let myStatusBar : vscode.StatusBarItem;

export function activate({ subscriptions }: vscode.ExtensionContext) {
    const codeBoilerplateCommand = 'code-boilerplate.CodeBoilerplate';
    subscriptions.push(vscode.commands.registerCommand(codeBoilerplateCommand, () => {
        const documentFileType = vscode.window.activeTextEditor?.document.languageId;
        const documentFileName = vscode.window.activeTextEditor?.document.fileName;
        const documentFilePath = vscode.window.activeTextEditor?.document.fileName.split('/');

        if (documentFileType === "javascript") {
            vscode.window.activeTextEditor.edit(editBuilder => {
                editBuilder.insert(new vscode.Position(0, 0), 'console.log("Hello World!")');
            });
        }
        else if (documentFileType === "python") {
            vscode.window.activeTextEditor.edit(editBuilder => {
                editBuilder.insert(new vscode.Position(0, 0), 'print("Hello World!")');
            });
        }
        else if (documentFileType === "typescript") {
            vscode.window.activeTextEditor.edit(editBuilder => {
                editBuilder.insert(new vscode.Position(0, 0), 'console.log("Hello World!");');
            });
        }
        else if (documentFileType === "csharp") {
            vscode.window.activeTextEditor.edit(editBuilder => {
                editBuilder.insert(new vscode.Position(0,0), 'using System;');
                editBuilder.insert(new vscode.Position(0,3), 'namespace HelloWorld {');
                editBuilder.insert(new vscode.Position(6,4), 'class HelloWorld {');
                editBuilder.insert(new vscode.Position(9,8), 'static void Main(string[] args) {');
                editBuilder.insert(new vscode.Position(12,12), 'Console.WriteLine("Hello World!");');
                editBuilder.insert(new vscode.Position(14,8), '}');
                editBuilder.insert(new vscode.Position(15,4), '}');
                editBuilder.insert(new vscode.Position(16,0), '}');
            });
        }
        else if (documentFileType === "c") {
            vscode.window.activeTextEditor.edit(editBuilder => {
                editBuilder.insert(new vscode.Position(0,0), '#include <stdio.h>');
                editBuilder.insert(new vscode.Position(1,0), 'int main() {');
                editBuilder.insert(new vscode.Position(2,4), 'printf("Hello World!");');
                editBuilder.insert(new vscode.Position(3,4), 'return 0;');
                editBuilder.insert(new vscode.Position(4,0), '}');
            })
        }
        else if (documentFileType === "cpp") {
            return null;
        }
        else if (documentFileType === "java") {
            return null;
        }
        vscode.window.showInformationMessage("Code Boilerplate Generated! ");
    }));

    myStatusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100);
    myStatusBar.command = codeBoilerplateCommand;
    subscriptions.push(myStatusBar);

    subscriptions.push(vscode.window.onDidChangeActiveTextEditor(updateStatusBarItem));
    subscriptions.push(vscode.window.onDidChangeTextEditorSelection(updateStatusBarItem));
    updateStatusBarItem();
}

function updateStatusBarItem(): void {
    myStatusBar.text = `$(new-file) Hello World!`;
    myStatusBar.show();
}

export function deactivate() {
    myStatusBar.dispose();
}

例如,如果我使用C夏普文件,我将得到

代码语言:javascript
运行
复制
using System;namespace HelloWorld {class HelloWorld {static void Main(string[] args) {Console.WriteLine("Hello World!");}}}

在这里,我希望有新的行和缩进代码

代码语言:javascript
运行
复制
using System;

namespace HelloWorld {
    class HelloWorld {
        static void Main(string[] args) {
            Console.WriteLine("Hello World!");
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-01-04 02:11:52

在测试您的代码时,我发现上面的注释是正确的,如果文档中没有预先存在的第2行,您就不能简单地说。

editBuilder.insert(new vscode.Position(2,3), 'someText');

让它起作用。editBuilder不会写入一个还没有的行-它不会自动创建一个很好的新行。但相反,它将其附加到唯一的行中,即第1行。

有两种方法可以解决这个问题:

  • 最佳方法:将字符串构造为字符串文本.

代码语言:javascript
运行
复制
let insertString;

// build the cSharp string
insertString = `using System;

namespace HelloWorld {
  class HelloWorld {
    static void Main(string[] args) {
      Console.WriteLine("Hello World!");
    }
  }
}`;

// only need one of these for all the insertString's
await vscode.window.activeTextEditor.edit(editBuilder => {
    editBuilder.insert(new vscode.Position(0,0), insertString);
});

这很好的工作,很容易看出您的字符串是否正确与您想要的缩进。

  • 首先插入足够多的空行,然后添加编辑:

代码语言:javascript
运行
复制
// make these into a loop
await vscode.commands.executeCommand('editor.action.insertLineAfter');
await vscode.commands.executeCommand('editor.action.insertLineAfter');
await vscode.commands.executeCommand('editor.action.insertLineAfter');
await vscode.commands.executeCommand('editor.action.insertLineAfter');
await vscode.commands.executeCommand('editor.action.insertLineAfter');
await vscode.commands.executeCommand('editor.action.insertLineAfter');
await vscode.commands.executeCommand('editor.action.insertLineAfter');
await vscode.commands.executeCommand('editor.action.insertLineAfter');

  // I fixed the Position arguments here
  // note all Position characters are at 0

await vscode.window.activeTextEditor.edit(editBuilder => {
    editBuilder.insert(new vscode.Position(0,0), 'using System;');
    editBuilder.insert(new vscode.Position(2,0), 'namespace HelloWorld {');
    editBuilder.insert(new vscode.Position(3,0), '\tclass HelloWorld {');
    editBuilder.insert(new vscode.Position(4,0), '\t\tstatic void Main(string[] args) {');
    editBuilder.insert(new vscode.Position(5,0), '\t\t\tConsole.WriteLine("Hello World!");');
    editBuilder.insert(new vscode.Position(6,0), '\t\t}');
    editBuilder.insert(new vscode.Position(7,0), '\t}');
    editBuilder.insert(new vscode.Position(8,0), '}');
});

关于位置的注意:显然就像写到不存在的行一样,写到像editBuilder.insert(new vscode.Position(6,12).....这样的字符位置不会在空行6上工作。空行上没有字符12。因此,我对Position characters进行了零点化,并根据需要使用\t作为缩进行。这也是方法1更可取的另一个原因。

这两种方法都有效,但显然第一种方法更干净。下面是在同一个activate函数中连续工作的两种方法的演示:

的另一个诀窍是选择所有文本并在设置了该文件的editor.action.formatSelection 命令之后运行(检查用户是否已经设置了该文件):

代码语言:javascript
运行
复制
const  editor = vscode.window.activeTextEditor;
await vscode.languages.setTextDocumentLanguage(editor.document, 'javascript');

// Note: no attempt to format the insertString here
const insertString = `using System;

    namespace HelloWorld {
    class HelloWorld {
    static void Main(string[] args) {
    Console.WriteLine("Hello World!");
    }
    }
    }`;

await editor.edit(editBuilder => {
    editBuilder.insert(new vscode.Position(10,0), insertString);
});

// select all the text and run formatSelection
await vscode.commands.executeCommand('editor.action.selectAll');
await vscode.commands.executeCommand('editor.action.formatSelection');
await vscode.commands.executeCommand('cancelSelection');

,它假定用户为每种语言安装了一个格式化程序。

此格式化程序的演示程序:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70571237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档