Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
941c0e56
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,发现更多精彩内容 >>
提交
941c0e56
编写于
9月 20, 2018
作者:
A
Alex Dima
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fixes #45895: Do nout touch lines where cursors rest
上级
af361490
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
35 addition
and
15 deletion
+35
-15
src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts
...rkbench/api/electron-browser/mainThreadSaveParticipant.ts
+35
-15
未找到文件。
src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts
浏览文件 @
941c0e56
...
...
@@ -60,7 +60,7 @@ class TrimWhitespaceParticipant implements ISaveParticipantParticipant {
private
doTrimTrailingWhitespace
(
model
:
ITextModel
,
isAutoSaved
:
boolean
):
void
{
let
prevSelection
:
Selection
[]
=
[];
cons
t
cursors
:
Position
[]
=
[];
le
t
cursors
:
Position
[]
=
[];
let
editor
=
findEditor
(
model
,
this
.
codeEditorService
);
if
(
editor
)
{
...
...
@@ -68,7 +68,7 @@ class TrimWhitespaceParticipant implements ISaveParticipantParticipant {
// Collect active cursors in `cursors` only if `isAutoSaved` to avoid having the cursors jump
prevSelection
=
editor
.
getSelections
();
if
(
isAutoSaved
)
{
cursors
.
push
(...
prevSelection
.
map
(
s
=>
new
Position
(
s
.
positionLineNumber
,
s
.
positionColumn
)
));
cursors
=
prevSelection
.
map
(
s
=>
s
.
getPosition
(
));
const
snippetsRange
=
SnippetController2
.
get
(
editor
).
getSessionEnclosingRange
();
if
(
snippetsRange
)
{
for
(
let
lineNumber
=
snippetsRange
.
startLineNumber
;
lineNumber
<=
snippetsRange
.
endLineNumber
;
lineNumber
++
)
{
...
...
@@ -154,11 +154,26 @@ export class TrimFinalNewLinesParticipant implements ISaveParticipantParticipant
public
participate
(
model
:
ITextFileEditorModel
,
env
:
{
reason
:
SaveReason
}):
void
{
if
(
this
.
configurationService
.
getValue
(
'
files.trimFinalNewlines
'
,
{
overrideIdentifier
:
model
.
textEditorModel
.
getLanguageIdentifier
().
language
,
resource
:
model
.
getResource
()
}))
{
this
.
doTrimFinalNewLines
(
model
.
textEditorModel
);
this
.
doTrimFinalNewLines
(
model
.
textEditorModel
,
env
.
reason
===
SaveReason
.
AUTO
);
}
}
private
doTrimFinalNewLines
(
model
:
ITextModel
):
void
{
/**
* returns 0 if the entire file is empty or whitespace only
*/
private
findLastLineWithContent
(
model
:
ITextModel
):
number
{
for
(
let
lineNumber
=
model
.
getLineCount
();
lineNumber
>=
1
;
lineNumber
--
)
{
const
lineContent
=
model
.
getLineContent
(
lineNumber
);
if
(
strings
.
lastNonWhitespaceIndex
(
lineContent
)
!==
-
1
)
{
// this line has content
return
lineNumber
;
}
}
// no line has content
return
0
;
}
private
doTrimFinalNewLines
(
model
:
ITextModel
,
isAutoSaved
:
boolean
):
void
{
const
lineCount
=
model
.
getLineCount
();
// Do not insert new line if file does not end with new line
...
...
@@ -167,25 +182,30 @@ export class TrimFinalNewLinesParticipant implements ISaveParticipantParticipant
}
let
prevSelection
:
Selection
[]
=
[];
let
cannotTouchLineNumber
=
0
;
const
editor
=
findEditor
(
model
,
this
.
codeEditorService
);
if
(
editor
)
{
prevSelection
=
editor
.
getSelections
();
if
(
isAutoSaved
)
{
for
(
let
i
=
0
,
len
=
prevSelection
.
length
;
i
<
len
;
i
++
)
{
const
positionLineNumber
=
prevSelection
[
i
].
positionLineNumber
;
if
(
positionLineNumber
>
cannotTouchLineNumber
)
{
cannotTouchLineNumber
=
positionLineNumber
;
}
}
}
}
let
currentLineNumber
=
model
.
getLineCount
();
let
currentLine
=
model
.
getLineContent
(
currentLineNumber
);
let
currentLineIsEmptyOrWhitespace
=
strings
.
lastNonWhitespaceIndex
(
currentLine
)
===
-
1
;
while
(
currentLineIsEmptyOrWhitespace
)
{
currentLineNumber
--
;
currentLine
=
model
.
getLineContent
(
currentLineNumber
);
currentLineIsEmptyOrWhitespace
=
strings
.
lastNonWhitespaceIndex
(
currentLine
)
===
-
1
;
}
const
lastLineNumberWithContent
=
this
.
findLastLineWithContent
(
model
);
const
deleteFromLineNumber
=
Math
.
max
(
lastLineNumberWithContent
+
1
,
cannotTouchLineNumber
+
1
);
const
deletionRange
=
model
.
validateRange
(
new
Range
(
deleteFromLineNumber
,
1
,
lineCount
,
model
.
getLineMaxColumn
(
lineCount
)));
const
deletionRange
=
model
.
validateRange
(
new
Range
(
currentLineNumber
+
1
,
1
,
lineCount
+
1
,
1
));
if
(
!
deletionRange
.
isEmpty
())
{
model
.
pushEditOperations
(
prevSelection
,
[
EditOperation
.
delete
(
deletionRange
)],
edits
=>
prevSelection
);
if
(
deletionRange
.
isEmpty
())
{
return
;
}
model
.
pushEditOperations
(
prevSelection
,
[
EditOperation
.
delete
(
deletionRange
)],
edits
=>
prevSelection
);
if
(
editor
)
{
editor
.
setSelections
(
prevSelection
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录