Skip to content
Ilia Maslakov edited this page Sep 9, 2026 · 3 revisions

Demo recordings

The GIFs used on this wiki and in the repo README are recorded from VHS tapes. Tapes, fixtures and the image that renders them live in demos/ in this wiki repository; the rendered GIFs land in assets/ next to them.

They used to live in the mc tree under doc/demos/, where a tape could only run against the maintainer's local build. The image pins the mc revision instead, so a tape keeps rendering the demo of the revision it pins.

Tapes

Tape Shows Keys
arcmc.tape Create a 7z archive from tagged files, with the pack dialog and progress. Insert x3 (tag), Ctrl-G (menu), Tab Down Space (pick 7z), Enter (OK)
viewer-tree.tape Structured tree view of a JSON file: toggle, navigate, search, copy jq-path. t (tree), Down/Enter (expand), / type Enter (search), Ctrl-Y (copy path), q
mcstruct.tape A DBF file in mcstruct: header fields with the hex dump and the def-file in sync, the records as a grid. Down (walk the header and records), Enter (grid), Right/Down (cells), Escape (tree), Escape (quit)
viewer-filter.tape Grep-style live filter over a log, keeping only matching lines. Ctrl-L, type ERROR, Enter, ]/[ (jump matches), q
git-panel.tape Git panel plugin: browse changes, open a file's diff. Ctrl-K -> Git status, Down to file, Ctrl-D (diff), Enter (jump to hunk)
panel-hide.tape Hide a panel and run a shell command in the freed area. Ctrl-W (hide left panel), type ls, Enter
skineditor.tape Skin editor on gruvbox256: open it from the Plugin panel list, walk the keys with the live sample, recolour two of them in the Color dialog, save the result as a user skin. Esc p (Alt-P, Plugin panel), 3 Enter (Skin editor), Down/Up, Space (show), Enter (Color dialog), arrows + Space (pick), b (Bold), o (OK), Esc 2 (F2, save), type demo, Esc

Fixtures: sample.json, sample.log, and demo.keymap (see below).

Recording

Only Docker is needed; the image brings mc, its plugins, vhs, ttyd, ffmpeg and the fonts.

cd demos
MC_REF=v6.0.1 ./record.sh build   # build the image at a pinned revision
./record.sh                       # record every tape into ../assets/
./record.sh viewer-tree           # or just one

MC_REF is any ref of the mc fork and defaults to master. MC_REPO (a build arg) points at the repository. The plugin set is pinned in the Dockerfile rather than autodetected, so the plugin drive menu keeps the same entries between builds.

Fonts

The image knows the family JetBrains Mono; the JetBrains Mono NL Thin the older tapes name matches nothing there and falls back to a proportional font stretched over the cells.

Keys VHS cannot send

VHS has no function keys and no Alt combinations, but mc reads Esc followed by a digit as a function key and Esc followed by a letter as Alt-letter, so a tape types Escape and then 9 for F9, Escape and then p for Alt-P. Since mcterm took over the command line, a Ctrl-letter typed at the shell prompt goes to the shell's line editor, not to mc, so the Ctrl rebinds in demo.keymap only work where no prompt is under the keys; new tapes bind to Alt keys instead.

demo.keymap

A small keymap, merged over the defaults via MC_KEYMAP, that binds the actions a demo needs onto Ctrl-keys (menu bar, drive menu, viewer filter, structured copy-path, panel toggle). VHS cannot send function keys or Alt-combos, hence the rebinds. It is never installed; the image exports MC_KEYMAP pointing at it.

Known rough edges

These are recorded here rather than fixed silently, and are scheduled for the next build:

  • arcmc.tape used to press Ctrl-A, which demo.keymap never bound, so the create-archive dialog never opened. It now goes through the menu bar, but the menu path and the pack-dialog field order still need one manual pass.
  • The Down counts in git-panel.tape were tuned against a host build whose plugin set differs from the image's. Both counts need re-verifying once against the image.
  • git-panel.tape needs an uncommitted change to display; the image creates one by prepending a comment to src/panel-plugins/arcmc/arcmc.c.

Clone this wiki locally