ruco 0.1.8 → 0.1.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/Readme.md +3 -1
- data/VERSION +1 -1
- data/lib/ruco/core_ext/object.rb +7 -1
- data/lib/ruco/core_ext/string.rb +6 -0
- data/lib/ruco/text_area.rb +34 -1
- data/ruco.gemspec +2 -2
- data/spec/ruco/core_ext/string_spec.rb +16 -1
- data/spec/ruco/text_area_spec.rb +96 -0
- metadata +4 -4
data/Readme.md
CHANGED
@@ -15,7 +15,7 @@ Features:
|
|
15
15
|
- stays at last position when reopening a file
|
16
16
|
- opens file at line with `ruco foo/bar.rb:32` syntax
|
17
17
|
- keeps whatever newline format you use (\r \n \r\n)
|
18
|
-
-
|
18
|
+
- surrounds selection with quotes/braces (select abc + " --> "abc")
|
19
19
|
- (optional) remove trailing whitespace on save
|
20
20
|
- (optional) blank line before eof on save
|
21
21
|
- (optional) line numbers
|
@@ -82,6 +82,7 @@ TIPS
|
|
82
82
|
|
83
83
|
TODO
|
84
84
|
=====
|
85
|
+
- do not fall back to 0:0 after undoing the first change
|
85
86
|
- slow when opening file with 10,000+ short lines -> investigate
|
86
87
|
- check writable status every x seconds (e.g. in background) -> faster while typing
|
87
88
|
- search help e.g. 'Nothing found' '#4 of 6 hits' 'no more hits, start from beginning ?'
|
@@ -98,6 +99,7 @@ TODO
|
|
98
99
|
- add auto-confirm to 'replace?' dialog -> type s == skip, no enter needed
|
99
100
|
- 1.8: unicode support <-> already finished but unusable due to Curses (see encoding branch)
|
100
101
|
- shorten long file names in the middle/start, not at the end
|
102
|
+
- add double quotes/braces when typing one + skip over quote/brace when its already typed at current position
|
101
103
|
|
102
104
|
Authors
|
103
105
|
=======
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.9
|
data/lib/ruco/core_ext/object.rb
CHANGED
@@ -13,7 +13,7 @@ def #{method}(*args, &block)
|
|
13
13
|
end
|
14
14
|
EOS
|
15
15
|
end
|
16
|
-
end
|
16
|
+
end unless defined? delegate
|
17
17
|
end
|
18
18
|
|
19
19
|
class Object
|
@@ -44,3 +44,9 @@ class Object
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
47
|
+
|
48
|
+
class Object
|
49
|
+
def deep_copy
|
50
|
+
Marshal.load(Marshal.dump(self))
|
51
|
+
end unless defined? deep_copy
|
52
|
+
end
|
data/lib/ruco/core_ext/string.rb
CHANGED
@@ -36,6 +36,12 @@ class String
|
|
36
36
|
bytes.first
|
37
37
|
end
|
38
38
|
end
|
39
|
+
|
40
|
+
def surrounded_in?(*words)
|
41
|
+
first = words.first
|
42
|
+
last = words.last
|
43
|
+
slice(0,first.size) == first and slice(-last.size,last.size) == last
|
44
|
+
end
|
39
45
|
end
|
40
46
|
|
41
47
|
# http://grosser.it/2010/12/31/ruby-string-indexes-indices-find-all-indexes-in-a-string
|
data/lib/ruco/text_area.rb
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
module Ruco
|
2
2
|
class TextArea
|
3
|
+
SURROUNDING_CHARS = {
|
4
|
+
'<' => '>',
|
5
|
+
'(' => ')',
|
6
|
+
'[' => ']',
|
7
|
+
'{' => '}',
|
8
|
+
'"' => '"',
|
9
|
+
"'" => "'",
|
10
|
+
'/' => '/'
|
11
|
+
}
|
12
|
+
|
3
13
|
attr_reader :lines, :selection, :column, :line
|
4
14
|
|
5
15
|
def initialize(content, options)
|
@@ -78,7 +88,13 @@ module Ruco
|
|
78
88
|
end
|
79
89
|
|
80
90
|
def insert(text)
|
81
|
-
|
91
|
+
if @selection
|
92
|
+
if SURROUNDING_CHARS[text]
|
93
|
+
return surround_selection_with(text)
|
94
|
+
else
|
95
|
+
delete_content_in_selection
|
96
|
+
end
|
97
|
+
end
|
82
98
|
|
83
99
|
text.tabs_to_spaces!
|
84
100
|
if text == "\n" and @column >= current_line.leading_whitespace.size
|
@@ -269,5 +285,22 @@ module Ruco
|
|
269
285
|
sanitize_position
|
270
286
|
@window.set_position(position, :max_lines => @lines.size)
|
271
287
|
end
|
288
|
+
|
289
|
+
def surround_selection_with(text)
|
290
|
+
open_char = text
|
291
|
+
close_char = SURROUNDING_CHARS[text]
|
292
|
+
old_selection = @selection.deep_copy
|
293
|
+
selected = text_in_selection
|
294
|
+
|
295
|
+
replace_surrounding_chars = SURROUNDING_CHARS.any?{|chars| selected.surrounded_in?(*chars) }
|
296
|
+
if replace_surrounding_chars
|
297
|
+
selected = selected[1..-2]
|
298
|
+
else
|
299
|
+
old_selection.last.column += 2
|
300
|
+
end
|
301
|
+
|
302
|
+
insert("#{open_char}#{selected}#{close_char}")
|
303
|
+
@selection = old_selection
|
304
|
+
end
|
272
305
|
end
|
273
306
|
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.1.
|
8
|
+
s.version = "0.1.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"]
|
12
|
-
s.date = %q{2011-08-
|
12
|
+
s.date = %q{2011-08-24}
|
13
13
|
s.default_executable = %q{ruco}
|
14
14
|
s.email = %q{michael@grosser.it}
|
15
15
|
s.executables = ["ruco"]
|
@@ -14,4 +14,19 @@ describe String do
|
|
14
14
|
"".naive_split('a').should == ['']
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
|
+
describe :surrounded_in? do
|
19
|
+
[
|
20
|
+
['aba','a',true],
|
21
|
+
['abcab','ab',true],
|
22
|
+
['acc','a',false],
|
23
|
+
['cca','a',false],
|
24
|
+
['(cca)',['(',')'],true],
|
25
|
+
['(cca',['(',')'],false],
|
26
|
+
].each do |text, word, success|
|
27
|
+
it "is #{success} for #{word} in #{text}" do
|
28
|
+
text.surrounded_in?(*[*word]).should == success
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/spec/ruco/text_area_spec.rb
CHANGED
@@ -54,4 +54,100 @@ describe Ruco::TextArea do
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
57
|
+
|
58
|
+
describe :insert do
|
59
|
+
let(:text){Ruco::TextArea.new("", :lines => 3, :columns => 10)}
|
60
|
+
|
61
|
+
describe "inserting surrounding characters" do
|
62
|
+
xit "does nothing special when pasting" do
|
63
|
+
text.insert("'bar'")
|
64
|
+
text.view.should == "'bar'\n\n"
|
65
|
+
text.cursor.should == [0,5]
|
66
|
+
end
|
67
|
+
|
68
|
+
xit "inserts a pair when just typing" do
|
69
|
+
text.insert("'")
|
70
|
+
text.view.should == "''\n\n"
|
71
|
+
text.cursor.should == [0,1]
|
72
|
+
end
|
73
|
+
|
74
|
+
xit "closes the surround if only char in surround" do
|
75
|
+
text.insert("'")
|
76
|
+
text.insert("'")
|
77
|
+
text.view.should == "''\n\n"
|
78
|
+
text.cursor.should == [0,2]
|
79
|
+
end
|
80
|
+
|
81
|
+
xit "overwrites next if its the same" do
|
82
|
+
text.insert("'bar'")
|
83
|
+
text.move(:relative, 0,-1)
|
84
|
+
text.insert("'")
|
85
|
+
text.view.should == "'bar'\n\n"
|
86
|
+
text.cursor.should == [0,5]
|
87
|
+
end
|
88
|
+
|
89
|
+
it "surrounds text when selecting" do
|
90
|
+
text.insert('bar')
|
91
|
+
text.move(:to, 0,0)
|
92
|
+
text.selecting{ move(:to, 0,2) }
|
93
|
+
text.insert("{")
|
94
|
+
text.view.should == "{ba}r\n\n"
|
95
|
+
text.cursor.should == [0,4]
|
96
|
+
end
|
97
|
+
|
98
|
+
it "does not surround text with closing char when selecting" do
|
99
|
+
text.insert('bar')
|
100
|
+
text.move(:to, 0,0)
|
101
|
+
text.selecting{ move(:to, 0,2) }
|
102
|
+
text.insert("}")
|
103
|
+
text.view.should == "}r\n\n"
|
104
|
+
text.cursor.should == [0,1]
|
105
|
+
end
|
106
|
+
|
107
|
+
it "replaces surrounding quotes" do
|
108
|
+
text.insert('"bar"')
|
109
|
+
text.move(:to, 0,0)
|
110
|
+
text.selecting{ move(:to, 0,5) }
|
111
|
+
text.insert("'")
|
112
|
+
text.view.should == "'bar'\n\n"
|
113
|
+
text.cursor.should == [0,5]
|
114
|
+
end
|
115
|
+
|
116
|
+
it "replace surrounding braces" do
|
117
|
+
text.insert('(bar)')
|
118
|
+
text.move(:to, 0,0)
|
119
|
+
text.selecting{ move(:to, 0,5) }
|
120
|
+
text.insert("'")
|
121
|
+
text.view.should == "'bar'\n\n"
|
122
|
+
text.cursor.should == [0,5]
|
123
|
+
end
|
124
|
+
|
125
|
+
it "does not replace when only one side has surrounding char" do
|
126
|
+
text.insert("\"bar\"")
|
127
|
+
text.move(:to, 0,0)
|
128
|
+
text.selecting{ move(:to, 0,3) }
|
129
|
+
text.insert("'")
|
130
|
+
text.view.should == "'\"ba'r\"\n\n"
|
131
|
+
text.cursor.should == [0,5]
|
132
|
+
end
|
133
|
+
|
134
|
+
it "expands selection when surrounding" do
|
135
|
+
text.insert('bar')
|
136
|
+
text.move(:to, 0,0)
|
137
|
+
text.selecting{ move(:to, 0,2) }
|
138
|
+
text.insert("{")
|
139
|
+
text.view.should == "{ba}r\n\n"
|
140
|
+
text.selection.should == ([0,0]..[0,4])
|
141
|
+
end
|
142
|
+
|
143
|
+
it "keeps selection when replacing surround" do
|
144
|
+
text.insert('"bar"')
|
145
|
+
text.move(:to, 0,0)
|
146
|
+
text.selecting{ move(:to, 0,5) }
|
147
|
+
text.insert("'")
|
148
|
+
text.view.should == "'bar'\n\n"
|
149
|
+
text.selection.should == ([0,0]..[0,5])
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
57
153
|
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: 9
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 9
|
10
|
+
version: 0.1.9
|
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-08-
|
18
|
+
date: 2011-08-24 00:00:00 +02:00
|
19
19
|
default_executable: ruco
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|