首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用vscod扩展名api将默认文本插入新创建的文件中。

使用vscod扩展名api将默认文本插入新创建的文件中。
EN

Stack Overflow用户
提问于 2022-11-06 20:19:16
回答 2查看 26关注 0票数 0

我正在尝试创建一个简单的vscode扩展,它将将一些默认文本插入到新创建的文件中。我想要的是vscode.workspace.createFileSystemWatcher调用一个获取activeTextEditor并写入新文件的函数。以下是我尝试过的:

代码语言:javascript
复制
import * as vscode from "vscode";
export function activate(context: vscode.ExtensionContext) {
  let disposable = vscode.commands.registerCommand(
    "default-text-generator.generate",
    () => {
      function _watcherChangeApplied(editor?: vscode.TextEditor) {
        if (editor) {
          editor.edit((editBuilder) => {
            editBuilder.insert(editor.selection.active, "Hello World");
          });
        }
      }

      const editor = vscode.window.activeTextEditor;
      let uri: vscode.Uri | undefined = editor?.document.uri;

      if (uri) {
        let watcher = vscode.workspace.createFileSystemWatcher(
          new vscode.RelativePattern(
            vscode.workspace.getWorkspaceFolder(uri)!,
            "**/*.ts"
          ),
          false,
          false,
          false
        );

        watcher.onDidCreate(() => _watcherChangeApplied(editor));
      }
    }
  );

  context.subscriptions.push(disposable);
}

// this method is called when your extension is deactivated
export function deactivate(): void {
  //deactivate
}

这是正在发生的事情。编辑器似乎插入了文本,然后立即被覆盖回空白页。我好像搞不懂为什么。

EN

回答 2

Stack Overflow用户

发布于 2022-11-06 22:51:46

之所以会出现这个问题,是因为您所指的editor不是您所认为的那样。在创建新的.ts文件时,您关注的不是新创建的编辑器,而是您所关注的/活动的编辑器。

FileSystemWatcher.onDidCreate事件为工作区内新创建的文件提供了一个Uri,但不一定是在VS代码中打开的。尝试通过终端创建一个文件,你就会明白我的意思。文件被创建,事件被触发,但是VS代码中没有打开任何编辑器。

因此,您将无法使用editor.edit API来操作该文件。相反,您应该使用RAW/Node函数编辑文件。但是,在这种情况下,您可能/可能会与创建.ts文件的外部工具发生冲突(如果使用FileWatcher,这可能不是VS代码)。如果只能检测到通过VS代码创建的文件,则应改为workspace.onDidCreateFiles事件。但是,它也只为您提供Uri,而不是Editor

希望这能有所帮助

票数 0
EN

Stack Overflow用户

发布于 2022-11-06 23:39:09

这样做是可行的:

代码语言:javascript
复制
let disposable2 = vscode.commands.registerCommand('yourCommand.here', async  (...file) =>  {

  async function _watcherChangeApplied(uri) {
    if (uri) {

      const editor = await vscode.window.showTextDocument(uri);

      editor.edit((editBuilder) => {
        editBuilder.insert(editor.selection.active, "Hello World");
      });
      await editor.document.save();
    }
  }
    
  const editor = vscode.window.activeTextEditor;
  let uri = editor?.document.uri;
    
  if (uri) {
    let watcher = vscode.workspace.createFileSystemWatcher(
        new vscode.RelativePattern(
            vscode.workspace.getWorkspaceFolder(uri),
            "**/*.ts"
        ),
        false,
        false,
        false
    );
    
    // watcher.onDidCreate(() => _watcherChangeApplied(editor));
    watcher.onDidCreate((uri) => _watcherChangeApplied(uri));
  }
}

关键是watcher.onDidCreate()将返回新创建的文件的uri。您可以将它传递给您的_watcherChangeApplied(uri)函数。

_watcherChangeApplied(uri)中,您可以通过await vscode.window.showTextDocument(uri)显示创建的文件,该函数返回一个可以与其edit函数一起使用的editor

无论是在vscode中创建文件(比如浏览器顶部的New File...图标按钮)还是通过终端(比如touch test.ts),代码都可以工作。

如果希望启用通过终端创建新文件,而不打开它们,请尝试以下_watcherChangeApplied(uri)

代码语言:javascript
复制
async function _watcherChangeApplied(uri) {
  if (uri) {

    const document = await vscode.workspace.openTextDocument(uri);

    const strToAdd = "Hello World";
    const wse = new vscode.WorkspaceEdit();
    wse.insert(uri, new vscode.Position(0,0), strToAdd);
    await vscode.workspace.applyEdit(wse);

    await document.save();
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74339446

复制
相关文章

相似问题

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