Fix default working directory for terminals + setting working directory when root starts with "~"

pull/208/head
Kelvin Schoofs 4 years ago
parent a7fafedd7e
commit 484a6ab242

@ -240,12 +240,14 @@ export class Manager implements vscode.TreeDataProvider<string | FileSystemConfi
// Create connection (early so we have .actualConfig.root) // Create connection (early so we have .actualConfig.root)
const con = await this.createConnection(name, config); const con = await this.createConnection(name, config);
// Calculate working directory if applicable // Calculate working directory if applicable
let workingDirectory: string | undefined = uri ? uri.path : con.actualConfig.root || '/'; let workingDirectory: string | undefined = uri && uri.path;
if (workingDirectory) { if (workingDirectory) {
// Normally there should be a fs, as (currently) workingDirectory is only provided // Normally there should be a fs, as (currently) workingDirectory is only provided
// when the user uses "Open remote SSH terminal" on a directory in the explorer view // when the user uses "Open remote SSH terminal" on a directory in the explorer view
const fs = this.fileSystems.find(fs => fs.config.name === name); const fs = this.fileSystems.find(fs => fs.config.name === name);
workingDirectory = fs ? fs.relative(workingDirectory) : undefined; workingDirectory = fs ? fs.relative(workingDirectory) : (con.actualConfig.root || '/');
// If we don't have an FS (e.g. SSH View > Open Terminal without an active FS), we
// just use the declared `root` field, which _hopefully_ works out nicely with `cd`
} }
// Create pseudo terminal // Create pseudo terminal
con.pendingUserCount++; con.pendingUserCount++;
@ -372,11 +374,11 @@ export class Manager implements vscode.TreeDataProvider<string | FileSystemConfi
const name = typeof target === 'string' ? target : target.name; const name = typeof target === 'string' ? target : target.name;
uri = uri || vscode.Uri.parse(`ssh://${name}/`, true); uri = uri || vscode.Uri.parse(`ssh://${name}/`, true);
try { try {
if (typeof target === 'string') { if (typeof target === 'string') {
await this.createTerminal(target, undefined, uri); await this.createTerminal(target, undefined, uri);
} else { } else {
await this.createTerminal(target.label || target.name, target, uri); await this.createTerminal(target.label || target.name, target, uri);
} }
} catch (e) { } catch (e) {
const choice = await vscode.window.showErrorMessage<vscode.MessageItem>( const choice = await vscode.window.showErrorMessage<vscode.MessageItem>(
`Couldn't start a terminal for ${name}: ${e.message || e}`, `Couldn't start a terminal for ${name}: ${e.message || e}`,

@ -29,7 +29,16 @@ export async function createTerminal(client: Client, config: FileSystemConfig, w
// Hopefully the exit event fires first // Hopefully the exit event fires first
channel.on('close', () => onDidClose.fire(0)); channel.on('close', () => onDidClose.fire(0));
// There isn't a proper way of setting the working directory, but this should work in most cases // There isn't a proper way of setting the working directory, but this should work in most cases
if (workingDirectory) channel.write(`cd "${workingDirectory}"\n`); if (workingDirectory) {
if (workingDirectory.startsWith('~')) {
// So `cd "~/a/b/..." apparently doesn't work, but `~/"a/b/..."` does
// `"~"` would also fail but `~/""` works fine it seems
workingDirectory = `~/"${workingDirectory.substr(2)}"`;
} else {
workingDirectory = `"${workingDirectory}"`;
}
channel.write(`cd ${workingDirectory}\n`);
}
const pseudo: SSHPseudoTerminal = { const pseudo: SSHPseudoTerminal = {
config, client, channel, config, client, channel,
onDidWrite: onDidWrite.event, onDidWrite: onDidWrite.event,

Loading…
Cancel
Save