你好,我正在编写一个vscode扩展,它根据单击按钮时使用的语言生成模板代码。然而,生成的代码并不在新的行上,尽管协调是正确的。
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夏普文件,我将得到
using System;namespace HelloWorld {class HelloWorld {static void Main(string[] args) {Console.WriteLine("Hello World!");}}}
在这里,我希望有新的行和缩进代码
using System;
namespace HelloWorld {
class HelloWorld {
static void Main(string[] args) {
Console.WriteLine("Hello World!");
}
}
}
发布于 2022-01-04 02:11:52
在测试您的代码时,我发现上面的注释是正确的,如果文档中没有预先存在的第2行,您就不能简单地说。
editBuilder.insert(new vscode.Position(2,3), 'someText');
让它起作用。editBuilder
不会写入一个还没有的行-它不会自动创建一个很好的新行。但相反,它将其附加到唯一的行中,即第1行。
有两种方法可以解决这个问题:
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);
});
这很好的工作,很容易看出您的字符串是否正确与您想要的缩进。
// 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
命令之后运行(检查用户是否已经设置了该文件):
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');
,它假定用户为每种语言安装了一个格式化程序。
此格式化程序的演示程序:
https://stackoverflow.com/questions/70571237
复制相似问题