Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
4e4ac630
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
4e4ac630
编写于
1月 15, 2017
作者:
D
Daniel Imms
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Use a factory to create terminal processes
上级
44688558
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
93 addition
and
66 deletion
+93
-66
src/vs/workbench/parts/terminal/common/terminal.ts
src/vs/workbench/parts/terminal/common/terminal.ts
+0
-3
src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts
.../parts/terminal/electron-browser/terminal.contribution.ts
+2
-2
src/vs/workbench/parts/terminal/electron-browser/terminal.ts
src/vs/workbench/parts/terminal/electron-browser/terminal.ts
+10
-5
src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts
...bench/parts/terminal/electron-browser/terminalInstance.ts
+16
-1
src/vs/workbench/parts/terminal/test/electron-browser/terminalService.test.ts
...ts/terminal/test/electron-browser/terminalService.test.ts
+65
-55
未找到文件。
src/vs/workbench/parts/terminal/common/terminal.ts
浏览文件 @
4e4ac630
...
...
@@ -14,9 +14,6 @@ export const TERMINAL_PANEL_ID = 'workbench.panel.terminal';
export
const
TERMINAL_SERVICE_ID
=
'
terminalService
'
;
export
const
TERMINAL_DEFAULT_SHELL_LINUX
=
!
platform
.
isWindows
?
(
process
.
env
.
SHELL
||
'
sh
'
)
:
'
sh
'
;
export
const
TERMINAL_DEFAULT_SHELL_OSX
=
!
platform
.
isWindows
?
(
process
.
env
.
SHELL
||
'
sh
'
)
:
'
sh
'
;
export
const
TERMINAL_DEFAULT_RIGHT_CLICK_COPY_PASTE
=
platform
.
isWindows
;
/** A context key that is set when the integrated terminal has focus. */
...
...
src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts
浏览文件 @
4e4ac630
...
...
@@ -11,8 +11,8 @@ import * as platform from 'vs/base/common/platform';
import
nls
=
require
(
'
vs/nls
'
);
import
{
Extensions
,
IConfigurationRegistry
}
from
'
vs/platform/configuration/common/configurationRegistry
'
;
import
{
GlobalQuickOpenAction
}
from
'
vs/workbench/browser/parts/quickopen/quickopen.contribution
'
;
import
{
ITerminalService
,
KEYBINDING_CONTEXT_TERMINAL_FOCUS
,
KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED
,
TERMINAL_PANEL_ID
,
TERMINAL_DEFAULT_
SHELL_LINUX
,
TERMINAL_DEFAULT_SHELL_OSX
,
TERMINAL_DEFAULT_
RIGHT_CLICK_COPY_PASTE
}
from
'
vs/workbench/parts/terminal/common/terminal
'
;
import
{
TERMINAL_DEFAULT_SHELL_WINDOWS
}
from
'
vs/workbench/parts/terminal/electron-browser/terminal
'
;
import
{
ITerminalService
,
KEYBINDING_CONTEXT_TERMINAL_FOCUS
,
KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED
,
TERMINAL_PANEL_ID
,
TERMINAL_DEFAULT_RIGHT_CLICK_COPY_PASTE
}
from
'
vs/workbench/parts/terminal/common/terminal
'
;
import
{
TERMINAL_DEFAULT_SHELL_
LINUX
,
TERMINAL_DEFAULT_SHELL_OSX
,
TERMINAL_DEFAULT_SHELL_
WINDOWS
}
from
'
vs/workbench/parts/terminal/electron-browser/terminal
'
;
import
{
IWorkbenchActionRegistry
,
Extensions
as
ActionExtensions
}
from
'
vs/workbench/common/actionRegistry
'
;
import
{
KeyCode
,
KeyMod
}
from
'
vs/base/common/keyCodes
'
;
import
{
ContextKeyExpr
}
from
'
vs/platform/contextkey/common/contextkey
'
;
...
...
src/vs/workbench/parts/terminal/electron-browser/terminal.ts
浏览文件 @
4e4ac630
...
...
@@ -5,14 +5,19 @@
'
use strict
'
;
import
*
as
os
from
'
os
'
;
import
*
as
cp
from
'
child_process
'
;
import
platform
=
require
(
'
vs/base/common/platform
'
);
import
processes
=
require
(
'
vs/base/node/processes
'
);
const
powerShellExePath
=
!
process
.
env
.
hasOwnProperty
(
'
PROCESSOR_ARCHITEW6432
'
)
?
`
${
process
.
env
.
windir
}
\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`
:
`
${
process
.
env
.
windir
}
\\Sysnative\\WindowsPowerShell\\v1.0\\powershell.exe`
;
export
const
TERMINAL_DEFAULT_SHELL_LINUX
=
!
platform
.
isWindows
?
(
process
.
env
.
SHELL
||
'
sh
'
)
:
'
sh
'
;
export
const
TERMINAL_DEFAULT_SHELL_OSX
=
!
platform
.
isWindows
?
(
process
.
env
.
SHELL
||
'
sh
'
)
:
'
sh
'
;
const
isAtLeastWindows10
=
platform
.
isWindows
&&
parseFloat
(
os
.
release
())
>=
10
;
const
is64BitWindows
=
process
.
env
.
hasOwnProperty
(
'
PROCESSOR_ARCHITEW6432
'
);
const
powerShellPath
=
`
${
process
.
env
.
windir
}
\
\$
{is64BitWindows ? 'Sysnative' : 'System32'}\\WindowsPowerShell\\v1.0\\powershell.exe`
;
export
const
TERMINAL_DEFAULT_SHELL_WINDOWS
=
isAtLeastWindows10
?
powerShellExePath
:
processes
.
getWindowsShell
();
export
const
TERMINAL_DEFAULT_SHELL_WINDOWS
=
isAtLeastWindows10
?
powerShellPath
:
processes
.
getWindowsShell
();
export
interface
ITerminalProcessFactory
{
create
(
env
:
{
[
key
:
string
]:
string
}):
cp
.
ChildProcess
;
}
src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts
浏览文件 @
4e4ac630
...
...
@@ -20,6 +20,7 @@ import { IMessageService, Severity } from 'vs/platform/message/common/message';
import
{
IPanelService
}
from
'
vs/workbench/services/panel/common/panelService
'
;
import
{
IStringDictionary
}
from
'
vs/base/common/collections
'
;
import
{
ITerminalInstance
,
KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED
,
TERMINAL_PANEL_ID
,
IShellLaunchConfig
}
from
'
vs/workbench/parts/terminal/common/terminal
'
;
import
{
ITerminalProcessFactory
}
from
'
vs/workbench/parts/terminal/electron-browser/terminal
'
;
import
{
IWorkspace
,
IWorkspaceContextService
}
from
'
vs/platform/workspace/common/workspace
'
;
import
{
StandardKeyboardEvent
}
from
'
vs/base/browser/keyboardEvent
'
;
import
{
TabFocus
}
from
'
vs/editor/common/config/commonEditorConfig
'
;
...
...
@@ -28,9 +29,19 @@ import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-brows
/** The amount of time to consider terminal errors to be related to the launch */
const
LAUNCHING_DURATION
=
500
;
class
StandardTerminalProcessFactory
implements
ITerminalProcessFactory
{
public
create
(
env
:
{
[
key
:
string
]:
string
}):
cp
.
ChildProcess
{
return
cp
.
fork
(
'
./terminalProcess
'
,
[],
{
env
,
cwd
:
URI
.
parse
(
path
.
dirname
(
require
.
toUrl
(
'
./terminalProcess
'
))).
fsPath
});
}
}
export
class
TerminalInstance
implements
ITerminalInstance
{
private
static
readonly
EOL_REGEX
=
/
\r?\n
/g
;
private
static
_terminalProcessFactory
:
ITerminalProcessFactory
=
new
StandardTerminalProcessFactory
();
private
static
_idCounter
=
1
;
private
_id
:
number
;
...
...
@@ -338,7 +349,7 @@ export class TerminalInstance implements ITerminalInstance {
return
TerminalInstance
.
_sanitizeCwd
(
cwd
);
}
protected
_createProcess
(
workspace
:
IWorkspace
,
shell
:
IShellLaunchConfig
)
{
protected
_createProcess
(
workspace
:
IWorkspace
,
shell
:
IShellLaunchConfig
)
:
void
{
const
locale
=
this
.
_configHelper
.
isSetLocaleVariables
()
?
platform
.
locale
:
undefined
;
if
(
!
shell
.
executable
)
{
this
.
_configHelper
.
mergeDefaultShellPathAndArgs
(
shell
);
...
...
@@ -528,4 +539,8 @@ export class TerminalInstance implements ITerminalInstance {
});
}
}
public
static
setTerminalProcessFactory
(
factory
:
ITerminalProcessFactory
):
void
{
this
.
_terminalProcessFactory
=
factory
;
}
}
src/vs/workbench/parts/terminal/test/electron-browser/terminalService.test.ts
浏览文件 @
4e4ac630
...
...
@@ -5,17 +5,27 @@
'
use strict
'
;
import
*
as
assert
from
'
assert
'
;
import
*
as
cp
from
'
child_process
'
;
import
{
IContextKeyService
}
from
'
vs/platform/contextkey/common/contextkey
'
;
import
{
IInstantiationService
}
from
'
vs/platform/instantiation/common/instantiation
'
;
import
{
IConfigurationService
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
IWorkspaceContextService
}
from
'
vs/platform/workspace/common/workspace
'
;
import
{
TerminalInstance
}
from
'
vs/workbench/parts/terminal/electron-browser/terminalInstance
'
;
import
{
TerminalService
}
from
'
vs/workbench/parts/terminal/electron-browser/terminalService
'
;
import
{
TERMINAL_DEFAULT_SHELL_LINUX
,
TERMINAL_DEFAULT_SHELL_OSX
}
from
'
vs/workbench/parts/terminal/common/terminal
'
;
import
{
TERMINAL_DEFAULT_SHELL_WINDOWS
}
from
'
vs/workbench/parts/terminal/electron-browser/terminal
'
;
import
{
ITerminalProcessFactory
,
TERMINAL_DEFAULT_SHELL_LINUX
,
TERMINAL_DEFAULT_SHELL_OSX
,
TERMINAL_DEFAULT_SHELL_WINDOWS
}
from
'
vs/workbench/parts/terminal/electron-browser/terminal
'
;
import
{
TestInstantiationService
}
from
'
vs/platform/instantiation/test/common/instantiationServiceMock
'
;
import
{
TestConfigurationService
}
from
'
vs/platform/configuration/test/common/testConfigurationService
'
;
import
{
TPromise
}
from
'
vs/base/common/winjs.base
'
;
class
TestTerminalProcessFactory
implements
ITerminalProcessFactory
{
public
create
(
env
:
{
[
key
:
string
]:
string
}):
cp
.
ChildProcess
{
return
<
any
>
{};
}
}
TerminalInstance
.
setTerminalProcessFactory
(
new
TestTerminalProcessFactory
());
class
TestTerminalService
extends
TerminalService
{
public
showPanel
(
focus
?:
boolean
):
TPromise
<
void
>
{
return
TPromise
.
as
(
void
0
);
...
...
@@ -50,57 +60,57 @@ suite('Workbench - TerminalService', () => {
});
// TODO@Tyriar: Re-enable these tests after testing them on Windows
//
suite('createInstance', () => {
//
test('should return the new instance', () => {
//
assert.ok(service.createInstance() instanceof TerminalInstance);
//
});
//
test('should register the new instance on the service', () => {
//
const instance = service.createInstance();
//
assert.deepEqual(service.terminalInstances, [instance]);
//
});
//
test('should deregister an instance from the service when it\'s disposed', () => {
//
const instance = service.createInstance();
//
assert.equal(service.terminalInstances.length, 1);
//
instance.dispose();
//
assert.equal(service.terminalInstances.length, 0);
//
});
//
test('should only automatically set the first instance as the active instance', () => {
//
const first = service.createInstance();
//
assert.equal(service.getActiveInstance(), first);
//
service.createInstance();
//
assert.equal(service.getActiveInstance(), first);
//
});
//
});
//
suite('onInstancesChanged event', () => {
//
test('should fire when an instance is created', () => {
//
let count = 0;
//
service.onInstancesChanged(() => { count++; });
//
service.createInstance();
//
assert.equal(count, 1);
//
service.createInstance();
//
assert.equal(count, 2);
//
});
//
test('should fire when an instance is disposed', () => {
//
let count = 0;
//
service.onInstancesChanged(() => { count++; });
//
service.createInstance().dispose();
//
assert.equal(count, 2);
//
});
//
});
//
suite('onInstanceDisposed event', () => {
//
test('should fire when an instance is disposed', () => {
//
let count = 0;
//
service.onInstanceDisposed(() => { count++; });
//
service.createInstance().dispose();
//
assert.equal(count, 1);
//
});
//
});
suite
(
'
createInstance
'
,
()
=>
{
test
(
'
should return the new instance
'
,
()
=>
{
assert
.
ok
(
service
.
createInstance
()
instanceof
TerminalInstance
);
});
test
(
'
should register the new instance on the service
'
,
()
=>
{
const
instance
=
service
.
createInstance
();
assert
.
deepEqual
(
service
.
terminalInstances
,
[
instance
]);
});
test
(
'
should deregister an instance from the service when it
\'
s disposed
'
,
()
=>
{
const
instance
=
service
.
createInstance
();
assert
.
equal
(
service
.
terminalInstances
.
length
,
1
);
instance
.
dispose
();
assert
.
equal
(
service
.
terminalInstances
.
length
,
0
);
});
test
(
'
should only automatically set the first instance as the active instance
'
,
()
=>
{
const
first
=
service
.
createInstance
();
assert
.
equal
(
service
.
getActiveInstance
(),
first
);
service
.
createInstance
();
assert
.
equal
(
service
.
getActiveInstance
(),
first
);
});
});
suite
(
'
onInstancesChanged event
'
,
()
=>
{
test
(
'
should fire when an instance is created
'
,
()
=>
{
let
count
=
0
;
service
.
onInstancesChanged
(()
=>
{
count
++
;
});
service
.
createInstance
();
assert
.
equal
(
count
,
1
);
service
.
createInstance
();
assert
.
equal
(
count
,
2
);
});
test
(
'
should fire when an instance is disposed
'
,
()
=>
{
let
count
=
0
;
service
.
onInstancesChanged
(()
=>
{
count
++
;
});
service
.
createInstance
().
dispose
();
assert
.
equal
(
count
,
2
);
});
});
suite
(
'
onInstanceDisposed event
'
,
()
=>
{
test
(
'
should fire when an instance is disposed
'
,
()
=>
{
let
count
=
0
;
service
.
onInstanceDisposed
(()
=>
{
count
++
;
});
service
.
createInstance
().
dispose
();
assert
.
equal
(
count
,
1
);
});
});
});
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录