cygnus 0.0.4 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|