Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
eedf704b
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,发现更多精彩内容 >>
提交
eedf704b
编写于
10月 28, 2020
作者:
J
Johannes Rieken
提交者:
meganrogge
10月 28, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add config option to disable whitespace select
上级
68da44da
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
61 addition
and
7 deletion
+61
-7
src/vs/editor/contrib/smartSelect/smartSelect.ts
src/vs/editor/contrib/smartSelect/smartSelect.ts
+36
-4
src/vs/editor/contrib/smartSelect/test/smartSelect.test.ts
src/vs/editor/contrib/smartSelect/test/smartSelect.test.ts
+24
-2
src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts
...orkbench/test/browser/api/extHostLanguageFeatures.test.ts
+1
-1
未找到文件。
src/vs/editor/contrib/smartSelect/smartSelect.ts
浏览文件 @
eedf704b
...
@@ -23,6 +23,9 @@ import { WordSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/wordSe
...
@@ -23,6 +23,9 @@ import { WordSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/wordSe
import
{
BracketSelectionRangeProvider
}
from
'
vs/editor/contrib/smartSelect/bracketSelections
'
;
import
{
BracketSelectionRangeProvider
}
from
'
vs/editor/contrib/smartSelect/bracketSelections
'
;
import
{
CommandsRegistry
}
from
'
vs/platform/commands/common/commands
'
;
import
{
CommandsRegistry
}
from
'
vs/platform/commands/common/commands
'
;
import
{
onUnexpectedExternalError
}
from
'
vs/base/common/errors
'
;
import
{
onUnexpectedExternalError
}
from
'
vs/base/common/errors
'
;
import
{
ITextResourceConfigurationService
}
from
'
vs/editor/common/services/textResourceConfigurationService
'
;
import
{
ConfigurationScope
,
Extensions
,
IConfigurationRegistry
}
from
'
vs/platform/configuration/common/configurationRegistry
'
;
import
{
Registry
}
from
'
vs/platform/registry/common/platform
'
;
class
SelectionRanges
{
class
SelectionRanges
{
...
@@ -59,7 +62,10 @@ class SmartSelectController implements IEditorContribution {
...
@@ -59,7 +62,10 @@ class SmartSelectController implements IEditorContribution {
private
_selectionListener
?:
IDisposable
;
private
_selectionListener
?:
IDisposable
;
private
_ignoreSelection
:
boolean
=
false
;
private
_ignoreSelection
:
boolean
=
false
;
constructor
(
editor
:
ICodeEditor
)
{
constructor
(
editor
:
ICodeEditor
,
@
ITextResourceConfigurationService
private
readonly
_configService
:
ITextResourceConfigurationService
,
)
{
this
.
_editor
=
editor
;
this
.
_editor
=
editor
;
}
}
...
@@ -83,7 +89,10 @@ class SmartSelectController implements IEditorContribution {
...
@@ -83,7 +89,10 @@ class SmartSelectController implements IEditorContribution {
let
promise
:
Promise
<
void
>
=
Promise
.
resolve
(
undefined
);
let
promise
:
Promise
<
void
>
=
Promise
.
resolve
(
undefined
);
if
(
!
this
.
_state
)
{
if
(
!
this
.
_state
)
{
promise
=
provideSelectionRanges
(
model
,
selections
.
map
(
s
=>
s
.
getPosition
()),
CancellationToken
.
None
).
then
(
ranges
=>
{
const
selectLeadingAndTrailingWhitespace
=
this
.
_configService
.
getValue
<
boolean
>
(
model
.
uri
,
'
editor.smartSelect.selectLeadingAndTrailingWhitespace
'
)
??
true
;
promise
=
provideSelectionRanges
(
model
,
selections
.
map
(
s
=>
s
.
getPosition
()),
{
selectLeadingAndTrailingWhitespace
},
CancellationToken
.
None
).
then
(
ranges
=>
{
if
(
!
arrays
.
isNonEmptyArray
(
ranges
)
||
ranges
.
length
!==
selections
.
length
)
{
if
(
!
arrays
.
isNonEmptyArray
(
ranges
)
||
ranges
.
length
!==
selections
.
length
)
{
// invalid result
// invalid result
return
;
return
;
...
@@ -177,6 +186,21 @@ class GrowSelectionAction extends AbstractSmartSelect {
...
@@ -177,6 +186,21 @@ class GrowSelectionAction extends AbstractSmartSelect {
}
}
}
}
//todo@jrieken use proper editor config instead. however, to keep the number
// of changes low use the quick config definition
Registry
.
as
<
IConfigurationRegistry
>
(
Extensions
.
Configuration
).
registerConfiguration
({
id
:
'
editor
'
,
properties
:
{
'
editor.smartSelect.selectLeadingAndTrailingWhitespace
'
:
{
scope
:
ConfigurationScope
.
LANGUAGE_OVERRIDABLE
,
description
:
nls
.
localize
(
'
selectLeadingAndTrailingWhitespace
'
,
"
Weather leading and trailing whitespace should always be selected.
"
),
default
:
true
,
type
:
'
boolean
'
}
}
});
// renamed command id
// renamed command id
CommandsRegistry
.
registerCommandAlias
(
'
editor.action.smartSelect.grow
'
,
'
editor.action.smartSelect.expand
'
);
CommandsRegistry
.
registerCommandAlias
(
'
editor.action.smartSelect.grow
'
,
'
editor.action.smartSelect.expand
'
);
...
@@ -213,7 +237,11 @@ registerEditorAction(ShrinkSelectionAction);
...
@@ -213,7 +237,11 @@ registerEditorAction(ShrinkSelectionAction);
// word selection
// word selection
modes
.
SelectionRangeRegistry
.
register
(
'
*
'
,
new
WordSelectionRangeProvider
());
modes
.
SelectionRangeRegistry
.
register
(
'
*
'
,
new
WordSelectionRangeProvider
());
export
function
provideSelectionRanges
(
model
:
ITextModel
,
positions
:
Position
[],
token
:
CancellationToken
):
Promise
<
Range
[][]
>
{
export
interface
SelectionRangesOptions
{
selectLeadingAndTrailingWhitespace
:
boolean
}
export
function
provideSelectionRanges
(
model
:
ITextModel
,
positions
:
Position
[],
options
:
SelectionRangesOptions
,
token
:
CancellationToken
):
Promise
<
Range
[][]
>
{
const
providers
=
modes
.
SelectionRangeRegistry
.
all
(
model
);
const
providers
=
modes
.
SelectionRangeRegistry
.
all
(
model
);
...
@@ -277,6 +305,10 @@ export function provideSelectionRanges(model: ITextModel, positions: Position[],
...
@@ -277,6 +305,10 @@ export function provideSelectionRanges(model: ITextModel, positions: Position[],
}
}
}
}
if
(
!
options
.
selectLeadingAndTrailingWhitespace
)
{
return
oneRanges
;
}
// add ranges that expand trivia at line starts and ends whenever a range
// add ranges that expand trivia at line starts and ends whenever a range
// wraps onto the a new line
// wraps onto the a new line
let
oneRangesWithTrivia
:
Range
[]
=
[
oneRanges
[
0
]];
let
oneRangesWithTrivia
:
Range
[]
=
[
oneRanges
[
0
]];
...
@@ -304,5 +336,5 @@ export function provideSelectionRanges(model: ITextModel, positions: Position[],
...
@@ -304,5 +336,5 @@ export function provideSelectionRanges(model: ITextModel, positions: Position[],
registerModelCommand
(
'
_executeSelectionRangeProvider
'
,
function
(
model
,
...
args
)
{
registerModelCommand
(
'
_executeSelectionRangeProvider
'
,
function
(
model
,
...
args
)
{
const
[
positions
]
=
args
;
const
[
positions
]
=
args
;
return
provideSelectionRanges
(
model
,
positions
,
CancellationToken
.
None
);
return
provideSelectionRanges
(
model
,
positions
,
{
selectLeadingAndTrailingWhitespace
:
true
},
CancellationToken
.
None
);
});
});
src/vs/editor/contrib/smartSelect/test/smartSelect.test.ts
浏览文件 @
eedf704b
...
@@ -60,10 +60,10 @@ suite('SmartSelect', () => {
...
@@ -60,10 +60,10 @@ suite('SmartSelect', () => {
mode
.
dispose
();
mode
.
dispose
();
});
});
async
function
assertGetRangesToPosition
(
text
:
string
[],
lineNumber
:
number
,
column
:
number
,
ranges
:
Range
[]):
Promise
<
void
>
{
async
function
assertGetRangesToPosition
(
text
:
string
[],
lineNumber
:
number
,
column
:
number
,
ranges
:
Range
[]
,
selectLeadingAndTrailingWhitespace
=
true
):
Promise
<
void
>
{
let
uri
=
URI
.
file
(
'
test.js
'
);
let
uri
=
URI
.
file
(
'
test.js
'
);
let
model
=
modelService
.
createModel
(
text
.
join
(
'
\n
'
),
new
StaticLanguageSelector
(
mode
.
getLanguageIdentifier
()),
uri
);
let
model
=
modelService
.
createModel
(
text
.
join
(
'
\n
'
),
new
StaticLanguageSelector
(
mode
.
getLanguageIdentifier
()),
uri
);
let
[
actual
]
=
await
provideSelectionRanges
(
model
,
[
new
Position
(
lineNumber
,
column
)],
CancellationToken
.
None
);
let
[
actual
]
=
await
provideSelectionRanges
(
model
,
[
new
Position
(
lineNumber
,
column
)],
{
selectLeadingAndTrailingWhitespace
},
CancellationToken
.
None
);
let
actualStr
=
actual
!
.
map
(
r
=>
new
Range
(
r
.
startLineNumber
,
r
.
startColumn
,
r
.
endLineNumber
,
r
.
endColumn
).
toString
());
let
actualStr
=
actual
!
.
map
(
r
=>
new
Range
(
r
.
startLineNumber
,
r
.
startColumn
,
r
.
endLineNumber
,
r
.
endColumn
).
toString
());
let
desiredStr
=
ranges
.
reverse
().
map
(
r
=>
String
(
r
));
let
desiredStr
=
ranges
.
reverse
().
map
(
r
=>
String
(
r
));
...
@@ -97,6 +97,28 @@ suite('SmartSelect', () => {
...
@@ -97,6 +97,28 @@ suite('SmartSelect', () => {
]);
]);
});
});
test
(
'
config: selectLeadingAndTrailingWhitespace
'
,
async
()
=>
{
await
assertGetRangesToPosition
([
'
aaa
'
,
'
\t
bbb
'
,
''
],
2
,
3
,
[
new
Range
(
1
,
1
,
3
,
1
),
// all
new
Range
(
2
,
1
,
2
,
5
),
// line w/ triva
new
Range
(
2
,
2
,
2
,
5
),
// bbb
],
true
);
await
assertGetRangesToPosition
([
'
aaa
'
,
'
\t
bbb
'
,
''
],
2
,
3
,
[
new
Range
(
1
,
1
,
3
,
1
),
// all
new
Range
(
2
,
2
,
2
,
5
),
// () inside
],
false
);
});
test
(
'
getRangesToPosition #56886. Skip empty lines correctly.
'
,
()
=>
{
test
(
'
getRangesToPosition #56886. Skip empty lines correctly.
'
,
()
=>
{
return
assertGetRangesToPosition
([
return
assertGetRangesToPosition
([
...
...
src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts
浏览文件 @
eedf704b
...
@@ -1170,7 +1170,7 @@ suite('ExtHostLanguageFeatures', function () {
...
@@ -1170,7 +1170,7 @@ suite('ExtHostLanguageFeatures', function () {
await
rpcProtocol
.
sync
();
await
rpcProtocol
.
sync
();
provideSelectionRanges
(
model
,
[
new
Position
(
1
,
17
)],
CancellationToken
.
None
).
then
(
ranges
=>
{
provideSelectionRanges
(
model
,
[
new
Position
(
1
,
17
)],
{
selectLeadingAndTrailingWhitespace
:
true
},
CancellationToken
.
None
).
then
(
ranges
=>
{
assert
.
equal
(
ranges
.
length
,
1
);
assert
.
equal
(
ranges
.
length
,
1
);
assert
.
ok
(
ranges
[
0
].
length
>=
2
);
assert
.
ok
(
ranges
[
0
].
length
>=
2
);
});
});
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录