probefs 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- probefs-0.1.0/.gitignore +26 -0
- probefs-0.1.0/LICENSE +21 -0
- probefs-0.1.0/PKG-INFO +320 -0
- probefs-0.1.0/README.md +287 -0
- probefs-0.1.0/docs/USER_GUIDE.md +662 -0
- probefs-0.1.0/docs/keybindings.md +122 -0
- probefs-0.1.0/probefs.yaml.example +48 -0
- probefs-0.1.0/pyproject.toml +57 -0
- probefs-0.1.0/src/probefs/__init__.py +3 -0
- probefs-0.1.0/src/probefs/__main__.py +4 -0
- probefs-0.1.0/src/probefs/app.py +187 -0
- probefs-0.1.0/src/probefs/config.py +129 -0
- probefs-0.1.0/src/probefs/core/__init__.py +0 -0
- probefs-0.1.0/src/probefs/core/file_manager.py +129 -0
- probefs-0.1.0/src/probefs/fs/__init__.py +0 -0
- probefs-0.1.0/src/probefs/fs/probe_fs.py +382 -0
- probefs-0.1.0/src/probefs/icons/__init__.py +1 -0
- probefs-0.1.0/src/probefs/icons/ascii_set.py +43 -0
- probefs-0.1.0/src/probefs/icons/base.py +24 -0
- probefs-0.1.0/src/probefs/icons/factory.py +30 -0
- probefs-0.1.0/src/probefs/icons/nerd_set.py +46 -0
- probefs-0.1.0/src/probefs/icons/yaml_set.py +45 -0
- probefs-0.1.0/src/probefs/probefs.tcss +27 -0
- probefs-0.1.0/src/probefs/rendering/__init__.py +1 -0
- probefs-0.1.0/src/probefs/rendering/columns.py +68 -0
- probefs-0.1.0/src/probefs/rendering/metadata.py +138 -0
- probefs-0.1.0/src/probefs/screens/__init__.py +0 -0
- probefs-0.1.0/src/probefs/screens/main.py +487 -0
- probefs-0.1.0/src/probefs/screens/sftp.py +512 -0
- probefs-0.1.0/src/probefs/theme/__init__.py +3 -0
- probefs-0.1.0/src/probefs/theme/builtin.py +34 -0
- probefs-0.1.0/src/probefs/theme/loader.py +184 -0
- probefs-0.1.0/src/probefs/themes/__init__.py +0 -0
- probefs-0.1.0/src/probefs/themes/dark.yaml +16 -0
- probefs-0.1.0/src/probefs/themes/light.yaml +16 -0
- probefs-0.1.0/src/probefs/themes/tokyo-night.yaml +16 -0
- probefs-0.1.0/src/probefs/widgets/__init__.py +0 -0
- probefs-0.1.0/src/probefs/widgets/dialogs.py +502 -0
- probefs-0.1.0/src/probefs/widgets/directory_list.py +204 -0
- probefs-0.1.0/src/probefs/widgets/filter_bar.py +97 -0
- probefs-0.1.0/src/probefs/widgets/preview_pane.py +216 -0
- probefs-0.1.0/src/probefs/widgets/status_bar.py +86 -0
- probefs-0.1.0/tests/__init__.py +0 -0
- probefs-0.1.0/tests/test_file_manager_core.py +164 -0
- probefs-0.1.0/tests/test_rendering_metadata.py +205 -0
- probefs-0.1.0/tests/test_theme_loader.py +321 -0
- probefs-0.1.0/uv.lock +1096 -0
probefs-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Planning
|
|
2
|
+
.planning/
|
|
3
|
+
|
|
4
|
+
# Python version pin
|
|
5
|
+
.python-version
|
|
6
|
+
|
|
7
|
+
# Python
|
|
8
|
+
__pycache__/
|
|
9
|
+
*.py[cod]
|
|
10
|
+
*.pyo
|
|
11
|
+
*.egg-info/
|
|
12
|
+
dist/
|
|
13
|
+
build/
|
|
14
|
+
.venv/
|
|
15
|
+
*.egg
|
|
16
|
+
|
|
17
|
+
# Testing / coverage
|
|
18
|
+
.pytest_cache/
|
|
19
|
+
.coverage
|
|
20
|
+
htmlcov/
|
|
21
|
+
|
|
22
|
+
# Editors / OS
|
|
23
|
+
.DS_Store
|
|
24
|
+
.idea/
|
|
25
|
+
.vscode/
|
|
26
|
+
*.swp
|
probefs-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Dale Wright
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
probefs-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: probefs
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A fast, beautiful, keyboard-driven TUI file browser
|
|
5
|
+
Project-URL: Homepage, https://github.com/diverdale/probefs
|
|
6
|
+
Project-URL: Repository, https://github.com/diverdale/probefs
|
|
7
|
+
Project-URL: Bug Tracker, https://github.com/diverdale/probefs/issues
|
|
8
|
+
Author-email: Dale Wright <diverdale@gmail.com>
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: cli,file-browser,file-manager,miller-columns,sftp,terminal,textual,tui
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Intended Audience :: System Administrators
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Topic :: System :: Filesystems
|
|
24
|
+
Classifier: Topic :: Terminals
|
|
25
|
+
Classifier: Topic :: Utilities
|
|
26
|
+
Requires-Python: >=3.10
|
|
27
|
+
Requires-Dist: fsspec>=2024.2.0
|
|
28
|
+
Requires-Dist: paramiko>=3.0.0
|
|
29
|
+
Requires-Dist: ruamel-yaml>=0.19.1
|
|
30
|
+
Requires-Dist: send2trash>=2.1.0
|
|
31
|
+
Requires-Dist: textual>=0.89.1
|
|
32
|
+
Description-Content-Type: text/markdown
|
|
33
|
+
|
|
34
|
+
# probefs
|
|
35
|
+
|
|
36
|
+
**A fast, beautiful, keyboard-driven TUI file browser built with Python and Textual.**
|
|
37
|
+
Navigate your filesystem at the speed of thought — no mouse required.
|
|
38
|
+
|
|
39
|
+

|
|
40
|
+

|
|
41
|
+

|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Layout
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
┌─────────────────────────────────────────────────────────────────────────┐
|
|
49
|
+
│ probefs │
|
|
50
|
+
├──────────────────┬──────────────────────┬──────────────────────────────┤
|
|
51
|
+
│ PARENT │ CURRENT │ PREVIEW │
|
|
52
|
+
│ │ │ │
|
|
53
|
+
│ .. │ > Documents/ │ # README.md │
|
|
54
|
+
│ home/ │ Downloads/ │ │
|
|
55
|
+
│ etc/ │ Music/ │ Welcome to probefs. │
|
|
56
|
+
│ usr/ │ Pictures/ │ A keyboard-driven TUI │
|
|
57
|
+
│ var/ │ Videos/ │ file browser built with │
|
|
58
|
+
│ │ README.md │ Python and Textual. │
|
|
59
|
+
│ │ .bashrc │ │
|
|
60
|
+
│ │ .gitconfig │ Navigate fast. No mouse. │
|
|
61
|
+
│ │ │ │
|
|
62
|
+
├──────────────────┴──────────────────────┴──────────────────────────────┤
|
|
63
|
+
│ ~/home/user • 8 items • 42.3 GB free │
|
|
64
|
+
├─────────────────────────────────────────────────────────────────────────┤
|
|
65
|
+
│ j/k move l/Enter open h/Back up y copy p move d trash ? help │
|
|
66
|
+
└─────────────────────────────────────────────────────────────────────────┘
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Features
|
|
72
|
+
|
|
73
|
+
- **Three-pane miller columns** — parent context, active directory, and live preview side-by-side
|
|
74
|
+
- **Vim-style navigation** — `j`/`k` to move, `l` to enter, `h` to go up
|
|
75
|
+
- **Navigation history** — `Ctrl+O` / `Ctrl+I` to jump back and forward; `g` to go to any path
|
|
76
|
+
- **Syntax-highlighted previews** — powered by Pygments, auto-detected from file extension
|
|
77
|
+
- **Archive previews** — ZIP and tar file contents listed inline, no extra deps required
|
|
78
|
+
- **PDF previews** — extracted text preview via poppler (`pdftotext`), if installed
|
|
79
|
+
- **Directory previews** — right pane lists directory contents when a folder is selected
|
|
80
|
+
- **Sort modes** — `s` cycles name↑ → name↓ → size↓ → date↓; sort indicator in status bar
|
|
81
|
+
- **Fuzzy name filter** — `/` opens a live filter bar; type to narrow, `Enter` to keep, `Esc` to clear
|
|
82
|
+
- **Full file operations** — copy, move, rename, delete, new file, new directory
|
|
83
|
+
- **Safe deletes** — `d` sends to OS Trash, never permanent deletion
|
|
84
|
+
- **Open with default app** — `o` launches the system default application for a file
|
|
85
|
+
- **Clipboard** — `Y` copies the selected item's full path to the clipboard
|
|
86
|
+
- **Shell drop** — `!` drops to your `$SHELL` in the current directory; probefs resumes on exit
|
|
87
|
+
- **SFTP dual-pane** — `Ctrl+S` opens a local↔remote transfer screen; connection profiles saved automatically
|
|
88
|
+
- **Toggle hidden files** — `.` key shows/hides dotfiles instantly
|
|
89
|
+
- **Nerd Fonts icons** — optional glyph icons with `icons: nerd` in config (falls back to ASCII)
|
|
90
|
+
- **Configurable themes** — three built-ins plus a full custom theme YAML schema
|
|
91
|
+
- **Rebindable keys** — override any action's keybinding in your config file
|
|
92
|
+
- **Help dialog** — `?` shows the full keybinding reference at any time
|
|
93
|
+
- **Status bar** — always shows current path, item count, sort mode, and free disk space
|
|
94
|
+
- **Zero mouse required** — every operation reachable from the keyboard
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Requirements
|
|
99
|
+
|
|
100
|
+
- Python >= 3.10
|
|
101
|
+
- Any modern terminal (kitty, iTerm2, Ghostty, Windows Terminal, GNOME Terminal, etc.)
|
|
102
|
+
- **Optional:** [poppler](https://poppler.freedesktop.org/) for PDF previews (`brew install poppler` / `apt install poppler-utils`)
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Installation
|
|
107
|
+
|
|
108
|
+
### From PyPI (recommended)
|
|
109
|
+
|
|
110
|
+
```sh
|
|
111
|
+
pip install probefs
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Or with [uv](https://github.com/astral-sh/uv) (installs as an isolated tool):
|
|
115
|
+
|
|
116
|
+
```sh
|
|
117
|
+
uv tool install probefs
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### From source (development)
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
git clone https://github.com/yourusername/probefs.git
|
|
124
|
+
cd probefs
|
|
125
|
+
uv sync
|
|
126
|
+
uv run probefs
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Quick Start
|
|
132
|
+
|
|
133
|
+
```sh
|
|
134
|
+
probefs
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
That's it. probefs opens in your current directory.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Key Bindings
|
|
142
|
+
|
|
143
|
+
### Navigation
|
|
144
|
+
|
|
145
|
+
| Key | Action |
|
|
146
|
+
|-----|--------|
|
|
147
|
+
| `j` / `↓` | Move cursor down |
|
|
148
|
+
| `k` / `↑` | Move cursor up |
|
|
149
|
+
| `l` / `Enter` | Enter directory / open file |
|
|
150
|
+
| `h` / `Backspace` | Go up to parent directory |
|
|
151
|
+
| `Ctrl+O` | Navigate back in history |
|
|
152
|
+
| `Ctrl+I` | Navigate forward in history |
|
|
153
|
+
| `g` | Go to path (jump anywhere) |
|
|
154
|
+
|
|
155
|
+
### View
|
|
156
|
+
|
|
157
|
+
| Key | Action |
|
|
158
|
+
|-----|--------|
|
|
159
|
+
| `.` | Toggle hidden files (dotfiles) |
|
|
160
|
+
| `s` | Cycle sort mode (name↑ → name↓ → size↓ → date↓) |
|
|
161
|
+
| `/` | Filter files by name (live; `Esc` cancel · `Enter` keep) |
|
|
162
|
+
|
|
163
|
+
### File Operations
|
|
164
|
+
|
|
165
|
+
| Key | Action |
|
|
166
|
+
|-----|--------|
|
|
167
|
+
| `y` | Copy selected item |
|
|
168
|
+
| `p` | Move selected item |
|
|
169
|
+
| `d` | Delete — sends to OS Trash (safe, reversible) |
|
|
170
|
+
| `r` | Rename selected item |
|
|
171
|
+
| `n` | New file in current directory |
|
|
172
|
+
| `Ctrl+N` | New directory in current directory |
|
|
173
|
+
|
|
174
|
+
### Clipboard & Launch
|
|
175
|
+
|
|
176
|
+
| Key | Action |
|
|
177
|
+
|-----|--------|
|
|
178
|
+
| `Y` | Copy current path to clipboard |
|
|
179
|
+
| `o` | Open with system default application |
|
|
180
|
+
| `!` | Drop to shell in current directory |
|
|
181
|
+
| `Ctrl+S` | Open SFTP screen |
|
|
182
|
+
|
|
183
|
+
### App
|
|
184
|
+
|
|
185
|
+
| Key | Action |
|
|
186
|
+
|-----|--------|
|
|
187
|
+
| `?` | Show help / keybinding reference |
|
|
188
|
+
| `a` | About probefs |
|
|
189
|
+
| `Ctrl+Q` / `Ctrl+C` | Quit |
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Configuration
|
|
194
|
+
|
|
195
|
+
probefs reads `~/.probefs/probefs.yaml` on startup. The file and directory are created automatically on first launch. For a fully commented reference, see [`probefs.yaml.example`](probefs.yaml.example) in this repo.
|
|
196
|
+
|
|
197
|
+
```yaml
|
|
198
|
+
# ~/.probefs/probefs.yaml
|
|
199
|
+
|
|
200
|
+
theme: probefs-dark # built-in theme name
|
|
201
|
+
theme_file: ~/mytheme.yaml # path to a custom theme YAML (overrides theme:)
|
|
202
|
+
|
|
203
|
+
icons: nerd # nerd (requires Nerd Fonts) | ascii (default)
|
|
204
|
+
|
|
205
|
+
keybindings:
|
|
206
|
+
probefs.cursor_down: "j" # override a default key
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Invalid configuration is silently ignored; probefs will never crash on startup due to a bad config file.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Themes
|
|
214
|
+
|
|
215
|
+
Three themes are built in:
|
|
216
|
+
|
|
217
|
+
| Theme name | Style |
|
|
218
|
+
|---|---|
|
|
219
|
+
| `probefs-dark` | Dark background, blue/teal accents (default) |
|
|
220
|
+
| `probefs-light` | Light background, high-contrast |
|
|
221
|
+
| `probefs-tokyo-night` | Tokyo Night color palette |
|
|
222
|
+
|
|
223
|
+
Activate a theme in your config:
|
|
224
|
+
|
|
225
|
+
```yaml
|
|
226
|
+
theme: probefs-tokyo-night
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Custom Themes
|
|
232
|
+
|
|
233
|
+
Drop a `.yaml` file into `~/.probefs/themes/` and probefs picks it up automatically on next launch. Activate it by name:
|
|
234
|
+
|
|
235
|
+
```yaml
|
|
236
|
+
theme: my-theme
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Or point `theme_file` directly at any YAML file:
|
|
240
|
+
|
|
241
|
+
```yaml
|
|
242
|
+
theme_file: ~/my-probefs-theme.yaml
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Full theme schema:
|
|
246
|
+
|
|
247
|
+
```yaml
|
|
248
|
+
name: my-theme # required
|
|
249
|
+
dark: true # true = dark background variant
|
|
250
|
+
|
|
251
|
+
# Core colors (all accept CSS hex, rgb(), or named colors)
|
|
252
|
+
primary: "#5B8DD9"
|
|
253
|
+
secondary: "#2D4A8A"
|
|
254
|
+
background: "#1C2023"
|
|
255
|
+
surface: "#252B2E"
|
|
256
|
+
panel: "#1E2528"
|
|
257
|
+
foreground: "#E0E0E0"
|
|
258
|
+
warning: "#FFB86C"
|
|
259
|
+
error: "#FF5555"
|
|
260
|
+
success: "#50FA7B"
|
|
261
|
+
accent: "#8BE9FD"
|
|
262
|
+
|
|
263
|
+
# Optional metadata (informational only, not used at runtime)
|
|
264
|
+
author: "Your Name"
|
|
265
|
+
description: "My custom theme"
|
|
266
|
+
version: "1.0.0"
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Only `name` and `primary` are required. All other color fields are optional and fall back to theme defaults.
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Icons
|
|
274
|
+
|
|
275
|
+
By default probefs uses plain ASCII symbols that work in any terminal. If your terminal uses a [Nerd Fonts](https://www.nerdfonts.com/) patched font, enable glyph icons:
|
|
276
|
+
|
|
277
|
+
```yaml
|
|
278
|
+
icons: nerd
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
| Setting | Icons used |
|
|
282
|
+
|---------|------------|
|
|
283
|
+
| `ascii` (default) | `/` dirs, space files — works everywhere including SSH |
|
|
284
|
+
| `nerd` | Unicode glyphs from Nerd Fonts (requires patched font) |
|
|
285
|
+
|
|
286
|
+
> Auto-detection is not possible over SSH, so Nerd Fonts must be explicitly enabled.
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## Keybinding Overrides
|
|
291
|
+
|
|
292
|
+
Override any action's key in `~/.probefs/probefs.yaml`:
|
|
293
|
+
|
|
294
|
+
```yaml
|
|
295
|
+
keybindings:
|
|
296
|
+
probefs.cursor_down: "j,ctrl+j" # multiple keys: comma-separated
|
|
297
|
+
probefs.cursor_up: "k"
|
|
298
|
+
probefs.quit: "q"
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
An override **replaces** all defaults for that action. To keep an existing key and add a new one, list both:
|
|
302
|
+
|
|
303
|
+
```yaml
|
|
304
|
+
keybindings:
|
|
305
|
+
probefs.enter_dir: "l,enter,space" # l, Enter, and Space all enter a directory
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
> Note: chord/sequence bindings (e.g. `gg`) are not supported. No conflict detection is performed — if two actions share a key, last registration wins.
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Documentation
|
|
313
|
+
|
|
314
|
+
Full reference: [docs/USER_GUIDE.md](docs/USER_GUIDE.md)
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## License
|
|
319
|
+
|
|
320
|
+
MIT — see [LICENSE](LICENSE) for details.
|
probefs-0.1.0/README.md
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# probefs
|
|
2
|
+
|
|
3
|
+
**A fast, beautiful, keyboard-driven TUI file browser built with Python and Textual.**
|
|
4
|
+
Navigate your filesystem at the speed of thought — no mouse required.
|
|
5
|
+
|
|
6
|
+

|
|
7
|
+

|
|
8
|
+

|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Layout
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
┌─────────────────────────────────────────────────────────────────────────┐
|
|
16
|
+
│ probefs │
|
|
17
|
+
├──────────────────┬──────────────────────┬──────────────────────────────┤
|
|
18
|
+
│ PARENT │ CURRENT │ PREVIEW │
|
|
19
|
+
│ │ │ │
|
|
20
|
+
│ .. │ > Documents/ │ # README.md │
|
|
21
|
+
│ home/ │ Downloads/ │ │
|
|
22
|
+
│ etc/ │ Music/ │ Welcome to probefs. │
|
|
23
|
+
│ usr/ │ Pictures/ │ A keyboard-driven TUI │
|
|
24
|
+
│ var/ │ Videos/ │ file browser built with │
|
|
25
|
+
│ │ README.md │ Python and Textual. │
|
|
26
|
+
│ │ .bashrc │ │
|
|
27
|
+
│ │ .gitconfig │ Navigate fast. No mouse. │
|
|
28
|
+
│ │ │ │
|
|
29
|
+
├──────────────────┴──────────────────────┴──────────────────────────────┤
|
|
30
|
+
│ ~/home/user • 8 items • 42.3 GB free │
|
|
31
|
+
├─────────────────────────────────────────────────────────────────────────┤
|
|
32
|
+
│ j/k move l/Enter open h/Back up y copy p move d trash ? help │
|
|
33
|
+
└─────────────────────────────────────────────────────────────────────────┘
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Features
|
|
39
|
+
|
|
40
|
+
- **Three-pane miller columns** — parent context, active directory, and live preview side-by-side
|
|
41
|
+
- **Vim-style navigation** — `j`/`k` to move, `l` to enter, `h` to go up
|
|
42
|
+
- **Navigation history** — `Ctrl+O` / `Ctrl+I` to jump back and forward; `g` to go to any path
|
|
43
|
+
- **Syntax-highlighted previews** — powered by Pygments, auto-detected from file extension
|
|
44
|
+
- **Archive previews** — ZIP and tar file contents listed inline, no extra deps required
|
|
45
|
+
- **PDF previews** — extracted text preview via poppler (`pdftotext`), if installed
|
|
46
|
+
- **Directory previews** — right pane lists directory contents when a folder is selected
|
|
47
|
+
- **Sort modes** — `s` cycles name↑ → name↓ → size↓ → date↓; sort indicator in status bar
|
|
48
|
+
- **Fuzzy name filter** — `/` opens a live filter bar; type to narrow, `Enter` to keep, `Esc` to clear
|
|
49
|
+
- **Full file operations** — copy, move, rename, delete, new file, new directory
|
|
50
|
+
- **Safe deletes** — `d` sends to OS Trash, never permanent deletion
|
|
51
|
+
- **Open with default app** — `o` launches the system default application for a file
|
|
52
|
+
- **Clipboard** — `Y` copies the selected item's full path to the clipboard
|
|
53
|
+
- **Shell drop** — `!` drops to your `$SHELL` in the current directory; probefs resumes on exit
|
|
54
|
+
- **SFTP dual-pane** — `Ctrl+S` opens a local↔remote transfer screen; connection profiles saved automatically
|
|
55
|
+
- **Toggle hidden files** — `.` key shows/hides dotfiles instantly
|
|
56
|
+
- **Nerd Fonts icons** — optional glyph icons with `icons: nerd` in config (falls back to ASCII)
|
|
57
|
+
- **Configurable themes** — three built-ins plus a full custom theme YAML schema
|
|
58
|
+
- **Rebindable keys** — override any action's keybinding in your config file
|
|
59
|
+
- **Help dialog** — `?` shows the full keybinding reference at any time
|
|
60
|
+
- **Status bar** — always shows current path, item count, sort mode, and free disk space
|
|
61
|
+
- **Zero mouse required** — every operation reachable from the keyboard
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Requirements
|
|
66
|
+
|
|
67
|
+
- Python >= 3.10
|
|
68
|
+
- Any modern terminal (kitty, iTerm2, Ghostty, Windows Terminal, GNOME Terminal, etc.)
|
|
69
|
+
- **Optional:** [poppler](https://poppler.freedesktop.org/) for PDF previews (`brew install poppler` / `apt install poppler-utils`)
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Installation
|
|
74
|
+
|
|
75
|
+
### From PyPI (recommended)
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
pip install probefs
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Or with [uv](https://github.com/astral-sh/uv) (installs as an isolated tool):
|
|
82
|
+
|
|
83
|
+
```sh
|
|
84
|
+
uv tool install probefs
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### From source (development)
|
|
88
|
+
|
|
89
|
+
```sh
|
|
90
|
+
git clone https://github.com/yourusername/probefs.git
|
|
91
|
+
cd probefs
|
|
92
|
+
uv sync
|
|
93
|
+
uv run probefs
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Quick Start
|
|
99
|
+
|
|
100
|
+
```sh
|
|
101
|
+
probefs
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
That's it. probefs opens in your current directory.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Key Bindings
|
|
109
|
+
|
|
110
|
+
### Navigation
|
|
111
|
+
|
|
112
|
+
| Key | Action |
|
|
113
|
+
|-----|--------|
|
|
114
|
+
| `j` / `↓` | Move cursor down |
|
|
115
|
+
| `k` / `↑` | Move cursor up |
|
|
116
|
+
| `l` / `Enter` | Enter directory / open file |
|
|
117
|
+
| `h` / `Backspace` | Go up to parent directory |
|
|
118
|
+
| `Ctrl+O` | Navigate back in history |
|
|
119
|
+
| `Ctrl+I` | Navigate forward in history |
|
|
120
|
+
| `g` | Go to path (jump anywhere) |
|
|
121
|
+
|
|
122
|
+
### View
|
|
123
|
+
|
|
124
|
+
| Key | Action |
|
|
125
|
+
|-----|--------|
|
|
126
|
+
| `.` | Toggle hidden files (dotfiles) |
|
|
127
|
+
| `s` | Cycle sort mode (name↑ → name↓ → size↓ → date↓) |
|
|
128
|
+
| `/` | Filter files by name (live; `Esc` cancel · `Enter` keep) |
|
|
129
|
+
|
|
130
|
+
### File Operations
|
|
131
|
+
|
|
132
|
+
| Key | Action |
|
|
133
|
+
|-----|--------|
|
|
134
|
+
| `y` | Copy selected item |
|
|
135
|
+
| `p` | Move selected item |
|
|
136
|
+
| `d` | Delete — sends to OS Trash (safe, reversible) |
|
|
137
|
+
| `r` | Rename selected item |
|
|
138
|
+
| `n` | New file in current directory |
|
|
139
|
+
| `Ctrl+N` | New directory in current directory |
|
|
140
|
+
|
|
141
|
+
### Clipboard & Launch
|
|
142
|
+
|
|
143
|
+
| Key | Action |
|
|
144
|
+
|-----|--------|
|
|
145
|
+
| `Y` | Copy current path to clipboard |
|
|
146
|
+
| `o` | Open with system default application |
|
|
147
|
+
| `!` | Drop to shell in current directory |
|
|
148
|
+
| `Ctrl+S` | Open SFTP screen |
|
|
149
|
+
|
|
150
|
+
### App
|
|
151
|
+
|
|
152
|
+
| Key | Action |
|
|
153
|
+
|-----|--------|
|
|
154
|
+
| `?` | Show help / keybinding reference |
|
|
155
|
+
| `a` | About probefs |
|
|
156
|
+
| `Ctrl+Q` / `Ctrl+C` | Quit |
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Configuration
|
|
161
|
+
|
|
162
|
+
probefs reads `~/.probefs/probefs.yaml` on startup. The file and directory are created automatically on first launch. For a fully commented reference, see [`probefs.yaml.example`](probefs.yaml.example) in this repo.
|
|
163
|
+
|
|
164
|
+
```yaml
|
|
165
|
+
# ~/.probefs/probefs.yaml
|
|
166
|
+
|
|
167
|
+
theme: probefs-dark # built-in theme name
|
|
168
|
+
theme_file: ~/mytheme.yaml # path to a custom theme YAML (overrides theme:)
|
|
169
|
+
|
|
170
|
+
icons: nerd # nerd (requires Nerd Fonts) | ascii (default)
|
|
171
|
+
|
|
172
|
+
keybindings:
|
|
173
|
+
probefs.cursor_down: "j" # override a default key
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Invalid configuration is silently ignored; probefs will never crash on startup due to a bad config file.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Themes
|
|
181
|
+
|
|
182
|
+
Three themes are built in:
|
|
183
|
+
|
|
184
|
+
| Theme name | Style |
|
|
185
|
+
|---|---|
|
|
186
|
+
| `probefs-dark` | Dark background, blue/teal accents (default) |
|
|
187
|
+
| `probefs-light` | Light background, high-contrast |
|
|
188
|
+
| `probefs-tokyo-night` | Tokyo Night color palette |
|
|
189
|
+
|
|
190
|
+
Activate a theme in your config:
|
|
191
|
+
|
|
192
|
+
```yaml
|
|
193
|
+
theme: probefs-tokyo-night
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Custom Themes
|
|
199
|
+
|
|
200
|
+
Drop a `.yaml` file into `~/.probefs/themes/` and probefs picks it up automatically on next launch. Activate it by name:
|
|
201
|
+
|
|
202
|
+
```yaml
|
|
203
|
+
theme: my-theme
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Or point `theme_file` directly at any YAML file:
|
|
207
|
+
|
|
208
|
+
```yaml
|
|
209
|
+
theme_file: ~/my-probefs-theme.yaml
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Full theme schema:
|
|
213
|
+
|
|
214
|
+
```yaml
|
|
215
|
+
name: my-theme # required
|
|
216
|
+
dark: true # true = dark background variant
|
|
217
|
+
|
|
218
|
+
# Core colors (all accept CSS hex, rgb(), or named colors)
|
|
219
|
+
primary: "#5B8DD9"
|
|
220
|
+
secondary: "#2D4A8A"
|
|
221
|
+
background: "#1C2023"
|
|
222
|
+
surface: "#252B2E"
|
|
223
|
+
panel: "#1E2528"
|
|
224
|
+
foreground: "#E0E0E0"
|
|
225
|
+
warning: "#FFB86C"
|
|
226
|
+
error: "#FF5555"
|
|
227
|
+
success: "#50FA7B"
|
|
228
|
+
accent: "#8BE9FD"
|
|
229
|
+
|
|
230
|
+
# Optional metadata (informational only, not used at runtime)
|
|
231
|
+
author: "Your Name"
|
|
232
|
+
description: "My custom theme"
|
|
233
|
+
version: "1.0.0"
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Only `name` and `primary` are required. All other color fields are optional and fall back to theme defaults.
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Icons
|
|
241
|
+
|
|
242
|
+
By default probefs uses plain ASCII symbols that work in any terminal. If your terminal uses a [Nerd Fonts](https://www.nerdfonts.com/) patched font, enable glyph icons:
|
|
243
|
+
|
|
244
|
+
```yaml
|
|
245
|
+
icons: nerd
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
| Setting | Icons used |
|
|
249
|
+
|---------|------------|
|
|
250
|
+
| `ascii` (default) | `/` dirs, space files — works everywhere including SSH |
|
|
251
|
+
| `nerd` | Unicode glyphs from Nerd Fonts (requires patched font) |
|
|
252
|
+
|
|
253
|
+
> Auto-detection is not possible over SSH, so Nerd Fonts must be explicitly enabled.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Keybinding Overrides
|
|
258
|
+
|
|
259
|
+
Override any action's key in `~/.probefs/probefs.yaml`:
|
|
260
|
+
|
|
261
|
+
```yaml
|
|
262
|
+
keybindings:
|
|
263
|
+
probefs.cursor_down: "j,ctrl+j" # multiple keys: comma-separated
|
|
264
|
+
probefs.cursor_up: "k"
|
|
265
|
+
probefs.quit: "q"
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
An override **replaces** all defaults for that action. To keep an existing key and add a new one, list both:
|
|
269
|
+
|
|
270
|
+
```yaml
|
|
271
|
+
keybindings:
|
|
272
|
+
probefs.enter_dir: "l,enter,space" # l, Enter, and Space all enter a directory
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
> Note: chord/sequence bindings (e.g. `gg`) are not supported. No conflict detection is performed — if two actions share a key, last registration wins.
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Documentation
|
|
280
|
+
|
|
281
|
+
Full reference: [docs/USER_GUIDE.md](docs/USER_GUIDE.md)
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## License
|
|
286
|
+
|
|
287
|
+
MIT — see [LICENSE](LICENSE) for details.
|