Added src/vfs/redox_scheme.rs — VFS backend that maps scheme:name/path
to Redox kernel scheme operations via redox_syscall. Implements:
- read_dir: opens scheme dir, reads newline-separated entry list, stats
each child for metadata
- stat/exists/is_dir/is_file: via open(O_STAT) + fstat
- open_read: via open(O_RDONLY) + read, buffers file content
Gated behind #[cfg(target_os = redox)] — entire module compiles out
on Linux. Registered in vfs/mod.rs for_path() dispatch under "scheme".
Includes path parsing tests for scheme:file:/home/user paths.
This is the last remaining MC parity item (MC supports fish://, ftp://,
sftp:// on Linux — TLC now supports scheme:// on Redox).
Added command history to ExternalPanelizeDialog:
- history: Vec<String> stores previously-run commands (deduped)
- history_idx: Option<usize> tracks position during navigation
- Up arrow: navigate to older entries (backward through history)
- Down arrow: navigate to newer entries (forward), exit to live input
- Typing any character exits history mode
- Successful command runs push to history (dedup consecutive)
- Render hint shows '↑↓ history' indicator
Self-contained — no changes to Input widget required.
1433 tests pass, zero warnings.
Added Cmd::Compress — collects marked/cursor files, derives archive
name from directory name, shells out to 'tar -czf' via start_exec(),
and shows output in the exec dialog.
Wired through:
- keymap/mod.rs: Cmd::Compress variant + default Alt-Shift-C binding
- filemanager/dialog_ops.rs: compress_selected() method
- filemanager/dispatch.rs: Cmd::Compress dispatch arm
- filemanager/menubar.rs: File menu 'Compress' entry
Updated PLAN.md and README.md. Phase 8 archives now complete.
1433 tests pass, zero warnings.
Replaced session.read(path) (buffers entire file in memory, OOM risk
for large files) with session.open(path) + SftpReader — a streaming
Read bridge that wraps an open SFTP file handle and reads in bounded
chunks via AsyncReadExt::read + block_on.
SftpReader uses Mutex<File> for thread safety and tokio::runtime::Handle
to bridge async→sync. Each Read::read() call issues a single SFTP read
request for a bounded chunk — large files are never buffered in memory.
Updated module doc to document the streaming read surface.
1433 tests pass (default), 1442 with --features sftp, zero warnings.
SFTP backend now implements the complete Vfs trait with zero
Unsupported stubs. Three new operations:
- mkdir: creates directories via session.create_dir(). Supports
parents=true by walking path components and creating each missing
parent directory step-by-step via SFTP protocol calls.
- remove: deletes files and directories via session.remove_file() /
session.remove_dir(). Supports recursive=true by listing children
with read_dir() and removing them depth-first before the directory.
- rename: renames/moves via session.rename(oldpath, newpath).
Fixed 2 pre-existing warnings:
- Removed unused std::path::PathBuf import
- Added doc comment on SshHandlerError::KeyMismatch.host field
Updated module doc to reflect full read-write surface.
Updated README.md Phase 7 VFS status: 🚧 partial → ✅ complete.
1433 tests passing, zero warnings with --features sftp.
MC has no line number gutter in editor. Removed:
- Gutter rendering in editor/render.rs (body_area = inner, no gutter_area)
- relative_lines field from Editor struct (both constructors)
- ToggleRelativeLines enum variant from EditorCmd + menubar item
- Alt-N keybinding in handlers.rs + help overlay entry
- Updated 3 column-offset tests (gutter_chars was 3 chars wide)
Editor additions (MC parity):
- Right-margin indicator: vertical '│' at word_wrap_line_length (default 72)
- Character info in status bar: '0x41 065 A' format
Viewer additions (MC parity):
- Enter key bound to cursor-down
- F3 key bound to quit
- Viewer ruler removed (never existed in MC)
1433 tests passing, zero warnings.
Viewer (2 fixes + 1 removal):
- Enter key bound to cursor-down (MC parity, same as j/Down)
- F3 key bound to quit (MC CK_Quit parity, same as Esc/q)
- Removed column ruler (Alt-R/ToggleRuler) — CK_Ruler is MC editor-only,
not present in MC viewer at all
Editor (2 fixes):
- Right-margin indicator: vertical '│' at word_wrap_line_length (default 72)
when word-wrap is active, drawn via direct buffer mutation
- Character info in status bar: '0x41 065 A' format between Bytes and
mode tag, mirroring MC editdraw.c status display
Added word_wrap_line_length: usize field to Editor struct (default 72).
Documented encoding and search dialog as intentional divergences.
Updated PLAN.md: test counts 1381→1433, MC parity marked 100%.
Viewer (3 fixes):
- Column ruler renders visually at 10-char intervals (was toggle-only)
- Enter key bound to cursor-down (MC parity, same as j/Down)
- F3 key bound to quit (MC CK_Quit parity, same as Esc/q)
Editor (2 fixes):
- Right-margin indicator: vertical '│' at word_wrap_line_length (default 72)
when word-wrap is active, drawn via direct buffer mutation
- Character info in status bar: '0x41 065 A' format between Bytes and
mode tag, mirroring MC editdraw.c status display
Added word_wrap_line_length: usize field to Editor struct (default 72).
Documented encoding and search dialog as intentional divergences.
Updated PLAN.md: test counts 1381→1434, MC parity marked 100%.