ruco 0.0.8 → 0.0.9

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/Rakefile CHANGED
@@ -20,15 +20,19 @@ end
20
20
  task :key do
21
21
  require 'curses'
22
22
 
23
- Curses.noecho
24
- Curses.raw
25
- Curses.stdscr.keypad(true)
23
+ Curses.cbreak # provide unbuffered input
24
+ Curses.noecho # turn off input echoing
25
+ Curses.nonl # turn off newline translation
26
+ Curses.stdscr.keypad(true) # turn on keypad mode
27
+ # Curses.stdscr.nodelay = 1
28
+
26
29
 
27
30
  count = 0
28
31
  loop do
29
- count = (count + 1) % 20
30
32
  key = Curses.getch
33
+ next if key == 4294967295 # placeholder key when using nodelay mode
31
34
  break if key == ?\C-c
35
+ count = (count + 1) % 20
32
36
  Curses.setpos(count,0)
33
37
  Curses.addstr("#{key.inspect} ");
34
38
  end
data/Readme.md CHANGED
@@ -23,7 +23,8 @@ Usage
23
23
 
24
24
  TODO
25
25
  =====
26
- - backspace on mac ?
26
+ - support typing unicode like äöß etc (rework size / make strings utf8-aware)
27
+ - ask before quitting on changed file
27
28
  - bind/action must use instance_exec
28
29
  - read .rucorc.rb
29
30
  - write key binding guide
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.8
1
+ 0.0.9
data/bin/ruco CHANGED
@@ -38,8 +38,9 @@ def write(line,row,text)
38
38
  end
39
39
 
40
40
  def init_screen
41
- Curses.noecho # do not show typed chars
42
41
  Curses.init_screen
42
+ Curses.noecho # do not show typed chars
43
+ Curses.nonl # turn off newline translation
43
44
  Curses.stdscr.keypad(true) # enable arrow keys
44
45
  Curses.raw # give us all other keys
45
46
 
data/lib/ruco.rb CHANGED
@@ -3,7 +3,6 @@ require 'ruco/core_ext/string'
3
3
  require 'ruco/core_ext/array'
4
4
 
5
5
  require 'ruco/cursor'
6
- require 'ruco/command'
7
6
 
8
7
  require 'ruco/editor'
9
8
  require 'ruco/status_bar'
@@ -50,11 +50,7 @@ module Ruco
50
50
  when :tab then @focused.insert("\t")
51
51
  when 32..126 then @focused.insert(key.chr) # printable
52
52
  when :enter then
53
- result = @focused.insert("\n")
54
- if result.is_a?(Ruco::Command)
55
- result.send_to(@editor)
56
- @focused = @editor
57
- end
53
+ @focused.insert("\n")
58
54
  when :backspace then @focused.delete(-1)
59
55
  when :delete then @focused.delete(1)
60
56
 
@@ -65,6 +61,7 @@ module Ruco
65
61
  end
66
62
 
67
63
  def bind(key, action=nil, &block)
64
+ raise "Ctrl+m cannot be bound" if key == :"Ctrl+m" # would shadow enter -> bad
68
65
  raise if action and block
69
66
  @bindings[key] = action || block
70
67
  end
@@ -73,6 +70,14 @@ module Ruco
73
70
  @actions[name] = block
74
71
  end
75
72
 
73
+ def ask(question, options={}, &block)
74
+ @focused = @command
75
+ @command.ask(question, options) do |response|
76
+ @focused = @editor
77
+ block.call(response)
78
+ end
79
+ end
80
+
76
81
  private
77
82
 
78
83
  def setup_actions
@@ -85,8 +90,7 @@ module Ruco
85
90
  end
86
91
 
87
92
  action :go_to_line do
88
- @focused = @command
89
- @command.move_to_line
93
+ ask('Go to Line: '){|result| @editor.move(:to_line, result.to_i) }
90
94
  end
91
95
 
92
96
  action :delete_line do
@@ -94,8 +98,7 @@ module Ruco
94
98
  end
95
99
 
96
100
  action :find do
97
- @focused = @command
98
- @command.find
101
+ ask("Find: ", :cache => true){|result| @editor.find(result) }
99
102
  end
100
103
  end
101
104
 
@@ -25,23 +25,17 @@ module Ruco
25
25
  end
26
26
  end
27
27
 
28
- def find
29
- @forms_cache[:find] ||= Form.new('Find: ', :columns => @options[:columns]) do |value|
30
- @form = nil
31
- Command.new(:find, value)
32
- end
33
- @form = @forms_cache[:find]
34
- end
35
-
36
- def move_to_line
37
- @form = Form.new('Go to Line: ', :columns => @options[:columns], :type => :integer) do |value|
38
- @form = nil
39
- Command.new(:move, :to_line, value.to_i)
28
+ def ask(question, options={}, &block)
29
+ @form = cached_form_if(options[:cache], question) do
30
+ Form.new(question, :columns => @options[:columns]) do |result|
31
+ @form = nil
32
+ block.call(result)
33
+ end
40
34
  end
41
35
  end
42
36
 
43
37
  def reset
44
- @forms_cache[:find] = nil if @form == @forms_cache[:find]
38
+ @forms_cache[@forms_cache.index(@form)] = nil
45
39
  @form = nil
46
40
  end
47
41
 
@@ -55,6 +49,14 @@ module Ruco
55
49
 
56
50
  private
57
51
 
52
+ def cached_form_if(cache, question)
53
+ if cache
54
+ @forms_cache[question] ||= yield
55
+ else
56
+ yield
57
+ end
58
+ end
59
+
58
60
  def available_shortcuts
59
61
  used_columns = 0
60
62
  spacer = ' '
data/lib/ruco/form.rb CHANGED
@@ -15,11 +15,7 @@ module Ruco
15
15
 
16
16
  def insert(text)
17
17
  @text_field.insert(text.gsub("\n",''))
18
- if text.include?("\n")
19
- result = @text_field.value
20
- result = result.to_i if @options[:type] == :integer
21
- @submit.call(result)
22
- end
18
+ @submit.call(@text_field.value) if text.include?("\n")
23
19
  end
24
20
 
25
21
  def cursor
data/lib/ruco/keyboard.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  class Keyboard
2
+ A_TO_Z = ('a'..'z').to_a
3
+
2
4
  def self.listen
3
5
  loop do
4
6
  key = Curses.getch
@@ -17,19 +19,15 @@ class Keyboard
17
19
 
18
20
  # modify
19
21
  when 9 then :tab
22
+ when 13 then :enter # shadows Ctrl+m
20
23
  when 32..126 then key # printable
21
- when 10 then :enter
22
- when 263 then :backspace
24
+ when 263, 127 then :backspace # ubuntu / mac
23
25
  when Curses::KEY_DC then :delete
24
26
 
25
27
  # misc
26
- when ?\C-d then :"Ctrl+d"
27
- when ?\C-f then :"Ctrl+f"
28
- when ?\C-g then :"Ctrl+g"
28
+ when 0 then :"Ctrl+space"
29
+ when 1..26 then :"Ctrl+#{A_TO_Z[key-1]}"
29
30
  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
31
  else
34
32
  key
35
33
  end
data/ruco.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ruco}
8
- s.version = "0.0.8"
8
+ s.version = "0.0.9"
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"]
@@ -22,7 +22,6 @@ Gem::Specification.new do |s|
22
22
  "bin/ruco",
23
23
  "lib/ruco.rb",
24
24
  "lib/ruco/application.rb",
25
- "lib/ruco/command.rb",
26
25
  "lib/ruco/command_bar.rb",
27
26
  "lib/ruco/core_ext/array.rb",
28
27
  "lib/ruco/core_ext/object.rb",
@@ -37,7 +36,6 @@ Gem::Specification.new do |s|
37
36
  "ruco.gemspec",
38
37
  "spec/ruco/application_spec.rb",
39
38
  "spec/ruco/command_bar_spec.rb",
40
- "spec/ruco/command_spec.rb",
41
39
  "spec/ruco/core_ext/string_spec.rb",
42
40
  "spec/ruco/editor_spec.rb",
43
41
  "spec/ruco/form_spec.rb",
@@ -53,7 +51,6 @@ Gem::Specification.new do |s|
53
51
  s.test_files = [
54
52
  "spec/ruco/application_spec.rb",
55
53
  "spec/ruco/command_bar_spec.rb",
56
- "spec/ruco/command_spec.rb",
57
54
  "spec/ruco/core_ext/string_spec.rb",
58
55
  "spec/ruco/editor_spec.rb",
59
56
  "spec/ruco/form_spec.rb",
@@ -15,91 +15,69 @@ describe Ruco::CommandBar do
15
15
  bar.view.should == "^W Exit ^S Save"
16
16
  end
17
17
 
18
- describe :find do
19
- it "sets command bar into search mode" do
20
- bar.find
18
+ describe :ask do
19
+ it "sets command bar into question mode" do
20
+ bar.ask('Find: '){}
21
21
  bar.view.should == "Find: "
22
22
  bar.cursor.column.should == 6
23
23
  end
24
24
 
25
- it "can enter stuff" do
26
- bar.find
25
+ it "can enter answer" do
26
+ bar.ask('Find: '){}
27
27
  bar.insert('abc')
28
28
  bar.view.should == "Find: abc"
29
29
  bar.cursor.column.should == 9
30
30
  end
31
31
 
32
- it "keeps entered stuff" do
33
- bar.find
32
+ it "gets reset when submitting" do
33
+ bar.ask('Find: '){}
34
+ bar.insert("123\n")
35
+ bar.view.should == default_view
36
+ end
37
+
38
+ it "keeps entered answer when cached" do
39
+ bar.ask('Find: ', :cache => true){}
34
40
  bar.insert('abc')
35
41
  bar.insert("\n")
36
- bar.find
42
+ bar.ask('Find: ', :cache => true){}
37
43
  bar.view.should == "Find: abc"
38
44
  bar.cursor.column.should == 9
39
45
  end
40
46
 
41
- it "can reset the search" do
42
- bar.find
47
+ it "reset the question when cached" do
48
+ bar.ask('Find: ', :cache => true){}
43
49
  bar.insert('abc')
44
50
  bar.reset
45
51
 
46
52
  bar.view.should == default_view
47
- bar.find
53
+ bar.ask('Find: ', :cache => true){}
48
54
  bar.view.should == "Find: " # term removed
49
55
  end
50
56
 
51
- it "can execute a search" do
52
- bar.find
53
- bar.insert('abc')
54
- result = bar.insert("d\n")
55
- result.should == Ruco::Command.new(:find, 'abcd')
56
- end
57
+ it "does not reset all cached questions" do
58
+ bar.ask('Find: ', :cache => true){}
59
+ bar.insert("abc\n")
57
60
 
58
- it "finds with offset when same search is entered again" do
59
- bar.find
60
- bar.insert('abcd')
61
- bar.insert("\n")
62
- bar.find
63
- result = bar.insert("\n")
64
- result.should == Ruco::Command.new(:find, 'abcd')
65
- end
66
- end
67
-
68
- describe :move_to_line do
69
- it "displays a form" do
70
- bar.move_to_line
71
- bar.view.should == "Go to Line: "
72
- end
61
+ bar.ask('Foo: ', :cache => true){}
62
+ bar.reset # clears Foo not Find
63
+ bar.view.should == default_view
73
64
 
74
- it "gets output" do
75
- bar.move_to_line
76
- bar.insert('123')
77
- result = bar.insert("\n")
78
- result.should == Ruco::Command.new(:move, :to_line, 123)
65
+ bar.ask('Find: ', :cache => true){}
66
+ bar.view.should == "Find: abc"
79
67
  end
80
68
 
81
- it "gets reset when starting a new go to line" do
82
- bar.move_to_line
69
+ it "gets reset when starting a new question" do
70
+ bar.ask('Find: '){}
83
71
  bar.insert('123')
84
- bar.move_to_line
85
- bar.view.should == "Go to Line: "
86
- end
87
-
88
- it "gets reset when submitting" do
89
- bar.move_to_line
90
- bar.insert("123\n")
91
- bar.view.should == default_view
72
+ bar.ask('Find: '){}
73
+ bar.view.should == "Find: "
92
74
  end
93
75
 
94
- it "does not reset search when resetting" do
95
- bar.find
76
+ it "can execute" do
77
+ bar.ask('Find: ', :cache => true){|r| @result = r }
96
78
  bar.insert('abc')
97
- bar.move_to_line
98
- bar.reset
99
-
100
- bar.view.should == default_view
101
- bar.find
102
- bar.view.should == "Find: abc"
79
+ bar.insert("d\n")
80
+ @result.should == 'abcd'
103
81
  end
104
82
  end
105
83
  end
@@ -1,7 +1,7 @@
1
1
  require File.expand_path('spec/spec_helper')
2
2
 
3
3
  describe Ruco::Form do
4
- let(:form){ Ruco::Form.new('Test', :columns => 30){|value| Ruco::Command.new(:find, value) } }
4
+ let(:form){ Ruco::Form.new('Test', :columns => 30){|value| @result = value } }
5
5
 
6
6
  it "positions cursor in text field" do
7
7
  form.cursor.should == [0, 5]
@@ -13,13 +13,15 @@ describe Ruco::Form do
13
13
  form.cursor.should == [0, 8]
14
14
  end
15
15
 
16
- it "returns nil on any insert" do
17
- form.insert('abc').should == nil
16
+ it "does not return result on normal insert" do
17
+ form.insert('abc')
18
+ @result.should == nil
18
19
  end
19
20
 
20
- it "returns value on enter" do
21
+ it "returns result on enter" do
21
22
  form.insert('abc')
22
- form.insert("d\n").should == Ruco::Command.new(:find, 'abcd')
23
+ form.insert("d\n")
24
+ @result.should == "abcd"
23
25
  end
24
26
  end
25
27
 
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: 15
4
+ hash: 13
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 8
10
- version: 0.0.8
9
+ - 9
10
+ version: 0.0.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Michael Grosser
@@ -36,7 +36,6 @@ files:
36
36
  - bin/ruco
37
37
  - lib/ruco.rb
38
38
  - lib/ruco/application.rb
39
- - lib/ruco/command.rb
40
39
  - lib/ruco/command_bar.rb
41
40
  - lib/ruco/core_ext/array.rb
42
41
  - lib/ruco/core_ext/object.rb
@@ -51,7 +50,6 @@ files:
51
50
  - ruco.gemspec
52
51
  - spec/ruco/application_spec.rb
53
52
  - spec/ruco/command_bar_spec.rb
54
- - spec/ruco/command_spec.rb
55
53
  - spec/ruco/core_ext/string_spec.rb
56
54
  - spec/ruco/editor_spec.rb
57
55
  - spec/ruco/form_spec.rb
@@ -96,7 +94,6 @@ summary: Commandline editor written in ruby
96
94
  test_files:
97
95
  - spec/ruco/application_spec.rb
98
96
  - spec/ruco/command_bar_spec.rb
99
- - spec/ruco/command_spec.rb
100
97
  - spec/ruco/core_ext/string_spec.rb
101
98
  - spec/ruco/editor_spec.rb
102
99
  - spec/ruco/form_spec.rb
data/lib/ruco/command.rb DELETED
@@ -1,19 +0,0 @@
1
- module Ruco
2
- # Used to pass around commands
3
- class Command
4
- attr_reader :method, :args
5
-
6
- def initialize(method, *args)
7
- @method = method
8
- @args = args
9
- end
10
-
11
- def send_to(object)
12
- object.send(@method, *@args)
13
- end
14
-
15
- def ==(other)
16
- other.method == method and other.args == args
17
- end
18
- end
19
- end
@@ -1,11 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- describe Ruco::Command do
4
- it "can invoke a recorded command" do
5
- Ruco::Command.new(:slice, 0,1).send_to("ab1").should == 'a'
6
- end
7
-
8
- it "can invoke a recorded command without arguments" do
9
- Ruco::Command.new(:strip).send_to(" a ").should == 'a'
10
- end
11
- end