-
Notifications
You must be signed in to change notification settings - Fork 6
Release v6.0.1
Based on GNU Midnight Commander 4.8.33.
The centre of this release is the panel plugin framework: panel contents can
come from a dynamically loaded plugin instead of the local filesystem or the
built-in VFS. Twelve plugins ship on top of it, among them arcmc, an archive
manager built on libarchive that browses, creates, packs and extracts. The old
ftpfs and sftpfs VFS modules are gone, replaced by their plugin equivalents.
The viewer gained a live filter, ANSI colour and terminal replay, and a structured tree mode for JSON, YAML, XML and HTML. The editor gained code folding, an undo history browser and a macro explorer. Panels gained user-editable view modes, and the file manager can now host a real shell.
-
Code folding. Fold a block by bracket scope (
{,[,() from the gutter, the Command menu or Alt+Shift+F. A folded line keeps its text and gains a summary with the matching bracket and line count. Smart fold unfolds if the cursor is on a folded line, folds the selection if there is one, and otherwise finds the enclosing bracket scope. Only lines with an unmatched opening bracket get an indicator, sofor()andarray[i]stay clean. Indicators are configurable through the skin. (#3) -
Undo history browser (Alt+Shift+U). Lists undoable and redoable groups with line, action, character count and a content preview, and jumps to any point by applying the required steps. Handles compressed actions, UTF-8 counts and very large histories, and explains the case where the history was overwritten by a big edit while the file is still modified. Two modified-state bugs are fixed along the way: compressed redo actions and divergent history branches could both leave the editor thinking a changed buffer was clean. (#63)
-
Macro explorer (Alt+Shift+M) replaces the blind delete-by-hotkey prompt. Lists every recorded macro with its hotkey and action summary, shows the full action sequence of the selected one, runs it, deletes it with confirmation, or opens
mc.macrosat its definition. (#65) -
Save through sudo when permission is denied. Saving a file without write permission failed with EACCES and left Save As as the only way out. The editor now prompts for a password and retries through
sudo -S tee. A failed attempt can be retried or cancelled without losing the buffer, and other save errors are unchanged. (#10) -
Highlighting and speed for plain text and very long lines. Files with no syntax definition were shown flat; a line-local mode now colours numbers, quoted strings and a configurable set of symbols, resetting at every newline so it stays cheap. Separately, navigation was O(line length) on nearly every keystroke; a per-line layout cache holds byte offset to visual column checkpoints and the cached line end, so cursor movement, marking and redraw no longer rescan the line. Logs, CSV and minified files become usable. (#78)
-
Word and line selection by dragging. Double click starts word-wise selection and dragging extends it by whole words; triple click does the same by lines. The multi-click timer starts on button down rather than button up, so a drag followed by a quick click is no longer taken for a double click. Backport of MidnightCommander/mc#5127 by Robert P. McDowell. (#81)
-
Structured tree mode for JSON, YAML, XML and HTML. A third display mode beside text and hex, rendering the file as an expandable tree in both the fullscreen viewer and the quick view panel, where it follows the panel cursor. Alt-s or
ttoggles it, F4 returns to text. Enter toggles a node,*expands a subtree, digits expand to depth N, Alt+Enter copies the jq-style path, and F7 searches the whole model including collapsed nodes. The status line shows the content type and the current path. JSON and YAML use dependency-free built-in parsers with the YAML subset stated as a grammar; XML and HTML use libxml2. Hardened against deep nesting and alias bombs, and fuzzed with ASan and UBSan. Themcview_structured_autooption opens supported extensions in tree mode directly. The mctree panel plugin is removed in favour of this mode; its tree model stays as an internal library that the viewer builds on. (#80) -
Grep-style live filter. A filtered view over the same datasource, so only matching lines are shown without opening a pipe or a second buffer. Built for infinite sources such as container logs, where waiting for EOF is not an option. (#51)
-
Full search options for the filter. The single input becomes a proper search dialog laid out like F7 Search minus Backwards: search type radio buttons, Case sensitive, Whole words and All charsets. An invalid regex no longer destroys the active filter, since the pattern is prepared before the old state is torn down. (#55)
-
Filter Check dialog. Test a pattern against already-loaded data before committing to a full indexing pass. Matching lines are shown with the matched span highlighted, and an invalid pattern reports inline. (#56)
-
ANSI terminal replay. Replays escape-coded files as a virtual screen instead of a byte stream, which makes
script(1)captures andmc.logreadable. F9 cycles None, SGR and Term. Navigation, mouse, filter keys and encoding changes all understand the replayed screen. (#53) -
Wider terminal emulation. Scrolling regions (DECSTBM), absolute vertical positioning (VPA) and character erase (ECH), so captures from full-screen programs replay correctly. Erases keep the current attributes, so coloured backgrounds survive and reach the right edge, and cursor and erase bounds are clamped against malformed sequences. Replay restarts when the viewer is resized. (#54)
-
ANSI colour rendering with a Shift+F9 toggle. An SGR parser covering the standard and bright colours, 256-colour, truecolor and the colon sub-separator notation, plus bold, underline, italic, blink and reverse. Attributes persist across newlines, as they should.
.classfiles are run throughscript(1)so procyon, which only emits colour to a TTY, keeps it through the pipe. Ported from MidnightCommander/mc#5065 by noctuum. (#47) -
Viewing output of commands that never end. A non-blocking streaming datasource lets the viewer show
docker logs -forjournalctl -f. The pipe is drained from the event loop and redraws are deferred, with keyboard input keeping priority, so the viewer no longer hangs waiting for EOF. (#41) -
Markdown rendering.
.mdfiles are formatted rather than shown raw: headings in their own skin colour, bold, italic, inline code, and aligned tables. LaTeX math inside$...$is substituted, including symbols, fractions, roots, subscripts and superscripts, with multi-line display blocks. The renderer moved out ofdoc.shinto standalone shell and awk scripts. (#23, #30)
- Embedded terminal. An optional PTY widget running an interactive shell inside the file manager, drawn through the viewer's own terminal emulator, so it adds no library dependency. Ctrl+O toggles it. The shell starts in the panel's directory and stays in sync with it through OSC 7 tracking. Supports command-line passthrough, prompt detection, mouse, and focus cycling between panel and terminal. (#61)
-
Configurable panel view modes (Alt-t). A list of named listing formats, editable from Options, shared between panels and applied per panel. Columns use native mc field ids, repeated columns collapse to the multi-column form, and blank width means auto. The list and each panel's selection persist, at least one mode always exists, and a mode that fails validation reverts rather than sticking. This replaces cycling with Ctrl+0..9, which a terminal cannot deliver. (#75)
-
Internal diff viewer instead of external mcdiff. Diffs opened from a plugin call
diff_view()directly, which removes the extra process and the visible screen save and restore flicker. (#35, #34)
-
Key Bindings, Learn keys and Key Sniffer dialogs. A tabbed Key Bindings dialog with binding replacement, append and remove, conflict detection and inline key capture, plus editing of the keymap and terminal definition files. The terminal key learner is replaced by a modifier-aware key grid, and the Key Sniffer shows the shortcut, mapped action, raw escape sequence and keycode. Terminal-specific mappings live in
~/.config/mc/term/<TERM>, with legacy entries migrated. (#36) -
Learn keys understands modifiers. Ctrl, Alt and Shift checkboxes; the key is stored under a modifier-prefixed name such as
shift-uporctrl-f9and verified with the same modifiers. (#8) -
Incremental filter in history popups. Typing narrows the list by case-insensitive substring, correctly handling UTF-8 and backspace, with the active filter shown in the title. Alt-F12 opens the directory history. (#27)
-
Copy and paste between input lines and the editor. Input fields already routed through the editor's clip file, but the CUA keys were never bound for them, so text could not move between a command line and the editor. Store is now alt-w and ctrl-insert, Cut is shift-delete, Paste is shift-insert. Store and Cut also honour the selection properly: with no mark they used to act on everything from line start to cursor. (#83)
-
Procyon as the Java class decompiler. Tried first when viewing
.classfiles, since it handles modern bytecode better, with jad and javap as fallbacks. (#46)
Framework
-
Panel plugin framework. Panel contents can be supplied by a dynamically loaded shared object, with navigation integrated so a plugin-backed panel behaves like a normal one. Landed with the first four plugins: systemd, Samba, SFTP and Docker. (#4)
-
Editor plugin framework. The same idea for mcedit: plugins register actions, contribute menu entries and handle keys, with a Manage Plugins dialog and per-user enable state. The spell checker and etags support moved into plugins. (#6)
-
Transfers into plugin panels.
put_fileandsave_filecallbacks make F5 copy, F6 move and F4 save-back work into a plugin panel, implemented first for Samba and SFTP. An explicit close code handles navigating above a plugin's root. (#17) -
Shell connections and the panel menus. A shell-link plugin manages saved Shell VFS connections over SSH, with an optional libssh2 transport supporting known-host verification, agent, public key and password authentication, and compression, keeping the legacy SSH pipe as fallback. Plugins can also register themselves into the panel menus. (#20)
-
Drive menu (Alt-F1, Alt-F2) lists the plugins that opt in, with a second list for plugin-specific actions. Alt-comma is rebound from panel splitting to Find. (#33)
-
Plugins load from the user directory as well as the system one, so plugins in
~/.local/lib/mc/panel-pluginsare found. The editor plugin loader had the same bug. (#31) -
Per-plugin help and settings. Dialogs can open a plugin's own help file instead of
mc.hlp, plugins install into their own subdirectory, and Manage Plugins opens a plugin's settings on Enter or F4. (#32, #72) -
Directory history across plugins. History works consistently for filesystem and plugin paths: duplicate removal and ordering bugs that could erase the history or show a single entry are fixed, an active plugin is closed before opening a filesystem path, and Docker and arcmc record their navigation, so an archive reopens at the saved subdirectory. (#43)
-
Viewer source controller. Lets a plugin re-drive the viewer's data source in place, with an atomic two-phase swap, draft and commit of plugin state and filter snapshots. This is what makes re-fetchable log views possible. (#73)
arcmc, archives
-
Archive browser and manager. Presents an archive as panel contents, with nested archives, adding files and deleting entries. Shift+F1 creates an archive: format (zip, 7z, tar.*, cpio), compression, password and encryption where supported, path storage and delete-after-pack. Pack, extract and rewrite report per-file and total progress with throughput and ETA and can be aborted. libarchive covers the common formats and extfs helpers handle the rest; libmagic gives content-based detection when available. (#21)
-
Settings, bulk extract and hardening. Operations through external archivers, a settings dialog and bulk extract workflows, together with the WTable widget that plugin dialogs use. Fixes Zip Slip, where entries with absolute paths or
..could extract outside the target directory, plus cross-filesystem rename, ignored read errors during pack, and an unchecked archiver exit status. (#22) -
Java archives.
.jar,.warand.earare recognised and treated as ZIP. (#48)
git
- Git panel with favorites. Commits, branches and changed files, with the internal diff viewer. Outside a repository the plugin shows saved favorites instead of an error: Shift+F4 adds by path, Ctrl-B adds the current repository, F8 removes, Enter opens. In the status view, Enter on a changed file moves the other panel to that file and selects it. (#12, #44)
docker
-
Docker panel with compose-project grouping and image sizes, later split into modules covering containers, files, images, volumes and networks, with mounts, exec and logs flows. (#4)
-
Connection profiles and SSH. Saved local and SSH profiles with editing dialogs. Container file browsing works over SSH; mounts stay local only. (#45)
-
Configurable container logs (Alt-s). Instead of a fixed
docker logs --tail 1000, a dialog sets tail and head limits, a time window or live follow, and re-fetches from the viewer. An optional formatter pipeline can post-process the stream, withdlog.shshipped for .NET and Serilog logs. (#74)
k8s
-
Kubernetes panel. kubectl-backed, covering pods, nodes, services and
workloads with describe, yaml, exec and delete, plus contexts, namespaces
including per-pod namespace in all-namespaces mode, favorites and help. Pod
logs open in the viewer with re-fetch parameters (
--since,--tail,--previous, follow) and an optional formatter. kubectl is treated as a verbatim shell fragment, sominikube kubectl --works. (#73)
mongodb
-
MongoDB browser. Connections, databases, collections and documents, with
F3 showing a document as Relaxed Extended JSON. Connections live in
~/.config/mc/mongo.iniand are created with F7 and edited with F4 from the cluster list. Large collections are paged and bucketed by_id, and a find-style filter dialog (F6) offers projection, sort and limit. Document editing is supported: F4 replaces, F5 and F6 insert a JSON file, F7 inserts an empty document, F8 deletes, and read-only clusters block mutations. (#72)
s3
-
S3 object storage. Connections, buckets and objects over libcurl with SigV4 signing: download, upload, delete, create bucket, object metadata and content streaming into the viewer. Custom endpoints such as MinIO and Ceph work through path-style URLs. Password obfuscation moved into shared helpers used by all network plugins. (#25)
-
Cloudflare R2 support and help. A
bucketsfield covers providers without a ListBuckets API, and when the call fails the error explains it and offers manual entry. S3 XML errors are parsed into readable messages, a connection status dialog shows progress, F1 opens the plugin help, and the cursor position is restored when navigating back. (#32)
ftp, sftp, samba
-
FTP and FTPS plugin on libcurl, replacing the old VFS module. Saved connections, browsing, download, upload, create, delete and view, with progress and status feedback. A tabbed dialog covers FTPS modes, active and passive transfers, timeouts, keepalive, IP version, proxies and post-connect commands. Comes with a reusable TTL directory-listing cache for plugins. (#18)
-
SFTP connection management. The dialog splits into Basic and Connection tabs, adding timeouts, SSH keepalive and IP version. F3 views and F4 edits a connection, hotkeys are configurable, stored passwords are obfuscated with existing plain-text entries still readable, and cancelling a dialog no longer loses unsaved changes. (#19)
-
SFTP transfers and streaming. Compressed sessions, public-key authentication with passphrase prompting, connection status and transfer progress with speed, ETA and cancellation, and streaming a file straight into the viewer without downloading it first. Partial writes and EINTR are handled during transfers, and a
copy_to_localAPI lets the plugin download directly to the target path. (#29) -
Samba network browser for SMB shares. (#4)
panelize
- External Panelize became a plugin. The legacy in-core implementation is replaced by a standalone plugin that keeps the C-x ! workflow and adds command, panel menu and drive menu entry points. F5 and F6 add files to a Panelize list without copying them, and Find File results are handed to compatible plugins through a generic file-list API, so the core no longer names Panelize. (#70)
ctags
- ctags navigator for mcedit. Jump to definitions and declarations, search symbols and files, find references, browse members, complete symbols and walk tag history. Includes repository management, reindexing and fuzzy incremental filtering, with per-repository history persisted. (#66)
-
Column blocks are real rectangles. The highlight stopped at each line's end, and copying a block stored only the raw characters, so short lines lost their width. A column block now keeps its shape on screen, in the clip file and on paste. Widths are measured in display columns rather than bytes, so UTF-8 text is not over-padded and a tab counts to the next tab stop measured from the block's left column. (#79)
-
Paste output of external command works in the TUI. The command runs under
sh -cwithTERM=dumb, so every stage of a pipeline inherits it, and the input is shell-quoted. stdin comes from/dev/nullso interactive programs cannot hang, and stderr is discarded instead of being pasted into the buffer. (#64)
-
Crash on files with archive magic bytes. When VFS detection recognised a signature but decompression could not open the file, the viewer was left without a usable datasource and crashed, typically on
.pptx,.docxand.xlsx. It now falls back to the raw file and always keeps a valid datasource, including after reopening with F3. (#26) -
Filter no longer stalls on huge lines. The scanner looked for the end of each line before checking its budget, so one very long line could block the UI. It now scans byte by byte and carries its position across ticks. Movement is blocked while the filter has matched nothing yet, and the filter is turned off before entering hex mode. (#52)
-
Alt-screen handling and ESC[J. The cursor is restored when an application leaves the alternate screen, the bracket is tracked so redraws cannot overwrite the main-screen snapshot, and erase-to-end and erase-to-start are handled instead of being silently consumed, which used to leave stale content on screen. Also fixes mouse events reaching hidden child widgets. (#57)
-
Blank output for logs with two alt-screen brackets. Each complete frame is captured before it is cleared, so logs where the application erases everything before exiting show their last frame instead of nothing. (#58)
-
Slow scrolling on huge lines. In unwrap mode, horizontal scrolling and line stepping cost O(column) per keypress, about 500 ms per key at column 3M on a 3 MiB line. A per-view layout cache with parser checkpoints every 64 columns brings that to roughly 0.7 ms, and stepping over 300 KiB lines from 19 ms to 2 ms, with byte-identical output. A spinner appears during the one unavoidable long parse, the first End on a huge line. (#82)
-
Ctrl-F1 and Ctrl-F2 on a non-listing panel. When the panel showed Quick view, Info or Tree, the first press hid it instead of returning it to the file listing. It now switches back to the listing first, and only toggles visibility when the listing is already shown. (#77)
-
Column format restored after a plugin closes. The plugin's own layout survived the reload, and since it has no type column, directories lost their trailing slash in the normal panel. (#40)
-
File extensions preserved in temporary copies. Plugins created temporary local copies without the original extension, so
mc.ext.inirules never matched and extension-based syntax highlighting and custom viewers silently did not run. Fixed through a shared helper used by arcmc, git, docker, ftp, s3, samba and sftp, including paths whose directories contain dots. (#49) -
git: commits view showed the wrong range. Commits are listed as
base..branch, with the base detected through@{upstream}and falling back to localmasterormain, and sorted newest first. The range is skipped onmasterandmainthemselves to avoid an empty listing. Diff and staging hotkeys now load when a repository is entered from favorites. (#50) -
samba: could not return to the connection list. Going up from the server level returned
smb://instead of nothing, so Backspace never got back. Adds F1 help, and fixesmc -Fnot listing plugins from subdirectories. (#34) -
Esc and F10 did not close the viewer and diff viewer. (#66)
-
Old ftpfs VFS module, superseded by the FTP panel plugin. Sources, tests, build macro and every
ENABLE_VFS_FTPconditional are gone, including the FTP fields in the VFS settings dialog and the--ftplogoption. (#38) -
Old sftpfs VFS module, superseded by the SFTP panel plugin. The libssh2 detection macro stays, since the plugin needs it. (#39)
-
WTable is model-backed. The widget no longer owns its rows; a datasource supplies data on every draw. Fixes a scrollbar off-by-one and a cursor crash on empty tables along the way. (#37)
-
One hotkey parser instead of five. The sftp, ftp, git, s3 and shell-link plugins each had their own copy, and they had drifted, so the same key name did not resolve identically everywhere. All now use the standard parser, and duplicated path helpers moved to a shared header. (#28)
-
Docker plugin split into domain modules, with test coverage and a better mount flow. (#42)
-
Spell plugin logging. The hard-coded
/tmp/mc-spell.logis replaced by mc's standard logging. (#11)