Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
旅途_2012
vscode
提交
13940e60
V
vscode
项目概览
旅途_2012
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
13940e60
编写于
7月 04, 2019
作者:
A
Andre Weinand
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
more ExternalTerminalService cleanup
上级
a57a43de
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
64 addition
and
92 deletion
+64
-92
src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts
.../contrib/externalTerminal/node/externalTerminalService.ts
+61
-89
src/vs/workbench/contrib/externalTerminal/test/electron-browser/externalTerminalService.test.ts
...nal/test/electron-browser/externalTerminalService.test.ts
+3
-3
未找到文件。
src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts
浏览文件 @
13940e60
...
...
@@ -17,42 +17,32 @@ import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platf
import
{
registerSingleton
}
from
'
vs/platform/instantiation/common/extensions
'
;
import
{
Registry
}
from
'
vs/platform/registry/common/platform
'
;
import
{
ITerminalSettings
}
from
'
vs/workbench/contrib/debug/common/debug
'
;
import
{
optional
}
from
'
vs/platform/instantiation/common/instantiation
'
;
const
TERMINAL_TITLE
=
nls
.
localize
(
'
console.title
'
,
"
VS Code Console
"
);
export
const
DEFAULT_TERMINAL_OSX
=
'
Terminal.app
'
;
enum
WinSpawnType
{
CMD
,
CMDER
}
export
class
WindowsExternalTerminalService
implements
IExternalTerminalService
{
public
_serviceBrand
:
any
;
private
static
readonly
CMD
=
'
cmd.exe
'
;
constructor
(
@
IConfigurationService
private
readonly
_configurationService
:
IConfigurationService
@
optional
(
IConfigurationService
)
private
readonly
_configurationService
:
IConfigurationService
)
{
}
public
openTerminal
(
cwd
?:
string
):
void
{
const
configuration
=
this
.
_configurationService
.
getValue
<
IExternalTerminalConfiguration
>
();
this
.
spawnTerminal
(
cp
,
configuration
,
processes
.
getWindowsShell
(),
cwd
);
}
/*
public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise<number | undefined> {
const configuration = this._configurationService.getValue<IExternalTerminalConfiguration>();
return this.runInTerminal0(title, dir, args, envVars, configuration.terminal);
if
(
this
.
_configurationService
)
{
const
configuration
=
this
.
_configurationService
.
getValue
<
IExternalTerminalConfiguration
>
();
this
.
spawnTerminal
(
cp
,
configuration
,
processes
.
getWindowsShell
(),
cwd
);
}
}
*/
public
runInTerminal
(
title
:
string
,
dir
:
string
,
args
:
string
[],
envVars
:
env
.
IProcessEnvironment
,
configuration
:
ITerminalSettings
):
Promise
<
number
|
undefined
>
{
const
exec
=
configuration
.
external
.
windowsExec
||
getDefaultTerminalWindows
();
const
exec
=
configuration
.
external
.
windowsExec
||
WindowsExternalTerminalService
.
getDefaultTerminalWindows
();
return
new
Promise
<
number
|
undefined
>
((
resolve
,
reject
)
=>
{
...
...
@@ -86,8 +76,7 @@ export class WindowsExternalTerminalService implements IExternalTerminalService
private
spawnTerminal
(
spawner
:
typeof
cp
,
configuration
:
IExternalTerminalConfiguration
,
command
:
string
,
cwd
?:
string
):
Promise
<
void
>
{
const
terminalConfig
=
configuration
.
terminal
.
external
;
const
exec
=
terminalConfig
.
windowsExec
||
getDefaultTerminalWindows
();
const
spawnType
=
this
.
getSpawnType
(
exec
);
const
exec
=
terminalConfig
.
windowsExec
||
WindowsExternalTerminalService
.
getDefaultTerminalWindows
();
// Make the drive letter uppercase on Windows (see #9448)
if
(
cwd
&&
cwd
[
1
]
===
'
:
'
)
{
...
...
@@ -96,7 +85,8 @@ export class WindowsExternalTerminalService implements IExternalTerminalService
// cmder ignores the environment cwd and instead opts to always open in %USERPROFILE%
// unless otherwise specified
if
(
spawnType
===
WinSpawnType
.
CMDER
)
{
const
basename
=
path
.
basename
(
exec
).
toLowerCase
();
if
(
basename
===
'
cmder
'
||
basename
===
'
cmder.exe
'
)
{
spawner
.
spawn
(
exec
,
cwd
?
[
cwd
]
:
undefined
);
return
Promise
.
resolve
(
undefined
);
}
...
...
@@ -117,12 +107,14 @@ export class WindowsExternalTerminalService implements IExternalTerminalService
});
}
private
getSpawnType
(
exec
:
string
):
WinSpawnType
{
const
basename
=
path
.
basename
(
exec
).
toLowerCase
();
if
(
basename
===
'
cmder
'
||
basename
===
'
cmder.exe
'
)
{
return
WinSpawnType
.
CMDER
;
private
static
_DEFAULT_TERMINAL_WINDOWS
:
string
;
public
static
getDefaultTerminalWindows
():
string
{
if
(
!
WindowsExternalTerminalService
.
_DEFAULT_TERMINAL_WINDOWS
)
{
const
isWoW64
=
!!
process
.
env
.
hasOwnProperty
(
'
PROCESSOR_ARCHITEW6432
'
);
WindowsExternalTerminalService
.
_DEFAULT_TERMINAL_WINDOWS
=
`
${
process
.
env
.
windir
?
process
.
env
.
windir
:
'
C:
\\
Windows
'
}
\
\$
{isWoW64 ? 'Sysnative' : 'System32'}\\cmd.exe`
;
}
return
Win
SpawnType
.
CMD
;
return
Win
dowsExternalTerminalService
.
_DEFAULT_TERMINAL_WINDOWS
;
}
}
...
...
@@ -132,21 +124,15 @@ export class MacExternalTerminalService implements IExternalTerminalService {
private
static
readonly
OSASCRIPT
=
'
/usr/bin/osascript
'
;
// osascript is the AppleScript interpreter on OS X
constructor
(
@
IConfigurationService
private
readonly
_configurationService
:
IConfigurationService
@
optional
(
IConfigurationService
)
private
readonly
_configurationService
:
IConfigurationService
)
{
}
public
openTerminal
(
cwd
?:
string
):
void
{
const
configuration
=
this
.
_configurationService
.
getValue
<
IExternalTerminalConfiguration
>
();
this
.
spawnTerminal
(
cp
,
configuration
,
cwd
);
}
/*
public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise<number | undefined> {
const configuration = this._configurationService.getValue<IExternalTerminalConfiguration>();
return this.runInTerminal0(title, dir, args, envVars, configuration.terminal);
if
(
this
.
_configurationService
)
{
const
configuration
=
this
.
_configurationService
.
getValue
<
IExternalTerminalConfiguration
>
();
this
.
spawnTerminal
(
cp
,
configuration
,
cwd
);
}
}
*/
public
runInTerminal
(
title
:
string
,
dir
:
string
,
args
:
string
[],
envVars
:
env
.
IProcessEnvironment
,
configuration
:
ITerminalSettings
):
Promise
<
number
|
undefined
>
{
...
...
@@ -234,26 +220,20 @@ export class LinuxExternalTerminalService implements IExternalTerminalService {
private
static
readonly
WAIT_MESSAGE
=
nls
.
localize
(
'
press.any.key
'
,
"
Press any key to continue...
"
);
constructor
(
@
IConfigurationService
private
readonly
_configurationService
:
IConfigurationService
@
optional
(
IConfigurationService
)
private
readonly
_configurationService
:
IConfigurationService
)
{
}
public
openTerminal
(
cwd
?:
string
):
void
{
const
configuration
=
this
.
_configurationService
.
getValue
<
IExternalTerminalConfiguration
>
();
this
.
spawnTerminal
(
cp
,
configuration
,
cwd
);
}
/*
public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise<number | undefined> {
const configuration = this._configurationService.getValue<IExternalTerminalConfiguration>();
return this.runInTerminal0(title, dir, args, envVars, configuration.terminal);
if
(
this
.
_configurationService
)
{
const
configuration
=
this
.
_configurationService
.
getValue
<
IExternalTerminalConfiguration
>
();
this
.
spawnTerminal
(
cp
,
configuration
,
cwd
);
}
}
*/
public
runInTerminal
(
title
:
string
,
dir
:
string
,
args
:
string
[],
envVars
:
env
.
IProcessEnvironment
,
configuration
:
ITerminalSettings
):
Promise
<
number
|
undefined
>
{
const
terminalConfig
=
configuration
.
external
;
const
execPromise
=
terminalConfig
.
linuxExec
?
Promise
.
resolve
(
terminalConfig
.
linuxExec
)
:
getDefaultTerminalLinuxReady
();
const
execPromise
=
terminalConfig
.
linuxExec
?
Promise
.
resolve
(
terminalConfig
.
linuxExec
)
:
LinuxExternalTerminalService
.
getDefaultTerminalLinuxReady
();
return
new
Promise
<
number
|
undefined
>
((
resolve
,
reject
)
=>
{
...
...
@@ -309,7 +289,7 @@ export class LinuxExternalTerminalService implements IExternalTerminalService {
private
spawnTerminal
(
spawner
:
typeof
cp
,
configuration
:
IExternalTerminalConfiguration
,
cwd
?:
string
):
Promise
<
void
>
{
const
terminalConfig
=
configuration
.
terminal
.
external
;
const
execPromise
=
terminalConfig
.
linuxExec
?
Promise
.
resolve
(
terminalConfig
.
linuxExec
)
:
getDefaultTerminalLinuxReady
();
const
execPromise
=
terminalConfig
.
linuxExec
?
Promise
.
resolve
(
terminalConfig
.
linuxExec
)
:
LinuxExternalTerminalService
.
getDefaultTerminalLinuxReady
();
return
new
Promise
<
void
>
((
c
,
e
)
=>
{
execPromise
.
then
(
exec
=>
{
...
...
@@ -320,6 +300,36 @@ export class LinuxExternalTerminalService implements IExternalTerminalService {
});
});
}
private
static
_DEFAULT_TERMINAL_LINUX_READY
:
Promise
<
string
>
;
public
static
getDefaultTerminalLinuxReady
():
Promise
<
string
>
{
if
(
!
LinuxExternalTerminalService
.
_DEFAULT_TERMINAL_LINUX_READY
)
{
LinuxExternalTerminalService
.
_DEFAULT_TERMINAL_LINUX_READY
=
new
Promise
<
string
>
(
c
=>
{
if
(
env
.
isLinux
)
{
Promise
.
all
([
pfs
.
exists
(
'
/etc/debian_version
'
),
process
.
lazyEnv
||
Promise
.
resolve
(
undefined
)]).
then
(([
isDebian
])
=>
{
if
(
isDebian
)
{
c
(
'
x-terminal-emulator
'
);
}
else
if
(
process
.
env
.
DESKTOP_SESSION
===
'
gnome
'
||
process
.
env
.
DESKTOP_SESSION
===
'
gnome-classic
'
)
{
c
(
'
gnome-terminal
'
);
}
else
if
(
process
.
env
.
DESKTOP_SESSION
===
'
kde-plasma
'
)
{
c
(
'
konsole
'
);
}
else
if
(
process
.
env
.
COLORTERM
)
{
c
(
process
.
env
.
COLORTERM
);
}
else
if
(
process
.
env
.
TERM
)
{
c
(
process
.
env
.
TERM
);
}
else
{
c
(
'
xterm
'
);
}
});
return
;
}
c
(
'
xterm
'
);
});
}
return
LinuxExternalTerminalService
.
_DEFAULT_TERMINAL_LINUX_READY
;
}
}
/**
...
...
@@ -348,44 +358,6 @@ function quote(args: string[]): string {
return
r
;
}
let
_DEFAULT_TERMINAL_WINDOWS
:
string
|
null
=
null
;
export
function
getDefaultTerminalWindows
():
string
{
if
(
!
_DEFAULT_TERMINAL_WINDOWS
)
{
const
isWoW64
=
!!
process
.
env
.
hasOwnProperty
(
'
PROCESSOR_ARCHITEW6432
'
);
_DEFAULT_TERMINAL_WINDOWS
=
`
${
process
.
env
.
windir
?
process
.
env
.
windir
:
'
C:
\\
Windows
'
}
\
\$
{isWoW64 ? 'Sysnative' : 'System32'}\\cmd.exe`
;
}
return
_DEFAULT_TERMINAL_WINDOWS
;
}
let
_DEFAULT_TERMINAL_LINUX_READY
:
Promise
<
string
>
|
null
=
null
;
export
function
getDefaultTerminalLinuxReady
():
Promise
<
string
>
{
if
(
!
_DEFAULT_TERMINAL_LINUX_READY
)
{
_DEFAULT_TERMINAL_LINUX_READY
=
new
Promise
<
string
>
(
c
=>
{
if
(
env
.
isLinux
)
{
Promise
.
all
([
pfs
.
exists
(
'
/etc/debian_version
'
),
process
.
lazyEnv
||
Promise
.
resolve
(
undefined
)]).
then
(([
isDebian
])
=>
{
if
(
isDebian
)
{
c
(
'
x-terminal-emulator
'
);
}
else
if
(
process
.
env
.
DESKTOP_SESSION
===
'
gnome
'
||
process
.
env
.
DESKTOP_SESSION
===
'
gnome-classic
'
)
{
c
(
'
gnome-terminal
'
);
}
else
if
(
process
.
env
.
DESKTOP_SESSION
===
'
kde-plasma
'
)
{
c
(
'
konsole
'
);
}
else
if
(
process
.
env
.
COLORTERM
)
{
c
(
process
.
env
.
COLORTERM
);
}
else
if
(
process
.
env
.
TERM
)
{
c
(
process
.
env
.
TERM
);
}
else
{
c
(
'
xterm
'
);
}
});
return
;
}
c
(
'
xterm
'
);
});
}
return
_DEFAULT_TERMINAL_LINUX_READY
;
}
if
(
env
.
isWindows
)
{
registerSingleton
(
IExternalTerminalService
,
WindowsExternalTerminalService
,
true
);
}
else
if
(
env
.
isMacintosh
)
{
...
...
@@ -394,7 +366,7 @@ if (env.isWindows) {
registerSingleton
(
IExternalTerminalService
,
LinuxExternalTerminalService
,
true
);
}
getDefaultTerminalLinuxReady
().
then
(
defaultTerminalLinux
=>
{
LinuxExternalTerminalService
.
getDefaultTerminalLinuxReady
().
then
(
defaultTerminalLinux
=>
{
let
configurationRegistry
=
Registry
.
as
<
IConfigurationRegistry
>
(
Extensions
.
Configuration
);
configurationRegistry
.
registerConfiguration
({
id
:
'
externalTerminal
'
,
...
...
@@ -418,7 +390,7 @@ getDefaultTerminalLinuxReady().then(defaultTerminalLinux => {
'
terminal.external.windowsExec
'
:
{
type
:
'
string
'
,
description
:
nls
.
localize
(
'
terminal.external.windowsExec
'
,
"
Customizes which terminal to run on Windows.
"
),
default
:
getDefaultTerminalWindows
(),
default
:
WindowsExternalTerminalService
.
getDefaultTerminalWindows
(),
scope
:
ConfigurationScope
.
APPLICATION
},
'
terminal.external.osxExec
'
:
{
...
...
src/vs/workbench/contrib/externalTerminal/test/electron-browser/externalTerminalService.test.ts
浏览文件 @
13940e60
...
...
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import
{
deepEqual
,
equal
}
from
'
assert
'
;
import
{
WindowsExternalTerminalService
,
LinuxExternalTerminalService
,
MacExternalTerminalService
,
DEFAULT_TERMINAL_OSX
,
getDefaultTerminalWindows
,
getDefaultTerminalLinuxReady
}
from
'
vs/workbench/contrib/externalTerminal/node/externalTerminalService
'
;
import
{
WindowsExternalTerminalService
,
LinuxExternalTerminalService
,
MacExternalTerminalService
,
DEFAULT_TERMINAL_OSX
}
from
'
vs/workbench/contrib/externalTerminal/node/externalTerminalService
'
;
suite
(
'
ExternalTerminalService
'
,
()
=>
{
let
mockOnExit
:
Function
;
...
...
@@ -58,7 +58,7 @@ suite('ExternalTerminalService', () => {
let
mockSpawner
=
{
spawn
:
(
command
:
any
,
args
:
any
,
opts
:
any
)
=>
{
// assert
equal
(
args
[
args
.
length
-
1
],
getDefaultTerminalWindows
(),
'
terminal should equal expected
'
);
equal
(
args
[
args
.
length
-
1
],
WindowsExternalTerminalService
.
getDefaultTerminalWindows
(),
'
terminal should equal expected
'
);
done
();
return
{
on
:
(
evt
:
any
)
=>
evt
...
...
@@ -194,7 +194,7 @@ suite('ExternalTerminalService', () => {
});
test
(
`LinuxTerminalService - uses default terminal when configuration.terminal.external.linuxExec is undefined`
,
done
=>
{
getDefaultTerminalLinuxReady
().
then
(
defaultTerminalLinux
=>
{
LinuxExternalTerminalService
.
getDefaultTerminalLinuxReady
().
then
(
defaultTerminalLinux
=>
{
let
testCwd
=
'
path/to/workspace
'
;
let
mockSpawner
=
{
spawn
:
(
command
:
any
,
args
:
any
,
opts
:
any
)
=>
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录