coolline 0.1.0 → 0.2.0
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/lib/coolline/coolline.rb +59 -53
- data/lib/coolline/history.rb +16 -0
- data/lib/coolline/version.rb +1 -1
- data/repl.rb +0 -1
- metadata +5 -4
data/lib/coolline/coolline.rb
CHANGED
@@ -24,38 +24,38 @@ class Coolline
|
|
24
24
|
:word_boundaries => [" ", "-", "_"],
|
25
25
|
|
26
26
|
:handlers =>
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
27
|
+
[
|
28
|
+
Handler.new(/\A(?:\C-h|\x7F)\z/, &:kill_backward_char),
|
29
|
+
Handler.new(?\C-a, &:beginning_of_line),
|
30
|
+
Handler.new(?\C-e, &:end_of_line),
|
31
|
+
Handler.new(?\C-k, &:kill_line),
|
32
|
+
Handler.new(?\C-f, &:forward_char),
|
33
|
+
Handler.new(?\C-b, &:backward_char),
|
34
|
+
Handler.new(?\C-d, &:kill_current_char_or_leave),
|
35
|
+
Handler.new(?\C-c) { Process.kill(:INT, Process.pid) },
|
36
|
+
Handler.new(?\C-w, &:kill_backward_word),
|
37
|
+
Handler.new(?\C-t, &:transpose_chars),
|
38
|
+
Handler.new(?\C-n, &:next_history_line),
|
39
|
+
Handler.new(?\C-p, &:previous_history_line),
|
40
|
+
Handler.new(?\C-r, &:interactive_search),
|
41
|
+
Handler.new(?\t, &:complete),
|
42
|
+
Handler.new(?\C-a..?\C-z) {},
|
43
|
+
|
44
|
+
Handler.new(/\A\e(?:\C-h|\x7F)\z/, &:kill_backward_word),
|
45
|
+
Handler.new("\eb", &:backward_word),
|
46
|
+
Handler.new("\ef", &:forward_word),
|
47
|
+
Handler.new("\e[A", &:previous_history_line),
|
48
|
+
Handler.new("\e[B", &:next_history_line),
|
49
|
+
Handler.new("\e[5~", &:previous_history_line),
|
50
|
+
Handler.new("\e[6~", &:next_history_line),
|
51
|
+
Handler.new("\e[C", &:forward_char),
|
52
|
+
Handler.new("\e[D", &:backward_char),
|
53
|
+
Handler.new("\et", &:transpose_words),
|
54
|
+
Handler.new("\ec", &:capitalize_word),
|
55
|
+
Handler.new("\eu", &:uppercase_word),
|
56
|
+
Handler.new("\el", &:lowercase_word),
|
57
|
+
|
58
|
+
Handler.new(/\e.+/) {},
|
59
59
|
],
|
60
60
|
|
61
61
|
:unknown_char_proc => :insert_string.to_proc,
|
@@ -155,11 +155,12 @@ class Coolline
|
|
155
155
|
def readline(prompt = ">> ")
|
156
156
|
@prompt = prompt
|
157
157
|
|
158
|
+
@history.delete_empty
|
159
|
+
|
158
160
|
@line = ""
|
159
161
|
@pos = 0
|
160
162
|
@accumulator = nil
|
161
163
|
|
162
|
-
@history_index = @history.size
|
163
164
|
@history_moved = false
|
164
165
|
|
165
166
|
@should_exit = false
|
@@ -167,19 +168,20 @@ class Coolline
|
|
167
168
|
print "\r\e[0m\e[0K"
|
168
169
|
print @prompt
|
169
170
|
|
171
|
+
@history.index = @history.size - 1
|
172
|
+
@history << @line
|
173
|
+
|
170
174
|
until (char = @input.getch) == "\r"
|
171
175
|
handle(char)
|
172
176
|
return if @should_exit
|
173
177
|
|
174
178
|
if @history_moved
|
175
179
|
@history_moved = false
|
176
|
-
else
|
177
|
-
@history_index = @history.size
|
178
180
|
end
|
179
181
|
|
180
|
-
width
|
181
|
-
prompt_size
|
182
|
-
line
|
182
|
+
width = @input.winsize[1]
|
183
|
+
prompt_size = strip_ansi_codes(@prompt).size
|
184
|
+
line = transform(@line)
|
183
185
|
|
184
186
|
stripped_line_width = strip_ansi_codes(line).size
|
185
187
|
line << " " * [width - stripped_line_width - prompt_size, 0].max
|
@@ -214,7 +216,6 @@ class Coolline
|
|
214
216
|
break if i >= end_index
|
215
217
|
end
|
216
218
|
end
|
217
|
-
|
218
219
|
if @pos < left_width + 1
|
219
220
|
print "\e[#{prompt_size + @pos + 1}G"
|
220
221
|
end
|
@@ -223,7 +224,8 @@ class Coolline
|
|
223
224
|
|
224
225
|
print "\n"
|
225
226
|
|
226
|
-
@history
|
227
|
+
@history[-1] = @line if @history.size != 0
|
228
|
+
@history.index = @history.size
|
227
229
|
|
228
230
|
@line + "\n"
|
229
231
|
end
|
@@ -240,14 +242,13 @@ class Coolline
|
|
240
242
|
|
241
243
|
# Selects the previous line in history (if any)
|
242
244
|
def previous_history_line
|
243
|
-
if @
|
244
|
-
@line.replace @history[@
|
245
|
-
@
|
246
|
-
|
247
|
-
@history_index -= 1
|
245
|
+
if @history.index >= 0
|
246
|
+
@line.replace @history[@history.index]
|
247
|
+
@history.index -= 1
|
248
248
|
end
|
249
249
|
|
250
250
|
@history_moved = true
|
251
|
+
end_of_line
|
251
252
|
end
|
252
253
|
|
253
254
|
# Selects the next line in history (if any).
|
@@ -255,19 +256,22 @@ class Coolline
|
|
255
256
|
# When on the last line, this method replaces the current line with an empty
|
256
257
|
# string.
|
257
258
|
def next_history_line
|
258
|
-
if @
|
259
|
-
@
|
260
|
-
@
|
261
|
-
|
262
|
-
@
|
259
|
+
if @history.index + 2 < @history.size
|
260
|
+
@history.index += 1
|
261
|
+
@line.replace @history[@history.index + 1] || @history.current
|
262
|
+
else
|
263
|
+
@line.replace @history[-1]
|
264
|
+
@history.index = @history.size - 2
|
263
265
|
end
|
264
266
|
|
265
267
|
@history_moved = true
|
268
|
+
|
269
|
+
end_of_line
|
266
270
|
end
|
267
271
|
|
268
272
|
# Prompts the user to search for a line
|
269
273
|
def interactive_search
|
270
|
-
found_index
|
274
|
+
found_index = @history.index
|
271
275
|
|
272
276
|
# Use another coolline instance for the search! :D
|
273
277
|
Coolline.new { |c|
|
@@ -278,7 +282,7 @@ class Coolline
|
|
278
282
|
c.transform_proc = proc do
|
279
283
|
pattern = Regexp.new Regexp.escape(c.line)
|
280
284
|
|
281
|
-
line, found_index = @history.search(pattern, @
|
285
|
+
line, found_index = @history.search(pattern, @history.index).first
|
282
286
|
|
283
287
|
if line
|
284
288
|
"#{c.line}): #{line}"
|
@@ -292,10 +296,12 @@ class Coolline
|
|
292
296
|
c.history_size = 0
|
293
297
|
}.readline("(search:")
|
294
298
|
|
299
|
+
found_index ||= @history.index
|
300
|
+
|
295
301
|
@line.replace @history[found_index]
|
296
302
|
@pos = [@line.size, @pos].min
|
297
303
|
|
298
|
-
@
|
304
|
+
@history.index = found_index
|
299
305
|
@history_moved = true
|
300
306
|
end
|
301
307
|
|
data/lib/coolline/history.rb
CHANGED
@@ -2,6 +2,8 @@ class Coolline
|
|
2
2
|
# Class used to keep track of input. It keeps a certain amount of lines at
|
3
3
|
# most in memory, and stores them in a file.
|
4
4
|
class History
|
5
|
+
attr_accessor :index
|
6
|
+
|
5
7
|
def initialize(filename, max_size = 5000)
|
6
8
|
@io = File.open(filename, 'a+')
|
7
9
|
@max_size = max_size
|
@@ -9,6 +11,8 @@ class Coolline
|
|
9
11
|
@lines = []
|
10
12
|
|
11
13
|
load_lines
|
14
|
+
delete_empty
|
15
|
+
@index = size
|
12
16
|
end
|
13
17
|
|
14
18
|
def reopen(filename)
|
@@ -33,6 +37,10 @@ class Coolline
|
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
40
|
+
def delete_empty
|
41
|
+
@lines.reject!(&:empty?)
|
42
|
+
end
|
43
|
+
|
36
44
|
def <<(el)
|
37
45
|
@io.puts el
|
38
46
|
@io.flush
|
@@ -43,10 +51,18 @@ class Coolline
|
|
43
51
|
self
|
44
52
|
end
|
45
53
|
|
54
|
+
def current
|
55
|
+
self[@index]
|
56
|
+
end
|
57
|
+
|
46
58
|
def [](id)
|
47
59
|
@lines[id]
|
48
60
|
end
|
49
61
|
|
62
|
+
def []=(id, val)
|
63
|
+
@lines[id] = val
|
64
|
+
end
|
65
|
+
|
50
66
|
def size
|
51
67
|
@lines.size
|
52
68
|
end
|
data/lib/coolline/version.rb
CHANGED
data/repl.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coolline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-04-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: riot
|
16
|
-
requirement: &
|
16
|
+
requirement: &12993820 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *12993820
|
25
25
|
description: ! 'A readline-like library that allows to change how the input
|
26
26
|
|
27
27
|
is displayed.
|
@@ -69,3 +69,4 @@ signing_key:
|
|
69
69
|
specification_version: 3
|
70
70
|
summary: Sounds like readline, smells like readline, but isn't readline
|
71
71
|
test_files: []
|
72
|
+
has_rdoc:
|