Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
52a351f8
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,发现更多精彩内容 >>
未验证
提交
52a351f8
编写于
6月 14, 2019
作者:
D
Daniel Imms
提交者:
GitHub
6月 14, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #75455 from microsoft/tyriar/75091_default_shell_api
Implement API to get default shell
上级
58be455d
976320dd
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
76 addition
and
14 deletion
+76
-14
src/vs/vscode.proposed.d.ts
src/vs/vscode.proposed.d.ts
+6
-0
src/vs/workbench/api/browser/mainThreadTerminalService.ts
src/vs/workbench/api/browser/mainThreadTerminalService.ts
+5
-0
src/vs/workbench/api/common/extHost.protocol.ts
src/vs/workbench/api/common/extHost.protocol.ts
+1
-0
src/vs/workbench/api/node/extHost.api.impl.ts
src/vs/workbench/api/node/extHost.api.impl.ts
+3
-0
src/vs/workbench/api/node/extHostTerminalService.ts
src/vs/workbench/api/node/extHostTerminalService.ts
+18
-1
src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts
...orkbench/contrib/terminal/browser/terminalConfigHelper.ts
+5
-0
src/vs/workbench/contrib/terminal/common/terminal.ts
src/vs/workbench/contrib/terminal/common/terminal.ts
+6
-2
src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts
.../workbench/contrib/terminal/common/terminalEnvironment.ts
+32
-11
未找到文件。
src/vs/vscode.proposed.d.ts
浏览文件 @
52a351f8
...
...
@@ -1110,6 +1110,12 @@ declare module 'vscode' {
}
namespace
window
{
/**
* The detected default shell for the extension host, this is overridden by the
* `terminal.integrated.shell` setting for the extension host's platform.
*/
export
const
shell
:
string
;
/**
* An event which fires when the [dimensions](#Terminal.dimensions) of the terminal change.
*/
...
...
src/vs/workbench/api/browser/mainThreadTerminalService.ts
浏览文件 @
52a351f8
...
...
@@ -41,6 +41,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
this
.
_toDispose
.
push
(
terminalService
.
onInstanceRequestExtHostProcess
(
request
=>
this
.
_onTerminalRequestExtHostProcess
(
request
)));
this
.
_toDispose
.
push
(
terminalService
.
onActiveInstanceChanged
(
instance
=>
this
.
_onActiveTerminalChanged
(
instance
?
instance
.
id
:
null
)));
this
.
_toDispose
.
push
(
terminalService
.
onInstanceTitleChanged
(
instance
=>
this
.
_onTitleChanged
(
instance
.
id
,
instance
.
title
)));
this
.
_toDispose
.
push
(
terminalService
.
configHelper
.
onWorkspacePermissionsChanged
(
isAllowed
=>
this
.
_onWorkspacePermissionsChanged
(
isAllowed
)));
// Set initial ext host state
this
.
terminalService
.
terminalInstances
.
forEach
(
t
=>
{
...
...
@@ -182,6 +183,10 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
this
.
_proxy
.
$acceptTerminalTitleChange
(
terminalId
,
name
);
}
private
_onWorkspacePermissionsChanged
(
isAllowed
:
boolean
):
void
{
this
.
_proxy
.
$acceptWorkspacePermissionsChanged
(
isAllowed
);
}
private
_onTerminalRendererInput
(
terminalId
:
number
,
data
:
string
):
void
{
this
.
_proxy
.
$acceptTerminalRendererInput
(
terminalId
,
data
);
}
...
...
src/vs/workbench/api/common/extHost.protocol.ts
浏览文件 @
52a351f8
...
...
@@ -1122,6 +1122,7 @@ export interface ExtHostTerminalServiceShape {
$acceptProcessRequestInitialCwd
(
id
:
number
):
void
;
$acceptProcessRequestCwd
(
id
:
number
):
void
;
$acceptProcessRequestLatency
(
id
:
number
):
number
;
$acceptWorkspacePermissionsChanged
(
isAllowed
:
boolean
):
void
;
}
export
interface
ExtHostSCMShape
{
...
...
src/vs/workbench/api/node/extHost.api.impl.ts
浏览文件 @
52a351f8
...
...
@@ -389,6 +389,9 @@ export function createApiFactory(
get
terminals
()
{
return
extHostTerminalService
.
terminals
;
},
get
shell
()
{
return
extHostTerminalService
.
getDefaultShell
(
configProvider
);
},
showTextDocument
(
documentOrUri
:
vscode
.
TextDocument
|
vscode
.
Uri
,
columnOrOptions
?:
vscode
.
ViewColumn
|
vscode
.
TextDocumentShowOptions
,
preserveFocus
?:
boolean
):
Thenable
<
vscode
.
TextEditor
>
{
let
documentPromise
:
Promise
<
vscode
.
TextDocument
>
;
if
(
URI
.
isUri
(
documentOrUri
))
{
...
...
src/vs/workbench/api/node/extHostTerminalService.ts
浏览文件 @
52a351f8
...
...
@@ -11,7 +11,7 @@ import * as platform from 'vs/base/common/platform';
import
*
as
terminalEnvironment
from
'
vs/workbench/contrib/terminal/common/terminalEnvironment
'
;
import
{
Event
,
Emitter
}
from
'
vs/base/common/event
'
;
import
{
ExtHostTerminalServiceShape
,
MainContext
,
MainThreadTerminalServiceShape
,
IMainContext
,
ShellLaunchConfigDto
}
from
'
vs/workbench/api/common/extHost.protocol
'
;
import
{
ExtHostConfiguration
}
from
'
vs/workbench/api/common/extHostConfiguration
'
;
import
{
ExtHostConfiguration
,
ExtHostConfigProvider
}
from
'
vs/workbench/api/common/extHostConfiguration
'
;
import
{
ILogService
}
from
'
vs/platform/log/common/log
'
;
import
{
EXT_HOST_CREATION_DELAY
,
IShellLaunchConfig
,
ITerminalEnvironment
}
from
'
vs/workbench/contrib/terminal/common/terminal
'
;
import
{
TerminalProcess
}
from
'
vs/workbench/contrib/terminal/node/terminalProcess
'
;
...
...
@@ -278,6 +278,9 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
private
_terminalRenderers
:
ExtHostTerminalRenderer
[]
=
[];
private
_getTerminalPromises
:
{
[
id
:
number
]:
Promise
<
ExtHostTerminal
>
}
=
{};
// TODO: Pull this from main side
private
_isWorkspaceShellAllowed
:
boolean
=
false
;
public
get
activeTerminal
():
ExtHostTerminal
|
undefined
{
return
this
.
_activeTerminal
;
}
public
get
terminals
():
ExtHostTerminal
[]
{
return
this
.
_terminals
;
}
...
...
@@ -325,6 +328,16 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
return
renderer
;
}
public
getDefaultShell
(
configProvider
:
ExtHostConfigProvider
):
string
{
const
fetchSetting
=
(
key
:
string
)
=>
{
const
setting
=
configProvider
.
getConfiguration
(
key
.
substr
(
0
,
key
.
lastIndexOf
(
'
.
'
)))
.
inspect
<
string
|
string
[]
>
(
key
.
substr
(
key
.
lastIndexOf
(
'
.
'
)
+
1
));
return
this
.
_apiInspectConfigToPlain
<
string
|
string
[]
>
(
setting
);
};
return
terminalEnvironment
.
getDefaultShell
(
fetchSetting
,
this
.
_isWorkspaceShellAllowed
,
getDefaultShell
(
platform
.
platform
));
}
public
async
resolveTerminalRenderer
(
id
:
number
):
Promise
<
vscode
.
TerminalRenderer
>
{
// Check to see if the extension host already knows about this terminal.
for
(
const
terminalRenderer
of
this
.
_terminalRenderers
)
{
...
...
@@ -612,6 +625,10 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
});
return
index
;
}
public
$acceptWorkspacePermissionsChanged
(
isAllowed
:
boolean
):
void
{
this
.
_isWorkspaceShellAllowed
=
isAllowed
;
}
}
class
ApiRequest
{
...
...
src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts
浏览文件 @
52a351f8
...
...
@@ -14,6 +14,7 @@ import { Terminal as XTermTerminal } from 'xterm';
import
{
INotificationService
}
from
'
vs/platform/notification/common/notification
'
;
import
{
IBrowserTerminalConfigHelper
}
from
'
vs/workbench/contrib/terminal/browser/terminal
'
;
import
{
mergeDefaultShellPathAndArgs
}
from
'
vs/workbench/contrib/terminal/common/terminalEnvironment
'
;
import
{
Emitter
,
Event
}
from
'
vs/base/common/event
'
;
const
MINIMUM_FONT_SIZE
=
6
;
const
MAXIMUM_FONT_SIZE
=
25
;
...
...
@@ -29,6 +30,9 @@ export class TerminalConfigHelper implements IBrowserTerminalConfigHelper {
private
_lastFontMeasurement
:
ITerminalFont
;
public
config
:
ITerminalConfiguration
;
private
readonly
_onWorkspacePermissionsChanged
=
new
Emitter
<
boolean
>
();
public
get
onWorkspacePermissionsChanged
():
Event
<
boolean
>
{
return
this
.
_onWorkspacePermissionsChanged
.
event
;
}
public
constructor
(
private
readonly
_linuxDistro
:
LinuxDistro
,
@
IConfigurationService
private
readonly
_configurationService
:
IConfigurationService
,
...
...
@@ -160,6 +164,7 @@ export class TerminalConfigHelper implements IBrowserTerminalConfigHelper {
}
public
setWorkspaceShellAllowed
(
isAllowed
:
boolean
):
void
{
this
.
_onWorkspacePermissionsChanged
.
fire
(
isAllowed
);
this
.
_storageService
.
store
(
IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY
,
isAllowed
,
StorageScope
.
WORKSPACE
);
}
...
...
src/vs/workbench/contrib/terminal/common/terminal.ts
浏览文件 @
52a351f8
...
...
@@ -109,6 +109,9 @@ export interface ITerminalConfiguration {
export
interface
ITerminalConfigHelper
{
config
:
ITerminalConfiguration
;
onWorkspacePermissionsChanged
:
Event
<
boolean
>
;
configFontIsMonospace
():
boolean
;
getFont
():
ITerminalFont
;
/**
...
...
@@ -210,6 +213,9 @@ export interface ITerminalService {
activeTabIndex
:
number
;
configHelper
:
ITerminalConfigHelper
;
terminalInstances
:
ITerminalInstance
[];
terminalTabs
:
ITerminalTab
[];
onActiveTabChanged
:
Event
<
void
>
;
onTabDisposed
:
Event
<
ITerminalTab
>
;
onInstanceCreated
:
Event
<
ITerminalInstance
>
;
...
...
@@ -220,8 +226,6 @@ export interface ITerminalService {
onInstancesChanged
:
Event
<
void
>
;
onInstanceTitleChanged
:
Event
<
ITerminalInstance
>
;
onActiveInstanceChanged
:
Event
<
ITerminalInstance
|
undefined
>
;
terminalInstances
:
ITerminalInstance
[];
terminalTabs
:
ITerminalTab
[];
/**
* Creates a terminal.
...
...
src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts
浏览文件 @
52a351f8
...
...
@@ -161,34 +161,55 @@ export function escapeNonWindowsPath(path: string): string {
return
newPath
;
}
export
function
mergeDefaultShellPathAndArgs
(
shell
:
IShellLaunchConfig
,
export
function
getDefaultShell
(
fetchSetting
:
(
key
:
string
)
=>
{
user
:
string
|
string
[]
|
undefined
,
value
:
string
|
string
[]
|
undefined
,
default
:
string
|
string
[]
|
undefined
},
isWorkspaceShellAllowed
:
boolean
,
defaultShell
:
string
,
platformOverride
:
platform
.
Platform
=
platform
.
platform
):
void
{
):
string
{
const
platformKey
=
platformOverride
===
platform
.
Platform
.
Windows
?
'
windows
'
:
platformOverride
===
platform
.
Platform
.
Mac
?
'
osx
'
:
'
linux
'
;
const
shellConfigValue
=
fetchSetting
(
`terminal.integrated.shell.
${
platformKey
}
`
);
const
shellArgsConfigValue
=
fetchSetting
(
`terminal.integrated.shellArgs.
${
platformKey
}
`
);
shell
.
executable
=
(
isWorkspaceShellAllowed
?
<
string
>
shellConfigValue
.
value
:
<
string
>
shellConfigValue
.
user
)
||
(
<
string
|
null
>
shellConfigValue
.
default
||
defaultShell
);
shell
.
args
=
(
isWorkspaceShellAllowed
?
<
string
[]
>
shellArgsConfigValue
.
value
:
<
string
[]
>
shellArgsConfigValue
.
user
)
||
<
string
[]
>
shellArgsConfigValue
.
default
;
let
executable
=
(
isWorkspaceShellAllowed
?
<
string
>
shellConfigValue
.
value
:
<
string
>
shellConfigValue
.
user
)
||
(
<
string
|
null
>
shellConfigValue
.
default
||
defaultShell
);
// Change Sysnative to System32 if the OS is Windows but NOT WoW64. It's
// safe to assume that this was used by accident as Sysnative does not
// exist and will break the terminal in non-WoW64 environments.
if
((
platformOverride
===
platform
.
Platform
.
Windows
)
&&
!
process
.
env
.
hasOwnProperty
(
'
PROCESSOR_ARCHITEW6432
'
)
&&
process
.
env
.
windir
)
{
const
sysnativePath
=
path
.
join
(
process
.
env
.
windir
,
'
Sysnative
'
).
toLowerCase
();
if
(
shell
.
executable
&&
shell
.
executable
.
toLowerCase
().
indexOf
(
sysnativePath
)
===
0
)
{
shell
.
executable
=
path
.
join
(
process
.
env
.
windir
,
'
System32
'
,
shell
.
executable
.
substr
(
sysnativePath
.
length
));
if
(
executable
&&
executable
.
toLowerCase
().
indexOf
(
sysnativePath
)
===
0
)
{
executable
=
path
.
join
(
process
.
env
.
windir
,
'
System32
'
,
executable
.
substr
(
sysnativePath
.
length
));
}
}
// Convert / to \ on Windows for convenience
if
(
shell
.
executable
&&
platformOverride
===
platform
.
Platform
.
Windows
)
{
shell
.
executable
=
shell
.
executable
.
replace
(
/
\/
/g
,
'
\\
'
);
if
(
executable
&&
platformOverride
===
platform
.
Platform
.
Windows
)
{
executable
=
executable
.
replace
(
/
\/
/g
,
'
\\
'
);
}
return
executable
;
}
function
getDefaultShellArgs
(
fetchSetting
:
(
key
:
string
)
=>
{
user
:
string
|
string
[]
|
undefined
,
value
:
string
|
string
[]
|
undefined
,
default
:
string
|
string
[]
|
undefined
},
isWorkspaceShellAllowed
:
boolean
,
defaultShell
:
string
,
platformOverride
:
platform
.
Platform
=
platform
.
platform
):
string
[]
{
const
platformKey
=
platformOverride
===
platform
.
Platform
.
Windows
?
'
windows
'
:
platformOverride
===
platform
.
Platform
.
Mac
?
'
osx
'
:
'
linux
'
;
const
shellArgsConfigValue
=
fetchSetting
(
`terminal.integrated.shellArgs.
${
platformKey
}
`
);
const
args
=
(
isWorkspaceShellAllowed
?
<
string
[]
>
shellArgsConfigValue
.
value
:
<
string
[]
>
shellArgsConfigValue
.
user
)
||
<
string
[]
>
shellArgsConfigValue
.
default
;
return
args
;
}
export
function
mergeDefaultShellPathAndArgs
(
shell
:
IShellLaunchConfig
,
fetchSetting
:
(
key
:
string
)
=>
{
user
:
string
|
string
[]
|
undefined
,
value
:
string
|
string
[]
|
undefined
,
default
:
string
|
string
[]
|
undefined
},
isWorkspaceShellAllowed
:
boolean
,
defaultShell
:
string
,
platformOverride
:
platform
.
Platform
=
platform
.
platform
):
void
{
shell
.
executable
=
getDefaultShell
(
fetchSetting
,
isWorkspaceShellAllowed
,
defaultShell
,
platformOverride
);
shell
.
args
=
getDefaultShellArgs
(
fetchSetting
,
isWorkspaceShellAllowed
,
defaultShell
,
platformOverride
);
}
export
function
createTerminalEnvironment
(
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录