Meridian Commander
Website: https://martingallagher-code.github.io/meridian_commander/ — screenshots and a tour. Manual: https://meridian-commander.readthedocs.io/ — installation, the full key-binding reference, tutorials and the plug-in API.
The meridian is noon — the other end of the clock from midnight.
A two-pane terminal file manager with the keys of Midnight Commander and the face of Turbo Vision, written in pure Python. It browses local and networked locations, copies and moves files between the two panes regardless of where each side lives, synchronizes directories so both panes hold the newest version of every file, and ships with a built-in file viewer and editor.
≡ File Command Options Help 14:06
╔══[■]═╡ local:/home/user ╞═══════╗┌──╡ sftp://me@server:/srv/www ╞───┐
║ Name Size Modify║│ Name Size Modify │
║ .. <DIR> ..▲│ .. <DIR> .. ▲
║ projects/ <DIR> Jul 20 ..█│ assets/ <DIR> Jul 19 ..░
║*report.pdf 1.2M Jul 21 ..░│ index.html 4.3K Jul 18 ..░
║ notes.txt 842 Jul 22 ..░│ style.css 1.1K Jul 18 ..▼
╚═╡ 1 tagged, 1.2M ╞══════════════╝└─╡ 12 items ╞──────────────────────┘
░Esc menu Tab switch pane F1 Help F9 Sync F10 Quit░░░░░░░░░░░░░░
1Help 2Conn 3View 4Edit 5Copy 6Move 7Mkdir 8Del 9Sync 10Quit
Yellow on Borland blue, grey chrome, a shaded desktop, double-line frames on the pane that has the keyboard and single on the one that does not, red accelerator letters, green buttons and drop shadows under every dialog — the 1991 look, on a terminal that was not built in 1991.
Features
- Turbo Vision looks — a grey menu bar with a clock, a shaded blue desktop,
each pane a framed window (double-line for the active one, single for the
other) with its path in the caption and a scrollbar down its edge, dialogs in
grey with red accelerators, green buttons and drop shadows, and the F-key bar
along the bottom. Three schemes —
turbo(Borland blue),midnight(black ground) andmono— switch from Options ▸ Colours, and everything falls back to plain attributes on a terminal with no colour and to ASCII frames on one that cannot encode box-drawing characters. See Look and feel. - A menu bar that reaches everything — press
Escfor the menus (orAlt+F,Alt+C,Alt+O,Alt+H, or click one), arrow between them, and pick an entry by its red letter. Every entry is something a key binding also does, so the menu is a way to find the keys rather than a place features hide. - Two independent panes — browse two locations side by side,
Tabbetween them, and swap them withCtrl-U. - Home and mirror shortcuts —
~jumps a pane to its own home directory (the remote account's home on a remote pane), and=points the other pane at this pane's directory and connection, reusing the same live session so a remote location is never dialled — or authenticated — twice. - The cursor stays put — after deleting (
F8) the highlight settles on the next entry down, stepping over a whole tagged block rather than springing back to the top of the listing. The same holds whenever an entry disappears from under the bar: the pane keeps its position instead of losing your place. - Presets (
b) — save the places you keep coming back to, local or remote, and reopen one with a single letter from the list. A preset stores the connection and the directory (never a password) and reuses a connection that is already open. - Local and networked locations — each pane can point at the local disk, an
SFTP server, an SSH (shell) host, or an FTP server. Press
F2to open a location. The SSH (shell) mode lists and transfers files by running ordinary commands (ls,cat, …) over the SSH channel, so it works even on servers that permit SSH login but have the SFTP subsystem disabled. - Copy & move across any pair of panes — local→remote, remote→local,
remote→remote and local→local all work through one streaming engine, with a
cancellable progress bar (
F5copy,F6move). A copy from an SFTP pane to the same server writes down a second channel, so the read and the write never contend (see Copying on one connection). - Bidirectional directory sync (
F9) — compares the two panes and copies the newest version of each file in whichever direction is needed, so both sides end up holding the latest of everything. Nothing is deleted; you get a preview and confirmation before anything is written, and a directory big enough that syncing it is probably a mistake is queried before the scan starts rather than after you have waited for it. - File viewer (
F3) — scrollable, with search (/, smart case, highlighted matches,n/Nnext/previous with wrap-around), toggleable line numbers (l) and horizontal scrolling; works on remote files too. - Archives as directories — press Enter on a
.zip,.tar,.tar.gz(or.jar,.whl,.tgz,.tar.bz2,.tar.xz) and the pane goes into it. Browse, tag and copy files out withF5exactly as from a directory; Backspace at the top comes back out. Read-only, and stdlib-only. - Run files — press Enter on a shell script, a Python file, anything with
a
#!line, or any executable, and it runs (also File ▸ Run… and the right-click menu). A small dialog takes arguments — Esc there cancels, so nothing runs by accident — then the program gets the real terminal: output streams live, a script that prompts can be answered, and the screen waits for Enter before returning so the tail of the output stays readable. A non-executable file with a#!line is handed to the interpreter that line names, so a fresh script runs withoutchmod +x; a file with neither opens in the viewer as before. On an SFTP/SSH pane the file runs on the remote host (overssh -t, like the full-screen shell); FTP panes only view. - PDF viewer (
F3on a.pdf) — the text of each page, laid out as the page has it: lines rebuilt from glyph positions, spaces inferred from the gaps, columns kept side by side.Tabpages through,/searches the whole document. A scanned page has no text — pressiand its image opens in the image viewer. Standard library alone: object streams, cross-reference streams, Flate/LZW/ASCII85/RunLength and/ToUnicodeCMaps all included. - Image viewer (
F3on a.png,.jpg,.gif,.bmp,.pnm) — the picture itself, in the terminal's real pixels on terminals that speak Sixel or the kitty graphics protocol, and half-block characters (two pixels per cell) everywhere else.gswitches between them. Pan, zoom, step through GIF frames, or drop to an ASCII luminance ramp..webp/.avif/.heic/.tiffare named and measured rather than drawn — their pixels need a video codec the standard library does not ship. - Markdown viewer (
F3on a.md) — rendered rather than raw: markers gone, bold and italic andcodeshown with real terminal attributes, headings ruled, lists and quotes laid out, tables aligned, links numbered with a reference list at the end.rshows the source instead. - Document viewer (
F3on a.docx/.docm) — the Word document as text, with headings ruled, bullets and numbered lists indented, and tables laid out as aligned columns. Wrapped to the terminal, searchable like any other file, and read with the standard library alone. - Slide browser (
F3on a.pptx/.pptm) — one slide per screen with its title, bullets at their outline levels and tables;Tabbetween slides,tfor the speaker notes,/to search the whole deck. Standard library alone, like the others. - Spreadsheet browser (
F3on an.xlsx/.xlsm) — a full-screen grid with row numbers, column letters, right-aligned numbers, dates rendered through the workbook's own number formats,Tabbetween sheets and the same/search. It reads the format with the standard library alone, so spreadsheets open with nothing installed — on remote panes too. - Your own pager (Options ▸ Viewer) — point
F3atless,$PAGERor any command you name, for plain text; a spreadsheet, document, deck, PDF or image keeps the browser built for it rather than being shown to a pager as bytes. Remote files are fetched to a private copy and read there. - File editor (
F4) — a real in-place editor (insert/delete, Enter/Backspace line handling, save withCtrl-S), also with toggleable line numbers. Prefer your own editor? Options > Editor pointsF4atvi,vim,$EDITORor any command you name — including on a remote pane, which is fetched to a private copy and written back if you changed it. - Side-by-side compare (
D) — the file each pane is offering, in two columns aligned line for line and scrolled as one: changed lines marked!, lines only on one side+/-, and a shaded gap facing them on the other.n/Njump between blocks of differences. Built in rather than a call out tovimdiff, so a local file compares against an SFTP, SSH, FTP or in-archive one with nothing fetched to disk first. - Head and tail in a pane (
h) — the pane becomes the first and last lines of whatever the other pane's cursor is on, with a rule between them counting what was skipped, and it follows that cursor as you move it: ten files is ten arrow keys, with the listing keeping its place. Sized to the pane so both ends show at once;+/-pin a larger or smaller count,rre-reads,Escgives the pane back. The file is streamed once and only the two ends are kept, so a multi-gigabyte log costs what a short one does. - New file (
n) and rename (r) —touchand a rename without leaving for a shell; an existing file is restamped, never emptied. - Tag multiple files (
Insert/Space,+all,-none) for batch copy/move/delete. - Find files (
f) — search the pane's tree by substring or glob (remote panes included, cancellable) and get a browsable result list: view or edit a hit right from the list, or press Enter to jump the pane to the containing directory with the cursor on the file. - Find the space (
u) — every subdirectory shows what is under it instead of<DIR>, with a bar scaled to the biggest thing in the directory, so you follow the longest bar down the tree withEnterand end up standing in whatever is filling the disk. No total, no separate report: the answer is a path. The walk runs between keystrokes, so the pane stays usable while it counts — remote panes included. - Per-pane hidden-file toggle (
.) — show or hide dotfiles independently in each pane. - Terminal inside the pane (
t) — the pane itself becomes a pseudo-terminal running a shell in the pane's directory, while the other pane keeps working normally. Works for local panes (a real pty) and for SFTP/SSH panes (an interactive shell on the pane's existing SSH connection).Ctrl-]switches to the other pane while the shell keeps running (Tab back to return);F10or exiting the shell closes it. For full-screen programs (vim, htop) use!, which suspends the UI into a real terminal instead. - Mouse support — click to select, double-click to open, wheel to scroll, and right-click for a context menu of actions (view, edit, copy, move, rename, delete, tag, mkdir, new file, compare, head+tail, terminal).
- Works even when F-keys are hijacked — every function key has a digit alias
(
1–0→F1–F10) and the common actions have mnemonic letters. - Pane plug-ins (
p) — put a pane into plug-in mode: pick from discovered plug-ins and it takes over the pane, with access to the opposite pane's contents. Writing one takes a dozen lines (see Plug-ins); built-ins include remote JSON push and run-remote-script over SSH, plus data tools for profiling, cleaning and building CSV/TSV datasets. - In-app configuration (
C) — editconfig.iniand plug-in files in the built-in editor without leaving the app. - A keystroke away from your shell —
eval "$(meridian --shell-init bash)"bindsCtrl-O: browse, quit, and your shell is left in the directory you navigated to. bash, zsh and fish. - No required dependencies for local + FTP use — it runs on the Python
standard library. SFTP uses the optional
paramikopackage.
Install
pip install meridian-commander
# with SFTP/SSH support (remote panes, in-pane remote terminal, SSH plug-ins)
pip install "meridian-commander[ssh]"
# optional: pandas acceleration for the data plug-ins' group-by on large files
pip install "meridian-commander[data]"
# or from a checkout
pip install ".[ssh]"
This installs the meridian-commander command and its short alias meridian.
pipx is recommended — it puts the commands
somewhere on your PATH and keeps the app in its own environment:
pipx install "meridian-commander[ssh]"
Python 3.9 or newer, on Linux or macOS (on Windows, under WSL). If meridian
comes back "command not found", the manual's
installation page diagnoses both causes — it always
works as python -m meridian_commander in the meantime.
Usage
meridian-commander # left pane here, right pane in your home directory
meridian-commander /etc /var/log # left pane in /etc, right pane in /var/log
Press F1 for help, F2 to connect a pane to a remote location, Tab
to switch panes, F5/F6 to copy/move between them, F9 to
synchronize, and F10 to quit. Esc opens the menu bar, which reaches
everything a key does.
Documentation
The manual is at https://meridian-commander.readthedocs.io/:
| Page | What is in it |
|---|---|
| Installation | the extras, pipx, and "command not found" |
| Usage | remote locations, presets, the archive, document, image and PDF browsers, and the full key-binding reference |
| Look and feel | the three colour schemes, and terminals without colour |
| Configuration | config.ini and where it lives |
| Plug-ins | what ships, and how to write one |
| Data tools | profiling, cleaning and building datasets |
| Copying and synchronizing | the second channel, and what the sync planner decides |
| Development | the architecture, and what CI checks |
| Plug-in API | PluginContext, PanePlugin, InputOutputPlugin |
The website has screenshots and a tour.
Contributing
Bug reports, patches and plug-ins are welcome. CONTRIBUTING.md covers the setup, what CI checks and why, how the test harness is built, and what a pull request should look like. CHANGELOG.md records what changed in each release, and CODE_OF_CONDUCT.md is short and says what you would expect.
Found a security problem? Please report it privately — SECURITY.md says how, and describes what this program touches.
License
GNU General Public License v3.0 — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file meridian_commander-1.4.0.tar.gz.
File metadata
- Download URL: meridian_commander-1.4.0.tar.gz
- Upload date:
- Size: 538.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b406a184a7c0ebc7053cb9786aecb6bc8a57038a3acffc6da2c2a715ecc0f369
|
|
| MD5 |
1f86451a18352302dc6af8378357b2f8
|
|
| BLAKE2b-256 |
b24193683f8ebfa9e0fb724f94e10b15fa78727aa06eced3468927d10f73d7be
|
Provenance
The following attestation bundles were made for meridian_commander-1.4.0.tar.gz:
Publisher:
publish.yml on MartinGallagher-code/meridian_commander
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
meridian_commander-1.4.0.tar.gz -
Subject digest:
b406a184a7c0ebc7053cb9786aecb6bc8a57038a3acffc6da2c2a715ecc0f369 - Sigstore transparency entry: 2862512571
- Sigstore integration time:
-
Permalink:
MartinGallagher-code/meridian_commander@06b245bdee57c2bf910013a2a30e46906ecc5bde -
Branch / Tag:
refs/heads/main - Owner: https://github.com/MartinGallagher-code
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@06b245bdee57c2bf910013a2a30e46906ecc5bde -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file meridian_commander-1.4.0-py3-none-any.whl.
File metadata
- Download URL: meridian_commander-1.4.0-py3-none-any.whl
- Upload date:
- Size: 302.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3752db0c4e3ded306d1adf10a2bb27eb7c7655c2d67c4bf753a898cba4bfef2
|
|
| MD5 |
f25f1261005544edde74b64759da3e0f
|
|
| BLAKE2b-256 |
b47f23f12c9975ce74e42200efb3fbf99fe0a3fcbc5efffefc67493afd31eaf8
|
Provenance
The following attestation bundles were made for meridian_commander-1.4.0-py3-none-any.whl:
Publisher:
publish.yml on MartinGallagher-code/meridian_commander
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
meridian_commander-1.4.0-py3-none-any.whl -
Subject digest:
d3752db0c4e3ded306d1adf10a2bb27eb7c7655c2d67c4bf753a898cba4bfef2 - Sigstore transparency entry: 2862512737
- Sigstore integration time:
-
Permalink:
MartinGallagher-code/meridian_commander@06b245bdee57c2bf910013a2a30e46906ecc5bde -
Branch / Tag:
refs/heads/main - Owner: https://github.com/MartinGallagher-code
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@06b245bdee57c2bf910013a2a30e46906ecc5bde -
Trigger Event:
workflow_dispatch
-
Statement type: