ruco 0.0.25 → 0.0.26

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.25
1
+ 0.0.26
@@ -1,7 +1,9 @@
1
1
  module Ruco
2
2
  class Editor
3
3
  attr_reader :file
4
- delegate :view, :selection, :text_in_selection, :color_mask, :selecting, :move, :cursor, :resize, :delete_line, :to => :text_area
4
+ attr_reader :text_area
5
+ private :text_area
6
+ delegate :view, :selection, :text_in_selection, :color_mask, :selecting, :move, :cursor, :resize, :to => :text_area
5
7
 
6
8
  def initialize(file, options)
7
9
  @file = file
@@ -11,15 +13,17 @@ module Ruco
11
13
  end
12
14
 
13
15
  def find(text)
14
- index = text_area.content.index(text, text_area.cursor_index+1) || text_area.cursor_index
15
- move :to, *text_area.position_for_index(index)
16
+ return unless start = text_area.content.index(text, text_area.index_for_position+1)
17
+ finish = start + text.size
18
+ move(:to_index, finish)
19
+ selecting{ move(:to_index, start) }
16
20
  end
17
21
 
18
22
  def reset;end
19
23
 
20
24
  def insert(text)
21
- @modified = true
22
25
  text_area.insert(text)
26
+ @modified = true
23
27
  end
24
28
 
25
29
  def delete(*args)
@@ -27,6 +31,11 @@ module Ruco
27
31
  @modified = true
28
32
  end
29
33
 
34
+ def delete_line(*args)
35
+ text_area.delete_line(*args)
36
+ @modified = true
37
+ end
38
+
30
39
  def modified?
31
40
  @modified
32
41
  end
@@ -35,9 +44,5 @@ module Ruco
35
44
  File.open(@file,'w'){|f| f.write(text_area.content) }
36
45
  @modified = false
37
46
  end
38
-
39
- private
40
-
41
- attr_reader :text_area
42
47
  end
43
48
  end
@@ -13,28 +13,17 @@ class Keyboard
13
13
  end
14
14
 
15
15
  def self.output
16
- @sequence = nil
16
+ @sequence = []
17
17
  @started = Time.now.to_f
18
18
 
19
19
  loop do
20
20
  key = fetch_user_input
21
21
  if sequence_finished?
22
- if needs_paste_fix?(@sequence)
23
- yield bytes_to_string(@sequence)
24
- else
25
- # weird stuff that happens when connected via ssh
26
- if @sequence == [27, 91, 49, 59, 50, 65]
27
- yield :"Shift+up"
28
- elsif @sequence == [27, 91, 49, 59, 50, 66]
29
- yield :"Shift+down"
30
- else
31
- bytes_to_key_codes(@sequence).each{|c| yield c }
32
- end
33
- end
34
- @sequence = nil
22
+ sequence_to_keys(@sequence).each{|key| yield key }
23
+ @sequence = []
35
24
  end
36
25
  next unless key
37
- start_or_append_sequence key
26
+ append_to_sequence key
38
27
  end
39
28
  end
40
29
 
@@ -88,9 +77,8 @@ class Keyboard
88
77
  key
89
78
  end
90
79
 
91
- def self.start_or_append_sequence(key)
80
+ def self.append_to_sequence(key)
92
81
  @started = Time.now.to_f
93
- @sequence ||= []
94
82
  @sequence << key
95
83
  end
96
84
 
@@ -101,26 +89,25 @@ class Keyboard
101
89
  # split a text so fast-typers do not get bugs like ^B^C in output
102
90
  def self.bytes_to_key_codes(bytes)
103
91
  result = []
104
- multi_byte = nil
92
+ multi_byte = []
93
+
94
+ append_multibyte = lambda{
95
+ unless multi_byte.empty?
96
+ result << bytes_to_string(multi_byte)
97
+ multi_byte = []
98
+ end
99
+ }
105
100
 
106
101
  bytes.each do |byte|
107
102
  if multi_byte_part?(byte)
108
- multi_byte ||= []
109
103
  multi_byte << byte
110
104
  else
111
- if multi_byte
112
- # finish multi-byte char
113
- result << bytes_to_string(multi_byte)
114
- multi_byte = nil
115
- end
105
+ append_multibyte.call
116
106
  result << translate_key_to_code(byte)
117
107
  end
118
108
  end
119
109
 
120
- if multi_byte
121
- result << bytes_to_string(multi_byte)
122
- end
123
-
110
+ append_multibyte.call
124
111
  result
125
112
  end
126
113
 
@@ -130,11 +117,37 @@ class Keyboard
130
117
  end
131
118
 
132
119
  def self.sequence_finished?
133
- @sequence and (Time.now.to_f - @started) > SEQUENCE_TIMEOUT
120
+ @sequence.size != 0 and (Time.now.to_f - @started) > SEQUENCE_TIMEOUT
134
121
  end
135
122
 
136
123
  # paste of multiple \n or \n in text would cause weird indentation
137
124
  def self.needs_paste_fix?(sequence)
138
125
  sequence.size > 1 and sequence.include?(ENTER)
139
126
  end
127
+
128
+ def self.sequence_to_keys(sequence)
129
+ if needs_paste_fix?(sequence)
130
+ [bytes_to_string(sequence)]
131
+ else
132
+ # weird stuff that happens when connected via ssh
133
+ if escape_sequence?(sequence)
134
+ [escape_sequence_to_key(sequence)]
135
+ else
136
+ bytes_to_key_codes(sequence)
137
+ end
138
+ end
139
+ end
140
+
141
+ def self.escape_sequence?(sequence)
142
+ sequence[0..1] == [27, 91] # Esc [
143
+ end
144
+
145
+ def self.escape_sequence_to_key(sequence)
146
+ case sequence
147
+ when [27, 91, 49, 59, 50, 65] then :"Shift+up"
148
+ when [27, 91, 49, 59, 50, 66] then :"Shift+down"
149
+ else
150
+ bytes_to_string(sequence)
151
+ end
152
+ end
140
153
  end
@@ -50,6 +50,7 @@ module Ruco
50
50
  when :to_eol then move_to_eol(*args)
51
51
  when :to_line then @line = args.first
52
52
  when :to_column then @column = args.first
53
+ when :to_index then move(:to, *position_for_index(*args))
53
54
  when :page_down then
54
55
  shift = @options[:lines] - 1
55
56
  @line += shift
@@ -111,7 +112,7 @@ module Ruco
111
112
  current_line.slice!(@column, count)
112
113
  else
113
114
  with_lines_as_string do |content|
114
- content.slice!(cursor_index, count)
115
+ content.slice!(index_for_position, count)
115
116
  end
116
117
  end
117
118
  else
@@ -128,21 +129,12 @@ module Ruco
128
129
  Cursor.new @cursor_line, @cursor_column
129
130
  end
130
131
 
131
- def cursor_index(line=@line, column=@column)
132
+ def index_for_position(line=@line, column=@column)
132
133
  index = lines[0...line].join("\n").size + column
133
134
  index += 1 if line > 0 # account for missing newline
134
135
  index
135
136
  end
136
137
 
137
- def index_for_position(line, column)
138
- cursor_index(line, column)
139
- end
140
-
141
- def position_for_index(index)
142
- jump = content.slice(0, index).to_s.naive_split("\n")
143
- [jump.size - 1, jump.last.size]
144
- end
145
-
146
138
  def content
147
139
  (lines * "\n").freeze
148
140
  end
@@ -154,6 +146,15 @@ module Ruco
154
146
 
155
147
  protected
156
148
 
149
+ def position
150
+ Cursor.new(@line, @column)
151
+ end
152
+
153
+ def position_for_index(index)
154
+ jump = content.slice(0, index).to_s.naive_split("\n")
155
+ [jump.size - 1, jump.last.size]
156
+ end
157
+
157
158
  def with_lines_as_string
158
159
  string = @lines * "\n"
159
160
  yield string
@@ -164,10 +165,6 @@ module Ruco
164
165
  current_line.index(/\s*$/)
165
166
  end
166
167
 
167
- def position
168
- [@line, @column]
169
- end
170
-
171
168
  def move_to_eol
172
169
  after_last_whitespace = current_line.size
173
170
 
@@ -194,7 +191,7 @@ module Ruco
194
191
  current_line.slice!(new_colum, count)
195
192
  move :to_column, new_colum
196
193
  else
197
- start_index = cursor_index - count
194
+ start_index = index_for_position - count
198
195
  if start_index < 0
199
196
  count += start_index
200
197
  start_index = 0
@@ -253,7 +250,7 @@ module Ruco
253
250
  def insert_into_content(text)
254
251
  if text.include?("\n")
255
252
  with_lines_as_string do |content|
256
- content.insert(cursor_index, text)
253
+ content.insert(index_for_position, text)
257
254
  end
258
255
  else
259
256
  # faster but complicated for newlines
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ruco}
8
- s.version = "0.0.25"
8
+ s.version = "0.0.26"
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-25}
12
+ s.date = %q{2011-01-26}
13
13
  s.default_executable = %q{ruco}
14
14
  s.email = %q{michael@grosser.it}
15
15
  s.executables = ["ruco"]
@@ -51,7 +51,7 @@ Gem::Specification.new do |s|
51
51
  ]
52
52
  s.homepage = %q{http://github.com/grosser/ruco}
53
53
  s.require_paths = ["lib"]
54
- s.rubygems_version = %q{1.4.2}
54
+ s.rubygems_version = %q{1.3.7}
55
55
  s.summary = %q{Commandline editor written in ruby}
56
56
  s.test_files = [
57
57
  "spec/ruco/application_spec.rb",
@@ -68,6 +68,7 @@ Gem::Specification.new do |s|
68
68
  ]
69
69
 
70
70
  if s.respond_to? :specification_version then
71
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
71
72
  s.specification_version = 3
72
73
 
73
74
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
@@ -536,6 +536,11 @@ describe Ruco::Editor do
536
536
  editor.save
537
537
  editor.modified?.should == false
538
538
  end
539
+
540
+ it "is changed after delete_line" do
541
+ editor.delete_line
542
+ editor.modified?.should == true
543
+ end
539
544
  end
540
545
 
541
546
  describe :find do
@@ -559,6 +564,11 @@ describe Ruco::Editor do
559
564
  editor.find('ab')
560
565
  editor.cursor.should == [2,1]
561
566
  end
567
+
568
+ it "selects the occurrence" do
569
+ editor.find('ab')
570
+ editor.selection.should == ([1, 1]..[1, 3])
571
+ end
562
572
  end
563
573
 
564
574
  describe :delete_line do
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruco
3
3
  version: !ruby/object:Gem::Version
4
- hash: 45
5
- prerelease:
4
+ prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 0
9
- - 25
10
- version: 0.0.25
8
+ - 26
9
+ version: 0.0.26
11
10
  platform: ruby
12
11
  authors:
13
12
  - Michael Grosser
@@ -15,25 +14,24 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2011-01-25 00:00:00 +01:00
17
+ date: 2011-01-26 00:00:00 +01:00
19
18
  default_executable: ruco
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
21
+ name: clipboard
22
22
  requirement: &id001 !ruby/object:Gem::Requirement
23
23
  none: false
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- hash: 51
28
27
  segments:
29
28
  - 0
30
29
  - 9
31
30
  - 4
32
31
  version: 0.9.4
32
+ type: :runtime
33
33
  prerelease: false
34
34
  version_requirements: *id001
35
- type: :runtime
36
- name: clipboard
37
35
  description:
38
36
  email: michael@grosser.it
39
37
  executables:
@@ -91,7 +89,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
89
  requirements:
92
90
  - - ">="
93
91
  - !ruby/object:Gem::Version
94
- hash: 3
92
+ hash: -84268255
95
93
  segments:
96
94
  - 0
97
95
  version: "0"
@@ -100,14 +98,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
98
  requirements:
101
99
  - - ">="
102
100
  - !ruby/object:Gem::Version
103
- hash: 3
104
101
  segments:
105
102
  - 0
106
103
  version: "0"
107
104
  requirements: []
108
105
 
109
106
  rubyforge_project:
110
- rubygems_version: 1.4.2
107
+ rubygems_version: 1.3.7
111
108
  signing_key:
112
109
  specification_version: 3
113
110
  summary: Commandline editor written in ruby