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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a7a4b89db4d1b51d0fd284d272a38e984464001c59ba56073573a9970f368c2d
4
- data.tar.gz: 28fb1c3993d2bd7a5bfc37963af077ebb902cd36b6afea714aee5e8392b995f3
3
+ metadata.gz: 2268b6df0d2f7e4c4c3b16441b1d38c60596271205935b7718d85c279ce583d0
4
+ data.tar.gz: 6900af4ed1b6b7ff9be6d6d62dc688c62f937dd752bc9a2e164b8eddca243c1b
5
5
  SHA512:
6
- metadata.gz: 5949e6579609b8c5680d2d808f0f7c7df263560ec1c740105712189de44b20b6b6140daba57ef80b366f5556ec7b702f0a98ee85a39e1481e07c4b66d2297736
7
- data.tar.gz: e48903d3b30df3318d1327eda8ae7150e3e40e7d27b081e190a8a8088c44eb0af400d501550844ac52e5f9a687759b22bed82231e339f857af1f238db7d77e41
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: extract entries (`d`), delete entries (`D`), add local files (`p`), and move out (`P` = extract + delete). Tag multiple entries with `t` for bulk operations. Supports zip, tar.gz, tar.bz2, tar.xz, rar, and 7z formats.
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
- | `d` | Download file |
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: d=download, u=upload, s=shell, →=file info, ←=parent dir
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=extract, D=delete, p=add files, t=tag, P=move out
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 | %s\n", name1[0, half_width], name2[0, half_width]).fg(226)
2569
- text << " " + "-" * half_width + "-+-" + "-" * half_width + "\n"
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 | %s\n", l1, l2).fg(color)
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 = Extract to origin directory\n".fg(240)
2972
- info_text << " D = Delete from archive\n".fg(240)
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 " + "d".fg(156) + " to download files\n"
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' key extracts to origin directory
3952
- archive_extract_entries
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
- # In remote mode, 'd' key downloads the selected file
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' deletes entries from archive
4068
- archive_delete_entries
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')")
@@ -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
- | `z` | Extract tagged archive |
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
- **Supported formats:** .zip, .tar, .gz, .bz2, .xz, .rar, .7z
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
- | `d` | Download file |
348
+ | `D` | Download file |
337
349
  | `u` | Upload tagged files |
338
350
  | `s` | Open SSH shell |
339
351
 
@@ -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 `d` to download, `u` to upload
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 `d`
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 `d`
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 → d (download)
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: '8.0'
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-07 00:00:00.000000000 Z
11
+ date: 2026-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rcurses