12

我刚开始学习 vscode 扩展,我想知道是否有一种简单的方法可以以编程方式关闭通过vscode.window.showInformationMessage(). 如果你想重现,我从这里的 WordCount 演示开始,在复制/粘贴 的正文后extension.ts,如教程中所述,我做了一些修改,activate()如下所示......

export function activate(context: ExtensionContext) {
    let wordCounter = new WordCounter();
    let wcTimeout = null;
    let setWCTimeout = function() {
        clearWCTimeout();
        wcTimeout = setTimeout(clearWCTimeout, 1000);
    };
    let clearWCTimeout = function() {
        if (wcTimeout !== null) {
            clearTimeout(wcTimeout);
            wcTimeout = null;
            // clear/hide the message box here, but how?
        }
    };

    let disposable = commands.registerCommand('extension.sayHello', () => {
        wordCounter.updateWordCount();
        setWCTimeout();
        vscode.window
            .showInformationMessage(wordCounter._getWordCount(window.activeTextEditor.document).toString())
            .then(clearWCTimeout);
    });

    // Add to a list of disposables which are disposed when this extension is deactivated.
    context.subscriptions.push(wordCounter);
    context.subscriptions.push(wcTimeout);
    context.subscriptions.push(disposable);
}   

我尝试过或考虑过的:

  • vscode.window.showInformationMessage()用空字符串和空字符串调用null- 什么都不做,除了null|空字符串之外的任何东西都会导致出现一个新的信息消息框
  • 处理命令 - 真的没有任何理由认为这会起作用,并且该命令必须重新注册才能再次起作用
  • 试图访问 DOM 以简单地找到“关闭”按钮并触发点击它 - 但没有找到任何类型的操作 DOM 的入口点

旁注:我这种范式中的最佳实践感兴趣。例如,是否有一个流行的节点库可以包装我可能要考虑使用的 js 计时器?但是,这不是我对这篇文章的主要关注。如果您要评论延迟机制setTimeout()/clearTimeout()( .

4

2 回答 2

11

目前是不可能的。

在 github 上针对 vscode 提出了一个相关问题:https ://github.com/Microsoft/vscode/issues/2732

不允许关闭信息消息的响应中给出的理由是“他们的意图是用户必须对他们做出反应”

建议将状态栏用于需要更新/关闭的消息作为推荐方法。

于 2016-06-29T10:28:47.917 回答
4

虽然消息似乎没有明确的关闭 API(https://github.com/Microsoft/vscode/issues/2732),但我的解决方法是使用进度来模拟自动关闭的通知:

      vscode.window.withProgress(
        {
          location: vscode.ProgressLocation.Notification,
          title: 'Finding ...',
          cancellable: false,
        },
        async (progress, token) => {
         for (let i = 0; i < 10; i++) {
          setTimeout(() => {
            progress.report({ increment: i*10, message: title })
          }, 10000)
        }
       }
      )

于 2021-08-19T04:38:18.433 回答