-
Notifications
You must be signed in to change notification settings - Fork 13
Release v6.1.0 PRs
Ilia Maslakov edited this page Sep 25, 2026
·
1 revision
Source: the pull requests merged after the v6.0.4 tag of 2026-09-02, that is
the Future Release milestone
and eleven more that carry no milestone yet. Snapshot: 2026-09-25.
The source set holds 109 merged pull requests. This table includes the 69
entries without the infra label; all of them were authored by
ilia-maslakov.
| PR ID | Summary | Tags |
|---|---|---|
| #333 | filemanager: Rearrange the menus of the file manager | Chore, core |
| #332 | Closes #331 mcommander(1) gains an ENVIRONMENT section, in all seven languages. It has three parts: what the program reads at start up, what it sets for the programs it starts, and the debug logs, with a command line that turns the ftp log on. The variables were described in whichever chapter happened to use them, and the log switches in no chapter at all. When ftp or samba does not work the first thing asked for is the log, and the only way to learn how to turn it on was to read the source. Left out: the variables that only tell the program what kind of environment it runs in, such as TERM and HOME, and the two that exist for the tests. |
Docs, core |
| #330 | - Split the help into one file per program: mview.md, mcedit6.md and mdiff.md beside mcommander.md, with the screens that exist only in the help kept in doc/hlp/xnc.md. - Let each dialog name the file its node lives in, through WDialog.help_file, quick_dialog_t.help_file and ev_help_t.filename, so the core no longer holds a list of the other programs' help files. - Fall back in order: the file that is open, mcommander.md, then the English copy of the same file, so a translation that lacks a node still shows it. - Add a help file to the seven plugins that had none: ftp, sftp, shell-link and arcmc, and the editor plugins ctags, etags and spell. F1 in their panels and dialogs opens it. - Fix F1 in the arcmc settings dialog and in its format list, which named the node without the file and ended with "Cannot find node [arcmc] in help file". - Refresh the text of all six translations, so the manuals describe the viewer with its three display modes, reading cursor and line filter, the editor with the clipfile and the search filter, the compare view with F9, Alt-e, Ctrl-s and F15, and the file manager with the terminal, the key bindings, the panel options and the user menu as they work now. - Write the manual of the compare view for Hungarian, Italian and Polish, which had none, and translate the quick reference of regular expressions in every language. - Add to the Russian manuals the chapters that only the English one had: the command line options of the three programs, and FEATURES, KEYS, MACRO, CODE NAVIGATION and SYNTAX HIGHLIGHTING for the editor. |
Feature, Docs, Chore, core |
| #329 | - Add a filter to the structured (tree) view: F6 keeps only the nodes whose key or value matches the pattern. - Take the pattern in the same Filter dialog as the ASCII mode, with the same search type, case and whole word settings. - Keep the path down to every match visible, and keep what is inside a match, so a matched node can still be expanded and read. - Count the matches in the status line, walk them with ] and [, and show "(no matches)" when the pattern matches nothing. - Match a node on the text its row shows, the key and the value, and leave the type name out, so a pattern like "text" does no - List the rows of the tree in the preview of the Check button, instead of the lines of the file. - Clear the filter on an empty pattern and o of the ASCII mode is still dropped when the tree opens, because it indexes lines and says nothing about a node. - Document the filter and its keys in the viewer chapter of the manual. |
Feature, mcview |
| #326 | Closes: #318 - Write every man page in doc/man/.md and keep the roff it produces in doc/man/roff/.1.in, so building from a checkout needs no converter. - Add maint/update-man-in.sh, called by make man-in, which runs go-md2man and settles eight things its output gets wrong for these pages. - Add maint/check-man.pl, which refuses markdown the pipeline cannot carry, and run it in CI together with a check that thdown. - Read the same markdown in the help window: a node per heading, named by the anchor behind its title, so the node a dialog asks for is found in any language. - Keep the license in doc/hlp/gnu-gpl-v3.0.m program ships, and reach it by a link that names a file. - Page the help window by the lines it draws instead of the newlines of the text, which is what left the end of a long node out of reach. - Convert the fifteen help files of the panel plugins and the lua scripts as well, so the window has one format to read. - Drop perl and python from the build dependwith it the only test that needed python. |
Feature, Docs, Chore, core |
| #317 | - Add Alt-S to search the terminal output for a pattern typed on the top row, as the quick search does in the panels. - Add Alt-Shift-S to show only the output rows that match a typed pattern, as the quick filter does in the panels. - Search up from the cursor and mark the match, so F2 copies it; Alt-S again moves to the match above and wraps from the oldest row to the newest. - Keep typing the filter while the cursor keys move over the rows that match; Enter keeps the view, Esc lifts the filter, and any other key ends the typing and then does its normal job. - Keep the filter by the mark or the word under the cursor on F4 and the filter toggle on F5, with no Alt keys for them. - Open the "The terminal" help section on F1 while no panel is on screen, and use the same node name in the translated manuals. - Enable F7 (Mkdir) and Shift-F4 (edit a new file) with the panels hidden; both work in the directory of the current panel, and Ctrl-L still clears the screen. - Fix F8 with the panels hidden, which asked to delete the file under the hidden panel cursor. - Document the new keys in the terminal section of the English manual, with modifiers written as Ctrl, Alt and Shift. |
Chore, core, mcterm |
| #316 | Closes #311 - Add Ctrl-Space inside an arcmc panel: the size of a directory in the archive is counted and shown in place of "SUB-DIR" - Take the numbers from the entry index that is read when the archive is opened. - Add MC_PP_ENTRY_DIR_SIZE_COMPUTED to the panel plugin API and raise it to version 19. - Keep the "This operation is not supported for plugin panels" message for plugins that do not handle CK_DirSize. - Document the new flag, the API version and the CK_DirSize contract in doc/PLUGINS. |
Feature, Plugin |
| #315 | Restore all widgets layered above the terminal - including open menus and dialogs after terminal busy-line redraws. Avoid unnecessary terminal and command-line resizes to prevent redundant redraws and visible flickering. |
Bug fix, core, mcterm |
| #314 | Lua syntax definitions have been updated to match Lua 5.4. The highlighter now recognizes new keywords and token forms introduced in 5.4. These revised definitions are used by the editor and the viewer. Existing Lua files will be highlighted according to the 5.4 grammar. This keeps in-editor highlighting aligned with the current Lua language. |
Chore, core |
| #313 | - Render DBF files inside the embedded Quick View instead of opening a full-screen table. - Keep the interactive full-screen DBF viewer for F3 and Enter. - Format preview columns with fixed widths and disable wrapping to preserve alignment. - Add Viewer palette support to runtime screens, including frames, headings, selection, and background. - Preserve the Viewer background when highlighting deleted DBF records. - Expose whether a Lua file-handler request targets an embedded viewer. - Add tests for embedded requests and runtime-screen palette handling. |
Bug fix, Chore, Plugin, mcview, lua |
| #310 | - Add mc.settings(handler) so a package registers the dialog it shows when its settings are asked for. - Ask the runtime for that dialog through two new calls, package_has_settings() and configure_package(). - List every Lua package in the Lua scripts dialog, not only the editor scripts, with a column for the part of mc it serves. - Open the settings of the package under the cursor on Enter or F4. An editor script without settings falls back to its list of actions. - Open the entry file of a script in the editor on F4 without closing the dialog. Leaving the editor comes back to the list. - Give the markdown viewer a settings dialog: the width of the text, the frame and the background of a code block, and the style of a decision in a diagram. - Keep those settings in $XDG_CONFIG_HOME/mc6/lua-markdown.ini and render the open document again when they change. The same dialog opens on "i" in the viewer. - Move "Manage plugins..." next to "Editor options..." in the Options menu. - Document mc.settings in doc/LUA_API_REFERENCE.md. |
Chore, lua |
| #309 | - Split lib/render.lua and lib/mermaid.lua into separate modules. - Group them by subject: config, text, sgr, spans, inline, document, measure, formula/, block/ and mermaid/. - Name the entry points document.render, document.blocks and measure.unwrapped_width. - Keep every setting in config. init.lua reads the width of the text and the width of a diagram from it. - Pass the state of a document to the inline pass instead of holding it in the module. - Give each block iterator its own state, so document.blocks no longer saves and restores it at every step. - Read a fenced block and an indented block through one function in block/scanner. There were two copies, and they had drifted apart. - Count cells in the diagrams with text.char_count, because a canvas gives one cell to a character. - Keep the rendered output as it was, byte for byte. - Copy the whole plugin tree in the runtime test instead of a fixed list of four files. |
Chore, mcview, lua |
| #308 | lua-markdown: Frame code blocks and give diagrams the width they need | Feature, mcview, lua |
| #307 | - Add structured_max_size and structured_max_nodes to the [Viewer] section: the largest file the tree view parses, and the largest tree it builds. - Show both in the Viewer options dialog, next to "Redraws to skip at most:". The size is typed in megabytes and kept in bytes. - Raise the node budget from one million to ten million. - Fall back to the defaults of the resolver when a setting is missing or is not a positive number. - Leave the depth, alias and expand limits of the resolver in code, without settings of their own. |
Feature, Chore, mcview |
| #303 | A panel now restores its prior sort order when a plugin closes. sort_field/sort_info are captured at plugin activation and restored in panel_plugin_close() before the directory is reloaded, and the captured values are written to panels.ini while a plugin is active.This prevents a plugin's default_sort_id/default_sort_reverse from permanently changing the panel or being recorded in panels.ini when the plugin exits. Swapping panels moves a plugin's sort along with its listing so the plugin's temporary ordering stays associated with that panel. |
Bug fix, panel, core |
| #297 | mc_setup_run_mode() now looks up the program basename exactly in the run-mode table that maps names to run modes and, for mctree and mcstruct, to a flag. A name that is not in the table starts the file manager. The old prefix matching made any name beginning with mcv, mce or mcd select the viewer, editor or diff viewer and led to accidental activations. Exact name matching prevents such accidental activations so names like mcedit2 and mcview-old no longer start the editor or the viewer. |
Chore, core |
| #296 | - Add a generator source: the viewer keeps the bytes produced so far and asks the source for the next portion from the event loop, a bounded amount of work per turn, so keys and redraws are served while the rest of the text is still made. - Keep the produced bytes in the source, not in the view, so F8 to the raw file and back replays them and goes on instead of starting over. - Say "not found in the text rendered so far" when a search reaches the end of what the source has made, instead of a plain "not found". - Add mc.source.generator for Lua handlers: an optional first chunk and a next() that returns the following one, or nil at the end. It is offered only when the host has the viewer generator capability.- Render markdown block by block: the handler fills the first screen, hands the rest to the generator, and keeps a width that was rendered to the end. - Speed up the renderer: trim walks the ends of the string instead of rewriting it twice, split_lines uses a plain find, join_display_math trims only the lines that hold a dollar sign, and the tokenizer keeps a run of plain text in one piece.- Raise the size limit of the markdown handler to what the host keeps for one source, and stop below it with a line saying the rest is not rendered. - Show a markdown file over the limit as it is, with the reason in the title, rather than hand it back to the slower mc.ext.ini handler. Without the Lua plugin, and for a file inside a VFS, that handler still applies. - Document mc.source.generator in the Lua API reference. |
Feature, Plugin, mcview, lua |
| #295 | - Add a Viewer options dialog to the Options menu: line wrap, syntax highlighting, mouse page scrolling, remembered file position, tree view of JSON, YAML and XML, the end of file marker and how many redraws may be skipped while a file is being read. These settings could only be changed in the ini file, or for one file at a time by a key in the viewer. - Group Diff viewer options, Viewer options and Editor options together in the Options menu. The dialogs of the editor and of the compare view were only reachable from inside them, so their settings could not be changed before a file was open. - Move the viewer settings to a [Viewer] section of the configuration file under short names: wrap, syntax, mouse_move_pages, remember_file_position, structured_auto, eof and dirt_limit. A file written by an older version is read once under the old names and written back to the new section. - Keep what the Viewer options dialog sets: a view writes back only the modes the user switched by hand in it, and never a mode that came with the source, such as nroff for rendered Markdown. A viewer still on the screen used to undo the change, and the quick view panel undid it on the next cursor move. - Apply the editor options to every editor on the screen, not only to the one the dialog was opened from, and reload the syntax rules when that option changes. - Write the options of the compare view back only from a view they were changed in, so a view left on the screen does not undo what the menu set. - Document the three menu entries and the [Viewer] section in the manual. |
Chore, core, sandbox |
| #294 | - Fix the loss of syntax colors in the viewer after a file that renders itself, such as Markdown through the lua script or a man page through an mc.ext rule. - Keep the display mode chosen by the source with the view that shows it. - Restore the global viewer flags around a viewer started from an mc.ext rule or from the user menu, so the %view{...} keywords hold for that one file. - Keep a mode the user switched on by hand in the viewer, and stop counting the global flags a new view starts with as a change made by the user. |
Bug fix, mcview |
| #293 | The circle node written as ((text)) is now drawn as ( text ) on a single row with no dashed lines above or below. The previous dashed rows made the circle node resemble the rounded box (), so this clarifies the visual difference between the two shapes. A test chart that includes both shapes was added. |
Chore, Plugin, lua |
| #292 | - Give every class in a class diagram its own frame color and paint its outgoing lines the same color, so a line is read together with the class it starts from. - Keep lines apart where one only passes over another, and join them only where they really share a path. - Draw a flowchart node in the shape it was written with: a box for [], a rounded box for (), a circle for (()) and a diamond for {}. - Draw a decision with braille dots: sloped sides, a straight run over the label and the points of the diamond outside the slopes, where the lines come in. - Keep a decision three rows tall, the height of an ordinary box. - Set DECISION_STYLE at the top of mermaid.lua to "box" for a font without braille; the decision is then built from box drawing characters. - Order the turn columns of the connectors by how far a line travels, so a line never crosses one that turned before it. - Add golden tests for node shapes and for a two-class diagram. |
Feature, Plugin, mcview, lua |
| #291 | - Fix a race condition that sometimes opened the editor with empty content. It happened when the directory watcher reread the other panel just before F4. - Set the working directory back to the directory of the current panel after the pending rereads are done. - Fix every command that names a file without its directory. Before the fix, these commands worked in the directory of the panel that was reread last. - Keep the working directory as it is when no panel was reread, when the current panel is not a listing, and when the current panel is panelized. The working directory of the current panel is restored after pending directory-watcher rereads complete. This preserves the process location so commands that name files without a directory, like F4, operate in the intended panel. Previously, a reread left the process in the reread panel's directory, so such operations ran in the wrong place and could open or create files in the other panel. The bug could be triggered when the viewer wrote into a temporary directory, the panel watcher reread that panel, and the next F4 acted in the temporary directory instead of the current panel. |
Bug fix, panel, core |
| #290 | - Add mc.syntax.scan(text, options) so a Lua script can color text with the same rules the editor and the viewer use. - Pick the rule set from options.type, the name the Syntax file gives it such as "C Program", or from options.filename; without both, the first line of the text decides. - Return the colors of the rule set once, each with fg, bg and attrs, and the runs the scanner found, each with a byte offset, a length and the index of its color, so a script can draw them any way it likes. - Walk a line-local rule set line by line, the way the editor and the viewer draw it, instead of returning nothing for it. - Take the first line from at most 256 bytes, the length the editor and the viewer use, and refuse a text over 4 MB with "too_large", the size past which the viewer stops running the rules. - Report "not_supported" when no rule set matches and "not_ready" when the runtime has no syntax service. - Append the host service and the capability MC_RUNTIME_HOST_CAP_SYNTAX to the runtime API, so a plugin built against the older struct keeps working. - Document the new call in doc/LUA_API_REFERENCE.md and doc/lua-api.json. mc.syntax.scan(text, options) colors text using the editor's syntax rule set. options.type names the rule set the same way a Syntax file does, options.filename selects it by name, and if neither is given the first line of the text (taken from at most 256 bytes) determines the rule set; a line-local rule set, which keeps no state between lines, is walked line by line the way the editor and the viewer draw it. The call returns the rule set's colors and the scanner runs it found, each run reported with byte offset, length and color index, and it rejects texts larger than 4 MB with too_large.The runtime API is extended with a host service and the capability MC_RUNTIME_HOST_CAP_SYNTAX, so plugins built against the older struct keep working and a runtime without the service reports not_ready. Tests exercise the host service against a Syntax file and cover selection by type, by name and by first line, line-local processing, run reporting and the 4 MB limit, and the Lua runtime side is checked as well. |
Feature, Plugin, lua |
| #289 | - Add footnotes and reference links: a reference is shown as [n] with the notes under a rule at the end, and [text][ref] takes its URL from the definition. - Show emphasis as SGR italic, give each heading level its own color, strike out - Color a fenced code block with the syntax rules of the editor: the language of the fence picks the rule set, and a fence without one is chosen by the first line of the code. - Draw mermaid diagrams: a flowchart in boxes laid out by layers, a sequence diagram with lifelines and framed alt branches, and a class diagram with fields and methods; a diagram that does not fit the screen falls back to a tree or to a column, and a kind that is not drawn stays a code block. - Draw display math environments: matrix, cases, array, aligned and the rest, with brackets built from box pieces, nested environments, accents such as \vec, the limits of a big operator, and matrices inside $...$. - Measure text in columns: a Japanese character or an emoji counts as two, so wrapping, table columns and cell padding follow what the terminal draws. - Place list items by nesting level with a bullet per level, show task lists as boxes, expand tabs in code to eight columns, indent definition lists under their term, and break a long word after a slash or a dash instead of cutting it. - Read the html a document carries: headings, list items, rules, summaries, pictures and table rows; name the file a picture comes from instead of showing its text alone. - Keep the block as code when a diagram cannot be read, keep the renderer working outside mc, where no rules and no drawing are available, and leave pictures undrawn: nothing is fetched and nothing is shown for a picture from the network. |
Feature, Plugin, mcview |
| #288 | - Add ANSI SGR parsing in nroff mode. - Consume OSC/DCS/APC/PM/SOS control strings and underline OSC 8 hyperlinks. - Render nroff overstrike pairs as their corresponding Unicode glyphs. - Ignore form feeds in nroff mode. - Add comprehensive viewer, ANSI parser, search, and terminal-mode tests. |
Feature, mcview, core |
| #287 | ext.d now formats nroff documents according to the locale charset. text.sh pipes document text through preconv into nroff -Tutf8; in an 8-bit locale the formatted output is converted to the locale charset with iconv using transliteration. MAN_FLAGS keeps only -c so MANROFFOPT in mcedit.menu no longer forces the latin1 device, and viewing man pages still goes through man which performs equivalent conversions. configure chose -Tlatin1 at build time for every locale. nroff passes the bytes of an 8-bit text through, so a KOI8-R document in a KOI8-R locale kept its letters, but the glyphs groff draws itself, like the bullet, came out as other characters. In a UTF-8 locale -Tlatin1 overstrikes each byte of a multibyte letter separately, and the text breaks. MAN_FLAGS keeps only -c, so MANROFFOPT in mcedit.menu no longer forces the latin1 device on man. |
Feature, core |
| #285 | - Keep color pairs in an array by pair number, in addition to the table keyed by "fg.bg.attr". - Replace the O(n^2) search for a free pair number with an O(1) step from the lowest free number, so allocating n pairs is O(n) instead of O(n^3), and replace the O(n) lookup of a pair by its number with an O(1) array read. - Fix the slow allocation of new color pairs: allocating 3840 pairs takes a few milliseconds instead of more than 4 s. - Look up a pair by its number with one array read in tty_color_pair_background(), tty_color_pair_foreground(), tty_color_pair_rgb(), tty_color_pair_compose() and tty_color_release_temp(). - Remove a released temporary pair by the key it stores, instead of walking the table. - Preserve the numbering: a new pair still takes the lowest free number, and a released number is reused first. - Keep the S-Lang and ncurses backends unchanged. - Add tests/lib/tty_color.c for the pair numbers, reuse of released numbers, shared temporary pairs, tty_color_free_temp(), tty_color_free_all() and many pairs. |
Bug fix, Chore, core |
| #284 | - Fix the full screen clear and redraw that S-Lang did when the first shell prompt appeared under the panels. - Allocate the color pairs for the prompt row before the first draw: the 16 text colors and the default one, plain and bold, on the default background. - Keep mc's own "$" in front of the command line until the shell draws its first prompt, instead of a short "(background |) /path/" busy line. - Wrap each S-Lang refresh in synchronized output (CSI ?2026h / CSI ?2026l) on xterm-like terminals, so a terminal that supports the mode shows a full redraw as one frame. - Keep the busy line for real commands that run while the panels are shown. - Keep background colors out of the preload, because each new pair is still slow to allocate. A prompt with a colored background can still blink once per new color. - Leave the ncurses build unchanged. mcterm no longer shows mc's busy line in front of the shell before the shell draws its first prompt. The prompt overlay returns NULL while the first sync with the shell is pending, so no placeholder path or busy indicator appears between mc's command-line marker and the shell prompt. The color pairs used for the shell prompt row are now allocated before the first draw (plain and bold of the 16 text colors plus the default) to avoid S-Lang marking the screen trashed and causing a visible panel blink; the background color is intentionally not preloaded to avoid the long pair-search overhead at startup. |
Bug fix, Chore, core |
| #283 | - Show the commits that the merge brought in when the branch is already merged into its base (upstream, master or main). - Find the merge by taking the oldest commit on the first-parent line of the base that has the branch in its history. Show the range from that merge's first parent to the branch. - Show the full log of the branch when no merge commit is found, as for master itself. - Show the branch log instead of an empty view when the branch has no commits over its base. - Fix the commits view for merged branches, which was empty before and then showed the whole history of master. - Merge the three copies of the git log call into one helper, git_run_branch_log(). |
Plugin, panel, sandbox |
| #282 | When an sftp connection fails, its window stays open and shows the logged steps with a Close button, and the bottom line reports the error as Cannot connect to host:port with the underlying cause or Authentication with host:port failed with libssh2's message. A socket that could not be opened now reports whether name resolution failed or the connection was refused.Enter on an sftp entry attempts the connection only once: only chdir() opens the connection and enter() defers to chdir(), which the core calls for a directory when enter() did not open it. This prevents duplicate connection attempts and duplicate failure reports. The connection window is redrawn when it grows to remove leftover text artifacts, and sandbox tests exercising two failing sftp connections are added. |
Bug fix, Plugin, panel |
| #281 | group_default_set_state() hands the focus to the current widget when a focused group is activated, as well as when the focus itself is set. A dialog is focused from the start, so dlg_init() activating it is when its current widget gets MSG_FOCUS. Other states of the group, WST_IDLE among them, still do not reach the current widget. Since 0cf05f536 only WST_FOCUSED did. The viewer sets its button bar on that first MSG_FOCUS, so F3 opened a file with the labels of the bar missing until the first key. tests/lib/widget/group_set_state.c gets a case for the activation. |
Bug fix, core |
| #279 | Closes: #278 - Copy and move a directory from a local panel into a panel a plugin drives: F5 and F6 now take a directory, everything below it included. - Add the optional mkdir() callback to the panel plugin API, raise the API version to 18, and let put_file() take a destination name with directories in it. - Give the ftp plugin mkdir(): one MKD per part of the path, and a name that is a directory already is not an error. - Report "This plugin takes files, not directories" for a plugin that has no mkdir(), where a directory was dropped from the copy without a word before. - Erase the local directory after F6 only when the whole tree has arrived, and without asking again about each directory in it. - Keep every other plugin taking single files: sftp, samba, s3 and the rest are untouched. - Add the fileops/05-upload cases: F5 and F6 into an ftp panel with a file, a directory with what is below it and an empty directory. The ftp server in the sandbox takes writes for this. - Rebuild a subject's fixtures on the remote host before each case when a rebuild-remote file sits next to them, so what one case writes there is not handed to the next. - Document mkdir() and API 18 in doc/PLUGINS, and the new cases in the sandbox README. |
Feature, Plugin, panel |
| #277 | The wait for the child output starts again on EINTR with a new fd set, and only a real select() error is reported. select() is never restarted by the kernel, even for a handler set with SA_RESTART, and it leaves the fd set untouched on an error. A read that followed such a select() could block on stderr while the child was blocked writing stdout into a full pipe. This hung the viewer on a PDF page with a picture when the window was resized: img2sixel writes far more than a pipe holds, and a resize sends SIGWINCH. Test: tests/lib/utilunix__mc_pread_signal.c |
|
| #276 | - Generate the built-in helper text from the files in helpers/ at build time and remove the hand-written copy of it. - Send the current scripts to the remote side when no installed helper is found. Nine of the eighteen built-in copies had fallen behind the installed scripts: the built-in get was three protocol revisions old and the built-in ls had none of the symbolic link handling. - Keep the list of helper names in one file, helpers/helpers.mk, read both by the install rule and by the generator. - Read the revision of a helper from the script text instead of a second copy of the number in shfs_helper_table. - Add a test that compares every built-in copy with its file and requires each script to declare a revision. - Keep the order in which a helper is looked up: the per host copy in the user directory, then the installed one, then the built-in text. - Keep the generated header out of the release tarball, which ships the scripts it is made from. Based on the approach in MidnightCommander/mc#5155 thnx Phil Krylov @tuffnatty |
Feature, Plugin, panel |
| #275 | - The panels follow the filesystem themselves: inotify plus a debounce on a timerfd; a hidden panel is marked and reread when it comes back on screen, which was the original case of a file created while the panels were hidden. - New option "Watch directories" in Panel options, on by default; while it is on, "Fast dir reload" is dimmed. - Help added in English and Russian. |
Feature, panel, core |
| #273 | Bulk marking now emits a single selection event instead of one event per marked file. Operations such as select and unselect by mask, select by extension, invert selection, and the summary rebuild hold the selection event until the marking loop finishes. This avoids repeated walks of the full file list and repeated construction of file snapshots during bulk marking. It reuses the counter from the summary rebuild to defer publishing until the loop ends. The result is a large speedup: selecting with mask * in a 10,000-file directory falls from about 70 s to 0.2 s, and 100,000 files also take about 0.2 s. |
Bug fix, panel |
| #271 | The viewer remembers which keys it offered to a source and does not offer the same key again after applying its own keymap, preventing a source whose owns_key() returns true from receiving a key twice. Function keys are recognized together with their modifiers, so shifted or alt F-keys are treated as function keys and handled by the viewer's commands rather than being passed through. lua-pdf counts pages with pdftohtml when pdfinfo is not present so documents are not treated as every-file-is-one-page and the page keys work. Text layout and status/name truncation are measured in terminal columns via mc.ui.text_width so wide characters take two columns and names are shortened by whole characters rather than bytes. Page images are only written when the terminal can draw them (sixel or chafa), chafa is used to render images when sixel is unavailable with a "[image]" placeholder and a "no pictures" status when neither renderer exists, the reader retains only recent text runs on disk, and runs that failed to be read are not marked as read so they are retried. |
Bug fix, mcview, lua |
| #270 | - Add the lua-pdf viewer: pdftohtml -xml gives the text runs and the pictures of a page, drawn as text and as sixel. - Write each page out whole so the viewer scrolls it, with > and < for pages, / for search and i for the menu. - Give a runtime viewer source keys of its own and a starting row for the terminal display. - Keep a sixel picture with the row that scrolls into the history. - Send application/pdf to the plugin from magic.ini for Enter and F3, and drop the pdftotext rule from mc.ext.ini. ### Details A viewer runtime source can declare up to 32 named keys and receive them via mc.viewer_source.define and its on_key(session, params, key) callback; the source is consulted before the viewer keymap and may return new params or nil, while function keys, Esc, "q" and Ctrl-O are refused as viewer-reserved. A prepared source may set top_row to control which output row the terminal display opens at, pictures are tied to their live-screen row so they follow scrolling into history and are dropped when that row leaves history, and scrolling in terminal mode now stops at the first row (fixing a jump caused by interpreting -1 as follow-to-end).The PDF viewer lua-pdf renders the text layer as real text and page images as sixel (via img2sixel or chafa) by converting pages with pdftohtml -xml, writing pages whole and scrolling them like terminal output; pages are read in runs and cached in a temporary directory removed on session close. It provides three layouts -- "text", "page" and "fit" -- with "text" mapping document lines to screen rows, and keys > / <, p, + / -, /, n / N and i to paginate, jump, zoom, search and open the action/layout menu while F6/F7 remain the viewer's own row-based search/filter. The status line shows the file, prev/next page keys and page count (shortening long names in the middle), the plugin is bound to application/pdf via magic.ini replacing the piped-pdftotext rule, and the viewer falls back to raw or text-only output with a "[image]" placeholder when external tools or sixel are unavailable; F1 opens the [PDF Viewer] help. |
Feature, Plugin, mcview, lua |
| #269 | The viewer now restores the terminal for a source that requested it when hex mode is left, unless the raw file (F8) is displayed. Entering hex still frees the terminal because hex mode reads the file bytes. Leaving hex previously did not restore the terminal, which let escape sequences appear as plain text until something else rebuilt the terminal. This change prevents losing the rendered view of sources that draw with terminal escapes - lua-sixel, lua-pdf, and docker and k8s logs - when toggling hex or pressing F4 repeatedly. |
Chore, mcview, core |
| #266 | - Replace repeated word character searches with shared byte lookup tables. - Read the previous byte once per scanner step and precheck keyword boundaries. - Precompute keyword candidates by starting byte, accounting for pattern tokens while preserving rule priority. Syntax highlighting now tests byte membership by indexing a 256-entry table (syntax_charset_t) instead of walking the NUL-terminated string with strchr. The byte before a candidate start is read once by apply_rules_going_right() and passed down rather than re-read per keyword. Each context keeps a keyword_candidates list keyed by start byte, and the index is refined by pattern_first_bytes() so pattern-starting keywords are only tried where they can actually begin. These changes cut the number of strchr and per-keyword tests by large factors and reduce instruction counts and memory scans. On a 5.2 MB C corpus the engine's read throughput rises from about 5.4 MB/s to 26 MB/s and highlighting time falls from roughly 4.8 s to under 1 s in the tested runs. |
Feature, mcedit, core |
| #265 | - Separate rule set selection from parsing and use a directive dispatch table. - Split pattern matching into token handlers and centralize byte reading, case folding, and keyword activation. - Fix include file and rule cleanup, and preserve off_t offsets for + matches. - Add regression coverage for rule selection, include errors, repeated loading, incomplete directives, and context boundaries. |
Feature, mcedit |
| #264 | Enter turns the reading cursor on, and off again; a mouse click and the keys that mark turn it on as well. With the cursor on, the arrows walk the text and the shifted arrows mark it, while Ctrl-U and copying turn it off. Enter keeps its Down action in hex and tree modes, where there is no cursor to show. The cursor came up on the first arrow key, so reading a file with Up and Down started marking instead of moving the view. |
Feature, mcview |
| #263 | The mouse wheel now scrolls the Help window two lines up or down at the pointer, including when the pointer is over a link. Previously the Help mouse handler only inspected clicks and returned on other messages, which caused the widget layer to mark wheel events as handled and drop them. The handler now handles wheel messages so those events reach the Help window and perform scrolling. |
Feature, core |
| #261 | Fixed missing XML syntax highlighting after viewing Markdown. The Markdown handler's nroff mode leaked into subsequent viewers, bypassing syntax coloring. Source-specific formatting now preserves the global nroff setting, while manual changes in ordinary viewers remain persistent. - Added regression tests; all 7 viewer test suites pass. |
Bug fix, mcview |
| #260 | mcview_cycle_display_mode() now calls mcview_syntax_load() after it changes the ansi and terminal flags. mcview_toggle_ansi_mode() already performed that same reload. With viewer_syntax_highlighting on, Syntax's catch-all rule caused a syntax to be loaded for every file, so the character reader consulted the syntax for colors first and never reached the ANSI parser. Reloading the syntax after the mode change makes the reader pick the correct color source immediately and prevents raw escape sequences from remaining visible for an extra cycle. |
Bug fix, mcview |
| #259 | F2, F3, F4 and F5 now stop at the terminal while it has the screen to itself, even when there is nothing to take, mark or filter. Previously those keys passed through to the file manager when they had nothing to do, so the panel hidden behind the terminal received unintended commands (for example F4 opened the editor on "..", F5 asked to copy it and F2 offered to import the user menu) while the button bar still showed the terminal's labels. Enter still falls through because it is the shell's line, and keys continue to fall through while a panel covers the terminal. |
Bug fix, mcterm |
| #249 | mcterm starts fish with the integration passed via fish's -C option so the shell integration reaches fish on its command line instead of being typed at the first prompt. mcterm_shell_rc_new() builds the -C argument with the session token and mcterm_shell_setup() returns NULL for fish, mirroring zsh. This prevents the integration line from entering the user's history and from being visible to scripts that read the prompt line. It also preserves the user's prompt function because fish runs -C after the user configuration file and before the first prompt. |
Bug fix, core, mcterm |
| #248 | mcview_display_text calls mcview_selection_render_begin before the rows are drawn, mcview_selection_record for every character and newline it lays out, mcview_selection_render_end after, and paints the selected characters with the selection colour. | Bug fix, mcview |
| #245 | - Extract the editor's lexical scanner into a shared syntax module. - Add syntax highlighting to the viewer and diff viewer, preserving diff backgrounds and changed-word markers. - Reference-count temporary color pairs and query the terminal background to adapt diff colors. - Tune diff colors in skins and preserve original filenames in Git temporary copies for syntax detection. |
Feature, mcview |
| #243 | - Handle Ctrl-Insert and Shift-Insert consistently with panels shown or hidden. - When no text is selected, copy marked files, the command line, or the current filename, in that order. - Paste clipboard text as a single line and ask for confirmation above 2 KB. - Keep PTY transfers non-blocking and report incomplete pastes. - Add clipboard, PTY transport, and command-line regression tests, including portability fixes. ### Details Ctrl-Insert copies into the clipfile the marked files of the visible panel when nothing on the command line is selected, otherwise it copies the whole command line, and if neither applies it copies the file under the panel cursor. Password inputs never put their text into the clipfile; dialog inputs copy their own text, and panel navigation steps update the clipfile only when the file manager is the top dialog. Shift-Insert pastes the clipfile into the command line as one line regardless of panel visibility and whether the line is owned by mc or by the shell in mcterm; line breaks and other control characters become spaces, and pastes larger than 2 KB prompt for confirmation. Shell-owned pastes go through mcterm_send_text / mcterm_pty_send which write to the pty master in non-blocking 256-byte pieces, read any echo in between, invoke a drain callback when the master has output to read, and count the stall timeout from the last successful write so a slow reader cannot hang the key handler; a paste the shell does not accept fully is reported in a message box. Pastes into mc's own input insert the verified bytes in one g_string_insert_len call rather than per-byte inserts; clipboard_text_from_file now reads the clipfile in one piece and input_clip_text maps lone CR to a space, drops only the CR of a CRLF pair and preserves the declared length so NUL and other control characters become spaces, and tests exercise the pty transport and command-line edge cases. |
Feature, core |
| #241 | - Browse assembly references, resources, namespaces, types, and members. - View decompiled C# or IL, edit sources, and export assemblies as projects. - Navigate referenced assemblies, find usages across opened assemblies, and reload rebuilt assemblies while preserving the current location. - Support assemblies from local files, archives, and remote panels. mcpeek is a panel plugin that reads PE and CLI metadata and lists an assembly as a tree of references, namespaces, types and members; Ctrl-PgDn on a .dll, .exe or .winmd opens it and the plugin menu opens a directory as a set of assemblies. The metadata reader carries the physical layout of every metadata table and computes index widths in a second pass so tables and heaps are placed and decoded correctly. Signatures print in C# spelling and function-pointer signatures are consumed inline so overloads are distinct and no signature decoding is left at the wrong offset. Enter or F3 on a member opens its IL in the viewer (the plugin writes a temporary .il file), showing header, locals and one line per instruction with branch targets resolved and tokens printed through the tables to names; F4 edits, F5 copies and Quick View follows while walking the list. F3 on a member also shows the type decompiled to C# (Shift-F3 shows the IL), F5 on a namespace writes a compilable project and the export carries a portable PDB so the written source is debuggable, references can be followed into the assemblies they name, and Alt-F7 lists uses across the opened assemblies while following forwardings. |
Feature, Plugin, panel |
| #240 | The tty code now detects Ctrl-Enter from the input terminal's ICRNL flag as returned by tcgetattr. A bare '\n' is treated as Ctrl-Enter unless ICRNL is set on the input fd, in which case the kernel has already translated Enter ('\r') to '\n'. S-Lang and ncurses backends turn ICRNL off at init, so Enter arrives as '\r' and '\n' is recognized as Ctrl-Enter from the first byte. This fixes the previous behavior where '\n' became Ctrl-Enter only after a '\r' had been seen, causing the first Ctrl-Enter after start to be taken as Enter. |
Bug fix, core |
| #239 | The editor writes an info file next to the clipfile, mcedit.clip.info, with the MD5 digest of the clipfile, the kind of the block (text or column) and the codeset name from the codepages list. On paste, if the digest matches the clipfile the text is recoded with iconv into the editor's current codeset (characters not representable become '?'); bytes are copied unchanged when the codesets already match, when iconv does not recognise the codeset, or when the clipfile has no info or a stale info (input line, viewer, external clipboard, another writer). The clipfile itself is now plain text because the vertical marker "\1\1\1\1\n" is moved into the info file, so external clipboard utilities and the input line receive only the text.Copy to file from the editor continues to keep the marker in the user's file and the marker is still recognised on insert, while clipboard writers outside the editor must drop the info file. This prevents pastes from producing garbage after changing the editor codeset (Alt-E) and stops the vertical marker from leaking into external clipboards. |
Feature, Chore, mcedit |
| #238 | - Add mouse and keyboard text selection in ASCII mode, including word and line selection. - Show the text cursor and support arrow-key navigation, scrolling at viewport edges. - Copy selected text to the clipfile and external clipboard with Ctrl-Insert or Enter, stripping ANSI/nroff formatting and expanding tabs. - Respect filtered lines when copying; update keymaps, documentation and regression tests. |
Feature, mcview |
| #237 | - Add a Lua-based Markdown viewer with headings, emphasis, links, lists, code blocks, tables, and basic LaTeX rendering. - Add nroff as an initial viewer display mode for bold and underlined output. - Re-render content when the viewer width changes and support F8 for switching to the raw file. - Register Markdown extensions and install the Lua package. - Add rendering fixtures, unit coverage, documentation, and Docker UI tests. ### Testing - Lua runtime tests: 22/22 passed. - Markdown F3/F8 UI tests: 12/12 passed. |
Feature, Plugin, lua |
| #235 | The ANSI parser in mcview no longer treats a CSI that contains a private marker or an intermediate byte as an SGR sequence, so SGR parameters are applied only for plain SGR CSI sequences. This prevents sequences like CSI > 4;1m (sent by fish 4 for modifyOtherKeys) from being misinterpreted as SGR 4 and 1 and causing the prompt in mcterm to appear underlined and bold.The file manager avoids a divide-by-zero in repaint_file on very small terminals by ensuring panel_lines is never zero and enforcing the minimum panel height. This stops mc from crashing with SIGFPE on tiny displays. |
Bug fix, mcterm |
| #233 | Control characters that are not shown (the "Show control characters" option is off) took one blank cell on the screen and one column in the cursor layout. A hidden "\r" still shifted the rest of the line to the right. Now they take no cell at all: - edit_control_char_width() returns 0 when the characters are hidden, and edit_draw_this_line() emits nothing for them - the editor options dialog drops the cached column layout when the option changes, the same way the menu toggle does; the callback is shared by both callers With a zero width the cursor could stop right before a hidden character, and the next key press did nothing on the screen. The cursor and the delete keys now treat a hidden character as part of the shown character next to it: - edit_move_forward3() lands after hidden characters when it looks up the offset of a column (up, down, mouse click, column block) - Left and Right step over them together with the shown character - Del deletes the hidden characters under the cursor together with the shown character after them - BackSpace deletes the shown character before the cursor together with the hidden ones next to it In a CRLF file with hidden "\r", Del at the end of a line and BackSpace at the start of a line remove "\r\n" as one unit. Tests: edit_control_chars is updated for the zero width and gets four new cases for the column lookup, the arrows, Del and BackSpace. |
Bug fix, mcedit |
| #232 | Tokyo Night is added as a truecolor skin for mc6. It includes mctree, mcterm, mcstruct-tree, mcstruct-hex and mcstruct-def sections, all using the Tokyo Night palette aliases. The skin provides a consistent truecolor appearance across the main UI, embedded terminal and structure views. Plugin panels that expose these sections will inherit the same palette so colors match the rest of the interface. This makes the Tokyo Night theme usable for configurations that rely on full 24-bit color. Reviewed skin is taken from upstream (PR #5114) and extended with the mctree, mcterm, mcstruct-tree, mcstruct-hex and mcstruct-def sections using the Tokyo Night palette aliases. |
Feature, core |
| #231 | - Allow entering symbolic links to directories in shell-link panels and mark dangling links correctly. - Respect the panel settings for hidden and backup files in filesystem-like plugins. - Keep lynx-like left/right navigation inside the active plugin panel. - Bump the panel plugin API version to 17. |
Bug fix, Plugin, panel |
| #230 | Skins now keep an explicit color class (16, 256 or true color) taken from the skin's flags and shown as a button next to the skin name. The Color dialog offers the 256 and RGB pickers only when the skin's class allows them, and saving a change that would raise the class prompts first and names the key that needs the higher class. Colors named color0..color15 are treated as basic 16-color skins, and the editor will display such skins on a 16-color terminal instead of refusing to show them. The 256 and RGB pickers also open for keys that already hold such values in a lower-class skin: color0..color15 select their cell in the 16 palette and the 256 picker opens on the current value. If a skin declares a class higher than the terminal can show, the editor edits it without the preview (the class button indicates this and Save writes the file but does not activate the skin); class changes go on the undo stack and the class button text is clamped and refit on resize. |
Bug fix, Plugin |
| #229 | All 50 skins were checked by eye in the skin editor, screen by screen, and corrected where the text did not read well against its background: viewer underline and bold, editor nonprintable, hex changed marker, marked and selected lines, help links, menu hotkeys and others. Every skin now has color sections for the embedded terminal, the structured view in the viewer and the mcstruct plugin, in colors that match the skin's own palette. Adds the Mashdark 256-color skin from upstream. |
Feature, core |
| #228 | execute_menu_command() no longer unlinks the temporary per-menu command script after launching it. The script still begins with rm -f "$0" so it removes itself when the shell actually runs it. Some shells only open the command file after shell_execute() returns, and removing the file earlier caused "/bin/sh: /tmp/...: No such file or directory" errors when starting a terminal. Entries run in the viewer or via system() are unaffected because those shells hold the file open before the rm runs. |
Bug fix, core |
| #227 | The samba plugin implements get_focus_name. When chdir("..") leaves the connection base URL, the plugin stores the connection label as the focus name and the host places the cursor on that entry in the connections list. The transition is performed in samba_leave_connection.Previously the host took the focus name from the last component of the plugin title (the share or server name), which does not match any entry in the root list, so the cursor remained on the old index and pointed at the wrong connection. The change is covered by tests. |
Bug fix, Plugin, panel |
| #226 | plugins: add an interactive skin editor | Feature, panel |
| #225 | mcterm now keeps the shell line anchored to the command-line row; any shell output drawn below that row, for example a zsh completion list, is rendered above the command-line row instead. The cursor stays on the command-line while the shell is at its prompt, and marked text copied over the hidden row excludes that row. A parked shell line is typed back at the first prompt after an internal cd or panel switch. mcterm stops reading the shell line at the last row the line actually occupies, so completion lists below the input are not mistaken for input, and the screen snapshot for internal commands is taken after the shell has redrawn the cleared line to avoid stale cells or trailing fragments. |
Bug fix, mcterm |
| #223 | The editor toggles the display of control characters between caret notation (^M, ^L, ^W) and a single blank cell per control character. Column layout follows the selected mode, so the cursor remains on the same byte after switching. The action appears in the Command menu as Toggle control characters and in the Editor options dialog as Show control characters. The setting is persisted as editor_show_control_chars. |
Feature, mcedit |
| #222 | The Move dialog now lists only hotlist groups and opens a group on Enter. The entry being moved is omitted from the list so a group cannot be moved into itself, and ".." or Left go up one level. The Move button or F6 places the entry at the end of the group currently shown, including the original group; when there is no group to move to a message is shown instead of an empty dialog, and after a move the cursor stays on the next row. The dialog uses a slightly narrower layout without an inner frame and shows a title like Move "x" to /a/b, and the hotlist title now uses the same Hotlist: /a/b form. init_movelist and done_movelist now set and clear the moving state and dialog pointers, fill_listbox no longer compares against a stale l_movelist, and link_entry_last is reused by both add2hotlist and the move. |
Feature, core |
| #221 | The Active VFS list (Ctrl-x a) is removed because with only extfs and sfs left it had nothing useful to show. The Hotlist is reworked to store any panel location, including local directories, VFS paths and panel-plugin addresses, and it prevents adding duplicate locations. panel_plugin_location() centralizes retrieval of a plugin panel address, and the command-line cd accepts plugin addresses so Ctrl-Enter in dialogs and the "Add current" action on plugin panels work correctly.Several panel plugins, git, docker, k8s and arcmc, now return the same location strings used in directory history (for example git:/repo or docker:/profile/containers/...), so open operations restore the original address. Quick-search, emphasized list entries and text-alignment fixes improve list widgets and dialogs, and a couple of small memory fixes remove leaks. |
Feature, core |
| #220 | The user menu now edits itself. Entries are kept in a key file, .mc6menu of the directory or ~/.config/mc6/menu.ini, and the list edits them: Ins adds a command or a submenu, F4 edits, Del removes, Ctrl-Up and Ctrl-Down move, Shift-F4 opens the file, F5 imports marked entries from a menu written by hand. Submenus nest to any depth. Commands use the same substitutions as before, and labels show them expanded. Nothing is shipped: a new user starts with an empty menu. WTextArea is a new widget, a field of several lines: it types, marks with Shift and the mouse, and copies and pastes through the clipboard file. Tests cover the widget, the menu file, the import and submenus; mc(1) describes the new menu. |
Feature, core |