Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
b35ea7e5
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,体验更适合开发者的 AI 搜索 >>
提交
b35ea7e5
编写于
11月 04, 2020
作者:
R
rebornix
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix #54829
上级
08e556dc
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
123 addition
and
27 deletion
+123
-27
src/vs/editor/contrib/linesOperations/moveLinesCommand.ts
src/vs/editor/contrib/linesOperations/moveLinesCommand.ts
+70
-27
src/vs/editor/contrib/linesOperations/test/moveLinesCommand.test.ts
...tor/contrib/linesOperations/test/moveLinesCommand.test.ts
+53
-0
未找到文件。
src/vs/editor/contrib/linesOperations/moveLinesCommand.ts
浏览文件 @
b35ea7e5
...
...
@@ -9,7 +9,7 @@ import { Range } from 'vs/editor/common/core/range';
import
{
Selection
}
from
'
vs/editor/common/core/selection
'
;
import
{
ICommand
,
ICursorStateComputerData
,
IEditOperationBuilder
}
from
'
vs/editor/common/editorCommon
'
;
import
{
ITextModel
}
from
'
vs/editor/common/model
'
;
import
{
IndentAction
}
from
'
vs/editor/common/modes/languageConfiguration
'
;
import
{
CompleteEnterAction
,
IndentAction
}
from
'
vs/editor/common/modes/languageConfiguration
'
;
import
{
IIndentConverter
,
LanguageConfigurationRegistry
}
from
'
vs/editor/common/modes/languageConfigurationRegistry
'
;
import
{
IndentConsts
}
from
'
vs/editor/common/modes/supports/indentRules
'
;
import
*
as
indentUtils
from
'
vs/editor/contrib/indentation/indentUtils
'
;
...
...
@@ -135,7 +135,8 @@ export class MoveLinesCommand implements ICommand {
// to s.startLineNumber
builder
.
addEditOperation
(
new
Range
(
s
.
startLineNumber
,
1
,
s
.
startLineNumber
,
1
),
insertingText
+
'
\n
'
);
let
ret
=
this
.
matchEnterRule
(
model
,
indentConverter
,
tabSize
,
s
.
startLineNumber
,
s
.
startLineNumber
,
insertingText
);
let
ret
=
this
.
matchEnterRuleMovingDown
(
model
,
indentConverter
,
tabSize
,
s
.
startLineNumber
,
movingLineNumber
,
insertingText
);
// check if the line being moved before matches onEnter rules, if so let's adjust the indentation by onEnter rules.
if
(
ret
!==
null
)
{
if
(
ret
!==
0
)
{
...
...
@@ -229,31 +230,7 @@ export class MoveLinesCommand implements ICommand {
};
}
private
matchEnterRule
(
model
:
ITextModel
,
indentConverter
:
IIndentConverter
,
tabSize
:
number
,
line
:
number
,
oneLineAbove
:
number
,
oneLineAboveText
?:
string
)
{
let
validPrecedingLine
=
oneLineAbove
;
while
(
validPrecedingLine
>=
1
)
{
// ship empty lines as empty lines just inherit indentation
let
lineContent
;
if
(
validPrecedingLine
===
oneLineAbove
&&
oneLineAboveText
!==
undefined
)
{
lineContent
=
oneLineAboveText
;
}
else
{
lineContent
=
model
.
getLineContent
(
validPrecedingLine
);
}
let
nonWhitespaceIdx
=
strings
.
lastNonWhitespaceIndex
(
lineContent
);
if
(
nonWhitespaceIdx
>=
0
)
{
break
;
}
validPrecedingLine
--
;
}
if
(
validPrecedingLine
<
1
||
line
>
model
.
getLineCount
())
{
return
null
;
}
let
maxColumn
=
model
.
getLineMaxColumn
(
validPrecedingLine
);
let
enter
=
LanguageConfigurationRegistry
.
getEnterAction
(
this
.
_autoIndent
,
model
,
new
Range
(
validPrecedingLine
,
maxColumn
,
validPrecedingLine
,
maxColumn
));
private
parseEnterResult
(
model
:
ITextModel
,
indentConverter
:
IIndentConverter
,
tabSize
:
number
,
line
:
number
,
enter
:
CompleteEnterAction
|
null
)
{
if
(
enter
)
{
let
enterPrefix
=
enter
.
indentation
;
...
...
@@ -283,6 +260,72 @@ export class MoveLinesCommand implements ICommand {
return
null
;
}
/**
*
* @param model
* @param indentConverter
* @param tabSize
* @param line the line moving down
* @param futureAboveLineNumber the line which will be at the `line` position
* @param futureAboveLineText
*/
private
matchEnterRuleMovingDown
(
model
:
ITextModel
,
indentConverter
:
IIndentConverter
,
tabSize
:
number
,
line
:
number
,
futureAboveLineNumber
:
number
,
futureAboveLineText
:
string
)
{
if
(
strings
.
lastNonWhitespaceIndex
(
futureAboveLineText
)
>=
0
)
{
// break
let
maxColumn
=
model
.
getLineMaxColumn
(
futureAboveLineNumber
);
let
enter
=
LanguageConfigurationRegistry
.
getEnterAction
(
this
.
_autoIndent
,
model
,
new
Range
(
futureAboveLineNumber
,
maxColumn
,
futureAboveLineNumber
,
maxColumn
));
return
this
.
parseEnterResult
(
model
,
indentConverter
,
tabSize
,
line
,
enter
);
}
else
{
// go upwards, starting from `line - 1`
let
validPrecedingLine
=
line
-
1
;
while
(
validPrecedingLine
>=
1
)
{
let
lineContent
=
model
.
getLineContent
(
validPrecedingLine
);
let
nonWhitespaceIdx
=
strings
.
lastNonWhitespaceIndex
(
lineContent
);
if
(
nonWhitespaceIdx
>=
0
)
{
break
;
}
validPrecedingLine
--
;
}
if
(
validPrecedingLine
<
1
||
line
>
model
.
getLineCount
())
{
return
null
;
}
let
maxColumn
=
model
.
getLineMaxColumn
(
validPrecedingLine
);
let
enter
=
LanguageConfigurationRegistry
.
getEnterAction
(
this
.
_autoIndent
,
model
,
new
Range
(
validPrecedingLine
,
maxColumn
,
validPrecedingLine
,
maxColumn
));
return
this
.
parseEnterResult
(
model
,
indentConverter
,
tabSize
,
line
,
enter
);
}
}
private
matchEnterRule
(
model
:
ITextModel
,
indentConverter
:
IIndentConverter
,
tabSize
:
number
,
line
:
number
,
oneLineAbove
:
number
,
oneLineAboveText
?:
string
)
{
let
validPrecedingLine
=
oneLineAbove
;
while
(
validPrecedingLine
>=
1
)
{
// ship empty lines as empty lines just inherit indentation
let
lineContent
;
if
(
validPrecedingLine
===
oneLineAbove
&&
oneLineAboveText
!==
undefined
)
{
lineContent
=
oneLineAboveText
;
}
else
{
lineContent
=
model
.
getLineContent
(
validPrecedingLine
);
}
let
nonWhitespaceIdx
=
strings
.
lastNonWhitespaceIndex
(
lineContent
);
if
(
nonWhitespaceIdx
>=
0
)
{
break
;
}
validPrecedingLine
--
;
}
if
(
validPrecedingLine
<
1
||
line
>
model
.
getLineCount
())
{
return
null
;
}
let
maxColumn
=
model
.
getLineMaxColumn
(
validPrecedingLine
);
let
enter
=
LanguageConfigurationRegistry
.
getEnterAction
(
this
.
_autoIndent
,
model
,
new
Range
(
validPrecedingLine
,
maxColumn
,
validPrecedingLine
,
maxColumn
));
return
this
.
parseEnterResult
(
model
,
indentConverter
,
tabSize
,
line
,
enter
);
}
private
trimLeft
(
str
:
string
)
{
return
str
.
replace
(
/^
\s
+/
,
''
);
}
...
...
src/vs/editor/contrib/linesOperations/test/moveLinesCommand.test.ts
浏览文件 @
b35ea7e5
...
...
@@ -329,6 +329,7 @@ suite('Editor contrib - Move Lines Command honors Indentation Rules', () => {
mode
.
dispose
();
});
test
(
'
move line should still work as before if there is no indentation rules
'
,
()
=>
{
testMoveLinesUpWithIndentCommand
(
null
!
,
...
...
@@ -351,3 +352,55 @@ suite('Editor contrib - Move Lines Command honors Indentation Rules', () => {
);
});
});
class
EnterRulesMode
extends
MockMode
{
private
static
readonly
_id
=
new
LanguageIdentifier
(
'
moveLinesEnterMode
'
,
8
);
constructor
()
{
super
(
EnterRulesMode
.
_id
);
this
.
_register
(
LanguageConfigurationRegistry
.
register
(
this
.
getLanguageIdentifier
(),
{
indentationRules
:
{
decreaseIndentPattern
:
/^
\s
*
\[
$/
,
increaseIndentPattern
:
/^
\s
*
\]
$/
,
},
brackets
:
[
[
'
{
'
,
'
}
'
]
]
}));
}
}
suite
(
'
Editor - contrib - Move Lines Command honors onEnter Rules
'
,
()
=>
{
test
(
'
issue #54829. move block across block
'
,
()
=>
{
let
mode
=
new
EnterRulesMode
();
testMoveLinesDownWithIndentCommand
(
mode
.
getLanguageIdentifier
(),
[
'
if (true) {
'
,
'
if (false) {
'
,
'
if (1) {
'
,
'
console.log(
\'
b
\'
);
'
,
'
}
'
,
'
console.log(
\'
a
\'
);
'
,
'
}
'
,
'
}
'
],
new
Selection
(
3
,
9
,
5
,
10
),
[
'
if (true) {
'
,
'
if (false) {
'
,
'
console.log(
\'
a
\'
);
'
,
'
if (1) {
'
,
'
console.log(
\'
b
\'
);
'
,
'
}
'
,
'
}
'
,
'
}
'
],
new
Selection
(
4
,
9
,
6
,
10
),
);
mode
.
dispose
();
});
});
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录