cetus 0.1.39 → 0.1.41

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 501ef34e9afd0b98b8cfda66aa5c98fb46d6529f507e95c18951833edc467a0f
4
- data.tar.gz: 722a4926a42bd426cfac568b2166c041b6a4dda63939e04ea5b6e5c2f3127de6
3
+ metadata.gz: e0318abcc4c63333edf5206aa2437530ca07c4379cc4887e1634535db8d86d1b
4
+ data.tar.gz: 526dab38dce30caba04507bd473eddfadd308a4cea301278dc79826daffa6eb4
5
5
  SHA512:
6
- metadata.gz: b19bc7bbf440a8c9df34165c35e5b19134e9b3e3023e348e8eec52a770e784359ca02b7d8618d3b311b9bb802676f252274c8fe8e228a1ddf825fd0016a438eb
7
- data.tar.gz: 41ad81c2cda30e5a20cc35ea22d4ec0e96630d3e907053713f733d3d61b6ba0fb42a6d9e1de8e367733aeca8a26cb2465f5af3dd7e1848a79cc8a78027640881
6
+ metadata.gz: ab77bcbf1fc65397d1bc3afa2729b37bb60a7929468cc1d50eaebd1ac94a66c322e01f18dd8342f723d386dc319e935dfb9e5672c7722ce60a071a331ccec8c0
7
+ data.tar.gz: 83ff786fd0130ccd8417b4ab14a4a0c96f7801b20c376670fa905911e8032d2a1feb292a7a82254abf967d0f20c7e9445200f60c9a0e833347d0beb793c59b57
data/bin/cetus CHANGED
@@ -8,7 +8,7 @@
8
8
  # Author: rkumar http://github.com/rkumar/cetus/
9
9
  # Date: 2013-02-17 - 17:48
10
10
  # License: GPL
11
- # Last update: 2019-04-21 23:46
11
+ # Last update: 2019-04-22 12:37
12
12
  # --------------------------------------------------------------------------- #
13
13
  # cetus.rb Copyright (C) 2012-2019 rahul kumar
14
14
  # == CHANGELOG
@@ -20,6 +20,7 @@
20
20
  # 2019-03-04 - first dirs then files
21
21
  # 2019-03-22 - refactoring the code, esp run()
22
22
  # 2019-04-21 - search_as_you_type
23
+ # 2019-04-22 - new search_as_you_type
23
24
  # == TODO
24
25
 
25
26
  require 'readline'
@@ -39,7 +40,7 @@ now = Time.now.strftime("%Y-%m-%d %H:%M:%S")
39
40
  # alias c=~/bin/cetus.rb
40
41
  # c
41
42
 
42
- VERSION = '0.1.39.0'
43
+ VERSION = '0.1.41.0'
43
44
  CONFIG_PATH = ENV['XDG_CONFIG_HOME'] || File.join(ENV['HOME'], '.config')
44
45
  CONFIG_FILE = "#{CONFIG_PATH}/cetus/conf.yml"
45
46
 
@@ -338,7 +339,7 @@ PAGER_COMMAND = {
338
339
  @cursor_movement = @old_cursor = nil # cursor movement has happened only, don't repaint
339
340
  ## FLAGS
340
341
  @multiple_selection = true # single select
341
- @group_dirs = true
342
+ @group_directories = :first
342
343
  # truncate long filenames from :right, :left or :center.
343
344
  @truncate_from = :center
344
345
  @filename_status_line = true
@@ -346,6 +347,7 @@ PAGER_COMMAND = {
346
347
  @selected_files_fullpath_flag = false
347
348
  @selected_files_escaped_flag = false
348
349
  @keys_to_clear = nil
350
+ @ignore_case = true
349
351
 
350
352
  # See toggle_value
351
353
  # we need to set these on startup
@@ -365,16 +367,10 @@ PAGER_COMMAND = {
365
367
  toggle_filename_status_line: true,
366
368
  instant_search: true
367
369
  }
368
- # @cycles = { truncate_from: :center,
369
- # show_hidden: nil }
370
- # @enums = {
371
- # truncate_from: %i[left right center],
372
- # show_hidden: [nil, 'D']
373
- # }
374
370
  # var is name of variable to be set
375
371
  @options = {
376
372
  truncate_from: { current: :center, values: %i[left right center], var: :truncate_from },
377
- group_directories: { current: :first, values: %i[first none last] },
373
+ group_directories: { current: :first, values: %i[first none last], var: :group_directories },
378
374
  show_hidden: { current: nil, values: [nil, 'D'], var: :hidden }
379
375
  }
380
376
 
@@ -458,19 +454,12 @@ CURSOR_COLOR = REVERSE
458
454
  def read_directory
459
455
  rescan_required false
460
456
 
461
- # http://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html
462
- # zsh print -rl
463
- # -l Print the arguments separated by newlines instead of spaces.
464
- # -r Ignore the escape conventions of echo.
465
- # zshglob M = MARK_DIRS
466
-
467
457
  @filterstr ||= 'M' # XXX can we remove from here
468
- # @files = `zsh -c 'print -rl -- *(#{@sorto}#{@hidden}#{@filterstr})'`.split("\n")
469
- # @files = list_files
470
458
  list_files
471
- # @files = group_directories_first(@files) if @toggles[:group_directories]
459
+
472
460
  group_directories_first
473
- return unless cget(:enhanced_mode)
461
+ # return unless cget(:enhanced_mode)
462
+ return unless @enhanced_mode
474
463
 
475
464
  enhance_file_list
476
465
  @files = @files.uniq
@@ -478,6 +467,7 @@ end
478
467
 
479
468
  # return a list of directory contents sorted as per sort order
480
469
  # NOTE: FNM_CASEFOLD does not work with Dir.glob
470
+ # XXX _filter unused.
481
471
  def list_files dir='*', sorto=@sorto, hidden=@hidden, _filter=@filterstr
482
472
  dir += '/*' if File.directory?(dir)
483
473
  dir = dir.gsub('//', '/')
@@ -520,7 +510,7 @@ def list_files dir='*', sorto=@sorto, hidden=@hidden, _filter=@filterstr
520
510
  end
521
511
  end
522
512
 
523
- sorted_files.sort! { |w1, w2| w1.casecmp(w2) } if func == :path && cget(:ignore_case)
513
+ sorted_files.sort! { |w1, w2| w1.casecmp(w2) } if func == :path && @ignore_case
524
514
 
525
515
  # zsh gives mtime sort with latest first, ruby gives latest last
526
516
  sorted_files.reverse! if sorto[0] == 'O'
@@ -545,7 +535,8 @@ end
545
535
  # ------------------- create_viewport ------------------ #
546
536
  def create_viewport
547
537
  @view = if @patt
548
- if cget(:ignore_case)
538
+ # if cget(:ignore_case)
539
+ if @ignore_case
549
540
  @files.grep(/#{@patt}/i)
550
541
  else
551
542
  @files.grep(/#{@patt}/)
@@ -584,7 +575,8 @@ def print_title
584
575
  fl = @view.size
585
576
 
586
577
  # fix count of entries so separator and enhanced entries don't show up
587
- if cget(:enhanced_mode)
578
+ # if cget(:enhanced_mode)
579
+ if @enhanced_mode
588
580
  ix = @viewport.index SEPARATOR
589
581
  fin = @sta + ix if ix
590
582
 
@@ -610,15 +602,15 @@ def status_line
610
602
  # prompt
611
603
  v_mm = @mode ? "[#{@mode}] " : ''
612
604
  cf = current_file
613
- @message = ' | No matches. Press ESCAPE' if @patt && !cf
605
+ @message = " | No matches. Press ESCAPE " if @patt && !cf
614
606
 
615
607
  clear_last_line
616
608
 
617
609
  # Print the filename at the right side of the status line
618
610
  # sometimes due to search, there is no file
619
611
  if cf
620
- if cget(:debug_flag)
621
- # XXX this will not work on file basis FIXME
612
+ # if cget(:debug_flag)
613
+ if @debug_flag
622
614
  print_debug_info cf
623
615
  else
624
616
  # print_on_right "#{Dir.pwd}"
@@ -629,7 +621,8 @@ def status_line
629
621
  # patt and message are together, no gap, why not ? 2019-04-08 -
630
622
  if @patt && @patt != ''
631
623
  patt = "[/#{@patt}" + ']' # to get unfrozen string
632
- patt[-1] = '/i]' if cget(:ignore_case)
624
+ # patt[-1] = '/i]' if cget(:ignore_case)
625
+ patt[-1] = '/i]' if @ignore_case
633
626
  end
634
627
  # bring cursor to start of line
635
628
  # add background color
@@ -758,30 +751,27 @@ def tput_cup row, col
758
751
  print "\e[#{row + 3};#{col + 1}H"
759
752
  end
760
753
 
761
- # FIXME flag is unused ???? XXX
762
754
  def redraw_required flag=true
763
755
  @redraw_required = flag
764
756
  end
765
757
 
758
+ # return value determines if screen is redrawn or not.
766
759
  def resolve_key key
767
- ret = true
768
760
  clear_message
769
761
 
770
- return true if search_as_you_type(key)
762
+ # hint mode, pick file based on shortcut
763
+ return select_hint(@viewport, key) if key.match?(/^[a-pr-zZ]$/)
771
764
 
772
- if key.match?(/^[a-pr-zZ]$/)
773
- # hint mode
774
- ret = select_hint @viewport, key
765
+ if '0123456789'.include?(key)
766
+ resolve_numeric_key(key)
775
767
  elsif key == 'BACKSPACE'
776
768
  @patt = @patt[0..-2] if @patt && !@patt.empty?
777
769
  @message = @patt = nil if @patt == ''
778
770
  @title = nil unless @patt
779
- elsif '0123456789'.include? key
780
- resolve_numeric_key key
781
771
  else
782
772
  resolve_binding key
783
773
  end
784
- ret
774
+ true
785
775
  end
786
776
 
787
777
  def resolve_binding key
@@ -816,68 +806,39 @@ def resolve_numeric_key key
816
806
  message "Created bookmark #{key}."
817
807
  end
818
808
 
819
- IGNORE_KEY = true
820
- PROCESS_KEY = false
821
-
822
- # Display search results as user types search pattern.
823
- # returning false allows these keys to be processed
824
- # returning true means that these keys will be ignored
825
- def search_as_you_type key
826
- return false unless @searching
827
-
828
- # @log.info "sayt: #{key}, patt: #{@patt}"
829
-
830
- # escape should nil patt and come out of search.
831
- if key == 'ESCAPE'
832
- exit_search
833
- return IGNORE_KEY
834
- end
835
-
836
- # We exit the search but screen shows search results.
837
- if key == 'ENTER' # || key == 'TAB'
838
- @searching = false
839
- redraw_required true # ??? any effect ?
840
- @mode = 'NORM'
841
- # nilifying patt means we will not see searched results. we want to stay there.
842
- @title = 'Search Results (ESCAPE to return)'
843
- message ' '
844
- status_line
845
- return IGNORE_KEY
846
- end
809
+ # v2 if search_as_you_type which takes keyboard control
810
+ # This is fairly straightforward and took only a few minutes to get done.
811
+ # return value is not used.
812
+ def search_as_you_type
847
813
 
848
- if key == 'BACKSPACE' && @patt
849
- @patt = @patt[0..-2]
850
- exit_search if @patt == ''
851
- return IGNORE_KEY
852
- end
853
-
854
- # XXX should not changing directory cancel the search ?
855
- if key == 'UP' || key == 'DOWN' || key == 'RIGHT' || key == 'LEFT'
856
- return PROCESS_KEY
857
- end
858
-
859
- # if key is not one of allowed keys, then cancel the search.
860
- # No, we allow it as in toggle or menu ?
861
- unless key.match?(/^[a-zA-Z0-9\. _]$/)
862
- # exit_search
863
- # @mode = @title = nil
864
- # redraw_required true
865
- return PROCESS_KEY
814
+ @patt = '' + '' # rubocop suggestion to get unfrozen string
815
+ @title = 'Search Results (ENTER to return, ESC to cancel)'
816
+ clear_last_line
817
+ print "\r/"
818
+ loop do
819
+ key = get_char
820
+ if key == 'ENTER'
821
+ @title = 'Search Results (ESCAPE to return)'
822
+ return true
823
+ elsif key == 'ESCAPE'
824
+ @mode = @title = @patt = nil
825
+ status_line
826
+ return false
827
+ elsif key == 'BACKSPACE'
828
+ @patt = @patt[0..-2]
829
+ @message = nil # remove pesky ESCAPE message
830
+ elsif key.match?(/^[a-zA-Z0-9\. _]$/)
831
+ @patt += key if @patt
832
+ else
833
+ resolve_key key
834
+ @mode = @title = nil
835
+ # if directory changes, then patt is nilled causing error above
836
+ return true
837
+ end
838
+ # XXX is rescan required ?
839
+ draw_directory
840
+ place_cursor
866
841
  end
867
-
868
- @mode = 'INST'
869
- @title = 'Search results: Use ENTER to return, ESCAPE to cancel.'
870
- @patt ||= '' + '' # rubocop suggestion to get unfrozen string
871
- @patt += key
872
- message "> #{@patt} "
873
- redraw_required true
874
-
875
- return IGNORE_KEY
876
- end
877
-
878
- def exit_search
879
- @searching = @mode = @title = @patt = nil
880
- status_line
881
842
  end
882
843
 
883
844
  def set_bookmark key, dir=Dir.pwd
@@ -1416,7 +1377,6 @@ def escape
1416
1377
  @viewctr = 0
1417
1378
  @title = nil
1418
1379
  @filterstr = 'M'
1419
- @searching = false
1420
1380
  @message = nil
1421
1381
  @mode = nil
1422
1382
  visual_block_clear
@@ -1433,13 +1393,14 @@ end
1433
1393
 
1434
1394
  # put directories first, then files
1435
1395
  def group_directories_first
1436
- return if cget(:group_directories) == :none
1396
+ # return if cget(:group_directories) == :none
1397
+ return if @group_directories == :none
1437
1398
 
1438
1399
  files = @files
1439
1400
  dirs = files.select { |f| File.directory?(f) }
1440
1401
  # earlier I had File? which removed links, esp dead ones
1441
1402
  fi = files.reject { |f| File.directory?(f) }
1442
- @files = if cget(:group_directories) == :first
1403
+ @files = if @group_directories == :first
1443
1404
  dirs + fi
1444
1405
  else
1445
1406
  fi + dirs
@@ -1549,20 +1510,13 @@ end
1549
1510
 
1550
1511
  ## take regex from user, to run on files on screen, user can filter file names
1551
1512
  def ask_regex
1552
- unless cget(:instant_search)
1553
- @log.info "Inside ask_regex readline."
1513
+ @title = 'Search Results: (Press Escape to cancel)'
1514
+ @mode = 'SEARCH'
1515
+ if cget(:instant_search)
1516
+ search_as_you_type
1517
+ else
1554
1518
  @patt = readline '/'
1555
- @title = 'Search Results: (Press Escape to return)'
1556
- @mode = 'SEARCH'
1557
- return
1558
1519
  end
1559
-
1560
- # this is the instant search as you type thingie
1561
- @patt = nil
1562
- @log.info "Inside ask_regex instant."
1563
- message 'I/'
1564
- @searching = true
1565
- status_line
1566
1520
  end
1567
1521
 
1568
1522
  # page/scroll down.
@@ -1600,11 +1554,12 @@ def print_help
1600
1554
  file.puts ' HELP'
1601
1555
 
1602
1556
  file.puts
1603
- file.puts 'To open a file or dir press 1-9 a-z A-Z (on left of file)'
1604
- file.puts 'Ctrl-s to select file under cursor'
1605
- file.puts 'Selection Mode: Each selection adds to selection list (toggles)'
1606
- file.puts ' Execute commands on selected files. e.g D C-x '
1607
- file.puts ' Upon exiting mode, selection is cleared'
1557
+ file.puts 'To open a file or dir, press a-z A-Z (shortcut on left of file)'
1558
+ file.puts 'Ctrl-s to select file under cursor. * for multiple select.'
1559
+ file.puts 'Ctrl-Space: Enter and exit Visual Selection mode'
1560
+ file.puts 'Ctrl-x: file actions for selected files, or file under cursor'
1561
+ file.puts '1-9: bookmark a dir, and go to it.'
1562
+
1608
1563
  file.puts 'Use left and right arrows to move through directories'
1609
1564
  file.puts
1610
1565
  ary = []
@@ -1630,6 +1585,25 @@ def page_stat_for_file
1630
1585
  end
1631
1586
  end
1632
1587
 
1588
+ # display values of flag and options in pager
1589
+ def page_flags
1590
+ # XXX once this is changed to an array, then remove 'keys'
1591
+ page_with_tempfile do |file|
1592
+ file.puts 'Values of toggles/flags'
1593
+ file.puts '-----------------------'
1594
+ @toggles.keys.each do |flag|
1595
+ value = instance_variable_get "@#{flag}"
1596
+ file.puts "#{flag} : #{value}"
1597
+ end
1598
+ file.puts '-----------------------'
1599
+ @options.each_pair do |flag, struc|
1600
+ var = struc[:var]
1601
+ value = instance_variable_get "@#{var}"
1602
+ file.puts "#{flag} : #{value}"
1603
+ end
1604
+ end
1605
+ end
1606
+
1633
1607
  def page_with_tempfile
1634
1608
  require 'tempfile'
1635
1609
  file = Tempfile.new('cetus')
@@ -2006,12 +1980,13 @@ end
2006
1980
  def extras
2007
1981
  h = { '1' => :one_column,
2008
1982
  '2' => :multi_column,
2009
- :c => :columns,
1983
+ c: :columns,
2010
1984
  s: :scripts,
2011
1985
  g: :generators,
2012
- :B => :bindkey_ext_command,
2013
- :r => :config_read,
2014
- :w => :config_write }
1986
+ B: :bindkey_ext_command,
1987
+ f: :page_flags,
1988
+ r: :config_read,
1989
+ w: :config_write }
2015
1990
  key, menu_text = menu 'Extras Menu', h
2016
1991
  case menu_text
2017
1992
  when :one_column
@@ -3513,7 +3488,8 @@ end
3513
3488
  # latest source, but in some cases even this can be misleading since running a program accesses
3514
3489
  # include files.
3515
3490
  def enhance_file_list
3516
- return unless cget(:enhanced_mode)
3491
+ # return unless cget(:enhanced_mode)
3492
+ return unless @enhanced_mode
3517
3493
 
3518
3494
  begin
3519
3495
  actr = @files.size
@@ -3522,11 +3498,6 @@ def enhance_file_list
3522
3498
  # zshglob: N = NULL_GLOB no error if no result, this is causing space to split
3523
3499
  # file sometimes for single file.
3524
3500
 
3525
- # FIXME: append only if we are adding.
3526
- # FIXME: this makes it possible to select this row,
3527
- # FIXME: and count it as a file !!
3528
- # @files.append SEPARATOR
3529
-
3530
3501
  # if only one entry and its a dir
3531
3502
  # get its children and maybe the recent mod files a few
3532
3503
  # FIXME: simplify condition into one
@@ -3813,7 +3784,7 @@ def only_cursor_moved?
3813
3784
  end
3814
3785
 
3815
3786
  # we may want to print debug info if flag is on
3816
- if cget(:debug_flag)
3787
+ if @debug_flag
3817
3788
  clear_last_line
3818
3789
  print_debug_info
3819
3790
  else
@@ -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.39'
9
+ spec.version = '0.1.41'
10
10
  spec.authors = ['Rahul Kumar']
11
11
  spec.email = ['oneness.univ@gmail.com']
12
12
  spec.description = %q{lightning fast file navigator}
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env bash
2
+ # ----------------------------------------------------------------------------- #
3
+ # File: back.sh
4
+ # Description: copies given file into dropbox dir with timestamp appended
5
+ # Author: j kepler http://github.com/mare-imbrium/canis/
6
+ # Date: 2019-01-18 - 12:23
7
+ # License: MIT
8
+ # Last update: 2019-02-23 10:13
9
+ # ----------------------------------------------------------------------------- #
10
+ # YFF Copyright (C) 2012-2018 j kepler
11
+ errecho(){ >&2 echo $@; }
12
+
13
+ if [ $# -eq 0 ]; then
14
+ errecho "Give a file name to copy into dropbox dir"
15
+ exit 1
16
+ fi
17
+ TODAY=$(date +"%Y%m%d%H%M")
18
+ #if [[ ! -d back ]]; then
19
+ #mkdir back
20
+ #fi
21
+ BASE=~/Dropbox/backups
22
+ YEAR=$(date +"%Y")
23
+ TARGET=${BASE}/${YEAR}
24
+ if [[ ! -d $TARGET ]]; then
25
+ mkdir -p $TARGET
26
+ fi
27
+
28
+
29
+ cp -p "$1" ${TARGET}/${1}.${TODAY}
30
+ ls -l ${TARGET}/$1.${TODAY}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env bash
2
+ # Remove brackets and quotes from filenames
3
+ # replaces space with underscore
4
+ IFILE=~/tmp/selected_files
5
+ if [[ -f $IFILE ]]; then
6
+ wc -l $IFILE
7
+ else
8
+ echo "No files selected."
9
+ exit 1
10
+ fi
11
+
12
+ while IFS= read -r file
13
+ do
14
+ NEWNAME=$( echo "$file" | tr ' ' '_' | tr -d "[]()\"'")
15
+ [ -f "$file" ] && mv "$file" "$NEWNAME"
16
+ done < "$IFILE"
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.39
4
+ version: 0.1.41
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-21 00:00:00.000000000 Z
11
+ date: 2019-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -55,8 +55,10 @@ files:
55
55
  - cetus.gemspec
56
56
  - generators/viminfo
57
57
  - generators/z
58
+ - scripts/back
58
59
  - scripts/create_dir_with_selection
59
60
  - scripts/encrypt.sh
61
+ - scripts/remove_brackets
60
62
  - scripts/zip
61
63
  homepage: http://github.com/rkumar/cetus
62
64
  licenses: