Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
5c28e68b
V
vscode
项目概览
掘金者说
/
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,发现更多精彩内容 >>
提交
5c28e68b
编写于
7月 14, 2016
作者:
S
Sandeep Somavarapu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
move command - add more actions support
上级
84db2cb3
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
174 addition
and
54 deletion
+174
-54
src/vs/editor/common/config/config.ts
src/vs/editor/common/config/config.ts
+7
-4
src/vs/editor/common/controller/cursor.ts
src/vs/editor/common/controller/cursor.ts
+1
-1
src/vs/editor/common/controller/oneCursor.ts
src/vs/editor/common/controller/oneCursor.ts
+46
-35
src/vs/editor/common/editorCommon.ts
src/vs/editor/common/editorCommon.ts
+24
-2
src/vs/editor/test/common/controller/cursor.test.ts
src/vs/editor/test/common/controller/cursor.test.ts
+91
-10
src/vs/monaco.d.ts
src/vs/monaco.d.ts
+5
-2
未找到文件。
src/vs/editor/common/config/config.ts
浏览文件 @
5c28e68b
...
...
@@ -9,10 +9,12 @@ import {IEditorService} from 'vs/platform/editor/common/editor';
import
{
ServicesAccessor
}
from
'
vs/platform/instantiation/common/instantiation
'
;
import
{
IKeybindings
,
KbExpr
}
from
'
vs/platform/keybinding/common/keybinding
'
;
import
{
ICommandDescriptor
,
KeybindingsRegistry
}
from
'
vs/platform/keybinding/common/keybindingsRegistry
'
;
import
{
ICommandHandlerDescription
}
from
'
vs/platform/commands/common/commands
'
;
import
*
as
editorCommon
from
'
vs/editor/common/editorCommon
'
;
import
{
ICodeEditorService
}
from
'
vs/editor/common/services/codeEditorService
'
;
const
H
=
editorCommon
.
Handler
;
const
D
=
editorCommon
.
CommandDescription
;
export
function
findFocusedEditor
(
commandId
:
string
,
accessor
:
ServicesAccessor
,
complain
:
boolean
):
editorCommon
.
ICommonCodeEditor
{
let
editor
=
accessor
.
get
(
ICodeEditorService
).
getFocusedCodeEditor
();
...
...
@@ -54,17 +56,18 @@ function triggerEditorHandler(handlerId: string, accessor: ServicesAccessor, arg
});
}
function
registerCoreCommand
(
handlerId
:
string
,
kb
:
IKeybindings
,
weight
:
number
=
KeybindingsRegistry
.
WEIGHT
.
editorCore
(),
when
?:
KbExpr
):
void
{
function
registerCoreCommand
(
handlerId
:
string
,
kb
:
IKeybindings
,
weight
?:
number
,
when
?:
KbExpr
,
description
?:
ICommandHandlerDescription
):
void
{
let
desc
:
ICommandDescriptor
=
{
id
:
handlerId
,
handler
:
triggerEditorHandler
.
bind
(
null
,
handlerId
),
weight
:
weight
,
weight
:
weight
?
weight
:
KeybindingsRegistry
.
WEIGHT
.
editorCore
()
,
when
:
(
when
?
when
:
KbExpr
.
has
(
editorCommon
.
KEYBINDING_CONTEXT_EDITOR_TEXT_FOCUS
)),
primary
:
kb
.
primary
,
secondary
:
kb
.
secondary
,
win
:
kb
.
win
,
mac
:
kb
.
mac
,
linux
:
kb
.
linux
linux
:
kb
.
linux
,
description
:
description
};
KeybindingsRegistry
.
registerCommandDesc
(
desc
);
}
...
...
@@ -155,7 +158,7 @@ function getWordNavigationKB(shift:boolean, key:KeyCode): number {
// Control+Command+shift+d => noop
// Register cursor commands
registerCoreCommand
(
H
.
CursorMove
,
{
primary
:
null
});
registerCoreCommand
(
H
.
CursorMove
,
{
primary
:
null
}
,
null
,
null
,
D
.
CursorMove
);
registerCoreCommand
(
H
.
CursorLeft
,
{
primary
:
KeyCode
.
LeftArrow
,
...
...
src/vs/editor/common/controller/cursor.ts
浏览文件 @
5c28e68b
...
...
@@ -1129,7 +1129,7 @@ export class Cursor extends EventEmitter {
}
private
_move
(
inSelectionMode
:
boolean
,
ctx
:
IMultipleCursorOperationContext
):
boolean
{
return
this
.
_invokeForAll
(
ctx
,
(
cursorIndex
:
number
,
oneCursor
:
OneCursor
,
oneCtx
:
IOneCursorOperationContext
)
=>
OneCursorOp
.
move
(
oneCursor
,
inSelectionMode
,
ctx
.
eventData
.
viewPosition
,
ctx
.
eventSource
,
oneCtx
));
return
this
.
_invokeForAll
(
ctx
,
(
cursorIndex
:
number
,
oneCursor
:
OneCursor
,
oneCtx
:
IOneCursorOperationContext
)
=>
OneCursorOp
.
move
(
oneCursor
,
inSelectionMode
,
ctx
.
eventData
.
to
,
ctx
.
eventSource
,
oneCtx
));
}
private
_columnSelectToLineNumber
:
number
=
0
;
...
...
src/vs/editor/common/controller/oneCursor.ts
浏览文件 @
5c28e68b
...
...
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
'
use strict
'
;
import
{
onUnexpectedError
}
from
'
vs/base/common/errors
'
;
import
{
onUnexpectedError
,
illegalArgument
}
from
'
vs/base/common/errors
'
;
import
*
as
strings
from
'
vs/base/common/strings
'
;
import
types
=
require
(
'
vs/base/common/types
'
);
import
{
ReplaceCommand
,
ReplaceCommandWithOffsetCursorState
,
ReplaceCommandWithoutChangingPosition
}
from
'
vs/editor/common/commands/replaceCommand
'
;
...
...
@@ -552,6 +552,18 @@ export class OneCursor {
public
getViewLineMaxColumn
(
lineNumber
:
number
):
number
{
return
this
.
viewModelHelper
.
viewModel
.
getLineMaxColumn
(
lineNumber
);
}
public
getViewLineMinColumn
(
lineNumber
:
number
):
number
{
return
this
.
viewModelHelper
.
viewModel
.
getLineMinColumn
(
lineNumber
);
}
public
getViewLineCenterColumn
(
lineNumber
:
number
):
number
{
return
Math
.
round
((
this
.
getViewLineMaxColumn
(
lineNumber
)
+
this
.
getViewLineMinColumn
(
lineNumber
))
/
2
);
}
public
getViewLineFirstNonWhiteSpaceColumn
(
lineNumber
:
number
):
number
{
return
this
.
viewModelHelper
.
viewModel
.
getLineFirstNonWhitespaceColumn
(
lineNumber
);
}
public
getViewLineLastNonWhiteSpaceColumn
(
lineNumber
:
number
):
number
{
return
this
.
viewModelHelper
.
viewModel
.
getLineLastNonWhitespaceColumn
(
lineNumber
);
}
public
getLeftOfViewPosition
(
lineNumber
:
number
,
column
:
number
):
editorCommon
.
IPosition
{
return
this
.
helper
.
getLeftOfPosition
(
this
.
viewModelHelper
.
viewModel
,
lineNumber
,
column
);
}
...
...
@@ -567,12 +579,6 @@ export class OneCursor {
public
getColumnAtBeginningOfViewLine
(
lineNumber
:
number
,
column
:
number
):
number
{
return
this
.
helper
.
getColumnAtBeginningOfLine
(
this
.
viewModelHelper
.
viewModel
,
lineNumber
,
column
);
}
public
getViewLineMinColumn
(
lineNumber
:
number
):
number
{
return
this
.
viewModelHelper
.
viewModel
.
getLineMinColumn
(
lineNumber
);
}
public
getViewLineFirstNonWhiteSpaceColumn
(
lineNumber
:
number
):
number
{
return
this
.
viewModelHelper
.
viewModel
.
getLineFirstNonWhitespaceColumn
(
lineNumber
);
}
public
getColumnAtEndOfViewLine
(
lineNumber
:
number
,
column
:
number
):
number
{
return
this
.
helper
.
getColumnAtEndOfLine
(
this
.
viewModelHelper
.
viewModel
,
lineNumber
,
column
);
}
...
...
@@ -630,14 +636,12 @@ export class OneCursorOp {
}
public
static
move
(
cursor
:
OneCursor
,
inSelectionMode
:
boolean
,
to
:
editorCommon
.
IPosition
|
string
,
eventSource
:
string
,
ctx
:
IOneCursorOperationContext
):
boolean
{
if
(
!
to
)
{
illegalArgument
(
'
to
'
);
}
if
(
types
.
isString
(
to
))
{
switch
(
to
)
{
case
editorCommon
.
ViewPosition
.
FirstCharacterOfLine
:
return
this
.
moveToFirstColumnOfLine
(
cursor
,
inSelectionMode
,
ctx
);
case
editorCommon
.
ViewPosition
.
FirstNonWhiteSpaceCharacterOfLine
:
return
this
.
moveToFirstNonWhiteSpaceColumnOfLine
(
cursor
,
inSelectionMode
,
ctx
);
}
return
false
;
return
this
.
_move
(
cursor
,
inSelectionMode
,
to
,
ctx
);
}
let
viewPosition
:
editorCommon
.
IPosition
=
<
editorCommon
.
IPosition
>
to
;
...
...
@@ -645,7 +649,6 @@ export class OneCursorOp {
if
(
eventSource
===
'
api
'
)
{
ctx
.
shouldRevealVerticalInCenter
=
true
;
}
if
(
reason
)
{
ctx
.
cursorPositionChangeReason
=
reason
;
}
...
...
@@ -653,6 +656,34 @@ export class OneCursorOp {
return
true
;
}
private
static
_move
(
cursor
:
OneCursor
,
inSelectionMode
:
boolean
,
viewPosition
:
string
,
ctx
:
IOneCursorOperationContext
):
boolean
{
let
validatedViewPosition
=
cursor
.
getValidViewPosition
();
let
viewLineNumber
=
validatedViewPosition
.
lineNumber
;
let
viewColumn
;
switch
(
viewPosition
)
{
case
editorCommon
.
ViewPosition
.
LineStart
:
viewColumn
=
cursor
.
getViewLineMinColumn
(
viewLineNumber
);
break
;
case
editorCommon
.
ViewPosition
.
LineFirstNonWhitespaceCharacter
:
viewColumn
=
cursor
.
getViewLineFirstNonWhiteSpaceColumn
(
viewLineNumber
);
break
;
case
editorCommon
.
ViewPosition
.
LineCenter
:
viewColumn
=
cursor
.
getViewLineCenterColumn
(
viewLineNumber
);
break
;
case
editorCommon
.
ViewPosition
.
LineEnd
:
viewColumn
=
cursor
.
getViewLineMaxColumn
(
viewLineNumber
);
break
;
case
editorCommon
.
ViewPosition
.
LineLastNonWhitespaceCharacter
:
viewColumn
=
cursor
.
getViewLineLastNonWhiteSpaceColumn
(
viewLineNumber
);
break
;
default
:
return
false
;
}
ctx
.
cursorPositionChangeReason
=
editorCommon
.
CursorChangeReason
.
Explicit
;
cursor
.
moveViewPosition
(
inSelectionMode
,
viewLineNumber
,
viewColumn
,
0
,
true
);
return
true
;
}
private
static
_columnSelectOp
(
cursor
:
OneCursor
,
toViewLineNumber
:
number
,
toViewVisualColumn
:
number
):
IColumnSelectResult
{
let
viewStartSelection
=
cursor
.
getViewSelection
();
let
fromVisibleColumn
=
cursor
.
getViewVisibleColumnFromColumn
(
viewStartSelection
.
selectionStartLineNumber
,
viewStartSelection
.
selectionStartColumn
);
...
...
@@ -930,26 +961,6 @@ export class OneCursorOp {
return
true
;
}
public
static
moveToFirstColumnOfLine
(
cursor
:
OneCursor
,
inSelectionMode
:
boolean
,
ctx
:
IOneCursorOperationContext
):
boolean
{
let
validatedViewPosition
=
cursor
.
getValidViewPosition
();
let
viewLineNumber
=
validatedViewPosition
.
lineNumber
;
let
viewColumn
=
cursor
.
getViewLineMinColumn
(
viewLineNumber
);
ctx
.
cursorPositionChangeReason
=
editorCommon
.
CursorChangeReason
.
Explicit
;
cursor
.
moveViewPosition
(
inSelectionMode
,
viewLineNumber
,
viewColumn
,
0
,
true
);
return
true
;
}
public
static
moveToFirstNonWhiteSpaceColumnOfLine
(
cursor
:
OneCursor
,
inSelectionMode
:
boolean
,
ctx
:
IOneCursorOperationContext
):
boolean
{
let
validatedViewPosition
=
cursor
.
getValidViewPosition
();
let
viewLineNumber
=
validatedViewPosition
.
lineNumber
;
let
viewColumn
=
cursor
.
getViewLineFirstNonWhiteSpaceColumn
(
viewLineNumber
);
ctx
.
cursorPositionChangeReason
=
editorCommon
.
CursorChangeReason
.
Explicit
;
cursor
.
moveViewPosition
(
inSelectionMode
,
viewLineNumber
,
viewColumn
,
0
,
true
);
return
true
;
}
public
static
moveToEndOfLine
(
cursor
:
OneCursor
,
inSelectionMode
:
boolean
,
ctx
:
IOneCursorOperationContext
):
boolean
{
let
validatedViewPosition
=
cursor
.
getValidViewPosition
();
let
viewLineNumber
=
validatedViewPosition
.
lineNumber
;
...
...
src/vs/editor/common/editorCommon.ts
浏览文件 @
5c28e68b
...
...
@@ -4,9 +4,11 @@
*--------------------------------------------------------------------------------------------*/
'
use strict
'
;
import
nls
=
require
(
'
vs/nls
'
);
import
{
IAction
}
from
'
vs/base/common/actions
'
;
import
{
IEventEmitter
,
BulkListenerCallback
}
from
'
vs/base/common/eventEmitter
'
;
import
{
MarkedString
}
from
'
vs/base/common/htmlContent
'
;
import
types
=
require
(
'
vs/base/common/types
'
);
import
URI
from
'
vs/base/common/uri
'
;
import
{
TPromise
}
from
'
vs/base/common/winjs.base
'
;
import
{
IInstantiationService
,
IConstructorSignature1
,
IConstructorSignature2
}
from
'
vs/platform/instantiation/common/instantiation
'
;
...
...
@@ -19,6 +21,7 @@ import {Range} from 'vs/editor/common/core/range';
import
{
Selection
}
from
'
vs/editor/common/core/selection
'
;
import
{
ModeTransition
}
from
'
vs/editor/common/core/modeTransition
'
;
import
{
IndentRange
}
from
'
vs/editor/common/model/indentRanges
'
;
import
{
ICommandHandlerDescription
}
from
'
vs/platform/commands/common/commands
'
;
/**
* @internal
...
...
@@ -4167,8 +4170,27 @@ export var EventType = {
* Positions on the view
*/
export
const
ViewPosition
=
{
FirstCharacterOfLine
:
'
firstCharacterOfLine
'
,
FirstNonWhiteSpaceCharacterOfLine
:
'
firstNonWhiteSpaceCharacterOfLine
'
LineStart
:
'
lineStart
'
,
LineFirstNonWhitespaceCharacter
:
'
lineFirstNonWhitespaceCharacter
'
,
LineCenter
:
'
lineCenter
'
,
LineEnd
:
'
lineEnd
'
,
LineLastNonWhitespaceCharacter
:
'
lineLastNonWhitespaceCharacter
'
};
/**
* @internal
*/
export
var
CommandDescription
=
{
CursorMove
:
<
ICommandHandlerDescription
>
{
description
:
nls
.
localize
(
'
editorCommand.cursorMove.description
'
,
"
Move cursor to a logical position in the view
"
),
args
:
[
{
name
:
'
Logical position argument
'
,
description
:
nls
.
localize
(
'
editorCommand.cursorMove.arg.description
'
,
"
A logical position in the view
"
),
constraint
:
(
arg
)
=>
types
.
isObject
(
arg
)
&&
types
.
isString
(
arg
.
to
)
}
]
}
};
/**
...
...
src/vs/editor/test/common/controller/cursor.test.ts
浏览文件 @
5c28e68b
...
...
@@ -36,12 +36,28 @@ function move(cursor: Cursor, args: any) {
cursorCommand
(
cursor
,
H
.
CursorMove
,
args
);
}
function
moveTo
FirstCharacterOfLine
(
cursor
:
Cursor
)
{
move
(
cursor
,
{
viewPosition
:
ViewPosition
.
FirstCharacterOfLine
});
function
moveTo
LineStart
(
cursor
:
Cursor
)
{
move
(
cursor
,
{
to
:
ViewPosition
.
LineStart
});
}
function
moveToFirstNonWhiteSpaceCharacterOfLine
(
cursor
:
Cursor
)
{
move
(
cursor
,
{
viewPosition
:
ViewPosition
.
FirstNonWhiteSpaceCharacterOfLine
});
function
moveToLineFirstNonWhiteSpaceCharacter
(
cursor
:
Cursor
)
{
move
(
cursor
,
{
to
:
ViewPosition
.
LineFirstNonWhitespaceCharacter
});
}
function
moveToLineCenter
(
cursor
:
Cursor
)
{
move
(
cursor
,
{
to
:
ViewPosition
.
LineCenter
});
}
function
moveToLineEnd
(
cursor
:
Cursor
)
{
move
(
cursor
,
{
to
:
ViewPosition
.
LineEnd
});
}
function
moveToLineLastNonWhiteSpaceCharacter
(
cursor
:
Cursor
)
{
move
(
cursor
,
{
to
:
ViewPosition
.
LineLastNonWhitespaceCharacter
});
}
function
moveToPosition
(
cursor
:
Cursor
,
lineNumber
:
number
,
column
:
number
)
{
move
(
cursor
,
{
to
:
new
Position
(
lineNumber
,
column
)});
}
function
moveTo
(
cursor
:
Cursor
,
lineNumber
:
number
,
column
:
number
,
inSelectionMode
:
boolean
=
false
)
{
...
...
@@ -209,40 +225,105 @@ suite('Editor Controller - Cursor', () => {
test
(
'
move to first character of line from middle
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
8
);
moveTo
FirstCharacterOfLine
(
thisCursor
);
moveTo
LineStart
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
1
);
});
test
(
'
move to first character of line from first non white space character
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
6
);
moveTo
FirstCharacterOfLine
(
thisCursor
);
moveTo
LineStart
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
1
);
});
test
(
'
move to first character of line from first character
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
1
);
moveTo
FirstCharacterOfLine
(
thisCursor
);
moveTo
LineStart
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
1
);
});
test
(
'
move to first non white space character of line from middle
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
8
);
moveTo
FirstNonWhiteSpaceCharacterOfLine
(
thisCursor
);
moveTo
LineFirstNonWhiteSpaceCharacter
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
6
);
});
test
(
'
move to first non white space character of line from first non white space character
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
6
);
moveTo
FirstNonWhiteSpaceCharacterOfLine
(
thisCursor
);
moveTo
LineFirstNonWhiteSpaceCharacter
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
6
);
});
test
(
'
move to first non white space character of line from first character
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
1
);
moveTo
FirstNonWhiteSpaceCharacterOfLine
(
thisCursor
);
moveTo
LineFirstNonWhiteSpaceCharacter
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
6
);
});
test
(
'
move to end of line from middle
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
8
);
moveToLineEnd
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
LINE1
.
length
+
1
);
});
test
(
'
move to end of line from last non white space character
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
LINE1
.
length
-
1
);
moveToLineEnd
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
LINE1
.
length
+
1
);
});
test
(
'
move to end of line from line end
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
LINE1
.
length
+
1
);
moveToLineEnd
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
LINE1
.
length
+
1
);
});
test
(
'
move to last non white space character from middle
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
8
);
moveToLineLastNonWhiteSpaceCharacter
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
LINE1
.
length
-
1
);
});
test
(
'
move to last non white space character from last non white space character
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
LINE1
.
length
-
1
);
moveToLineLastNonWhiteSpaceCharacter
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
LINE1
.
length
-
1
);
});
test
(
'
move to last non white space character from line end
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
LINE1
.
length
+
1
);
moveToLineLastNonWhiteSpaceCharacter
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
LINE1
.
length
-
1
);
});
test
(
'
move to center of line not from center
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
8
);
moveToLineCenter
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
11
);
});
test
(
'
move to center of line from center
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
11
);
moveToLineCenter
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
11
);
});
test
(
'
move to center of line from start
'
,
()
=>
{
moveToLineStart
(
thisCursor
);
moveToLineCenter
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
11
);
});
test
(
'
move to center of line from end
'
,
()
=>
{
moveToLineEnd
(
thisCursor
);
moveToLineCenter
(
thisCursor
);
cursorEqual
(
thisCursor
,
1
,
11
);
});
test
(
'
move to position
'
,
()
=>
{
moveToPosition
(
thisCursor
,
3
,
10
);
cursorEqual
(
thisCursor
,
3
,
10
);
});
test
(
'
move
'
,
()
=>
{
moveTo
(
thisCursor
,
1
,
2
);
cursorEqual
(
thisCursor
,
1
,
2
);
...
...
src/vs/monaco.d.ts
浏览文件 @
5c28e68b
...
...
@@ -3188,8 +3188,11 @@ declare module monaco.editor {
* Positions on the view
*/
export
const
ViewPosition
:
{
FirstCharacterOfLine
:
string
;
FirstNonWhiteSpaceCharacterOfLine
:
string
;
LineStart
:
string
;
LineFirstNonWhitespaceCharacter
:
string
;
LineCenter
:
string
;
LineEnd
:
string
;
LineLastNonWhitespaceCharacter
:
string
;
};
/**
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录