โ† All apps

CandyFiles

๐Ÿ“‚ CandyFiles

Dual-pane terminal file manager

port of superfile file-manager midnight-commander dual-pane

Two panes side-by-side, Midnight Commander style. Tab to swap focus, multi-select, sort cycling, hidden-file toggle, delete-with-confirm. Pure-state transition layer โ€” filesystem is injected, every transition is unit-testable.

Install

composer require sugarcraft/candy-files

Quickstart

composer install
./bin/candyfiles [LEFT_DIR] [RIGHT_DIR]

# Default: left = cwd, right = $HOME

# Keys
# Tab        Swap focus
# โ†‘ / k      Move up
# โ†“ / j      Move down
# Home / g   Top
# End / G    Bottom
# Enter / โ†’  Open directory
# โ† / h      Up one directory
# Space      Toggle selection + advance
# s          Cycle sort order (6 modes)
# .          Toggle hidden files
# c          Copy selection or cursor โ†’ inactive pane (y confirm)
# m          Move selection or cursor โ†’ inactive pane (y confirm)
# R          Rename cursor entry with prompt (y confirm)
# d          Delete (selection or cursor) โ€” y to confirm
# r          Refresh active pane
# q          Quit
# /          Search mode (type to filter, Enter to open)
# Escape     Exit search mode
# t          Duplicate current tab
# Ctrl+w     Close current tab
# Ctrl+Tab   Cycle to next tab
# u / Ctrl+z Undo last operation

What's in the box

Dual panesLeft + right; Tab swaps focus. Each pane has its own cwd, cursor, selection, sort, hidden-flag.
Multi-selectSpace toggles + advances. Selection survives sort / cwd-change.
Six sort modesname / mtime / size, asc / desc โ€” s cycles.
Hidden-file toggle. hides / shows dotfiles.
Copy / Move / Renamec/m/R stage to inactive pane / cursor target; y commits. Undo available for move and rename.
Delete-with-confirmd stages, y commits โ€” protects against fat-finger deletes.
Injectable FSFsLister closure โ€” swap for a fixture lister in unit tests with no tmp dirs.
Live search/ enters search mode; type to filter, โ†‘โ†“ navigate, Enter opens.
Tab managementt duplicates tab, Ctrl+Tab cycles, Ctrl+w closes.
Undou or Ctrl+z restores last delete / move / rename.

Source & demos

Try the quickstart โ†’

Key Classes

ClassMethodDescription
Managerstart(leftCwd, rightCwd, ?lister)Factory โ€” initialises two panes + first tab
Managerupdate(Msg): [Model, ?Cmd]Main event loop โ€” key dispatch, confirm gate
Managerview(): stringRenders two panes + tab bar + status line
Managercopy(src, dst), move(src, dst), rename(src, newName)File-manager ops โ€” used by confirm-gate handlers
Managersearch(query), exitSearch(), openSearchResult()Live search mode
Managerundo(), canUndo(), canRedo()Delete / move / rename undo/redo stack
ManagerduplicateTab(), closeTab(), switchTab()Tab management
Paneopen(cwd, lister, sort, showHidden): selfFactory โ€” reads and sorts directory
Panenavigate(lister): selfEnter directory under cursor (no-op on files)
PanetoggleSelection(): selfAdd/remove cursor entry from selection set
Sortapply(entries): list<Entry>Sort entries (parent sentinel stays at index 0)
Sortcycle(): selfCycles: name-asc โ†’ name-desc โ†’ mtime-asc โ†’ mtime-desc โ†’ size-asc โ†’ size-desc โ†’ name-asc
EntrydisplaySize(): stringReturns "DIR" / "LINK" / compacted bytes

Demos.

VHS-recorded GIFs of every example shipped with the app. Regenerated automatically on every push that touches the source.

Navigate

Navigate

Tab-swap, multi-select, sort cycle, delete-with-confirm.
Search

Search

Type "/" to search, navigate results, Enter to open.
Multi-select

Multi-select

Space toggles selection, d+y deletes all selected.
Tabs

Tab management

t duplicates, Ctrl+Tab cycles, Ctrl+w closes.
Sort cycle

Sort cycle

s cycles through all 6 sort modes: name/mtime/size ร— asc/desc.
Undo

Undo delete

u or Ctrl+z restores the last deleted entry.
Hidden files

Hidden-file toggle

. reveals and hides dotfiles.