Skip to content

Commit c4acf86

Browse files
committed
Add open-in, new-window and reuse-window
Add initial support for opening files / folders in running code-server instance. Current limitations: - unable to open a file in a new window, only folders - unable to use addMode feature - others...
1 parent c8ce380 commit c4acf86

File tree

2 files changed

+64
-4
lines changed

2 files changed

+64
-4
lines changed

src/node/cli.ts

+15
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ export interface Args extends VsArgs {
4545
readonly "proxy-domain"?: string[]
4646
readonly locale?: string
4747
readonly _: string[]
48+
readonly "open-in"?: boolean
49+
readonly "reuse-window"?: boolean
50+
readonly "new-window"?: boolean
4851
}
4952

5053
interface Option<T> {
@@ -134,6 +137,18 @@ const options: Options<Required<Args>> = {
134137
"show-versions": { type: "boolean", description: "Show VS Code extension versions." },
135138
"proxy-domain": { type: "string[]", description: "Domain used for proxying ports." },
136139

140+
"open-in": { type: "boolean", short: "oi", description: "Open file(s) or folder(s) in running instance" },
141+
"new-window": {
142+
type: "boolean",
143+
short: "n",
144+
description: "Force to open a new window. (use with open-in)",
145+
},
146+
"reuse-window": {
147+
type: "boolean",
148+
short: "r",
149+
description: "Force to open a file or folder in an already opened window. (use with open-in)",
150+
},
151+
137152
locale: { type: "string" },
138153
log: { type: LogLevel },
139154
verbose: { type: "boolean", short: "vvv", description: "Enable verbose logging." },

src/node/entry.ts

+49-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { field, logger } from "@coder/logger"
22
import * as cp from "child_process"
3+
import { promises as fs } from "fs"
4+
import http from "http"
35
import * as path from "path"
4-
import { CliMessage } from "../../lib/vscode/src/vs/server/ipc"
6+
import { CliMessage, OpenCommandPipeArgs } from "../../lib/vscode/src/vs/server/ipc"
57
import { LoginHttpProvider } from "./app/login"
68
import { ProxyHttpProvider } from "./app/proxy"
79
import { StaticHttpProvider } from "./app/static"
@@ -63,9 +65,9 @@ const main = async (args: Args, cliArgs: Args, configArgs: Args): Promise<void>
6365
...(args.cert && !args.cert.value
6466
? await generateCertificate()
6567
: {
66-
cert: args.cert && args.cert.value,
67-
certKey: args["cert-key"],
68-
}),
68+
cert: args.cert && args.cert.value,
69+
certKey: args["cert-key"],
70+
}),
6971
}
7072

7173
if (options.cert && !options.certKey) {
@@ -162,6 +164,49 @@ async function entry(): Promise<void> {
162164
console.log(version, commit)
163165
}
164166
process.exit(0)
167+
} else if (args["open-in"]) {
168+
if (!process.env["VSCODE_IPC_HOOK_CLI"]) {
169+
logger.error("VSCODE_IPC_HOOK_CLI missing from environment, unable to run")
170+
process.exit(1)
171+
}
172+
const pipeArgs: OpenCommandPipeArgs = { type: "open", folderURIs: [] }
173+
pipeArgs.forceReuseWindow = args["reuse-window"]
174+
pipeArgs.forceNewWindow = args["new-window"]
175+
for (const a in args._) {
176+
if (Object.prototype.hasOwnProperty.call(args._, a)) {
177+
try {
178+
const fp = await fs.realpath(args._[a])
179+
const st = await fs.stat(fp)
180+
if (st.isDirectory()) {
181+
pipeArgs.folderURIs = [...pipeArgs.folderURIs, fp]
182+
} else {
183+
pipeArgs.fileURIs = [...(pipeArgs.fileURIs || []), fp]
184+
}
185+
} catch (error) {
186+
pipeArgs.fileURIs = [...(pipeArgs.fileURIs || []), args._[a]]
187+
}
188+
}
189+
}
190+
if (pipeArgs.forceNewWindow && pipeArgs.fileURIs && pipeArgs.fileURIs.length > 0) {
191+
logger.error("new-window can only be used with folder paths")
192+
process.exit(1)
193+
}
194+
const vscode = http.request({
195+
path: "/",
196+
method: "POST",
197+
socketPath: process.env["VSCODE_IPC_HOOK_CLI"],
198+
},
199+
(res) => {
200+
res.on("data", (message) => {
201+
logger.debug("Got message from VS Code", field("message", message.toString()))
202+
})
203+
},
204+
)
205+
vscode.on("error", (err) => {
206+
logger.debug("Got error from VS Code", field("error", err))
207+
})
208+
vscode.write(JSON.stringify(pipeArgs))
209+
vscode.end()
165210
} else if (args["list-extensions"] || args["install-extension"] || args["uninstall-extension"]) {
166211
logger.debug("forking vs code cli...")
167212
const vscode = cp.fork(path.resolve(__dirname, "../../lib/vscode/out/vs/server/fork"), [], {

0 commit comments

Comments
 (0)