rtfm-filemanager 2.7 → 3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -10
  3. data/bin/rtfm +176 -112
  4. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2aa222a4668d6751af768b71fb4041d9a8f2c07b9546c2c6a85a3599fd99f9b5
4
- data.tar.gz: bac0932190b194982ea98da8f20919b101a2e0be293a8bbc1e8ec77fbc67bb5d
3
+ metadata.gz: a7cea9d99cea882fb8663b99cdb2689a95a2376308c39c6d62c005b6a6240e52
4
+ data.tar.gz: 8570c3db9008c37525e859f62e98a272b406888dd5293a69b4458176ea6630a0
5
5
  SHA512:
6
- metadata.gz: '0048f6b34b0cadef7d539330ea23f45b782e2718b843b46f648c4d3f00dc67fd73561b2a55fd494b9a5af50e873afb0b8f9234bb4b663be325b812208736d137'
7
- data.tar.gz: e8c03a48d9b6b17bd248b377ce7f82f2d783989fa412e3aacdf803c1561e347855c3a4072a75ea63f966ba43be30efb952b51ef966e533a65193953718d1944c
6
+ metadata.gz: 4dd36ec43b4cdca08be792f1d21b0993dea346cba4b3b75517fd42841babc3df45365a55daadf09056711da959c032d83b143c3c307f0cc6bce99e09b931c6f1
7
+ data.tar.gz: 88d4ed18d8cb7e55ad69e63017c15c594721db2fdc1e0d0e4c12ca7ad56da047a848004ef91482d3da7827e1b51563cdbc9bce670befeaf249a1585fe80161fd
data/README.md CHANGED
@@ -179,12 +179,18 @@ Key | Description
179
179
  m | Mark current dir (persistent). Next letter is the name of the mark [a-zA-Z'] The special mark "'" jumps to the last directory (makes toggling dirs easy) Press '-' and a letter to delete that mark
180
180
  M | Show marked items in right pane
181
181
  ' | Jump to mark (next letter is the name of the mark [a-zA-Z']). The 5 latest directories visited are stored in marks 1-5 (1 being the very latest)
182
+ ~ | Jump to Home directory
183
+ \> | Follow symlink to the directory where the target resides
184
+
185
+ ### Searching
186
+
187
+ Key | Description
188
+ -------|------------------------------------------------------------------
182
189
  / | Enter search string in bottom window to highlight matching items and jump to the first match
183
190
  \\ | Remove search pattern
184
191
  n | Jump to the next item matched by '/'
185
192
  N | Jump to the previous item matched by '/'
186
- ~ | Jump to Home directory
187
- \> | Follow symlink to the directory where the target resides
193
+ g | Run 'grep' to show files that contains the MATCH in current directory
188
194
  L | Start 'locate' search for files, then use '#' to jump to desired line/directory
189
195
  Ctrl-l | Locate files via fzf from the current directory down (fuzzy file finder must be installed https://github.com/junegunn/fzf)
190
196
 
@@ -206,6 +212,8 @@ P | PUT (move) tagged items here
206
212
  s | Create symlink to tagged items here
207
213
  d | Delete selected item and tagged items. Press 'y' to confirm
208
214
  c | Change/rename selected (adds command to bottom window)
215
+ Ctrl-o | Change ownership to user:group of selected and tagged items
216
+ Ctrl-p | Change permissions of selected and tagged items. Format = rwxr-xr-x or 755 or rwx (applies the trio to user, group and others)
209
217
  z | Extract tagged zipped archive to current directory
210
218
  Z | Create zipped archive from tagged files/directories
211
219
 
@@ -240,7 +248,6 @@ Key | Description
240
248
  -------|------------------------------------------------------------------
241
249
  f | Show only files in the left pane matching extension(s) (e.g. "txt" or "pdf,png,jpg")
242
250
  F | Show only files matching a pattern (Ruby Regex) (e.g. "abc" or "ab.+12(\w3)*")
243
- g | Run 'grep' to show files that contains the MATCH in current directory
244
251
  B | Toggle border
245
252
  : | Enter "command mode" in bottom window (press ENTER to execute, press Ctrl-G to escape)
246
253
  ; | Show command history in right pane
@@ -312,15 +319,15 @@ that session.
312
319
  The top line shows information about the currently item in the left pane. When
313
320
  you are at a file, the information is pretty self explanatory:
314
321
 
315
- `Path: /home/geir/RTFM/README.md (-rw-rw-r-- 6,0K)`
322
+ `Path: /home/geir/RTFM/README.md (-rw-r--r-- geir:geir 2023-04-25 11:49 16K)`
316
323
 
317
- This shows the full path of the selected file as well as the permissions and
318
- the size of the file. When you are at a directory in the left pane, you get
319
- two numbers in brackets. The first number is the number of regular dirs/files
320
- in that directory. The second shows the total number of entries, including the
321
- hidden directories and files:
324
+ This shows the full path of the selected file as well as the permissions,
325
+ ownership, timestamp and the size of the file. When you are at a directory in
326
+ the left pane, you get two numbers in brackets. The first number is the number
327
+ of regular dirs/files in that directory. The second shows the total number of
328
+ entries, including the hidden directories and files:
322
329
 
323
- `Path: /home/geir/RTFM (drwxrwxr-x 4,0K) [4 8]`
330
+ `Path: /home/geir/RTFM (drwxr-xr-x geir:geir 2023-04-29 01:55 4,0) [4 8]`
324
331
 
325
332
  Different file types may have extra self explanatory information included in
326
333
  square brackets at the end of the top info line. Image files will have the
data/bin/rtfm CHANGED
@@ -47,12 +47,15 @@ JUMPING AND MARKS
47
47
  M = Show marked items in right pane
48
48
  ' = Jump to mark (next letter is the name of the mark [a-zA-Z'])
49
49
  The 5 latest directories visited are stored in marks 1-5 (1 being the very latest)
50
+ ~ = Jump to Home directory
51
+ > = Follow symlink to the directory where the target resides
52
+
53
+ SEARCHING
50
54
  / = Enter search string in bottom window to highlight matching items and jump to the first match
51
- \ = Remove search pattern
55
+ \\ = Remove search pattern
52
56
  n = Jump to the next item matched by '/'
53
57
  N = Jump to the previous item matched by '/'
54
- ~ = Jump to Home directory
55
- > = Follow symlink to the directory where the target resides
58
+ g = Run 'grep' to show files that contains the MATCH in current directory
56
59
  L = Start 'locate' search for files, then use '#' to jump to desired line/directory
57
60
  Ctrl-l = Locate files via fzf from the current directory down
58
61
  (fuzzy file finder must be installed https://github.com/junegunn/fzf)
@@ -69,6 +72,9 @@ MANIPULATE ITEMS
69
72
  s = Create symlink to tagged items here
70
73
  d = Delete selected item and tagged items. Press 'y' to confirm
71
74
  c = Change/rename selected (adds command to bottom window)
75
+ Ctrl-o = Change ownership to user:group of selected and tagged items
76
+ Ctrl-p = Change permissions of selected and tagged items
77
+ Format = rwxr-xr-x or 755 or rwx (applies the trio to user, group and others)
72
78
  z = Extract tagged zipped archive to current directory
73
79
  Z = Create zipped archive from tagged files/directories
74
80
 
@@ -89,7 +95,7 @@ RIGHT PANE
89
95
  ENTER = Refresh the right pane
90
96
  TAB = Next page of the preview (if doc long and ∇ in the bottom right)
91
97
  S-TAB = Previous page (if you have moved down the document first - ∆ in the top right)
92
- w = Change the width of the left/right panes (left pane ⇒ ¼ ⅕ ⇒ ⅙ ⇒ ½ ⇒ ⅓)
98
+ w = Change the width of the left/right panes (left pane ⇒ 20%, 30%, 40%, 50%, 60%)
93
99
  - = (Minus sign) Toggle preview in right pane (turn it off for faster traversing of directories)
94
100
  _ = (Underscore) Toggle preview of images in right pane
95
101
  b = Toggle syntax highlighting (and line numbering)
@@ -97,7 +103,6 @@ RIGHT PANE
97
103
  ADDITIONAL COMMANDS
98
104
  f = Show only files in the left pane matching extension(s) (e.g. "txt" or "pdf,png,jpg")
99
105
  F = Show only files matching a pattern (Ruby Regex) (e.g. "abc" or "ab.+12(\w3)*")
100
- g = Run 'grep' to show files that contains the MATCH in current directory
101
106
  B = Toggle border
102
107
  : = Enter "command mode" in bottom window (press ENTER to execute, press Ctrl-G to escape)
103
108
  ; = Show command history in right pane
@@ -156,7 +161,6 @@ begin # BASIC SETUP
156
161
  @showimage = false unless (cmd?('xwininfo') and cmd?('xdotool'))
157
162
 
158
163
  cmd?('bat') ? @bat = "bat" : @bat = "batcat"
159
- @batuse = true
160
164
 
161
165
  STDIN.set_encoding(Encoding::UTF_8) # Set encoding for STDIN
162
166
  LScolors = `echo $LS_COLORS` # Import LS_COLORS
@@ -177,11 +181,12 @@ begin # BASIC SETUP
177
181
  @lsorder = "" # Change the order/sorting by pressing 'o' (circular toggle)
178
182
  @lsinvert = "" # Set to "-r" to reverse/invert sorting order
179
183
  @lsuser = "" # Set this variable in .rtfm.conf to any 'ls' switch you want to customize directory listings
180
- @width = 3 # Set width of the left pane to the default ⅓ of the terminal width
184
+ @width = 4 # Set width of the left pane to the default ⅓ of the terminal width
181
185
  @history = [] # Initialize the command line history array
182
186
  @border = false
183
187
  @preview = true
184
188
  @runmailcap = false # Set to 'true' in .rtfm.conf if you want to use run-mailcap instead of xdg-open
189
+ @batuse = true # Use batcat for syntax highlighting
185
190
  ## These are automatically written on exit
186
191
  @marks = {} # Initialize (book)marks hash
187
192
  @hash = {} # Initialize the sha directory hashing
@@ -193,6 +198,7 @@ begin # BASIC SETUP
193
198
  @lsmatch = "" # Files to match (initially set to matching all files) - not saved on exit
194
199
  @index = 0 # Set chosen item to first on startup
195
200
  @cont = ""
201
+ @tagsize = 0
196
202
  @navi = ""
197
203
  @marks["'"] = Dir.pwd
198
204
  ## File type recognizers
@@ -312,6 +318,8 @@ def getchr # PROCESS KEY PRESSES
312
318
  when "" then chr = "C-G"
313
319
  when " " then chr = "C-L"
314
320
  when "" then chr = "C-N"
321
+ when "" then chr = "C-O"
322
+ when "" then chr = "C-P"
315
323
  when "" then chr = "C-T"
316
324
  when "" then chr = "C-Y"
317
325
  when "\r" then chr = "ENTER"
@@ -456,6 +464,37 @@ def main_getkey # GET KEY FROM USER
456
464
  end
457
465
  end
458
466
  @w_b.update = true
467
+ # SEARCHING
468
+ when '/' # Get search string to mark items that match the input
469
+ @w_b.nohistory = true
470
+ @searched = w_b_getstr("/ ", "")
471
+ l = `ls 2>/dev/null #{@lsbase} #{@lsall} #{@lsorder} #{@lsinvert} #{@lsuser}`.split
472
+ m = l.each_index.select{|n| l[n] =~ /#{@searched}/}
473
+ @index = m[0] unless m == []
474
+ @index = 0 if @searched == ""
475
+ @w_r.update = true
476
+ when '\\' # Clear search string
477
+ @searched = ""
478
+ when 'n' # Jump to next occurence of search (after '/')
479
+ l = `ls 2>/dev/null #{@lsbase} #{@lsall} #{@lsorder} #{@lsinvert} #{@lsuser}`.split
480
+ m = l.each_index.select{|n| l[n] =~ /#{@searched}/}
481
+ i = m.find { |n| n > @index }
482
+ if i == nil
483
+ @index = m.first
484
+ else
485
+ @index = i
486
+ end
487
+ @w_r.update = true
488
+ when 'N' # Jump to previous occurence of search (after '/')
489
+ l = `ls 2>/dev/null #{@lsbase} #{@lsall} #{@lsorder} #{@lsinvert} #{@lsuser}`.split
490
+ m = l.each_index.select{|n| l[n] =~ /#{@searched}/}.reverse
491
+ i = m.find { |n| n < @index }
492
+ if i == nil
493
+ @index = m.first
494
+ else
495
+ @index = i
496
+ end
497
+ @w_r.update = true
459
498
  when 'g' # Run 'grep' in the current directory
460
499
  cmd = w_b_getstr(": ", "grep -s MATCH *")
461
500
  w_b_exec(cmd)
@@ -479,13 +518,27 @@ def main_getkey # GET KEY FROM USER
479
518
  @w_r.pager = 0
480
519
  end
481
520
  @w_b.update = true
521
+ when 'C-L' # fzf integration (https://github.com/junegunn/fzf)
522
+ begin
523
+ jump = `fzf`.chomp
524
+ rescue
525
+ w_b_info(" fzf not installed - see https://github.com/junegunn/fzf")
526
+ end
527
+ jumpdir = File.dirname(jump)
528
+ @searched = File.basename(jump)
529
+ @directory[Dir.pwd] = @selected # Store this directory before leaving
530
+ mark_latest
531
+ Dir.chdir(jumpdir)
532
+ @break = true
482
533
  # TAGGING
483
534
  when 't' # Add item to tagged list
484
535
  item = "\"#{Dir.pwd}/#{@selected}\""
485
536
  if @tagged.include?(item)
486
537
  @tagged.delete(item)
538
+ @tagsize -= File.size(item[1...-1])
487
539
  else
488
540
  @tagged.push(item)
541
+ @tagsize += File.size(item[1...-1])
489
542
  end
490
543
  @index += 1
491
544
  @w_r.update = true
@@ -548,6 +601,55 @@ def main_getkey # GET KEY FROM USER
548
601
  w_b_info(err.to_s)
549
602
  end
550
603
  @w_r.update = true
604
+ when 'C-O' # Change ownerships
605
+ require 'etc'
606
+ gnm = Etc.getgrgid(File.stat(@selected).gid).name
607
+ unm = Etc.getpwuid(File.stat(@selected).uid).name
608
+ p = "Change ownership of selected"
609
+ p += " and tagged" unless @tagged.empty?
610
+ p += ". Selected ownership (user:group) = "
611
+ own = w_b_getstr(p, "#{unm}:#{gnm}").split(":")
612
+ gnm, unm = own[0], own[1]
613
+ begin
614
+ gid = Etc.getgrnam(gnm).gid.to_i
615
+ uid = Etc.getpwnam(unm).uid.to_i
616
+ File.chown(uid, gid, @selected)
617
+ @tagged.each {|t| File.chown(uid, gid, t[1...-1])} unless @tagged.empty?
618
+ w_b_info("Ownership changed to #{gnm}:#{unm}")
619
+ rescue StandardError => err
620
+ w_b_info(err.to_s)
621
+ end
622
+ when 'C-P' # Change permissions
623
+ mode = @fspes[@index][1..9]
624
+ p = "Change permissions of selected"
625
+ p += " and tagged" unless @tagged.empty?
626
+ p += ". Selected permissions = "
627
+ mode = w_b_getstr(p, mode)
628
+ mode = mode * 3 if mode.length == 3 and mode.to_i == 0
629
+ if mode.length == 9 and mode.to_i == 0
630
+ x = 0
631
+ x += 400 if mode[0] == "r"
632
+ x += 200 if mode[1] == "w"
633
+ x += 100 if mode[2] == "x"
634
+ x += 40 if mode[3] == "r"
635
+ x += 20 if mode[4] == "w"
636
+ x += 10 if mode[5] == "x"
637
+ x += 4 if mode[6] == "r"
638
+ x += 2 if mode[7] == "w"
639
+ x += 1 if mode[8] == "x"
640
+ mode = x
641
+ end
642
+ if mode.to_s.length == 3 and mode.to_i != 0
643
+ mode = mode.to_s.to_i(8)
644
+ begin
645
+ File.chmod(mode, @selected)
646
+ @tagged.each {|t| File.chmod(mode, t[1...-1])} unless @tagged.empty?
647
+ rescue StandardError => err
648
+ w_b_info(err.to_s)
649
+ end
650
+ else
651
+ w_b_info("Not a valid permissions mode. Nothing changed.")
652
+ end
551
653
  when 'z' # Unzip selected archive file
552
654
  cmd = w_b_getstr("Command = ", "tar xfz #{@tagged.first}")
553
655
  begin
@@ -635,45 +737,6 @@ def main_getkey # GET KEY FROM USER
635
737
  end
636
738
  @w_r.update = true
637
739
  @w_b.update = false
638
- when 'S' # Show comprehensive system info
639
- begin
640
- @w_r.clr
641
- @w_r.pager_cmd = ""
642
- uname = `uname -o`.chomp + " "
643
- uname += `uname -r`.chomp + " "
644
- uname += `uname -v`.chomp + " "
645
- uname += `uname -p`.chomp + " "
646
- uname += `awk -F '"' '/PRETTY/ {print $2}' /etc/os-release` + "\n"
647
- text = [[253, 1, uname]]
648
- system = "Shell & Terminal: " + `echo $SHELL`.sub(/.*\//, '').chomp + ", " + `echo $TERM`.chomp + " "
649
- packages = `pacman -Q 2>/dev/null | wc -l`.chomp
650
- packages = `dpkg-query -l 2>/dev/null | grep -c '^.i'`.chomp if packages == "0"
651
- packages = "Unrecognized" if packages == "0"
652
- system += "Packages: " + packages + "\n"
653
- system += "Desktop: " + `awk '/^DesktopNames/' /usr/share/xsessions/* | sed 's/DesktopNames=//g' | \\
654
- sed 's/\\;/\\n/g' | sed '/^$/d' | sort -u | sed ':a;N;$!ba;s/\\n/, /g'`.chomp + "/"
655
- system += `grep 'gtk-theme-name' ~/.config/gtk-3.0/* | sed 's/gtk-theme-name=//g' | \\
656
- sed 's/-/ /g'`.sub(/.*:/, '') + "\n"
657
- text += [[251, 0, system]]
658
- cpu = "CPUs = " + `nproc`.chop + " "
659
- cpuinfo = `lscpu`
660
- cpu += cpuinfo[/^.*Model name:\s*(.*)/, 1] + " "
661
- cpu += "Max: " + cpuinfo[/^.*CPU max MHz:\s*(.*)/, 1][/(.*),.*/, 1] + "MHz "
662
- cpu += "Min: " + cpuinfo[/^.*CPU min MHz:\s*(.*)/, 1][/(.*),.*/, 1] + "MHz\n\n"
663
- text += [[154, 0, cpu]]
664
- mem = `free -h` + "\n"
665
- text += [[229, 0, mem]]
666
- ps = `ps -eo comm,pid,user,pcpu,pmem,stat --sort -pcpu,-pmem | head` + "\n"
667
- text += [[195, 0, ps]]
668
- disk = `df -H | head -8`
669
- text += [[172, 0, disk]]
670
- dmesg = "\nDMESG (latest first):\n"
671
- dmesg += `dmesg | tail -6`.split("\n").sort.reverse.join("\n")
672
- text += [[219, 0, dmesg]]
673
- w_r_info(ansifix(text))
674
- rescue
675
- w_r_info("Unable to show system info")
676
- end
677
740
  when 'I' # OpenAI integration
678
741
  if @ai
679
742
  openai
@@ -705,10 +768,8 @@ def main_getkey # GET KEY FROM USER
705
768
  @width += 1
706
769
  @width = 2 if @width == 7
707
770
  @break = true
771
+ @w_r.update = true
708
772
  @w_b.update = true
709
- when 'B' # Toggle borders
710
- @border = !@border
711
- @break = true
712
773
  when '-' # Toggle content view in right pane
713
774
  @preview = !@preview
714
775
  @preview ? p = "On" : p = "Off"
@@ -721,7 +782,7 @@ def main_getkey # GET KEY FROM USER
721
782
  w_b_info("Image preview = " + i)
722
783
  getch
723
784
  @break = true
724
- when 'b'
785
+ when 'b' # Toggle syntax highlighting (via bat/batcat)
725
786
  @batuse = !@batuse
726
787
  @break = true
727
788
  # ADDITIONAL COMMANDS
@@ -734,55 +795,9 @@ def main_getkey # GET KEY FROM USER
734
795
  when 'F' # Filter out files not matching @lsmatch
735
796
  @lsmatch = w_b_getstr("Files will match RegEx: ", @lsmatch)
736
797
  w_b_info(nil)
737
- when 'C-L' # fzf integration (https://github.com/junegunn/fzf)
738
- begin
739
- jump = `fzf`.chomp
740
- rescue
741
- w_b_info(" fzf not installed - see https://github.com/junegunn/fzf")
742
- end
743
- jumpdir = File.dirname(jump)
744
- @searched = File.basename(jump)
745
- @directory[Dir.pwd] = @selected # Store this directory before leaving
746
- mark_latest
747
- Dir.chdir(jumpdir)
748
- @break = true
749
- when 'C-N' # navi integration (https://github.com/denisidoro/navi)
750
- begin
751
- @navi = `navi`
752
- rescue
753
- w_b_info(" navi not installed - see https://github.com/denisidoro/navi")
754
- end
798
+ when 'B' # Toggle borders
799
+ @border = !@border
755
800
  @break = true
756
- when '/' # Get search string to mark items that match the input
757
- @w_b.nohistory = true
758
- @searched = w_b_getstr("/ ", "")
759
- l = `ls 2>/dev/null #{@lsbase} #{@lsall} #{@lsorder} #{@lsinvert} #{@lsuser}`.split
760
- m = l.each_index.select{|n| l[n] =~ /#{@searched}/}
761
- @index = m[0] unless m == []
762
- @index = 0 if @searched == ""
763
- @w_r.update = true
764
- when '\\'
765
- @searched = ""
766
- when 'n' # Jump to next occurence of search (after '/')
767
- l = `ls 2>/dev/null #{@lsbase} #{@lsall} #{@lsorder} #{@lsinvert} #{@lsuser}`.split
768
- m = l.each_index.select{|n| l[n] =~ /#{@searched}/}
769
- i = m.find { |n| n > @index }
770
- if i == nil
771
- @index = m.first
772
- else
773
- @index = i
774
- end
775
- @w_r.update = true
776
- when 'N' # Jump to previous occurence of search (after '/')
777
- l = `ls 2>/dev/null #{@lsbase} #{@lsall} #{@lsorder} #{@lsinvert} #{@lsuser}`.split
778
- m = l.each_index.select{|n| l[n] =~ /#{@searched}/}.reverse
779
- i = m.find { |n| n < @index }
780
- if i == nil
781
- @index = m.first
782
- else
783
- @index = i
784
- end
785
- @w_r.update = true
786
801
  when ':' # Enter "command mode" in the bottom window - tries to execute the given command
787
802
  @w_r.nohistory = false
788
803
  cmd = w_b_getstr(": ", "")
@@ -817,8 +832,17 @@ def main_getkey # GET KEY FROM USER
817
832
  @cont = @cont [1...-1]
818
833
  w_b_info(" Right pane copied to clipboard")
819
834
  system("echo -n '#{@cont}' | #{clip}")
835
+ when 'S' # Show comprehensive system info
836
+ sysinfo
837
+ when 'C-N' # navi integration (https://github.com/denisidoro/navi)
838
+ begin
839
+ @navi = `navi`
840
+ rescue
841
+ w_b_info(" navi not installed - see https://github.com/denisidoro/navi")
842
+ end
843
+ @break = true
820
844
  when '@' # Enter "Ruby debug"
821
- @w_b.nohistory = true
845
+ @w_b.nohistory = false
822
846
  cmd = w_b_getstr("◆ ", "")
823
847
  @w_b.clr
824
848
  @w_b.refresh
@@ -900,7 +924,7 @@ def get_files(win) # The core of the directory listings
900
924
  ls_cmd += @selected_safe if win == "right"
901
925
  @files = `#{ls_cmd}`.split("\n")
902
926
  ls_cmd += " -H " if win == "right"
903
- ls_cmd += %q[ -lhgG --time-style="long-iso" | awk '{printf "%s%12s%6s%6s%5s", $1,$4,$5,$3,$2 "\n"}']
927
+ ls_cmd += %q[ -lh --time-style="long-iso" | awk '{printf "%s%s%s%11s%6s%6s", $1, " " $3, ":" $4,$6,$7,$5"\n"}']
904
928
  @fspes = `#{ls_cmd}`.split("\n").drop(1)
905
929
  if @lsfiles != "" or @lsmatch != ""
906
930
  lsf = @lsfiles.split(",").map! {|e| e.strip}
@@ -1180,9 +1204,9 @@ def w_r_doc # GET FULL CONTENT TO PAGE
1180
1204
  end
1181
1205
  def w_r_info(info) # SHOW INFO IN THE RIGHT WINDOW
1182
1206
  image_show("clear") if @image; @image = false
1183
- #@w_r.clr
1184
- #@w_r.refresh
1185
- w_r_width = Curses.cols - (Curses.cols/@width) - 2
1207
+ @w_r.clr
1208
+ @w_r.refresh
1209
+ w_r_width = Curses.cols - (Curses.cols * @width / 10) - 2
1186
1210
  info.gsub!(/(.{1,#{w_r_width}})( +|$\n?)|(.{1,#{w_r_width}})/, "\\1\\3\n")
1187
1211
  @w_r.text = info
1188
1212
  @w_r.pager_cmd = ""
@@ -1217,9 +1241,9 @@ def image_show(image)# SHOW THE SELECTED IMAGE IN THE RIGHT WINDOW
1217
1241
  term_h = terminfo.match(/Height: (\d+)/)[1].to_i
1218
1242
  char_w = term_w / Curses.cols
1219
1243
  char_h = term_h / Curses.lines
1220
- img_x = char_w * (Curses.cols/@width + 1)
1244
+ img_x = char_w * (Curses.cols * @width / 10 + 1)
1221
1245
  img_y = char_h * 2
1222
- img_max_w = char_w * (Curses.cols - Curses.cols/@width - 2)
1246
+ img_max_w = char_w * (Curses.cols - Curses.cols * @width / 10 - 2)
1223
1247
  img_max_h = char_h * (Curses.lines - 4)
1224
1248
  if image == "clear"
1225
1249
  `clear`
@@ -1321,17 +1345,57 @@ def openai # INTERFACE TO OPENAI
1321
1345
  @w_r.fg = 229
1322
1346
  w_r_info(text)
1323
1347
  end
1324
-
1348
+ def sysinfo
1349
+ begin
1350
+ @w_r.clr
1351
+ @w_r.pager_cmd = ""
1352
+ uname = `uname -o`.chomp + " "
1353
+ uname += `uname -r`.chomp + " "
1354
+ uname += `uname -v`.chomp + " "
1355
+ uname += `uname -p`.chomp + " "
1356
+ uname += `awk -F '"' '/PRETTY/ {print $2}' /etc/os-release` + "\n"
1357
+ text = [[253, 1, uname]]
1358
+ system = "Shell & Terminal: " + `echo $SHELL`.sub(/.*\//, '').chomp + ", " + `echo $TERM`.chomp + " "
1359
+ packages = `pacman -Q 2>/dev/null | wc -l`.chomp
1360
+ packages = `dpkg-query -l 2>/dev/null | grep -c '^.i'`.chomp if packages == "0"
1361
+ packages = "Unrecognized" if packages == "0"
1362
+ system += "Packages: " + packages + "\n"
1363
+ system += "Desktop: " + `awk '/^DesktopNames/' /usr/share/xsessions/* | sed 's/DesktopNames=//g' | \\
1364
+ sed 's/\\;/\\n/g' | sed '/^$/d' | sort -u | sed ':a;N;$!ba;s/\\n/, /g'`.chomp + "/"
1365
+ system += `grep 'gtk-theme-name' ~/.config/gtk-3.0/* | sed 's/gtk-theme-name=//g' | \\
1366
+ sed 's/-/ /g'`.sub(/.*:/, '') + "\n"
1367
+ text += [[251, 0, system]]
1368
+ cpu = "CPUs = " + `nproc`.chop + " "
1369
+ cpuinfo = `lscpu`
1370
+ cpu += cpuinfo[/^.*Model name:\s*(.*)/, 1] + " "
1371
+ cpu += "Max: " + cpuinfo[/^.*CPU max MHz:\s*(.*)/, 1][/(.*),.*/, 1] + "MHz "
1372
+ cpu += "Min: " + cpuinfo[/^.*CPU min MHz:\s*(.*)/, 1][/(.*),.*/, 1] + "MHz\n\n"
1373
+ text += [[154, 0, cpu]]
1374
+ mem = `free -h` + "\n"
1375
+ text += [[229, 0, mem]]
1376
+ ps = `ps -eo comm,pid,user,pcpu,pmem,stat --sort -pcpu,-pmem | head` + "\n"
1377
+ text += [[195, 0, ps]]
1378
+ disk = `df -H | head -8`
1379
+ text += [[172, 0, disk]]
1380
+ dmesg = "\nDMESG (latest first):\n"
1381
+ dmesg += `dmesg | tail -6`.split("\n").sort.reverse.join("\n")
1382
+ text += [[219, 0, dmesg]]
1383
+ w_r_info(ansifix(text))
1384
+ rescue
1385
+ w_r_info("Unable to show system info")
1386
+ end
1387
+ end
1325
1388
  # BOTTOM WINDOW FUNCTIONS
1326
1389
  def w_b_info(info) # SHOW INFO IN @W_B
1327
1390
  @w_b.clr
1328
1391
  @w_b.fg, @w_b.bg = 250, 238
1329
1392
  if info == nil
1330
1393
  info = ": for command (use @s for selected item, @t for tagged items) - press ? for help"
1331
- info = "Showing only files matching '#{@lsmatch}'" if @lsmatch != ""
1332
- info = "Showing only file type '#{@lsfiles}'" if @lsfiles != ""
1333
- info = "Showing only file types '#{@lsfiles}'" if @lsfiles =~ /,/
1394
+ info = " Showing only files matching '#{@lsmatch}'" if @lsmatch != ""
1395
+ info = " Showing only file type '#{@lsfiles}'" if @lsfiles != ""
1396
+ info = " Showing only file types '#{@lsfiles}'" if @lsfiles =~ /,/
1334
1397
  info += " and only files matching '#{@lsmatch}'" if @lsfiles != "" and @lsmatch != ""
1398
+ info = " Tagged #{@tagged.size} files (#{(@tagsize.to_f/1000000).round(2)}MB)" unless @tagged.empty?
1335
1399
  @w_b.fg, @w_b.bg = 250, 88 if @lsfiles != ""
1336
1400
  @w_b.fg, @w_b.bg = 250, 21 if @lsmatch != ""
1337
1401
  @w_b.fg, @w_b.bg = 250, 55 if @lsfiles != "" and @lsmatch != ""
@@ -1518,9 +1582,9 @@ loop do # OUTER LOOP - CATCHING REFRESHES VIA 'r'
1518
1582
  # Curses::Window.new(h,w,y,x)
1519
1583
  @w_t = Curses::Window.new(1, 0, 0, 0)
1520
1584
  @w_b = Curses::Window.new(1, 0, maxy - 1, 0)
1521
- @w_l = Curses::Window.new(maxy - 3, (maxx/@width) - 1, 2, 0)
1522
- @w_r = Curses::Window.new(maxy - 4, maxx - (maxx/@width), 2, maxx/@width)
1523
- @w_p = Curses::Window.new(1, maxx - (maxx/@width), maxy - 2, maxx/@width)
1585
+ @w_l = Curses::Window.new(maxy - 3, (maxx * @width / 10) - 1, 2, 0)
1586
+ @w_r = Curses::Window.new(maxy - 4, maxx - (maxx * @width / 10), 2, maxx * @width / 10)
1587
+ @w_p = Curses::Window.new(1, maxx - (maxx * @width / 10), maxy - 2, maxx * @width / 10)
1524
1588
  @w_p.fg, @w_p.bg = 255, 0
1525
1589
  @w_p.refresh
1526
1590
  @w_t.fg, @w_t.bg = 232, 249
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: '2.7'
4
+ version: '3.0'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geir Isene
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-25 00:00:00.000000000 Z
11
+ date: 2023-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -47,8 +47,8 @@ dependencies:
47
47
  description: 'A full featured terminal browser with syntax highlighted files, images
48
48
  shown in the terminal, videos thumbnailed, etc. You can bookmark and jump around
49
49
  easily, delete, rename, copy, symlink and move files. RTFM has a a wide range of
50
- other features. New in 2.7: Added copying of right pane (C-Y) and toggle highlighting
51
- (b)'
50
+ other features. New in 3.0: Added ownership (Ctrl-O) and permissions (Ctrl-P) handling.
51
+ Better width stepping. Code refactoring.'
52
52
  email: g@isene.com
53
53
  executables:
54
54
  - rtfm