From fb64ca08d30fe273eeb5020cf5294f807e058258 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sat, 7 Oct 2017 17:27:58 +0200 Subject: [PATCH] custom shells (fixes #50) --- .../terminalSettingsTab.component.pug | 8 +++++++ terminus-terminal/src/config.ts | 1 + terminus-terminal/src/index.ts | 2 ++ .../src/services/terminal.service.ts | 16 ++++++++++---- terminus-terminal/src/shells/custom.ts | 21 +++++++++++++++++++ 5 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 terminus-terminal/src/shells/custom.ts diff --git a/terminus-terminal/src/components/terminalSettingsTab.component.pug b/terminus-terminal/src/components/terminalSettingsTab.component.pug index 091ac1a9..a514e16e 100644 --- a/terminus-terminal/src/components/terminalSettingsTab.component.pug +++ b/terminus-terminal/src/components/terminalSettingsTab.component.pug @@ -238,6 +238,14 @@ [ngValue]='shell.id' ) {{shell.name}} + .form-group(*ngIf='config.store.terminal.shell == "custom"') + label Custom shell + input.form-control( + type='text', + '[(ngModel)]'='config.store.terminal.customShell', + (ngModelChange)='config.save()', + ) + .form-group label Terminal bell br diff --git a/terminus-terminal/src/config.ts b/terminus-terminal/src/config.ts index e85c2a21..ab921caf 100644 --- a/terminus-terminal/src/config.ts +++ b/terminus-terminal/src/config.ts @@ -10,6 +10,7 @@ export class TerminalConfigProvider extends ConfigProvider { background: 'theme', ligatures: false, cursor: 'block', + customShell: '', colorScheme: { __nonStructural: true, name: 'Material', diff --git a/terminus-terminal/src/index.ts b/terminus-terminal/src/index.ts index 714a07a4..7b40852f 100644 --- a/terminus-terminal/src/index.ts +++ b/terminus-terminal/src/index.ts @@ -24,6 +24,7 @@ import { TerminalConfigProvider } from './config' import { TerminalHotkeyProvider } from './hotkeys' import { HyperColorSchemes } from './colorSchemes' +import { CustomShellProvider } from './shells/custom' import { Cygwin32ShellProvider } from './shells/cygwin32' import { Cygwin64ShellProvider } from './shells/cygwin64' import { GitBashShellProvider } from './shells/gitBash' @@ -59,6 +60,7 @@ import { hterm } from './hterm' { provide: ShellProvider, useClass: WindowsStockShellsProvider, multi: true }, { provide: ShellProvider, useClass: MacOSDefaultShellProvider, multi: true }, { provide: ShellProvider, useClass: LinuxDefaultShellProvider, multi: true }, + { provide: ShellProvider, useClass: CustomShellProvider, multi: true }, { provide: ShellProvider, useClass: Cygwin32ShellProvider, multi: true }, { provide: ShellProvider, useClass: Cygwin64ShellProvider, multi: true }, { provide: ShellProvider, useClass: GitBashShellProvider, multi: true }, diff --git a/terminus-terminal/src/services/terminal.service.ts b/terminus-terminal/src/services/terminal.service.ts index edfb3749..5fd38cf7 100644 --- a/terminus-terminal/src/services/terminal.service.ts +++ b/terminus-terminal/src/services/terminal.service.ts @@ -14,16 +14,24 @@ export class TerminalService { private app: AppService, private sessions: SessionsService, private config: ConfigService, - @Inject(ShellProvider) shellProviders: ShellProvider[], + @Inject(ShellProvider) private shellProviders: ShellProvider[], log: LogService, ) { this.logger = log.create('terminal') - Promise.all(shellProviders.map(x => x.provide())).then(shellLists => { - this.shells$.next(shellLists.reduce((a, b) => a.concat(b))) - this.shells$.complete() + this.reloadShells() + + config.changed$.subscribe(() => { + this.reloadShells() }) } + async reloadShells () { + this.shells$ = new AsyncSubject() + let shellLists = await Promise.all(this.shellProviders.map(x => x.provide())) + this.shells$.next(shellLists.reduce((a, b) => a.concat(b))) + this.shells$.complete() + } + async openTab (shell?: IShell, cwd?: string): Promise { if (!cwd && this.app.activeTab instanceof TerminalTabComponent) { cwd = await this.app.activeTab.session.getWorkingDirectory() diff --git a/terminus-terminal/src/shells/custom.ts b/terminus-terminal/src/shells/custom.ts new file mode 100644 index 00000000..d12514c7 --- /dev/null +++ b/terminus-terminal/src/shells/custom.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core' +import { ConfigService } from 'terminus-core' + +import { ShellProvider, IShell } from '../api' + +@Injectable() +export class CustomShellProvider extends ShellProvider { + constructor ( + private config: ConfigService, + ) { + super() + } + + async provide (): Promise { + return [{ + id: 'custom', + name: 'Custom', + command: this.config.store.terminal.customShell + }] + } +}