ruco 0.0.7 → 0.0.8
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/Readme.md +7 -4
- data/VERSION +1 -1
- data/bin/ruco +10 -2
- data/lib/ruco/application.rb +61 -11
- data/lib/ruco/command_bar.rb +2 -1
- data/lib/ruco/keyboard.rb +25 -19
- data/lib/ruco/text_area.rb +8 -0
- data/ruco.gemspec +4 -2
- data/spec/ruco/application_spec.rb +27 -1
- data/spec/ruco/command_bar_spec.rb +2 -1
- data/spec/ruco/text_area_spec.rb +57 -0
- metadata +6 -4
data/Readme.md
CHANGED
@@ -5,10 +5,10 @@ Alpha, lets see if this works...
|
|
5
5
|
Finished:
|
6
6
|
|
7
7
|
- viewing / scrolling / editing / saving / creating
|
8
|
-
- Home/End
|
8
|
+
- Home/End + Page up/down
|
9
9
|
- basic Tab support (tab == 2 space)
|
10
|
-
- change-indicator
|
11
|
-
- writeable indicator
|
10
|
+
- change-indicator (*)
|
11
|
+
- writeable indicator (!)
|
12
12
|
- backspace / delete
|
13
13
|
- find / go to line
|
14
14
|
- delete line
|
@@ -23,7 +23,10 @@ Usage
|
|
23
23
|
|
24
24
|
TODO
|
25
25
|
=====
|
26
|
-
-
|
26
|
+
- backspace on mac ?
|
27
|
+
- bind/action must use instance_exec
|
28
|
+
- read .rucorc.rb
|
29
|
+
- write key binding guide
|
27
30
|
- smart staying at end of line/column when changing line
|
28
31
|
- indentation + paste support
|
29
32
|
- warnings / messages
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.8
|
data/bin/ruco
CHANGED
@@ -18,7 +18,8 @@ Usage:
|
|
18
18
|
|
19
19
|
Options:
|
20
20
|
BANNER
|
21
|
-
opts.on("--
|
21
|
+
opts.on("--debug-cache","Show caching in action") { options[:debug_cache] = true }
|
22
|
+
opts.on("--debug-keys", "Show pressed keys") { options[:debug_keys] = true }
|
22
23
|
opts.on("-h", "--help","Show this.") { puts opts; exit }
|
23
24
|
end
|
24
25
|
parser.parse!
|
@@ -63,7 +64,7 @@ def display(lines, offset, color)
|
|
63
64
|
@screen[line] = content
|
64
65
|
|
65
66
|
write(line, 0, content)
|
66
|
-
write(line, 0, (rand(899)+100).to_s) if @options[:
|
67
|
+
write(line, 0, (rand(899)+100).to_s) if @options[:debug_cache]
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
@@ -78,6 +79,12 @@ def show_app(app)
|
|
78
79
|
Curses.setpos(app.cursor.line, app.cursor.column)
|
79
80
|
end
|
80
81
|
|
82
|
+
def debug_key(key)
|
83
|
+
@key_line ||= -1
|
84
|
+
@key_line = (@key_line + 1) % Curses.stdscr.maxy
|
85
|
+
write(@key_line, 0, "#{key}---")
|
86
|
+
end
|
87
|
+
|
81
88
|
@options = parse_options
|
82
89
|
|
83
90
|
require 'ruco'
|
@@ -89,6 +96,7 @@ init_screen do
|
|
89
96
|
show_app app
|
90
97
|
|
91
98
|
Keyboard.listen do |key|
|
99
|
+
debug_key(key) if @options[:debug_keys]
|
92
100
|
result = app.key key
|
93
101
|
break if result == :quit
|
94
102
|
show_app app
|
data/lib/ruco/application.rb
CHANGED
@@ -4,10 +4,16 @@ module Ruco
|
|
4
4
|
@file = file
|
5
5
|
@options = options
|
6
6
|
|
7
|
+
@bindings = {}
|
8
|
+
@actions = {}
|
9
|
+
|
7
10
|
@status_lines = 1
|
8
11
|
@command_lines = 1
|
9
12
|
@editor_lines = @options[:lines] - @status_lines - @command_lines
|
10
13
|
create_components
|
14
|
+
|
15
|
+
setup_actions
|
16
|
+
setup_keys
|
11
17
|
end
|
12
18
|
|
13
19
|
def view
|
@@ -19,6 +25,15 @@ module Ruco
|
|
19
25
|
end
|
20
26
|
|
21
27
|
def key(key)
|
28
|
+
if bound = @bindings[key]
|
29
|
+
result = if bound.is_a?(Symbol)
|
30
|
+
@actions[bound].call
|
31
|
+
else
|
32
|
+
bound.call
|
33
|
+
end
|
34
|
+
return result
|
35
|
+
end
|
36
|
+
|
22
37
|
case key
|
23
38
|
|
24
39
|
# move
|
@@ -28,6 +43,8 @@ module Ruco
|
|
28
43
|
when :left then @focused.move(:relative, 0,-1)
|
29
44
|
when :end then @focused.move :to_eol
|
30
45
|
when :home then @focused.move :to_bol
|
46
|
+
when :page_up then @focused.move :page_up
|
47
|
+
when :page_down then @focused.move :page_down
|
31
48
|
|
32
49
|
# modify
|
33
50
|
when :tab then @focused.insert("\t")
|
@@ -41,23 +58,56 @@ module Ruco
|
|
41
58
|
when :backspace then @focused.delete(-1)
|
42
59
|
when :delete then @focused.delete(1)
|
43
60
|
|
44
|
-
# misc
|
45
|
-
when :"Ctrl+d" then
|
46
|
-
@editor.delete_line
|
47
|
-
when :"Ctrl+f" then
|
48
|
-
@focused = @command
|
49
|
-
@command.find
|
50
|
-
when :"Ctrl+g" then
|
51
|
-
@focused = @command
|
52
|
-
@command.move_to_line
|
53
61
|
when :escape then # escape from focused
|
54
62
|
@focused.reset
|
55
63
|
@focused = @editor
|
56
|
-
when :"Ctrl+s" then @editor.save
|
57
|
-
when :"Ctrl+w", :"Ctrl+q" then return(:quit) # quit
|
58
64
|
end
|
59
65
|
end
|
60
66
|
|
67
|
+
def bind(key, action=nil, &block)
|
68
|
+
raise if action and block
|
69
|
+
@bindings[key] = action || block
|
70
|
+
end
|
71
|
+
|
72
|
+
def action(name, &block)
|
73
|
+
@actions[name] = block
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def setup_actions
|
79
|
+
action :save do
|
80
|
+
@editor.save
|
81
|
+
end
|
82
|
+
|
83
|
+
action :quit do
|
84
|
+
:quit
|
85
|
+
end
|
86
|
+
|
87
|
+
action :go_to_line do
|
88
|
+
@focused = @command
|
89
|
+
@command.move_to_line
|
90
|
+
end
|
91
|
+
|
92
|
+
action :delete_line do
|
93
|
+
@editor.delete_line
|
94
|
+
end
|
95
|
+
|
96
|
+
action :find do
|
97
|
+
@focused = @command
|
98
|
+
@command.find
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def setup_keys
|
103
|
+
bind :"Ctrl+s", :save
|
104
|
+
bind :"Ctrl+w", :quit
|
105
|
+
bind :"Ctrl+q", :quit
|
106
|
+
bind :"Ctrl+g", :go_to_line
|
107
|
+
bind :"Ctrl+f", :find
|
108
|
+
bind :"Ctrl+d", :delete_line
|
109
|
+
end
|
110
|
+
|
61
111
|
def create_components
|
62
112
|
@editor = Ruco::Editor.new(@file, :lines => @editor_lines, :columns => @options[:columns])
|
63
113
|
@status = Ruco::StatusBar.new(@editor, :columns => @options[:columns])
|
data/lib/ruco/command_bar.rb
CHANGED
@@ -27,6 +27,7 @@ module Ruco
|
|
27
27
|
|
28
28
|
def find
|
29
29
|
@forms_cache[:find] ||= Form.new('Find: ', :columns => @options[:columns]) do |value|
|
30
|
+
@form = nil
|
30
31
|
Command.new(:find, value)
|
31
32
|
end
|
32
33
|
@form = @forms_cache[:find]
|
@@ -34,7 +35,7 @@ module Ruco
|
|
34
35
|
|
35
36
|
def move_to_line
|
36
37
|
@form = Form.new('Go to Line: ', :columns => @options[:columns], :type => :integer) do |value|
|
37
|
-
|
38
|
+
@form = nil
|
38
39
|
Command.new(:move, :to_line, value.to_i)
|
39
40
|
end
|
40
41
|
end
|
data/lib/ruco/keyboard.rb
CHANGED
@@ -3,32 +3,38 @@ class Keyboard
|
|
3
3
|
loop do
|
4
4
|
key = Curses.getch
|
5
5
|
|
6
|
-
case key
|
6
|
+
code = case key
|
7
7
|
|
8
8
|
# move
|
9
|
-
when Curses::Key::UP then
|
10
|
-
when Curses::Key::DOWN then
|
11
|
-
when Curses::Key::RIGHT then
|
12
|
-
when Curses::Key::LEFT then
|
13
|
-
when Curses::KEY_END then
|
14
|
-
when Curses::KEY_HOME then
|
9
|
+
when Curses::Key::UP then :up
|
10
|
+
when Curses::Key::DOWN then :down
|
11
|
+
when Curses::Key::RIGHT then :right
|
12
|
+
when Curses::Key::LEFT then :left
|
13
|
+
when Curses::KEY_END then :end
|
14
|
+
when Curses::KEY_HOME then :home
|
15
|
+
when Curses::KEY_NPAGE then :page_down
|
16
|
+
when Curses::KEY_PPAGE then :page_up
|
15
17
|
|
16
18
|
# modify
|
17
|
-
when 9 then
|
18
|
-
when 32..126 then
|
19
|
-
when 10 then
|
20
|
-
when 263 then
|
21
|
-
when Curses::KEY_DC then
|
19
|
+
when 9 then :tab
|
20
|
+
when 32..126 then key # printable
|
21
|
+
when 10 then :enter
|
22
|
+
when 263 then :backspace
|
23
|
+
when Curses::KEY_DC then :delete
|
22
24
|
|
23
25
|
# misc
|
24
|
-
when ?\C-d then
|
25
|
-
when ?\C-f then
|
26
|
-
when ?\C-g then
|
27
|
-
when 27 then
|
28
|
-
when ?\C-s then
|
29
|
-
when ?\C-w then
|
30
|
-
when ?\C-q then
|
26
|
+
when ?\C-d then :"Ctrl+d"
|
27
|
+
when ?\C-f then :"Ctrl+f"
|
28
|
+
when ?\C-g then :"Ctrl+g"
|
29
|
+
when 27 then :escape
|
30
|
+
when ?\C-s then :"Ctrl+s"
|
31
|
+
when ?\C-w then :"Ctrl+w"
|
32
|
+
when ?\C-q then :"Ctrl+q"
|
33
|
+
else
|
34
|
+
key
|
31
35
|
end
|
36
|
+
|
37
|
+
yield code
|
32
38
|
end
|
33
39
|
end
|
34
40
|
end
|
data/lib/ruco/text_area.rb
CHANGED
@@ -32,6 +32,14 @@ module Ruco
|
|
32
32
|
when :to_eol then move_to_eol(*args)
|
33
33
|
when :to_line then @line = args.first
|
34
34
|
when :to_column then @column = args.first
|
35
|
+
when :page_down then
|
36
|
+
shift = @options[:lines] - 1
|
37
|
+
@line += shift
|
38
|
+
@scrolled_lines += shift
|
39
|
+
when :page_up then
|
40
|
+
shift = @options[:lines] - 1
|
41
|
+
@line -= shift
|
42
|
+
@scrolled_lines -= shift
|
35
43
|
else
|
36
44
|
raise "Unknown move type #{where} with #{args.inspect}"
|
37
45
|
end
|
data/ruco.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ruco}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.8"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Michael Grosser"]
|
12
|
-
s.date = %q{2011-01-
|
12
|
+
s.date = %q{2011-01-13}
|
13
13
|
s.default_executable = %q{ruco}
|
14
14
|
s.email = %q{michael@grosser.it}
|
15
15
|
s.executables = ["ruco"]
|
@@ -42,6 +42,7 @@ Gem::Specification.new do |s|
|
|
42
42
|
"spec/ruco/editor_spec.rb",
|
43
43
|
"spec/ruco/form_spec.rb",
|
44
44
|
"spec/ruco/status_bar_spec.rb",
|
45
|
+
"spec/ruco/text_area_spec.rb",
|
45
46
|
"spec/ruco_spec.rb",
|
46
47
|
"spec/spec_helper.rb"
|
47
48
|
]
|
@@ -57,6 +58,7 @@ Gem::Specification.new do |s|
|
|
57
58
|
"spec/ruco/editor_spec.rb",
|
58
59
|
"spec/ruco/form_spec.rb",
|
59
60
|
"spec/ruco/status_bar_spec.rb",
|
61
|
+
"spec/ruco/text_area_spec.rb",
|
60
62
|
"spec/ruco_spec.rb",
|
61
63
|
"spec/spec_helper.rb"
|
62
64
|
]
|
@@ -10,7 +10,7 @@ describe Ruco::Application do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
let(:app){ Ruco::Application.new(@file, :lines => 5, :columns => 10) }
|
13
|
-
let(:status){ "Ruco
|
13
|
+
let(:status){ "Ruco #{Ruco::VERSION} -- spec/temp.txt \n" }
|
14
14
|
let(:command){ "^W Exit" }
|
15
15
|
|
16
16
|
it "renders status + editor + command" do
|
@@ -36,4 +36,30 @@ describe Ruco::Application do
|
|
36
36
|
app.view.should == "#{status}123\n456\n789\n#{command}"
|
37
37
|
app.cursor.should == [3,0] # 0 offset + 1 for statusbar
|
38
38
|
end
|
39
|
+
|
40
|
+
it "can quit" do
|
41
|
+
result = app.key(:"Ctrl+w")
|
42
|
+
result.should == :quit
|
43
|
+
end
|
44
|
+
|
45
|
+
describe :bind do
|
46
|
+
it "can execute bound stuff" do
|
47
|
+
test = 0
|
48
|
+
app.bind :'Ctrl+q' do
|
49
|
+
test = 1
|
50
|
+
end
|
51
|
+
app.key(:'Ctrl+q')
|
52
|
+
test.should == 1
|
53
|
+
end
|
54
|
+
|
55
|
+
it "can execute an action via bind" do
|
56
|
+
test = 0
|
57
|
+
app.action :foo do
|
58
|
+
test = 1
|
59
|
+
end
|
60
|
+
app.bind :'Ctrl+q', :foo
|
61
|
+
app.key(:'Ctrl+q')
|
62
|
+
test.should == 1
|
63
|
+
end
|
64
|
+
end
|
39
65
|
end
|
@@ -32,6 +32,7 @@ describe Ruco::CommandBar do
|
|
32
32
|
it "keeps entered stuff" do
|
33
33
|
bar.find
|
34
34
|
bar.insert('abc')
|
35
|
+
bar.insert("\n")
|
35
36
|
bar.find
|
36
37
|
bar.view.should == "Find: abc"
|
37
38
|
bar.cursor.column.should == 9
|
@@ -40,7 +41,6 @@ describe Ruco::CommandBar do
|
|
40
41
|
it "can reset the search" do
|
41
42
|
bar.find
|
42
43
|
bar.insert('abc')
|
43
|
-
bar.insert("\n")
|
44
44
|
bar.reset
|
45
45
|
|
46
46
|
bar.view.should == default_view
|
@@ -59,6 +59,7 @@ describe Ruco::CommandBar do
|
|
59
59
|
bar.find
|
60
60
|
bar.insert('abcd')
|
61
61
|
bar.insert("\n")
|
62
|
+
bar.find
|
62
63
|
result = bar.insert("\n")
|
63
64
|
result.should == Ruco::Command.new(:find, 'abcd')
|
64
65
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.expand_path('spec/spec_helper')
|
2
|
+
|
3
|
+
describe Ruco::TextArea do
|
4
|
+
describe :move do
|
5
|
+
describe 'pages' do
|
6
|
+
it "can move down a page" do
|
7
|
+
text = Ruco::TextArea.new("1\n2\n3\n4\n5\n6\n7\n8\n9\n", :lines => 3, :columns => 3)
|
8
|
+
text.move(:page_down)
|
9
|
+
text.view.should == "3\n4\n5\n"
|
10
|
+
text.cursor.should == [0,0]
|
11
|
+
end
|
12
|
+
|
13
|
+
it "keeps cursor position when moving down" do
|
14
|
+
text = Ruco::TextArea.new("1\n2abc\n3\n4ab\n5\n6\n7\n8\n9\n", :lines => 3, :columns => 5)
|
15
|
+
text.move(:to, 1,4)
|
16
|
+
text.move(:page_down)
|
17
|
+
text.view.should == "3\n4ab\n5\n"
|
18
|
+
text.cursor.should == [1,3]
|
19
|
+
end
|
20
|
+
|
21
|
+
it "can move up a page" do
|
22
|
+
text = Ruco::TextArea.new("0\n1\n2\n3\n4\n5\n6\n7\n8\n", :lines => 3, :columns => 3)
|
23
|
+
text.move(:to, 4, 0)
|
24
|
+
text.view.should == "2\n3\n4\n"
|
25
|
+
text.cursor.should == [2,0]
|
26
|
+
text.move(:page_up)
|
27
|
+
text.view.should == "0\n1\n2\n"
|
28
|
+
text.cursor.should == [2,0]
|
29
|
+
end
|
30
|
+
|
31
|
+
it "keeps column position when moving up" do
|
32
|
+
text = Ruco::TextArea.new("0\n1\n2\n3ab\n4\n5abc\n6\n7\n8\n", :lines => 3, :columns => 5)
|
33
|
+
text.move(:to, 5, 4)
|
34
|
+
text.view.should == "3ab\n4\n5abc\n"
|
35
|
+
text.cursor.should == [2,4]
|
36
|
+
text.move(:page_up)
|
37
|
+
text.view.should == "1\n2\n3ab\n"
|
38
|
+
text.cursor.should == [2,3]
|
39
|
+
end
|
40
|
+
|
41
|
+
it "moves pages symetric" do
|
42
|
+
text = Ruco::TextArea.new("0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n", :lines => 3, :columns => 3)
|
43
|
+
text.move(:to, 4, 1)
|
44
|
+
text.view.should == "2\n3\n4\n"
|
45
|
+
text.cursor.should == [2,1]
|
46
|
+
|
47
|
+
text.move(:page_down)
|
48
|
+
text.move(:page_down)
|
49
|
+
text.move(:page_up)
|
50
|
+
text.move(:page_up)
|
51
|
+
|
52
|
+
text.cursor.should == [2,1]
|
53
|
+
text.view.should == "2\n3\n4\n"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruco
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 8
|
10
|
+
version: 0.0.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Michael Grosser
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-13 00:00:00 +01:00
|
19
19
|
default_executable: ruco
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- spec/ruco/editor_spec.rb
|
57
57
|
- spec/ruco/form_spec.rb
|
58
58
|
- spec/ruco/status_bar_spec.rb
|
59
|
+
- spec/ruco/text_area_spec.rb
|
59
60
|
- spec/ruco_spec.rb
|
60
61
|
- spec/spec_helper.rb
|
61
62
|
has_rdoc: true
|
@@ -100,5 +101,6 @@ test_files:
|
|
100
101
|
- spec/ruco/editor_spec.rb
|
101
102
|
- spec/ruco/form_spec.rb
|
102
103
|
- spec/ruco/status_bar_spec.rb
|
104
|
+
- spec/ruco/text_area_spec.rb
|
103
105
|
- spec/ruco_spec.rb
|
104
106
|
- spec/spec_helper.rb
|