cetus 0.1.28 → 0.1.29

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/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