cygnus 0.0.4 → 0.0.6
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.
- data/bin/cygnus +14 -19
- data/lib/cygnus.rb +4 -2
- data/lib/cygnus/textpad.rb +102 -56
- data/lib/cygnus/version.rb +1 -1
- metadata +4 -4
data/bin/cygnus
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
# Author: rkumar http://github.com/rkumar/mancurses/
|
9
9
|
# Date: 2011-11-09 - 16:59
|
10
10
|
# License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
11
|
-
# Last update: 2013-03-
|
11
|
+
# Last update: 2013-03-21 13:39
|
12
12
|
#
|
13
13
|
# == CHANGES
|
14
14
|
# == BUGS
|
@@ -16,13 +16,16 @@
|
|
16
16
|
# _ show form bindings too
|
17
17
|
# x our bindings from the hash do not show up..
|
18
18
|
# _ white line at bottom and right
|
19
|
+
# _ XXX standardize textpad based on textview
|
20
|
+
# _ do some things go from here to some comman like rdialog.rb?
|
21
|
+
# get_single etc, menus full_indexing ? or dir stuff ?
|
19
22
|
#
|
20
23
|
# == TODO
|
21
24
|
#
|
22
|
-
#
|
25
|
+
# x use BS to cycle files visited as in mancurses
|
23
26
|
# _ show how many files 1-5 or 15 etc
|
24
27
|
# _ toggle edit mode and view mode
|
25
|
-
#
|
28
|
+
# x long listing toggle + other toggles
|
26
29
|
#
|
27
30
|
# --- release first gem version after above are done ---
|
28
31
|
#
|
@@ -496,7 +499,7 @@ def pad_display_file filename, renderer, config={}, &block
|
|
496
499
|
listconfig.merge!(config)
|
497
500
|
listconfig.delete(:row);
|
498
501
|
listconfig.delete(:col);
|
499
|
-
listconfig[:filename] = filename
|
502
|
+
#listconfig[:filename] = filename
|
500
503
|
listconfig[:title] = filename
|
501
504
|
listconfig[:row] = 0
|
502
505
|
listconfig[:col] = 0
|
@@ -508,6 +511,7 @@ def pad_display_file filename, renderer, config={}, &block
|
|
508
511
|
#lb = RubyCurses::List.new form, listconfig, &block
|
509
512
|
lb = Cygnus::TextPad.new form, listconfig, &block
|
510
513
|
lb.renderer renderer if renderer
|
514
|
+
lb.filename(filename, method(:get_file_contents))
|
511
515
|
#lb.text(list)
|
512
516
|
## TODO FIXME hardocoding tmux format
|
513
517
|
#lb.formatted_text(alist, :tmux)
|
@@ -756,19 +760,10 @@ end
|
|
756
760
|
FileUtils.cd d
|
757
761
|
display_dir
|
758
762
|
end
|
759
|
-
def filetype f
|
760
|
-
text = `file #{f}`
|
761
|
-
if text.include? "text"
|
762
|
-
return :html if text.include?("HTML")
|
763
|
-
return :text
|
764
|
-
elsif text =~ /(archive|zip)/
|
765
|
-
return :zip
|
766
|
-
else
|
767
|
-
return :directory if File.directory? f
|
768
|
-
return :unknown
|
769
|
-
end
|
770
|
-
end
|
771
763
|
def get_file_contents f
|
764
|
+
# escaping required for sending file name to shell command if there are spaces in file name
|
765
|
+
sf = Shellwords.escape(f)
|
766
|
+
|
772
767
|
ft = filetype f
|
773
768
|
case ft
|
774
769
|
when :text
|
@@ -782,17 +777,17 @@ end
|
|
782
777
|
end
|
783
778
|
return lines
|
784
779
|
when :html
|
785
|
-
t = `html2text #{
|
780
|
+
t = `html2text #{sf} 2>&1`.split "\n"
|
786
781
|
if t.first.include? "command not found"
|
787
782
|
return File.open(f,"r").readlines
|
788
783
|
end
|
789
784
|
return t
|
790
785
|
when :zip
|
791
|
-
return `tar ztvf #{
|
786
|
+
return `tar ztvf #{sf}`.split("\n")
|
792
787
|
when :directory
|
793
788
|
return Dir.glob("*")
|
794
789
|
else
|
795
|
-
return ["
|
790
|
+
return ["unhandled type", `file #{sf}`]
|
796
791
|
end
|
797
792
|
end
|
798
793
|
def show
|
data/lib/cygnus.rb
CHANGED
@@ -1344,8 +1344,10 @@ def filetype f
|
|
1344
1344
|
return :image
|
1345
1345
|
elsif s.index "data"
|
1346
1346
|
return :text
|
1347
|
+
else
|
1348
|
+
return :directory if File.directory? f
|
1347
1349
|
end
|
1348
|
-
|
1350
|
+
return :unknown
|
1349
1351
|
end
|
1350
1352
|
|
1351
1353
|
def save_dir_pos
|
@@ -1518,7 +1520,7 @@ def insert_into_list dir, file
|
|
1518
1520
|
#ix = $files.index(dir)
|
1519
1521
|
#raise "something wrong can find #{dir}." unless ix
|
1520
1522
|
#$files.insert ix, *file
|
1521
|
-
$files.
|
1523
|
+
$files.push *file
|
1522
1524
|
end
|
1523
1525
|
def get_important_files dir
|
1524
1526
|
# checks various lists like visited_files and bookmarks
|
data/lib/cygnus/textpad.rb
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
# Author: rkumar http://github.com/rkumar/mancurses/
|
9
9
|
# Date: 2011-11-09 - 16:59
|
10
10
|
# License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
11
|
-
# Last update: 2013-03-
|
11
|
+
# Last update: 2013-03-21 14:10
|
12
12
|
#
|
13
13
|
# == CHANGES
|
14
14
|
# == TODO
|
@@ -36,6 +36,7 @@ module Cygnus
|
|
36
36
|
include BorderTitle
|
37
37
|
|
38
38
|
dsl_accessor :suppress_border
|
39
|
+
dsl_accessor :print_footer
|
39
40
|
attr_reader :current_index
|
40
41
|
attr_reader :rows , :cols
|
41
42
|
# You may pass height, width, row and col for creating a window otherwise a fullscreen window
|
@@ -178,15 +179,23 @@ module Cygnus
|
|
178
179
|
|
179
180
|
# supply a filename as source for textpad
|
180
181
|
# Reads up file into @content
|
181
|
-
|
182
|
-
|
182
|
+
# One can optionally send in a method which takes a filename and returns an array of data
|
183
|
+
# This is required if you are processing files which are binary such as zip/archives and wish
|
184
|
+
# to print the contents. (e.g. cygnus gem sends in :get_file_contents).
|
185
|
+
# filename("a.c", method(:get_file_contents))
|
186
|
+
#
|
187
|
+
def filename(filename, reader=nil)
|
183
188
|
@file = filename
|
184
189
|
unless File.exists? filename
|
185
190
|
alert "#{filename} does not exist"
|
186
191
|
return
|
187
192
|
end
|
188
193
|
@filetype = File.extname filename
|
189
|
-
|
194
|
+
if reader
|
195
|
+
@content = reader.call(filename)
|
196
|
+
else
|
197
|
+
@content = File.open(filename,"r").readlines
|
198
|
+
end
|
190
199
|
if @filetype == ""
|
191
200
|
if @content.first.index("ruby")
|
192
201
|
@filetype = ".rb"
|
@@ -201,18 +210,30 @@ module Cygnus
|
|
201
210
|
# This will replace existing text
|
202
211
|
|
203
212
|
## XXX in list text returns the selected row, list returns the full thing, keep consistent
|
204
|
-
def text
|
205
|
-
raise "text() receiving null content" unless lines
|
213
|
+
def text(lines)
|
214
|
+
#raise "text() receiving null content" unless lines
|
215
|
+
return @content if lines.empty?
|
206
216
|
@content = lines
|
207
217
|
@_populate_needed = true
|
208
218
|
@repaint_all = true
|
209
219
|
init_vars
|
220
|
+
self
|
210
221
|
end
|
211
222
|
alias :list :text
|
212
223
|
def content
|
213
224
|
raise "content is nil " unless @content
|
214
225
|
return @content
|
215
226
|
end
|
227
|
+
alias :get_content :content
|
228
|
+
|
229
|
+
# print footer containing line and position
|
230
|
+
def print_foot #:nodoc:
|
231
|
+
@footer_attrib ||= Ncurses::A_REVERSE
|
232
|
+
footer = "R: #{@current_index+1}, C: #{@curpos+@pcol}, #{@list.length} lines "
|
233
|
+
$log.debug " print_foot calling printstring with #{@row} + #{@height} -1, #{@col}+2"
|
234
|
+
@graphic.printstring( @row + @height -1 , @col+2, footer, @color_pair || $datacolor, @footer_attrib)
|
235
|
+
@repaint_footer_required = false # 2010-01-23 22:55
|
236
|
+
end
|
216
237
|
|
217
238
|
## ---- the next 2 methods deal with printing chunks
|
218
239
|
# we should put it int a common module and include it
|
@@ -255,6 +276,8 @@ module Cygnus
|
|
255
276
|
end
|
256
277
|
end
|
257
278
|
|
279
|
+
#
|
280
|
+
# pass in formatted text along with parser (:tmux or :ansi)
|
258
281
|
def formatted_text text, fmt
|
259
282
|
require 'rbcurse/core/include/chunk'
|
260
283
|
@formatted_text = text
|
@@ -326,6 +349,10 @@ module Cygnus
|
|
326
349
|
#@window.print_border @top, @left, @height-1, @width, clr
|
327
350
|
@window.print_border_only @top, @left, @height-1, @width, clr
|
328
351
|
print_title
|
352
|
+
|
353
|
+
@repaint_footer_required = true if @oldrow != @current_index
|
354
|
+
print_foot if @print_footer && !@suppress_borders && @repaint_footer_required
|
355
|
+
|
329
356
|
@window.wrefresh
|
330
357
|
end
|
331
358
|
end
|
@@ -362,6 +389,9 @@ module Cygnus
|
|
362
389
|
bind_key(?M, :middle_of_window)
|
363
390
|
bind_key(?H, :top_of_window)
|
364
391
|
bind_key(?w, :forward_word)
|
392
|
+
bind_key(?l, :cursor_forward)
|
393
|
+
bind_key(?h, :cursor_backward)
|
394
|
+
bind_key(?$, :cursor_eol)
|
365
395
|
bind_key(KEY_ENTER, :fire_action_event)
|
366
396
|
end
|
367
397
|
|
@@ -513,46 +543,20 @@ module Cygnus
|
|
513
543
|
#
|
514
544
|
#
|
515
545
|
#
|
516
|
-
# NOTE : if advancing pcol one has to clear the pad or something or else
|
517
|
-
# there'll be older content on the right side.
|
518
546
|
#
|
519
547
|
def handle_key ch
|
520
548
|
return :UNHANDLED unless @content
|
521
549
|
map_keys unless @mapped_keys
|
522
550
|
|
523
|
-
@maxrow = @content_rows - @rows
|
524
|
-
@maxcol = @content_cols - @cols
|
525
551
|
|
526
|
-
# need to understand the above line, can go below zero.
|
527
|
-
# all this seems to work fine in padreader.rb in util.
|
528
|
-
# somehow maxcol going to -33
|
529
552
|
@oldrow = @prow
|
530
553
|
@oldcol = @pcol
|
531
554
|
$log.debug "XXX: PAD got #{ch} prow = #{@prow}"
|
532
555
|
begin
|
533
556
|
case ch
|
534
|
-
when key(?l)
|
535
|
-
# TODO take multipler
|
536
|
-
#@pcol += 1
|
537
|
-
if @curpos < @cols
|
538
|
-
@curpos += 1
|
539
|
-
end
|
540
|
-
when key(?$)
|
541
|
-
#@pcol = @maxcol - 1
|
542
|
-
@curpos = [@content[@current_index].size, @cols].min
|
543
|
-
when key(?h)
|
544
|
-
# TODO take multipler
|
545
|
-
if @curpos > 0
|
546
|
-
@curpos -= 1
|
547
|
-
end
|
548
|
-
#when key(?0)
|
549
|
-
#@curpos = 0
|
550
557
|
when ?0.getbyte(0)..?9.getbyte(0)
|
551
558
|
if ch == ?0.getbyte(0) && $multiplier == 0
|
552
|
-
|
553
|
-
@repaint_required = true if @pcol > 0 # tried other things but did not work
|
554
|
-
@pcol = 0
|
555
|
-
@curpos = 0
|
559
|
+
cursor_bol
|
556
560
|
return 0
|
557
561
|
end
|
558
562
|
# storing digits entered so we can multiply motion actions
|
@@ -584,7 +588,7 @@ module Cygnus
|
|
584
588
|
return :UNHANDLED if ret == :UNHANDLED
|
585
589
|
end
|
586
590
|
rescue => err
|
587
|
-
$log.error " TEXTPAD ERROR
|
591
|
+
$log.error " TEXTPAD ERROR 591 #{err} "
|
588
592
|
$log.debug( err) if err
|
589
593
|
$log.debug(err.backtrace.join("\n")) if err
|
590
594
|
textdialog ["Error in TextPad: #{err} ", *err.backtrace], :title => "Exception"
|
@@ -595,16 +599,25 @@ module Cygnus
|
|
595
599
|
end
|
596
600
|
return 0
|
597
601
|
end # while loop
|
602
|
+
|
603
|
+
#
|
604
|
+
# event when user hits enter on a row, user would bind :PRESS
|
605
|
+
#
|
598
606
|
def fire_action_event
|
599
607
|
return if @content.nil? || @content.size == 0
|
600
608
|
require 'rbcurse/core/include/ractionevent'
|
601
609
|
aev = TextActionEvent.new self, :PRESS, current_value().to_s, @current_index, @curpos
|
602
610
|
fire_handler :PRESS, aev
|
603
611
|
end
|
612
|
+
#
|
613
|
+
# returns current value (what cursor is on)
|
604
614
|
def current_value
|
605
615
|
@content[@current_index]
|
606
616
|
end
|
607
617
|
#
|
618
|
+
# execute binding when a row is entered, used more in lists to display some text
|
619
|
+
# in a header or footer as one traverses
|
620
|
+
#
|
608
621
|
def on_enter_row arow
|
609
622
|
return if @content.nil? || @content.size == 0
|
610
623
|
require 'rbcurse/core/include/ractionevent'
|
@@ -623,16 +636,22 @@ module Cygnus
|
|
623
636
|
FFI::NCurses.delwin(@pad) if @pad # when do i do this ? FIXME
|
624
637
|
@pad = nil
|
625
638
|
end
|
639
|
+
#
|
640
|
+
# return true if the given row is visible
|
626
641
|
def is_visible? index
|
627
642
|
j = index - @prow #@toprow
|
628
643
|
j >= 0 && j <= @scrollatrows
|
629
644
|
end
|
645
|
+
#
|
646
|
+
# called when this widget is entered, by form
|
630
647
|
def on_enter
|
631
648
|
set_form_row
|
632
649
|
end
|
650
|
+
# called by form
|
633
651
|
def set_form_row
|
634
652
|
setrowcol @lastrow, @lastcol
|
635
653
|
end
|
654
|
+
# called by form
|
636
655
|
def set_form_col
|
637
656
|
end
|
638
657
|
|
@@ -648,15 +667,6 @@ module Cygnus
|
|
648
667
|
@current_index = @content.count()-1 if @current_index > @content.count()-1
|
649
668
|
ensure_visible
|
650
669
|
|
651
|
-
#$status_message.value = "visible #{@prow} , #{@current_index} "
|
652
|
-
#unless is_visible? @current_index
|
653
|
-
#if @prow > @current_index
|
654
|
-
##$status_message.value = "1 #{@prow} > #{@current_index} "
|
655
|
-
#@prow -= 1
|
656
|
-
#else
|
657
|
-
#end
|
658
|
-
#end
|
659
|
-
#end
|
660
670
|
check_prow
|
661
671
|
#$log.debug "XXX: PAD BOUNDS ci:#{@current_index} , old #{@oldrow},pr #{@prow}, max #{@maxrow} pcol #{@pcol} maxcol #{@maxcol}"
|
662
672
|
@crow = @current_index + r - @prow
|
@@ -674,14 +684,16 @@ module Cygnus
|
|
674
684
|
@repaint_required = true
|
675
685
|
end
|
676
686
|
end
|
687
|
+
#
|
688
|
+
# save last cursor position so when reentering, cursor can be repositioned
|
677
689
|
def lastcurpos r,c
|
678
690
|
@lastrow = r
|
679
691
|
@lastcol = c
|
680
692
|
end
|
681
693
|
|
682
694
|
|
683
|
-
|
684
|
-
|
695
|
+
# check that prow and pcol are within bounds
|
696
|
+
#
|
685
697
|
def check_prow
|
686
698
|
@prow = 0 if @prow < 0
|
687
699
|
@pcol = 0 if @pcol < 0
|
@@ -700,17 +712,13 @@ module Cygnus
|
|
700
712
|
# the pad shows earlier stuff.
|
701
713
|
#
|
702
714
|
return
|
703
|
-
# the following was causing bugs if content was smaller than pad
|
704
|
-
if @prow > @maxrow-1
|
705
|
-
@prow = @maxrow-1
|
706
|
-
end
|
707
|
-
if @pcol > @maxcol-1
|
708
|
-
@pcol = @maxcol-1
|
709
|
-
end
|
710
715
|
end
|
711
716
|
public
|
712
717
|
##
|
713
718
|
# Ask user for string to search for
|
719
|
+
# This uses the dialog, but what if user wants the old style.
|
720
|
+
# Isn't there a cleaner way to let user override style, or allow user
|
721
|
+
# to use own UI for getting pattern and then passing here.
|
714
722
|
def ask_search
|
715
723
|
str = get_string("Enter pattern: ")
|
716
724
|
return if str.nil?
|
@@ -768,6 +776,9 @@ module Cygnus
|
|
768
776
|
@prow = @current_index
|
769
777
|
end
|
770
778
|
end
|
779
|
+
#
|
780
|
+
# jumps cursor to next work, like vim's w key
|
781
|
+
#
|
771
782
|
def forward_word
|
772
783
|
$multiplier = 1 if !$multiplier || $multiplier == 0
|
773
784
|
line = @current_index
|
@@ -793,11 +804,46 @@ module Cygnus
|
|
793
804
|
@current_index = line
|
794
805
|
@curpos = pos
|
795
806
|
ensure_visible
|
796
|
-
#@buffer = @list[@current_index].to_s
|
797
|
-
#set_form_row
|
798
|
-
#set_form_col pos
|
799
807
|
@repaint_required = true
|
800
808
|
end
|
809
|
+
#
|
810
|
+
# move cursor forward by one char (currently will not pan)
|
811
|
+
def cursor_forward
|
812
|
+
$multiplier = 1 if $multiplier == 0
|
813
|
+
if @curpos < @cols
|
814
|
+
@curpos += $multiplier
|
815
|
+
if @curpos > @cols
|
816
|
+
@curpos = @cols
|
817
|
+
end
|
818
|
+
@repaint_required = true
|
819
|
+
end
|
820
|
+
$multiplier = 0
|
821
|
+
end
|
822
|
+
#
|
823
|
+
# move cursor backward by one char (currently will not pan)
|
824
|
+
def cursor_backward
|
825
|
+
$multiplier = 1 if $multiplier == 0
|
826
|
+
if @curpos > 0
|
827
|
+
@curpos -= $multiplier
|
828
|
+
@curpos = 0 if @curpos < 0
|
829
|
+
@repaint_required = true
|
830
|
+
end
|
831
|
+
$multiplier = 0
|
832
|
+
end
|
833
|
+
# moves cursor to end of line also panning window if necessary
|
834
|
+
def cursor_eol
|
835
|
+
@pcol = @content_cols - @cols - 1
|
836
|
+
@curpos = @content[@current_index].size
|
837
|
+
@repaint_required = true
|
838
|
+
end
|
839
|
+
#
|
840
|
+
# moves cursor to start of line, panning if required
|
841
|
+
def cursor_bol
|
842
|
+
# copy of C-a - start of line
|
843
|
+
@repaint_required = true if @pcol > 0
|
844
|
+
@pcol = 0
|
845
|
+
@curpos = 0
|
846
|
+
end
|
801
847
|
|
802
848
|
end # class textpad
|
803
849
|
|
@@ -810,7 +856,7 @@ module Cygnus
|
|
810
856
|
#cp = $datacolor
|
811
857
|
cp = get_color($datacolor, fg, bg)
|
812
858
|
## XXX believe it or not, the next line can give you "invalid byte sequence in UTF-8
|
813
|
-
# even when processing filename at times.
|
859
|
+
# even when processing filename at times. Or if its an mp3 or non-text file.
|
814
860
|
if text =~ /^\s*# / || text =~ /^\s*## /
|
815
861
|
fg = :red
|
816
862
|
#att = BOLD
|
data/lib/cygnus/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cygnus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -76,7 +76,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
76
76
|
version: '0'
|
77
77
|
segments:
|
78
78
|
- 0
|
79
|
-
hash:
|
79
|
+
hash: 2432678409323259259
|
80
80
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
@@ -85,7 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
85
|
version: '0'
|
86
86
|
segments:
|
87
87
|
- 0
|
88
|
-
hash:
|
88
|
+
hash: 2432678409323259259
|
89
89
|
requirements: []
|
90
90
|
rubyforge_project:
|
91
91
|
rubygems_version: 1.8.25
|