rtfm-filemanager 8.2.2 → 8.2.4

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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rtfm +31 -12
  3. data/img/rtfm-kb.svg +341 -0
  4. metadata +3 -3
  5. data/img/rtfm-kb.png +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 70a9b068989497362fa5d26c2a31cc1f839af5364ccf978b0f99f68707159255
4
- data.tar.gz: f7e15cbab0c75bef8fc163eb179b60559ed08fc2f87244eb0e7ed703758c4581
3
+ metadata.gz: 9578236347587df8d2eb07db00d7a667093344d95a60103a5df3fc2819df9f9a
4
+ data.tar.gz: 36ba2c5bc4b229d53200708da04fc29cc7e013fc9fee7c4abc8d10a6ba055eb7
5
5
  SHA512:
6
- metadata.gz: 664d2c0a068716ff76cd10bd525dbc6383b5e8073d696db8d268a2927eaf6050affdcd0c359fbb0be8544612c3591804975a9847594af09392f12de389c76b5b
7
- data.tar.gz: c02dce8c6556406b65b0ff87b9062f4f45256d4feccc0fbcf1c8fc2404c84708acdaae8f87b2ddd929377494691accd61d519ca8b964481ed7d686d08ee7d6e1
6
+ metadata.gz: f11d1c5405086f0a90ab186fb349a571c2af82c1e0d9b9f7513758a678db299dec69d8b9bde1c8b6f5eed91fc86d511457a29ba24287dbe2c57a04925e149240
7
+ data.tar.gz: bc1f862bdb325cfa015dbb6ba31146a338ef105b9e5400bdd5988b4d616d6b9788dd6ac7c7f1e41adcad5773d71a691c83a7f11233a9f7d93b7dd45df8007d33
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.2.2' # Replace bare rescues with typed exceptions
21
+ @version = '8.2.4' # Performance: cache MIME type lookups
22
22
 
23
23
  # SAVE & STORE TERMINAL {{{1
24
24
  ORIG_STTY = `stty -g`.chomp
@@ -494,6 +494,20 @@ def cmd?(cmd) # Helper function
494
494
  system("which #{cmd} > /dev/null 2>&1")
495
495
  end
496
496
 
497
+ def mime_type(path) # Cached MIME type lookup
498
+ mtime = File.mtime(path).to_i rescue 0
499
+ key = "#{path}:#{mtime}"
500
+ return @mime_cache[key] if @mime_cache[key]
501
+ result = `file --mime-type -b #{Shellwords.escape(path)} 2>/dev/null`.strip
502
+ if @mime_cache_size >= @max_mime_entries
503
+ @mime_cache.clear
504
+ @mime_cache_size = 0
505
+ end
506
+ @mime_cache[key] = result
507
+ @mime_cache_size += 1
508
+ result
509
+ end
510
+
497
511
  # Initialize termpix for image display
498
512
  @termpix = Termpix::Display.new
499
513
  @showimage = @termpix.supported?
@@ -525,6 +539,9 @@ $stdin.set_encoding(Encoding::UTF_8)
525
539
  @command_cache = {} # Cache for expensive shell commands
526
540
  @command_cache_size = 0
527
541
  @max_command_cache = 50
542
+ @mime_cache = {} # Cache for file MIME type lookups
543
+ @mime_cache_size = 0
544
+ @max_mime_entries = 200
528
545
 
529
546
  # INITIALIZE VARIABLES {{{1
530
547
  ## These can be set by user in ~/.rtfm/conf
@@ -2121,9 +2138,8 @@ def show_file_properties # {{{3
2121
2138
 
2122
2139
  # MIME type
2123
2140
  begin
2124
- mime_output = `file --mime-type #{Shellwords.escape(@selected)} 2>/dev/null`.strip
2125
- mime_type = mime_output.split(':')[1]&.strip || "Unknown"
2126
- text << sprintf(" %-20s %s\n", "MIME Type:", mime_type.fg(156))
2141
+ mt = mime_type(@selected)
2142
+ text << sprintf(" %-20s %s\n", "MIME Type:", mt.fg(156))
2127
2143
  rescue StandardError # file command failed
2128
2144
  text << sprintf(" %-20s %s\n", "MIME Type:", "Unknown".fg(240))
2129
2145
  end
@@ -4882,7 +4898,8 @@ def copy_path_primary # {{{3
4882
4898
  path = get_selected_full_path
4883
4899
  if path
4884
4900
  copy_to_clipboard(path, 'primary')
4885
- @pB.say(' Path copied to primary selection (middle-click to paste)')
4901
+ copy_to_clipboard(path, 'clipboard')
4902
+ @pB.say(' Path copied')
4886
4903
  else
4887
4904
  @pB.say(' No selected item path to copy')
4888
4905
  end
@@ -4897,7 +4914,8 @@ def copy_path_clipboard # {{{3
4897
4914
  path = get_selected_full_path
4898
4915
  if path
4899
4916
  copy_to_clipboard(path, 'clipboard')
4900
- @pB.say(' Path copied to clipboard (Ctrl+V to paste)')
4917
+ copy_to_clipboard(path, 'primary')
4918
+ @pB.say(' Path copied')
4901
4919
  else
4902
4920
  @pB.say(' No selected item path to copy')
4903
4921
  end
@@ -4968,10 +4986,11 @@ def copy_right # {{{3
4968
4986
  @pB.say(' Failed to copy image - xclip may not be installed')
4969
4987
  end
4970
4988
  else
4971
- # Copy right pane text content
4972
- clip = 'xclip -selection clipboard'
4973
- @pB.say(' Right pane text copied to clipboard')
4974
- shell("echo -n #{Shellwords.escape(@pR.text.pure)} | #{clip} > /dev/null 2>&1", background: true)
4989
+ # Copy right pane text content to both selections
4990
+ escaped = Shellwords.escape(@pR.text.pure)
4991
+ shell("echo -n #{escaped} | xclip -selection clipboard > /dev/null 2>&1", background: true)
4992
+ shell("echo -n #{escaped} | xclip -selection primary > /dev/null 2>&1", background: true)
4993
+ @pB.say(' Right pane text copied')
4975
4994
  end
4976
4995
  end
4977
4996
 
@@ -6379,7 +6398,7 @@ def get_interactive_program(file_path) # HELPER FOR OPEN_SELECTED TO USE @intera
6379
6398
  end
6380
6399
  else
6381
6400
  # Check what xdg-open would use
6382
- mimetype = `file --mime-type -b #{Shellwords.escape(file_path)}`.chomp
6401
+ mimetype = mime_type(file_path)
6383
6402
  desktop_file = `xdg-mime query default #{Shellwords.escape(mimetype)}`.chomp
6384
6403
 
6385
6404
  if desktop_file && !desktop_file.empty?
@@ -6749,7 +6768,7 @@ def showcontent # SHOW CONTENTS IN THE RIGHT WINDOW {{{2
6749
6768
  @image = true
6750
6769
  else
6751
6770
  # Check if file is text using the `file` command
6752
- file_type = `file --mime-type -b #{Shellwords.escape(@selected)} 2>/dev/null`.strip
6771
+ file_type = mime_type(@selected)
6753
6772
  if file_type.start_with?('text/') || file_type == 'application/x-empty'
6754
6773
  # It's a text file - fall through to text preview below
6755
6774
  else
data/img/rtfm-kb.svg ADDED
@@ -0,0 +1,341 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1500 560" width="1500" height="560" font-family="monospace, Courier New, Courier">
2
+ <defs>
3
+ <style>
4
+ .key { fill: #333; stroke: #555; stroke-width: 1; rx: 5; ry: 5; }
5
+ .kw { fill: #2a2a2a; stroke: #555; stroke-width: 1; rx: 5; ry: 5; }
6
+ .kl { font-size: 12px; fill: #bbb; font-weight: bold; text-anchor: middle; }
7
+ .lo { font-size: 8.5px; fill: #FF8888; text-anchor: middle; }
8
+ .up { font-size: 8.5px; fill: #88BBFF; text-anchor: middle; }
9
+ .ct { font-size: 10px; fill: #88FF88; }
10
+ .sp { font-size: 8.5px; fill: #DDAAFF; text-anchor: middle; }
11
+ .nv { font-size: 8.5px; fill: #bbb; text-anchor: middle; }
12
+ </style>
13
+ </defs>
14
+ <rect width="1500" height="560" fill="#1a1a1a" rx="8"/>
15
+ <text x="470" y="22" text-anchor="middle" font-size="15" font-weight="bold" fill="#fff">RTFM Keyboard Reference</text>
16
+
17
+ <!-- Row 0: Esc -->
18
+ <rect x="10" y="34" width="58" height="55" class="key"/>
19
+ <text x="39" y="54" class="kl">Esc</text>
20
+ <text x="39" y="80" class="lo">quit</text>
21
+
22
+ <!-- Row 1: Number row kw=62 gap=4 -->
23
+ <rect x="10" y="97" width="58" height="55" class="key"/>
24
+ <text x="39" y="117" class="kl">` ~</text>
25
+ <text x="39" y="143" class="lo">~ home</text>
26
+
27
+ <rect x="72" y="97" width="62" height="55" class="key"/>
28
+ <text x="103" y="117" class="kl">1</text>
29
+ <text x="103" y="143" class="lo">tab 1</text>
30
+
31
+ <rect x="138" y="97" width="62" height="55" class="key"/>
32
+ <text x="169" y="117" class="kl">2</text>
33
+ <text x="169" y="143" class="lo">tab 2</text>
34
+
35
+ <rect x="204" y="97" width="62" height="55" class="key"/>
36
+ <text x="235" y="117" class="kl">3</text>
37
+ <text x="235" y="143" class="lo">tab 3</text>
38
+
39
+ <rect x="270" y="97" width="62" height="55" class="key"/>
40
+ <text x="301" y="117" class="kl">4</text>
41
+ <text x="301" y="143" class="lo">tab 4</text>
42
+
43
+ <rect x="336" y="97" width="62" height="55" class="key"/>
44
+ <text x="367" y="117" class="kl">5</text>
45
+ <text x="367" y="143" class="lo">tab 5</text>
46
+
47
+ <rect x="402" y="97" width="62" height="55" class="key"/>
48
+ <text x="433" y="117" class="kl">6</text>
49
+ <text x="433" y="143" class="lo">tab 6</text>
50
+
51
+ <rect x="468" y="97" width="62" height="55" class="key"/>
52
+ <text x="499" y="117" class="kl">7</text>
53
+ <text x="499" y="143" class="lo">tab 7</text>
54
+
55
+ <rect x="534" y="97" width="62" height="55" class="key"/>
56
+ <text x="565" y="117" class="kl">8</text>
57
+ <text x="565" y="143" class="lo">tab 8</text>
58
+
59
+ <rect x="600" y="97" width="62" height="55" class="key"/>
60
+ <text x="631" y="117" class="kl">9</text>
61
+ <text x="631" y="143" class="lo">tab 9</text>
62
+
63
+ <rect x="666" y="97" width="62" height="55" class="key"/>
64
+ <text x="697" y="127" class="kl">0</text>
65
+
66
+ <rect x="732" y="97" width="62" height="55" class="key"/>
67
+ <text x="763" y="115" class="kl">- _</text>
68
+ <text x="763" y="133" class="sp">_ image</text>
69
+ <text x="763" y="146" class="lo">- preview</text>
70
+
71
+ <rect x="798" y="97" width="62" height="55" class="key"/>
72
+ <text x="829" y="115" class="kl">= +</text>
73
+ <text x="829" y="133" class="sp">+ interact</text>
74
+ <text x="829" y="146" class="lo">= mkdir</text>
75
+
76
+ <rect x="864" y="97" width="76" height="55" class="kw"/>
77
+ <text x="902" y="130" class="nv">Bksp</text>
78
+
79
+ <!-- Row 2: QWERTY start x=10+80=90 offset, kw=62 -->
80
+ <rect x="10" y="160" width="76" height="55" class="kw"/>
81
+ <text x="48" y="183" class="nv">Tab</text>
82
+ <text x="48" y="206" class="nv">pgdn R</text>
83
+
84
+ <rect x="90" y="160" width="62" height="55" class="key"/>
85
+ <text x="121" y="176" class="kl">Q</text>
86
+ <text x="121" y="194" class="up">Q nosave</text>
87
+ <text x="121" y="207" class="lo">q save</text>
88
+
89
+ <rect x="156" y="160" width="62" height="55" class="key"/>
90
+ <text x="187" y="176" class="kl">W</text>
91
+ <text x="187" y="194" class="up">Write cfg</text>
92
+ <text x="187" y="207" class="lo">width</text>
93
+
94
+ <rect x="222" y="160" width="62" height="55" class="key"/>
95
+ <text x="253" y="176" class="kl">E</text>
96
+ <text x="253" y="194" class="up">Bulk ren</text>
97
+ <text x="253" y="207" class="lo">props</text>
98
+
99
+ <rect x="288" y="160" width="62" height="55" class="key"/>
100
+ <text x="319" y="176" class="kl">R</text>
101
+ <text x="319" y="194" class="up">Load cfg</text>
102
+ <text x="319" y="207" class="lo">refresh</text>
103
+
104
+ <rect x="354" y="160" width="62" height="55" class="key"/>
105
+ <text x="385" y="176" class="kl">T</text>
106
+ <text x="385" y="194" class="up">Tag list</text>
107
+ <text x="385" y="207" class="lo">tag</text>
108
+
109
+ <rect x="420" y="160" width="62" height="55" class="key"/>
110
+ <text x="451" y="176" class="kl">Y</text>
111
+ <text x="451" y="194" class="up">Cp clipbd</text>
112
+ <text x="451" y="207" class="lo">cp primary</text>
113
+
114
+ <rect x="486" y="160" width="62" height="55" class="key"/>
115
+ <text x="517" y="176" class="kl">U</text>
116
+ <text x="517" y="194" class="up">Undo</text>
117
+ <text x="517" y="207" class="lo">untag all</text>
118
+
119
+ <rect x="552" y="160" width="62" height="55" class="key"/>
120
+ <text x="583" y="176" class="kl">I</text>
121
+ <text x="583" y="194" class="up">AI descr</text>
122
+ <text x="583" y="207" class="lo">invert</text>
123
+
124
+ <rect x="618" y="160" width="62" height="55" class="key"/>
125
+ <text x="649" y="176" class="kl">O</text>
126
+ <text x="649" y="194" class="up">ls cmd</text>
127
+ <text x="649" y="207" class="lo">order</text>
128
+
129
+ <rect x="684" y="160" width="62" height="55" class="key"/>
130
+ <text x="715" y="176" class="kl">P</text>
131
+ <text x="715" y="194" class="up">Move here</text>
132
+ <text x="715" y="207" class="lo">copy here</text>
133
+
134
+ <rect x="750" y="160" width="62" height="55" class="key"/>
135
+ <text x="781" y="176" class="kl">[ {</text>
136
+ <text x="781" y="194" class="sp">{ ren tab</text>
137
+ <text x="781" y="207" class="sp">[ cls tab</text>
138
+
139
+ <rect x="816" y="160" width="62" height="55" class="key"/>
140
+ <text x="847" y="176" class="kl">] }</text>
141
+ <text x="847" y="194" class="sp">} dup tab</text>
142
+ <text x="847" y="207" class="sp">] new tab</text>
143
+
144
+ <rect x="882" y="160" width="58" height="55" class="key"/>
145
+ <text x="911" y="176" class="kl">\</text>
146
+ <text x="911" y="200" class="sp">clr srch</text>
147
+
148
+ <!-- Row 3: ASDF start x=10+90=100 offset -->
149
+ <rect x="10" y="223" width="86" height="55" class="kw"/>
150
+ <text x="53" y="255" class="nv">Ctrl</text>
151
+
152
+ <rect x="100" y="223" width="62" height="55" class="key"/>
153
+ <text x="131" y="239" class="kl">A</text>
154
+ <text x="131" y="257" class="up">Long list</text>
155
+ <text x="131" y="270" class="lo">all/none</text>
156
+
157
+ <rect x="166" y="223" width="62" height="55" class="key"/>
158
+ <text x="197" y="239" class="kl">S</text>
159
+ <text x="197" y="257" class="up">Sys info</text>
160
+ <text x="197" y="270" class="lo">symlink</text>
161
+
162
+ <rect x="232" y="223" width="62" height="55" class="key"/>
163
+ <text x="263" y="239" class="kl">D</text>
164
+ <text x="263" y="257" class="up">Emp trash</text>
165
+ <text x="263" y="270" class="lo">delete</text>
166
+
167
+ <rect x="298" y="223" width="62" height="55" class="key"/>
168
+ <text x="329" y="239" class="kl">F</text>
169
+ <text x="329" y="257" class="up">Filt regex</text>
170
+ <text x="329" y="270" class="lo">filt type</text>
171
+
172
+ <rect x="364" y="223" width="62" height="55" class="key"/>
173
+ <text x="395" y="239" class="kl">G</text>
174
+ <text x="395" y="257" class="up">Git status</text>
175
+ <text x="395" y="270" class="lo">grep</text>
176
+
177
+ <rect x="430" y="223" width="62" height="55" class="key"/>
178
+ <text x="461" y="239" class="kl">H</text>
179
+ <text x="461" y="257" class="up">Hash dir</text>
180
+ <text x="461" y="270" class="nv">h = LEFT</text>
181
+
182
+ <rect x="496" y="223" width="62" height="55" class="key"/>
183
+ <text x="527" y="239" class="kl">J</text>
184
+ <text x="527" y="257" class="up">Prev tab</text>
185
+ <text x="527" y="270" class="nv">j = DOWN</text>
186
+
187
+ <rect x="562" y="223" width="62" height="55" class="key"/>
188
+ <text x="593" y="239" class="kl">K</text>
189
+ <text x="593" y="257" class="up">Next tab</text>
190
+ <text x="593" y="270" class="nv">k = UP</text>
191
+
192
+ <rect x="628" y="223" width="62" height="55" class="key"/>
193
+ <text x="659" y="239" class="kl">L</text>
194
+ <text x="659" y="257" class="up">Locate</text>
195
+ <text x="659" y="270" class="nv">l = RIGHT</text>
196
+
197
+ <rect x="694" y="223" width="62" height="55" class="key"/>
198
+ <text x="725" y="239" class="kl">; :</text>
199
+ <text x="725" y="257" class="sp">: command</text>
200
+ <text x="725" y="270" class="sp">; history</text>
201
+
202
+ <rect x="760" y="223" width="62" height="55" class="key"/>
203
+ <text x="791" y="239" class="kl">'</text>
204
+ <text x="791" y="262" class="sp">jump mark</text>
205
+
206
+ <rect x="826" y="223" width="114" height="55" class="kw"/>
207
+ <text x="883" y="248" class="nv">Enter</text>
208
+ <text x="883" y="268" class="nv">open/refresh</text>
209
+
210
+ <!-- Row 4: ZXCV start x=10+100=110 offset -->
211
+ <rect x="10" y="286" width="96" height="55" class="kw"/>
212
+ <text x="58" y="318" class="nv">Shift</text>
213
+
214
+ <rect x="110" y="286" width="62" height="55" class="key"/>
215
+ <text x="141" y="302" class="kl">Z</text>
216
+ <text x="141" y="320" class="up">Zip</text>
217
+ <text x="141" y="333" class="lo">unzip</text>
218
+
219
+ <rect x="176" y="286" width="62" height="55" class="key"/>
220
+ <text x="207" y="302" class="kl">X</text>
221
+ <text x="207" y="320" class="up">Compare</text>
222
+ <text x="207" y="333" class="lo">open force</text>
223
+
224
+ <rect x="242" y="286" width="62" height="55" class="key"/>
225
+ <text x="273" y="302" class="kl">C</text>
226
+ <text x="273" y="320" class="up">Config</text>
227
+ <text x="273" y="333" class="lo">rename</text>
228
+
229
+ <rect x="308" y="286" width="62" height="55" class="key"/>
230
+ <text x="339" y="302" class="kl">V</text>
231
+ <text x="339" y="320" class="up">Plugins</text>
232
+ <text x="339" y="333" class="lo">version</text>
233
+
234
+ <rect x="374" y="286" width="62" height="55" class="key"/>
235
+ <text x="405" y="302" class="kl">B</text>
236
+ <text x="405" y="320" class="up">Border</text>
237
+ <text x="405" y="333" class="lo">syntax hl</text>
238
+
239
+ <rect x="440" y="286" width="62" height="55" class="key"/>
240
+ <text x="471" y="302" class="kl">N</text>
241
+ <text x="471" y="320" class="up">Srch prev</text>
242
+ <text x="471" y="333" class="lo">srch next</text>
243
+
244
+ <rect x="506" y="286" width="62" height="55" class="key"/>
245
+ <text x="537" y="302" class="kl">M</text>
246
+ <text x="537" y="320" class="up">Show mrks</text>
247
+ <text x="537" y="333" class="lo">set mark</text>
248
+
249
+ <rect x="572" y="286" width="62" height="55" class="key"/>
250
+ <text x="603" y="315" class="kl">, &lt;</text>
251
+
252
+ <rect x="638" y="286" width="62" height="55" class="key"/>
253
+ <text x="669" y="302" class="kl">. &gt;</text>
254
+ <text x="669" y="333" class="sp">&gt; follow lnk</text>
255
+
256
+ <rect x="704" y="286" width="62" height="55" class="key"/>
257
+ <text x="735" y="302" class="kl">/ ?</text>
258
+ <text x="735" y="320" class="sp">? help</text>
259
+ <text x="735" y="333" class="sp">/ search</text>
260
+
261
+ <rect x="770" y="286" width="170" height="55" class="kw"/>
262
+ <text x="855" y="318" class="nv">Shift</text>
263
+
264
+ <!-- Row 5: Bottom -->
265
+ <rect x="10" y="349" width="70" height="50" class="kw"/>
266
+ <text x="45" y="378" class="nv">Ctrl</text>
267
+
268
+ <rect x="84" y="349" width="58" height="50" class="kw"/>
269
+ <text x="113" y="378" class="nv">Alt</text>
270
+
271
+ <rect x="146" y="349" width="330" height="50" class="key"/>
272
+ <text x="311" y="378" class="nv">Space</text>
273
+
274
+ <rect x="480" y="349" width="62" height="50" class="key"/>
275
+ <text x="511" y="366" class="kl"># @</text>
276
+ <text x="511" y="382" class="sp"># locate</text>
277
+ <text x="511" y="394" class="sp">@ ruby dbg</text>
278
+
279
+ <!-- Nav cluster -->
280
+ <rect x="990" y="97" width="64" height="55" class="key"/>
281
+ <text x="1022" y="120" class="nv">Home</text>
282
+ <text x="1022" y="143" class="nv">g first</text>
283
+
284
+ <rect x="1058" y="97" width="64" height="55" class="key"/>
285
+ <text x="1090" y="120" class="nv">End</text>
286
+ <text x="1090" y="143" class="nv">G last</text>
287
+
288
+ <rect x="990" y="160" width="64" height="55" class="key"/>
289
+ <text x="1022" y="183" class="nv">PgUp</text>
290
+ <text x="1022" y="206" class="nv">page up</text>
291
+
292
+ <rect x="1058" y="160" width="64" height="55" class="key"/>
293
+ <text x="1090" y="183" class="nv">PgDn</text>
294
+ <text x="1090" y="206" class="nv">page dn</text>
295
+
296
+ <rect x="1022" y="286" width="60" height="55" class="key"/>
297
+ <text x="1052" y="310" class="nv">UP</text>
298
+ <text x="1052" y="333" class="nv">k</text>
299
+
300
+ <rect x="958" y="349" width="60" height="50" class="key"/>
301
+ <text x="988" y="370" class="nv">LEFT</text>
302
+ <text x="988" y="390" class="nv">h</text>
303
+
304
+ <rect x="1022" y="349" width="60" height="50" class="key"/>
305
+ <text x="1052" y="370" class="nv">DOWN</text>
306
+ <text x="1052" y="390" class="nv">j</text>
307
+
308
+ <rect x="1086" y="349" width="60" height="50" class="key"/>
309
+ <text x="1116" y="370" class="nv">RIGHT</text>
310
+ <text x="1116" y="390" class="nv">l/enter</text>
311
+
312
+ <!-- Right panel: Ctrl combos -->
313
+ <rect x="1180" y="34" width="300" height="340" rx="6" fill="#1a2a1a" stroke="#4a6a4a" stroke-width="1"/>
314
+ <text x="1330" y="56" text-anchor="middle" font-size="13" font-weight="bold" fill="#88FF88">Ctrl Combos</text>
315
+ <text x="1194" y="80" class="ct">C-A AI chat mode</text>
316
+ <text x="1194" y="100" class="ct">C-D Toggle trash view</text>
317
+ <text x="1194" y="120" class="ct">C-E Browse remote</text>
318
+ <text x="1194" y="140" class="ct">C-F Clear filter</text>
319
+ <text x="1194" y="160" class="ct">C-L fzf jump</text>
320
+ <text x="1194" y="180" class="ct">C-N Navi cheatsheet</text>
321
+ <text x="1194" y="200" class="ct">C-O Change ownership</text>
322
+ <text x="1194" y="220" class="ct">C-P Change permissions</text>
323
+ <text x="1194" y="240" class="ct">C-R Recent files</text>
324
+ <text x="1194" y="260" class="ct">C-T Tag by pattern</text>
325
+ <text x="1194" y="280" class="ct">C-Y Copy pane to clipboard</text>
326
+ <text x="1194" y="300" class="ct">C-; SSH history</text>
327
+ <text x="1194" y="328" class="ct">C-Arrows Move/copy items</text>
328
+ <text x="1194" y="348" class="ct">S-Arrows Scroll right pane</text>
329
+ <text x="1194" y="368" class="ct">S-Tab Page up right pane</text>
330
+
331
+ <!-- Legend -->
332
+ <rect x="20" y="470" width="14" height="14" fill="#442222" rx="2" stroke="#663333" stroke-width="0.5"/>
333
+ <text x="40" y="482" font-size="10" fill="#FF8888">lowercase</text>
334
+ <rect x="120" y="470" width="14" height="14" fill="#222244" rx="2" stroke="#333366" stroke-width="0.5"/>
335
+ <text x="140" y="482" font-size="10" fill="#88BBFF">UPPERCASE</text>
336
+ <rect x="240" y="470" width="14" height="14" fill="#224422" rx="2" stroke="#336633" stroke-width="0.5"/>
337
+ <text x="260" y="482" font-size="10" fill="#88FF88">Ctrl+key</text>
338
+ <rect x="350" y="470" width="14" height="14" fill="#332244" rx="2" stroke="#553366" stroke-width="0.5"/>
339
+ <text x="370" y="482" font-size="10" fill="#DDAAFF">special</text>
340
+ <text x="460" y="482" font-size="10" fill="#bbb">gray = navigation</text>
341
+ </svg>
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.2.2
4
+ version: 8.2.4
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-21 00:00:00.000000000 Z
11
+ date: 2026-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rcurses
@@ -97,7 +97,7 @@ files:
97
97
  - examples/rtfm.conf
98
98
  - examples/settings.rb
99
99
  - img/logo.png
100
- - img/rtfm-kb.png
100
+ - img/rtfm-kb.svg
101
101
  - man/rtfm.1
102
102
  homepage: https://isene.com/
103
103
  licenses:
data/img/rtfm-kb.png DELETED
Binary file