mirror of
https://github.com/microsoft/vscode-extension-samples.git
synced 2026-04-27 16:55:44 +08:00
54 lines
2.1 KiB
TypeScript
54 lines
2.1 KiB
TypeScript
import * as vscode from 'vscode';
|
|
|
|
export function activate(context: vscode.ExtensionContext) {
|
|
console.log('Congratulations, your extension "tabs-api-sample" is now active!');
|
|
|
|
/**
|
|
* You can use proposed API here. `vscode.` should start auto complete
|
|
* Proposed API as defined in vscode.proposed.<proposalName>.d.ts.
|
|
*/
|
|
const activityMap: Map<vscode.Tab, number> = new Map();
|
|
|
|
context.subscriptions.push(vscode.window.tabGroups.onDidChangeTabGroups(() => {
|
|
const tabs = vscode.window.tabGroups.all.map(group => group.tabs).flat(1);
|
|
activityMap.clear();
|
|
// Update activity map saying everything is active
|
|
tabs.forEach(t => activityMap.set(t, Date.now()));
|
|
}));
|
|
context.subscriptions.push(vscode.window.tabGroups.onDidChangeTabs(tabChangeEvent => {
|
|
// If tabs are closed no longer track their activity
|
|
for (const removedTab of tabChangeEvent.closed) {
|
|
activityMap.delete(removedTab);
|
|
}
|
|
// Update activity map last active time on changed tabs
|
|
const changedTabs = [...tabChangeEvent.opened, ...tabChangeEvent.changed];
|
|
for (const tab of changedTabs) {
|
|
// Reset the timer for the tabs last activity
|
|
activityMap.set(tab, Date.now());
|
|
}
|
|
}));
|
|
// Check every second for inactive tabs
|
|
const interval = setInterval(() => {
|
|
const activeTab = vscode.window.tabGroups.activeTabGroup.activeTab;
|
|
if (activeTab) {
|
|
// Update the activity map for the active tab, since it's still being used.
|
|
activityMap.set(activeTab, Date.now());
|
|
}
|
|
const inactiveTime = (vscode.workspace.getConfiguration().get<number>('tabs.maxInactiveTime') ?? 30) * 1000;
|
|
// Check if any tabs have been inactive for more than 30 seconds
|
|
const inactiveTabs = Array.from(activityMap.entries()).filter(([tab, lastActive]) => Date.now() - lastActive > inactiveTime && !tab.isActive && !tab.isDirty);
|
|
inactiveTabs.forEach(async ([tab]) => {
|
|
// Close the tab
|
|
await vscode.window.tabGroups.close(tab);
|
|
activityMap.delete(tab);
|
|
});
|
|
}, 1000);
|
|
|
|
// Create a small disposable to clean up the interval when extension is deactivated
|
|
context.subscriptions.push({
|
|
dispose: () => {
|
|
clearInterval(interval);
|
|
}
|
|
});
|
|
}
|