ruco 0.0.41 → 0.0.42
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 +1 -1
- data/VERSION +1 -1
- data/lib/ruco.rb +2 -0
- data/lib/ruco/application.rb +2 -0
- data/lib/ruco/core_ext/file.rb +5 -0
- data/lib/ruco/core_ext/hash.rb +12 -0
- data/lib/ruco/editor.rb +17 -0
- data/lib/ruco/editor_area.rb +3 -3
- data/lib/ruco/file_store.rb +40 -0
- data/ruco.gemspec +6 -2
- data/spec/ruco/application_spec.rb +28 -8
- data/spec/ruco/editor_spec.rb +1 -0
- data/spec/ruco/file_store_spec.rb +47 -0
- metadata +8 -4
data/Readme.md
CHANGED
@@ -11,6 +11,7 @@ Features:
|
|
11
11
|
- configuration via `~/.ruco.rb`
|
12
12
|
- cut, copy and paste -> Ctrl+x/c/v
|
13
13
|
- undo / redo
|
14
|
+
- stays at last position when reopening a file
|
14
15
|
|
15
16
|
Install
|
16
17
|
=======
|
@@ -70,7 +71,6 @@ TODO
|
|
70
71
|
- big warning when editing a not-writable file
|
71
72
|
- find next (Alt+n)
|
72
73
|
- add selection colors to forms in command_bar
|
73
|
-
- session storage (stay at same line/column when reopening)
|
74
74
|
- smart staying at column when changing line
|
75
75
|
- warnings / messages
|
76
76
|
- syntax highlighting
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.42
|
data/lib/ruco.rb
CHANGED
@@ -5,10 +5,12 @@ require 'ruco/core_ext/string'
|
|
5
5
|
require 'ruco/core_ext/array'
|
6
6
|
require 'ruco/core_ext/hash'
|
7
7
|
require 'ruco/core_ext/range'
|
8
|
+
require 'ruco/core_ext/file'
|
8
9
|
|
9
10
|
require 'ruco/keyboard'
|
10
11
|
require 'ruco/position'
|
11
12
|
require 'ruco/history'
|
13
|
+
require 'ruco/file_store'
|
12
14
|
require 'ruco/window'
|
13
15
|
|
14
16
|
require 'ruco/editor'
|
data/lib/ruco/application.rb
CHANGED
data/lib/ruco/core_ext/hash.rb
CHANGED
@@ -1,4 +1,16 @@
|
|
1
1
|
class Hash
|
2
2
|
# 1.9 does not want index and 1.8 does not have key
|
3
3
|
alias_method(:key, :index) unless method_defined?(:key)
|
4
|
+
|
5
|
+
# http://www.ruby-forum.com/topic/149449
|
6
|
+
def slice(*keys, &block)
|
7
|
+
if block
|
8
|
+
each do |key, val|
|
9
|
+
boolean = block.call(key, val)
|
10
|
+
keys << key if boolean
|
11
|
+
end
|
12
|
+
end
|
13
|
+
hash = self
|
14
|
+
keys.inject({}){|returned, key| returned.update key => hash[key]}
|
15
|
+
end
|
4
16
|
end
|
data/lib/ruco/editor.rb
CHANGED
@@ -29,6 +29,7 @@ module Ruco
|
|
29
29
|
|
30
30
|
@saved_content = content
|
31
31
|
@text_area = EditorArea.new(content, options)
|
32
|
+
restore_session
|
32
33
|
end
|
33
34
|
|
34
35
|
def find(text)
|
@@ -52,5 +53,21 @@ module Ruco
|
|
52
53
|
rescue Object => e
|
53
54
|
e.message
|
54
55
|
end
|
56
|
+
|
57
|
+
def store_session
|
58
|
+
session_store.set(@file, text_area.state.slice(:position, :screen_position))
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def restore_session
|
64
|
+
if state = session_store.get(@file)
|
65
|
+
text_area.state = state
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def session_store
|
70
|
+
FileStore.new(File.expand_path('~/.ruco/sessions'), :keep => 20)
|
71
|
+
end
|
55
72
|
end
|
56
73
|
end
|
data/lib/ruco/editor_area.rb
CHANGED
@@ -45,8 +45,6 @@ module Ruco
|
|
45
45
|
adjust_to_indentation -removed.first, -removed.last
|
46
46
|
end
|
47
47
|
|
48
|
-
private
|
49
|
-
|
50
48
|
def state
|
51
49
|
{
|
52
50
|
:content => content,
|
@@ -57,11 +55,13 @@ module Ruco
|
|
57
55
|
|
58
56
|
def state=(data)
|
59
57
|
@selection = nil
|
60
|
-
@lines = data[:content].naive_split("\n")
|
58
|
+
@lines = data[:content].naive_split("\n") if data[:content]
|
61
59
|
self.position = data[:position]
|
62
60
|
self.screen_position = data[:screen_position]
|
63
61
|
end
|
64
62
|
|
63
|
+
private
|
64
|
+
|
65
65
|
# TODO use this instead of instance variables
|
66
66
|
def screen_position
|
67
67
|
Position.new(@window.top, @window.left)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "digest/md5"
|
2
|
+
|
3
|
+
module Ruco
|
4
|
+
class FileStore
|
5
|
+
def initialize(folder, options)
|
6
|
+
@folder = folder
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def set(key, value)
|
11
|
+
`mkdir -p #{@folder}` unless File.exist? @folder
|
12
|
+
File.write(file(key), serialize(value))
|
13
|
+
cleanup
|
14
|
+
end
|
15
|
+
|
16
|
+
def get(key)
|
17
|
+
file = file(key)
|
18
|
+
deserialize File.read(file) if File.exist?(file)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def cleanup
|
24
|
+
delete = `ls -t #{@folder}`.split("\n")[@options[:keep]..-1] || []
|
25
|
+
delete.each{|f| File.delete("#{@folder}/#{f}") }
|
26
|
+
end
|
27
|
+
|
28
|
+
def file(key)
|
29
|
+
"#{@folder}/#{Digest::MD5.hexdigest(key)}.yml"
|
30
|
+
end
|
31
|
+
|
32
|
+
def serialize(value)
|
33
|
+
Marshal.dump(value)
|
34
|
+
end
|
35
|
+
|
36
|
+
def deserialize(value)
|
37
|
+
Marshal.load(value)
|
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.42"
|
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-06}
|
13
13
|
s.default_executable = %q{ruco}
|
14
14
|
s.email = %q{michael@grosser.it}
|
15
15
|
s.executables = ["ruco"]
|
@@ -24,12 +24,14 @@ Gem::Specification.new do |s|
|
|
24
24
|
"lib/ruco/application.rb",
|
25
25
|
"lib/ruco/command_bar.rb",
|
26
26
|
"lib/ruco/core_ext/array.rb",
|
27
|
+
"lib/ruco/core_ext/file.rb",
|
27
28
|
"lib/ruco/core_ext/hash.rb",
|
28
29
|
"lib/ruco/core_ext/object.rb",
|
29
30
|
"lib/ruco/core_ext/range.rb",
|
30
31
|
"lib/ruco/core_ext/string.rb",
|
31
32
|
"lib/ruco/editor.rb",
|
32
33
|
"lib/ruco/editor_area.rb",
|
34
|
+
"lib/ruco/file_store.rb",
|
33
35
|
"lib/ruco/form.rb",
|
34
36
|
"lib/ruco/history.rb",
|
35
37
|
"lib/ruco/keyboard.rb",
|
@@ -45,6 +47,7 @@ Gem::Specification.new do |s|
|
|
45
47
|
"spec/ruco/core_ext/array_spec.rb",
|
46
48
|
"spec/ruco/core_ext/string_spec.rb",
|
47
49
|
"spec/ruco/editor_spec.rb",
|
50
|
+
"spec/ruco/file_store_spec.rb",
|
48
51
|
"spec/ruco/form_spec.rb",
|
49
52
|
"spec/ruco/history_spec.rb",
|
50
53
|
"spec/ruco/keyboard_spec.rb",
|
@@ -64,6 +67,7 @@ Gem::Specification.new do |s|
|
|
64
67
|
"spec/ruco/core_ext/array_spec.rb",
|
65
68
|
"spec/ruco/core_ext/string_spec.rb",
|
66
69
|
"spec/ruco/editor_spec.rb",
|
70
|
+
"spec/ruco/file_store_spec.rb",
|
67
71
|
"spec/ruco/form_spec.rb",
|
68
72
|
"spec/ruco/history_spec.rb",
|
69
73
|
"spec/ruco/keyboard_spec.rb",
|
@@ -3,6 +3,7 @@ require File.expand_path('spec/spec_helper')
|
|
3
3
|
|
4
4
|
describe Ruco::Application do
|
5
5
|
before do
|
6
|
+
`rm -rf ~/.ruco/sessions`
|
6
7
|
@file = 'spec/temp.txt'
|
7
8
|
write('')
|
8
9
|
end
|
@@ -15,7 +16,6 @@ describe Ruco::Application do
|
|
15
16
|
File.read(@file)
|
16
17
|
end
|
17
18
|
|
18
|
-
|
19
19
|
def editor_part(view)
|
20
20
|
view.naive_split("\n")[1..-2].join("\n")
|
21
21
|
end
|
@@ -83,6 +83,22 @@ describe Ruco::Application do
|
|
83
83
|
app.key(:enter).should == :quit
|
84
84
|
end
|
85
85
|
end
|
86
|
+
|
87
|
+
describe 'session' do
|
88
|
+
it "stores the session so I can reopen at the same position" do
|
89
|
+
write("0\n1\n2\n")
|
90
|
+
type :right, :down, :"Ctrl+q"
|
91
|
+
reopened = Ruco::Application.new(@file, :lines => 5, :columns => 10)
|
92
|
+
reopened.cursor.should == [2,1]
|
93
|
+
end
|
94
|
+
|
95
|
+
it "does not store or restore content" do
|
96
|
+
write('')
|
97
|
+
type 'x', :"Ctrl+s", :enter, :enter, 'a', :"Ctrl+q"
|
98
|
+
reopened = Ruco::Application.new(@file, :lines => 5, :columns => 10)
|
99
|
+
editor_part(reopened.view).should == "x\n\n"
|
100
|
+
end
|
101
|
+
end
|
86
102
|
|
87
103
|
it "can select all" do
|
88
104
|
write("1\n2\n3\n4\n5\n")
|
@@ -246,14 +262,18 @@ describe Ruco::Application do
|
|
246
262
|
end
|
247
263
|
|
248
264
|
describe '.ruco.rb' do
|
265
|
+
around do |block|
|
266
|
+
rucorc = File.expand_path('~/.ruco.rb')
|
267
|
+
`mv #{rucorc} #{rucorc}.backup 2>&1`
|
268
|
+
File.write(rucorc, "Ruco.configure{ bind(:'Ctrl+e'){ @editor.insert('TEST') } }")
|
269
|
+
block.call
|
270
|
+
`rm #{rucorc} && mv #{rucorc}.backup #{rucorc} 2>&1`
|
271
|
+
end
|
272
|
+
|
249
273
|
it "loads it and can use the bound keys" do
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
app.view.should_not include('TEST')
|
254
|
-
app.key(:"Ctrl+e")
|
255
|
-
app.view.should include("TEST")
|
256
|
-
end
|
274
|
+
app.view.should_not include('TEST')
|
275
|
+
app.key(:"Ctrl+e")
|
276
|
+
app.view.should include("TEST")
|
257
277
|
end
|
258
278
|
end
|
259
279
|
|
data/spec/ruco/editor_spec.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.expand_path('spec/spec_helper')
|
2
|
+
|
3
|
+
describe Ruco::FileStore do
|
4
|
+
before do
|
5
|
+
@folder = 'spec/sessions'
|
6
|
+
`rm -rf #{@folder}`
|
7
|
+
end
|
8
|
+
|
9
|
+
after do
|
10
|
+
`rm -rf #{@folder}`
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:store){ Ruco::FileStore.new(@folder, :keep => 3) }
|
14
|
+
|
15
|
+
it "can store stuff" do
|
16
|
+
store.set('xxx', 1)
|
17
|
+
store.get('xxx').should == 1
|
18
|
+
end
|
19
|
+
|
20
|
+
it "can store :keep keys" do
|
21
|
+
store.set('xxx', 1)
|
22
|
+
store.set('yyy', 1)
|
23
|
+
store.set('zzz', 1)
|
24
|
+
store.set('aaa', 1)
|
25
|
+
store.get('xxx').should == nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it "drops least recently used key" do
|
29
|
+
store.set('xxx', 1)
|
30
|
+
store.set('yyy', 1)
|
31
|
+
store.set('xxx', 1)
|
32
|
+
store.set('zzz', 1)
|
33
|
+
store.set('aaa', 1)
|
34
|
+
store.get('xxx').should == 1
|
35
|
+
store.get('yyy').should == nil
|
36
|
+
end
|
37
|
+
|
38
|
+
it "does not drop if used multiple times" do
|
39
|
+
store.set('xxx', 1)
|
40
|
+
store.set('yyy', 1)
|
41
|
+
store.set('zzz', 1)
|
42
|
+
store.set('zzz', 1)
|
43
|
+
store.set('zzz', 1)
|
44
|
+
store.set('zzz', 1)
|
45
|
+
store.get('xxx').should == 1
|
46
|
+
end
|
47
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 42
|
9
|
+
version: 0.0.42
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Michael Grosser
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-02-
|
17
|
+
date: 2011-02-06 00:00:00 +01:00
|
18
18
|
default_executable: ruco
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -51,12 +51,14 @@ files:
|
|
51
51
|
- lib/ruco/application.rb
|
52
52
|
- lib/ruco/command_bar.rb
|
53
53
|
- lib/ruco/core_ext/array.rb
|
54
|
+
- lib/ruco/core_ext/file.rb
|
54
55
|
- lib/ruco/core_ext/hash.rb
|
55
56
|
- lib/ruco/core_ext/object.rb
|
56
57
|
- lib/ruco/core_ext/range.rb
|
57
58
|
- lib/ruco/core_ext/string.rb
|
58
59
|
- lib/ruco/editor.rb
|
59
60
|
- lib/ruco/editor_area.rb
|
61
|
+
- lib/ruco/file_store.rb
|
60
62
|
- lib/ruco/form.rb
|
61
63
|
- lib/ruco/history.rb
|
62
64
|
- lib/ruco/keyboard.rb
|
@@ -72,6 +74,7 @@ files:
|
|
72
74
|
- spec/ruco/core_ext/array_spec.rb
|
73
75
|
- spec/ruco/core_ext/string_spec.rb
|
74
76
|
- spec/ruco/editor_spec.rb
|
77
|
+
- spec/ruco/file_store_spec.rb
|
75
78
|
- spec/ruco/form_spec.rb
|
76
79
|
- spec/ruco/history_spec.rb
|
77
80
|
- spec/ruco/keyboard_spec.rb
|
@@ -94,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
94
97
|
requirements:
|
95
98
|
- - ">="
|
96
99
|
- !ruby/object:Gem::Version
|
97
|
-
hash:
|
100
|
+
hash: 916252531
|
98
101
|
segments:
|
99
102
|
- 0
|
100
103
|
version: "0"
|
@@ -119,6 +122,7 @@ test_files:
|
|
119
122
|
- spec/ruco/core_ext/array_spec.rb
|
120
123
|
- spec/ruco/core_ext/string_spec.rb
|
121
124
|
- spec/ruco/editor_spec.rb
|
125
|
+
- spec/ruco/file_store_spec.rb
|
122
126
|
- spec/ruco/form_spec.rb
|
123
127
|
- spec/ruco/history_spec.rb
|
124
128
|
- spec/ruco/keyboard_spec.rb
|