cetus 0.1.32 → 0.1.33
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/bin/cetus +346 -126
- data/cetus.gemspec +1 -1
- data/generators/viminfo +9 -0
- data/generators/z +15 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ff3303709b421f3fed64413d85fc6c78e7693e3fd57f4223da67a6044a302eb
|
4
|
+
data.tar.gz: 414a490eb02e8aa98701b86674cf67597fca22cc144a2aedb1c5bbd0c7c37789
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab77cb6b97de0d32f4ec89540ea0c296164d54805f9d4a83c452d9b513712e2a6a2942a4a16071e3f5fb3c2add77077e179d7c1028cd36f8a0003d357b797377
|
7
|
+
data.tar.gz: def9fe901b105277bedcfd6e6c6cd9fd1a41bb25771bbd6306f1c457f8f6b380a51d248081d456f864be37618f32398c41e69e1e8e1267e968473a66b2810302
|
data/.gitignore
CHANGED
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-04-
|
9
|
+
# Last update: 2019-04-10 10:16
|
10
10
|
# --------------------------------------------------------------------------- #
|
11
11
|
# cetus.rb Copyright (C) 2012-2019 rahul kumar
|
12
12
|
# == CHANGELOG
|
@@ -39,7 +39,7 @@ require 'logger'
|
|
39
39
|
# alias c=~/bin/cetus.rb
|
40
40
|
# c
|
41
41
|
|
42
|
-
VERSION = '0.1.
|
42
|
+
VERSION = '0.1.33.0'.freeze
|
43
43
|
CONFIG_PATH = ENV['XDG_CONFIG_HOME'] || File.join(ENV['HOME'], '.config')
|
44
44
|
CONFIG_FILE = "#{CONFIG_PATH}/cetus/conf.yml".freeze
|
45
45
|
|
@@ -48,7 +48,7 @@ $bindings = {
|
|
48
48
|
'`' => 'main_menu',
|
49
49
|
'=' => 'toggle_menu',
|
50
50
|
'M-s' => 'selection_menu',
|
51
|
-
'M-o' => '
|
51
|
+
'M-o' => 'order_menu',
|
52
52
|
'ENTER' => 'select_current',
|
53
53
|
'C-p' => 'page_current',
|
54
54
|
'C-e' => 'edit_current',
|
@@ -56,7 +56,7 @@ $bindings = {
|
|
56
56
|
'C-s' => 'toggle_select',
|
57
57
|
'C-r' => 'reduce',
|
58
58
|
'C-g' => 'debug_vars',
|
59
|
-
'
|
59
|
+
'*' => 'toggle_selection_mode',
|
60
60
|
'M-a' => 'select_all',
|
61
61
|
'M-A' => 'unselect_all',
|
62
62
|
'!' => 'execute',
|
@@ -99,6 +99,8 @@ $bindings = {
|
|
99
99
|
'UP' => 'cursor_up',
|
100
100
|
'DOWN' => 'cursor_dn',
|
101
101
|
'C-SPACE' => 'visual_mode_toggle',
|
102
|
+
'@' => 'scripts',
|
103
|
+
'#' => 'generators',
|
102
104
|
|
103
105
|
'?' => 'print_help',
|
104
106
|
'F1' => 'print_help',
|
@@ -209,7 +211,8 @@ end
|
|
209
211
|
|
210
212
|
# wrap readline so C-c can be ignored, but blank is taken as default
|
211
213
|
def readline prompt='>'
|
212
|
-
|
214
|
+
clear_last_line
|
215
|
+
print "\r"
|
213
216
|
# do we need to clear till end of line, see enter_regex commented
|
214
217
|
# unhide cursor
|
215
218
|
print "\e[?25h"
|
@@ -280,6 +283,7 @@ ensure
|
|
280
283
|
end
|
281
284
|
|
282
285
|
## GLOBALS
|
286
|
+
# hints or shortcuts to get to files without moving
|
283
287
|
$IDX = ('a'..'y').to_a
|
284
288
|
$IDX.delete 'q'
|
285
289
|
$IDX.concat ('za'..'zz').to_a
|
@@ -309,6 +313,9 @@ $pager_command = {
|
|
309
313
|
$dir_position = {}
|
310
314
|
$movement = $old_cursor = nil # cursor movement has happened only, don't repaint
|
311
315
|
$selection_mode = 1 # single select
|
316
|
+
@group_dirs = true
|
317
|
+
# truncate long filenames from :right, :left or :center.
|
318
|
+
@truncate_from = :center
|
312
319
|
|
313
320
|
## ----------------- CONSTANTS ----------------- ##
|
314
321
|
GMARK = '*'.freeze
|
@@ -397,7 +404,7 @@ def read_directory
|
|
397
404
|
$filterstr ||= 'M'
|
398
405
|
# $files = `zsh -c 'print -rl -- *(#{$sorto}#{$hidden}#{$filterstr})'`.split("\n")
|
399
406
|
$files = list_files
|
400
|
-
$files =
|
407
|
+
$files = group_directories_first($files) if @group_dirs
|
401
408
|
return unless $enhanced_mode
|
402
409
|
|
403
410
|
enhance_file_list
|
@@ -426,6 +433,8 @@ def list_files dir='*', sorto=$sorto, hidden=$hidden, filter=$filterstr
|
|
426
433
|
:size
|
427
434
|
when 'n'
|
428
435
|
:path
|
436
|
+
when 'x'
|
437
|
+
:extname
|
429
438
|
end
|
430
439
|
|
431
440
|
# sort by time and then reverse so latest first.
|
@@ -442,7 +451,7 @@ def list_files dir='*', sorto=$sorto, hidden=$hidden, filter=$filterstr
|
|
442
451
|
if File.exist? f
|
443
452
|
File.send(func, f)
|
444
453
|
else
|
445
|
-
sys_stat(
|
454
|
+
sys_stat(func, f)
|
446
455
|
end
|
447
456
|
end
|
448
457
|
end
|
@@ -458,11 +467,13 @@ def list_files dir='*', sorto=$sorto, hidden=$hidden, filter=$filterstr
|
|
458
467
|
end
|
459
468
|
# ------------- end of read_directory --------------------------------#
|
460
469
|
|
461
|
-
#
|
462
|
-
|
463
|
-
def sys_stat file, func
|
470
|
+
# Deal with dead links.
|
471
|
+
def sys_stat func, file
|
464
472
|
return unless File.symlink? file
|
465
473
|
|
474
|
+
# lstat does not respond to path and extname
|
475
|
+
return File.send(func, file) unless File.lstat(file).respond_to? func
|
476
|
+
|
466
477
|
return File.lstat(file).send(func)
|
467
478
|
end
|
468
479
|
|
@@ -524,7 +535,7 @@ def status_line
|
|
524
535
|
cf = current_file
|
525
536
|
$message = ' | No matches. Press ESCAPE' if $patt && !cf
|
526
537
|
|
527
|
-
|
538
|
+
clear_last_line
|
528
539
|
|
529
540
|
# Print the filename at the right side of the status_line
|
530
541
|
# sometimes due to search, there is no file
|
@@ -537,12 +548,23 @@ def status_line
|
|
537
548
|
end
|
538
549
|
end
|
539
550
|
# move to beginning of line, reset text mode after printing
|
540
|
-
|
551
|
+
# patt and message are together, no gap, why not ? 2019-04-08 -
|
552
|
+
if $patt && $patt != ''
|
553
|
+
patt = "[/#{$patt}]"
|
554
|
+
patt[-1] = '/i]' if $ignorecase
|
555
|
+
end
|
556
|
+
# bring cursor to start of line
|
557
|
+
# add background color
|
558
|
+
# print mode
|
559
|
+
# print search pattern if any
|
560
|
+
# print message if any
|
561
|
+
# print "\r#{v_mm}#{patt}#{$message}\e[m"
|
562
|
+
print "\r\e[33;4#{$status_color}m#{v_mm}#{patt}#{$message}\e[m"
|
541
563
|
|
542
564
|
end
|
543
565
|
|
544
566
|
def print_debug_info cf=current_file()
|
545
|
-
print_on_right "= #{$sta},#{$cursor},#{$stact},#{$viewport.size},#{$grows} | #{cf}"
|
567
|
+
print_on_right "len:#{cf.length}/#{$temp_wid} = #{$sta},#{$cursor},#{$stact},#{$viewport.size},#{$grows} | #{cf}"
|
546
568
|
end
|
547
569
|
|
548
570
|
# should we do a read of the dir
|
@@ -645,16 +667,20 @@ end
|
|
645
667
|
def redraw_required(flag=true) $redraw_required = flag; end
|
646
668
|
|
647
669
|
def resolve_key key
|
670
|
+
ret = true
|
648
671
|
if key.match?(/^[a-pr-zZ]$/)
|
649
672
|
# hint mode
|
650
|
-
select_hint $viewport, key
|
673
|
+
ret = select_hint $viewport, key
|
651
674
|
elsif key == 'BACKSPACE'
|
652
675
|
# do we really need this TODO
|
653
676
|
$patt = $patt[0..-2] if $patt && !$patt.empty?
|
654
677
|
$message = $patt = nil if $patt == ''
|
678
|
+
elsif '0123456789'.include? key
|
679
|
+
resolve_numeric_key key
|
655
680
|
else
|
656
681
|
resolve_binding key
|
657
682
|
end
|
683
|
+
ret
|
658
684
|
end
|
659
685
|
|
660
686
|
def resolve_binding key
|
@@ -675,6 +701,23 @@ def resolve_binding key
|
|
675
701
|
end
|
676
702
|
end
|
677
703
|
|
704
|
+
# numbers represent quick bookmarks
|
705
|
+
# if bookmark exists, go to else create it.
|
706
|
+
def resolve_numeric_key key
|
707
|
+
d = $bookmarks[key]
|
708
|
+
if d
|
709
|
+
change_dir d
|
710
|
+
return
|
711
|
+
end
|
712
|
+
|
713
|
+
set_bookmark key
|
714
|
+
message "Created bookmark #{key}."
|
715
|
+
end
|
716
|
+
|
717
|
+
def set_bookmark key, dir=Dir.pwd
|
718
|
+
$bookmarks[key] = dir
|
719
|
+
end
|
720
|
+
|
678
721
|
## write current dir to a file so we can ccd to it when exiting
|
679
722
|
def write_curdir
|
680
723
|
f = File.expand_path('~/.fff_d')
|
@@ -719,6 +762,7 @@ def columnate ary, siz
|
|
719
762
|
# if less than sz then 1 col and full width
|
720
763
|
#
|
721
764
|
wid = get_width ary.size, siz
|
765
|
+
$temp_wid = wid
|
722
766
|
|
723
767
|
# ix refers to the index in the complete file list, wherease we only show 60 at a time
|
724
768
|
ix = 0
|
@@ -741,7 +785,7 @@ def columnate ary, siz
|
|
741
785
|
f = truncate_formatted_filename(f, unformatted_len, wid)
|
742
786
|
|
743
787
|
|
744
|
-
|
788
|
+
elsif unformatted_len < wid
|
745
789
|
|
746
790
|
# f = f.ljust(wid)
|
747
791
|
f << ' ' * (wid - unformatted_len)
|
@@ -766,15 +810,54 @@ end
|
|
766
810
|
|
767
811
|
# shorten the filename to wid
|
768
812
|
# unformatted_len is the length without ANSI formatting
|
813
|
+
# wid is the exact width every line should restrict itself to.
|
814
|
+
# f is filename with hint and space and possible ANSI codes.
|
815
|
+
# WARN: check for hint getting swallowed in case of 5 columns
|
769
816
|
def truncate_formatted_filename f, unformatted_len, wid
|
770
817
|
excess = unformatted_len - wid
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
818
|
+
|
819
|
+
f = case @truncate_from
|
820
|
+
|
821
|
+
when :right
|
822
|
+
# text starts at 0, or 'm' if escape code
|
823
|
+
sindex = f[0] == "\e" ? f.index('m') : 0
|
824
|
+
|
825
|
+
# We show exactly `wid` characters, but escapes are not displayed
|
826
|
+
# so add that may characters
|
827
|
+
# Also, remove 2 for $ and space
|
828
|
+
f[0..wid + sindex - 2] + "$ \e[m"
|
829
|
+
|
830
|
+
when :center
|
831
|
+
|
832
|
+
# from central point calculate how much to remove in both directions
|
833
|
+
center = unformatted_len / 2
|
834
|
+
excess_half = excess / 2
|
835
|
+
point = center + excess_half
|
836
|
+
point1 = point - excess
|
837
|
+
|
838
|
+
# remove text between point1 and point
|
839
|
+
f[0..(point1 - 1)] + '$' + f[point + 2..-1] + ' '
|
840
|
+
|
841
|
+
when :left
|
842
|
+
|
843
|
+
# NOTE: we cannot remove the hint
|
844
|
+
# for single hints we need to add extra space
|
845
|
+
# there could be escape codes of varying length
|
846
|
+
sindex = f.index ' '
|
847
|
+
# if f[0] == "\e"
|
848
|
+
# mindex = f.index('m')
|
849
|
+
# hintsize = sindex - mindex - 1
|
850
|
+
# else
|
851
|
+
# hintsize = sindex - 1
|
852
|
+
# end
|
853
|
+
# f[0..sindex + 1] + '<' + f[-wid + hintsize..-1] + ' '
|
854
|
+
@log.debug "XXX #{excess}: #{f} / #{wid}"
|
855
|
+
# 4 = 2 for literals, 2 to get ahead of sindex+1
|
856
|
+
f[0..sindex + 1] + '<' + f[sindex + 4 + excess..-1] + ' '
|
857
|
+
# in some cases 29/32 we are actually overlapping 2 parts above
|
858
|
+
# same for 34/32
|
859
|
+
end
|
860
|
+
return f
|
778
861
|
end
|
779
862
|
|
780
863
|
def get_width arysz, siz
|
@@ -813,7 +896,6 @@ def format_array(ary)
|
|
813
896
|
ix = 0
|
814
897
|
ctr = 0
|
815
898
|
ary.each do |f|
|
816
|
-
# raise "#{f} != #{ary[ix]}" if f != ary[ix]
|
817
899
|
## ctr refers to the index in the column
|
818
900
|
ind = get_shortcut(ix)
|
819
901
|
mark = SPACE
|
@@ -971,10 +1053,10 @@ def select_hint view, key
|
|
971
1053
|
# if x or z take a key IF there are those many
|
972
1054
|
#
|
973
1055
|
ix = get_index(key, view.size)
|
974
|
-
return unless ix
|
1056
|
+
return nil unless ix
|
975
1057
|
|
976
1058
|
f = view[ix]
|
977
|
-
return unless f
|
1059
|
+
return nil unless f
|
978
1060
|
|
979
1061
|
$cursor = $sta + ix
|
980
1062
|
|
@@ -985,6 +1067,7 @@ def select_hint view, key
|
|
985
1067
|
else
|
986
1068
|
open_file f
|
987
1069
|
end
|
1070
|
+
true
|
988
1071
|
end
|
989
1072
|
|
990
1073
|
## toggle selection state of file
|
@@ -1093,16 +1176,14 @@ def run_command(f)
|
|
1093
1176
|
when String
|
1094
1177
|
files = Shellwords.escape(f)
|
1095
1178
|
end
|
1096
|
-
print "Run a command on #{files}: "
|
1097
1179
|
begin
|
1098
1180
|
# Readline::HISTORY.push(*values)
|
1099
|
-
command = readline
|
1181
|
+
command = readline "Run a command on #{files}: "
|
1100
1182
|
# command = gets().chomp
|
1101
1183
|
return if command.empty?
|
1102
1184
|
|
1103
|
-
print 'Second part of command: '
|
1104
1185
|
# command2 = gets().chomp
|
1105
|
-
command2 = readline
|
1186
|
+
command2 = readline 'Second part of command: '
|
1106
1187
|
puts "#{command} #{files} #{command2}"
|
1107
1188
|
system "#{command} #{files} #{command2}"
|
1108
1189
|
setup_terminal
|
@@ -1168,7 +1249,7 @@ def refresh
|
|
1168
1249
|
end
|
1169
1250
|
|
1170
1251
|
# put directories first, then files
|
1171
|
-
def
|
1252
|
+
def group_directories_first files
|
1172
1253
|
dirs = files.select { |f| File.directory?(f) }
|
1173
1254
|
# earlier I had File? which removed links, esp dead ones
|
1174
1255
|
fi = files.select { |f| !File.directory?(f) }
|
@@ -1195,7 +1276,7 @@ def goto_dir
|
|
1195
1276
|
# path = gets.chomp
|
1196
1277
|
path = readline 'Enter path to go to: '
|
1197
1278
|
if path.nil? || path == ''
|
1198
|
-
|
1279
|
+
clear_last_line
|
1199
1280
|
return
|
1200
1281
|
end
|
1201
1282
|
# rescue => ex
|
@@ -1235,7 +1316,7 @@ def toggle_selection_mode
|
|
1235
1316
|
else
|
1236
1317
|
$selection_mode = 2
|
1237
1318
|
$mode = 'SEL'
|
1238
|
-
message 'Typing a hint selects the file.
|
1319
|
+
message 'Typing a hint selects the file. Typing again will clear . '
|
1239
1320
|
end
|
1240
1321
|
end
|
1241
1322
|
|
@@ -1285,16 +1366,8 @@ def goto_bookmark(key = nil)
|
|
1285
1366
|
end
|
1286
1367
|
if key =~ /^[0-9A-Z]$/
|
1287
1368
|
d = $bookmarks[key]
|
1288
|
-
# this is if we use zfm's bookmarks which have a position
|
1289
|
-
# this way we leave the position as is, so it gets written back
|
1290
|
-
nextpos = nil
|
1291
1369
|
if d
|
1292
|
-
|
1293
|
-
ix = d.index(':')
|
1294
|
-
nextpos = d[ix + 1..-1]
|
1295
|
-
d = d[0, ix]
|
1296
|
-
end
|
1297
|
-
change_dir d #, nextpos
|
1370
|
+
change_dir d
|
1298
1371
|
else
|
1299
1372
|
perror "#{key} not a bookmark"
|
1300
1373
|
end
|
@@ -1416,7 +1489,6 @@ def main_menu
|
|
1416
1489
|
:a => :ag,
|
1417
1490
|
'/' => :ffind,
|
1418
1491
|
:l => :locate,
|
1419
|
-
:V => :viminfo,
|
1420
1492
|
:v => :vidir,
|
1421
1493
|
:z => :z_interface,
|
1422
1494
|
:d => :child_dirs,
|
@@ -1425,15 +1497,11 @@ def main_menu
|
|
1425
1497
|
'2' => :select_from_used_dirs,
|
1426
1498
|
:t => :dirtree,
|
1427
1499
|
'4' => :tree,
|
1428
|
-
:o => :
|
1500
|
+
:o => :order_menu,
|
1429
1501
|
:F => :filter_menu,
|
1430
|
-
:c => :
|
1502
|
+
:c => :create_menu,
|
1431
1503
|
:b => :bookmark_menu,
|
1432
1504
|
:s => :selection_menu,
|
1433
|
-
:B => :bindkey_ext_command,
|
1434
|
-
:M => :create_a_dir,
|
1435
|
-
'%' => :create_a_file,
|
1436
|
-
'S' => :scripts,
|
1437
1505
|
:x => :extras
|
1438
1506
|
}
|
1439
1507
|
menu 'Main Menu', h
|
@@ -1444,7 +1512,7 @@ def selection_menu
|
|
1444
1512
|
:a => :select_all,
|
1445
1513
|
:u => :unselect_all,
|
1446
1514
|
:s => :toggle_select,
|
1447
|
-
'
|
1515
|
+
'*' => 'toggle_selection_mode',
|
1448
1516
|
'x' => 'visual_mode_toggle',
|
1449
1517
|
:v => :view_selected_files
|
1450
1518
|
}
|
@@ -1469,7 +1537,17 @@ def menu title, h
|
|
1469
1537
|
# h.each_pair { |k, v| puts " #{k}: #{v}" }
|
1470
1538
|
# 2019-03-09 - trying out using `column` to print in cols
|
1471
1539
|
ary = []
|
1472
|
-
|
1540
|
+
|
1541
|
+
# 2019-04-07 - check $bindings for shortcut and get key, add global
|
1542
|
+
# binding in brackets
|
1543
|
+
h.each_pair do |k, v|
|
1544
|
+
|
1545
|
+
# get global binding
|
1546
|
+
scut = $bindings.key(v.to_s)
|
1547
|
+
scut = " (#{scut})" if scut
|
1548
|
+
|
1549
|
+
ary << " #{k}: #{v} #{scut}"
|
1550
|
+
end
|
1473
1551
|
x = ary.join("\n")
|
1474
1552
|
puts %x{echo "#{x}" | column}
|
1475
1553
|
|
@@ -1486,14 +1564,19 @@ def menu title, h
|
|
1486
1564
|
end
|
1487
1565
|
|
1488
1566
|
def toggle_menu
|
1489
|
-
h = { :
|
1490
|
-
:
|
1491
|
-
:
|
1567
|
+
h = { h: :toggle_hidden,
|
1568
|
+
c: :toggle_case,
|
1569
|
+
l: :toggle_long_list,
|
1492
1570
|
'1' => :toggle_columns,
|
1571
|
+
d: :toggle_group_dirs,
|
1493
1572
|
:p => :toggle_pager_mode,
|
1494
|
-
:
|
1495
|
-
|
1496
|
-
|
1573
|
+
:D => :toggle_debug_flag,
|
1574
|
+
'8' => :toggle_selection_mode,
|
1575
|
+
'*' => :toggle_selection_mode,
|
1576
|
+
v: :visual_mode_toggle,
|
1577
|
+
t: :toggle_truncate_from,
|
1578
|
+
:e => :toggle_enhanced_list
|
1579
|
+
}
|
1497
1580
|
|
1498
1581
|
_, menu_text = menu 'Toggle Menu', h
|
1499
1582
|
return unless menu_text
|
@@ -1508,11 +1591,13 @@ def toggle_menu
|
|
1508
1591
|
message "Show hidden is now #{!$hidden.nil?}"
|
1509
1592
|
rescan_required
|
1510
1593
|
when :toggle_case
|
1511
|
-
# $ignorecase = $ignorecase ? "" : "i"
|
1512
1594
|
$ignorecase = !$ignorecase
|
1513
|
-
# pause "Ignore Case is now #{$ignorecase}. Press a key."
|
1514
1595
|
message "Ignore Case is now #{$ignorecase}"
|
1515
1596
|
rescan_required
|
1597
|
+
when :toggle_group_dirs
|
1598
|
+
@group_dirs = !@group_dirs
|
1599
|
+
message "Group Dirs First is now #{@group_dirs}"
|
1600
|
+
rescan_required
|
1516
1601
|
when :toggle_columns
|
1517
1602
|
if $gviscols == 1
|
1518
1603
|
$gviscols = 3
|
@@ -1535,7 +1620,7 @@ def toggle_menu
|
|
1535
1620
|
message "Default command is #{$default_command}"
|
1536
1621
|
when :toggle_enhanced_list
|
1537
1622
|
$enhanced_mode = !$enhanced_mode
|
1538
|
-
message "Enhanced mode is #{$
|
1623
|
+
message "Enhanced mode is #{$enhanced_mode}"
|
1539
1624
|
rescan_required
|
1540
1625
|
|
1541
1626
|
when :toggle_long_list
|
@@ -1558,15 +1643,32 @@ def toggle_menu
|
|
1558
1643
|
when :toggle_debug_flag
|
1559
1644
|
@debug_flag = !@debug_flag
|
1560
1645
|
message "Debug flag is #{@debug_flag}"
|
1646
|
+
|
1647
|
+
when :toggle_truncate_from
|
1648
|
+
# if filename exceeds width cut from which direction
|
1649
|
+
@truncate_from = case @truncate_from
|
1650
|
+
when :center
|
1651
|
+
:left
|
1652
|
+
when :left
|
1653
|
+
:right
|
1654
|
+
when :right
|
1655
|
+
:center
|
1656
|
+
else
|
1657
|
+
:center
|
1658
|
+
end
|
1561
1659
|
end
|
1660
|
+
message "Truncate long filenames from: #{@truncate_from}"
|
1562
1661
|
end
|
1563
1662
|
|
1564
|
-
def
|
1663
|
+
def order_menu
|
1565
1664
|
# zsh o = order, O = reverse order
|
1566
1665
|
# ruby mtime/atime/ctime come reversed so we have to change o to O
|
1567
1666
|
lo = nil
|
1568
1667
|
h = { m: :modified, a: :accessed, M: :oldest,
|
1569
|
-
|
1668
|
+
s: :largest, S: :smallest, n: :name, N: :rev_name,
|
1669
|
+
# d: :dirs,
|
1670
|
+
c: :inode,
|
1671
|
+
x: :extension,
|
1570
1672
|
z: :clear }
|
1571
1673
|
_, menu_text = menu 'Sort Menu', h
|
1572
1674
|
case menu_text
|
@@ -1584,6 +1686,8 @@ def sort_menu
|
|
1584
1686
|
lo = 'oL'
|
1585
1687
|
when :name
|
1586
1688
|
lo = 'on'
|
1689
|
+
when :extension
|
1690
|
+
lo = 'ox'
|
1587
1691
|
when :rev_name
|
1588
1692
|
lo = 'On'
|
1589
1693
|
when :dirs
|
@@ -1597,8 +1701,17 @@ def sort_menu
|
|
1597
1701
|
rescan_required
|
1598
1702
|
end
|
1599
1703
|
|
1704
|
+
def create_menu
|
1705
|
+
h = { f: :create_a_file,
|
1706
|
+
d: :create_a_dir,
|
1707
|
+
b: :create_bookmark
|
1708
|
+
}
|
1709
|
+
_, menu_text = menu 'Create Menu', h
|
1710
|
+
end
|
1711
|
+
|
1600
1712
|
# thse need to be placed in correct position, some do nothing
|
1601
1713
|
# and some like ffind have no menu item
|
1714
|
+
# TODO FIXME uncalled now. look into this
|
1602
1715
|
def command_menu
|
1603
1716
|
# since these involve full paths, we need more space, like only one column
|
1604
1717
|
## in these cases, getting back to the earlier dir, back to earlier listing
|
@@ -1649,7 +1762,15 @@ end
|
|
1649
1762
|
|
1650
1763
|
# This is quite badly placed and named. Maybe these should go elsewhere
|
1651
1764
|
def extras
|
1652
|
-
h = { '1' => :one_column,
|
1765
|
+
h = { '1' => :one_column,
|
1766
|
+
'2' => :multi_column,
|
1767
|
+
:c => :columns,
|
1768
|
+
s: :scripts,
|
1769
|
+
g: :generators,
|
1770
|
+
:B => :bindkey_ext_command,
|
1771
|
+
:r => :config_read,
|
1772
|
+
:w => :config_write
|
1773
|
+
}
|
1653
1774
|
key, menu_text = menu 'Extras Menu', h
|
1654
1775
|
case menu_text
|
1655
1776
|
when :one_column
|
@@ -1716,13 +1837,14 @@ def reduce pattern=nil
|
|
1716
1837
|
pattern = gets.chomp
|
1717
1838
|
end
|
1718
1839
|
$title = "Filter: pattern #{pattern}"
|
1719
|
-
$files = $files.select {|f| f.match(pattern)}
|
1840
|
+
$files = $files.select { |f| f.match(pattern) }
|
1720
1841
|
end
|
1721
1842
|
|
1722
1843
|
def filter_for_current_extension
|
1723
1844
|
extn = File.extname(current_file)
|
1724
1845
|
return unless extn
|
1725
|
-
|
1846
|
+
|
1847
|
+
$files = $files.select { |f| !File.directory?(f) && extn == File.extname(f) }
|
1726
1848
|
end
|
1727
1849
|
|
1728
1850
|
def select_from_used_dirs
|
@@ -1838,7 +1960,7 @@ def create_bookmark
|
|
1838
1960
|
# print "\e[?25l" # hide cursor
|
1839
1961
|
if key =~ /^[0-9A-Z]$/
|
1840
1962
|
# $bookmarks[key] = "#{Dir.pwd}:#{$cursor}"
|
1841
|
-
|
1963
|
+
set_bookmark key
|
1842
1964
|
$modified = true
|
1843
1965
|
message "Created bookmark #{key}"
|
1844
1966
|
else
|
@@ -1927,7 +2049,6 @@ def child_dirs
|
|
1927
2049
|
$title = 'Directories in current directory'
|
1928
2050
|
# M is MARK_DIRS option for putting trailing slash after dir
|
1929
2051
|
# $files = `zsh -c 'print -rl -- *(/#{$sorto}#{$hidden}M)'`.split("\n")
|
1930
|
-
# $files = Dir.glob("*", File::FNM_DOTMATCH).select {|f| File.directory?(f)} - %w[ . ..]
|
1931
2052
|
$files = dirs
|
1932
2053
|
message "#{$files.size} directories."
|
1933
2054
|
# redraw
|
@@ -1999,7 +2120,7 @@ end
|
|
1999
2120
|
# This is supposed to print on the status line
|
2000
2121
|
# but prints on next line.FIXME 2019-03-24 - 00:08
|
2001
2122
|
def perror text
|
2002
|
-
|
2123
|
+
clear_last_line
|
2003
2124
|
last_line
|
2004
2125
|
print "#{RED}#{text}. Press a key.#{CLEAR}"
|
2005
2126
|
get_char
|
@@ -2011,15 +2132,25 @@ def pause text=' Press a key.'
|
|
2011
2132
|
get_char
|
2012
2133
|
end
|
2013
2134
|
|
2014
|
-
## return shortcut for an index (offset in file array)
|
2015
|
-
#
|
2016
|
-
|
2017
|
-
# Also, display ROWS * COLS so now we are not limited to 60.
|
2018
|
-
def get_shortcut(ix)
|
2019
|
-
return '<' if ix < $stact
|
2135
|
+
## return shortcut/hint for an index (offset in file array)
|
2136
|
+
# ix is the index of a file in the complete array (view)
|
2137
|
+
def get_shortcut index
|
2020
2138
|
|
2021
|
-
|
2022
|
-
|
2139
|
+
# Case where user has panned to the right columns:
|
2140
|
+
# Earlier, we showed '<' in left columns, if user has panned right.
|
2141
|
+
# Now we show unused shortcuts after exhausting them.
|
2142
|
+
# return '<' if index < $stact
|
2143
|
+
if index < $stact
|
2144
|
+
index = $viewport.size - $stact + index
|
2145
|
+
i = $IDX[index]
|
2146
|
+
return i if i
|
2147
|
+
|
2148
|
+
return '['
|
2149
|
+
end
|
2150
|
+
|
2151
|
+
# Normal case (user has not panned columns)
|
2152
|
+
index -= $stact
|
2153
|
+
i = $IDX[index]
|
2023
2154
|
return i if i
|
2024
2155
|
|
2025
2156
|
'->'
|
@@ -2030,18 +2161,44 @@ end
|
|
2030
2161
|
# should we even ask for a second key if there are not enough rows
|
2031
2162
|
# What if we want to also trap z with numbers for other purposes
|
2032
2163
|
def get_index(key, vsz = 999)
|
2033
|
-
|
2034
|
-
|
2164
|
+
# @log.debug "Etners get_index with #{key}"
|
2165
|
+
i = convert_key_to_index key
|
2166
|
+
return i if i
|
2035
2167
|
|
2036
|
-
# sz = $IDX.size
|
2037
|
-
zch = nil
|
2038
2168
|
if vsz > 25
|
2039
2169
|
if key == 'z' || key == 'Z'
|
2170
|
+
last_line
|
2040
2171
|
print key
|
2041
2172
|
zch = get_char
|
2042
2173
|
print zch
|
2043
|
-
i =
|
2044
|
-
|
2174
|
+
i = convert_key_to_index("#{key}#{zch}")
|
2175
|
+
@log.debug "convert returned #{i} for #{key}#{zch}"
|
2176
|
+
return i if i
|
2177
|
+
# i = $IDX.index
|
2178
|
+
# return i + $stact if i
|
2179
|
+
end
|
2180
|
+
end
|
2181
|
+
nil
|
2182
|
+
end
|
2183
|
+
|
2184
|
+
# convert pressed key to an index in viewport.
|
2185
|
+
# Earlier this was simple, but now that we put hints/shortcuts
|
2186
|
+
# in rows on the left after panning, we need to account for cycled hints.
|
2187
|
+
def convert_key_to_index key
|
2188
|
+
i = $IDX.index(key)
|
2189
|
+
if i
|
2190
|
+
# @log.debug "get_index with #{key}: #{i}. #{$stact}. #{$viewport.size}"
|
2191
|
+
vps = $viewport.size
|
2192
|
+
return nil if $stact == 0 && i + $stact >= vps
|
2193
|
+
# return nil if $stact > 0 && i + $stact >= vps && i + $stact - vps >= $stact
|
2194
|
+
return nil if $stact > 0 && i + $stact >= vps && i - vps >= 0
|
2195
|
+
|
2196
|
+
if i + $stact >= vps
|
2197
|
+
# panning case, hints are recycled
|
2198
|
+
return (i + $stact) - vps
|
2199
|
+
else
|
2200
|
+
# regular hint
|
2201
|
+
return i + $stact #if i
|
2045
2202
|
end
|
2046
2203
|
end
|
2047
2204
|
nil
|
@@ -2196,7 +2353,7 @@ def file_actions(action = nil)
|
|
2196
2353
|
view_selected_files if key == '?'
|
2197
2354
|
return if key != 'y'
|
2198
2355
|
|
2199
|
-
|
2356
|
+
clear_last_line
|
2200
2357
|
print "\r deleting ..."
|
2201
2358
|
system "#{delcommand} #{files}"
|
2202
2359
|
refresh
|
@@ -2427,26 +2584,13 @@ def locate
|
|
2427
2584
|
# redraw
|
2428
2585
|
end
|
2429
2586
|
|
2430
|
-
## Displays files from .viminfo file, if you use some other editor which
|
2431
|
-
# tracks files opened then you can modify this accordingly.
|
2432
|
-
# Neovim does not use viminfo
|
2433
|
-
#
|
2434
|
-
def viminfo
|
2435
|
-
file = File.expand_path('~/.viminfo')
|
2436
|
-
return unless File.exist? file
|
2437
|
-
$title = 'Files from ~/.viminfo'
|
2438
|
-
# $files = `grep '^>' ~/.viminfo | cut -d ' ' -f 2- | sed "s#~#$HOME#g"`.split("\n")
|
2439
|
-
$files = `grep '^>' ~/.viminfo | cut -d ' ' -f 2- `.split("\n")
|
2440
|
-
$files.select! { |x| x = File.expand_path(x); File.exist?(x) }
|
2441
|
-
# redraw
|
2442
|
-
end
|
2443
|
-
|
2444
2587
|
## takes directories from the z program, if you use autojump you can
|
2445
2588
|
# modify this accordingly
|
2446
2589
|
#
|
2447
2590
|
def z_interface
|
2448
2591
|
file = File.expand_path('~/.z')
|
2449
2592
|
return unless File.exist? file
|
2593
|
+
|
2450
2594
|
$title = 'Directories from ~/.z'
|
2451
2595
|
$files = `sort -rn -k2 -t '|' ~/.z | cut -f1 -d '|'`.split("\n")
|
2452
2596
|
home = ENV['HOME']
|
@@ -2462,7 +2606,9 @@ def vidir
|
|
2462
2606
|
setup_terminal
|
2463
2607
|
end
|
2464
2608
|
|
2465
|
-
|
2609
|
+
# ------------- movement related methods --------------------------------#
|
2610
|
+
|
2611
|
+
## scroll cursor down
|
2466
2612
|
def cursor_scroll_dn
|
2467
2613
|
moveto(pos + MSCROLL)
|
2468
2614
|
end
|
@@ -2471,6 +2617,7 @@ def cursor_scroll_up
|
|
2471
2617
|
moveto(pos - MSCROLL)
|
2472
2618
|
end
|
2473
2619
|
|
2620
|
+
# move cursor down a line
|
2474
2621
|
def cursor_dn
|
2475
2622
|
$movement = true
|
2476
2623
|
$old_cursor = $cursor
|
@@ -2483,6 +2630,7 @@ def cursor_up
|
|
2483
2630
|
moveto(pos - 1)
|
2484
2631
|
end
|
2485
2632
|
|
2633
|
+
# return cursor position
|
2486
2634
|
def pos
|
2487
2635
|
$cursor
|
2488
2636
|
end
|
@@ -2514,6 +2662,8 @@ def moveto(position)
|
|
2514
2662
|
fin = [orig, $cursor].max
|
2515
2663
|
return unless $visual_mode
|
2516
2664
|
|
2665
|
+
$movement = nil # visual mode needs to redraw page
|
2666
|
+
|
2517
2667
|
# PWD has to be there in selction
|
2518
2668
|
if selected? current_file
|
2519
2669
|
# this depends on the direction
|
@@ -2528,21 +2678,25 @@ def moveto(position)
|
|
2528
2678
|
# ensure
|
2529
2679
|
# redraw
|
2530
2680
|
end
|
2681
|
+
# --
|
2531
2682
|
|
2532
2683
|
# is given file in selected array
|
2533
|
-
def
|
2684
|
+
def visited?(file)
|
2534
2685
|
$current_dir ||= Dir.pwd
|
2535
2686
|
file = File.join($current_dir, file)
|
2536
|
-
return $
|
2687
|
+
return $visited_files.index file
|
2537
2688
|
end
|
2538
2689
|
|
2690
|
+
# ------------- selection related methods --------------------------------#
|
2691
|
+
|
2539
2692
|
# is given file in selected array
|
2540
|
-
def
|
2693
|
+
def selected?(file)
|
2541
2694
|
$current_dir ||= Dir.pwd
|
2542
2695
|
file = File.join($current_dir, file)
|
2543
|
-
return $
|
2696
|
+
return $selected_files.index file
|
2544
2697
|
end
|
2545
2698
|
|
2699
|
+
# add given file/s to selected file list
|
2546
2700
|
def add_to_selection(file)
|
2547
2701
|
ff = file
|
2548
2702
|
case file
|
@@ -2569,6 +2723,7 @@ def remove_from_selection(file)
|
|
2569
2723
|
end
|
2570
2724
|
end
|
2571
2725
|
|
2726
|
+
# ------------- visual mode methods --------------------------------#
|
2572
2727
|
def visual_mode_toggle
|
2573
2728
|
$mode = nil
|
2574
2729
|
$visual_mode = !$visual_mode
|
@@ -2577,6 +2732,7 @@ def visual_mode_toggle
|
|
2577
2732
|
$visual_block_start = $cursor
|
2578
2733
|
add_to_selection current_file
|
2579
2734
|
end
|
2735
|
+
message "Visual mode is #{$visual_mode}"
|
2580
2736
|
end
|
2581
2737
|
|
2582
2738
|
def visual_block_clear
|
@@ -2589,7 +2745,11 @@ def visual_block_clear
|
|
2589
2745
|
$visual_mode = nil
|
2590
2746
|
end
|
2591
2747
|
|
2592
|
-
|
2748
|
+
# ------------- file matching methods --------------------------------#
|
2749
|
+
# this is a bit silly because it only works with lower case chars, we
|
2750
|
+
# cannot get to files starting with numbers or uppercase since it is not
|
2751
|
+
# called in those cases !!
|
2752
|
+
def file_starting_with first_char
|
2593
2753
|
ix = return_next_match(method(:file_matching?), "^#{first_char}")
|
2594
2754
|
goto_line ix if ix
|
2595
2755
|
end
|
@@ -2619,13 +2779,14 @@ end
|
|
2619
2779
|
##
|
2620
2780
|
# position cursor on a specific line which could be on a nother page
|
2621
2781
|
# therefore calculate the correct start offset of the display also.
|
2622
|
-
def goto_line
|
2782
|
+
def goto_line pos
|
2623
2783
|
pages = ((pos * 1.00) / $pagesize).ceil
|
2624
2784
|
pages -= 1
|
2625
2785
|
$sta = pages * $pagesize + 1
|
2626
2786
|
$cursor = pos
|
2627
2787
|
end
|
2628
2788
|
|
2789
|
+
# ---
|
2629
2790
|
def filetype(f)
|
2630
2791
|
return nil unless f
|
2631
2792
|
|
@@ -2668,9 +2829,7 @@ def revert_dir_pos
|
|
2668
2829
|
end
|
2669
2830
|
|
2670
2831
|
def create_a_dir
|
2671
|
-
|
2672
|
-
print 'Enter directory name: '
|
2673
|
-
str = readline
|
2832
|
+
str = readline 'Enter directory name: '
|
2674
2833
|
return if str == ''
|
2675
2834
|
|
2676
2835
|
if File.exist? str
|
@@ -2687,9 +2846,7 @@ def create_a_dir
|
|
2687
2846
|
end
|
2688
2847
|
|
2689
2848
|
def create_a_file
|
2690
|
-
|
2691
|
-
print 'Enter file name: '
|
2692
|
-
str = readline
|
2849
|
+
str = readline 'Enter file name: '
|
2693
2850
|
return if str.nil? || str == ''
|
2694
2851
|
|
2695
2852
|
system %($EDITOR "#{str}")
|
@@ -2710,47 +2867,84 @@ def current_or_selected_files
|
|
2710
2867
|
end
|
2711
2868
|
|
2712
2869
|
# ------------------- scripts ------------------ #
|
2713
|
-
# prompt for scripts to execute, giving
|
2714
|
-
# NOTE: TODO 2019-03-21 - some scripts can output a filelist to display
|
2870
|
+
# prompt for scripts to execute, giving file name under cursor
|
2715
2871
|
def scripts
|
2716
|
-
write_selected_files
|
2717
2872
|
# some scripts may work with the selected_files and not want to be called
|
2718
2873
|
# with filenames.
|
2874
|
+
write_selected_files
|
2875
|
+
|
2719
2876
|
title = 'Select a script'
|
2720
2877
|
script_path = '~/.config/cetus/scripts'
|
2721
|
-
|
2722
|
-
|
2723
|
-
return unless binding
|
2878
|
+
binding = `find #{script_path} -type f | fzf --prompt="#{title} :"`.chomp
|
2879
|
+
return if binding.nil? || binding == ''
|
2724
2880
|
|
2725
|
-
binding = binding.chomp if binding
|
2726
2881
|
# TODO: check if binding is a file and executable
|
2727
2882
|
# xargs only seems to take the first file
|
2728
2883
|
# cf = current_or_selected_files.join('\0')
|
2729
2884
|
# cf = Shellwords.join(current_or_selected_files)
|
2730
|
-
|
2731
|
-
|
2732
|
-
|
2885
|
+
# This was getting called repeatedly even if script used selected_files
|
2886
|
+
# current_or_selected_files.each do |file|
|
2887
|
+
# system %( #{binding} "#{file}" )
|
2888
|
+
# end
|
2889
|
+
|
2890
|
+
# 2019-04-08 - to avoid confusion, we pass name of file under cursor
|
2891
|
+
# script may ignore this and use selected_files
|
2892
|
+
system %( #{binding} "#{current_file}" )
|
2893
|
+
|
2733
2894
|
# system %(echo "#{cf}" | xargs #{binding})
|
2734
2895
|
pause
|
2896
|
+
redraw_required
|
2897
|
+
end
|
2898
|
+
|
2899
|
+
# allow user to select a script that generates filenames which
|
2900
|
+
# will be displayed for selection or action.
|
2901
|
+
def generators
|
2902
|
+
write_selected_files
|
2903
|
+
|
2904
|
+
title = 'Select a generator'
|
2905
|
+
script_path = '~/.config/cetus/generators'
|
2906
|
+
binding = `find #{script_path} -type f | fzf --prompt="#{title} :"`.chomp
|
2907
|
+
return if binding.nil? || binding == ''
|
2908
|
+
|
2909
|
+
# call generator and accept list of files
|
2910
|
+
$title = "Files from #{File.basename(binding)}"
|
2911
|
+
$files = `#{binding} "#{current_file}"`.split("\n")
|
2912
|
+
|
2735
2913
|
end
|
2736
2914
|
# ------------- end of scripts --------------------------------#
|
2737
2915
|
|
2738
2916
|
# ------------------- view_selected_files ------------------ #
|
2739
2917
|
def view_selected_files
|
2740
2918
|
fname = write_selected_files
|
2919
|
+
|
2920
|
+
unless fname
|
2921
|
+
message "No file selected. "
|
2922
|
+
return
|
2923
|
+
end
|
2924
|
+
|
2741
2925
|
system "$PAGER #{fname}"
|
2742
2926
|
setup_terminal
|
2743
2927
|
end
|
2744
2928
|
# ------------- end of view_selected_files --------------------------------#
|
2745
2929
|
|
2746
2930
|
# write selected files to a file and return path
|
2931
|
+
# if no selected files then blank out the file, or else
|
2932
|
+
# script could use old selection again.
|
2747
2933
|
def write_selected_files
|
2934
|
+
|
2748
2935
|
fname = File.join(File.dirname(CONFIG_FILE), 'selected_files')
|
2749
2936
|
fname = File.expand_path(fname)
|
2750
2937
|
|
2938
|
+
# remove file if no selection
|
2939
|
+
unless $selected_files
|
2940
|
+
File.unlink(fname)
|
2941
|
+
return nil
|
2942
|
+
end
|
2943
|
+
|
2751
2944
|
File.open(fname, 'w') do |file|
|
2752
2945
|
$selected_files.each { |row| file.puts row }
|
2753
2946
|
end
|
2947
|
+
|
2754
2948
|
return fname
|
2755
2949
|
end
|
2756
2950
|
##
|
@@ -3031,7 +3225,9 @@ def gfb dir, func
|
|
3031
3225
|
# File.directory?(f) ? f + '/' : f
|
3032
3226
|
# end
|
3033
3227
|
end
|
3228
|
+
|
3034
3229
|
# set message which will be displayed in status line
|
3230
|
+
# TODO: maybe we should pad it 2019-04-08 -
|
3035
3231
|
def message mess
|
3036
3232
|
$message = mess
|
3037
3233
|
end
|
@@ -3042,22 +3238,34 @@ def last_line
|
|
3042
3238
|
tput_cup $glines, 0
|
3043
3239
|
end
|
3044
3240
|
|
3045
|
-
def
|
3241
|
+
def clear_last_line
|
3046
3242
|
last_line
|
3047
3243
|
# print a colored line at bottom of screen
|
3048
3244
|
# \e[33;41m - set color of status_line
|
3049
3245
|
# %*s - set blank spaces for entire line
|
3050
|
-
|
3246
|
+
# \e[m - reset text mode
|
3247
|
+
print "\e[33;4%sm%*s\e[m" % [$status_color || '1', $gcols, " "]
|
3051
3248
|
end
|
3052
3249
|
|
3250
|
+
# print right aligned
|
3251
|
+
# FIXME: if text longer then width then does not print
|
3053
3252
|
def print_on_right text
|
3054
3253
|
sz = text.size
|
3055
|
-
|
3254
|
+
col = $gcols - sz - 1
|
3255
|
+
col = 2 if col < 2
|
3256
|
+
if sz > $gcols - 2
|
3257
|
+
text = text[0..$gcols-3]
|
3258
|
+
end
|
3259
|
+
# system "tput cup #{$glines} #{$gcols - sz - 1}"
|
3260
|
+
system "tput cup #{$glines} #{col}"
|
3056
3261
|
# tput_cup $glines, $gcols - sz - 1
|
3057
|
-
print text
|
3262
|
+
# print text
|
3263
|
+
print "\e[33;4#{$status_color}m#{text}\e[m"
|
3058
3264
|
end
|
3059
3265
|
|
3266
|
+
# unused, should set bgcolor before printing
|
3060
3267
|
def print_last_line text
|
3268
|
+
# unused ??
|
3061
3269
|
last_line
|
3062
3270
|
print text
|
3063
3271
|
end
|
@@ -3073,6 +3281,7 @@ def run
|
|
3073
3281
|
setup_terminal
|
3074
3282
|
config_read
|
3075
3283
|
parse_ls_colors
|
3284
|
+
set_bookmark '0'
|
3076
3285
|
|
3077
3286
|
redraw true
|
3078
3287
|
place_cursor
|
@@ -3085,15 +3294,26 @@ def run
|
|
3085
3294
|
loop do
|
3086
3295
|
|
3087
3296
|
key = get_char
|
3088
|
-
|
3297
|
+
|
3298
|
+
unless resolve_key key # key did not map to file name, so don't redraw
|
3299
|
+
place_cursor
|
3300
|
+
next
|
3301
|
+
end
|
3302
|
+
|
3303
|
+
# only movement has happened within this page, don't redraw
|
3089
3304
|
if $movement && $old_cursor
|
3090
|
-
|
3091
|
-
print_debug_info if @debug_flag
|
3305
|
+
|
3092
3306
|
# we may want to print debug info if flag is on
|
3307
|
+
if @debug_flag
|
3308
|
+
clear_last_line
|
3309
|
+
print_debug_info
|
3310
|
+
end
|
3311
|
+
|
3093
3312
|
place_cursor
|
3094
3313
|
$movement = false
|
3095
3314
|
next
|
3096
3315
|
end
|
3316
|
+
|
3097
3317
|
redraw rescan?
|
3098
3318
|
place_cursor
|
3099
3319
|
|
data/cetus.gemspec
CHANGED
@@ -6,7 +6,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
8
|
spec.name = 'cetus'
|
9
|
-
spec.version = '0.1.
|
9
|
+
spec.version = '0.1.33'
|
10
10
|
spec.authors = ['Rahul Kumar']
|
11
11
|
spec.email = ['oneness.univ@gmail.com']
|
12
12
|
spec.description = %q{lightning fast file navigator}
|
data/generators/viminfo
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
## Displays files from .viminfo file, if you use some other editor which
|
3
|
+
# tracks files opened then you can modify this accordingly.
|
4
|
+
# Neovim does not use viminfo
|
5
|
+
file = File.expand_path('~/.viminfo')
|
6
|
+
return unless File.exist? file
|
7
|
+
files = `grep '^>' ~/.viminfo | cut -d ' ' -f 2- `.split("\n")
|
8
|
+
files.select! { |x| x = File.expand_path(x); File.exist?(x) }
|
9
|
+
files.each { |f| puts f }
|
data/generators/z
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# testing z interface
|
4
|
+
|
5
|
+
file = File.expand_path('~/.z')
|
6
|
+
return unless File.exist? file
|
7
|
+
|
8
|
+
# $title = 'Directories from ~/.z'
|
9
|
+
files = `sort -rn -k2 -t '|' ~/.z | cut -f1 -d '|'`.split("\n")
|
10
|
+
home = ENV['HOME']
|
11
|
+
# shorten file names
|
12
|
+
files.collect! do |f|
|
13
|
+
f.sub(/#{home}/, '~')
|
14
|
+
end
|
15
|
+
files.each { |f| puts f }
|
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.33
|
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-04-
|
11
|
+
date: 2019-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,6 +53,8 @@ files:
|
|
53
53
|
- Rakefile
|
54
54
|
- bin/cetus
|
55
55
|
- cetus.gemspec
|
56
|
+
- generators/viminfo
|
57
|
+
- generators/z
|
56
58
|
homepage: http://github.com/rkumar/cetus
|
57
59
|
licenses:
|
58
60
|
- MIT
|