reline 0.2.5 → 0.2.8.pre.2
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.
- checksums.yaml +4 -4
- data/README.md +46 -0
- data/lib/reline/ansi.rb +120 -56
- data/lib/reline/config.rb +39 -13
- data/lib/reline/general_io.rb +11 -3
- data/lib/reline/key_actor/base.rb +12 -0
- data/lib/reline/line_editor.rb +347 -18
- data/lib/reline/terminfo.rb +126 -0
- data/lib/reline/unicode.rb +30 -0
- data/lib/reline/version.rb +1 -1
- data/lib/reline/windows.rb +176 -80
- data/lib/reline.rb +83 -13
- metadata +6 -61
data/lib/reline.rb
CHANGED
@@ -7,12 +7,15 @@ require 'reline/key_actor'
|
|
7
7
|
require 'reline/key_stroke'
|
8
8
|
require 'reline/line_editor'
|
9
9
|
require 'reline/history'
|
10
|
+
require 'reline/terminfo'
|
10
11
|
require 'rbconfig'
|
11
12
|
|
12
13
|
module Reline
|
13
14
|
FILENAME_COMPLETION_PROC = nil
|
14
15
|
USERNAME_COMPLETION_PROC = nil
|
15
16
|
|
17
|
+
class ConfigEncodingConversionError < StandardError; end
|
18
|
+
|
16
19
|
Key = Struct.new('Key', :char, :combined_char, :with_meta)
|
17
20
|
CursorPos = Struct.new(:x, :y)
|
18
21
|
|
@@ -41,6 +44,7 @@ module Reline
|
|
41
44
|
|
42
45
|
def initialize
|
43
46
|
self.output = STDOUT
|
47
|
+
@dialog_proc_list = []
|
44
48
|
yield self
|
45
49
|
@completion_quote_character = nil
|
46
50
|
@bracketed_paste_finished = false
|
@@ -103,6 +107,14 @@ module Reline
|
|
103
107
|
@completion_proc = p
|
104
108
|
end
|
105
109
|
|
110
|
+
def autocompletion
|
111
|
+
@config.autocompletion
|
112
|
+
end
|
113
|
+
|
114
|
+
def autocompletion=(val)
|
115
|
+
@config.autocompletion = val
|
116
|
+
end
|
117
|
+
|
106
118
|
def output_modifier_proc=(p)
|
107
119
|
raise ArgumentError unless p.respond_to?(:call) or p.nil?
|
108
120
|
@output_modifier_proc = p
|
@@ -127,6 +139,12 @@ module Reline
|
|
127
139
|
@dig_perfect_match_proc = p
|
128
140
|
end
|
129
141
|
|
142
|
+
def add_dialog_proc(name_sym, p, context = nil)
|
143
|
+
raise ArgumentError unless p.respond_to?(:call) or p.nil?
|
144
|
+
raise ArgumentError unless name_sym.instance_of?(Symbol)
|
145
|
+
@dialog_proc_list << [name_sym, p, context]
|
146
|
+
end
|
147
|
+
|
130
148
|
def input=(val)
|
131
149
|
raise TypeError unless val.respond_to?(:getc) or val.nil?
|
132
150
|
if val.respond_to?(:getc)
|
@@ -168,6 +186,45 @@ module Reline
|
|
168
186
|
Reline::IOGate.get_screen_size
|
169
187
|
end
|
170
188
|
|
189
|
+
Reline::DEFAULT_DIALOG_PROC_AUTOCOMPLETE = ->() {
|
190
|
+
# autocomplete
|
191
|
+
return nil unless config.autocompletion
|
192
|
+
if just_cursor_moving and completion_journey_data.nil?
|
193
|
+
# Auto complete starts only when edited
|
194
|
+
return nil
|
195
|
+
end
|
196
|
+
pre, target, post= retrieve_completion_block(true)
|
197
|
+
if target.nil? or target.empty?# or target.size <= 3
|
198
|
+
return nil
|
199
|
+
end
|
200
|
+
if completion_journey_data and completion_journey_data.list
|
201
|
+
result = completion_journey_data.list.dup
|
202
|
+
result.shift
|
203
|
+
pointer = completion_journey_data.pointer - 1
|
204
|
+
else
|
205
|
+
result = call_completion_proc_with_checking_args(pre, target, post)
|
206
|
+
pointer = nil
|
207
|
+
end
|
208
|
+
if result and result.size == 1 and result[0] == target
|
209
|
+
result = nil
|
210
|
+
end
|
211
|
+
target_width = Reline::Unicode.calculate_width(target)
|
212
|
+
x = cursor_pos.x - target_width
|
213
|
+
if x < 0
|
214
|
+
x = screen_width + x
|
215
|
+
y = -1
|
216
|
+
else
|
217
|
+
y = 0
|
218
|
+
end
|
219
|
+
cursor_pos_to_render = Reline::CursorPos.new(x, y)
|
220
|
+
if context and context.is_a?(Array)
|
221
|
+
context.clear
|
222
|
+
context.push(cursor_pos_to_render, result, pointer)
|
223
|
+
end
|
224
|
+
[cursor_pos_to_render, result, pointer, nil]
|
225
|
+
}
|
226
|
+
Reline::DEFAULT_DIALOG_CONTEXT = Array.new
|
227
|
+
|
171
228
|
def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination)
|
172
229
|
unless confirm_multiline_termination
|
173
230
|
raise ArgumentError.new('#readmultiline needs block to confirm multiline termination')
|
@@ -227,13 +284,15 @@ module Reline
|
|
227
284
|
line_editor.auto_indent_proc = auto_indent_proc
|
228
285
|
line_editor.dig_perfect_match_proc = dig_perfect_match_proc
|
229
286
|
line_editor.pre_input_hook = pre_input_hook
|
287
|
+
@dialog_proc_list.each do |d|
|
288
|
+
name_sym, dialog_proc, context = d
|
289
|
+
line_editor.add_dialog_proc(name_sym, dialog_proc, context)
|
290
|
+
end
|
230
291
|
|
231
292
|
unless config.test_mode
|
232
293
|
config.read
|
233
294
|
config.reset_default_key_bindings
|
234
|
-
Reline::IOGate
|
235
|
-
config.add_default_key_binding(key, func)
|
236
|
-
end
|
295
|
+
Reline::IOGate.set_default_key_bindings(config)
|
237
296
|
end
|
238
297
|
|
239
298
|
line_editor.rerender
|
@@ -273,11 +332,12 @@ module Reline
|
|
273
332
|
Reline::IOGate.deprep(otio)
|
274
333
|
end
|
275
334
|
|
276
|
-
#
|
277
|
-
#
|
278
|
-
#
|
279
|
-
#
|
280
|
-
#
|
335
|
+
# GNU Readline waits for "keyseq-timeout" milliseconds to see if the ESC
|
336
|
+
# is followed by a character, and times out and treats it as a standalone
|
337
|
+
# ESC if the second character does not arrive. If the second character
|
338
|
+
# comes before timed out, it is treated as a modifier key with the
|
339
|
+
# meta-property of meta-key, so that it can be distinguished from
|
340
|
+
# multibyte characters with the 8th bit turned on.
|
281
341
|
#
|
282
342
|
# GNU Readline will wait for the 2nd character with "keyseq-timeout"
|
283
343
|
# milli-seconds but wait forever after 3rd characters.
|
@@ -422,6 +482,7 @@ module Reline
|
|
422
482
|
def_single_delegators :core, :ambiguous_width
|
423
483
|
def_single_delegators :core, :last_incremental_search
|
424
484
|
def_single_delegators :core, :last_incremental_search=
|
485
|
+
def_single_delegators :core, :add_dialog_proc
|
425
486
|
|
426
487
|
def_single_delegators :core, :readmultiline
|
427
488
|
def_instance_delegators self, :readmultiline
|
@@ -443,6 +504,7 @@ module Reline
|
|
443
504
|
core.completer_quote_characters = '"\''
|
444
505
|
core.filename_quote_characters = ""
|
445
506
|
core.special_prefixes = ""
|
507
|
+
core.add_dialog_proc(:autocomplete, Reline::DEFAULT_DIALOG_PROC_AUTOCOMPLETE, Reline::DEFAULT_DIALOG_CONTEXT)
|
446
508
|
}
|
447
509
|
end
|
448
510
|
|
@@ -455,17 +517,25 @@ module Reline
|
|
455
517
|
end
|
456
518
|
end
|
457
519
|
|
520
|
+
require 'reline/general_io'
|
458
521
|
if RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw|cygwin|bccwin|wince|emc/
|
459
522
|
require 'reline/windows'
|
460
523
|
if Reline::Windows.msys_tty?
|
461
|
-
|
462
|
-
|
524
|
+
Reline::IOGate = if ENV['TERM'] == 'dumb'
|
525
|
+
Reline::GeneralIO
|
526
|
+
else
|
527
|
+
require 'reline/ansi'
|
528
|
+
Reline::ANSI
|
529
|
+
end
|
463
530
|
else
|
464
531
|
Reline::IOGate = Reline::Windows
|
465
532
|
end
|
466
533
|
else
|
467
|
-
|
468
|
-
|
534
|
+
Reline::IOGate = if $stdout.isatty
|
535
|
+
require 'reline/ansi'
|
536
|
+
Reline::ANSI
|
537
|
+
else
|
538
|
+
Reline::GeneralIO
|
539
|
+
end
|
469
540
|
end
|
470
541
|
Reline::HISTORY = Reline::History.new(Reline.core.config)
|
471
|
-
require 'reline/general_io'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8.pre.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- aycabta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: io-console
|
@@ -24,62 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.5'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rake
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: test-unit
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: yamatanooroti
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 0.0.6
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 0.0.6
|
83
27
|
description: Alternative GNU Readline or Editline implementation by pure Ruby.
|
84
28
|
email:
|
85
29
|
- aycabta@gmail.com
|
@@ -104,6 +48,7 @@ files:
|
|
104
48
|
- lib/reline/kill_ring.rb
|
105
49
|
- lib/reline/line_editor.rb
|
106
50
|
- lib/reline/sibori.rb
|
51
|
+
- lib/reline/terminfo.rb
|
107
52
|
- lib/reline/unicode.rb
|
108
53
|
- lib/reline/unicode/east_asian_width.rb
|
109
54
|
- lib/reline/version.rb
|
@@ -124,11 +69,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
124
69
|
version: '2.5'
|
125
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
71
|
requirements:
|
127
|
-
- - "
|
72
|
+
- - ">"
|
128
73
|
- !ruby/object:Gem::Version
|
129
|
-
version:
|
74
|
+
version: 1.3.1
|
130
75
|
requirements: []
|
131
|
-
rubygems_version: 3.2.
|
76
|
+
rubygems_version: 3.2.22
|
132
77
|
signing_key:
|
133
78
|
specification_version: 4
|
134
79
|
summary: Alternative GNU Readline or Editline implementation by pure Ruby.
|