summaryrefslogtreecommitdiff
path: root/docs/handbook/mnv/scripting.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/handbook/mnv/scripting.md')
-rw-r--r--docs/handbook/mnv/scripting.md541
1 files changed, 541 insertions, 0 deletions
diff --git a/docs/handbook/mnv/scripting.md b/docs/handbook/mnv/scripting.md
new file mode 100644
index 0000000000..ed8d4cae4a
--- /dev/null
+++ b/docs/handbook/mnv/scripting.md
@@ -0,0 +1,541 @@
+# MNV — Command-Line Interface and Scripting
+
+## Executable Invocation
+
+MNV is a single binary that adapts its behaviour based on the name it is
+launched with. The `parse_command_name()` function in `src/main.c` determines
+the mode:
+
+```c
+static void parse_command_name(mparm_T *parmp);
+```
+
+| Invocation | Mode | Effect |
+|---|---|---|
+| `mnv` | Normal | Standard editor |
+| `ex` | Ex | Starts in `:` line mode |
+| `view` | Read-only | Equivalent to `mnv -R` |
+| `rmnv` | Restricted | Disables shell commands, file writes |
+| `rview` | Restricted+RO | Restricted + read-only |
+| `mnvdiff` | Diff | Opens files in diff mode (`mnv -d`) |
+| `vi` / `vim` | Compat aliases | Normal mode |
+| `gmnv` | GUI | Starts graphical interface |
+| `gview` | GUI+RO | GUI + read-only |
+| `gmnvdiff` | GUI+Diff | GUI diff mode |
+| `emnv` | Easy GUI | GUI in easy mode (insert mode by default) |
+| `eview` | Easy+RO | Easy mode + read-only |
+
+---
+
+## Command-Line Arguments
+
+The `command_line_scan()` function in `src/main.c` parses all command-line
+arguments:
+
+```c
+static void command_line_scan(mparm_T *parmp);
+```
+
+### File Arguments
+
+Any non-option arguments are treated as files to edit:
+
+```
+mnv file1.c file2.c file3.c
+```
+
+These populate the argument list, managed by `src/arglist.c`.
+
+### Standard Options
+
+| Flag | Description |
+|---|---|
+| `-R` | Read-only mode |
+| `-Z` | Restricted mode (no shell access) |
+| `-g` | Start GUI (equivalent to `gmnv`) |
+| `-d` | Diff mode — open 2-8 files side by side |
+| `-b` | Binary mode |
+| `-l` | Lisp mode |
+| `-M` | Not modifiable — don't allow changes |
+| `-e` | Ex mode (`:` prompt) |
+| `-E` | Improved Ex mode |
+| `-s` | Silent/batch mode (Ex mode, no prompts) |
+| `-y` | Easy mode |
+| `-f` | Foreground — don't fork (GUI) |
+| `-v` | Force terminal mode even if `gmnv` |
+| `-n` | No swap file |
+| `-r` | Recovery mode (list swap files or recover) |
+| `-L` | Same as `-r` |
+| `-p[N]` | Open N tab pages |
+| `-o[N]` | Open N horizontal splits |
+| `-O[N]` | Open N vertical splits |
+| `-t tag` | Edit file containing `tag` |
+| `-q file` | Start in quickfix mode with `file` |
+
+### Pre- and Post-Commands
+
+| Flag | Description |
+|---|---|
+| `--cmd <command>` | Execute `<command>` **before** sourcing `.mnvrc`. Up to 10. |
+| `-c <command>` / `+<command>` | Execute `<command>` **after** loading files. Up to 10. |
+| `+` | Start at last line of first file |
+| `+{num}` | Start at line `{num}` of first file |
+
+The error message for too many commands:
+
+```c
+N_("Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"),
+#define ME_EXTRA_CMD 4
+```
+
+### Startup Control
+
+| Flag | Description |
+|---|---|
+| `--clean` | Skip all config files (`.mnvrc`, plugins) |
+| `-u <file>` | Use `<file>` instead of `.mnvrc` |
+| `-U <file>` | Use `<file>` instead of `.gmnvrc` |
+| `-i <file>` | Use `<file>` instead of `.mnvinfo` |
+| `--noplugin` | Don't load any plugins |
+| `--startuptime <file>` | Log startup timing to `<file>` |
+| `--log <file>` | Enable channel/job logging to `<file>` |
+
+The `--startuptime` flag is scanned in `early_arg_scan()`:
+
+```c
+if (STRICMP(argv[i], "--startuptime") == 0 && time_fd == NULL)
+{
+ time_fd = mch_fopen(argv[i + 1], "a");
+ TIME_MSG("--- MNV STARTING ---");
+}
+```
+
+### Display Options
+
+| Flag | Description |
+|---|---|
+| `-T <terminal>` | Set terminal type |
+| `--not-a-term` | Skip terminal checks |
+| `--ttyfail` | Exit if stdin is not a terminal |
+
+### Client-Server
+
+| Flag | Description |
+|---|---|
+| `--servername <name>` | Set server name |
+| `--serverlist` | List running MNV servers |
+| `--remote <files>` | Open files in an existing MNV |
+| `--remote-send <keys>` | Send keys to a running MNV |
+| `--remote-expr <expr>` | Evaluate expression in a running MNV |
+| `--remote-wait` | Like `--remote` but wait for completion |
+| `--remote-tab` | Like `--remote` but open in new tab |
+
+### Information
+
+| Flag | Description |
+|---|---|
+| `-h` / `--help` | Print usage and exit |
+| `--version` | Print version and exit |
+
+### Error Handling
+
+Unrecognised options produce:
+
+```c
+static char *(main_errors[]) =
+{
+ N_("Unknown option argument"), // ME_UNKNOWN_OPTION
+ N_("Too many edit arguments"), // ME_TOO_MANY_ARGS
+ N_("Argument missing after"), // ME_ARG_MISSING
+ N_("Garbage after option argument"), // ME_GARBAGE
+ N_("Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"),
+ N_("Invalid argument for"), // ME_INVALID_ARG
+};
+```
+
+---
+
+## Startup Sequence
+
+When `main()` runs (see `src/main.c`), parameter processing happens in
+several phases:
+
+### 1. Early Argument Scan
+
+```c
+static void early_arg_scan(mparm_T *parmp);
+```
+
+Scans specifically for `--startuptime`, `--log`, and `--clean` **before** any
+initialisation, because these affect how initialisation proceeds.
+
+### 2. Common Init Phase 1
+
+`common_init_1()` — allocator, hash tables, global options, message system.
+
+### 3. Common Init Phase 2
+
+`common_init_2(&params)` — terminal detection, default options, langmap.
+
+### 4. Full Command-Line Scan
+
+`command_line_scan(&params)` — processes every flag and file argument.
+
+### 5. TTY Check
+
+```c
+static void check_tty(mparm_T *parmp);
+```
+
+Verifies stdin/stdout are terminals when running interactively.
+
+### 6. Source Startup Scripts
+
+```c
+static void source_startup_scripts(mparm_T *parmp);
+```
+
+Loads scripts in this order (unless `--clean` or `-u NONE`):
+
+1. System-wide `.mnvrc` (e.g. `/etc/mnv/mnvrc`).
+2. User `.mnvrc` (`$HOME/.mnvrc` or `$XDG_CONFIG_HOME/mnv/mnvrc`).
+3. The `.gmnvrc` equivalent if GUI.
+4. `defaults.mnv` (new-user defaults).
+
+### 7. Pre-Commands
+
+```c
+static void exe_pre_commands(mparm_T *parmp);
+```
+
+Executes `--cmd` arguments.
+
+### 8. Edit Buffers
+
+```c
+static void edit_buffers(mparm_T *parmp, char_u *cwd);
+```
+
+Opens file arguments into buffers and windows.
+
+### 9. Post-Commands
+
+```c
+static void exe_commands(mparm_T *parmp);
+```
+
+Executes `-c` / `+` arguments.
+
+### 10. GUI Start
+
+```c
+static void main_start_gui(void);
+```
+
+If GUI mode is detected, starts the GUI event loop.
+
+---
+
+## MNVscript: The Built-in Scripting Language
+
+MNV includes a full scripting language for automation, plugins, and
+configuration. Two variants exist:
+
+### Legacy MNVscript
+
+The original `:let`, `:if`, `:while`, `:function` syntax, interpreted at
+runtime by `src/eval.c`. Expression parsing uses a recursive-descent parser:
+
+```c
+static int eval0_simple_funccal(...);
+static int eval2(char_u **arg, typval_T *rettv, evalarg_T *evalarg);
+static int eval3(...);
+// ... through eval9()
+```
+
+The central value type is `typval_T` (`src/structs.h`), a tagged union
+supporting:
+
+- Numbers (`VAR_NUMBER`)
+- Strings (`VAR_STRING`)
+- Floats (`VAR_FLOAT`)
+- Lists (`VAR_LIST`, `src/list.c`)
+- Dictionaries (`VAR_DICT`, `src/dict.c`)
+- Blobs (`VAR_BLOB`, `src/blob.c`)
+- Tuples (`VAR_TUPLE`, `src/tuple.c`)
+- Funcref / Partial (`VAR_FUNC`, `VAR_PARTIAL`)
+- Jobs (`VAR_JOB`)
+- Channels (`VAR_CHANNEL`)
+- Classes / Objects (`VAR_CLASS`, `VAR_OBJECT`)
+
+Variable scoping uses namespace prefixes (`g:`, `b:`, `w:`, `t:`, `l:`, `s:`,
+`v:`), managed by `src/evalvars.c`.
+
+Built-in functions are implemented in `src/evalfunc.c`.
+
+### MNV9 Script
+
+The modern dialect, activated by `:mnv9script` at the top of a script file or
+by the `:mnv9cmd` modifier. Detection:
+
+```c
+int
+in_mnv9script(void)
+{
+ return (current_sctx.sc_version == SCRIPT_VERSION_MNV9
+ || (cmdmod.cmod_flags & CMOD_MNV9CMD))
+ && !(cmdmod.cmod_flags & CMOD_LEGACY);
+}
+```
+
+MNV9 features:
+
+- **Type annotations**: `var name: string = "hello"`.
+- **Compiled to bytecode**: `src/mnv9compile.c` compiles, `src/mnv9execute.c`
+ runs the instructions defined in `src/mnv9instr.c`.
+- **Classes and interfaces**: `src/mnv9class.c` — `class`, `interface`,
+ `extends`, `implements`.
+- **Generics**: `src/mnv9generics.c` — `<T>`, `<K, V>`.
+- **Import/Export**: `src/mnv9script.c` — `import` / `export` for module
+ systems.
+- **`def` functions**: Compiled functions replacing `function`/`endfunction`.
+- **Strict mode**: variables must be declared, types are checked.
+
+Script version identification:
+
+```c
+#define SCRIPT_VERSION_MAX 4
+#define SCRIPT_VERSION_MNV9 999999
+```
+
+### Profiling
+
+When `FEAT_PROFILE` is defined, MNV can profile scripts and functions:
+
+```
+:profile start profile.log
+:profile func *
+:profile file *.mnv
+```
+
+Profiling is implemented in `src/profiler.c`.
+
+### Debugging
+
+MNV includes a built-in script debugger (`src/debugger.c`):
+
+```
+:breakadd func MyFunction
+:debug call MyFunction()
+```
+
+---
+
+## Ex Commands
+
+Ex commands (`:` commands) are the backbone of MNV's command-line mode. They
+are defined in `src/ex_cmds.h` and dispatched by `src/ex_docmd.c`:
+
+```c
+static char_u *do_one_cmd(...);
+```
+
+Command index tables in `ex_cmdidxs.h` (generated by `create_cmdidxs.mnv`)
+enable fast lookup.
+
+### Command Execution
+
+Every ex command receives an `exarg_T` struct containing:
+
+- The command address range (line numbers).
+- `:` modifiers (`:silent`, `:verbose`, `:sandbox`, `:lockmarks`, etc.).
+- The command argument string.
+- Flags for bang (`!`), register, count.
+
+### Notable Command Families
+
+| Family | Files | Examples |
+|---|---|---|
+| File operations | `ex_cmds.c` | `:write`, `:edit`, `:saveas` |
+| Buffer management | `ex_cmds.c`, `buffer.c` | `:bnext`, `:bdelete`, `:buffers` |
+| Window commands | `window.c` | `:split`, `:vsplit`, `:close`, `:only` |
+| Script evaluation | `ex_eval.c` | `:try`, `:catch`, `:throw`, `:finally` |
+| Source / Runtime | `ex_cmds2.c`, `scriptfile.c` | `:source`, `:runtime` |
+| Help | `help.c` | `:help`, `:helpgrep` |
+| Quickfix | `quickfix.c` | `:make`, `:copen`, `:cnext`, `:grep` |
+| Autocmds | `autocmd.c` | `:autocmd`, `:doautocmd`, `:augroup` |
+| Terminal | `terminal.c` | `:terminal` |
+| Session | `session.c` | `:mksession`, `:mkview` |
+| Diff | `diff.c` | `:diffthis`, `:diffoff`, `:diffupdate` |
+| Fold | `fold.c` | `:fold`, `:foldopen`, `:foldclose` |
+
+---
+
+## Autocommands
+
+`src/autocmd.c` implements the event-driven scripting system:
+
+```
+:autocmd BufWritePre *.c call CleanWhitespace()
+:autocmd FileType python setlocal tabstop=4
+```
+
+Autocommand events cover the full editor lifecycle: buffer loading, writing,
+window events, filetype detection, terminal activity, cursor movement, etc.
+
+The `autocmd_init()` function (called early in `main()`) initialises the
+autocommand tables.
+
+---
+
+## Key Mapping
+
+`src/map.c` handles:
+
+- `:map` / `:noremap` / `:unmap` for normal mode.
+- `:imap` / `:inoremap` for insert mode.
+- `:cmap` / `:cnoremap` for command-line mode.
+- `:vmap` / `:vnoremap` for visual mode.
+- `:tmap` / `:tnoremap` for terminal mode.
+- And all operator / select mode variants.
+
+The mapping engine integrates with `src/getchar.c` (typeahead buffer) to remap
+key sequences on the fly.
+
+---
+
+## Registers
+
+`src/register.c` manages:
+
+- Named registers (`"a` – `"z`).
+- Numbered registers (`"0` – `"9`).
+- Small delete register (`"-`).
+- System clipboard registers (`"*`, `"+`).
+- Expression register (`"=`).
+- Search register (`"/`).
+- Last inserted text (`".`).
+- Read-only registers (`"%` filename, `"#` alternate, `":` last command).
+- Black hole register (`"_`).
+
+The `"+` and `"*` registers bridge to the system clipboard via
+`src/clipboard.c` (and on Wayland via `src/wayland.c`).
+
+---
+
+## Configuration Files
+
+### `.mnvrc`
+
+The primary user configuration file. Sourced during startup. Can contain any
+ex commands, option settings, key mappings, autocommands, and function
+definitions.
+
+### `.gmnvrc`
+
+GUI-specific configuration. Sourced after `.mnvrc` when the GUI starts.
+
+### `.mnvinfo`
+
+Persistent session state across MNV invocations. Implemented in
+`src/mnvinfo.c`, controlled by the `FEAT_MNVINFO` guard:
+
+```c
+#ifdef FEAT_NORMAL
+# define FEAT_MNVINFO
+#endif
+```
+
+Stores:
+- Command-line history.
+- Search patterns.
+- Named marks.
+- Register contents.
+- File marks (last cursor positions).
+- Jump list.
+
+---
+
+## The `mparm_T` Struct
+
+The main-parameter struct passed through all startup functions:
+
+```c
+static mparm_T params;
+```
+
+Key fields:
+
+- `argc`, `argv` — raw command-line arguments.
+- `want_full_screen` — TRUE by default.
+- `use_debug_break_level` — debugger break level.
+- `window_count` — number of windows requested by `-o`/`-O`.
+- `clean` — `--clean` flag.
+- `edit_type` — one of `EDIT_NONE`, `EDIT_FILE`, `EDIT_STDIN`, `EDIT_TAG`,
+ `EDIT_QF`.
+
+```c
+#define EDIT_NONE 0
+#define EDIT_FILE 1
+#define EDIT_STDIN 2
+#define EDIT_TAG 3
+#define EDIT_QF 4
+```
+
+---
+
+## Standard I/O: Editing from stdin
+
+When MNV is invoked as part of a pipe:
+
+```bash
+echo "hello world" | mnv -
+```
+
+The `read_stdin()` function reads data from standard input into the first
+buffer:
+
+```c
+static void read_stdin(void);
+```
+
+The `EDIT_STDIN` edit type is set in `command_line_scan()` when `-` appears as
+a file argument.
+
+---
+
+## Example Workflows
+
+### Quick edit from command line
+
+```bash
+mnv +42 src/main.c # Open at line 42
+mnv -c 'set nu' file.txt # Open with line numbers
+mnv -d file1.c file2.c # Diff two files
+mnv -R /var/log/syslog # View log read-only
+```
+
+### Batch processing
+
+```bash
+mnv -es '+%s/foo/bar/g' '+wq' file.txt
+echo ":%s/old/new/g" | mnv -s file.txt
+```
+
+### Remote editing (client-server)
+
+```bash
+mnv --servername MYSERVER file.c &
+mnv --servername MYSERVER --remote file2.c
+mnv --servername MYSERVER --remote-send ':qa!<CR>'
+```
+
+### Startup profiling
+
+```bash
+mnv --startuptime startup.log file.c
+```
+
+---
+
+*This document describes MNV 10.0 as of build 287 (2026-04-03).*