在开发 vscode 插件时,如果你的插件存在多种类型的日志输出,并且你可能需要知道当前选中的输出通道名,可以尝试下这种方式:
import * as vscode from "vscode";
import { PUBLISHER, EXTENSION_NAME, OUTPUT_CHANNEL_NAME } from "src/constants";
export function getVisibleOutputChannel() {
const visibleTextEditors = vscode.window.visibleTextEditors;
const visibleOutputChannel = visibleTextEditors.find(({ document }) => {
return (
document.uri.scheme === "output" &&
document.uri.path.startsWith(
`${PUBLISHER}.${EXTENSION_NAME}.${OUTPUT_CHANNEL_NAME}`
)
);
});
return visibleOutputChannel?.document.uri.path;
}
其中,PUBLISHER 和 EXTENSION_NAME 分别对应的是 package.json 中的 publisher 和 name 属性的值,OUTPUT_CHANNEL_NAME 对应的是你使用 vscode.window.createOutputChannel 方法创建输出通道时指定的输出通道名。
不仅如此,如果你还想监听输出面板日志的切换,但同样由于 vscode 本身并没有提供直接的 api,我也没找到更好的实现方式,有需要的话可以暂时参考这样实现:
context.subscriptions.push(
vscode.window.onDidChangeVisibleTextEditors(() => {
// 当存在多个 visibleTextEditor 时,该回调会被执行多次,每次获取到的 visibleTextEditors 会按顺序递增
})
);
这里要注意,TextEditors 不仅仅包含所有的输出通道,你打开的每个文件编辑区域也都属于 TextEditor,它们的打开、关闭、切换都会触发该回调。另外,当存在多个可见的 TextEditor 时,该回调会被执行多次,且每次获取到的 visibleTextEditors 会按顺序递增。因此,你可能还需要结合上面示例中的 getVisibleOutputChannel 方法一起去做相关业务逻辑的处理。