Skip to content

Commit 29e3a73

Browse files
authored
Reuse the terminal instance that has already been created.
1 parent 212617d commit 29e3a73

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

src/extension.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import ZigDiagnosticsProvider from "./zigDiagnosticsProvider";
55
import ZigMainCodeLensProvider from "./zigMainCodeLens";
66
import ZigTestRunnerProvider from "./zigTestRunnerProvider";
77
import { registerDocumentFormatting } from "./zigFormat";
8+
import { registerTerminalStateManagement } from "./terminalState";
89
import { setupZig } from "./zigSetup";
910

1011
export async function activate(context: vscode.ExtensionContext) {
@@ -17,6 +18,7 @@ export async function activate(context: vscode.ExtensionContext) {
1718
const testRunner = new ZigTestRunnerProvider();
1819
testRunner.activate(context.subscriptions);
1920

21+
registerTerminalStateManagement();
2022
ZigMainCodeLensProvider.registerCommands(context);
2123
context.subscriptions.push(
2224
vscode.languages.registerCodeLensProvider(

src/terminalState.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* A status monitor for a VSCode terminal.
3+
*/
4+
5+
import vscode from "vscode";
6+
7+
const terminalsState = new Map<vscode.Terminal, boolean>();
8+
9+
export function getTerminalState(terminal: vscode.Terminal): boolean | undefined {
10+
return terminalsState.get(terminal);
11+
}
12+
13+
export function registerTerminalStateManagement(): void {
14+
vscode.window.onDidOpenTerminal((terminal) => {
15+
terminalsState.set(terminal, false);
16+
});
17+
vscode.window.onDidStartTerminalShellExecution((event) => {
18+
terminalsState.set(event.terminal, true);
19+
});
20+
vscode.window.onDidEndTerminalShellExecution((event) => {
21+
terminalsState.set(event.terminal, false);
22+
});
23+
vscode.window.onDidCloseTerminal((terminal) => {
24+
terminalsState.delete(terminal);
25+
});
26+
}

src/zigMainCodeLens.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import path from "path";
66
import util from "util";
77

88
import { getWorkspaceFolder, isWorkspaceFile } from "./zigUtil";
9+
import { getTerminalState } from "./terminalState";
910
import { zigProvider } from "./zigSetup";
1011

1112
const execFile = util.promisify(childProcess.execFile);
@@ -43,7 +44,9 @@ function zigRun() {
4344
const zigPath = zigProvider.getZigPath();
4445
if (!zigPath) return;
4546
const filePath = vscode.window.activeTextEditor.document.uri.fsPath;
46-
const terminal = vscode.window.createTerminal("Run Zig Program");
47+
const terminalName = "Run Zig Program";
48+
const terminals = vscode.window.terminals.filter((t) => t.name === terminalName && getTerminalState(t) === false);
49+
const terminal = terminals.length > 0 ? terminals[0] : vscode.window.createTerminal(terminalName);
4750
const callOperator = /(powershell.exe$|powershell$|pwsh.exe$|pwsh$)/.test(vscode.env.shell) ? "& " : "";
4851
terminal.show();
4952
const wsFolder = getWorkspaceFolder(filePath);

0 commit comments

Comments
 (0)