Class.ScriptDocument 實例是 Studio 指令碼編輯器的代理。它與編輯器中開啟的 LuaSourceContainer 不同,代表開啟文件的暫時狀態,並且其代表格式比執行程式碼更適合閱
Class.ScriptDocument 的內容在不同的線程上,因此 ScriptDocument 的複製會重複開啟的 ScriptDocument 編輯器,但它不是開啟的編輯器。因為重複,有時候在編輯器中變更文字
Class.ScriptDocument 的存在表示一個文件在 ScriptDocument 中開啟。所有 ScriptEditorService 的實例都有 1>Class.ScriptEditorService1> 作為其父元素級。每個實例都遵守以下裝飾約定:
- Class.ScriptDocument 中的所有文字都為 UTF-8 編碼。
- 所有線索索引都是 1 索引。
- 所有角色索引都是 1 索引,並且估計 UTF-8 位元,不是圖形,因此 TextBox.CursorPosition 的警告適用:很多 UTF-8 字元超過一個位元。
- 所有範圍都包含其起始位置和其終止位置,因此開始 == 終止即表示為空範圍。
Class.ScriptDocument 的所有 API 都位於 插件 的安全層級。
概要
方法
返回指定的行的文字。當沒有提供參數時,會返回當前曲標位置的行。
返回文件中的行數。
如果存在,返回底部的 LuaSourceContainer 實個體、實例,否則 nil。
如果沒有選擇,取得編輯器中選擇的文字或是空白字串。
返回 Script Editor 的最後一個選擇以格式:CursorLine, CursorChar, AnchorLine, AnchorChar。如果 Script Editor 沒有選擇,CursorLine == AnchorLine 和 CursorChar == AnchorChar 。
取得鼠標位置和固定的大小。如果編輯器沒有選擇,它們是相同的值。
取得鼠標位置和固定的更小。如果編輯器沒有選擇,它們是相同的值。
- GetText(startLine : number?,startCharacter : number?,endLine : number?,endCharacter : number?):string
從開啟編輯器中返回文字。
在編輯器變更中顯示當前顯示的行數。
返回編輯器是否選擇任何文字。
如果 ScriptDocument 代表指令欄,則返回 true。
與此文件關聯的編輯器關閉。在編輯器回應要邀請之前,輸出目前的線程。
- EditTextAsync(newText : string,startLine : number,startCharacter : number,endLine : number,endCharacter : number):Tuple
將文字從指定範圍內的文字從 ( startLine , startColumn ) 到 ( endLine , 1> endColumn1> ) 用新文字替換。
- ForceSetSelectionAsync(cursorLine : number,cursorCharacter : number,anchorLine : number?,anchorCharacter : number?):Tuple
請求編輯器將鼠標選擇設定為參數值。
- RequestSetSelectionAsync(cursorLine : number,cursorCharacter : number,anchorLine : number?,anchorCharacter : number?):Tuple
請求編輯器將鼠標選擇設定為參數值。
活動
- SelectionChanged(positionLine : number,positionCharacter : number,anchorLine : number,anchorCharacter : number):RBXScriptSignal
ScriptDocument 變更時會發生火災,包括在即時文字變更後。
在編輯器中顯示的行數字改變時發射。
屬性
方法
GetLine
返回指定的行的文字。當沒有提供參數時,會返回當前曲標位置的行。
參數
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
scriptDocument.SelectionChanged:Connect(function(positionLine, positionCharacter, anchorLine, anchorCharacter)
print(`Selected: Line {positionLine}, Char {positionCharacter}`)
print(`Anchor: Line {anchorLine}, Char {anchorCharacter}`)
local lineText = scriptDocument:GetLine(positionLine)
print(`Selected line text: {lineText}`)
end)
else
print("No scripts open")
end
GetLineCount
返回啟用的文件的行數。
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
local lineCount = scriptDocument:GetLineCount()
print(`The script has {lineCount} lines!`)
else
print("No scripts open")
end
GetScript
如果存在,返回底部的 LuaSourceContainer 實個體、實例,否則 nil。
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
local openScript = scriptDocument:GetScript()
print(`Currently open script: {openScript:GetFullName()}`)
else
print("No scripts open")
end
GetSelectedText
如果沒有選擇,取得編輯器中選擇的文字或是空白字串。
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
scriptDocument.SelectionChanged:Connect(function()
if scriptDocument:HasSelectedText() then
local selectedText = scriptDocument:GetSelectedText()
print(`Currently selected text: {selectedText}`)
else
print("No text currently selected")
end
end)
else
print("No scripts open")
end
GetSelection
返回 Script Editor 的最後一個選擇以格式:CursorLine, CursorChar, AnchorLine, AnchorChar。如果 Script Editor 沒有選擇,CursorLine == AnchorLine 和 CursorChar == AnchorChar 。
返回
鼠標線、鼠標字、錨線、錨字。
GetSelectionEnd
取得鼠標位置和固定的大小。如果編輯器沒有選擇,它們是相同的值。
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
local startLine, startCharacter = scriptDocument:GetSelectionStart()
local endLine, endCharacter = scriptDocument:GetSelectionEnd()
print(`Selection start: Line {startLine}, Char {startCharacter}`)
print(`Selection end: Line {endLine}, Char {endCharacter}`)
else
print("No scripts open")
end
GetSelectionStart
取得鼠標位置和固定的更小。如果編輯器沒有選擇,它們是相同的值。
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
local startLine, startCharacter = scriptDocument:GetSelectionStart()
local endLine, endCharacter = scriptDocument:GetSelectionEnd()
print(`Selection start: Line {startLine}, Char {startCharacter}`)
print(`Selection end: Line {endLine}, Char {endCharacter}`)
else
print("No scripts open")
end
GetText
從開啟編輯器中返回文字。必須使用 0、2 或 4 參數來呼叫:
- 如果有 0 個參數,取得開啟編輯器的內容。
- 如果呼叫 2 個參數,將文件的內容從 ( startLine 開始。 如果呼叫 2 個參數,將文件的內容從 ( startColumn 開始。
- 如果呼叫 4 個參數,取得文件開始於 ( startLine , startColumn ) 並結束於 ( endLine , 1> endColumn1> )。
參數
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
local text = scriptDocument:GetText()
print(`Script contents: {text}`)
else
print("No scripts open")
end
GetViewport
返回編輯器變更中顯示的行數。編輯器會顯示開始線和終線線之間的行數,包括。第一行和最後行可能只會顯示部分。例如,最後一行的上一個像素可能會顯示在屏幕上。此外,代碼折疊可能會在開始線和終線線之間顯示行數。
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
local firstLine, lastLine = scriptDocument:GetViewport()
print(`Currently viewing lines {firstLine} to {lastLine}`)
else
print("No scripts open")
end
HasSelectedText
返回編輯器是否選擇任何文字。
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
scriptDocument.SelectionChanged:Connect(function()
if scriptDocument:HasSelectedText() then
local selectedText = scriptDocument:GetSelectedText()
print(`Currently selected text: {selectedText}`)
else
print("No text currently selected")
end
end)
else
print("No scripts open")
end
IsCommandBar
如果 ScriptDocument 代表指令欄,則返回 true。指令欄有特殊規則和限制:
- Studio 在執行插件之前會創建指令欄,因此它不會總是發射開啟的事件,雖然它會關閉並重新開啟,當 Studio 切換到資料模型之間。
- 因安全原因,您無法使用 EditTextAsync 編輯指令列。
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar
local ScriptEditorService = game:GetService("ScriptEditorService")
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if document:IsCommandBar() then
print("Command bar document:", document)
end
end
CloseAsync
與此文件關聯的編輯器關閉。 輸出現有線程直到編輯器回應要邀請。 如果功能成功,它將返回 (真, 零)。 如果功能失敗, 它將返回 (真, 字串) 作為問題的說明。
此功能無法關閉指令欄。
返回
範例程式碼
--!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
EditTextAsync
將文字從 ( startLine 到 ( startColumn ) 變更為 ( endLine ,1> endColumn1> 內的編輯
如果功能成功,它將返回 ( true , nil )。
如果發生以下情況,則該函數會發生錯誤:
- 範圍無效。
- 範圍將會截取一個不符號字元,例如只截取一些不符號字元的字元。
- newText 本身包含無效的 UTF-8。
如果函數失敗,它將返回 (false, 字符字串). 字符串是描述問題的說明。最常見的失敗類型是版本不符。發生這種情況是因為你嘗試在 ScriptDocument 與內容編輯器的內容之間的時間奧버沒合。如果發生此情況,您可以重試編輯。
參數
返回
ForceSetSelectionAsync
請編輯器將其鼠標選擇設定為參數值。 兩個錨定參數必須都傳送,或者不。 如果沒有傳送,則會以相應的鼠標選擇值預設引數。 編輯器可能會拒絕更新其鼠標,如果文件的文
參數
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
-- Get the text on the cursor's current line
local cursorLine = scriptDocument:GetSelection()
local lineText = scriptDocument:GetLine(cursorLine)
-- Force select the entire line of text
local success, err = scriptDocument:ForceSetSelectionAsync(cursorLine, 1, cursorLine, #lineText + 1)
if success then
print("Set selection!")
else
print(`Failed to set selection because: {err}`)
end
else
print("No scripts open")
end
RequestSetSelectionAsync
請求編輯器將鼠標選擇設定為參數值。兩個錨定參數必須傳送,或不。 如果沒有傳送,則必須傳送相同的參數引數。 編輯器可能會拒絕更新其鼠標,如果文件的文字內容已變更,或者它已移動自從要求以來。 如果沒有傳送,則會返回 (true, 字串il
參數
返回
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
-- Get the text on the cursor's current line
local cursorLine = scriptDocument:GetSelection()
local lineText = scriptDocument:GetLine(cursorLine)
-- Force select the entire line of text
local success, err = scriptDocument:RequestSetSelectionAsync(cursorLine, 1, cursorLine, #lineText + 1)
if success then
print("Set selection!")
else
print(`Failed to set selection because: {err}`)
end
else
print("No scripts open")
end
活動
SelectionChanged
ScriptDocument 變更時會發生火災,包括在即時文字變更後。
參數
範例程式碼
--!nocheck
-- Run the following code in the Command Bar while a script is open
local ScriptEditorService = game:GetService("ScriptEditorService")
local function getFirstOpenDocument()
local documents = ScriptEditorService:GetScriptDocuments()
for _, document in documents do
if not document:IsCommandBar() then
return document
end
end
return nil
end
local scriptDocument = getFirstOpenDocument()
if scriptDocument then
scriptDocument.SelectionChanged:Connect(function(positionLine, positionCharacter, anchorLine, anchorCharacter)
print(`Selected: Line {positionLine}, Char {positionCharacter}`)
print(`Anchor: Line {anchorLine}, Char {anchorCharacter}`)
local lineText = scriptDocument:GetLine(positionLine)
print(`Selected line text: {lineText}`)
end)
else
print("No scripts open")
end
ViewportChanged
發生在編輯器中顯示的線路數字改變時。請參閱 ScriptDocument.GetViewport 了解詳情。
參數
範例程式碼
--!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)