Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
后端镜像
Tabby
提交
1c62f307
T
Tabby
项目概览
后端镜像
/
Tabby
通知
41
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Tabby
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1c62f307
编写于
7月 31, 2017
作者:
E
Eugene Pankov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
selectable persistence providers
上级
514fdbfb
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
70 addition
and
46 deletion
+70
-46
terminus-terminal/src/api.ts
terminus-terminal/src/api.ts
+4
-0
terminus-terminal/src/components/terminalSettingsTab.component.pug
...terminal/src/components/terminalSettingsTab.component.pug
+12
-0
terminus-terminal/src/components/terminalSettingsTab.component.ts
...-terminal/src/components/terminalSettingsTab.component.ts
+6
-2
terminus-terminal/src/config.ts
terminus-terminal/src/config.ts
+3
-0
terminus-terminal/src/index.ts
terminus-terminal/src/index.ts
+6
-25
terminus-terminal/src/persistence/screen.ts
terminus-terminal/src/persistence/screen.ts
+14
-3
terminus-terminal/src/persistence/tmux.ts
terminus-terminal/src/persistence/tmux.ts
+6
-5
terminus-terminal/src/services/sessions.service.ts
terminus-terminal/src/services/sessions.service.ts
+19
-11
未找到文件。
terminus-terminal/src/api.ts
浏览文件 @
1c62f307
...
...
@@ -28,6 +28,10 @@ export interface SessionOptions {
}
export
abstract
class
SessionPersistenceProvider
{
abstract
id
:
string
abstract
displayName
:
string
abstract
isAvailable
():
boolean
abstract
async
attachSession
(
recoveryId
:
any
):
Promise
<
SessionOptions
>
abstract
async
startSession
(
options
:
SessionOptions
):
Promise
<
any
>
abstract
async
terminateSession
(
recoveryId
:
string
):
Promise
<
void
>
...
...
terminus-terminal/src/components/terminalSettingsTab.component.pug
浏览文件 @
1c62f307
...
...
@@ -259,3 +259,15 @@
[value]='"audible"'
)
| Audible
.form-group
label Session persistence
select.form-control(
'[(ngModel)]'='config.store.terminal.persistence',
(ngModelChange)='config.save()',
)
option([ngValue]='null') Off
option(
*ngFor='let provider of persistenceProviders',
[ngValue]='provider.id'
) {{provider.displayName}}
terminus-terminal/src/components/terminalSettingsTab.component.ts
浏览文件 @
1c62f307
...
...
@@ -5,7 +5,7 @@ const fontManager = require('font-manager')
import
{
Component
,
Inject
}
from
'
@angular/core
'
import
{
ConfigService
,
HostAppService
,
Platform
}
from
'
terminus-core
'
import
{
TerminalColorSchemeProvider
,
ITerminalColorScheme
,
IShell
,
ShellProvider
}
from
'
../api
'
import
{
TerminalColorSchemeProvider
,
ITerminalColorScheme
,
IShell
,
ShellProvider
,
SessionPersistenceProvider
}
from
'
../api
'
@
Component
({
template
:
require
(
'
./terminalSettingsTab.component.pug
'
),
...
...
@@ -14,6 +14,7 @@ import { TerminalColorSchemeProvider, ITerminalColorScheme, IShell, ShellProvide
export
class
TerminalSettingsTabComponent
{
fonts
:
string
[]
=
[]
shells
:
IShell
[]
=
[]
persistenceProviders
:
SessionPersistenceProvider
[]
colorSchemes
:
ITerminalColorScheme
[]
=
[]
equalComparator
=
equal
editingColorScheme
:
ITerminalColorScheme
...
...
@@ -24,7 +25,10 @@ export class TerminalSettingsTabComponent {
private
hostApp
:
HostAppService
,
@
Inject
(
ShellProvider
)
private
shellProviders
:
ShellProvider
[],
@
Inject
(
TerminalColorSchemeProvider
)
private
colorSchemeProviders
:
TerminalColorSchemeProvider
[],
)
{
}
@
Inject
(
SessionPersistenceProvider
)
persistenceProviders
:
SessionPersistenceProvider
[],
)
{
this
.
persistenceProviders
=
persistenceProviders
.
filter
(
x
=>
x
.
isAvailable
())
}
async
ngOnInit
()
{
if
(
this
.
hostApp
.
platform
===
Platform
.
Windows
||
this
.
hostApp
.
platform
===
Platform
.
macOS
)
{
...
...
terminus-terminal/src/config.ts
浏览文件 @
1c62f307
...
...
@@ -43,6 +43,7 @@ export class TerminalConfigProvider extends ConfigProvider {
terminal
:
{
font
:
'
Menlo
'
,
shell
:
'
~default-shell~
'
,
persistence
:
'
screen
'
,
},
hotkeys
:
{
'
copy
'
:
[
...
...
@@ -74,6 +75,7 @@ export class TerminalConfigProvider extends ConfigProvider {
terminal
:
{
font
:
'
Consolas
'
,
shell
:
'
~clink~
'
,
persistence
:
null
,
},
hotkeys
:
{
'
copy
'
:
[
...
...
@@ -104,6 +106,7 @@ export class TerminalConfigProvider extends ConfigProvider {
terminal
:
{
font
:
'
Liberation Mono
'
,
shell
:
'
~default-shell~
'
,
persistence
:
'
screen
'
,
},
hotkeys
:
{
'
copy
'
:
[
...
...
terminus-terminal/src/index.ts
浏览文件 @
1c62f307
...
...
@@ -3,7 +3,7 @@ import { BrowserModule } from '@angular/platform-browser'
import
{
FormsModule
}
from
'
@angular/forms
'
import
{
NgbModule
}
from
'
@ng-bootstrap/ng-bootstrap
'
import
{
HostAppService
,
Platform
,
ToolbarButtonProvider
,
TabRecoveryProvider
,
ConfigProvider
,
HotkeysService
,
HotkeyProvider
}
from
'
terminus-core
'
import
{
ToolbarButtonProvider
,
TabRecoveryProvider
,
ConfigProvider
,
HotkeysService
,
HotkeyProvider
}
from
'
terminus-core
'
import
{
SettingsTabProvider
}
from
'
terminus-settings
'
import
{
TerminalTabComponent
}
from
'
./components/terminalTab.component
'
...
...
@@ -12,8 +12,8 @@ import { ColorPickerComponent } from './components/colorPicker.component'
import
{
SessionsService
}
from
'
./services/sessions.service
'
import
{
ScreenPersistenceProvider
}
from
'
./persistence
Providers
'
import
{
TMuxPersistenceProvider
}
from
'
./tmux
'
import
{
ScreenPersistenceProvider
}
from
'
./persistence
/screen
'
import
{
TMuxPersistenceProvider
}
from
'
./
persistence/
tmux
'
import
{
ButtonProvider
}
from
'
./buttonProvider
'
import
{
RecoveryProvider
}
from
'
./recoveryProvider
'
import
{
SessionPersistenceProvider
,
TerminalColorSchemeProvider
,
TerminalDecorator
,
ShellProvider
}
from
'
./api
'
...
...
@@ -42,36 +42,17 @@ import { hterm } from './hterm'
],
providers
:
[
SessionsService
,
ScreenPersistenceProvider
,
TMuxPersistenceProvider
,
{
provide
:
ToolbarButtonProvider
,
useClass
:
ButtonProvider
,
multi
:
true
},
{
provide
:
TabRecoveryProvider
,
useClass
:
RecoveryProvider
,
multi
:
true
},
{
provide
:
SessionPersistenceProvider
,
useFactory
:
(
hostApp
:
HostAppService
,
screen
:
ScreenPersistenceProvider
,
tmux
:
TMuxPersistenceProvider
,
)
=>
{
if
(
hostApp
.
platform
===
Platform
.
Windows
)
{
return
null
}
else
{
if
(
tmux
.
isAvailable
())
{
tmux
.
init
()
return
tmux
}
else
{
return
screen
}
}
},
deps
:
[
HostAppService
,
ScreenPersistenceProvider
,
TMuxPersistenceProvider
],
},
{
provide
:
SettingsTabProvider
,
useClass
:
TerminalSettingsTabProvider
,
multi
:
true
},
{
provide
:
ConfigProvider
,
useClass
:
TerminalConfigProvider
,
multi
:
true
},
{
provide
:
HotkeyProvider
,
useClass
:
TerminalHotkeyProvider
,
multi
:
true
},
{
provide
:
TerminalColorSchemeProvider
,
useClass
:
HyperColorSchemes
,
multi
:
true
},
{
provide
:
TerminalDecorator
,
useClass
:
PathDropDecorator
,
multi
:
true
},
{
provide
:
SessionPersistenceProvider
,
useClass
:
ScreenPersistenceProvider
,
multi
:
true
},
{
provide
:
SessionPersistenceProvider
,
useClass
:
TMuxPersistenceProvider
,
multi
:
true
},
{
provide
:
ShellProvider
,
useClass
:
WindowsStockShellsProvider
,
multi
:
true
},
{
provide
:
ShellProvider
,
useClass
:
MacOSDefaultShellProvider
,
multi
:
true
},
{
provide
:
ShellProvider
,
useClass
:
LinuxDefaultShellProvider
,
multi
:
true
},
...
...
terminus-terminal/src/persistence
Providers
.ts
→
terminus-terminal/src/persistence
/screen
.ts
浏览文件 @
1c62f307
import
*
as
fs
from
'
mz/fs
'
import
{
exec
,
spawn
}
from
'
mz/child_process
'
import
{
exec
as
exec
Callback
}
from
'
child_process
'
import
{
exec
as
exec
Async
,
execFileSync
}
from
'
child_process
'
import
{
AsyncSubject
}
from
'
rxjs
'
import
{
Injectable
}
from
'
@angular/core
'
import
{
Logger
,
LogService
}
from
'
terminus-core
'
import
{
SessionOptions
,
SessionPersistenceProvider
}
from
'
./api
'
import
{
SessionOptions
,
SessionPersistenceProvider
}
from
'
.
.
/api
'
declare
function
delay
(
ms
:
number
):
Promise
<
void
>
...
...
@@ -29,6 +29,8 @@ async function listProcesses (): Promise<IChildProcess[]> {
@
Injectable
()
export
class
ScreenPersistenceProvider
extends
SessionPersistenceProvider
{
id
=
'
screen
'
displayName
=
'
GNU Screen
'
private
logger
:
Logger
constructor
(
...
...
@@ -38,9 +40,18 @@ export class ScreenPersistenceProvider extends SessionPersistenceProvider {
this
.
logger
=
log
.
create
(
'
main
'
)
}
isAvailable
()
{
try
{
execFileSync
(
'
sh
'
,
[
'
-c
'
,
'
which screen
'
])
return
true
}
catch
(
_
)
{
return
false
}
}
async
attachSession
(
recoveryId
:
any
):
Promise
<
SessionOptions
>
{
let
lines
=
await
new
Promise
<
string
[]
>
(
resolve
=>
{
exec
Callback
(
'
screen -list
'
,
(
_err
,
stdout
)
=>
{
exec
Async
(
'
screen -list
'
,
(
_err
,
stdout
)
=>
{
// returns an error code on macOS
resolve
(
stdout
.
split
(
'
\n
'
))
})
...
...
terminus-terminal/src/tmux.ts
→
terminus-terminal/src/
persistence/
tmux.ts
浏览文件 @
1c62f307
...
...
@@ -3,7 +3,7 @@ import { execFileSync } from 'child_process'
import
*
as
AsyncLock
from
'
async-lock
'
import
{
ConnectableObservable
,
AsyncSubject
,
Subject
}
from
'
rxjs
'
import
*
as
childProcess
from
'
child_process
'
import
{
SessionOptions
,
SessionPersistenceProvider
}
from
'
./api
'
import
{
SessionOptions
,
SessionPersistenceProvider
}
from
'
.
.
/api
'
const
TMUX_CONFIG
=
`
set -g status off
...
...
@@ -174,10 +174,15 @@ export class TMux {
@
Injectable
()
export
class
TMuxPersistenceProvider
extends
SessionPersistenceProvider
{
id
=
'
tmux
'
displayName
=
'
Tmux
'
private
tmux
:
TMux
constructor
()
{
super
()
if
(
this
.
isAvailable
())
{
this
.
tmux
=
new
TMux
()
}
}
isAvailable
():
boolean
{
...
...
@@ -189,10 +194,6 @@ export class TMuxPersistenceProvider extends SessionPersistenceProvider {
}
}
init
()
{
this
.
tmux
=
new
TMux
()
}
async
attachSession
(
recoveryId
:
any
):
Promise
<
SessionOptions
>
{
let
sessions
=
await
this
.
tmux
.
list
()
if
(
!
sessions
.
includes
(
recoveryId
))
{
...
...
terminus-terminal/src/services/sessions.service.ts
浏览文件 @
1c62f307
...
...
@@ -3,8 +3,8 @@ const psNode = require('ps-node')
let
nodePTY
import
*
as
fs
from
'
mz/fs
'
import
{
Subject
}
from
'
rxjs
'
import
{
Injectable
}
from
'
@angular/core
'
import
{
Logger
,
LogService
,
ElectronService
}
from
'
terminus-core
'
import
{
Injectable
,
Inject
}
from
'
@angular/core
'
import
{
Logger
,
LogService
,
ElectronService
,
ConfigService
}
from
'
terminus-core
'
import
{
exec
}
from
'
mz/child_process
'
import
{
SessionOptions
,
SessionPersistenceProvider
}
from
'
../api
'
...
...
@@ -178,7 +178,8 @@ export class SessionsService {
private
lastID
=
0
constructor
(
private
persistence
:
SessionPersistenceProvider
,
@
Inject
(
SessionPersistenceProvider
)
private
persistenceProviders
:
SessionPersistenceProvider
[],
private
config
:
ConfigService
,
electron
:
ElectronService
,
log
:
LogService
,
)
{
...
...
@@ -187,9 +188,10 @@ export class SessionsService {
}
async
prepareNewSession
(
options
:
SessionOptions
):
Promise
<
SessionOptions
>
{
if
(
this
.
persistence
)
{
let
recoveryId
=
await
this
.
persistence
.
startSession
(
options
)
options
=
await
this
.
persistence
.
attachSession
(
recoveryId
)
let
persistence
=
this
.
getPersistence
()
if
(
persistence
)
{
let
recoveryId
=
await
persistence
.
startSession
(
options
)
options
=
await
persistence
.
attachSession
(
recoveryId
)
}
return
options
}
...
...
@@ -198,10 +200,11 @@ export class SessionsService {
this
.
lastID
++
options
.
name
=
`session-
${
this
.
lastID
}
`
let
session
=
new
Session
(
options
)
let
persistence
=
this
.
getPersistence
()
session
.
destroyed$
.
first
().
subscribe
(()
=>
{
delete
this
.
sessions
[
session
.
name
]
if
(
this
.
persistence
)
{
this
.
persistence
.
terminateSession
(
session
.
recoveryId
)
if
(
persistence
)
{
persistence
.
terminateSession
(
session
.
recoveryId
)
}
})
this
.
sessions
[
session
.
name
]
=
session
...
...
@@ -209,9 +212,14 @@ export class SessionsService {
}
async
recover
(
recoveryId
:
string
):
Promise
<
SessionOptions
>
{
if
(
!
this
.
persistence
)
{
return
null
let
persistence
=
this
.
getPersistence
()
if
(
persistence
)
{
return
await
persistence
.
attachSession
(
recoveryId
)
}
return
await
this
.
persistence
.
attachSession
(
recoveryId
)
return
null
}
private
getPersistence
():
SessionPersistenceProvider
{
return
this
.
persistenceProviders
.
find
(
x
=>
x
.
id
===
this
.
config
.
store
.
terminal
.
persistence
)
||
null
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录