mirror of
https://github.com/Eugeny/tabby.git
synced 2025-07-20 02:18:01 +00:00
allow starting commands in new tabs via CLI (fixes #304)
This commit is contained in:
@@ -25,6 +25,7 @@ export interface SessionOptions {
|
||||
height?: number
|
||||
recoveryId?: string
|
||||
recoveredTruePID$?: Observable<number>
|
||||
pauseAfterExit?: boolean
|
||||
}
|
||||
|
||||
export abstract class SessionPersistenceProvider {
|
||||
@@ -51,7 +52,7 @@ export abstract class TerminalColorSchemeProvider {
|
||||
|
||||
export interface IShell {
|
||||
id: string
|
||||
name: string
|
||||
name?: string
|
||||
command: string
|
||||
args?: string[]
|
||||
env?: any
|
||||
|
@@ -1,9 +1,7 @@
|
||||
import * as fs from 'mz/fs'
|
||||
import * as path from 'path'
|
||||
import { first } from 'rxjs/operators'
|
||||
import { Injectable } from '@angular/core'
|
||||
import { DomSanitizer } from '@angular/platform-browser'
|
||||
import { HotkeysService, ToolbarButtonProvider, IToolbarButton, ConfigService, HostAppService, ElectronService } from 'terminus-core'
|
||||
import { HotkeysService, ToolbarButtonProvider, IToolbarButton, HostAppService, ElectronService } from 'terminus-core'
|
||||
|
||||
import { TerminalService } from './services/terminal.service'
|
||||
|
||||
@@ -12,7 +10,6 @@ export class ButtonProvider extends ToolbarButtonProvider {
|
||||
constructor (
|
||||
private terminal: TerminalService,
|
||||
private domSanitizer: DomSanitizer,
|
||||
private config: ConfigService,
|
||||
hostApp: HostAppService,
|
||||
electron: ElectronService,
|
||||
hotkeys: HotkeysService,
|
||||
@@ -20,24 +17,30 @@ export class ButtonProvider extends ToolbarButtonProvider {
|
||||
super()
|
||||
hotkeys.matchedHotkey.subscribe(async (hotkey) => {
|
||||
if (hotkey === 'new-tab') {
|
||||
this.openNewTab()
|
||||
this.terminal.openTab()
|
||||
}
|
||||
})
|
||||
hostApp.secondInstance$.subscribe(async ({argv, cwd}) => {
|
||||
if (argv.length === 2) {
|
||||
let arg = path.resolve(cwd, argv[1])
|
||||
if (await fs.exists(arg)) {
|
||||
this.openNewTab(arg)
|
||||
hostApp.cliOpenDirectory$.subscribe(async directory => {
|
||||
if (await fs.exists(directory)) {
|
||||
if ((await fs.stat(directory)).isDirectory()) {
|
||||
this.terminal.openTab(null, directory)
|
||||
}
|
||||
}
|
||||
})
|
||||
hostApp.cliRunCommand$.subscribe(async command => {
|
||||
this.terminal.openTab({
|
||||
id: '',
|
||||
command: command[0],
|
||||
args: command.slice(1),
|
||||
}, null, true)
|
||||
})
|
||||
if (!electron.remote.process.env.DEV) {
|
||||
setImmediate(async () => {
|
||||
let argv: string[] = electron.remote.process.argv
|
||||
for (let arg of argv.slice(1).concat([electron.remote.process.argv0])) {
|
||||
if (await fs.exists(arg)) {
|
||||
if ((await fs.stat(arg)).isDirectory()) {
|
||||
this.openNewTab(arg)
|
||||
this.terminal.openTab(null, arg)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -45,19 +48,13 @@ export class ButtonProvider extends ToolbarButtonProvider {
|
||||
}
|
||||
}
|
||||
|
||||
async openNewTab (cwd?: string): Promise<void> {
|
||||
let shells = await this.terminal.shells$.pipe(first()).toPromise()
|
||||
let shell = shells.find(x => x.id === this.config.store.terminal.shell)
|
||||
this.terminal.openTab(shell, cwd)
|
||||
}
|
||||
|
||||
provide (): IToolbarButton[] {
|
||||
return [{
|
||||
icon: this.domSanitizer.bypassSecurityTrustHtml(require('./icons/plus.svg')),
|
||||
title: 'New terminal',
|
||||
touchBarNSImage: 'NSTouchBarAddDetailTemplate',
|
||||
click: async () => {
|
||||
this.openNewTab()
|
||||
this.terminal.openTab()
|
||||
}
|
||||
}]
|
||||
}
|
||||
|
@@ -65,6 +65,7 @@ export abstract class BaseSession {
|
||||
|
||||
export class Session extends BaseSession {
|
||||
private pty: any
|
||||
private pauseAfterExit = false
|
||||
|
||||
start (options: SessionOptions) {
|
||||
this.name = options.name
|
||||
@@ -110,16 +111,24 @@ export class Session extends BaseSession {
|
||||
})
|
||||
|
||||
this.pty.on('exit', () => {
|
||||
if (this.open) {
|
||||
console.log('session exit')
|
||||
if (this.pauseAfterExit) {
|
||||
return
|
||||
} else if (this.open) {
|
||||
this.destroy()
|
||||
}
|
||||
})
|
||||
|
||||
this.pty.on('close', () => {
|
||||
if (this.open) {
|
||||
console.log('session close')
|
||||
if (this.pauseAfterExit) {
|
||||
this.emitOutput('\r\nPress any key to close\r\n')
|
||||
} else if (this.open) {
|
||||
this.destroy()
|
||||
}
|
||||
})
|
||||
|
||||
this.pauseAfterExit = options.pauseAfterExit
|
||||
}
|
||||
|
||||
resize (columns, rows) {
|
||||
@@ -129,8 +138,12 @@ export class Session extends BaseSession {
|
||||
}
|
||||
|
||||
write (data) {
|
||||
if (this.pty._writable) {
|
||||
this.pty.write(Buffer.from(data, 'utf-8'))
|
||||
if (this.open) {
|
||||
if (this.pty._writable) {
|
||||
this.pty.write(Buffer.from(data, 'utf-8'))
|
||||
} else {
|
||||
this.destroy()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -34,7 +34,7 @@ export class TerminalService {
|
||||
this.shells.complete()
|
||||
}
|
||||
|
||||
async openTab (shell?: IShell, cwd?: string): Promise<TerminalTabComponent> {
|
||||
async openTab (shell?: IShell, cwd?: string, pause?: boolean): Promise<TerminalTabComponent> {
|
||||
if (!cwd) {
|
||||
if (this.app.activeTab instanceof TerminalTabComponent && this.app.activeTab.session) {
|
||||
cwd = await this.app.activeTab.session.getWorkingDirectory()
|
||||
@@ -54,6 +54,7 @@ export class TerminalService {
|
||||
args: shell.args || [],
|
||||
cwd,
|
||||
env,
|
||||
pauseAfterExit: pause,
|
||||
})
|
||||
|
||||
this.logger.log('Using session options:', sessionOptions)
|
||||
|
Reference in New Issue
Block a user