如何以编程方式关闭 vscode.window 的 showInformationMessage 框
How to programmatically close vscode.window's showInformationMessage box
我刚开始学习 vscode 扩展,我想知道是否有一种简单的方法可以通过编程关闭通过 vscode.window.showInformationMessage()
生成的信息消息框。如果你想重现,我从 WordCount demo here 开始,在 extension.ts
的正文 copy/pasting 之后,如教程中所述,我对 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);
}
我尝试过或考虑过的:
- 同时使用
null
和空字符串调用 vscode.window.showInformationMessage()
- 什么都不做,除了 null
|空字符串之外的任何操作都会导致出现新的信息消息框
- 处理命令 - 没有任何理由认为这会起作用,当然必须重新注册命令才能再次起作用
- 试图访问 DOM 以简单地找到 "Close" 按钮并触发对其的点击 - 但没有运气找到任何类型的操纵 DOM[= 的入口点32=]
旁注:我 对此范例中的最佳实践感兴趣。例如,是否有一个流行的节点库包装了我可能想考虑使用的 js 计时器?但是,这不是我对此 post 的主要关注点。如果您要对延迟机制 (setTimeout()/clearTimeout()
) 发表评论,请就此 environment/paradigm 中的最佳实践(超越 "that's ugly" 或“这不是[你会亲自]去做。
暂时不能。
github 上针对 vscode 提出了一个相关问题:https://github.com/Microsoft/vscode/issues/2732
回复中给出的不允许关闭信息消息的原因是"their intent is that a user must react on them".
那里建议使用状态栏显示需要更新/关闭的消息作为推荐方法。
虽然消息似乎没有明确的关闭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)
}
}
)
我刚开始学习 vscode 扩展,我想知道是否有一种简单的方法可以通过编程关闭通过 vscode.window.showInformationMessage()
生成的信息消息框。如果你想重现,我从 WordCount demo here 开始,在 extension.ts
的正文 copy/pasting 之后,如教程中所述,我对 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);
}
我尝试过或考虑过的:
- 同时使用
null
和空字符串调用vscode.window.showInformationMessage()
- 什么都不做,除了null
|空字符串之外的任何操作都会导致出现新的信息消息框 - 处理命令 - 没有任何理由认为这会起作用,当然必须重新注册命令才能再次起作用
- 试图访问 DOM 以简单地找到 "Close" 按钮并触发对其的点击 - 但没有运气找到任何类型的操纵 DOM[= 的入口点32=]
旁注:我 对此范例中的最佳实践感兴趣。例如,是否有一个流行的节点库包装了我可能想考虑使用的 js 计时器?但是,这不是我对此 post 的主要关注点。如果您要对延迟机制 (setTimeout()/clearTimeout()
) 发表评论,请就此 environment/paradigm 中的最佳实践(超越 "that's ugly" 或“这不是[你会亲自]去做。
暂时不能。
github 上针对 vscode 提出了一个相关问题:https://github.com/Microsoft/vscode/issues/2732
回复中给出的不允许关闭信息消息的原因是"their intent is that a user must react on them".
那里建议使用状态栏显示需要更新/关闭的消息作为推荐方法。
虽然消息似乎没有明确的关闭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)
}
}
)