cetus 0.1.28 → 0.1.29

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 (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/cetus +387 -247
  3. data/cetus.gemspec +1 -1
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 021f5de97b41df8fb3438258356b924b9101033088180d6315579083793eae4a
4
- data.tar.gz: a1d07c2f93633c2655a004b67dfbcdcc45429135cc7e6d2adc84d514a0331fb0
3
+ metadata.gz: a6bfd0c8210eacca8888f7c6f22e5682feff8c82f3a90d799849d8bb153fd5e9
4
+ data.tar.gz: 3ebbdd0708cd4cc6f75a3a77a2161f443a68d703f2c769ca870ffd37242f839e
5
5
  SHA512:
6
- metadata.gz: d9fff90c5dc1e629e196dfafb880168450878ade3871093ddb908b5deaf3fb72d600f9766be3148318a1bbed35b8b80783ea621738dcb0f5ecf82180504f68bb
7
- data.tar.gz: 4d53ac51c02fa54f5f002db9c54fd8083f406d7c498a66910f8095084880b2d284f1c3f1078aeba5e893dc831eb22d33cf13a4af5b9e2b9a2c62bf4697de0a7c
6
+ metadata.gz: f0425f755732c290eaf51aa0903a6785fef35f54d72b83f2fd281280e5c00064706cad9dd2d598419a1495d9625792a0b3e15dcb7e0edb1fc8c5f07d177fcc2a
7
+ data.tar.gz: 5d9c5f24e835a522adccfc91156469ff148b66013c49ac1c83fc5d41fd00da212500eb2786765593a0585baf4210c9a75f614914b34e1d2faa9ffca5ac7f2613
data/bin/cetus CHANGED
@@ -6,7 +6,7 @@
6
6
  # Author: rkumar http://github.com/rkumar/cetus/
7
7
  # Date: 2013-02-17 - 17:48
8
8
  # License: GPL
9
- # Last update: 2019-03-22 00:12
9
+ # Last update: 2019-03-24 11:58
10
10
  # --------------------------------------------------------------------------- #
11
11
  # cetus.rb Copyright (C) 2012-2019 rahul kumar
12
12
  # == CHANGELOG
@@ -15,7 +15,10 @@
15
15
  # 2019-03-04 - changed quit to q (earlier Q)
16
16
  # 2019-03-04 - first dirs then files
17
17
  # 2019-03-10 - changing selected_files to have fullpath
18
+ # 2019-03-22 - refactoring the code, esp run()
18
19
  # == TODO
20
+ # FIXME how to check that redraw not called twice depending on where
21
+ # a method is called from. a menu or direct from key. e.g help
19
22
  # To dirs add GEMHOME RUBYLIB PYTHONILB or PYTHONPATH,
20
23
  # Make rubygem aware : gemspec or Gemfile the expand lib and bin
21
24
  # fpath if existing
@@ -32,9 +35,7 @@ require 'fileutils'
32
35
  # alias c=~/bin/cetus.rb
33
36
  # c
34
37
 
35
- # 2019-02-20 - added so alt-screen is used
36
- system 'tput smcup'
37
- VERSION = '0.1.28.0'.freeze
38
+ VERSION = '0.1.29.0'.freeze
38
39
  CONFIG_FILE = '~/.config/cetus/conf.yml'.freeze
39
40
 
40
41
  $bindings = {}
@@ -175,7 +176,8 @@ def reset_terminal
175
176
  # '\e[2J': Clear the terminal.
176
177
  # '\e[;r': Set the scroll region to its default value.
177
178
  # Also sets cursor to (0,0).
178
- print "\e[?7h\e[?25h\e[2J\e[;r"
179
+ # '\e[?1049l: Restore main screen buffer.
180
+ print "\e[?7h\e[?25h\e[2J\e[;r\e[?1049l"
179
181
 
180
182
  # Show user input.
181
183
  system 'stty echo'
@@ -185,12 +187,13 @@ end
185
187
  # call AFTER shelling to most or vim
186
188
  def setup_terminal
187
189
  # Setup the terminal for the TUI.
190
+ # '\e[?1049h': Use alternative screen buffer. smcup
188
191
  # '\e[?7l': Disable line wrapping.
189
192
  # '\e[?25l': Hide the cursor.
190
193
  # '\e[2J': Clear the screen.
191
194
  # '\e[1;Nr': Limit scrolling to scrolling area.
192
195
  # Also sets cursor to (0,0).
193
- printf("\e[?7l\e[?25l\e[2J\e[1;%sr", $glines)
196
+ printf("\e[?1049h\e[?7l\e[?25l\e[2J\e[1;%sr", $glines)
194
197
  # earlier glines was grows
195
198
 
196
199
  # Hide echoing of user input
@@ -209,7 +212,7 @@ def readline prompt='>'
209
212
  # hide cursor
210
213
  print "\e[?25l"
211
214
  end
212
- target
215
+ target.chomp
213
216
  end
214
217
 
215
218
  ## get a character from user and return as a string
@@ -331,148 +334,168 @@ $status_color = 4 # status line, can be 2 3 4 5 6
331
334
  # Menubar on top of screen
332
335
  @help = "#{BOLD}?#{BOLD_OFF} Help #{BOLD}`#{BOLD_OFF} Menu #{BOLD}!#{BOLD_OFF} Execute #{BOLD}=#{BOLD_OFF} Toggle #{BOLD}C-x#{BOLD_OFF} File Actions #{BOLD}q#{BOLD_OFF} Quit "
333
336
 
334
- ## main loop which calls all other programs
335
- def run
336
- home = ENV['HOME']
337
- ctr = 0
338
- config_read
339
- $files = `zsh -c 'print -rl -- *(#{$sorto}#{$hidden}M)'`.split("\n")
337
+ # ------------------- read_directory ------------------ #
338
+ def read_directory
339
+ rescan_required false
340
+ # $files = `zsh -c 'print -rl -- *(#{$sorto}#{$hidden}M)'`.split("\n")
341
+ $filterstr ||= 'M'
342
+ $files = `zsh -c 'print -rl -- *(#{$sorto}#{$hidden}#{$filterstr})'`.split("\n")
340
343
  $files = sort_file_list $files
341
344
  enhance_file_list
342
345
  ## added by RK 2014-03-31 - 00:29 since too many duplicates
343
346
  $files = $files.uniq if $enhanced_mode
347
+ end
348
+ # ------------- end of read_directory --------------------------------#
344
349
 
345
- fl = $files.size
346
-
347
- $patt = nil
348
- $sta = 0
349
-
350
- # forever loop that prints dir and takes a key
351
- loop do
352
-
353
- # view consists of all files (filtered by pattern if necessary)
354
- $view = if $patt
355
- if $ignorecase
356
- $files.grep(/#{$patt}/i)
357
- else
358
- $files.grep(/#{$patt}/)
359
- end
350
+ # ------------------- create_viewport ------------------ #
351
+ def create_viewport
352
+ $view = if $patt
353
+ if $ignorecase
354
+ $files.grep(/#{$patt}/i)
360
355
  else
361
- $files
356
+ $files.grep(/#{$patt}/)
362
357
  end
358
+ else
359
+ $files
360
+ end
363
361
 
364
- fl = $view.size
365
- $sta = 0 if $sta >= fl || $sta < 0
366
- # 2019-03-18 - added to ensure cursor not going OOB when next_page
367
- $cursor = 0 if $cursor >= fl || $cursor < 0
368
-
369
- # NOTE if we make cursor zero, then it can be < sta so in the next line
370
- # it will be made equal to sta which we may not want
371
- # $sta = $cursor if $sta > $cursor
372
- $cursor = $sta if $sta > $cursor
373
-
374
- # viewport are the files that are visible, subset of view
375
- $viewport = $view[$sta, $pagesize]
376
- fin = $sta + $viewport.size
377
-
378
- # added 2019-03-20 - actually stact should be reduced not brought to zero
379
- # 2019-03-21 - NOTE this may be redundant since I set to zero in next_page
380
- # due to various edge cases.
381
- # $stact = 0 if $stact >= $viewport.size
382
- if $stact >= $viewport.size
383
- $stact -= $grows while $stact >= $viewport.size
384
- $stact += $grows if $stact < 0
385
- end
362
+ fl = $view.size
363
+ $sta = 0 if $sta >= fl || $sta < 0
364
+ $cursor = 0 if $cursor >= fl || $cursor < 0
386
365
 
387
- $title ||= Dir.pwd.sub(home, '~')
388
- clear_screen
366
+ # NOTE if we make cursor zero, then it can be < sta so in the next line
367
+ # it will be made equal to sta which we may not want
368
+ $cursor = $sta if $sta > $cursor
389
369
 
370
+ # viewport are the files that are visible, subset of view
371
+ $viewport = $view[$sta, $pagesize]
372
+ end
373
+ # ------------- end of create_viewport --------------------------------#
390
374
 
391
- # title
392
- print "#{GREEN}#{@help} #{BLUE}cetus #{VERSION}#{CLEAR}\n"
393
- t = "#{$title} #{$sta + 1} to #{fin} of #{fl} #{$sorto} F:#{$filterstr}"
394
- t = t[t.size - $gcols..-1] if t.size >= $gcols
395
- print "#{BOLD}#{t}#{CLEAR}\n"
375
+ # ------------------- print_title ------------------ #
376
+ def print_title
396
377
 
397
- # add hint and format the line
398
- buff = _format $viewport
378
+ # print help line and version
379
+ print "#{GREEN}#{@help} #{BLUE}cetus #{VERSION}#{CLEAR}\n"
399
380
 
400
- # break into as many columns as required
401
- buff = columnate buff, $grows
381
+ # print 1 of n files, sort order, filter etc details
382
+ $title ||= Dir.pwd.sub(ENV['HOME'], '~')
383
+ fin = $sta + $viewport.size
384
+ fl = $view.size
385
+ t = "#{$title} #{$sta + 1} to #{fin} of #{fl} #{$sorto} F:#{$filterstr}"
402
386
 
403
- # needed the next line to see how much extra we were going in padding
404
- # buff.each {|line| print "#{REVERSE}#{line}#{CLEAR}\n" }
405
- buff.each { |line| print line, "\n" }
406
- print
387
+ # don't exceed columns while printing
388
+ t = t[t.size - $gcols..-1] if t.size >= $gcols
389
+
390
+ print "#{BOLD}#{t}#{CLEAR}\n"
391
+ end
392
+ # ------------- end of print_title --------------------------------#
407
393
 
394
+ # TODO clean this up and simplify it
395
+ def status_line
408
396
  # prompt
409
397
  v_mm = $mode ? "[#{$mode}] " : ''
410
398
  cf = current_file
411
399
  $message = "No file highlighted (#{cf})" if cf and !$highlighted_a_column
412
400
  $message = ' | No matches. Press ESCAPE' if $patt && !cf
413
- # 2019-03-19 - take cursor to last line
414
- system "tput cup #{$glines} 0"
415
401
 
416
- # print a colored line at bottom of screen
417
- # \e[33;41m - set color of status_line
418
- # %*s - set blank spaces for entire line
419
- print "\e[33;4%sm%*s" % [$status_color || '1', $gcols, " "]
402
+ clear_status_line
420
403
 
421
404
  # Print the filename at the right side of the status_line
422
405
  # sometimes due to search, there is no file
423
406
  if cf
424
- cfl = cf.size
425
- # print right aligned
426
- padding = @debug_flag ? 15 : 3
427
- system "tput cup #{$glines} #{$gcols - cfl - padding}"
407
+ # cfl = cf.size
408
+ # print right aligned TODO REFACTOR THIS
409
+ # padding = @debug_flag ? 15 : 3
410
+ # system "tput cup #{$glines} #{$gcols - cfl - padding}"
428
411
  # print "#{REVERSE}#{cf}#{CLEAR}"
429
412
  if @debug_flag
430
- print "#{$sta},#{$cursor},#{$stact},#{$viewport.size},#{$grows} | #{cf}"
413
+ print_on_right "#{$sta},#{$cursor},#{$stact},#{$viewport.size},#{$grows} | #{cf}"
431
414
  else
432
- print "#{cf}"
415
+ print_on_right "#{cf}"
433
416
  end
434
417
  end
435
418
  # print "\r#{v_mm}#{$patt} #{GREEN}#{$message}#{CLEAR} >"
436
419
  # move to beginning of line, reset text mode after printing
437
420
  print "\r#{v_mm}#{$patt}#{$message}\e[m"
438
- ch = get_char
439
- # $highlighted_a_column = false
440
- # puts
441
- # break if ch == "q"
442
- # elsif ch =~ /^[1-9a-zA-Z]$/
443
- # 2019-03-04 - ignore q since that is quit key now
444
- # if ch =~ /^[a-zZ]$/
445
- if ch.match?(/^[a-pr-zZ]$/)
446
- # hint mode
447
- select_hint $viewport, ch
448
- ctr = 0
449
- elsif ch == 'BACKSPACE'
450
- $patt = $patt[0..-2] if $patt && !$patt.empty?
451
- $message = $patt = nil if $patt == ''
452
- ctr = 0
453
- else
454
- # fetch binding for key
455
- x = $bindings[ch]
456
- # remove comment string so only binding is left
457
- x, _ = x.split(':') if x
458
- # split into binding and args
459
- x = x.split if x
460
- if x
461
- binding = x.shift
462
- args = x
463
- send(binding, *args) if binding
464
- else
465
- perror "No binding for #{ch}"
466
- end
467
- # p ch
468
- end
469
- break if $quitting
421
+
422
+ end
423
+
424
+ # should we do a read of the dir
425
+ def rescan?
426
+ $rescan_required
427
+ end
428
+
429
+ def rescan_required flag=true
430
+ $rescan_required = flag
431
+ redraw_required if flag
432
+ end
433
+
434
+ def redraw flag=false
435
+ read_directory if flag
436
+
437
+ draw_directory
438
+ end
439
+
440
+ def draw_directory
441
+ # all this seems to be happening for each keystroke even if
442
+ # not really required. FIXME maybe reduce and call when required
443
+
444
+
445
+ # view consists of all files (filtered by pattern if necessary)
446
+ # viewport is only that subset of view that is displayed on screen
447
+ create_viewport
448
+ clear_screen
449
+ print_title
450
+
451
+ # add hint and format the line
452
+ buff = _format $viewport
453
+
454
+ # break into as many columns as required
455
+ # This is where directories get their blue color
456
+ buff = columnate buff, $grows
457
+
458
+ buff.each { |line| print line, "\n" }
459
+ print
460
+
461
+ status_line
462
+ end
463
+
464
+ def redraw_required(flag=true) $redraw_required = flag; end
465
+
466
+ def resolve_key key
467
+ if key.match?(/^[a-pr-zZ]$/)
468
+ # hint mode
469
+ select_hint $viewport, key
470
+ elsif key == 'BACKSPACE'
471
+ # do we really need this TODO
472
+ $patt = $patt[0..-2] if $patt && !$patt.empty?
473
+ $message = $patt = nil if $patt == ''
474
+ else
475
+ resolve_binding key
470
476
  end
471
- write_curdir
472
- puts 'bye'
473
- config_write if $writing
474
477
  end
475
478
 
479
+ def resolve_binding key
480
+ # fetch binding for key
481
+ x = $bindings[key]
482
+
483
+ # remove comment string so only binding is left
484
+ x, _ = x.split(':') if x
485
+
486
+ # split into binding and args
487
+ x = x.split if x
488
+ if x
489
+ binding = x.shift
490
+ args = x
491
+ send(binding, *args) if binding
492
+ else
493
+ perror "No binding for #{key}"
494
+ end
495
+ end
496
+
497
+
498
+
476
499
  ## write current dir to a file so we can ccd to it when exiting
477
500
  def write_curdir
478
501
  f = File.expand_path('~/.fff_d')
@@ -603,6 +626,9 @@ end
603
626
  # method and this overshadowed that method.
604
627
  # NOTE: this does not do any coloring since the codes may get chopped by
605
628
  # columnate method
629
+ # TODO 2019-03-23 - 23:30 we can do coloring here. columnate must check for color
630
+ # code at start of line, and check size accordingly. If it needs to truncate, then
631
+ # first take off the ANSI codes, truncate and put back.
606
632
  def _format(ary)
607
633
  # buff = Array.new
608
634
  buff = Array.new(ary.size)
@@ -611,15 +637,19 @@ def _format(ary)
611
637
  # determine width based on number of files to show
612
638
  # if less than sz then 1 col and full width
613
639
  #
614
- # ix refers to the index in the complete file list, wherease we only show 60 at a time
640
+ # ix refers to the index in the complete file list, whereas we only
641
+ # show 60 at a time
615
642
  ix = 0
616
643
  ctr = 0
617
644
  ary.each do |f|
645
+ # raise "#{f} != #{ary[ix]}" if f != ary[ix]
618
646
  ## ctr refers to the index in the column
619
647
  ind = get_shortcut(ix)
620
648
  mark = SPACE
649
+ mark = '+' if visited? f
621
650
  cur = SPACE
622
651
  cur = CURMARK if ix + $sta == $cursor
652
+ # NOTE seems like f and ary[ix] are the same
623
653
  mark = GMARK if selected?(ary[ix])
624
654
 
625
655
  if $long_listing
@@ -659,11 +689,11 @@ def _format(ary)
659
689
  end
660
690
 
661
691
  ## select file based on key pressed
662
- def select_hint(view, ch)
692
+ def select_hint view, key
663
693
  # a to y is direct
664
694
  # if x or z take a key IF there are those many
665
695
  #
666
- ix = get_index(ch, view.size)
696
+ ix = get_index(key, view.size)
667
697
  return unless ix
668
698
 
669
699
  f = view[ix]
@@ -678,7 +708,6 @@ def select_hint(view, ch)
678
708
  else
679
709
  open_file f
680
710
  end
681
- # selectedix=ix
682
711
  end
683
712
 
684
713
  ## toggle selection state of file
@@ -690,6 +719,8 @@ def toggle_select(f=current_file)
690
719
  else
691
720
  add_to_selection f
692
721
  end
722
+ # XXX is it possible to just redraw this line
723
+ redraw_required
693
724
  end
694
725
 
695
726
  ## open file or directory
@@ -711,6 +742,7 @@ def open_file(f)
711
742
  save_dir_pos
712
743
  change_dir f, nextpos
713
744
  elsif File.readable? f
745
+ # TODO: looks complex pls simplify !! XXX
714
746
  $default_command ||= '$PAGER'
715
747
  if !$editor_mode
716
748
  ft = filetype f
@@ -740,6 +772,7 @@ def open_file(f)
740
772
  perror "open_file: (#{f}) not found"
741
773
  # could check home dir or CDPATH env variable DO
742
774
  end
775
+ redraw_required
743
776
  end
744
777
 
745
778
  # regardless of mode, view the current file using pager
@@ -808,25 +841,35 @@ def run_command(f)
808
841
  get_char
809
842
  end
810
843
 
811
- ## cd to a dir and go to position if specified
812
- def change_dir(f, pos = nil)
844
+ ## cd to a dir.
845
+ # Also, position cursor on child directory that we changed from if second param
846
+ # is true.
847
+ def change_dir f, position_cursor=false
813
848
  unless File.directory? f
814
- perror "#{p} is not a directory, or does not exist."
849
+ perror "#{f} is not a directory, or does not exist."
815
850
  return
816
851
  end
817
- $visited_dirs.insert(0, Dir.pwd)
818
- save_dir_pos # added 2019-03-20 - so we get to same file
852
+
853
+ # before leaving a dir we save it in the list, as well as the cursor
854
+ # position, so we can restore that position when we return
855
+ dir_from = Dir.pwd
856
+ $visited_dirs.insert(0, dir_from)
857
+ save_dir_pos
858
+
819
859
  f = File.expand_path(f)
820
860
  Dir.chdir f
821
- $filterstr ||= 'M'
822
- $files = `zsh -c 'print -rl -- *(#{$sorto}#{$hidden}#{$filterstr})'`.split("\n")
823
- $files = sort_file_list $files
861
+ read_directory
824
862
  post_cd
825
- if pos
826
- # convert curpos to sta also
827
- # $cursor = pos.to_i
828
- goto_line pos.to_i
863
+
864
+ # position the cursor on the previous directory
865
+ # This happens when we go to parent directory
866
+ if position_cursor
867
+ # get the position of the previous directory
868
+ pos = index_of(File.basename(dir_from) + '/')
869
+ $cursor = pos if pos
829
870
  end
871
+
872
+ redraw_required
830
873
  end
831
874
 
832
875
  def goto_previous_dir
@@ -835,6 +878,10 @@ def goto_previous_dir
835
878
  change_dir prev_dir
836
879
  end
837
880
 
881
+ def index_of dir
882
+ $files.index(dir)
883
+ end
884
+
838
885
  ## clear sort order and refresh listing, used typically if you are in some view
839
886
  # such as visited dirs or files
840
887
  def escape
@@ -850,12 +897,9 @@ end
850
897
 
851
898
  ## refresh listing after some change like option change, or toggle
852
899
  def refresh
853
- $filterstr ||= 'M'
854
- $files = `zsh -c 'print -rl -- *(#{$sorto}#{$hidden}#{$filterstr})'`.split("\n")
855
- # first put dirs then files
856
- $files = sort_file_list $files
857
900
  $patt = nil
858
901
  $title = nil
902
+ rescan_required
859
903
  end
860
904
 
861
905
  # put directories first, then files
@@ -879,18 +923,22 @@ end
879
923
 
880
924
  ## accept dir to goto and change to that ( can be a file too)
881
925
  def goto_dir
882
- print "\e[?25h"
883
- print 'Enter path: '
926
+ # print "\e[?25h"
927
+ print_last_line 'Enter path: '
884
928
  begin
885
929
  # path = gets.chomp
886
930
  path = readline
887
- return if path == ''
931
+ if path.nil? || path == ''
932
+ clear_status_line
933
+ return
934
+ end
888
935
  # rescue => ex
889
936
  rescue StandardError => ex
937
+ # Nope, already caught interrupt and sent back nil
890
938
  perror 'Cancelled cd, press a key'
891
939
  return
892
940
  ensure
893
- print "\e[?25l"
941
+ # print "\e[?25l"
894
942
  end
895
943
  f = File.expand_path(path)
896
944
  unless File.directory? f
@@ -939,14 +987,17 @@ end
939
987
  def goto_parent_dir
940
988
  # 2019-03-20 - when changing to parent, we need to keep cursor on
941
989
  # parent dir, not first
942
- curr = File.basename(Dir.pwd)
990
+ # curr = File.basename(Dir.pwd)
943
991
 
944
- change_dir '..'
992
+ change_dir '..', true
945
993
 
994
+ # TODO 2019-03-24 - we can revert to old thing and remove second arg from cd
995
+ # FIXME 2019-03-23 - too late to change the cursor here since change_dir
996
+ # now does a redraw !!! XXX
946
997
  # get index of child dir in this dir, and set cursor to it.
947
- index = $files.index(curr + '/')
948
- pause "WARNING: Could not find #{curr} in this directory." unless index
949
- $cursor = index if index
998
+ # index = $files.index(curr + '/')
999
+ # pause "WARNING: Could not find #{curr} in this directory." unless index
1000
+ # $cursor = index if index
950
1001
  end
951
1002
 
952
1003
  def goto_home_dir
@@ -969,13 +1020,13 @@ end
969
1020
 
970
1021
  # Goes to directory bookmarked with number or upper case char.
971
1022
  # If lower case character given, then go to first file starting with char.
972
- def goto_bookmark(ch = nil)
973
- unless ch
1023
+ def goto_bookmark(key = nil)
1024
+ unless key
974
1025
  print 'Enter bookmark char: '
975
- ch = get_char
1026
+ key = get_char
976
1027
  end
977
- if ch =~ /^[0-9A-Z]$/
978
- d = $bookmarks[ch]
1028
+ if key =~ /^[0-9A-Z]$/
1029
+ d = $bookmarks[key]
979
1030
  # this is if we use zfm's bookmarks which have a position
980
1031
  # this way we leave the position as is, so it gets written back
981
1032
  nextpos = nil
@@ -987,11 +1038,11 @@ def goto_bookmark(ch = nil)
987
1038
  end
988
1039
  change_dir d, nextpos
989
1040
  else
990
- perror "#{ch} not a bookmark"
1041
+ perror "#{key} not a bookmark"
991
1042
  end
992
1043
  else
993
- # goto_entry_starting_with ch
994
- file_starting_with ch
1044
+ # goto_entry_starting_with key
1045
+ file_starting_with key
995
1046
  end
996
1047
  end
997
1048
 
@@ -1013,6 +1064,7 @@ def next_page
1013
1064
  # FIXME: 2019-03-20 - if cursor is panned to 3rd column and then we page,
1014
1065
  # then after a while no hints show up since stact is high.
1015
1066
  $stact = 0
1067
+ redraw_required
1016
1068
  # next just does not work on the last page when it should
1017
1069
  # perhaps viewport has not yet been adjusted, that's why
1018
1070
  # $stact = 0 if $stact >= $viewport.size
@@ -1024,6 +1076,7 @@ end
1024
1076
  def prev_page
1025
1077
  $sta -= $pagesize
1026
1078
  $cursor -= $pagesize
1079
+ redraw_required
1027
1080
  end
1028
1081
 
1029
1082
  def print_help
@@ -1090,6 +1143,7 @@ def debug_vars
1090
1143
  file.puts "grows #{$grows}"
1091
1144
  file.puts "file #{current_file}"
1092
1145
  end
1146
+ redraw_required
1093
1147
  end
1094
1148
 
1095
1149
  def view_bookmarks
@@ -1098,8 +1152,8 @@ def view_bookmarks
1098
1152
  $bookmarks.each_pair { |k, v| puts "#{k.ljust(7)} => #{v}" }
1099
1153
  puts
1100
1154
  print 'Enter bookmark to goto: '
1101
- ch = get_char
1102
- goto_bookmark(ch) if ch =~ /^[0-9A-Z]$/
1155
+ key = get_char
1156
+ goto_bookmark(key) if key =~ /^[0-9A-Z]$/
1103
1157
  end
1104
1158
 
1105
1159
  # MENU MAIN -- keep consistent with zfm
@@ -1153,7 +1207,7 @@ def bookmark_menu
1153
1207
  end
1154
1208
 
1155
1209
  # Create a menu using title, and hash of key and binding
1156
- def menu(title, h)
1210
+ def menu title, h
1157
1211
  return unless h
1158
1212
 
1159
1213
  pbold title.to_s
@@ -1164,15 +1218,16 @@ def menu(title, h)
1164
1218
  x = ary.join("\n")
1165
1219
  puts %x{echo "#{x}" | column}
1166
1220
 
1167
- ch = get_char
1168
- binding = h[ch]
1169
- binding ||= h[ch.to_sym]
1221
+ key = get_char
1222
+ binding = h[key]
1223
+ binding ||= h[key.to_sym]
1170
1224
  # TODO: 2019-03-21 - menu's do not have comments, they are symbols
1171
1225
  # binding, _ = binding.split(':')
1172
1226
  if binding
1173
1227
  send(binding) if respond_to?(binding, true)
1174
1228
  end
1175
- [ch, binding]
1229
+ redraw_required
1230
+ [key, binding]
1176
1231
  end
1177
1232
 
1178
1233
  def toggle_menu
@@ -1184,15 +1239,15 @@ def toggle_menu
1184
1239
  case menu_text
1185
1240
  when :toggle_hidden
1186
1241
  $hidden = $hidden ? nil : 'D'
1187
- pause "Show hidden files is now #{!$hidden.nil?}"
1242
+ # pause "Show hidden files is now #{!$hidden.nil?}. Press a key."
1188
1243
  message "Show hidden is now #{!$hidden.nil?}"
1189
- refresh
1244
+ rescan_required
1190
1245
  when :toggle_case
1191
1246
  # $ignorecase = $ignorecase ? "" : "i"
1192
1247
  $ignorecase = !$ignorecase
1193
- pause "Ignore Case is now #{$ignorecase}"
1248
+ # pause "Ignore Case is now #{$ignorecase}. Press a key."
1194
1249
  message "Ignore Case is now #{$ignorecase}"
1195
- refresh
1250
+ rescan_required
1196
1251
  when :toggle_columns
1197
1252
  # FIXME: 2019-03-20 - if 3 then 1
1198
1253
  # adjust stact and sta, if moving from panned position
@@ -1205,6 +1260,7 @@ def toggle_menu
1205
1260
  x = $grows * $gviscols
1206
1261
  $pagesize = $pagesize == x ? $grows : x
1207
1262
  message "Visible columns now set to #{$gviscols}"
1263
+ rescan_required
1208
1264
  when :toggle_pager_mode
1209
1265
  $editor_mode = !$editor_mode
1210
1266
  $default_command = if $editor_mode
@@ -1217,6 +1273,7 @@ def toggle_menu
1217
1273
  when :toggle_enhanced_list
1218
1274
  $enhanced_mode = !$enhanced_mode
1219
1275
  message "Enhanced mode is #{$long_listing}"
1276
+ rescan_required
1220
1277
 
1221
1278
  when :toggle_long_list
1222
1279
  $long_listing = !$long_listing
@@ -1235,7 +1292,7 @@ def toggle_menu
1235
1292
  $stact = 0 # in case user was panned 2019-03-20 -
1236
1293
  end
1237
1294
  message "Long listing is #{$long_listing}, vis cols is #{$gviscols}"
1238
- refresh
1295
+ rescan_required
1239
1296
  end
1240
1297
  end
1241
1298
 
@@ -1243,7 +1300,7 @@ def sort_menu
1243
1300
  lo = nil
1244
1301
  h = { m: :modified, a: :accessed, M: :oldest,
1245
1302
  l: :largest, s: :smallest, n: :name, r: :rev_name, d: :dirs, c: :clear }
1246
- ch, menu_text = menu 'Sort Menu', h
1303
+ _, menu_text = menu 'Sort Menu', h
1247
1304
  case menu_text
1248
1305
  when :modified
1249
1306
  lo = 'om'
@@ -1266,8 +1323,10 @@ def sort_menu
1266
1323
  end
1267
1324
  ## This needs to persist and be a part of all listings, put in change_dir.
1268
1325
  $sorto = lo
1269
- $files = `zsh -c 'print -rl -- *(#{lo}#{$hidden}M)'`.split("\n") if lo
1270
- $title = nil
1326
+ message "Sorted on #{menu_text}"
1327
+ rescan_required
1328
+ # $files = `zsh -c 'print -rl -- *(#{lo}#{$hidden}M)'`.split("\n") if lo
1329
+ # $title = nil
1271
1330
  # $files =$(eval "print -rl -- ${pattern}(${MFM_LISTORDER}$filterstr)")
1272
1331
  end
1273
1332
 
@@ -1300,6 +1359,7 @@ def command_menu
1300
1359
  when :locate
1301
1360
  locate
1302
1361
  when :today
1362
+ # FIXME use filterstring
1303
1363
  $files = `zsh -c 'print -rl -- *(#{$hidden}Mm0)'`.split("\n")
1304
1364
  $title = "Today's files"
1305
1365
  when :default_command
@@ -1316,12 +1376,13 @@ def command_menu
1316
1376
  $default_command = nil
1317
1377
  end
1318
1378
  end
1379
+ # redraw
1319
1380
  end
1320
1381
 
1321
1382
  # This is quite badly placed and named. Maybe these should go elsewhere
1322
1383
  def extras
1323
1384
  h = { '1' => :one_column, '2' => :multi_column, :c => :columns, :r => :config_read, :w => :config_write }
1324
- ch, menu_text = menu 'Extras Menu', h
1385
+ key, menu_text = menu 'Extras Menu', h
1325
1386
  case menu_text
1326
1387
  when :one_column
1327
1388
  $pagesize = $grows
@@ -1330,10 +1391,10 @@ def extras
1330
1391
  $pagesize = $grows * $gviscols
1331
1392
  when :columns
1332
1393
  print "How many columns to show: 1-6 [current #{$gviscols}]? "
1333
- ch = get_char
1334
- ch = ch.to_i
1335
- if ch > 0 && ch < 7
1336
- $gviscols = ch.to_i
1394
+ key = get_char
1395
+ key = key.to_i
1396
+ if key > 0 && key < 7
1397
+ $gviscols = key.to_i
1337
1398
  $pagesize = $grows * $gviscols
1338
1399
  end
1339
1400
  end
@@ -1342,7 +1403,7 @@ end
1342
1403
  def filter_menu
1343
1404
  h = { :d => :dirs, :f => :files, :e => :emptydirs, '0' => :emptyfiles,
1344
1405
  :r => :reduce_list, :x => :extension}
1345
- ch, menu_text = menu 'Filter Menu', h
1406
+ _, menu_text = menu 'Filter Menu', h
1346
1407
  files = nil
1347
1408
  case menu_text
1348
1409
  when :dirs
@@ -1369,6 +1430,8 @@ def filter_menu
1369
1430
  if files
1370
1431
  $files = files
1371
1432
  $stact = 0
1433
+ $message = "Filtered on #{menu_text}"
1434
+ # redraw
1372
1435
  end
1373
1436
  end
1374
1437
 
@@ -1391,6 +1454,7 @@ def select_from_used_dirs
1391
1454
  $title = 'Used Directories'
1392
1455
  home = File.expand_path '~'
1393
1456
  $files = $used_dirs.uniq.map { |path| path.sub("#{home}", '~') }
1457
+ # redraw
1394
1458
  end
1395
1459
 
1396
1460
  def select_from_visited_files
@@ -1398,6 +1462,7 @@ def select_from_visited_files
1398
1462
  $title = 'Visited Files'
1399
1463
  home = File.expand_path '~'
1400
1464
  $files = $visited_files.uniq.map { |path| path.sub("#{home}", '~') }
1465
+ # redraw
1401
1466
  end
1402
1467
 
1403
1468
  # maybe unused ??? XXX
@@ -1416,32 +1481,28 @@ def pop_dir
1416
1481
  ## XXX make sure the dir exists, cuold have been deleted. can be an error or crash otherwise
1417
1482
  $visited_dirs.push d
1418
1483
  Dir.chdir d
1419
- $filterstr ||= 'M'
1420
- $files = `zsh -c 'print -rl -- *(#{$sorto}#{$hidden}#{$filterstr})'`.split("\n")
1421
- $files = sort_file_list $files
1484
+ # $filterstr ||= 'M'
1485
+ # $files = `zsh -c 'print -rl -- *(#{$sorto}#{$hidden}#{$filterstr})'`.split("\n")
1486
+ # $files = sort_file_list $files
1422
1487
  post_cd
1488
+ rescan_required
1423
1489
  end
1424
1490
 
1425
1491
  # after changing directory
1426
1492
  def post_cd
1427
- $patt = nil
1428
- $sta = $cursor = 0
1429
- $title = nil
1430
- $message = nil
1493
+ $title = $patt = $message = nil
1494
+ $sta = $cursor = $stact = 0
1431
1495
  $visual_block_start = nil
1432
- $stact = 0
1433
1496
  $current_dir = Dir.pwd # 2019-03-10 - so i don't keep doing in functions
1434
1497
  screen_settings
1435
- # i think this will screw with the dir_pos since it is not filename based.
1436
- enhance_file_list
1437
- ## added by RK 2014-03-31 - 00:29 since too many duplicates
1438
- $files = $files.uniq if $enhanced_mode
1498
+
1499
+ # goto last position cursor was in this dir
1500
+ # THis only makes sense if called after read_directory but before redraw
1439
1501
  revert_dir_pos
1440
1502
  end
1441
1503
 
1442
1504
  ## read dirs and files and bookmarks from file
1443
1505
  def config_read
1444
- # f = File.expand_path("~/.zfminfo")
1445
1506
  f = File.expand_path(CONFIG_FILE)
1446
1507
  return unless File.readable? f
1447
1508
 
@@ -1499,16 +1560,20 @@ end
1499
1560
 
1500
1561
  ## accept a character to save this dir as a bookmark
1501
1562
  def create_bookmark
1563
+
1502
1564
  print 'Enter A to Z or 0-9 to create a bookmark: '
1503
- ch = get_char
1504
- if ch =~ /^[0-9A-Z]$/
1505
- # $bookmarks[ch] = "#{Dir.pwd}:#{$cursor}"
1506
- $bookmarks[ch] = Dir.pwd
1565
+ print "\e[?25h" # unhide cursor
1566
+ key = get_char
1567
+ print "\e[?25l" # hide cursor
1568
+ if key =~ /^[0-9A-Z]$/
1569
+ # $bookmarks[key] = "#{Dir.pwd}:#{$cursor}"
1570
+ $bookmarks[key] = Dir.pwd
1507
1571
  $modified = true
1508
- message "Created bookmark #{ch}"
1572
+ message "Created bookmark #{key}"
1509
1573
  else
1510
1574
  perror 'Bookmark must be upper-case character or number.'
1511
1575
  end
1576
+ # redraw
1512
1577
  end
1513
1578
 
1514
1579
  # allow user to exit using :q :wq :x
@@ -1519,17 +1584,18 @@ def subcommand
1519
1584
  begin
1520
1585
  command = readline
1521
1586
  return if command == ''
1522
- rescue StandardError => ex
1587
+ rescue StandardError
1523
1588
  return
1524
1589
  end
1525
1590
  if command == 'q'
1591
+ # FIXME: 2019-03-22 - should this not call quit_command ?
1526
1592
  if $modified
1527
1593
  print 'Do you want to save bookmarks? (y/n): '
1528
- ch = get_char
1529
- if ch == 'y'
1594
+ key = get_char
1595
+ if key == 'y'
1530
1596
  $writing = true
1531
1597
  $quitting = true
1532
- elsif ch == 'n'
1598
+ elsif key == 'n'
1533
1599
  $quitting = true
1534
1600
  print 'Quitting without saving bookmarks'
1535
1601
  else
@@ -1556,18 +1622,19 @@ def subcommand
1556
1622
  else
1557
1623
  perror "Don't know about command #{command}. Try :h or :help"
1558
1624
  end
1625
+ # redraw
1559
1626
  end
1560
1627
 
1561
1628
  def quit_command
1562
1629
  if $modified
1563
1630
  puts 'Press w to save bookmarks before quitting ' if $modified
1564
1631
  print 'Press another q to quit '
1565
- ch = get_char
1632
+ key = get_char
1566
1633
  else
1567
1634
  $quitting = true
1568
1635
  end
1569
- $quitting = true if ch == 'q'
1570
- $quitting = $writing = true if ch == 'w'
1636
+ $quitting = true if key == 'q'
1637
+ $quitting = $writing = true if key == 'w'
1571
1638
  end
1572
1639
 
1573
1640
  def views
@@ -1579,16 +1646,21 @@ def views
1579
1646
  $viewctr = 0 if $viewctr > views.size
1580
1647
 
1581
1648
  $files = `zsh -c 'print -rl -- *(#{$sorto}#{$hidden}M)'`.split("\n")
1649
+ # redraw
1582
1650
  end
1583
1651
 
1584
1652
  def child_dirs
1585
- $title = 'Child directories'
1653
+ $title = 'Directories in current directory'
1586
1654
  $files = `zsh -c 'print -rl -- *(/#{$sorto}#{$hidden}M)'`.split("\n")
1655
+ message "#{$files.size} files."
1656
+ # redraw
1587
1657
  end
1588
1658
 
1589
1659
  def dirtree
1590
- $title = 'Child directories'
1660
+ $title = 'Child directories with depth'
1591
1661
  $files = `zsh -c 'print -rl -- **/*(/#{$sorto}#{$hidden}M)'`.split("\n")
1662
+ message "#{$files.size} files."
1663
+ # redraw
1592
1664
  end
1593
1665
 
1594
1666
  #
@@ -1598,6 +1670,8 @@ def tree
1598
1670
  # Caution: use only for small projects, don't use in root.
1599
1671
  $title = 'Full Tree'
1600
1672
  $files = `zsh -c 'print -rl -- **/*(#{$sorto}#{$hidden}M)'`.split("\n")
1673
+ message "#{$files.size} files."
1674
+ # redraw
1601
1675
  end
1602
1676
 
1603
1677
  # lists recent files in current dir
@@ -1606,6 +1680,7 @@ def recent_files
1606
1680
  # print -rl -- **/*(Dom[1,10])
1607
1681
  $title = 'Recent files'
1608
1682
  $files = `zsh -c 'print -rl -- **/*(Dom[1,15])'`.split("\n").reject {|f| f[0] == '.'}
1683
+ # redraw
1609
1684
  end
1610
1685
 
1611
1686
  def select_current
@@ -1622,16 +1697,20 @@ def push_used_dirs(d = Dir.pwd)
1622
1697
  $used_dirs.insert(0, d)
1623
1698
  end
1624
1699
 
1625
- def pbold(text)
1700
+ def pbold text
1626
1701
  puts "#{BOLD}#{text}#{BOLD_OFF}"
1627
1702
  end
1628
1703
 
1629
- def perror(text)
1630
- puts "#{RED}#{text}#{CLEAR}"
1704
+ # This is supposed to print on the status line
1705
+ # but prints on next line.FIXME 2019-03-24 - 00:08
1706
+ def perror text
1707
+ clear_status_line
1708
+ last_line
1709
+ print "#{RED}#{text}. Press a key.#{CLEAR}"
1631
1710
  get_char
1632
1711
  end
1633
1712
 
1634
- def pause(text = ' Press a key ...')
1713
+ def pause text=' Press a key.'
1635
1714
  print text
1636
1715
  get_char
1637
1716
  end
@@ -1707,10 +1786,10 @@ end
1707
1786
  #
1708
1787
  def ask_hint(deflt = nil)
1709
1788
  f = nil
1710
- ch = get_char
1711
- return deflt if ch == 'ENTER'
1789
+ key = get_char
1790
+ return deflt if key == 'ENTER'
1712
1791
 
1713
- ix = get_index(ch, $viewport.size)
1792
+ ix = get_index(key, $viewport.size)
1714
1793
  f = $viewport[ix] if ix
1715
1794
  f
1716
1795
  end
@@ -1726,11 +1805,12 @@ def screen_settings
1726
1805
  $pagesize = $grows * $gviscols
1727
1806
  end
1728
1807
 
1729
- ## moves column offset so we can reach unindexed columns or entries
1808
+ ## Tabs to next column in multi-column displays.
1809
+ # Moves column offset so we can reach unindexed columns or entries,
1810
+ # or those with double letters
1730
1811
  # 0 forward and any other back/prev
1731
- # direction is 0 (forward) or 1 (backward)
1732
- # TODO 2019-03-18 - $cursor should also move
1733
- def column_next(direction = 0)
1812
+ # direction is 0 (forward) or '1' (backward)
1813
+ def column_next direction=0
1734
1814
  # right movement or panning cycles back to first column
1735
1815
  # leftward movement stops at first column.
1736
1816
  if direction == 0
@@ -1753,6 +1833,7 @@ def column_next(direction = 0)
1753
1833
  # We are trying to maintain offset
1754
1834
  $cursor += $grows if $cursor < 0
1755
1835
  end
1836
+ # redraw
1756
1837
  end
1757
1838
 
1758
1839
  # currently i am only passing the action in from the list there as a key
@@ -1796,12 +1877,12 @@ def file_actions(action = nil)
1796
1877
  files = Shellwords.escape(file)
1797
1878
  end
1798
1879
 
1799
- ch = nil
1880
+ key = nil
1800
1881
  if action
1801
1882
  menu_text = action
1802
1883
  else
1803
- ch, menu_text = menu "File Menu for #{text}", h
1804
- menu_text = :quit if ch == 'q'
1884
+ key, menu_text = menu "File Menu for #{text}", h
1885
+ menu_text = :quit if key == 'q'
1805
1886
  end
1806
1887
  return unless menu_text # pressed some wrong key
1807
1888
 
@@ -1812,9 +1893,9 @@ def file_actions(action = nil)
1812
1893
  when :delete
1813
1894
  delcommand = 'rmtrash'
1814
1895
  print "#{delcommand} #{text} ?[yn?]: "
1815
- ch = get_char
1816
- view_selected_files if ch == '?'
1817
- return if ch != 'y'
1896
+ key = get_char
1897
+ view_selected_files if key == '?'
1898
+ return if key != 'y'
1818
1899
 
1819
1900
  system "#{delcommand} #{files}"
1820
1901
  refresh
@@ -1969,11 +2050,11 @@ def bindkey_ext_command
1969
2050
  print
1970
2051
  pbold 'Bind a capital letter to an external command'
1971
2052
  print 'Enter a capital letter to bind: '
1972
- ch = get_char
1973
- return if ch == 'Q'
2053
+ key = get_char
2054
+ return if key == 'Q'
1974
2055
 
1975
- if ch =~ /^[A-Z]$/
1976
- print "Enter an external command to bind to #{ch}: "
2056
+ if key =~ /^[A-Z]$/
2057
+ print "Enter an external command to bind to #{key}: "
1977
2058
  com = gets.chomp
1978
2059
  if com != ''
1979
2060
  print 'Enter prompt for command (blank if same as command): '
@@ -1982,7 +2063,7 @@ def bindkey_ext_command
1982
2063
  end
1983
2064
  print 'Pause after output [y/n]: '
1984
2065
  yn = get_char
1985
- $bindings[ch] = "command_file #{pro} #{yn} #{com}"
2066
+ $bindings[key] = "command_file #{pro} #{yn} #{com}"
1986
2067
  end
1987
2068
  end
1988
2069
 
@@ -2009,6 +2090,7 @@ def ag
2009
2090
  return
2010
2091
  end
2011
2092
  $files = files
2093
+ # redraw
2012
2094
  end
2013
2095
 
2014
2096
  def ffind
@@ -2023,6 +2105,7 @@ def ffind
2023
2105
  else
2024
2106
  $files = files
2025
2107
  end
2108
+ # redraw
2026
2109
  end
2027
2110
 
2028
2111
  def locate
@@ -2038,6 +2121,7 @@ def locate
2038
2121
  else
2039
2122
  $files = files
2040
2123
  end
2124
+ # redraw
2041
2125
  end
2042
2126
 
2043
2127
  ## Displays files from .viminfo file, if you use some other editor which
@@ -2051,6 +2135,7 @@ def viminfo
2051
2135
  # $files = `grep '^>' ~/.viminfo | cut -d ' ' -f 2- | sed "s#~#$HOME#g"`.split("\n")
2052
2136
  $files = `grep '^>' ~/.viminfo | cut -d ' ' -f 2- `.split("\n")
2053
2137
  $files.select! { |x| x = File.expand_path(x); File.exist?(x) }
2138
+ # redraw
2054
2139
  end
2055
2140
 
2056
2141
  ## takes directories from the z program, if you use autojump you can
@@ -2066,35 +2151,27 @@ def z_interface
2066
2151
  $files.collect! do |f|
2067
2152
  f.sub(/#{home}/, '~')
2068
2153
  end
2154
+ # redraw
2069
2155
  end
2070
2156
 
2071
2157
  def vidir
2072
2158
  system 'vidir'
2073
2159
  setup_terminal
2074
2160
  end
2075
- ## there is no one consisten way i am getting.
2076
- # i need to do a shell join if I am to pipe ffiles to say: xargs ls -t
2077
- # but if i want to pipe names to grep xxx then i need to join with newlines
2078
- # def pipe; end
2079
2161
 
2080
2162
  ## some cursor movement functions
2081
- # TODO: 2019-03-18 - cursor should also be updated
2082
- # sta is not updated when cursor > viewport.size and sta is still 0
2083
2163
  def cursor_scroll_dn
2084
2164
  moveto(pos + MSCROLL)
2085
2165
  end
2086
2166
 
2087
- # TODO: 2019-03-18 - cursor should also be updated
2088
2167
  def cursor_scroll_up
2089
2168
  moveto(pos - MSCROLL)
2090
2169
  end
2091
2170
 
2092
- # TODO: 2019-03-18 - cursor and sta should also be updated if page changes
2093
2171
  def cursor_dn
2094
2172
  moveto(pos + 1)
2095
2173
  end
2096
2174
 
2097
- # TODO: 2019-03-18 - cursor and sta should also be updated if page changes
2098
2175
  def cursor_up
2099
2176
  moveto(pos - 1)
2100
2177
  end
@@ -2104,7 +2181,6 @@ def pos
2104
2181
  end
2105
2182
 
2106
2183
  # move cursor to given position/line
2107
- # $sta should also move
2108
2184
  def moveto(position)
2109
2185
  orig = $cursor
2110
2186
  $cursor = position
@@ -2139,6 +2215,8 @@ def moveto(position)
2139
2215
  # $selected_files.concat $view[star..fin]
2140
2216
  add_to_selection $view[star..fin]
2141
2217
  end
2218
+ ensure
2219
+ # redraw
2142
2220
  end
2143
2221
 
2144
2222
  # is given file in selected array
@@ -2148,6 +2226,13 @@ def selected?(file)
2148
2226
  return $selected_files.index file
2149
2227
  end
2150
2228
 
2229
+ # is given file in selected array
2230
+ def visited?(file)
2231
+ $current_dir ||= Dir.pwd
2232
+ file = File.join($current_dir, file)
2233
+ return $visited_files.index file
2234
+ end
2235
+
2151
2236
  # TODO: can be array
2152
2237
  def add_to_selection(file)
2153
2238
  ff = file
@@ -2366,8 +2451,8 @@ def remove_from_list
2366
2451
  unless $selected_files.empty?
2367
2452
  sz = $selected_files.size
2368
2453
  print "Remove #{sz} files from used list (y)?: "
2369
- ch = get_char
2370
- return if ch != 'y'
2454
+ key = get_char
2455
+ return if key != 'y'
2371
2456
 
2372
2457
  arr = $selected_files.map { |path| File.expand_path(path) }
2373
2458
 
@@ -2378,12 +2463,14 @@ def remove_from_list
2378
2463
  refresh
2379
2464
  return
2380
2465
  end
2466
+
2467
+ # no file selected, use file under cursor
2381
2468
  print
2382
2469
  ## what if selected some rows
2383
2470
  file = $view[$cursor]
2384
2471
  print "Remove #{file} from used list (y)?: "
2385
- ch = get_char
2386
- return if ch != 'y'
2472
+ key = get_char
2473
+ return if key != 'y'
2387
2474
 
2388
2475
  file = File.expand_path(file)
2389
2476
  if File.directory? file
@@ -2489,20 +2576,26 @@ def insert_into_list(_dir, file)
2489
2576
  $files.push(*file)
2490
2577
  end
2491
2578
 
2492
- def get_important_files(dir)
2579
+ # 2019-03-23 - not exactly clear what is happening XXX
2580
+ # this gets a directory (containing '/' at end)
2581
+ def get_important_files dir
2493
2582
  # checks various lists like visited_files and bookmarks
2494
2583
  # to see if files from this dir or below are in it.
2495
2584
  # More to be used in a dir with few files.
2496
2585
  list = []
2497
2586
  l = dir.size + 1
2587
+ # 2019-03-23 - i think we are getting the basename of the file
2588
+ # if it is present in the given directory XXX
2498
2589
  $visited_files.each do |e|
2499
2590
  list << e[l..-1] if e.index(dir) == 0
2500
2591
  end
2501
- # bookmarks have : which needs to be removed
2502
- # list1 = $bookmarks.values.select do |e|
2503
- # e.index(dir) == 0
2504
- # end
2505
- # list.concat list1
2592
+ # bookmarks if it starts with this directory then add it
2593
+ # FIXME it puts same directory cetus into the list with full path
2594
+ # We need to remove the base until this dir. get relative part
2595
+ list1 = $bookmarks.values.select do |e|
2596
+ e.index(dir) == 0 && e != dir
2597
+ end
2598
+ list.concat list1
2506
2599
  list
2507
2600
  end
2508
2601
 
@@ -2511,13 +2604,60 @@ def message mess
2511
2604
  $message = mess
2512
2605
  end
2513
2606
 
2514
- Signal.trap('EXIT') do
2515
- reset_terminal
2516
- # system 'tput rmcup'
2517
- exit
2607
+ def last_line
2608
+ system "tput cup #{$glines} 0"
2609
+ end
2610
+
2611
+ def clear_status_line
2612
+ last_line
2613
+ # print a colored line at bottom of screen
2614
+ # \e[33;41m - set color of status_line
2615
+ # %*s - set blank spaces for entire line
2616
+ print "\e[33;4%sm%*s" % [$status_color || '1', $gcols, " "]
2617
+ end
2618
+ def print_on_right text
2619
+ sz = text.size
2620
+ system "tput cup #{$glines} #{$gcols - sz -1}"
2621
+ print text
2622
+ end
2623
+
2624
+ def print_last_line text
2625
+ last_line
2626
+ print text
2627
+ end
2628
+
2629
+ # main loop which calls all other programs
2630
+ def run
2631
+
2632
+ Signal.trap('EXIT') do
2633
+ reset_terminal
2634
+ exit
2635
+ end
2636
+
2637
+ setup_terminal
2638
+ config_read
2639
+
2640
+ redraw true
2641
+
2642
+ # do we need this, have they changed after redraw
2643
+ $patt = nil
2644
+ $sta = 0
2645
+
2646
+ # forever loop that prints dir and takes a key
2647
+ loop do
2648
+
2649
+ # moved the printing out of here
2650
+ # TODO we need to call it from where required
2651
+
2652
+ key = get_char
2653
+ resolve_key key
2654
+ redraw rescan?
2655
+
2656
+ break if $quitting
2657
+ end
2658
+ write_curdir
2659
+ puts 'bye'
2660
+ config_write if $writing
2518
2661
  end
2519
2662
 
2520
- setup_terminal
2521
2663
  run
2522
- # 2019-02-20 - added so alt-screen is used
2523
- system 'tput rmcup'
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'cetus'
8
- spec.version = '0.1.28'
8
+ spec.version = '0.1.29'
9
9
  spec.authors = ['Rahul Kumar']
10
10
  spec.email = ['oneness.univ@gmail.com']
11
11
  spec.description = %q{lightning fast file navigator}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cetus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.28
4
+ version: 0.1.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rahul Kumar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-22 00:00:00.000000000 Z
11
+ date: 2019-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler