This page contains a detailed description of the finenv
functions and properties that are available in the Finale Lua
environment.
(Items with an asterisk are available in RGP Lua but not JW Lua.)
Returns true if there is a console available for print()
statements. Scripts that run from the Finale menu do not have a console.
RGP Lua returns this value as true
if the script
was launched by finenv.ExecuteLuaScriptItem
and a print
function has been registered for the FCLuaScriptItem
.
Otherwise it returns false.
Example:
if finenv.ConsoleIsAvailable then
print("Hello World")
else
finenv.UI():AlertInfo("Hello World", "")
end
Returns an instance of FCLuaScriptItems
containing a
collection of every menu item configured for the current running
instance of RGP Lua. You can execute these items from within
your script, and they will behave as if you had selected them from the
menu. More information can be found at FCLuaScriptItem
.
You do not have to maintain your reference to the collection for the
executed script(s) to keep running, nor does your script have to keep
running. Invoking these items is launch-and-forget.
(none)
FCLuaScriptItems
: A collection of all configured menu
items in the current running instance of RGP LuaExample:
local configured_items = finenv.CreateLuaScriptItems()
Returns an instance of FCLuaScriptItems
that can be used
to launch ad-hoc scripts. The input is a string containing the fully
qualified path to the script file.
string1
: [optional] A Lua string containing the fully
qualified path to the script file. If this parameter is omitted, it
still creates a collection with one item. You can then supply the Lua
code with the item’s SetOptionalScriptText
method.string2
: [optional] A Lua string containing the Lua
code to execute. If this parameter is provided, the contents of the
fully qualified path are ignored, though RGP Lua will continue to use
the path for display and security purposes.FCLuaScriptItems
: A collection of menu items defined
in the script.The returned collection includes one item for the script file and one
item for each additional menu item specified in the
plugindef
function, if it has any. The items are also
initialized with other properties from the plugindef
function as appropriate, but you may modify them.
Example:
local script_items = finenv.CreateLuaScriptItemsFromFilePath("/Users/Me/MyScripts/script.lua")
See comments about executing ad-hoc scripts below.
Returns the setting of “Enable Debugging” in RGP Lua’s configuration dialog. You could use this to add debug-only code to your script.
Example:
if finenv.DebugEnabled then
-- print data to log
end
If this property is true, it signifies that the
luaosutils
library is embedded in this version of RGP
Lua and can be successfully accessed with a require
statement. You are also guaranteed that the minimum version of the
embedded luaosutils
is 2.2.0
.
local luaosutils = finenv.EmbeddedLuaOSUtils and require('luaosutils')
Ends the currently active Undo/Redo block in Finale (if any). Finale
will only store Undo/Redo blocks that contain edit changes to the
documents. These calls cannot be nested. If your script will make
further changes to the document after this call, it should call
StartNewUndoBlock()
again before making them. Otherwise,
Finale’s Undo stack could become corrupted.
boolean
: The current Undo/Redo block should be stored
(=true) or canceled (=false).(none)
Example
-- false: discards any changes that have been made
finenv.EndUndoBlock(false)
Accepts an instance of FCLuaScriptItem
and launches it in a separate Lua state. If the item is an ad-hoc script
(created with CreateLuaScriptItemsFromFilePath),
you must maintain your reference to the script item until the ad-hoc
script terminates. If you allow your reference to be garbage collected,
or if your script terminates, the separate executing ad-hoc script
terminates immediately. The function returns either a single value or
three values if the executed item returns a message.
boolean
: true if successstring
: the returned message in a Lua string or
nil
if nonenumber
: one of the
finenv.MessageResultType
constants if there is a message or
nil
if none|If the boolean return value is false
(i.e., an
error occurred), the message is an error message that describes the
error. If the return value true
, the message is the first
returned value from the executed script converted to a string. If the
executed script returns nothing or nil
, the message and
message type are both nil
.
Example:
local scripts = finenv.CreateLuaScriptItems()
local success, error_msg, msg_type = finenv.ExecuteLuaScriptItem(scripts:GetItemAt(0))
A script cannot execute itself from the list returned by CreateLuaScriptItems. If you
attempt it, ExecuteLuaScriptItem
returns an error message
and takes no other action.
Ad hoc scripts (those created with
CreateLuaScriptItemsFromFilePath
) cannot run in trusted
mode. Configured scripts (those created with
CreateLuaScriptItems
) run in trusted mode if they are
configured to run in trused mode.
Returns the running Finale “year” version, such as 2011, 2012, etc. For Finale 25 and later, JW Lua returns this value as 9999. However, RGP Lua (starting with v0.56) returns the major version + 10000. So Finale 25 returns 10025, Finale 26 returns 10026, etc.
Example:
if finenv.FinaleVersion > 10025 then
-- Finale 26+ feature implemented here
end
Returns an opaque handle to the main Finale window (Windows) or
nil
(macOS). This can be used to pass to functions in
luaosutils.menu
for manipulating Finale’s menus. To Lua it
looks like light userdata.
local menu = require("luaosutils").menu
local finale_menu = menu.get_top_level_menu(finenv.GetFinaleMainWindow())
Returns a string containing the plugindef
function that
RGP Lua parsed out of the script file. You can use this for
diagnostic purposes if you think your plugindef
function is
not being parsed correctly.
local parsed_plugindef = finenv.GetPluginDefFunction()
-- You can now inspect parsed_plugindef to see what RGP Lua parsed from your script.
Returns true
if the version of Finale that is currently
running is the demo version that cannot save or print. (Available
starting in version 0.67 of RGP Lua.)
Example:
if finenv.IsFinaleDemo then
-- take some action based on the fact that Finale cannot save or print.
end
Always returns true
in RGP Lua. In JW
Lua it returns nil
, which is syntactically the
equivalent of false
in nearly every situation.
Example:
if finenv.IsRGPLua then
-- do something available only in RGP Lua
end
Boolean function that should always return true
. This
value is primarily useful as a diagnostic tool for testing RGP
Lua. It proves that the plugin can find a running script from its
Lua state, even if that Lua state is a coroutine state. Normal scripts
probably never need to access this function.
A read-only property that returns the setting of “Load As String”,
either from RGP Lua’s configuration dialog or from the
plugindef()
function, whichever is in effect.
Example:
if finenv.LoadedAsString then
-- read binary data from the end of the script file
end
Returns a string with the current version of LuaBridge that is embedded in RGP Lua. LuaBridge is an open-source C++ library that allows a C++ program to import classes from a C++ class framework into Lua. This property exists for diagnostic purposes and is probably not of interest to general users of the plugin.
Returns a string containing the full release version of the embedded Lua, including the minor update version.
print(finenv.LuaReleaseVersion)
-- prints "Lua 5.4.6" or whatever the current value is
Return the major version number of the running Lua plugin. (Either RGP Lua or JW Lua.)
Example:
if finenv.MajorVersion > 0 or finenv.MinorVersion > 54 then
-- RGP Lua v0.55+ feature implemented here
end
A list of constants that define the type of message returned by
finenv.ExecuteLuaScriptItem
(if any).
SCRIPT_RESULT
: The message was returned by the Lua
script. This is not an error message.DOCUMENT_REQUIRED
: The script was not executed because
it specified finaleplugin.RequireDocument = true
but no
document was open.SELECTION_REQUIRED
: The script was not executed
because it specified finaleplugin.RequireSelection = true
but there was no selection.SCORE_REQUIRED
: The script was not executed because it
specified finaleplugin.RequireScore = true
but the document
was viewing a part.FINALE_VERSION_MISMATCH
: The script was not executed
because it specified a minimum or maximum Finale version and the current
running version of Finale does not meet the requirement.LUA_PLUGIN_VERSION_MISMATCH
: The script was not
executed because it specified a minimum or maximum Lua plugin version
and the current running version of RGP Lua does not meet the
requirement.MISCELLANEOUS
: Other types of error messages that do
not fit any of the other categories.EXTERNAL_TERMINATION
: The script was externally
terminated by the user or a controlling script.LUA_ERROR
: The message is an error message returned by
Lua.Example:
local scripts = finenv.CreateLuaScriptItems()
local success, error_msg, msg_type = finenv.ExecuteLuaScriptItem(scripts:GetItemAt(0))
if not success then
if msg_type == finenv.MessageResultType.LUA_ERROR then
-- take some action
end
end
Returns the minor version number of the running Lua plugin. (Either RGP Lua or JW Lua.)
Example:
if finenv.MajorVersion > 0 or finenv.MinorVersion > 54 then
-- RGP Lua v0.55+ feature implemented here
end
A function that returns true
if the script is currently
running at Finale startup. You can request your script to run at startup
with finaleplugin.ExecuteAtStartup = true
in your
plugindef
function.
boolean
: True if Finale startup in progress.Example:
if finenv.QueryInitializationInProgress() then
-- execute expensive global variable initialization here
finenv.RetainLuaState = true -- retain their values so that it only happens once
return
end
A function that returns true
if the input modifier
key(s) were pressed when the menu item was invoked that started the
script. The input value is any combination of COMMAND_MOD_KEYS.
You can create combinations by adding together the key codes.
number
: The modifier key combination to check.boolean
: True if all of the specified modifier keys
were pressed.Example:
-- end the Lua session if both alt/option and shift are pressed when the menu is invoked.
if finenv.QueryInvokedModifierKeys(finale.CMDMODKEY_ALT + finale.CMDMODKEY_SHIFT) then
finenv.RetainLuaState = false
return
end
Returns the full running Finale version number. It is constructed as 4 bytes with different version info. The highest byte is the major version, the next nybble is subversion, etc. Use this only if you need the revision number of a specific major Finale version.
Example:
if finenv.RawFinaleVersion >= 0x1b200000 then
-- Finale 27.2+ feature implemented here
end
Returns an object with the currently selected region (in the document/part currently in editing scope), without the need for any other method calls. When running a modeless dialog in RGP Lua, this value is reinitialized to the current selected region every time you call the function. This could have side-effects if you have assigned it to a Lua variable, because the assigned variable will change as well.
(none)
FCMusicRegion
: The region currently selected in
Finale. (Empty if none.)Example:
local sel_rgn = finenv.Region() -- get the current selected region
if not sel_rgn:IsEmpty() then
-- do something
end
It is important to note that in the example above, any change you
make to sel_rgn
will also be reflected in
finenv.Region()
, unless running a modeless dialog. (See
above comment.) If you need to modify the selected region, perhaps a
safer method is to create a separate instance of
FCMusicRegion
as follows:
local sel_rgn = finale.FCMusicRegion()
if sel_rgn:SetCurrentSelection() then
-- do something that modifies sel_rgn
-- finenv.Region() is unaffected
end
Registers a newly created FCCustomLuaWindow
dialog box with RGP Lua so that you can then display it as a
modeless window with ShowModeless
.
You can register more than one dialog. The script terminates when all
its modeless windows close unless
finenv.RetainLuaState = true
is specified.
FCCustomLuaWindow
: The window to register.(none)
Example:
local dialog = finale.FCCustomLuaWindow()
-- add some controls to the window
finenv.RegisterModelessDialog(dialog)
dialog:ShowModeless()
A writable property that starts out as false
in RGP
Lua. If a script sets the value to true
before
exiting, the next time it is invoked it receives the same Lua state as
before, including all global variables, required modules, etc. If there
is an error, the Lua state is not retained, regardless of the setting. A
script can change the value back to false
at any time if it
needs a fresh Lua state on the next invocation.
Example:
global_var = global_var or initialize_global()
finenv.RetainLuaState = true -- retain the global_var we just created
Returns a Lua string containing the full path and filename of the
current running script. Scripts written for RGP Lua should
always use this instead of FCString::SetRunningLuaFilePath
.
The FCString
method depends on a global varible and is not
reliable past the initial execution of the script. It exists only for
backwards compatibility with older scripts.
(none)
string
: A Lua string containing the path.Example:
local my_path = finenv.RunningLuaFilePath()
A function that returns a Lua string containing the full folder path
of the current running script. Scripts written for RGP Lua
should always use this instead of
FCString::SetRunningLuaFolderPath
. The
FCString
method depends on a global varible and is not
reliable past the initial execution of the script. It exists only for
backwards compatibility with older scripts.
(none)
string
: A Lua string containing the path.Example:
local my_path = finenv.RunningLuaFolderPath()
Ends the currently active Undo/Redo block in Finale (if any) and
starts a new one with new undo text. The first parameter (a Lua string)
is the name of the new Undo/Redo block. The second parameter (optional,
default is true) is a boolean, indicating if the edits in the previous
Undo/Redo block should be stored (=true) or canceled (=false). Finale
will only store Undo/Redo blocks that contain edit changes to the
documents. These calls cannot be nested. If your script has set
finaleplugin.NoStore = true
, then this function has no
effect and any changes to the document are rolled back.
string
: The name of the new Undo/Redo block.boolean
: The previous Undo/Redo block should be stored
(=true) or canceled (=false).(none)
Example:
-- "Merge Layers": starts a new undo/redo block called "Merge Layers"
-- true: saves any prior changes
finenv.StartNewUndoBlock("Merge Layers", true)
Returns the full RGP Lua or JW Lua version. This
string can potentially contain non-numeric characters, but normally it
is just <major>.<minor>
, e.g., “1.07”.
Example:
print("Running Lua plugin version: "..finenv.StringVersion)
Returns a code that specifies if and how our code is running as
trusted code. (See the main RGP Lua page for
more information. The possible return values are given in the
finenv.TrustedModeType
constants.
Example:
print("Trusted Mode: "..tostring(finenv.TrustedMode))
A list of constants that define if and how our script is running in
trusted mode. This values is returned by
finenv.TrustedMode
.
UNTRUSTED
: The script is not verified. This is the
most restrictive option.USER_TRUSTED
: The script was marked Trusted by the
user. This is the most permissive option.HASH_VERIFIED
: The script has a hash value that was
verified by a known whitelisted server. These scripts are trusted as
long as they are not modified.NOT_ENFORCED
: Code trust is not being enforced, so the
script is treated as USER_TRUSTED
. This value is not
possible in version 0.68 of RGP Lua and higher.Returns the global “user interface” instance (of the FCUI
class). The FCUI
class contains Finale and system-global
tasks, such as displaying alert boxes, sounding a system beep, or
getting the width of the screen, etc.
(none)
FCUI
: The global “user interface” instance.Example:
finenv.UI():AlertInfo("This message appears in a message box.". "")
Not supported in RGP Lua. Instead, it
displays an error message box and returns nil
. Use FCCustomWindow
or FCCustomLuaWindow
instead. These work in JW Lua as well.
JW Lua supports dialog boxes to the user through the
finenv.UserValueInput()
call. Programming of these dialog
boxes is explained in full detail on this
page.
(none)
UserValueInput
: An instance of the deprecated
UserValueInput
class (JW Lua) or nil
(RGP Lua).Example:
local dialog = finenv.UserValueInput()