tio/docs/interactive-lua-scripting.md
yabu76 c8df45ceff Add tty_inkey(),tty_simple() and tty_subcmd_readln()
Add following functions to handle input from a thread that uses standard
input.

tty_inkey() waits for a key to be pressed for a specified amount of
time, and then returns the pressed string.

tty_simple_readln() reads user input until Enter is pressed.
It supports Backspace key.

tty_subcmd_readln() reads user input until Enter is pressed.
It supports line editing (cursor keys, Backspace) and command history.

The script REPL history buffer is now a dedicated history buffer instead
of the subcommand history buffer. REPL prompt changes from ">>" to "->".

Reduced the history buffer size from 1000 lines to 500 lines.
2026-04-04 16:17:14 +09:00

216 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Interactive Lua Scripting
## Introduction
Tio provides an **interactive Lua scripting interface** that allows scripts and Lua commands to be executed while Tio is running.
In earlier versions, the script interpreter was restarted for each script execution.
The interpreter now **remains active**, preserving its state across executions.
This makes it possible to:
* run Lua commands interactively
* reuse functions defined in previously loaded scripts
* experiment with Lua code without restarting the interpreter
* avoid repeated initialization overhead when working with large scripts
---
## Starting Interactive Script Mode
To start interactive script mode, press:
**Ctrl-t r**
Tio displays the script prompt:
```
[08:45:46.514] Run Lua script
[08:45:46.514] Enter file name or "!" Lua commands or "@" interpreter directive:
>>
```
At this prompt you can:
| Input | Description |
| ------------ | ---------------------------------------- |
| `filename` | Execute a Lua script file |
| `!commands` | Execute Lua commands |
| `@directive` | Execute an interpreter control directive |
You can use the cursor keys and backspace key to edit the line and recall command history.
The history is maintained while tio is running.
---
## Running a Script File
To execute a Lua script file, enter the filename at the prompt.
Example script (`banner.tio`):
```lua
function tio.banner()
local banner = [[
_ _ _ _ __
| |_ (_) ___ ___ | |_ __ _ _ __ | |_ _ \ \
| __|| | / _ \ / __|| __|/ _` || '__|| __| (_)_____ | |
| |_ | || (_) | \__ \| |_| (_| || | | |_ _ _|_____|| |
\__||_| \___/ |___/ \__|\__,_||_| \__|(_) (_) | |
/_/
]]
tio.echo(string.gsub(banner, "\n", "\r\n"))
end
tio.banner()
```
Run the script:
```
>> banner.tio
[09:08:13.786] Running script banner.tio
_ _ _ _ __
| |_ (_) ___ ___ | |_ __ _ _ __ | |_ _ \ \
| __|| | / _ \ / __|| __|/ _` || '__|| __| (_)_____ | |
| |_ | || (_) | \__ \| |_| (_| || | | |_ _ _|_____|| |
\__||_| \___/ |___/ \__|\__,_||_| \__|(_) (_) | |
/_/
```
The script is loaded and executed immediately.
Any functions defined in the script remain available in the interpreter.
---
## Executing Lua Commands
Lua commands can be executed directly by prefixing them with `!`.
This allows you to interact with previously defined functions or variables.
Example script (`calc_sum.tio`):
```lua
function tio.calc_sum(t)
local sum = 0
for _, v in ipairs(t) do
sum = sum + v
end
return sum
end
function tio.disp_sum(t)
local sum = tio.calc_sum(t)
tio.echo(sum)
tio.echo("\r\n")
end
```
Example session:
```
>> calc_sum.tio
[09:15:22.372] Running script calc_sum.tio
<<press Ctrl-t r again>>
>> !t = {1,2,3,4,5,6,7,8,9,10}
<<press Ctrl-t r again>>
>> !tio.disp_sum(t)
55
>> !sum = tio.calc_sum(t); tio.echo(sum); tio.echo("\r\n")
55
```
---
## Interpreter Directives
Interpreter behavior can be controlled using directives prefixed with `@`.
### `@new`
Restart the script interpreter.
All interpreter state is cleared and the interpreter is reinitialized.
If a `script-init-file` is configured, it is executed again.
---
### `@doopt`
Execute the script specified by the `script` or `script-file` option, if present.
---
### `@nuldo=opt`
If **Ctrl-t r** is pressed and **Enter** is pressed without entering a command, `@doopt` is executed.
This is the default behavior for compatibility with Tio v3.9.
---
### `@nuldo=none`
If **Ctrl-t r** is pressed and **Enter** is pressed without entering a command, no action is performed.
This helps prevent accidental script execution.
---
### `@repl`
Start **REPL (ReadEvalPrint Loop)** mode.
---
## REPL Mode
Enter:
```
@repl
```
to start REPL mode.
In REPL mode:
* Lua commands can be entered continuously
* each line is executed immediately
* multi-line statements can be continued using a trailing `\`
* `@exit` leaves REPL mode
Example:
```
[10:17:30.215] Run Lua script
[10:17:30.215] Enter file name or "!" Lua commands or "@" interpreter directive:
>> @repl
[10:17:31.956] Enter Lua REPL mode (@exit to exit)
-> p=1
-> for i=1,10 do\
-> p = p * i\
-> end
-> print(p, "\r")
3628800
-> @exit
```
---
## Summary
The interactive Lua scripting interface provides:
* persistent interpreter state
* interactive Lua command execution
* script reuse without interpreter restart
* an integrated REPL environment
These capabilities make it easier to develop, test, and experiment with Tio scripts while the program is running.
Enjoy using Tio's Interactive Lua Scripting.