ruco 0.0.48 → 0.0.49
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme.md +1 -0
- data/VERSION +1 -1
- data/lib/ruco/application.rb +5 -1
- data/lib/ruco/core_ext/string.rb +5 -1
- data/lib/ruco/editor.rb +1 -1
- data/lib/ruco/editor_area.rb +11 -1
- data/lib/ruco/keyboard.rb +28 -7
- data/ruco.gemspec +4 -3
- data/spec/ruco/application_spec.rb +1 -1
- data/spec/ruco/editor_spec.rb +42 -0
- metadata +8 -11
data/Readme.md
CHANGED
@@ -4,6 +4,7 @@ Features:
|
|
4
4
|
|
5
5
|
- **Intuitive interface**
|
6
6
|
- selecting via Shift+left/right/up/down (only on Linux) and Ctrl+a(all)
|
7
|
+
- move line up/down (Alt+Ctrl+up/down)
|
7
8
|
- Tab -> indent / Shift+Tab -> unindent
|
8
9
|
- keeps indentation (+ paste-detection e.g. via Cmd+v)
|
9
10
|
- change (*) + writable (!) indicators
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.49
|
data/lib/ruco/application.rb
CHANGED
@@ -209,6 +209,8 @@ module Ruco
|
|
209
209
|
|
210
210
|
action(:undo){ @editor.undo if @focused == @editor }
|
211
211
|
action(:redo){ @editor.redo if @focused == @editor }
|
212
|
+
action(:move_line_up){ @editor.move_line(-1) if @focused == @editor }
|
213
|
+
action(:move_line_down){ @editor.move_line(1) if @focused == @editor }
|
212
214
|
end
|
213
215
|
|
214
216
|
def setup_keys
|
@@ -226,6 +228,8 @@ module Ruco
|
|
226
228
|
bind :"Ctrl+v", :paste
|
227
229
|
bind :"Ctrl+z", :undo
|
228
230
|
bind :"Ctrl+y", :redo
|
231
|
+
bind :"Alt+Ctrl+down", :move_line_down
|
232
|
+
bind :"Alt+Ctrl+up", :move_line_up
|
229
233
|
end
|
230
234
|
|
231
235
|
def load_user_config
|
@@ -269,4 +273,4 @@ module Ruco
|
|
269
273
|
[file, go_to_line]
|
270
274
|
end
|
271
275
|
end
|
272
|
-
end
|
276
|
+
end
|
data/lib/ruco/core_ext/string.rb
CHANGED
@@ -20,6 +20,10 @@ class String
|
|
20
20
|
match(/^\s*/)[0]
|
21
21
|
end
|
22
22
|
|
23
|
+
def leading_whitespace=(whitespace)
|
24
|
+
sub!(/^\s*/, whitespace)
|
25
|
+
end
|
26
|
+
|
23
27
|
# stub for 1.8
|
24
28
|
unless method_defined?(:force_encoding)
|
25
29
|
def force_encoding(encoding)
|
@@ -44,4 +48,4 @@ class String
|
|
44
48
|
end
|
45
49
|
found
|
46
50
|
end
|
47
|
-
end
|
51
|
+
end
|
data/lib/ruco/editor.rb
CHANGED
data/lib/ruco/editor_area.rb
CHANGED
@@ -27,6 +27,16 @@ module Ruco
|
|
27
27
|
sanitize_position
|
28
28
|
end
|
29
29
|
|
30
|
+
def move_line(direction)
|
31
|
+
old = line
|
32
|
+
new = line + direction
|
33
|
+
return if new < 0
|
34
|
+
return if new >= lines.size
|
35
|
+
lines[old].leading_whitespace = lines[new].leading_whitespace
|
36
|
+
lines[old], lines[new] = lines[new], lines[old]
|
37
|
+
@line += direction
|
38
|
+
end
|
39
|
+
|
30
40
|
def indent
|
31
41
|
selected_lines.each do |line|
|
32
42
|
lines[line].insert(0, ' ' * Ruco::TAB_SIZE)
|
@@ -88,4 +98,4 @@ module Ruco
|
|
88
98
|
selection.first.line.upto(selection.last.line)
|
89
99
|
end
|
90
100
|
end
|
91
|
-
end
|
101
|
+
end
|
data/lib/ruco/keyboard.rb
CHANGED
@@ -38,16 +38,37 @@ class Keyboard
|
|
38
38
|
when Curses::Key::DOWN then :down
|
39
39
|
when Curses::Key::RIGHT then :right
|
40
40
|
when Curses::Key::LEFT then :left
|
41
|
+
|
42
|
+
when 337, '^[1;2A' then :"Shift+up"
|
43
|
+
when 336, '^[1;2B' then :"Shift+down"
|
41
44
|
when 402, '^[1;2C' then :"Shift+right"
|
42
|
-
when 554, '^[1;5C' then :"Ctrl+right"
|
43
|
-
when 555, '^[1;6C' then :"Ctrl+Shift+right"
|
44
45
|
when 393, '^[1;2D' then :"Shift+left"
|
45
|
-
|
46
|
-
when
|
47
|
-
when
|
46
|
+
|
47
|
+
when 558, '^[1;3A' then :"Alt+up"
|
48
|
+
when 517, '^[1;3B' then :"Alt+down"
|
49
|
+
when 552, '^[1;3C' then :"Alt+right"
|
50
|
+
when 537, '^[1;3D' then :"Alt+left"
|
51
|
+
|
48
52
|
when 560, '^[1;5A' then :"Ctrl+up"
|
49
|
-
when 336, '^[1;2B' then :"Shift+down"
|
50
53
|
when 519, '^[1;5B' then :"Ctrl+down"
|
54
|
+
when 554, '^[1;5C' then :"Ctrl+right"
|
55
|
+
when 539, '^[1;5D' then :"Ctrl+left"
|
56
|
+
|
57
|
+
when 561, '^[1;6A' then :"Ctrl+Shift+up"
|
58
|
+
when 520, '^[1;6B' then :"Ctrl+Shift+down"
|
59
|
+
when 555, '^[1;6C' then :"Ctrl+Shift+right"
|
60
|
+
when 540, '^[1;6D' then :"Ctrl+Shift+left"
|
61
|
+
|
62
|
+
when 562, '^[1;7A' then :"Alt+Ctrl+up"
|
63
|
+
when 521, '^[1;7B' then :"Alt+Ctrl+down"
|
64
|
+
when 556, '^[1;7C' then :"Alt+Ctrl+right"
|
65
|
+
when 541, '^[1;7D' then :"Alt+Ctrl+left"
|
66
|
+
|
67
|
+
when '^[1;8A' then :"Alt+Ctrl+Shift+up"
|
68
|
+
when '^[1;8B' then :"Alt+Ctrl+Shift+down"
|
69
|
+
when '^[1;8C' then :"Alt+Ctrl+Shift+right"
|
70
|
+
when '^[1;8D' then :"Alt+Ctrl+Shift+left"
|
71
|
+
|
51
72
|
when Curses::KEY_END then :end
|
52
73
|
when Curses::KEY_HOME then :home
|
53
74
|
when Curses::KEY_NPAGE then :page_down
|
@@ -154,4 +175,4 @@ class Keyboard
|
|
154
175
|
def self.is_alt_key_code?(key)
|
155
176
|
key.slice(0,1) == "^" and key.size == 2
|
156
177
|
end
|
157
|
-
end
|
178
|
+
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.49"
|
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-02-
|
12
|
+
s.date = %q{2011-02-20}
|
13
13
|
s.default_executable = %q{ruco}
|
14
14
|
s.email = %q{michael@grosser.it}
|
15
15
|
s.executables = ["ruco"]
|
@@ -63,7 +63,7 @@ Gem::Specification.new do |s|
|
|
63
63
|
]
|
64
64
|
s.homepage = %q{http://github.com/grosser/ruco}
|
65
65
|
s.require_paths = ["lib"]
|
66
|
-
s.rubygems_version = %q{1.
|
66
|
+
s.rubygems_version = %q{1.3.7}
|
67
67
|
s.summary = %q{Commandline editor written in ruby}
|
68
68
|
s.test_files = [
|
69
69
|
"spec/ruco/application_spec.rb",
|
@@ -85,6 +85,7 @@ Gem::Specification.new do |s|
|
|
85
85
|
]
|
86
86
|
|
87
87
|
if s.respond_to? :specification_version then
|
88
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
88
89
|
s.specification_version = 3
|
89
90
|
|
90
91
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
data/spec/ruco/editor_spec.rb
CHANGED
@@ -323,6 +323,48 @@ describe Ruco::Editor do
|
|
323
323
|
end
|
324
324
|
end
|
325
325
|
|
326
|
+
describe :move_line do
|
327
|
+
before do
|
328
|
+
write("0\n1\n2\n")
|
329
|
+
end
|
330
|
+
|
331
|
+
it "moves the line" do
|
332
|
+
editor.move_line(1)
|
333
|
+
editor.view.should == "1\n0\n2\n"
|
334
|
+
end
|
335
|
+
|
336
|
+
it "keeps the cursor at the moved line" do
|
337
|
+
editor.move_line(1)
|
338
|
+
editor.cursor.should == [1,0]
|
339
|
+
end
|
340
|
+
|
341
|
+
it "keeps the cursor at current column" do
|
342
|
+
editor.move(:to, 0,1)
|
343
|
+
editor.move_line(1)
|
344
|
+
editor.cursor.should == [1,1]
|
345
|
+
end
|
346
|
+
|
347
|
+
it "uses indentation of moved-to-line" do
|
348
|
+
write(" 0\n 1\n 2\n")
|
349
|
+
editor.move_line(1)
|
350
|
+
editor.view.should == " 1\n 0\n 2\n"
|
351
|
+
end
|
352
|
+
|
353
|
+
it "cannot move past start of file" do
|
354
|
+
editor.move_line(-1)
|
355
|
+
editor.view.should == "0\n1\n2\n"
|
356
|
+
end
|
357
|
+
|
358
|
+
it "cannot move past end of file" do
|
359
|
+
write("0\n1\n")
|
360
|
+
editor.move_line(1)
|
361
|
+
editor.move_line(1)
|
362
|
+
editor.move_line(1)
|
363
|
+
editor.move_line(1)
|
364
|
+
editor.view.should == "1\n\n0\n"
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
326
368
|
describe :selecting do
|
327
369
|
before do
|
328
370
|
write('012345678')
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruco
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
8
|
+
- 49
|
9
|
+
version: 0.0.49
|
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-02-
|
17
|
+
date: 2011-02-20 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:
|
@@ -103,7 +101,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
103
101
|
requirements:
|
104
102
|
- - ">="
|
105
103
|
- !ruby/object:Gem::Version
|
106
|
-
hash:
|
104
|
+
hash: -100213919
|
107
105
|
segments:
|
108
106
|
- 0
|
109
107
|
version: "0"
|
@@ -112,14 +110,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
110
|
requirements:
|
113
111
|
- - ">="
|
114
112
|
- !ruby/object:Gem::Version
|
115
|
-
hash: 3
|
116
113
|
segments:
|
117
114
|
- 0
|
118
115
|
version: "0"
|
119
116
|
requirements: []
|
120
117
|
|
121
118
|
rubyforge_project:
|
122
|
-
rubygems_version: 1.
|
119
|
+
rubygems_version: 1.3.7
|
123
120
|
signing_key:
|
124
121
|
specification_version: 3
|
125
122
|
summary: Commandline editor written in ruby
|