Skip to content

Commit 2189bae

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 a839da3 commit 2189bae

File tree

2 files changed

+64
-5
lines changed

2 files changed

+64
-5
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> {
@@ -139,6 +142,18 @@ const options: Options<Required<Args>> = {
139142
"show-versions": { type: "boolean", description: "Show VS Code extension versions." },
140143
"proxy-domain": { type: "string[]", description: "Domain used for proxying ports." },
141144

145+
"open-in": { type: "boolean", short: "oi", description: "Open file(s) or folder(s) in running instance" },
146+
"new-window": {
147+
type: "boolean",
148+
short: "n",
149+
description: "Force to open a new window. (use with open-in)",
150+
},
151+
"reuse-window": {
152+
type: "boolean",
153+
short: "r",
154+
description: "Force to open a file or folder in an already opened window. (use with open-in)",
155+
},
156+
142157
locale: { type: "string" },
143158
log: { type: LogLevel },
144159
verbose: { type: "boolean", short: "vvv", description: "Enable verbose logging." },

src/node/entry.ts

+49-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +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"
5-
import { plural } from "../common/util"
6+
import { CliMessage, OpenCommandPipeArgs } from "../../lib/vscode/src/vs/server/ipc"
67
import { LoginHttpProvider } from "./app/login"
78
import { ProxyHttpProvider } from "./app/proxy"
89
import { StaticHttpProvider } from "./app/static"
@@ -63,9 +64,9 @@ const main = async (args: Args, cliArgs: Args, configArgs: Args): Promise<void>
6364
...(args.cert && !args.cert.value
6465
? await generateCertificate()
6566
: {
66-
cert: args.cert && args.cert.value,
67-
certKey: args["cert-key"],
68-
}),
67+
cert: args.cert && args.cert.value,
68+
certKey: args["cert-key"],
69+
}),
6970
}
7071

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

0 commit comments

Comments
 (0)