rtfm-filemanager 8.0 → 8.0.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/README.md +15 -1
- data/bin/rtfm +20 -29
- data/docs/keyboard-reference.md +15 -3
- data/docs/remote-browsing.md +4 -4
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2268b6df0d2f7e4c4c3b16441b1d38c60596271205935b7718d85c279ce583d0
|
|
4
|
+
data.tar.gz: 6900af4ed1b6b7ff9be6d6d62dc688c62f937dd752bc9a2e164b8eddca243c1b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 45bc4528912e89d2002139c15c80b214b4824aaa0113f49269ed390bafb15c8a065a4602346abef6bd7163876b8e9d432784d5678d22b88184c48de5fbe33398
|
|
7
|
+
data.tar.gz: cb124815c4ace418b44d82f2bfadca9b1d7dec1b65d46beddc9c77009ccb5d21eea9b0e88fc2d98522935c7622d7187fe8ce28472ff3af1cc13e636cb5a80f12
|
data/CHANGELOG.md
CHANGED
|
@@ -5,11 +5,16 @@ All notable changes to RTFM will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [8.0.1] - 2026-03-07
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- **Harmonized key mappings** - `d` now consistently means delete across all modes (normal, archive, remote). `D` = extract (archive mode) or download (remote mode). Removed `P` move-out shortcut from archive mode.
|
|
12
|
+
|
|
8
13
|
## [8.0] - 2026-03-07
|
|
9
14
|
|
|
10
15
|
### Added
|
|
11
16
|
- **Browse archives as virtual directories** - Press Enter on .zip, .tar.gz, .tar.bz2, .tar.xz, .rar, .7z files to browse their contents as if they were directories. Navigate with normal keys, press LEFT at root to exit. Yellow-green visual indicator distinguishes archive mode. Supports nested directories within archives. Press `x` to open archive with external program instead.
|
|
12
|
-
- **Archive write operations** - Full read/write support for archives:
|
|
17
|
+
- **Archive write operations** - Full read/write support for archives: delete entries (`d`), extract entries (`D`), add local files (`p`). Tag multiple entries with `t` for bulk operations. Supports zip, tar.gz, tar.bz2, tar.xz, rar, and 7z formats.
|
|
13
18
|
- **Async background file operations** - Copy and move operations on multiple items or directories now run in a background thread with progress displayed in the bottom pane. The UI remains responsive during large operations. Single-file operations and symlinks remain synchronous for instant feedback.
|
|
14
19
|
- **Scrollable diff viewer** - File comparison (`X`) now shows the full unified diff with scrollable navigation (j/k, PgUp/PgDn, Home/End). Press `s` to toggle between unified diff and side-by-side view. No more truncation at 15 lines.
|
|
15
20
|
|
data/README.md
CHANGED
|
@@ -324,13 +324,27 @@ user@server.com:/path # Production server
|
|
|
324
324
|
|-----|--------|
|
|
325
325
|
| `←` / `h` | Parent directory |
|
|
326
326
|
| `→` / `ENTER` | Enter dir / show file info |
|
|
327
|
-
| `
|
|
327
|
+
| `D` | Download file |
|
|
328
328
|
| `u` | Upload tagged files |
|
|
329
329
|
| `s` | Open SSH shell |
|
|
330
330
|
| `Ctrl-e` | Exit remote mode |
|
|
331
331
|
|
|
332
332
|
**Visual indicator:** Red background when in remote mode
|
|
333
333
|
|
|
334
|
+
### Archive Browsing
|
|
335
|
+
|
|
336
|
+
Press `Enter` on any archive file (.zip, .tar.gz, .tar.bz2, .tar.xz, .rar, .7z) to browse its contents as a virtual directory.
|
|
337
|
+
|
|
338
|
+
| Key | Action |
|
|
339
|
+
|-----|--------|
|
|
340
|
+
| `d` | Delete entry from archive |
|
|
341
|
+
| `D` | Extract entry to origin directory |
|
|
342
|
+
| `p` | Add pre-tagged local files into archive |
|
|
343
|
+
| `t` | Tag/untag for bulk operations |
|
|
344
|
+
| `LEFT` | Parent directory / exit archive |
|
|
345
|
+
|
|
346
|
+
**Visual indicator:** Yellow-green background when in archive mode
|
|
347
|
+
|
|
334
348
|
---
|
|
335
349
|
|
|
336
350
|
## Configuration
|
data/bin/rtfm
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
# get a great understanding of the code itself by simply sending
|
|
19
19
|
# or pasting this whole file into you favorite AI for coding with
|
|
20
20
|
# a prompt like this: "Help me understand every part of this code".
|
|
21
|
-
@version = '8.0' # Archive browsing, async file ops, scrollable diff viewer
|
|
21
|
+
@version = '8.0.2' # Archive browsing, async file ops, scrollable diff viewer
|
|
22
22
|
|
|
23
23
|
# SAVE & STORE TERMINAL {{{1
|
|
24
24
|
ORIG_STTY = `stty -g`.chomp
|
|
@@ -206,7 +206,7 @@ CONFIG_FILE = File.join(RTFM_HOME, 'conf')
|
|
|
206
206
|
> = Follow symlink to the directory where the target resides
|
|
207
207
|
Ctrl-r = Show recently accessed files and directories (press number to jump)
|
|
208
208
|
Ctrl-e = Browse remote directories via SSH/SFTP (toggle remote mode)
|
|
209
|
-
In remote mode:
|
|
209
|
+
In remote mode: D=download, u=upload, s=shell, →=file info, ←=parent dir
|
|
210
210
|
SSH connections support comments: user@host:/path # Comment
|
|
211
211
|
|
|
212
212
|
DIRECTORY VIEWS
|
|
@@ -270,7 +270,7 @@ CONFIG_FILE = File.join(RTFM_HOME, 'conf')
|
|
|
270
270
|
ENTER = Browse inside archive (zip, tar, gz, bz2, xz, rar, 7z) - virtual browsing
|
|
271
271
|
Press LEFT at archive root to exit back to normal browsing
|
|
272
272
|
x = Open archive with external program (bypass archive browsing)
|
|
273
|
-
Inside an archive: d=
|
|
273
|
+
Inside an archive: d=delete, D=extract, p=add files, t=tag
|
|
274
274
|
z = Extract tagged zipped archive to current directory
|
|
275
275
|
Z = Create zipped archive from tagged files/directories
|
|
276
276
|
|
|
@@ -2564,9 +2564,9 @@ end
|
|
|
2564
2564
|
def render_side_by_side(lines1, lines2, name1, name2, offset, page_height) # {{{3
|
|
2565
2565
|
half_width = (@pR.w - 7) / 2
|
|
2566
2566
|
half_width = [half_width, 10].max
|
|
2567
|
-
text = "\n"
|
|
2568
|
-
text << sprintf(" %-#{half_width}s
|
|
2569
|
-
text << " " + "
|
|
2567
|
+
text = +"\n"
|
|
2568
|
+
text << sprintf(" %-#{half_width}s \u2502 %s\n", name1[0, half_width], name2[0, half_width]).fg(226)
|
|
2569
|
+
text << " " + "\u2500" * half_width + "\u2500\u253C\u2500" + "\u2500" * half_width + "\n"
|
|
2570
2570
|
|
|
2571
2571
|
max_lines = [lines1.size, lines2.size].max
|
|
2572
2572
|
end_line = [offset + page_height, max_lines].min
|
|
@@ -2577,7 +2577,7 @@ def render_side_by_side(lines1, lines2, name1, name2, offset, page_height) # {{{
|
|
|
2577
2577
|
same = lines1[i] == lines2[i]
|
|
2578
2578
|
color = same ? 240 : (lines1[i].nil? ? 156 : (lines2[i].nil? ? 196 : 226))
|
|
2579
2579
|
|
|
2580
|
-
text << sprintf(" %-#{half_width}s
|
|
2580
|
+
text << sprintf(" %-#{half_width}s \u2502 %s\n", l1, l2).fg(color)
|
|
2581
2581
|
end
|
|
2582
2582
|
|
|
2583
2583
|
text
|
|
@@ -2968,10 +2968,9 @@ def show_archive_file_info(entry) # {{{3
|
|
|
2968
2968
|
if entry[:type] == 'directory'
|
|
2969
2969
|
info_text << " Enter = Navigate into directory\n".fg(240)
|
|
2970
2970
|
end
|
|
2971
|
-
info_text << " d =
|
|
2972
|
-
info_text << " D =
|
|
2971
|
+
info_text << " d = Delete from archive\n".fg(240)
|
|
2972
|
+
info_text << " D = Extract to origin directory\n".fg(240)
|
|
2973
2973
|
info_text << " p = Add local files into archive\n".fg(240)
|
|
2974
|
-
info_text << " P = Move out (extract + delete from archive)\n".fg(240)
|
|
2975
2974
|
info_text << " t = Tag/untag for bulk operations\n".fg(240)
|
|
2976
2975
|
info_text << " LEFT = Go to parent / exit archive\n".fg(240)
|
|
2977
2976
|
@pR.say(info_text)
|
|
@@ -3854,7 +3853,7 @@ def build_remote_help # {{{3
|
|
|
3854
3853
|
|
|
3855
3854
|
help_text << "Remote Navigation:\n".fg(226)
|
|
3856
3855
|
help_text << " • Use arrow keys to navigate directories\n"
|
|
3857
|
-
help_text << " • Press " + "
|
|
3856
|
+
help_text << " • Press " + "D".fg(156) + " to download files\n"
|
|
3858
3857
|
help_text << " • Press " + "u".fg(156) + " to upload files\n"
|
|
3859
3858
|
help_text << " • Press " + "s".fg(156) + " to open SSH shell\n"
|
|
3860
3859
|
help_text << " • Press " + "→".fg(156) + " to view file info\n"
|
|
@@ -3875,17 +3874,6 @@ def copy_items # {{{3
|
|
|
3875
3874
|
end
|
|
3876
3875
|
|
|
3877
3876
|
def move_items # {{{3
|
|
3878
|
-
if @archive_mode
|
|
3879
|
-
# In archive mode, 'P' extracts then deletes (move out of archive)
|
|
3880
|
-
return unless @archive_mode && @archive_path
|
|
3881
|
-
entries = archive_tagged_or_selected
|
|
3882
|
-
return if entries.empty?
|
|
3883
|
-
archive_extract_entries
|
|
3884
|
-
# Re-tag the entries so archive_delete_entries can find them
|
|
3885
|
-
@tagged = entries.map { |e| "#{@archive_path}:#{e[:full_path]}" }
|
|
3886
|
-
archive_delete_entries if @archive_mode
|
|
3887
|
-
return
|
|
3888
|
-
end
|
|
3889
3877
|
copy_move_link('move')
|
|
3890
3878
|
@pR.update = true
|
|
3891
3879
|
end
|
|
@@ -3948,14 +3936,12 @@ end
|
|
|
3948
3936
|
|
|
3949
3937
|
def delete_items # {{{3
|
|
3950
3938
|
if @archive_mode
|
|
3951
|
-
# In archive mode, 'd'
|
|
3952
|
-
|
|
3939
|
+
# In archive mode, 'd' = delete from archive (consistent with normal mode)
|
|
3940
|
+
archive_delete_entries
|
|
3953
3941
|
return
|
|
3954
3942
|
end
|
|
3955
3943
|
if @remote_mode
|
|
3956
|
-
#
|
|
3957
|
-
remote_download_selected
|
|
3958
|
-
return
|
|
3944
|
+
return # No delete in remote mode; download is on 'D'
|
|
3959
3945
|
end
|
|
3960
3946
|
|
|
3961
3947
|
tagged_info
|
|
@@ -4064,8 +4050,13 @@ end
|
|
|
4064
4050
|
|
|
4065
4051
|
def empty_trash # {{{3
|
|
4066
4052
|
if @archive_mode
|
|
4067
|
-
# In archive mode, 'D'
|
|
4068
|
-
|
|
4053
|
+
# In archive mode, 'D' = extract entries to origin directory
|
|
4054
|
+
archive_extract_entries
|
|
4055
|
+
return
|
|
4056
|
+
end
|
|
4057
|
+
if @remote_mode
|
|
4058
|
+
# In remote mode, 'D' = download selected file
|
|
4059
|
+
remote_download_selected
|
|
4069
4060
|
return
|
|
4070
4061
|
end
|
|
4071
4062
|
@pB.say(" Really empty Trash (~/.rtfm/trash)? (press 'y')")
|
data/docs/keyboard-reference.md
CHANGED
|
@@ -238,10 +238,22 @@ When viewing an image, `Ctrl-y` copies the actual image file - paste into GIMP,
|
|
|
238
238
|
|
|
239
239
|
| Key | Action |
|
|
240
240
|
|-----|--------|
|
|
241
|
-
| `
|
|
241
|
+
| `Enter` | Browse archive as virtual directory |
|
|
242
|
+
| `x` | Open archive with external program (bypass browsing) |
|
|
243
|
+
| `z` | Extract tagged archive to current directory |
|
|
242
244
|
| `Z` | Create archive from tagged items |
|
|
243
245
|
|
|
244
|
-
**
|
|
246
|
+
**Inside archive browsing mode:**
|
|
247
|
+
|
|
248
|
+
| Key | Action |
|
|
249
|
+
|-----|--------|
|
|
250
|
+
| `d` | Delete entry from archive |
|
|
251
|
+
| `D` | Extract entry to origin directory |
|
|
252
|
+
| `p` | Add pre-tagged local files into archive |
|
|
253
|
+
| `t` | Tag/untag entries for bulk operations |
|
|
254
|
+
| `LEFT` | Go to parent directory / exit archive |
|
|
255
|
+
|
|
256
|
+
**Supported formats:** .zip, .tar.gz, .tar.bz2, .tar.xz, .rar, .7z
|
|
245
257
|
|
|
246
258
|
## Git Operations
|
|
247
259
|
|
|
@@ -333,7 +345,7 @@ Useful for plugin development and debugging.
|
|
|
333
345
|
| `↑` `↓` | Navigate files |
|
|
334
346
|
| `←` `h` | Parent directory |
|
|
335
347
|
| `→` `ENTER` | Show file info |
|
|
336
|
-
| `
|
|
348
|
+
| `D` | Download file |
|
|
337
349
|
| `u` | Upload tagged files |
|
|
338
350
|
| `s` | Open SSH shell |
|
|
339
351
|
|
data/docs/remote-browsing.md
CHANGED
|
@@ -11,7 +11,7 @@ RTFM lets you browse and manage files on remote servers via SSH/SFTP as seamless
|
|
|
11
11
|
1. Press `Ctrl-e` to enter remote mode
|
|
12
12
|
2. Enter connection: `user@server.com:/path/to/directory`
|
|
13
13
|
3. Navigate with normal keys
|
|
14
|
-
4. Press `
|
|
14
|
+
4. Press `D` to download, `u` to upload
|
|
15
15
|
5. Press `Ctrl-e` to return to local mode
|
|
16
16
|
|
|
17
17
|
## Connection Formats
|
|
@@ -90,13 +90,13 @@ Press `→` or `ENTER` on a file to see:
|
|
|
90
90
|
### Download Single File
|
|
91
91
|
|
|
92
92
|
1. Navigate to file
|
|
93
|
-
2. Press `
|
|
93
|
+
2. Press `D`
|
|
94
94
|
3. File downloads to your current local directory
|
|
95
95
|
|
|
96
96
|
### Download Multiple Files
|
|
97
97
|
|
|
98
98
|
1. Tag files with `t`
|
|
99
|
-
2. Press `
|
|
99
|
+
2. Press `D`
|
|
100
100
|
3. All tagged files download
|
|
101
101
|
|
|
102
102
|
**Download location:** Current local directory (where you were before entering remote mode)
|
|
@@ -221,7 +221,7 @@ Tag local files → Ctrl-e → server:/var/www → u (upload)
|
|
|
221
221
|
### Backup Files
|
|
222
222
|
|
|
223
223
|
```
|
|
224
|
-
Ctrl-e → server:/data → Tag files →
|
|
224
|
+
Ctrl-e → server:/data → Tag files → D (download)
|
|
225
225
|
```
|
|
226
226
|
|
|
227
227
|
### Quick Config Edit
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rtfm-filemanager
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 8.0.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Geir Isene
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-03-
|
|
11
|
+
date: 2026-03-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rcurses
|