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.
- checksums.yaml +4 -4
- data/bin/cetus +387 -247
- data/cetus.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6bfd0c8210eacca8888f7c6f22e5682feff8c82f3a90d799849d8bb153fd5e9
|
4
|
+
data.tar.gz: 3ebbdd0708cd4cc6f75a3a77a2161f443a68d703f2c769ca870ffd37242f839e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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-
|
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
|
-
|
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
|
-
|
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
|
-
|
335
|
-
def
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
$files = `zsh -c 'print -rl -- *(#{$sorto}#{$hidden}
|
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
|
-
|
346
|
-
|
347
|
-
$
|
348
|
-
|
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
|
-
|
365
|
-
|
366
|
-
|
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
|
-
|
388
|
-
|
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
|
-
|
392
|
-
|
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
|
-
|
398
|
-
|
378
|
+
# print help line and version
|
379
|
+
print "#{GREEN}#{@help} #{BLUE}cetus #{VERSION}#{CLEAR}\n"
|
399
380
|
|
400
|
-
|
401
|
-
|
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
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
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
|
-
|
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
|
-
|
413
|
+
print_on_right "#{$sta},#{$cursor},#{$stact},#{$viewport.size},#{$grows} | #{cf}"
|
431
414
|
else
|
432
|
-
|
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
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
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,
|
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
|
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(
|
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
|
812
|
-
|
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 "#{
|
849
|
+
perror "#{f} is not a directory, or does not exist."
|
815
850
|
return
|
816
851
|
end
|
817
|
-
|
818
|
-
|
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
|
-
|
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
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
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
|
-
|
926
|
+
# print "\e[?25h"
|
927
|
+
print_last_line 'Enter path: '
|
884
928
|
begin
|
885
929
|
# path = gets.chomp
|
886
930
|
path = readline
|
887
|
-
|
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(
|
973
|
-
unless
|
1023
|
+
def goto_bookmark(key = nil)
|
1024
|
+
unless key
|
974
1025
|
print 'Enter bookmark char: '
|
975
|
-
|
1026
|
+
key = get_char
|
976
1027
|
end
|
977
|
-
if
|
978
|
-
d = $bookmarks[
|
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 "#{
|
1041
|
+
perror "#{key} not a bookmark"
|
991
1042
|
end
|
992
1043
|
else
|
993
|
-
# goto_entry_starting_with
|
994
|
-
file_starting_with
|
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
|
-
|
1102
|
-
goto_bookmark(
|
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
|
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
|
-
|
1168
|
-
binding = h[
|
1169
|
-
binding ||= h[
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
1270
|
-
|
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
|
-
|
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
|
-
|
1334
|
-
|
1335
|
-
if
|
1336
|
-
$gviscols =
|
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
|
-
|
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
|
-
|
1436
|
-
|
1437
|
-
|
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
|
-
|
1504
|
-
|
1505
|
-
|
1506
|
-
|
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 #{
|
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
|
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
|
-
|
1529
|
-
if
|
1594
|
+
key = get_char
|
1595
|
+
if key == 'y'
|
1530
1596
|
$writing = true
|
1531
1597
|
$quitting = true
|
1532
|
-
elsif
|
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
|
-
|
1632
|
+
key = get_char
|
1566
1633
|
else
|
1567
1634
|
$quitting = true
|
1568
1635
|
end
|
1569
|
-
$quitting = true if
|
1570
|
-
$quitting = $writing = true if
|
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 = '
|
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
|
1700
|
+
def pbold text
|
1626
1701
|
puts "#{BOLD}#{text}#{BOLD_OFF}"
|
1627
1702
|
end
|
1628
1703
|
|
1629
|
-
|
1630
|
-
|
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
|
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
|
-
|
1711
|
-
return deflt if
|
1789
|
+
key = get_char
|
1790
|
+
return deflt if key == 'ENTER'
|
1712
1791
|
|
1713
|
-
ix = get_index(
|
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
|
-
##
|
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
|
-
|
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
|
-
|
1880
|
+
key = nil
|
1800
1881
|
if action
|
1801
1882
|
menu_text = action
|
1802
1883
|
else
|
1803
|
-
|
1804
|
-
menu_text = :quit if
|
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
|
-
|
1816
|
-
view_selected_files if
|
1817
|
-
return if
|
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
|
-
|
1973
|
-
return if
|
2053
|
+
key = get_char
|
2054
|
+
return if key == 'Q'
|
1974
2055
|
|
1975
|
-
if
|
1976
|
-
print "Enter an external command to bind to #{
|
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[
|
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
|
-
|
2370
|
-
return if
|
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
|
-
|
2386
|
-
return if
|
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
|
-
|
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
|
2502
|
-
#
|
2503
|
-
#
|
2504
|
-
|
2505
|
-
|
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
|
-
|
2515
|
-
|
2516
|
-
|
2517
|
-
|
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'
|
data/cetus.gemspec
CHANGED
@@ -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.
|
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.
|
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-
|
11
|
+
date: 2019-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|