diff options
Diffstat (limited to 'docs/handbook/mnv/overview.md')
| -rw-r--r-- | docs/handbook/mnv/overview.md | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/docs/handbook/mnv/overview.md b/docs/handbook/mnv/overview.md new file mode 100644 index 0000000000..f65f1291d1 --- /dev/null +++ b/docs/handbook/mnv/overview.md @@ -0,0 +1,381 @@ +# MNV — Overview + +## What Is MNV? + +MNV (recursive acronym: **MNV is not Vim**) is a highly capable, open-source +text editor descended from the classic UNIX editor Vi. It is developed under +the Project Tick umbrella and ships as the `mnv` binary. The current major +release is **MNV 10.0** (version string `MNV_VERSION_MAJOR 10`, +`MNV_VERSION_MINOR 0`), with build numbers tracked in +`src/version.h`: + +```c +#define MNV_VERSION_MAJOR 10 +#define MNV_VERSION_MINOR 0 +#define MNV_VERSION_BUILD 287 +``` + +MNV maintains near-complete compatibility with Vi while adding a vast array of +modern editing features. It targets the same niche as its ancestors — fast, +keyboard-driven text editing for programmers and system administrators — but +extends the experience with a graphical user interface, an embedded scripting +language, asynchronous job control, a built-in terminal emulator, Wayland +clipboard integration, and much more. + +--- + +## Project Identity + +| Field | Value | +|---|---| +| Full name | MNV — MNV is not Vim | +| Repository | `Project-Tick/Project-Tick` (under `mnv/`) | +| License | See `COPYING.md` and `LICENSE` in the project root | +| Language | C (C99), with MNV9 script for runtime | +| Build systems | CMake (primary), GNU Autoconf + Make (legacy) | +| Version macro | `MNV_VERSION_LONG` → `"MNV - MNV is not Vim 10.0 (2026 Apr 3)"` | + +The project description in `CMakeLists.txt` reads: + +```cmake +project(MNV + DESCRIPTION "MNV - MNV is not Vim" + LANGUAGES C +) +``` + +--- + +## Design Philosophy + +1. **Vi compatibility first.** Users who have Vi "in the fingers" can work + immediately. Every normal-mode, insert-mode, and command-line keystroke + from Vi works identically unless a feature consciously extends it. + +2. **Layered feature sets.** The build system exposes three feature tiers + defined in `src/feature.h`: + + ```c + // +tiny — no optional features enabled, not even +eval + // +normal — a default selection of features enabled + // +huge — all possible features enabled. + ``` + + Each tier is a strict superset of the previous one: + + ```c + #ifdef FEAT_HUGE + # define FEAT_NORMAL + #endif + #ifdef FEAT_NORMAL + # define FEAT_TINY + #endif + ``` + + On Unix, macOS and Windows the default is `+huge`. + +3. **Portability.** MNV builds on Linux, macOS, Windows (7 – 11), Haiku, VMS, + and nearly every UNIX variant. Platform-specific code lives in dedicated + `os_*.c` files (`os_unix.c`, `os_win32.c`, `os_amiga.c`, `os_mac_conv.c`, + etc.), keeping the core editor portable. + +4. **Keyboard efficiency.** All commands use normal keyboard characters. + Function keys and mouse are optionally available but never required. + +--- + +## Feature Highlights + +### Multi-level Undo / Redo + +MNV records every editing operation in an undo tree (`src/undo.c`). Users can +walk the tree with `u`, `CTRL-R`, and the `:undolist` / `:undo` commands. The +undo file is persisted across sessions when `'undofile'` is set. + +### Syntax Highlighting + +Implemented in `src/syntax.c` (guarded by `FEAT_SYN_HL`), MNV ships hundreds +of syntax definitions under `runtime/syntax/`. The `syn_pattern` struct drives +the highlighting engine: + +```c +typedef struct syn_pattern +{ + char sp_type; + char sp_syncing; + short sp_syn_match_id; + short sp_off_flags; + int sp_offsets[SPO_COUNT]; + int sp_flags; + int sp_ic; + ... +} syn_pattern; +``` + +### Built-in Terminal Emulator + +When compiled with `FEAT_TERMINAL`, MNV embeds a terminal emulator +(`src/terminal.c`) backed by **libvterm** (`src/libvterm/`). A terminal buffer +is opened with `:terminal` and connected to a background job via the +channel/job infrastructure. + +```c +struct terminal_S { + term_T *tl_next; + VTerm *tl_vterm; + job_T *tl_job; + buf_T *tl_buffer; + ... +}; +``` + +### Asynchronous Jobs and Channels + +`src/channel.c` and `src/job.c` provide the `+channel` / `+job` features. +Channels communicate over sockets (TCP, Unix domain), pipes, or PTYs. This +powers the terminal emulator, the NetBeans interface, Language Server +connections, and user scripts. + +### MNV9 Script + +MNV ships a modernized scripting dialect called **MNV9 script** +(`src/mnv9script.c`, `src/mnv9compile.c`, `src/mnv9execute.c`, +`src/mnv9expr.c`, `src/mnv9type.c`, `src/mnv9instr.c`, `src/mnv9cmds.c`, +`src/mnv9class.c`, `src/mnv9generics.c`). Detection of MNV9 mode happens at +runtime: + +```c +int +in_mnv9script(void) +{ + return (current_sctx.sc_version == SCRIPT_VERSION_MNV9 + || (cmdmod.cmod_flags & CMOD_MNV9CMD)) + && !(cmdmod.cmod_flags & CMOD_LEGACY); +} +``` + +MNV9 introduces strict typing, classes, generics, compiled-to-bytecode +execution, and `import` / `export` semantics. + +### Graphical User Interface + +MNV supports multiple GUI toolkits (GTK 2, GTK 3, Motif, Win32, Haiku, Photon) +through a clean backend abstraction in `src/gui.c` / `src/gui.h`. The global +`gui_T gui` struct holds all GUI state. Platform backends live in +`gui_gtk.c`, `gui_gtk_x11.c`, `gui_motif.c`, `gui_w32.c`, `gui_haiku.cc`, etc. + +### Wayland Clipboard + +Native Wayland clipboard support is implemented in `src/wayland.c` and +`src/wayland.h` (guarded by `FEAT_WAYLAND`). It uses the +`ext-data-control-v1`, `wlr-data-control-unstable-v1`, and optionally the core +`wl_data_device_manager` protocols. The clipboard code in `src/clipboard.c` +dispatches through protocol-agnostic macros defined at the end of `wayland.c`. + +```c +vwl_connection_T *wayland_ct; +``` + +### Encryption + +MNV supports multiple encryption methods. Blowfish is implemented in +`src/blowfish.c`, ZIP-based crypt in `src/crypt_zip.c`, and the modern +`xchacha20` method uses **libsodium** when `HAVE_SODIUM` is defined. + +### Regular Expressions + +Two regex engines coexist in `src/regexp.c`: + +- **BT engine** (`src/regexp_bt.c`) — backtracking, traditional. +- **NFA engine** (`src/regexp_nfa.c`) — NFA-based, faster for many patterns. + +The dispatcher chooses automatically or can be forced via `'regexpengine'`. + +### Quickfix / Location Lists + +`src/quickfix.c` implements the `:make`, `:grep`, `:copen`, `:lopen` family of +commands for compiler-output navigation. + +### Spell Checking + +`src/spell.c`, `src/spellfile.c`, `src/spellsuggest.c` provide the `+spell` +feature with support for word lists, affixes, compound words, and suggestions. + +### Diff Mode + +`src/diff.c` together with the embedded `src/xdiff/` library (xdiffi, +xpatience, xhistogram algorithms) delivers side-by-side diff viewing. + +### Folding + +`src/fold.c` drives code folding — manual, indent, expr, syntax, diff, and +marker methods. + +### Text Properties / Virtual Text + +`src/textprop.c` provides the text-property API used by plugins for inline +virtual text, diagnostics markers, and similar overlays. + +### Popup Windows + +`src/popupwin.c` and `src/popupmenu.c` implement floating popup windows and +the insert-mode completion menu. + +--- + +## Runtime Files + +The `runtime/` directory is installed alongside the binary and contains: + +| Directory | Purpose | +|---|---| +| `runtime/doc/` | Help files (`:help`) | +| `runtime/syntax/` | Syntax highlighting definitions | +| `runtime/ftplugin/` | File-type plugins | +| `runtime/indent/` | Indentation rules | +| `runtime/colors/` | Color schemes | +| `runtime/compiler/` | Compiler integration | +| `runtime/autoload/` | Autoloaded script functions | +| `runtime/plugin/` | Global plugins | +| `runtime/pack/` | Package directory | +| `runtime/tutor/` | The `mnvtutor` training material | +| `runtime/keymap/` | Keyboard mappings for non-Latin scripts | +| `runtime/import/` | MNV9 import modules | +| `runtime/spell/` | Spell-check word-list files | +| `runtime/print/` | PostScript printing support | +| `runtime/lang/` | UI translation message files | +| `runtime/macros/` | Example macros | +| `runtime/tools/` | Auxiliary tools | + +Essential runtime scripts loaded at startup: + +- `defaults.mnv` — sensible defaults for new users. +- `filetype.mnv` / `ftoff.mnv` — filetype detection on/off. +- `ftplugin.mnv` / `ftplugof.mnv` — filetype plugins on/off. +- `indent.mnv` / `indoff.mnv` — filetype indentation on/off. +- `menu.mnv` / `synmenu.mnv` — GUI menu definitions. +- `scripts.mnv` — fallback filetype detection by content. +- `optwin.mnv` — the `:options` window. +- `mswin.mnv` — Windows-style key bindings. + +--- + +## Executable Variants + +A single `mnv` binary behaves differently depending on the name it is invoked +with. The CMake install step creates symlinks: + +| Symlink | Behaviour | +|---|---| +| `mnv` | Normal mode | +| `ex` | Start in Ex mode (`:` prompt) | +| `view` | Read-only mode (`-R`) | +| `rmnv` | Restricted mode | +| `rview` | Restricted + read-only | +| `mnvdiff` | Start in diff mode | +| `vi` | Compatibility alias | +| `vim` | Compatibility alias | +| `gmnv` | GUI mode (when GUI is compiled in) | +| `gview` | GUI + read-only | +| `gmnvdiff` | GUI + diff mode | +| `rgmnv` | GUI + restricted | +| `rgview` | GUI + restricted + read-only | +| `emnv` | "Easy mode" GUI | +| `eview` | "Easy mode" GUI + read-only | +| `gvi` / `gvim` | GUI compatibility aliases | + +--- + +## The Tutor + +MNV bundles a one-hour interactive tutorial. It is typically started with: + +```sh +mnvtutor +``` + +The tutor files reside in `runtime/tutor/` and the launcher scripts are +`mnvtutor.com` (VMS) and `mnvtutor.bat` (Windows) at the project root, plus +`src/mnvtutor` / `src/gmnvtutor` for Unix. + +--- + +## Auxiliary Tool: xxd + +The `src/xxd/` directory contains **xxd**, a hex-dump / reverse-hex-dump +utility. It is built as a separate executable by the CMake build +(`add_subdirectory(src/xxd)`). + +--- + +## Relation to Vim and Vi + +MNV is a fork that diverges from upstream Vim by: + +- Renaming the project and binary to `mnv`. +- Adopting a CMake-first build system alongside the legacy Autoconf build. +- Adding first-class Wayland clipboard support (`FEAT_WAYLAND`, + `FEAT_WAYLAND_CLIPBOARD`). +- Using `mnv9script` naming for the modern scripting dialect. +- Storing runtime files in `mnv`-prefixed paths. +- Maintaining the project under the Project Tick organisation. + +Despite these changes, MNV intentionally preserves Vi and Vim compatibility so +that existing workflows, plugins, and muscle memory carry over unchanged. + +--- + +## CI and Quality Assurance + +The project uses: + +- **GitHub Actions** — primary CI (linux, macOS, coverage). +- **Appveyor** — Windows CI. +- **Cirrus CI** — FreeBSD builds. +- **Codecov** — coverage tracking. +- **Coverity Scan** — static analysis. +- **Fossies codespell** — spell-checking source comments. + +Unit tests (`json_test.c`, `kword_test.c`, `memfile_test.c`, `message_test.c`) +validate isolated subsystems. The full test suite lives in `src/testdir/` and +is driven by `make test` or `ctest`. + +--- + +## Further Reading + +| Resource | Location | +|---|---| +| Build instructions | `src/INSTALL`, the `building.md` handbook page | +| Architecture | The `architecture.md` handbook page | +| GUI details | The `gui-extension.md` handbook page | +| Command-line usage | The `scripting.md` handbook page | +| Platform notes | The `platform-support.md` handbook page | +| Coding conventions | The `code-style.md` handbook page | +| Contributing guide | `CONTRIBUTING.md` in the project root | +| MNV9 scripting | `README_MNV9.md` | +| Help system | `:help` inside MNV, or `runtime/doc/help.txt` | + +--- + +## Glossary + +| Term | Meaning | +|---|---| +| `buf_T` | The C struct representing a buffer (in-memory file). | +| `win_T` | A window — a viewport onto a buffer. | +| `pos_T` | A cursor position: `{lnum, col, coladd}`. | +| `typval_T` | A typed value in the expression evaluator. | +| `garray_T` | A generic growable array used throughout the codebase. | +| `mparm_T` | The struct holding `main()` parameters passed between init functions. | +| `gui_T` | Global GUI state. | +| `term_T` | A terminal emulator instance. | +| Feature guard | A `#ifdef FEAT_*` preprocessor conditional controlling optional code. | +| MNV9 | The modern, statically-typed scripting dialect. | +| libvterm | The embedded terminal emulation library. | +| xdiff | The embedded diff library (xdiffi, xhistogram, xpatience). | +| xxd | The bundled hex-dump utility. | + +--- + +*This document describes MNV 10.0 as of build 287 (2026-04-03).* |
