mirror of
https://github.com/Eugeny/tabby.git
synced 2024-11-30 02:54:04 +03:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
af515e01cf
@ -16,7 +16,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/remote": "2.0.10",
|
"@electron/remote": "2.0.10",
|
||||||
"node-pty": "^0.11.0-beta32",
|
"node-pty": "^1.0",
|
||||||
"any-promise": "^1.3.0",
|
"any-promise": "^1.3.0",
|
||||||
"electron-config": "2.0.0",
|
"electron-config": "2.0.0",
|
||||||
"electron-debug": "^3.2.0",
|
"electron-debug": "^3.2.0",
|
||||||
|
@ -2257,7 +2257,7 @@ mz@^2.7.0:
|
|||||||
object-assign "^4.0.1"
|
object-assign "^4.0.1"
|
||||||
thenify-all "^1.0.0"
|
thenify-all "^1.0.0"
|
||||||
|
|
||||||
nan@^2.14.0, nan@^2.17.0, "nan@github:jkleinsc/nan#remove_accessor_signature":
|
nan@^2.17.0, "nan@github:jkleinsc/nan#remove_accessor_signature":
|
||||||
version "2.16.0"
|
version "2.16.0"
|
||||||
resolved "https://codeload.github.com/jkleinsc/nan/tar.gz/6a2f95a6a2209d8aa7542fb18099fd808a802059"
|
resolved "https://codeload.github.com/jkleinsc/nan/tar.gz/6a2f95a6a2209d8aa7542fb18099fd808a802059"
|
||||||
|
|
||||||
@ -2345,12 +2345,12 @@ node-gyp@^5.0.2, node-gyp@^5.1.0:
|
|||||||
tar "^4.4.12"
|
tar "^4.4.12"
|
||||||
which "^1.3.1"
|
which "^1.3.1"
|
||||||
|
|
||||||
node-pty@^0.11.0-beta32:
|
node-pty@^1.0:
|
||||||
version "0.11.0-beta9"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.11.0-beta9.tgz#38a899d62b1c5c395ca466dfac5203eff989d350"
|
resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-1.0.0.tgz#7daafc0aca1c4ca3de15c61330373af4af5861fd"
|
||||||
integrity sha512-bU/2zYV6xBMVMHaMe+yr4WEw36PCA0hyZ7A0IBQFWy5l1vjsD52sZ9sGJk+dH7bw3xpuBLHMh9Eq4Di8rJz4IQ==
|
integrity sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==
|
||||||
dependencies:
|
dependencies:
|
||||||
nan "^2.14.0"
|
nan "^2.17.0"
|
||||||
|
|
||||||
nopt@^4.0.1, nopt@^4.0.3:
|
nopt@^4.0.1, nopt@^4.0.3:
|
||||||
version "4.0.3"
|
version "4.0.3"
|
||||||
|
@ -3,7 +3,7 @@ import { SerialPortStream } from '@serialport/stream'
|
|||||||
import { LogService, NotificationsService } from 'tabby-core'
|
import { LogService, NotificationsService } from 'tabby-core'
|
||||||
import { Subject, Observable } from 'rxjs'
|
import { Subject, Observable } from 'rxjs'
|
||||||
import { Injector, NgZone } from '@angular/core'
|
import { Injector, NgZone } from '@angular/core'
|
||||||
import { BaseSession, BaseTerminalProfile, LoginScriptsOptions, SessionMiddleware, StreamProcessingOptions, TerminalStreamProcessor, UTF8SplitterMiddleware } from 'tabby-terminal'
|
import { BaseSession, BaseTerminalProfile, InputProcessingOptions, InputProcessor, LoginScriptsOptions, SessionMiddleware, StreamProcessingOptions, TerminalStreamProcessor, UTF8SplitterMiddleware } from 'tabby-terminal'
|
||||||
import { SerialService } from './services/serial.service'
|
import { SerialService } from './services/serial.service'
|
||||||
|
|
||||||
export interface SerialProfile extends BaseTerminalProfile {
|
export interface SerialProfile extends BaseTerminalProfile {
|
||||||
@ -21,6 +21,7 @@ export interface SerialProfileOptions extends StreamProcessingOptions, LoginScri
|
|||||||
xoff?: boolean
|
xoff?: boolean
|
||||||
xany?: boolean
|
xany?: boolean
|
||||||
slowSend?: boolean
|
slowSend?: boolean
|
||||||
|
input: InputProcessingOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
export const BAUD_RATES = [
|
export const BAUD_RATES = [
|
||||||
@ -65,6 +66,7 @@ export class SerialSession extends BaseSession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.middleware.push(new UTF8SplitterMiddleware())
|
this.middleware.push(new UTF8SplitterMiddleware())
|
||||||
|
this.middleware.push(new InputProcessor(profile.options.input))
|
||||||
|
|
||||||
this.setLoginScriptsOptions(profile.options)
|
this.setLoginScriptsOptions(profile.options)
|
||||||
}
|
}
|
||||||
|
@ -92,4 +92,9 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
|
|||||||
ng-template(ngbNavContent)
|
ng-template(ngbNavContent)
|
||||||
login-scripts-settings([options]='profile.options')
|
login-scripts-settings([options]='profile.options')
|
||||||
|
|
||||||
|
li(ngbNavItem)
|
||||||
|
a(ngbNavLink, translate) Input
|
||||||
|
ng-template(ngbNavContent)
|
||||||
|
input-processing-settings([options]='profile.options.input')
|
||||||
|
|
||||||
div([ngbNavOutlet]='nav')
|
div([ngbNavOutlet]='nav')
|
||||||
|
@ -30,6 +30,7 @@ export class SerialProfilesService extends ProfileProvider<SerialProfile> {
|
|||||||
outputNewlines: null,
|
outputNewlines: null,
|
||||||
scripts: [],
|
scripts: [],
|
||||||
slowSend: false,
|
slowSend: false,
|
||||||
|
input: { backspace: 'backspace' },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { BaseTerminalProfile, LoginScriptsOptions } from 'tabby-terminal'
|
import { BaseTerminalProfile, InputProcessingOptions, LoginScriptsOptions } from 'tabby-terminal'
|
||||||
|
|
||||||
export enum SSHAlgorithmType {
|
export enum SSHAlgorithmType {
|
||||||
HMAC = 'hmac',
|
HMAC = 'hmac',
|
||||||
@ -34,6 +34,7 @@ export interface SSHProfileOptions extends LoginScriptsOptions {
|
|||||||
httpProxyHost?: string
|
httpProxyHost?: string
|
||||||
httpProxyPort?: number
|
httpProxyPort?: number
|
||||||
reuseSession?: boolean
|
reuseSession?: boolean
|
||||||
|
input: InputProcessingOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum PortForwardType {
|
export enum PortForwardType {
|
||||||
|
@ -294,4 +294,9 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
|
|||||||
ng-template(ngbNavContent)
|
ng-template(ngbNavContent)
|
||||||
login-scripts-settings([options]='profile.options', #loginScriptsSettings)
|
login-scripts-settings([options]='profile.options', #loginScriptsSettings)
|
||||||
|
|
||||||
|
li(ngbNavItem)
|
||||||
|
a(ngbNavLink, translate) Input
|
||||||
|
ng-template(ngbNavContent)
|
||||||
|
input-processing-settings([options]='profile.options.input')
|
||||||
|
|
||||||
div([ngbNavOutlet]='nav')
|
div([ngbNavOutlet]='nav')
|
||||||
|
@ -43,6 +43,7 @@ export class SSHProfilesService extends ProfileProvider<SSHProfile> {
|
|||||||
httpProxyHost: null,
|
httpProxyHost: null,
|
||||||
httpProxyPort: null,
|
httpProxyPort: null,
|
||||||
reuseSession: true,
|
reuseSession: true,
|
||||||
|
input: { backspace: 'backspace' },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import stripAnsi from 'strip-ansi'
|
|||||||
import { ClientChannel } from 'ssh2'
|
import { ClientChannel } from 'ssh2'
|
||||||
import { Injector } from '@angular/core'
|
import { Injector } from '@angular/core'
|
||||||
import { LogService } from 'tabby-core'
|
import { LogService } from 'tabby-core'
|
||||||
import { BaseSession, UTF8SplitterMiddleware } from 'tabby-terminal'
|
import { BaseSession, UTF8SplitterMiddleware, InputProcessor } from 'tabby-terminal'
|
||||||
import { SSHSession } from './ssh'
|
import { SSHSession } from './ssh'
|
||||||
import { SSHProfile } from '../api'
|
import { SSHProfile } from '../api'
|
||||||
|
|
||||||
@ -24,6 +24,7 @@ export class SSHShellSession extends BaseSession {
|
|||||||
this.setLoginScriptsOptions(this.profile.options)
|
this.setLoginScriptsOptions(this.profile.options)
|
||||||
this.ssh.serviceMessage$.subscribe(m => this.serviceMessage.next(m))
|
this.ssh.serviceMessage$.subscribe(m => this.serviceMessage.next(m))
|
||||||
this.middleware.push(new UTF8SplitterMiddleware())
|
this.middleware.push(new UTF8SplitterMiddleware())
|
||||||
|
this.middleware.push(new InputProcessor(profile.options.input))
|
||||||
}
|
}
|
||||||
|
|
||||||
async start (): Promise<void> {
|
async start (): Promise<void> {
|
||||||
|
@ -24,4 +24,9 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
|
|||||||
ng-template(ngbNavContent)
|
ng-template(ngbNavContent)
|
||||||
login-scripts-settings([options]='profile.options')
|
login-scripts-settings([options]='profile.options')
|
||||||
|
|
||||||
|
li(ngbNavItem)
|
||||||
|
a(ngbNavLink, translate) Input
|
||||||
|
ng-template(ngbNavContent)
|
||||||
|
input-processing-settings([options]='profile.options.input')
|
||||||
|
|
||||||
div([ngbNavOutlet]='nav')
|
div([ngbNavOutlet]='nav')
|
||||||
|
@ -19,6 +19,7 @@ export class TelnetProfilesService extends ProfileProvider<TelnetProfile> {
|
|||||||
inputNewlines: null,
|
inputNewlines: null,
|
||||||
outputNewlines: 'crlf',
|
outputNewlines: 'crlf',
|
||||||
scripts: [],
|
scripts: [],
|
||||||
|
input: { backspace: 'backspace' },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import colors from 'ansi-colors'
|
|||||||
import stripAnsi from 'strip-ansi'
|
import stripAnsi from 'strip-ansi'
|
||||||
import { Injector } from '@angular/core'
|
import { Injector } from '@angular/core'
|
||||||
import { LogService } from 'tabby-core'
|
import { LogService } from 'tabby-core'
|
||||||
import { BaseSession, BaseTerminalProfile, LoginScriptsOptions, SessionMiddleware, StreamProcessingOptions, TerminalStreamProcessor } from 'tabby-terminal'
|
import { BaseSession, BaseTerminalProfile, InputProcessingOptions, InputProcessor, LoginScriptsOptions, SessionMiddleware, StreamProcessingOptions, TerminalStreamProcessor } from 'tabby-terminal'
|
||||||
import { Subject, Observable } from 'rxjs'
|
import { Subject, Observable } from 'rxjs'
|
||||||
|
|
||||||
|
|
||||||
@ -14,6 +14,7 @@ export interface TelnetProfile extends BaseTerminalProfile {
|
|||||||
export interface TelnetProfileOptions extends StreamProcessingOptions, LoginScriptsOptions {
|
export interface TelnetProfileOptions extends StreamProcessingOptions, LoginScriptsOptions {
|
||||||
host: string
|
host: string
|
||||||
port?: number
|
port?: number
|
||||||
|
input: InputProcessingOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
enum TelnetCommands {
|
enum TelnetCommands {
|
||||||
@ -75,6 +76,7 @@ export class TelnetSession extends BaseSession {
|
|||||||
super(injector.get(LogService).create(`telnet-${profile.options.host}-${profile.options.port}`))
|
super(injector.get(LogService).create(`telnet-${profile.options.host}-${profile.options.port}`))
|
||||||
this.streamProcessor = new TerminalStreamProcessor(profile.options)
|
this.streamProcessor = new TerminalStreamProcessor(profile.options)
|
||||||
this.middleware.push(this.streamProcessor)
|
this.middleware.push(this.streamProcessor)
|
||||||
|
this.middleware.push(new InputProcessor(profile.options.input))
|
||||||
this.setLoginScriptsOptions(profile.options)
|
this.setLoginScriptsOptions(profile.options)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
.form-line
|
||||||
|
.header
|
||||||
|
.title(translate) Backspace key mode
|
||||||
|
|
||||||
|
select.form-control([(ngModel)]='options.backspace')
|
||||||
|
option(
|
||||||
|
*ngFor='let mode of backspaceModes',
|
||||||
|
[value]='mode.key',
|
||||||
|
) {{mode.name|translate}}
|
@ -0,0 +1,40 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'
|
||||||
|
import { Component, Input } from '@angular/core'
|
||||||
|
import { InputProcessingOptions } from '../middleware/inputProcessing'
|
||||||
|
|
||||||
|
/** @hidden */
|
||||||
|
@Component({
|
||||||
|
selector: 'input-processing-settings',
|
||||||
|
templateUrl: './inputProcessingSettings.component.pug',
|
||||||
|
})
|
||||||
|
export class InputProcessingSettingsComponent {
|
||||||
|
@Input() options: InputProcessingOptions
|
||||||
|
|
||||||
|
backspaceModes = [
|
||||||
|
{
|
||||||
|
key: 'backspace',
|
||||||
|
name: _('Pass-through'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'ctrl-h',
|
||||||
|
name: 'Ctrl-H',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'ctrl-?',
|
||||||
|
name: 'Ctrl-?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'delete',
|
||||||
|
name: 'Delete (CSI 3~)',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
getBackspaceModeName (key) {
|
||||||
|
return this.backspaceModes.find(x => x.key === key)?.name
|
||||||
|
}
|
||||||
|
|
||||||
|
setBackspaceMode (mode) {
|
||||||
|
this.options.backspace = mode
|
||||||
|
}
|
||||||
|
}
|
@ -18,6 +18,7 @@ import { StreamProcessingSettingsComponent } from './components/streamProcessing
|
|||||||
import { LoginScriptsSettingsComponent } from './components/loginScriptsSettings.component'
|
import { LoginScriptsSettingsComponent } from './components/loginScriptsSettings.component'
|
||||||
import { TerminalToolbarComponent } from './components/terminalToolbar.component'
|
import { TerminalToolbarComponent } from './components/terminalToolbar.component'
|
||||||
import { ColorSchemeSelectorComponent } from './components/colorSchemeSelector.component'
|
import { ColorSchemeSelectorComponent } from './components/colorSchemeSelector.component'
|
||||||
|
import { InputProcessingSettingsComponent } from './components/inputProcessingSettings.component'
|
||||||
|
|
||||||
import { TerminalDecorator } from './api/decorator'
|
import { TerminalDecorator } from './api/decorator'
|
||||||
import { TerminalContextMenuItemProvider } from './api/contextMenuProvider'
|
import { TerminalContextMenuItemProvider } from './api/contextMenuProvider'
|
||||||
@ -76,6 +77,7 @@ import { DefaultColorSchemes } from './colorSchemes'
|
|||||||
StreamProcessingSettingsComponent,
|
StreamProcessingSettingsComponent,
|
||||||
LoginScriptsSettingsComponent,
|
LoginScriptsSettingsComponent,
|
||||||
TerminalToolbarComponent,
|
TerminalToolbarComponent,
|
||||||
|
InputProcessingSettingsComponent,
|
||||||
],
|
],
|
||||||
exports: [
|
exports: [
|
||||||
ColorPickerComponent,
|
ColorPickerComponent,
|
||||||
@ -84,6 +86,7 @@ import { DefaultColorSchemes } from './colorSchemes'
|
|||||||
StreamProcessingSettingsComponent,
|
StreamProcessingSettingsComponent,
|
||||||
LoginScriptsSettingsComponent,
|
LoginScriptsSettingsComponent,
|
||||||
TerminalToolbarComponent,
|
TerminalToolbarComponent,
|
||||||
|
InputProcessingSettingsComponent,
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
export default class TerminalModule { } // eslint-disable-line @typescript-eslint/no-extraneous-class
|
export default class TerminalModule { } // eslint-disable-line @typescript-eslint/no-extraneous-class
|
||||||
@ -97,6 +100,7 @@ export * from './middleware/streamProcessing'
|
|||||||
export * from './middleware/loginScriptProcessing'
|
export * from './middleware/loginScriptProcessing'
|
||||||
export * from './middleware/oscProcessing'
|
export * from './middleware/oscProcessing'
|
||||||
export * from './middleware/utf8Splitter'
|
export * from './middleware/utf8Splitter'
|
||||||
|
export * from './middleware/inputProcessing'
|
||||||
export * from './api/middleware'
|
export * from './api/middleware'
|
||||||
export * from './session'
|
export * from './session'
|
||||||
export { LoginScriptsSettingsComponent, StreamProcessingSettingsComponent }
|
export { LoginScriptsSettingsComponent, StreamProcessingSettingsComponent }
|
||||||
|
28
tabby-terminal/src/middleware/inputProcessing.ts
Normal file
28
tabby-terminal/src/middleware/inputProcessing.ts
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import { SessionMiddleware } from '../api/middleware'
|
||||||
|
|
||||||
|
export interface InputProcessingOptions {
|
||||||
|
backspace: 'ctrl-h'|'ctrl-?'|'delete'|'backspace'
|
||||||
|
}
|
||||||
|
|
||||||
|
export class InputProcessor extends SessionMiddleware {
|
||||||
|
constructor (
|
||||||
|
private options: InputProcessingOptions,
|
||||||
|
) {
|
||||||
|
super()
|
||||||
|
}
|
||||||
|
|
||||||
|
feedFromTerminal (data: Buffer): void {
|
||||||
|
if (data.length === 1 && data[0] === 0x7f) {
|
||||||
|
if (this.options.backspace === 'ctrl-h') {
|
||||||
|
data = Buffer.from('\x08')
|
||||||
|
} else if (this.options.backspace === 'ctrl-?') {
|
||||||
|
data = Buffer.from('\x7f')
|
||||||
|
} else if (this.options.backspace === 'delete') {
|
||||||
|
data = Buffer.from('\x1b[3~')
|
||||||
|
} else {
|
||||||
|
data = Buffer.from('\x7f')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.outputToSession.next(data)
|
||||||
|
}
|
||||||
|
}
|
@ -73,11 +73,6 @@ export class LoginScriptProcessor extends SessionMiddleware {
|
|||||||
super.feedFromSession(data)
|
super.feedFromSession(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
close (): void {
|
|
||||||
this.outputToSession.complete()
|
|
||||||
super.close()
|
|
||||||
}
|
|
||||||
|
|
||||||
executeUnconditionalScripts (): void {
|
executeUnconditionalScripts (): void {
|
||||||
for (const script of this.remainingScripts) {
|
for (const script of this.remainingScripts) {
|
||||||
if (!script.expect) {
|
if (!script.expect) {
|
||||||
|
Loading…
Reference in New Issue
Block a user