tlc: Linux package artifacts (dist/) + PLAN §17.8 completion sync
Adds dist/ packaging skeleton for the host Linux build:
dist/tlc-1.0.0/INSTALL.sh — generic tarball installer (system or --user)
dist/tlc-1.0.0/man/tlc.1 — man page for the file manager
dist/tlc-1.0.0/man/tlcedit.1 — man page for the standalone editor
dist/tlc-1.0.0/man/tlcview.1 — man page for the standalone viewer
dist/PKGBUILD — Arch Linux build recipe
dist/build_deb.sh — Debian/Ubuntu .deb builder
dist/deb/DEBIAN/control — Debian control file (binary-arch template)
dist/.gitignore — excludes built binaries + config (rebuilt at packaging)
Build outputs (NOT in git, produced locally on demand):
tlc-1.0.0-linux-x86_64.tar.gz 5.5 MB generic tarball
tlc_1.0.0-1_amd64.deb 2.3 MB Debian package
PLAN.md §17.8 added documenting that §17.4 P1-P4 are now complete
(commit 6c30edaf3e already landed). The §17.6 acceptance criterion
is met: grep for raw 'frame.render_widget(Clear' returns exactly 4
sites (terminal/popup.rs itself, filemanager/tree.rs full-screen,
and the two F9 top menu bars — all intentional). widget/dialog.rs
no longer appears.
P5 (SaveBeforeClose Y/N/Esc legend), P6 (viewer/editor SaveBeforeClose
unification), P7 (~15 decorative key-legend hints) remain deferred —
see §17.4 for rationale.
Header status line bumped to reflect P1-P4 completion + P5-P7 deferral.
This commit is contained in:
@@ -2,8 +2,10 @@
|
||||
|
||||
**Status:** Architecture chosen. Implementation in progress. Phases 0–8 substantially complete.
|
||||
Phases 14a, 14b, 15a, 15b (partial), 15c (partial), 15d, 14e, 16–29 substantially complete.
|
||||
**Last updated:** 2026-06-21 — Phase 27/28/29 sync + §17 dialog consistency assessment (44/46 dialogs unified, 4-item P1-P4 refactor backlog).
|
||||
**Date:** 2026-06-12 (initial) · 2026-06-13 (rename + comprehensive review + audit fixes) · 2026-06-19 (bug fixes, standalone binaries, syntax highlighter, parity audit reconciliation) · 2026-06-20 (Phase 16, Phase 17, Phase 18, Phase 19, Phase 20, Phase 21, Phase 22, Phase 23, Phase 24, Phase 25, Phase 26) · 2026-06-21 (Phase 27, Phase 28, Phase 29, §17 dialog audit)
|
||||
Dialog unification: §17.4 P1-P4 done (commit `6c30edaf3e`); 4/47 raw `Clear` sites remaining
|
||||
(all defensible). P5-P7 deferred.
|
||||
**Last updated:** 2026-06-21 — §17.8 P1-P4 dialog unification complete (commit `6c30edaf3e`, 4 dialogs migrated, raw `Clear` count down to 4 defensible sites).
|
||||
**Date:** 2026-06-12 (initial) · 2026-06-13 (rename + comprehensive review + audit fixes) · 2026-06-19 (bug fixes, standalone binaries, syntax highlighter, parity audit reconciliation) · 2026-06-20 (Phase 16, Phase 17, Phase 18, Phase 19, Phase 20, Phase 21, Phase 22, Phase 23, Phase 24, Phase 25, Phase 26) · 2026-06-21 (Phase 27, Phase 28, Phase 29, §17 dialog audit + §17.8 P1-P4 completion)
|
||||
**Branch:** `0.2.4`
|
||||
**Decision authority:** User selected Option A (Pure Rust TLC) on 2026-06-12.
|
||||
**Scope:** Reimplement ALL of Midnight Commander (MC 4.8.33) in pure Rust.
|
||||
@@ -1571,6 +1573,37 @@ are intentional non-chrome. The §17.4 backlog is the final 7% of dialog unifica
|
||||
the four priority items (P1-P4) are each small (5-40 LOC) and can be done in a single
|
||||
sitting.
|
||||
|
||||
### 17.8 P1-P4 unification complete (2026-06-21)
|
||||
|
||||
All four priority items from §17.4 executed in commit `6c30edaf3e`:
|
||||
|
||||
- **P1** `widget/dialog.rs::Dialog::render` now delegates shell to `render_popup`. The only
|
||||
shadow regression in the unified stack is closed. Test:
|
||||
`render_draws_drop_shadow_at_bottom_right_corner` asserts the shadow bg is painted.
|
||||
- **P2** `filemanager/overwrite_dialog.rs` Y/N/All/Skip/Abort legend replaced with
|
||||
`render_button_row` (Yes=Default, others=Normal). Test:
|
||||
`render_uses_mc_bracket_button_shapes` asserts the MC bracket shapes.
|
||||
- **P3** `filemanager/confirm_dialog.rs` Save/Cancel replaced with `render_button_row`
|
||||
(Save=Default, Cancel=Normal). Test asserts the MC bracket shapes.
|
||||
- **P4** `editor/menubar.rs:520` F9 dropdown migrated to `render_popup`, matching
|
||||
`filemanager/menubar.rs` (which was migrated in `c032c9a787`).
|
||||
|
||||
**Acceptance criterion (§17.6)**: `grep "frame.render_widget(Clear" src/` now returns
|
||||
exactly 4 sites, all defensible:
|
||||
1. `terminal/popup.rs:125` — the renderer itself
|
||||
2. `filemanager/tree.rs:304` — full-screen, intentional
|
||||
3. `filemanager/menubar.rs:260` — F9 top bar (intentional full-width)
|
||||
4. `editor/menubar.rs:427` — F9 top bar (intentional full-width)
|
||||
|
||||
`widget/dialog.rs` no longer appears in the list. Zero shadow regressions remain.
|
||||
|
||||
Tests: 1184 passing, 0 failing (was 1180; +4 from P1-P4). Both release builds clean
|
||||
(default + `--features sftp`).
|
||||
|
||||
P5 (SaveBeforeClose Y/N/Esc legend), P6 (viewer/editor SaveBeforeClose unification),
|
||||
and P7 (~15 decorative key-legend hints) are NOT migrated in this commit — see
|
||||
§17.4 for rationale and deferral reasoning.
|
||||
|
||||
---
|
||||
|
||||
## Changelog
|
||||
@@ -1660,8 +1693,8 @@ sitting.
|
||||
- **2026-06-21** — **Test count**: 1180 tests, 0 failures.
|
||||
- **2026-06-21** — **Binary sizes**: `tlc` 5.4 MB, `tlcedit` 3.9 MB, `tlcview` 3.8 MB.
|
||||
|
||||
- **2026-06-21** — **Dialog consistency assessment (PLAN §17)**: Comprehensive audit of
|
||||
every dialog in tlc. Confirms Phase 16-18 brought **44/46 dialog surfaces onto the
|
||||
- **2026-06-21** — **Dialog consistency assessment (PLAN §17)**: Comprehensive audit of every
|
||||
dialog in tlc. Confirms Phase 16-18 brought **44/46 dialog surfaces onto the
|
||||
unified `render_popup` path** (33 in `filemanager/`, 5 in `editor/render.rs`, 1 in
|
||||
`ops/progress.rs`; the 45th `widget/dialog.rs::Dialog::render` uses raw `Clear`+`Block`
|
||||
and is the only shadow regression in the unified stack — see §17.4 P1). The two
|
||||
@@ -1673,3 +1706,15 @@ sitting.
|
||||
P2 overwrite_dialog Y/N/A/S/Esc migration, P3 confirm_dialog Save/Cancel migration,
|
||||
P4 editor menubar dropdown migration, P5 editor SaveBeforeClose legend, P6
|
||||
viewer/editor SaveBeforeClose unification, P7 optional decorative hint strips.
|
||||
|
||||
- **2026-06-21** — **PLAN §17.8 — P1-P4 dialog unification complete (commit `6c30edaf3e`)**:
|
||||
All four priority items from §17.4 executed. P1 widget/dialog.rs now delegates shell to
|
||||
render_popup (closes only shadow regression in the unified stack). P2 overwrite_dialog
|
||||
Y/N/All/Skip/Abort legend migrated to render_button_row (Yes=Default, others=Normal).
|
||||
P3 confirm_dialog Save/Cancel migrated to render_button_row (Save=Default, Cancel=Normal).
|
||||
P4 editor/menubar.rs F9 dropdown migrated to render_popup, matching the
|
||||
already-migrated filemanager/menubar.rs dropdown. Acceptance criterion from §17.6 met:
|
||||
grep for raw Clear now returns exactly 4 defensible sites (popup renderer itself,
|
||||
full-screen tree, two intentional full-width menu-bar top rows). widget/dialog.rs no
|
||||
longer appears. 1184 tests passing (+4 from P1-P4). PLAN §17.8 added with full
|
||||
per-P commit refs and acceptance-criterion audit.
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
# Built artifacts — keep source but not the binaries
|
||||
*.tar.gz
|
||||
*.deb
|
||||
tlc-1.0.0/bin/
|
||||
tlc-1.0.0/locales/*.yml
|
||||
tlc-1.0.0/config/default.toml
|
||||
tlc-1.0.0/mc-skins/
|
||||
Vendored
+32
@@ -0,0 +1,32 @@
|
||||
# Maintainer: Red Bear OS <https://gitea.redbearos.org/vasilito/redbear-os.git>
|
||||
pkgname=tlc
|
||||
pkgver=1.0.0
|
||||
pkgrel=1
|
||||
pkgdesc="Twilight Commander — pure-Rust TUI file manager"
|
||||
arch=('x86_64')
|
||||
url="https://gitea.redbearos.org/vasilito/redbear-os.git"
|
||||
license=('MIT')
|
||||
depends=()
|
||||
makedepends=()
|
||||
source=("https://gitea.redbearos.org/vasilito/redbear-os/releases/download/${pkgver}/tlc-${pkgver}-linux-x86_64.tar.gz")
|
||||
sha256sums=('SKIP')
|
||||
|
||||
package() {
|
||||
cd "${srcdir}/tlc-${pkgver}"
|
||||
|
||||
install -Dm755 bin/tlc "${pkgdir}/usr/bin/tlc"
|
||||
install -Dm755 bin/tlcedit "${pkgdir}/usr/bin/tlcedit"
|
||||
install -Dm755 bin/tlcview "${pkgdir}/usr/bin/tlcview"
|
||||
|
||||
install -Dm644 man/tlc.1 "${pkgdir}/usr/share/man/man1/tlc.1"
|
||||
install -Dm644 man/tlcedit.1 "${pkgdir}/usr/share/man/man1/tlcedit.1"
|
||||
install -Dm644 man/tlcview.1 "${pkgdir}/usr/share/man/man1/tlcview.1"
|
||||
|
||||
install -Dm644 config/default.toml \
|
||||
"${pkgdir}/etc/xdg/tlc/default.toml"
|
||||
install -dm755 "${pkgdir}/usr/share/tlc/locales"
|
||||
install -m644 locales/*.yml \
|
||||
-t "${pkgdir}/usr/share/tlc/locales/"
|
||||
install -dm755 "${pkgdir}/usr/share/tlc/mc-skins"
|
||||
cp -r mc-skins/* "${pkgdir}/usr/share/tlc/mc-skins/"
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build the .deb package from dist/tlc-1.0.0/ contents.
|
||||
# Run from the dist/ directory after unpacking the tarball.
|
||||
set -euo pipefail
|
||||
|
||||
dist_dir="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
|
||||
stage="$(mktemp -d)"
|
||||
trap 'rm -rf "$stage"' EXIT
|
||||
|
||||
src_dir="${dist_dir}/tlc-1.0.0"
|
||||
pkg_root="${stage}/tlc_1.0.0-1_amd64"
|
||||
|
||||
mkdir -p "${pkg_root}/usr/bin" \
|
||||
"${pkg_root}/usr/share/man/man1" \
|
||||
"${pkg_root}/etc/xdg/tlc" \
|
||||
"${pkg_root}/usr/share/tlc/locales" \
|
||||
"${pkg_root}/usr/share/tlc/mc-skins"
|
||||
|
||||
cp "${src_dir}/bin/tlc" "${pkg_root}/usr/bin/tlc"
|
||||
cp "${src_dir}/bin/tlcedit" "${pkg_root}/usr/bin/tlcedit"
|
||||
cp "${src_dir}/bin/tlcview" "${pkg_root}/usr/bin/tlcview"
|
||||
chmod 0755 "${pkg_root}/usr/bin/tlc" "${pkg_root}/usr/bin/tlcedit" "${pkg_root}/usr/bin/tlcview"
|
||||
|
||||
cp "${src_dir}/man/tlc.1" "${pkg_root}/usr/share/man/man1/tlc.1"
|
||||
cp "${src_dir}/man/tlcedit.1" "${pkg_root}/usr/share/man/man1/tlcedit.1"
|
||||
cp "${src_dir}/man/tlcview.1" "${pkg_root}/usr/share/man/man1/tlcview.1"
|
||||
|
||||
cp "${src_dir}/config/default.toml" "${pkg_root}/etc/xdg/tlc/default.toml"
|
||||
cp "${src_dir}/locales/"*.yml "${pkg_root}/usr/share/tlc/locales/"
|
||||
cp -r "${src_dir}/mc-skins/"* "${pkg_root}/usr/share/tlc/mc-skins/"
|
||||
|
||||
# Compress man pages.
|
||||
gzip -9 "${pkg_root}/usr/share/man/man1/"*.1
|
||||
|
||||
# Copy control files.
|
||||
mkdir -p "${pkg_root}/DEBIAN"
|
||||
cp "${dist_dir}/deb/DEBIAN/control" "${pkg_root}/DEBIAN/control"
|
||||
|
||||
# Compute Installed-Size (in KB).
|
||||
size=$(du -sk "${pkg_root}" | awk '{print $1}')
|
||||
sed -i "s/^Installed-Size:.*/Installed-Size: ${size}/" "${pkg_root}/DEBIAN/control"
|
||||
grep -q '^Installed-Size:' "${pkg_root}/DEBIAN/control" || \
|
||||
sed -i "/^Priority:/a Installed-Size: ${size}" "${pkg_root}/DEBIAN/control"
|
||||
|
||||
# Build.
|
||||
out="${dist_dir}/tlc_1.0.0-1_amd64.deb"
|
||||
dpkg-deb --build --root-owner-group "${pkg_root}" "${out}"
|
||||
echo "Built: ${out}"
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
Package: tlc
|
||||
Version: 1.0.0-1
|
||||
Section: utils
|
||||
Priority: optional
|
||||
Architecture: amd64
|
||||
Depends: libc6
|
||||
Maintainer: Red Bear OS <adminpupkin@gmail.com>
|
||||
Description: Twilight Commander — pure-Rust TUI file manager
|
||||
TLC is a Midnight Commander-inspired dual-panel terminal file manager
|
||||
written in pure Rust. It supports local and remote (FTP/SFTP) filesystems,
|
||||
archives, an internal editor, an internal viewer with hex-edit mode, and
|
||||
eight bundled MC-derived skins.
|
||||
.
|
||||
Three binaries are installed: tlc (file manager), tlcedit (editor),
|
||||
tlcview (viewer with hex-edit mode).
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env bash
|
||||
# TLC Linux install script — installs tlc / tlcedit / tlcview from this tarball.
|
||||
# Run as root (or with sudo) to install system-wide; otherwise use --user.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
prefix="/usr/local"
|
||||
bindir="${prefix}/bin"
|
||||
mandir="${prefix}/share/man/man1"
|
||||
datadir="${prefix}/share/tlc"
|
||||
configdir="/etc/xdg/tlc"
|
||||
|
||||
user_install=0
|
||||
if [[ "${1:-}" == "--user" ]]; then
|
||||
prefix="${HOME}/.local"
|
||||
bindir="${prefix}/bin"
|
||||
mandir="${prefix}/share/man/man1"
|
||||
datadir="${prefix}/share/tlc"
|
||||
configdir="${prefix}/share/tlc"
|
||||
user_install=1
|
||||
fi
|
||||
|
||||
# Resolve the directory this script lives in.
|
||||
script_dir="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
|
||||
|
||||
mkdir -p "${bindir}" "${mandir}" "${datadir}" "${configdir}"
|
||||
|
||||
install -m 0755 "${script_dir}/bin/tlc" "${bindir}/tlc"
|
||||
install -m 0755 "${script_dir}/bin/tlcedit" "${bindir}/tlcedit"
|
||||
install -m 0755 "${script_dir}/bin/tlcview" "${bindir}/tlcview"
|
||||
|
||||
install -m 0644 "${script_dir}/man/tlc.1" "${mandir}/tlc.1"
|
||||
install -m 0644 "${script_dir}/man/tlcedit.1" "${mandir}/tlcedit.1"
|
||||
install -m 0644 "${script_dir}/man/tlcview.1" "${mandir}/tlcview.1"
|
||||
|
||||
cp -r "${script_dir}/config/"* "${configdir}/"
|
||||
cp -r "${script_dir}/locales/"* "${datadir}/locales/"
|
||||
cp -r "${script_dir}/mc-skins/"* "${datadir}/mc-skins/"
|
||||
|
||||
cat <<EOF
|
||||
|
||||
TLC 1.0.0 installed to:
|
||||
binaries: ${bindir}
|
||||
man pages: ${mandir}
|
||||
system config: ${configdir}
|
||||
read-only data: ${datadir}
|
||||
|
||||
Run 'tlc' to launch. Edit ~/.config/tlc/config.toml (or ${configdir}
|
||||
for system-wide) to customise. See 'tlc help' for key bindings.
|
||||
EOF
|
||||
+176
@@ -0,0 +1,176 @@
|
||||
# Twilight Commander (`tlc`) — Red Bear OS
|
||||
|
||||
**TLC** is Red Bear's internal TUI file manager, originally derived from
|
||||
Midnight Commander (MC) 4.8.33, but now architecturally and
|
||||
implementation-wise **pure Rust, no FFI, no C compilation**.
|
||||
|
||||
## Status
|
||||
|
||||
TLC's source tree is TLC's own. It was derived from MC 4.8.33 once and
|
||||
fully rewritten in Rust — every Rust module, every Rust function, every
|
||||
Rust test is original Red Bear code. The C source of MC 4.8.33 lives in
|
||||
the canonical MC recipe at `local/recipes/tui/mc/source/` and serves as
|
||||
read-only cross-reference for algorithm correctness.
|
||||
|
||||
**TLC and MC are two separate, completely independent programs.**
|
||||
|
||||
## Name
|
||||
|
||||
Originally `tc` (Twilight Commander). Renamed to `tlc` on 2026-06-13 to
|
||||
avoid collision with iproute2's `/usr/bin/tc` traffic-control binary and
|
||||
the third-party `tc` crate on crates.io. "TLC" is intentionally a
|
||||
double reading: **T**wilight **L**ist-and-**C**opy (the function) and
|
||||
**T**ender **L**oving **C**are (the ethos).
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
local/recipes/tui/tlc/
|
||||
├── PLAN.md ← canonical plan, phase status, quality assessment
|
||||
├── recipe.toml ← cookbook recipe (custom template, cargo build)
|
||||
└── source/ ← PURE RUST — 113 .rs files, 46k+ lines
|
||||
├── Cargo.toml ← [package] name = "tlc"
|
||||
├── config/default.toml
|
||||
├── locales/*.yml ← rust-i18n catalogues
|
||||
└── src/ ← app, config, editor, filemanager, fs, key,
|
||||
keymap, locale, log, ops, paths, skin,
|
||||
terminal, text, vfs, viewer, widget
|
||||
```
|
||||
|
||||
The recipe builds three binaries — `tlc` (file manager),
|
||||
`tlcedit` (standalone editor), and `tlcview` (standalone viewer) —
|
||||
and stages them at `/usr/bin/` in the Red Bear OS image. `tlc` is
|
||||
registered in both `redbear-mini.toml` and `redbear-full.toml` configs
|
||||
as `tlc = {}`.
|
||||
|
||||
## Why pure Rust, no FFI
|
||||
|
||||
- `termion` provides everything MC's tty layer did
|
||||
- `ratatui` provides everything MC's widget layer did
|
||||
- FFI adds `unsafe`, which project policy forbids
|
||||
- Pure Rust code is auditable and deterministic
|
||||
|
||||
## Build
|
||||
|
||||
### Linux (host build, zero setup)
|
||||
|
||||
TLC is pure portable Rust — it builds and runs natively on Linux with
|
||||
no Redox-specific code or dependencies.
|
||||
|
||||
```bash
|
||||
cd local/recipes/tui/tlc/source
|
||||
cargo build --release # tlc (5.0 MB), tlcedit (1.2 MB), tlcview (661 KB)
|
||||
./target/release/tlc --version # tlc 1.0.0-beta
|
||||
./target/release/tlc # launch file manager TUI
|
||||
./target/release/tlcedit file.txt # launch standalone editor
|
||||
./target/release/tlcview file.txt # launch standalone viewer
|
||||
./target/release/tlc help # list keybindings
|
||||
```
|
||||
|
||||
### Redox (cross build for ISO)
|
||||
|
||||
```bash
|
||||
cd local/recipes/tui/tlc/source
|
||||
cargo build --release --target x86_64-unknown-redox
|
||||
|
||||
# Full ISO with TLC installed
|
||||
./local/scripts/build-redbear.sh redbear-mini # includes /usr/bin/tlc
|
||||
./local/scripts/build-redbear.sh redbear-full # includes /usr/bin/tlc
|
||||
|
||||
# Single recipe via cookbook
|
||||
./target/release/repo cook local/recipes/tui/tlc
|
||||
```
|
||||
|
||||
## Test
|
||||
|
||||
```bash
|
||||
cd local/recipes/tui/tlc/source
|
||||
cargo test --lib
|
||||
# → 986 passed; 0 failed (verified 2026-06-19)
|
||||
```
|
||||
|
||||
## Linux Portability
|
||||
|
||||
TLC is designed as a pure-Rust portable application. It uses:
|
||||
|
||||
- `std::fs` abstractions for all filesystem operations
|
||||
- `cfg(unix)` gates for platform-specific behavior (stat, permissions)
|
||||
- `ratatui` + `termion` for terminal rendering (works on any Unix tty)
|
||||
- No `target_os = "redox"` or `target_os = "linux"` gates anywhere
|
||||
|
||||
The `redox` Cargo feature and `redox-scheme` dependency were removed
|
||||
(declared but never consumed — no source file used `#[cfg(feature =
|
||||
"redox")]`). TLC is the same binary on Linux and Redox.
|
||||
|
||||
## Shared TUI palette
|
||||
|
||||
TLC's `src/terminal/color.rs` consumes the shared Red Bear TUI palette
|
||||
from `local/recipes/tui/redbear-tui-theme/` (a Red Bear-internal
|
||||
library crate). The 23-field `Theme` struct in `terminal/color.rs` is
|
||||
preserved (it deserializes user TOML skins), but the `DEFAULT_THEME`
|
||||
and `LIGHT_THEME` constants are now built from the shared
|
||||
`REDBEAR_DARK` / `REDBEAR_LIGHT` presets via a `const as_color(rgb)`
|
||||
adapter.
|
||||
|
||||
All rendering code (widgets, dialogs, editor, viewer, file panels)
|
||||
sources colors exclusively from the `Theme` palette — no hardcoded
|
||||
`Color::White`/`Color::Blue`/etc. remain in any render path. Every
|
||||
`render()` method accepts a `theme: &Theme` parameter. User TOML skins
|
||||
with any of the 23 palette slots are fully functional via
|
||||
`Skin::to_theme()`.
|
||||
|
||||
The brand red is `#B52430` — the same red as the Red Bear OS icon, the
|
||||
loading background, the cub `RedBearTheme::accent` (when cub migrates),
|
||||
and every other TUI app that adopts the shared palette.
|
||||
|
||||
See `local/recipes/tui/redbear-tui-theme/README.md` for the full
|
||||
palette, contrast table, and migration guide.
|
||||
|
||||
## Built-in skins
|
||||
|
||||
TLC ships with 8 built-in skins accessible via `Alt-S` at runtime:
|
||||
|
||||
| Skin | Description |
|
||||
|---|---|
|
||||
| `default-dark` | Red Bear Dark (brand palette, default) |
|
||||
| `default-light` | Red Bear Light |
|
||||
| `mc-classic` | Midnight Commander Classic (blue/cyan) |
|
||||
| `mc-dark` | MC Dark — gray panels, bright accents |
|
||||
| `mc-dark-gray` | MC Dark Gray — near-black, desaturated |
|
||||
| `high-contrast` | Black/white, WCAG-maximum |
|
||||
| `solarized-dark` | Solarized Dark palette |
|
||||
| `nord` | Nord palette |
|
||||
|
||||
User TOML skins in `~/.config/tlc/skin/*.toml` are also listed in the
|
||||
dialog. Selection persists to `~/.config/tlc/config.toml`.
|
||||
|
||||
## Phase status
|
||||
|
||||
| Phase | Status |
|
||||
|---|---|
|
||||
| 0 ops dialogs | ✅ |
|
||||
| 1 dual-panel shell | ✅ |
|
||||
| 2 F3 viewer | ✅ |
|
||||
| 3 F4 editor | ✅ |
|
||||
| 4 keymap + dispatcher | ✅ |
|
||||
| 5 editor polish | ✅ |
|
||||
| 6 filemanager + viewer extras | ✅ |
|
||||
| 7 VFS (local + remote backends) | 🚧 partial |
|
||||
| 8 archives + skin + i18n | ✅ skin + i18n (8 built-in skins, Alt-S); archives 🚧 |
|
||||
| 13 skins + runtime selection | ✅ 8 built-in skins, Alt-S dialog, config persistence |
|
||||
| 14a critical features | ✅ menu bar (F9), select/unselect group, quick cd, Ctrl-O sub-shell, Alt-Enter cmdline |
|
||||
| 14b bug fixes | ✅ viewer keys, editor cursor sync, overwrite dialog, Ctrl-O sub-shell |
|
||||
| 15a panel essentials | ✅ marking (Ctrl-T), invert (*), sort cycle (Alt-T), history (Alt-H/Y/U), save setup (Alt-Shift-S), listing modes (Alt-L), mini-status, tab completion, cmdline auto-activate, editor block ops + selection highlight |
|
||||
| 15b shell + exec fixes | ✅ foreground command execution (no popup), Ctrl+O drop/recreate Tui (clean terminal restore) |
|
||||
| 15c editor + percent + user menu | ✅ bracket match (Alt-B), word completion (Alt-Tab), percent escapes (17 tokens), F2 user menu (INI parser + condition + extension filters) |
|
||||
| 15d bug fixes + standalone binaries | ✅ ESC no-op on main screen (MC parity), editor arrow keys structural fix (Option B — cursor sync in every `move_*`/`select_*`), command execution (no pause, returns immediately), `tlcedit` + `tlcview` standalone binaries built and staged alongside `tlc` |
|
||||
| 15e syntax highlighter + render wiring | ✅ `Highlighter` struct, `syntax_for_path()`, `is_text_file()` in `editor/syntax.rs`; wired into `Editor::render()` with viewport scroll state replay and selection overlay (`split_spans_for_selection`) |
|
||||
| 15f Jobs/Panelize/VFS dialogs | ✅ Background jobs dialog (C-x j), external panelize (C-x !), VFS list (C-x a) — all safe Rust, `Arc<Mutex<JobRegistry>>`, zero `unsafe` |
|
||||
| 15g Ctrl-X chord + Compare Dirs + SymlinkRelative + dialogs | ✅ Ctrl-X prefix dispatch (9 follow-ups), Compare Dirs (C-x d size-only), SymlinkRelative (C-x s), SymlinkEdit (C-x v), ScreenList/EditHistory/FilteredView wired, editor format paragraph (Alt-P), viewer growing buffer (tail -f) |
|
||||
| 15h File highlighting | ✅ Type-based coloring in panel entries (9 categories: executable, archive, audio, video, image, source, documentation, database), extension tables + permission-bit detection |
|
||||
| 15i VFS archive panel integration | ✅ Browse .tar/.tar.gz/.tar.bz2/.tar.xz/.zip/.cpio archives in-place; Enter opens archive, '..' at root exits to local filesystem; VFS scheme dispatch via for_path() |
|
||||
| 15j PanelInfo (C-x i) + PanelQuickView (C-x q) | ✅ Inactive panel toggles to Info mode (filesystem summary + cursor file metadata) or QuickView mode (first 30 lines of cursor file, binary detection); toggle-only (excluded from Alt-L listing cycle) |
|
||||
| 15k Clippy cleanup | ✅ All 20 clippy lints fixed across 9 files; only 1 pre-existing warning remains (mc_ext.rs Include(String) never read) |
|
||||
| 15l Split ratio + QuitQuiet + menubar + Compare files | ✅ SplitMore/Less (Alt-Shift-Right/Left, 5% steps, 10-90%), QuitQuiet (Shift-F10 actually quits), F9 menubar expanded with all 20+ commands, Compare files (Ctrl-d, LCS diff viewer) |
|
||||
|
||||
See `PLAN.md` for the comprehensive quality assessment and remaining tasks.
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
.TH TLC 1 "2026-06-21" "TLC 1.0.0" "Red Bear OS User Commands"
|
||||
.SH NAME
|
||||
tlc \- Twilight Commander, a pure-Rust terminal file manager
|
||||
.SH SYNOPSIS
|
||||
.B tlc
|
||||
[\fIpath\fR]
|
||||
.SH DESCRIPTION
|
||||
TLC is a Midnight Commander-inspired dual-panel terminal file manager
|
||||
written in pure Rust. It supports local and remote (FTP/SFTP) filesystems,
|
||||
archives, an internal editor, an internal viewer with hex-edit mode, and
|
||||
eight bundled MC-derived skins.
|
||||
.SH OPTIONS
|
||||
Currently tlc accepts an optional positional path argument to start
|
||||
in a specific directory:
|
||||
.IP
|
||||
.B tlc /var/log
|
||||
.PP
|
||||
Run
|
||||
.B tlc help
|
||||
to print the full key binding reference.
|
||||
.SH FILES
|
||||
.TP
|
||||
.I ~/.config/tlc/config.toml
|
||||
Per-user configuration, persisted by Alt-S skin selection and panel setup.
|
||||
.TP
|
||||
.I ~/.config/tlc/skin/*.toml
|
||||
User-defined skin files; loaded by the skin selector.
|
||||
.TP
|
||||
.I ~/.config/tlc/menu
|
||||
User-menu definition (mc-style INI). Same syntax as MC's menu file.
|
||||
.SH SEE ALSO
|
||||
.BR tlcedit (1),
|
||||
.BR tlcview (1)
|
||||
.SH AUTHOR
|
||||
Red Bear OS <https://gitea.redbearos.org/vasilito/redbear-os.git>
|
||||
@@ -0,0 +1,27 @@
|
||||
.TH TLCEDIT 1 "2026-06-21" "TLC 1.0.0" "Red Bear OS User Commands"
|
||||
.SH NAME
|
||||
tlcedit \- TLC standalone text editor
|
||||
.SH SYNOPSIS
|
||||
.B tlcedit
|
||||
[\fB+linenum\fR] \fIfile\fR
|
||||
.SH DESCRIPTION
|
||||
Standalone text editor companion to tlc. Pure Rust, MC-derived keybindings
|
||||
(undo/redo, search/replace, block operations, syntax highlighting,
|
||||
bookmarks, macros, user menu via F11).
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.BR + N
|
||||
Start the editor with the cursor at line
|
||||
.IR N .
|
||||
.TP
|
||||
.I file
|
||||
The file to edit. Created if it does not exist.
|
||||
.SH KEY BINDINGS
|
||||
See
|
||||
.BR tlc (1)
|
||||
help output (F1 inside the editor for the in-app reference).
|
||||
.SH SEE ALSO
|
||||
.BR tlc (1),
|
||||
.BR tlcview (1)
|
||||
.SH AUTHOR
|
||||
Red Bear OS
|
||||
@@ -0,0 +1,25 @@
|
||||
.TH TLCVIEW 1 "2026-06-21" "TLC 1.0.0" "Red Bear OS User Commands"
|
||||
.SH NAME
|
||||
tlcview \- TLC standalone file viewer with hex-edit mode
|
||||
.SH SYNOPSIS
|
||||
.B tlcview
|
||||
[\fB+linenum\fR] \fIfile\fR
|
||||
.SH DESCRIPTION
|
||||
Standalone file viewer companion to tlc. Supports text mode, hex mode,
|
||||
hex-edit mode (F2 toggles; F10 opens save prompt on dirty buffer),
|
||||
search (F7), goto-line (F5), magic mode auto-detection (F8), growing
|
||||
buffer / tail -f (F2 in text mode), and file-next / file-prev (Ctrl-F /
|
||||
Ctrl-B).
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.BR + N
|
||||
Open the file with the cursor at line
|
||||
.IR N .
|
||||
.TP
|
||||
.I file
|
||||
The file to view.
|
||||
.SH SEE ALSO
|
||||
.BR tlc (1),
|
||||
.BR tlcedit (1)
|
||||
.SH AUTHOR
|
||||
Red Bear OS
|
||||
Reference in New Issue
Block a user