此服务用于与 ScriptDocument 实例交互。
概要
方法
移除之前注册的回调,名称为 name 。
移除之前注册的回调,名称为 name 。
返回与指定 ScriptDocument 相对应的打开 LuaSourceContainer,或零,如果指定的脚本未打开。
返回给定脚本的编辑时间源。
包括命令栏在内的当前打开的脚本文档的阵列。
注册一个自动完成回调 callbackFunction 名为 name ,优先级为 priority。
注册一个名为 callbackFunction 的脚本分析回调 name 用于 priority 。
脚本编辑器打开指定的脚本。如果请求成功,返回 (真,零)。如果请求失败,则返回 (错误,字符串),并描述问题。
从旧脚本中生成新内容,或者更新脚本编辑器如果它打开,或者 Script 实例如果脚本编辑器已关闭。
活动
仅在 ScriptDocument 更改后发射。
在 ScriptDocument 对象被销毁之前,发射一些对象,这会发生在脚本编辑器关闭后不久。
发生在 ScriptDocument 对象创建后不久,这会在脚本编辑器打开后的几分钟内发生。
属性
方法
DeregisterAutocompleteCallback
移除之前注册的回调,名称为 name 。
参数
返回
代码示例
game.ScriptEditorService:DeregisterAutocompleteCallback("foo")
DeregisterScriptAnalysisCallback
移除之前注册的回调,名称为 name 。
参数
返回
代码示例
local ScriptEditorService = game:GetService("ScriptEditorService")
ScriptEditorService:DeregisterScriptAnalysisCallback("foo")
FindScriptDocument
返回与指定 ScriptDocument 相对应的打开 LuaSourceContainer,或零,如果指定的脚本未打开。
参数
返回
代码示例
--!nocheck
-- Run the following code in the Command Bar
local ScriptEditorService = game:GetService("ScriptEditorService")
local documents = ScriptEditorService:GetScriptDocuments()
local scriptDocument
-- Find the first open script document
for _, document in documents do
-- The Command Bar can't be closed, so don't select it
if not document:IsCommandBar() then
scriptDocument = document
break
end
end
if scriptDocument then
local success, err = scriptDocument:CloseAsync()
if success then
print(`Closed {scriptDocument.Name}`)
else
warn(`Failed to close {scriptDocument.Name} because: {err}`)
end
else
print("No open scripts")
end
--!nocheck
--[[
To run:
1. Ensure Output view is open
2. Run the below code in the Command Bar
3. Scroll up and down in the opened Script window
Print statements from the ViewportChanged event will appear in the Output
]]
local Workspace = game:GetService("Workspace")
local ScriptEditorService = game:GetService("ScriptEditorService")
-- Create text that spans many lines
local dummyText = string.rep("-- Dummy Text\n", 60)
-- Create a script containing the dummy text and open it
local otherScript = Instance.new("Script")
otherScript.Source = dummyText
otherScript.Parent = Workspace
local success, err = ScriptEditorService:OpenScriptDocumentAsync(otherScript)
if not success then
warn(`Failed to open script because: {err}`)
return
end
-- Get a reference to the opened script
local scriptDocument = ScriptEditorService:FindScriptDocument(otherScript)
local function onViewportChanged(startLine: number, endLine: number)
print(`Script Viewport Changed - startLine: {startLine}, endLine: {endLine}`)
end
-- Connect the ViewportChanged event to the function above that prints the start and end line of the updated viewport
scriptDocument.ViewportChanged:Connect(onViewportChanged)
GetEditorSource
返回给定脚本的编辑时间源。
如果脚本在 脚本编辑器 中打开,此方法将当前显示在编辑器中的文本返回给源。如果脚本在编辑器中未打开,该方法将返回编辑器中显示的文本。编辑时间源不总是与 Script.Source 属性一致。
参数
返回
GetScriptDocuments
包括命令栏在内的当前打开的脚本文档的阵列。
返回
代码示例
--!nocheck
-- Run the following code in the Command Bar
local ScriptEditorService = game:GetService("ScriptEditorService")
local scriptDocuments = ScriptEditorService:GetScriptDocuments()
for _, scriptDocument in scriptDocuments do
-- Prints the name of each script
if not scriptDocument:IsCommandBar() then
print(scriptDocument.Name)
end
end
RegisterAutocompleteCallback
注册一个自动完成回调 callbackFunction 名为 name ,优先级为 priority。
当脚本编辑器启用自动完成时,所有注册的自动完成回调都会按照上升的优先级顺序调用,与自动完成请求和回应。多个回调可能会共享优先级,但然后它们的调用顺序是不可预知的。每个回调都是否返回一个响应表以与响应输入表
调用函数 必须有以下输入:(Request: table, Response: table) -> table
请求表有以下格式:
type Request = {position: {line: number,character: number},textDocument: {document: ScriptDocument?,script: LuaSourceContainer?}}
- position 是您自动完成的一个索引位置。
- textDocument.document 是您正在完成的 ScriptDocument,如果它存在。
- textDocument.script 是您正在完成的,如果它存在。
如果 both textDocument.document 和 textDocument.script 都存在,那么它们相互对应: req.textDocument.document:GetScript() == req.textDocument.script
响应表有以下格式:
type Response = {items: {{label: string, -- The labelkind: Enum.CompletionItemKind?,tags: {Enum.CompletionItemTag}?,detail: string?,documentation: {value: string,}?,overloads: number?,learnMoreLink: string?,codeSample: string?,preselect: boolean?,textEdit: {newText: string,replace: { start: { line: number, character: number }, ["end"]: { line: number, character: number } },}?}}}
- Response.items 是一个完成物品的阵列。该阵列的顺序无关,它在编辑器中按用户类型而重置。
- Response.items[n].label 是显示在自动完成菜单中的物品标签。
- Response.items[n].kind 指定这是什么类型的自动完成项目。 主要控制图像在编辑器中提供给项目的图标。 不支持的种类有默认的图标志。 如果未指定,编辑器将显示“属性”标志。
- Response.items[n].tags 指定一个描述此完成物品的标签阵列。见Enum.CompletionItemTag 了解其功能。
- Response.items[n].details 指定一个描述完成物品详细信息的字符串。对于默认物品,这是对其输入的字符串表示。注意,为了让文档 widget 显示,documentation 必须存在,但 documentation.value 可能为空。
- Response.items[n].documentation 指定了文档的主要内容在其 value 字段。documentation 已存在,即使值为空,文档窗口仍会显示,因为有细节或超载指定。
- Response.items[n].overloads 指定函数自动完成的过载数量。
- Response.items[n].learnMoreLink 链接到创建者文档上的相关页面。此 URL 必须是 https 请求创创建 or 创作 roblox.com 的所有其他 URL 都不会在编辑器中显示。
- Response.items[n].codeSample 指定一个完成物品的示例使用。documentation 必须为空才能显示此字段。
- Response.items[n].preselect 如果是,编辑器将此完成物品排序在所有其他物品之前,默认为用户选择。如果是假或丢失,无效。
- Response.items[n].textEdit 如果存在,接受完成将适用此文本编辑 - 替换位置开始和结束之间的空格以新的文本。
如果调用返回不正确的结果或遇到错误,编辑器将丢弃已修改的响应表,并使用内置自动完成结果列表。
参数
返回
代码示例
--!nocheck
-- Run the following code in the Command Bar
local ScriptEditorService = game:GetService("ScriptEditorService")
type Request = {
position: {
line: number,
character: number,
},
textDocument: {
document: ScriptDocument?,
script: LuaSourceContainer?,
},
}
type Response = {
items: {
{
label: string,
kind: Enum.CompletionItemKind?,
tags: { Enum.CompletionItemTag }?,
detail: string?,
documentation: {
value: string,
}?,
overloads: number?,
learnMoreLink: string?,
codeSample: string?,
preselect: boolean?,
textEdit: {
newText: string,
replace: {
start: { line: number, character: number },
["end"]: { line: number, character: number },
},
}?,
}
},
}
local autocompleteCallback = function(request: Request, response: Response): Response
local item = {
label = "foo",
preselect = true,
}
table.insert(response.items, item)
return response
end
ScriptEditorService:RegisterAutocompleteCallback("foo", 1, autocompleteCallback)
-- To deregister the callback, run the following code in the Command Bar
ScriptEditorService:DeregisterAutocompleteCallback("foo")
RegisterScriptAnalysisCallback
注册一个名为 name 的脚本分析回调 priority ,并且在 priority 下调用。 Studio 中的脚本分析在运行时会调用所有注册的回调。 每个回调都必须返回下列格式的表。 回调不应返回。
请求表有以下格式,其中 script 是要分析的 LuaSourceContainer。
type Request = {script: LuaSourceContainer?}
答应表有以下格式,其中 diagnostics 是一个用于诊断的表阵列。每个诊断表都有以下列表。
type Response = {diagnostics: {{range: {start: {line: number,character: number,},["end"]: {line: number,character: number,}},code: string?,message: string,severity: Enum.Severity?,codeDescription: { href: string }?}}}
- range 代表一个文本范围,该范围应该被插件高亮,提供要开始高亮的线/角色和要停止高亮的线/角色。
- code 是对消信息的标签。
- message 是对线的警告消息。当用户将鼠标悬停在线上时,警告消息也会在工具提示上显示。
- severity 是诊断的Enum.Severity 值。这确定诊断在 Studio 中的脚本分析工具中的分类,以及文本在脚本编辑器中的显示。
- codeDescription 链接到创建者文档上的相关页面。此链接必须是一个 https 请求到 create.roblox.com ;不显示其他 URL 在编辑器中。
参数
返回
代码示例
type Request = {
["script"]: LuaSourceContainer,
}
type Response = {
diagnostics: {
{
range: {
start: {
line: number,
character: number,
},
["end"]: {
line: number,
character: number,
}
},
code: string?,
message: string,
severity: Enum.Severity?,
codeDescription: { href: string }?,
}
}
}
local ScriptEditorService = game:GetService("ScriptEditorService")
ScriptEditorService:RegisterScriptAnalysisCallback("foo", 1, function(
Req : Request): Response
local response = {
diagnostics = {}
}
local lineNo = 1
-- Iterate line by line
for text, newline in Req.script.Source:gmatch("([^\r\n]*)([\r\n]*)") do
local startIndex, endIndex = string.find(text, "Foo")
if startIndex and endIndex then
table.insert(response.diagnostics, {
range = {
["start"] = {
line = lineNo,
character = startIndex,
},
["end"] = {
line = lineNo,
character = endIndex,
},
},
code = "FooFinder",
message = "Foo found here!",
severity = Enum.Severity.Warning,
})
end
lineNo = lineNo + #newline:gsub("\n+", "\0%0\0"):gsub(".%z.", "."):gsub("%z", "")
end
return response
end)
OpenScriptDocumentAsync
脚本编辑器打开指定的脚本。如果请求成功,返回 (真,零)。如果请求失败,则返回 (错误,字符串),并描述问题。
如果脚本已经打开,这个函数成功并将标签切换到关联的编辑器。
参数
返回
代码示例
--!nocheck
-- Run the following code in the Command Bar
local ScriptEditorService = game:GetService("ScriptEditorService")
local Workspace = game:GetService("Workspace")
local newScript = Instance.new("Script")
newScript.Parent = Workspace
local success, err = ScriptEditorService:OpenScriptDocumentAsync(newScript)
if success then
print("Opened script document")
else
print(`Failed to open script document: {err}`)
end
UpdateSourceAsync
为指定的脚本返回 Script.Source 的编辑时间。
此函数使用脚本的旧内容调用传回调用,计算新内容。
如果脚本在 脚本编辑器 中打开,它会向编辑器发出更新源的请求。如果编辑器的 Script.Source 属性与用户版本的脚本不兼容,那么调用此函数时,调用回调会重新调用,试图重新尝试。
调用可能不会返回。如果调用返回 nil,操作已取消。此函数在成功或取消操作之前返回。
如果脚本在编辑器中未打开,新内容将更新到脚本源,这是编辑器打开时显示的文本。
local ses = game:GetService('ScriptEditorService')
ses:UpdateSourceAsync(Workspace.Script, function(oldContent)
return oldContent .. " World!"
end)
参数
要更新的脚本实例。
返回新脚本内容的函数。
返回
活动
TextDocumentDidChange
在 ScriptDocument 更改后立即发生。 textChanged 是格式的更改结构阵列:
{ range : { start : { line : number, character : number }, end : { line : number, character : number } }, text: string }
参数
代码示例
--!nocheck
-- Run the following code in the Command Bar
local ScriptEditorService = game:GetService("ScriptEditorService")
ScriptEditorService.TextDocumentDidChange:Connect(function(scriptDocument, changes)
print("Changed", scriptDocument, changes)
end)
TextDocumentDidClose
在 ScriptDocument 对象被销毁之前,发生在脚本编辑器关闭后,这是脚本编辑器的“关闭”状态。在此事件之后, ScriptDocument 进入一个 “已关闭” 状态,试图调用其方法会发生错误。 ScriptDocument 对象不可重用,即使脚本编辑器重新打开相同
参数
代码示例
--!nocheck
-- Run the following code in the Command Bar
local ScriptEditorService = game:GetService("ScriptEditorService")
ScriptEditorService.TextDocumentDidClose:Connect(function(scriptDocument)
print("Closed", scriptDocument)
end)
TextDocumentDidOpen
发生在 ScriptDocument 对象创建后不久,这会在脚本编辑器打开后的几分钟内发生。
参数
代码示例
--!nocheck
-- Run the following code in the Command Bar
local ScriptEditorService = game:GetService("ScriptEditorService")
ScriptEditorService.TextDocumentDidOpen:Connect(function(scriptDocument)
print("Opened", scriptDocument)
end)