ruco 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme.md +3 -2
- data/VERSION +1 -1
- data/bin/ruco +3 -0
- data/lib/ruco.rb +7 -2
- data/lib/ruco/command_bar.rb +17 -14
- data/lib/ruco/core_ext/object.rb +17 -0
- data/lib/ruco/editor.rb +4 -2
- data/lib/ruco/form.rb +36 -0
- data/lib/ruco/text_field.rb +40 -0
- data/ruco.gemspec +7 -2
- data/spec/ruco/command_bar_spec.rb +40 -0
- data/spec/ruco/editor_spec.rb +21 -5
- data/spec/ruco/form_spec.rb +75 -0
- metadata +9 -4
data/Readme.md
CHANGED
@@ -10,7 +10,7 @@ Finished:
|
|
10
10
|
- change-indicator
|
11
11
|
- writeable indicator
|
12
12
|
- backspace / delete
|
13
|
-
- find
|
13
|
+
- find / go to line
|
14
14
|
|
15
15
|
Install
|
16
16
|
=======
|
@@ -22,7 +22,8 @@ Usage
|
|
22
22
|
|
23
23
|
TODO
|
24
24
|
=====
|
25
|
-
-
|
25
|
+
- delete line
|
26
|
+
- scrolling inside text field
|
26
27
|
- smart staying at end of line/column when changing line
|
27
28
|
- indentation + paste support
|
28
29
|
- warnings / messages
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.5
|
data/bin/ruco
CHANGED
data/lib/ruco.rb
CHANGED
@@ -1,11 +1,16 @@
|
|
1
|
+
require 'ruco/core_ext/object'
|
2
|
+
require 'ruco/core_ext/string'
|
3
|
+
require 'ruco/core_ext/array'
|
4
|
+
|
1
5
|
require 'ruco/focusable'
|
2
6
|
require 'ruco/command'
|
3
7
|
|
4
8
|
require 'ruco/editor'
|
5
9
|
require 'ruco/status_bar'
|
6
10
|
require 'ruco/command_bar'
|
7
|
-
|
8
|
-
require 'ruco/
|
11
|
+
|
12
|
+
require 'ruco/form'
|
13
|
+
require 'ruco/text_field'
|
9
14
|
|
10
15
|
module Ruco
|
11
16
|
VERSION = File.read( File.join(File.dirname(__FILE__),'..','VERSION') ).strip
|
data/lib/ruco/command_bar.rb
CHANGED
@@ -2,49 +2,52 @@ module Ruco
|
|
2
2
|
class CommandBar
|
3
3
|
include Focusable
|
4
4
|
|
5
|
-
attr_accessor :cursor_line
|
5
|
+
attr_accessor :cursor_line, :form
|
6
|
+
delegate :move, :delete, :insert, :to => :form
|
6
7
|
|
7
8
|
SHORTCUTS = [
|
8
9
|
'^W Exit',
|
9
10
|
'^S Save',
|
10
11
|
'^F Find',
|
11
|
-
'^D Delete line'
|
12
|
+
'^D Delete line',
|
13
|
+
'^G Go to line'
|
12
14
|
]
|
13
15
|
|
14
16
|
SEARCH_PREFIX = "Find: "
|
15
17
|
|
16
18
|
def initialize(options)
|
17
19
|
@options = options
|
20
|
+
@forms_cache = {}
|
18
21
|
reset
|
19
22
|
end
|
20
23
|
|
21
24
|
def view
|
22
|
-
if @
|
23
|
-
|
25
|
+
if @form
|
26
|
+
@form.view
|
24
27
|
else
|
25
28
|
available_shortcuts
|
26
29
|
end
|
27
30
|
end
|
28
31
|
|
29
32
|
def find
|
30
|
-
@
|
33
|
+
@form = @forms_cache[:find] ||= Form.new('Find: ', :columns => @options[:columns], :command => :find)
|
31
34
|
end
|
32
35
|
|
33
|
-
def
|
34
|
-
@
|
35
|
-
if @find_term.include?("\n")
|
36
|
-
@find_term.gsub!("\n",'')
|
37
|
-
Command.new(:find, @find_term)
|
38
|
-
end
|
36
|
+
def move_to_line
|
37
|
+
@form = Form.new('Go to Line: ', :columns => @options[:columns], :command => :move_to_line, :type => :integer)
|
39
38
|
end
|
40
39
|
|
41
40
|
def reset
|
42
|
-
@
|
43
|
-
@
|
41
|
+
@forms_cache[:find] = nil if @form == @forms_cache[:find]
|
42
|
+
@form = nil
|
44
43
|
end
|
45
44
|
|
46
45
|
def cursor_column
|
47
|
-
|
46
|
+
if @form
|
47
|
+
@form.cursor[1]
|
48
|
+
else
|
49
|
+
0
|
50
|
+
end
|
48
51
|
end
|
49
52
|
|
50
53
|
private
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Object
|
2
|
+
# copy from active_support
|
3
|
+
def delegate(*methods)
|
4
|
+
options = methods.pop
|
5
|
+
unless options.is_a?(Hash) && to = options[:to]
|
6
|
+
raise ArgumentError, "Delegation needs a target. Supply an options hash with a :to key as the last argument (e.g. delegate :hello, :to => :greeter)."
|
7
|
+
end
|
8
|
+
|
9
|
+
methods.each do |method|
|
10
|
+
module_eval(<<-EOS, "(__DELEGATION__)", 1)
|
11
|
+
def #{method}(*args, &block)
|
12
|
+
#{to}.__send__(#{method.inspect}, *args, &block)
|
13
|
+
end
|
14
|
+
EOS
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/ruco/editor.rb
CHANGED
@@ -28,8 +28,8 @@ module Ruco
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def move(line, column)
|
31
|
-
@line
|
32
|
-
@column
|
31
|
+
@line += line
|
32
|
+
@column += column
|
33
33
|
adjust_view
|
34
34
|
end
|
35
35
|
|
@@ -120,6 +120,8 @@ module Ruco
|
|
120
120
|
end
|
121
121
|
|
122
122
|
def adjust_view
|
123
|
+
@line = [[@line, 0].max, lines.size - 1].min
|
124
|
+
@column = [[@column, 0].max, (lines[@line]||'').size].min
|
123
125
|
reposition_cursor
|
124
126
|
scroll_column_into_view
|
125
127
|
scroll_line_into_view
|
data/lib/ruco/form.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module Ruco
|
2
|
+
class Form
|
3
|
+
delegate :move, :delete, :to => :text_field
|
4
|
+
|
5
|
+
def initialize(label, options)
|
6
|
+
@options = options
|
7
|
+
@label = label.strip + ' '
|
8
|
+
reset
|
9
|
+
end
|
10
|
+
|
11
|
+
def view
|
12
|
+
@label + @text_field.view
|
13
|
+
end
|
14
|
+
|
15
|
+
def insert(text)
|
16
|
+
@text_field.insert(text.gsub("\n",''))
|
17
|
+
if text.include?("\n")
|
18
|
+
result = @text_field.value
|
19
|
+
result = result.to_i if @options[:type] == :integer
|
20
|
+
Command.new(@options[:command], result)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def cursor
|
25
|
+
[0, @label.size + @text_field.cursor[1]]
|
26
|
+
end
|
27
|
+
|
28
|
+
def reset
|
29
|
+
@text_field = TextField.new(:columns => @options[:columns] - @label.size)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_reader :text_field
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Ruco
|
2
|
+
class TextField
|
3
|
+
def initialize(options)
|
4
|
+
@options = options
|
5
|
+
@content = ''
|
6
|
+
@column = 0
|
7
|
+
end
|
8
|
+
|
9
|
+
def insert(text)
|
10
|
+
@content += text
|
11
|
+
move(0, text.size)
|
12
|
+
end
|
13
|
+
|
14
|
+
def delete(count)
|
15
|
+
if count > 0
|
16
|
+
@content.slice!(@column, count)
|
17
|
+
else
|
18
|
+
delete_start = [@column - count.abs, 0].max
|
19
|
+
@content[delete_start...@column] = ''
|
20
|
+
@column = delete_start
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def view
|
25
|
+
@content
|
26
|
+
end
|
27
|
+
|
28
|
+
def value
|
29
|
+
@content
|
30
|
+
end
|
31
|
+
|
32
|
+
def move(line, column)
|
33
|
+
@column = [[@column + column, 0].max, @content.size].min
|
34
|
+
end
|
35
|
+
|
36
|
+
def cursor
|
37
|
+
[0, @column]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
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.5"
|
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-10}
|
13
13
|
s.default_executable = %q{ruco}
|
14
14
|
s.email = %q{michael@grosser.it}
|
15
15
|
s.executables = ["ruco"]
|
@@ -24,15 +24,19 @@ Gem::Specification.new do |s|
|
|
24
24
|
"lib/ruco/command.rb",
|
25
25
|
"lib/ruco/command_bar.rb",
|
26
26
|
"lib/ruco/core_ext/array.rb",
|
27
|
+
"lib/ruco/core_ext/object.rb",
|
27
28
|
"lib/ruco/core_ext/string.rb",
|
28
29
|
"lib/ruco/editor.rb",
|
29
30
|
"lib/ruco/focusable.rb",
|
31
|
+
"lib/ruco/form.rb",
|
30
32
|
"lib/ruco/status_bar.rb",
|
33
|
+
"lib/ruco/text_field.rb",
|
31
34
|
"ruco.gemspec",
|
32
35
|
"spec/ruco/command_bar_spec.rb",
|
33
36
|
"spec/ruco/command_spec.rb",
|
34
37
|
"spec/ruco/core_ext/string_spec.rb",
|
35
38
|
"spec/ruco/editor_spec.rb",
|
39
|
+
"spec/ruco/form_spec.rb",
|
36
40
|
"spec/ruco/status_bar_spec.rb",
|
37
41
|
"spec/ruco_spec.rb",
|
38
42
|
"spec/spec_helper.rb"
|
@@ -46,6 +50,7 @@ Gem::Specification.new do |s|
|
|
46
50
|
"spec/ruco/command_spec.rb",
|
47
51
|
"spec/ruco/core_ext/string_spec.rb",
|
48
52
|
"spec/ruco/editor_spec.rb",
|
53
|
+
"spec/ruco/form_spec.rb",
|
49
54
|
"spec/ruco/status_bar_spec.rb",
|
50
55
|
"spec/ruco_spec.rb",
|
51
56
|
"spec/spec_helper.rb"
|
@@ -28,6 +28,14 @@ describe Ruco::CommandBar do
|
|
28
28
|
bar.cursor_column.should == 9
|
29
29
|
end
|
30
30
|
|
31
|
+
it "keeps entered stuff" do
|
32
|
+
bar.find
|
33
|
+
bar.insert('abc')
|
34
|
+
bar.find
|
35
|
+
bar.view.should == "Find: abc"
|
36
|
+
bar.cursor_column.should == 9
|
37
|
+
end
|
38
|
+
|
31
39
|
it "can reset the search" do
|
32
40
|
bar.find
|
33
41
|
bar.insert('abc')
|
@@ -54,4 +62,36 @@ describe Ruco::CommandBar do
|
|
54
62
|
result.should == Ruco::Command.new(:find, 'abcd')
|
55
63
|
end
|
56
64
|
end
|
65
|
+
|
66
|
+
describe :move_to_line do
|
67
|
+
it "displays a form" do
|
68
|
+
bar.move_to_line
|
69
|
+
bar.view.should == "Go to Line: "
|
70
|
+
end
|
71
|
+
|
72
|
+
it "gets output" do
|
73
|
+
bar.move_to_line
|
74
|
+
bar.insert('123')
|
75
|
+
result = bar.insert("\n")
|
76
|
+
result.should == Ruco::Command.new(:move_to_line, 123)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "gets reset" do
|
80
|
+
bar.move_to_line
|
81
|
+
bar.insert('123')
|
82
|
+
bar.move_to_line
|
83
|
+
bar.view.should == "Go to Line: "
|
84
|
+
end
|
85
|
+
|
86
|
+
it "does not reset search when resetting" do
|
87
|
+
bar.find
|
88
|
+
bar.insert('abc')
|
89
|
+
bar.move_to_line
|
90
|
+
bar.reset
|
91
|
+
|
92
|
+
bar.view.should include("^W Exit ") # default view
|
93
|
+
bar.find
|
94
|
+
bar.view.should == "Find: abc"
|
95
|
+
end
|
96
|
+
end
|
57
97
|
end
|
data/spec/ruco/editor_spec.rb
CHANGED
@@ -48,10 +48,10 @@ describe Ruco::Editor do
|
|
48
48
|
editor.cursor.should == [2,4]
|
49
49
|
end
|
50
50
|
|
51
|
-
it "
|
51
|
+
it "stays in last line when moving past lines" do
|
52
52
|
write(" ")
|
53
53
|
editor.move(6,3)
|
54
|
-
editor.cursor.should == [
|
54
|
+
editor.cursor.should == [0,3]
|
55
55
|
end
|
56
56
|
|
57
57
|
describe 'column scrolling' do
|
@@ -101,12 +101,27 @@ describe Ruco::Editor do
|
|
101
101
|
|
102
102
|
it "can scroll till end of file" do
|
103
103
|
editor.move(15,0)
|
104
|
-
editor.view.should == "\n\n\n"
|
104
|
+
editor.view.should == "9\n\n\n"
|
105
105
|
editor.cursor_line.should == 0
|
106
106
|
end
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
|
+
describe :move_to do
|
111
|
+
it "cannot move outside of text (bottom/right)" do
|
112
|
+
write("123\n456")
|
113
|
+
editor.move_to(10,10)
|
114
|
+
editor.cursor.should == [1,3]
|
115
|
+
end
|
116
|
+
|
117
|
+
it "cannot move outside of text (top/left)" do
|
118
|
+
write("123\n456")
|
119
|
+
editor.move(1,1)
|
120
|
+
editor.move_to(-10,-10)
|
121
|
+
editor.cursor.should == [0,0]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
110
125
|
describe :move_to_eol do
|
111
126
|
before do
|
112
127
|
write("\n aa \n ")
|
@@ -260,8 +275,9 @@ describe Ruco::Editor do
|
|
260
275
|
end
|
261
276
|
|
262
277
|
it "can add newlines to the moveable end" do
|
263
|
-
write('')
|
264
|
-
editor.move(
|
278
|
+
write('abc')
|
279
|
+
editor.move(0,3)
|
280
|
+
editor.insert("\n")
|
265
281
|
editor.insert("\n")
|
266
282
|
editor.cursor.should == [2,0]
|
267
283
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.expand_path('spec/spec_helper')
|
2
|
+
|
3
|
+
describe Ruco::Form do
|
4
|
+
let(:form){ Ruco::Form.new('Test', :columns => 30, :command => :find) }
|
5
|
+
|
6
|
+
it "positions cursor in text field" do
|
7
|
+
form.cursor.should == [0, 5]
|
8
|
+
end
|
9
|
+
|
10
|
+
describe :insert do
|
11
|
+
it "adds label size and input size" do
|
12
|
+
form.insert('abc')
|
13
|
+
form.cursor.should == [0, 8]
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns nil on any insert" do
|
17
|
+
form.insert('abc').should == nil
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns value on enter" do
|
21
|
+
form.insert('abc')
|
22
|
+
form.insert("d\n").should == Ruco::Command.new(:find, 'abcd')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe :move do
|
27
|
+
it "moves in text-field" do
|
28
|
+
form.insert('abc')
|
29
|
+
form.move(0, -1)
|
30
|
+
form.cursor.should == [0,7]
|
31
|
+
end
|
32
|
+
|
33
|
+
it "cannot move out of left side" do
|
34
|
+
form.move(0, -3)
|
35
|
+
form.cursor.should == [0,5]
|
36
|
+
end
|
37
|
+
|
38
|
+
it "cannot move out of right side" do
|
39
|
+
form.move(0, 4)
|
40
|
+
form.cursor.should == [0,5]
|
41
|
+
form.insert('abc')
|
42
|
+
form.move(0, 4)
|
43
|
+
form.cursor.should == [0,8]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe :delete do
|
48
|
+
it "removes characters forward" do
|
49
|
+
form.insert('abc')
|
50
|
+
form.move(0, -2)
|
51
|
+
form.delete(1)
|
52
|
+
form.view.should == 'Test ac'
|
53
|
+
end
|
54
|
+
|
55
|
+
it "removes characters backward" do
|
56
|
+
form.insert('abc')
|
57
|
+
form.move(0, -1)
|
58
|
+
form.delete(-1)
|
59
|
+
form.view.should == 'Test ac'
|
60
|
+
end
|
61
|
+
|
62
|
+
it "moves the cursor backward" do
|
63
|
+
form.insert('abc')
|
64
|
+
form.move(0, -1)
|
65
|
+
form.delete(-1)
|
66
|
+
form.cursor.should == [0,6]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe :view do
|
71
|
+
it "can be viewed" do
|
72
|
+
form.view.should == "Test "
|
73
|
+
end
|
74
|
+
end
|
75
|
+
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: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
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-10 00:00:00 +01:00
|
19
19
|
default_executable: ruco
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -38,15 +38,19 @@ files:
|
|
38
38
|
- lib/ruco/command.rb
|
39
39
|
- lib/ruco/command_bar.rb
|
40
40
|
- lib/ruco/core_ext/array.rb
|
41
|
+
- lib/ruco/core_ext/object.rb
|
41
42
|
- lib/ruco/core_ext/string.rb
|
42
43
|
- lib/ruco/editor.rb
|
43
44
|
- lib/ruco/focusable.rb
|
45
|
+
- lib/ruco/form.rb
|
44
46
|
- lib/ruco/status_bar.rb
|
47
|
+
- lib/ruco/text_field.rb
|
45
48
|
- ruco.gemspec
|
46
49
|
- spec/ruco/command_bar_spec.rb
|
47
50
|
- spec/ruco/command_spec.rb
|
48
51
|
- spec/ruco/core_ext/string_spec.rb
|
49
52
|
- spec/ruco/editor_spec.rb
|
53
|
+
- spec/ruco/form_spec.rb
|
50
54
|
- spec/ruco/status_bar_spec.rb
|
51
55
|
- spec/ruco_spec.rb
|
52
56
|
- spec/spec_helper.rb
|
@@ -89,6 +93,7 @@ test_files:
|
|
89
93
|
- spec/ruco/command_spec.rb
|
90
94
|
- spec/ruco/core_ext/string_spec.rb
|
91
95
|
- spec/ruco/editor_spec.rb
|
96
|
+
- spec/ruco/form_spec.rb
|
92
97
|
- spec/ruco/status_bar_spec.rb
|
93
98
|
- spec/ruco_spec.rb
|
94
99
|
- spec/spec_helper.rb
|