Skip to content

Lua scripting ​

Menu actions — and the actions you bind to keys in mm.toml — are written in Lua. f:ist runs each one in an isolated VM with the targeted paths and destination passed in, plus a small set of helper globals for toasts and progress feedback.

f:ist uses two separate Lua environments. This page covers the menu-action execution VM. Pane --transform scripts run in a different, shared VM — see The custom pane.

How a script runs ​

An action's command is a Lua chunk. It runs once per invocation — or once per row for queued Queue / QueueBatch actions — inside a fresh, isolated VM, so nothing leaks between executions. The chunk receives its arguments both as function arguments (...) and as globals.

Arguments ​

GlobalValue
pathsTable of targeted absolute paths (strings).
dstThe destination string — empty for a direct menu call; the queue row's destination for queued runs.
nav_cwdThe Nav pane directory (injected when present).

Global functions ​

FunctionEffect
toast(style, msg)Show a footer toast. style accepts "info", "success", "warning" ("warn"), "error" ("err"), "normal" (nil).
toast_push(style, prefix, item)Append an item to a grouped toast list with a styled prefix (e.g. toast_push("success", "Compressed: ", "archive.zip")).
set_progress(0-255)Update the executing queue item's progress bar (0–255 scale).
os.exit(code)Stop the script at the given exit code without terminating the host fs process.
error(...)Raise a runtime error, stopping execution and displaying a failure toast.

Loading scripts from files ​

Prefix a command with @ to load the chunk from a file (~/ and absolute paths work; relative paths resolve against the actions folder).

Binding the same Lua to keys ​

The action key you define can also be bound directly in mm.toml ("ctrl-x" = "MenuAction(my-action)") or enqueued via ExecuteQueue(my-action) — the same Lua runs. See Menu actions and mm.toml.

Validation ​

fs :tool check parses every menu-action script and validates its Lua, failing non-zero on errors.