reline 0.2.8.pre.8 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/reline/ansi.rb +50 -23
- data/lib/reline/config.rb +10 -2
- data/lib/reline/general_io.rb +2 -1
- data/lib/reline/key_actor/emacs.rb +1 -1
- data/lib/reline/key_stroke.rb +60 -62
- data/lib/reline/line_editor.rb +239 -110
- data/lib/reline/terminfo.rb +12 -4
- data/lib/reline/unicode.rb +9 -1
- data/lib/reline/version.rb +1 -1
- data/lib/reline/windows.rb +121 -50
- data/lib/reline.rb +31 -23
- metadata +4 -5
- data/lib/reline/line_editor.rb.orig +0 -3199
data/lib/reline/terminfo.rb
CHANGED
@@ -1,5 +1,13 @@
|
|
1
|
-
|
2
|
-
require 'fiddle
|
1
|
+
begin
|
2
|
+
require 'fiddle'
|
3
|
+
require 'fiddle/import'
|
4
|
+
rescue LoadError
|
5
|
+
module Reline::Terminfo
|
6
|
+
def self.curses_dl
|
7
|
+
false
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
3
11
|
|
4
12
|
module Reline::Terminfo
|
5
13
|
extend Fiddle::Importer
|
@@ -50,7 +58,7 @@ module Reline::Terminfo
|
|
50
58
|
@curses_dl = nil if @curses_dl == false
|
51
59
|
@curses_dl
|
52
60
|
end
|
53
|
-
end
|
61
|
+
end if not Reline.const_defined?(:Terminfo) or not Reline::Terminfo.respond_to?(:curses_dl)
|
54
62
|
|
55
63
|
module Reline::Terminfo
|
56
64
|
dlload curses_dl
|
@@ -71,7 +79,7 @@ module Reline::Terminfo
|
|
71
79
|
def self.setupterm(term, fildes)
|
72
80
|
errret_int = String.new("\x00" * 8, encoding: 'ASCII-8BIT')
|
73
81
|
ret = @setupterm.(term, fildes, errret_int)
|
74
|
-
errret = errret_int.
|
82
|
+
errret = errret_int.unpack1('i')
|
75
83
|
case ret
|
76
84
|
when 0 # OK
|
77
85
|
0
|
data/lib/reline/unicode.rb
CHANGED
@@ -79,6 +79,8 @@ class Reline::Unicode
|
|
79
79
|
|
80
80
|
require 'reline/unicode/east_asian_width'
|
81
81
|
|
82
|
+
HalfwidthDakutenHandakuten = /[\u{FF9E}\u{FF9F}]/
|
83
|
+
|
82
84
|
MBCharWidthRE = /
|
83
85
|
(?<width_2_1>
|
84
86
|
[#{ EscapedChars.map {|c| "\\x%02x" % c.ord }.join }] (?# ^ + char, such as ^M, ^H, ^[, ...)
|
@@ -93,6 +95,12 @@ class Reline::Unicode
|
|
93
95
|
#{ EastAsianWidth::TYPE_H }
|
94
96
|
| #{ EastAsianWidth::TYPE_NA }
|
95
97
|
| #{ EastAsianWidth::TYPE_N }
|
98
|
+
)(?!#{ HalfwidthDakutenHandakuten })
|
99
|
+
| (?<width_2_3>
|
100
|
+
(?: #{ EastAsianWidth::TYPE_H }
|
101
|
+
| #{ EastAsianWidth::TYPE_NA }
|
102
|
+
| #{ EastAsianWidth::TYPE_N })
|
103
|
+
#{ HalfwidthDakutenHandakuten }
|
96
104
|
)
|
97
105
|
| (?<ambiguous_width>
|
98
106
|
#{EastAsianWidth::TYPE_A}
|
@@ -109,7 +117,7 @@ class Reline::Unicode
|
|
109
117
|
m = mbchar.encode(Encoding::UTF_8).match(MBCharWidthRE)
|
110
118
|
case
|
111
119
|
when m.nil? then 1 # TODO should be U+FFFD � REPLACEMENT CHARACTER
|
112
|
-
when m[:width_2_1], m[:width_2_2] then 2
|
120
|
+
when m[:width_2_1], m[:width_2_2], m[:width_2_3] then 2
|
113
121
|
when m[:width_3] then 3
|
114
122
|
when m[:width_0] then 0
|
115
123
|
when m[:width_1] then 1
|
data/lib/reline/version.rb
CHANGED
data/lib/reline/windows.rb
CHANGED
@@ -168,7 +168,9 @@ class Reline::Windows
|
|
168
168
|
@@input_buf = []
|
169
169
|
@@output_buf = []
|
170
170
|
|
171
|
-
|
171
|
+
@@output = STDOUT
|
172
|
+
|
173
|
+
def self.msys_tty?(io = @@hConsoleInputHandle)
|
172
174
|
# check if fd is a pipe
|
173
175
|
if @@GetFileType.call(io) != FILE_TYPE_PIPE
|
174
176
|
return false
|
@@ -184,7 +186,7 @@ class Reline::Windows
|
|
184
186
|
# DWORD FileNameLength;
|
185
187
|
# WCHAR FileName[1];
|
186
188
|
# } FILE_NAME_INFO
|
187
|
-
len = p_buffer[0, 4].
|
189
|
+
len = p_buffer[0, 4].unpack1("L")
|
188
190
|
name = p_buffer[4, len].encode(Encoding::UTF_8, Encoding::UTF_16LE, invalid: :replace)
|
189
191
|
|
190
192
|
# Check if this could be a MSYS2 pty pipe ('\msys-XXXX-ptyN-XX')
|
@@ -213,8 +215,29 @@ class Reline::Windows
|
|
213
215
|
[ { control_keys: :SHIFT, virtual_key_code: VK_TAB }, [27, 91, 90] ],
|
214
216
|
]
|
215
217
|
|
218
|
+
@@hsg = nil
|
219
|
+
|
216
220
|
def self.process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_code, control_key_state)
|
217
221
|
|
222
|
+
# high-surrogate
|
223
|
+
if 0xD800 <= char_code and char_code <= 0xDBFF
|
224
|
+
@@hsg = char_code
|
225
|
+
return
|
226
|
+
end
|
227
|
+
# low-surrogate
|
228
|
+
if 0xDC00 <= char_code and char_code <= 0xDFFF
|
229
|
+
if @@hsg
|
230
|
+
char_code = 0x10000 + (@@hsg - 0xD800) * 0x400 + char_code - 0xDC00
|
231
|
+
@@hsg = nil
|
232
|
+
else
|
233
|
+
# no high-surrogate. ignored.
|
234
|
+
return
|
235
|
+
end
|
236
|
+
else
|
237
|
+
# ignore high-surrogate without low-surrogate if there
|
238
|
+
@@hsg = nil
|
239
|
+
end
|
240
|
+
|
218
241
|
key = KeyEventRecord.new(virtual_key_code, char_code, control_key_state)
|
219
242
|
|
220
243
|
match = KEY_MAP.find { |args,| key.matches?(**args) }
|
@@ -233,26 +256,35 @@ class Reline::Windows
|
|
233
256
|
|
234
257
|
def self.check_input_event
|
235
258
|
num_of_events = 0.chr * 8
|
236
|
-
while @@output_buf.empty?
|
237
|
-
|
238
|
-
|
239
|
-
|
259
|
+
while @@output_buf.empty?
|
260
|
+
Reline.core.line_editor.resize
|
261
|
+
if @@WaitForSingleObject.(@@hConsoleInputHandle, 100) != 0 # max 0.1 sec
|
262
|
+
# prevent for background consolemode change
|
263
|
+
@@legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0)
|
264
|
+
next
|
265
|
+
end
|
266
|
+
next if @@GetNumberOfConsoleInputEvents.(@@hConsoleInputHandle, num_of_events) == 0 or num_of_events.unpack1('L') == 0
|
267
|
+
input_records = 0.chr * 20 * 80
|
240
268
|
read_event = 0.chr * 4
|
241
|
-
if @@ReadConsoleInputW.(@@hConsoleInputHandle,
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
269
|
+
if @@ReadConsoleInputW.(@@hConsoleInputHandle, input_records, 80, read_event) != 0
|
270
|
+
read_events = read_event.unpack1('L')
|
271
|
+
0.upto(read_events) do |idx|
|
272
|
+
input_record = input_records[idx * 20, 20]
|
273
|
+
event = input_record[0, 2].unpack1('s*')
|
274
|
+
case event
|
275
|
+
when WINDOW_BUFFER_SIZE_EVENT
|
276
|
+
@@winch_handler.()
|
277
|
+
when KEY_EVENT
|
278
|
+
key_down = input_record[4, 4].unpack1('l*')
|
279
|
+
repeat_count = input_record[8, 2].unpack1('s*')
|
280
|
+
virtual_key_code = input_record[10, 2].unpack1('s*')
|
281
|
+
virtual_scan_code = input_record[12, 2].unpack1('s*')
|
282
|
+
char_code = input_record[14, 2].unpack1('S*')
|
283
|
+
control_key_state = input_record[16, 2].unpack1('S*')
|
284
|
+
is_key_down = key_down.zero? ? false : true
|
285
|
+
if is_key_down
|
286
|
+
process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_code, control_key_state)
|
287
|
+
end
|
256
288
|
end
|
257
289
|
end
|
258
290
|
end
|
@@ -273,7 +305,7 @@ class Reline::Windows
|
|
273
305
|
end
|
274
306
|
|
275
307
|
def self.empty_buffer?
|
276
|
-
if not @@
|
308
|
+
if not @@output_buf.empty?
|
277
309
|
false
|
278
310
|
elsif @@kbhit.call == 0
|
279
311
|
true
|
@@ -282,17 +314,37 @@ class Reline::Windows
|
|
282
314
|
end
|
283
315
|
end
|
284
316
|
|
285
|
-
def self.
|
317
|
+
def self.get_console_screen_buffer_info
|
318
|
+
# CONSOLE_SCREEN_BUFFER_INFO
|
319
|
+
# [ 0,2] dwSize.X
|
320
|
+
# [ 2,2] dwSize.Y
|
321
|
+
# [ 4,2] dwCursorPositions.X
|
322
|
+
# [ 6,2] dwCursorPositions.Y
|
323
|
+
# [ 8,2] wAttributes
|
324
|
+
# [10,2] srWindow.Left
|
325
|
+
# [12,2] srWindow.Top
|
326
|
+
# [14,2] srWindow.Right
|
327
|
+
# [16,2] srWindow.Bottom
|
328
|
+
# [18,2] dwMaximumWindowSize.X
|
329
|
+
# [20,2] dwMaximumWindowSize.Y
|
286
330
|
csbi = 0.chr * 22
|
287
|
-
@@GetConsoleScreenBufferInfo.call(@@hConsoleHandle, csbi)
|
331
|
+
return if @@GetConsoleScreenBufferInfo.call(@@hConsoleHandle, csbi) == 0
|
332
|
+
csbi
|
333
|
+
end
|
334
|
+
|
335
|
+
def self.get_screen_size
|
336
|
+
unless csbi = get_console_screen_buffer_info
|
337
|
+
return [1, 1]
|
338
|
+
end
|
288
339
|
csbi[0, 4].unpack('SS').reverse
|
289
340
|
end
|
290
341
|
|
291
342
|
def self.cursor_pos
|
292
|
-
csbi =
|
293
|
-
|
294
|
-
|
295
|
-
|
343
|
+
unless csbi = get_console_screen_buffer_info
|
344
|
+
return Reline::CursorPos.new(0, 0)
|
345
|
+
end
|
346
|
+
x = csbi[4, 2].unpack1('s')
|
347
|
+
y = csbi[6, 2].unpack1('s')
|
296
348
|
Reline::CursorPos.new(x, y)
|
297
349
|
end
|
298
350
|
|
@@ -312,6 +364,7 @@ class Reline::Windows
|
|
312
364
|
|
313
365
|
def self.move_cursor_down(val)
|
314
366
|
if val > 0
|
367
|
+
return unless csbi = get_console_screen_buffer_info
|
315
368
|
screen_height = get_screen_size.first
|
316
369
|
y = cursor_pos.y + val
|
317
370
|
y = screen_height - 1 if y > (screen_height - 1)
|
@@ -322,36 +375,54 @@ class Reline::Windows
|
|
322
375
|
end
|
323
376
|
|
324
377
|
def self.erase_after_cursor
|
325
|
-
csbi =
|
326
|
-
|
327
|
-
cursor = csbi[4, 4].
|
378
|
+
return unless csbi = get_console_screen_buffer_info
|
379
|
+
attributes = csbi[8, 2].unpack1('S')
|
380
|
+
cursor = csbi[4, 4].unpack1('L')
|
328
381
|
written = 0.chr * 4
|
329
382
|
@@FillConsoleOutputCharacter.call(@@hConsoleHandle, 0x20, get_screen_size.last - cursor_pos.x, cursor, written)
|
330
|
-
@@FillConsoleOutputAttribute.call(@@hConsoleHandle,
|
383
|
+
@@FillConsoleOutputAttribute.call(@@hConsoleHandle, attributes, get_screen_size.last - cursor_pos.x, cursor, written)
|
331
384
|
end
|
332
385
|
|
333
386
|
def self.scroll_down(val)
|
334
|
-
return if val
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
@@
|
387
|
+
return if val < 0
|
388
|
+
return unless csbi = get_console_screen_buffer_info
|
389
|
+
buffer_width, x, y, buffer_lines, attributes, window_left, window_top, window_bottom = csbi.unpack('ssssSssx2s')
|
390
|
+
screen_height = window_bottom - window_top + 1
|
391
|
+
val = screen_height if val > screen_height
|
392
|
+
|
393
|
+
if @@legacy_console || window_left != 0
|
394
|
+
# unless ENABLE_VIRTUAL_TERMINAL,
|
395
|
+
# if srWindow.Left != 0 then it's conhost.exe hosted console
|
396
|
+
# and puts "\n" causes horizontal scroll. its glitch.
|
397
|
+
# FYI irb write from culumn 1, so this gives no gain.
|
398
|
+
scroll_rectangle = [0, val, buffer_width, buffer_lines - val].pack('s4')
|
399
|
+
destination_origin = 0 # y * 65536 + x
|
400
|
+
fill = [' '.ord, attributes].pack('SS')
|
401
|
+
@@ScrollConsoleScreenBuffer.call(@@hConsoleHandle, scroll_rectangle, nil, destination_origin, fill)
|
402
|
+
else
|
403
|
+
origin_x = x + 1
|
404
|
+
origin_y = y - window_top + 1
|
405
|
+
@@output.write [
|
406
|
+
(origin_y != screen_height) ? "\e[#{screen_height};H" : nil,
|
407
|
+
"\n" * val,
|
408
|
+
(origin_y != screen_height or !x.zero?) ? "\e[#{origin_y};#{origin_x}H" : nil
|
409
|
+
].join
|
410
|
+
end
|
341
411
|
end
|
342
412
|
|
343
413
|
def self.clear_screen
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
414
|
+
if @@legacy_console
|
415
|
+
return unless csbi = get_console_screen_buffer_info
|
416
|
+
buffer_width, _buffer_lines, attributes, window_top, window_bottom = csbi.unpack('ss@8S@12sx2s')
|
417
|
+
fill_length = buffer_width * (window_bottom - window_top + 1)
|
418
|
+
screen_topleft = window_top * 65536
|
419
|
+
written = 0.chr * 4
|
420
|
+
@@FillConsoleOutputCharacter.call(@@hConsoleHandle, 0x20, fill_length, screen_topleft, written)
|
421
|
+
@@FillConsoleOutputAttribute.call(@@hConsoleHandle, attributes, fill_length, screen_topleft, written)
|
422
|
+
@@SetConsoleCursorPosition.call(@@hConsoleHandle, screen_topleft)
|
423
|
+
else
|
424
|
+
@@output.write "\e[2J" "\e[H"
|
425
|
+
end
|
355
426
|
end
|
356
427
|
|
357
428
|
def self.set_screen_size(rows, columns)
|
data/lib/reline.rb
CHANGED
@@ -17,19 +17,15 @@ module Reline
|
|
17
17
|
class ConfigEncodingConversionError < StandardError; end
|
18
18
|
|
19
19
|
Key = Struct.new('Key', :char, :combined_char, :with_meta) do
|
20
|
-
def match?(
|
21
|
-
|
22
|
-
|
23
|
-
(
|
24
|
-
(
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
true
|
30
|
-
else
|
31
|
-
false
|
32
|
-
end
|
20
|
+
def match?(other)
|
21
|
+
case other
|
22
|
+
when Reline::Key
|
23
|
+
(other.char.nil? or char.nil? or char == other.char) and
|
24
|
+
(other.combined_char.nil? or combined_char.nil? or combined_char == other.combined_char) and
|
25
|
+
(other.with_meta.nil? or with_meta.nil? or with_meta == other.with_meta)
|
26
|
+
when Integer, Symbol
|
27
|
+
(combined_char and combined_char == other) or
|
28
|
+
(combined_char.nil? and char and char == other)
|
33
29
|
else
|
34
30
|
false
|
35
31
|
end
|
@@ -37,7 +33,7 @@ module Reline
|
|
37
33
|
alias_method :==, :match?
|
38
34
|
end
|
39
35
|
CursorPos = Struct.new(:x, :y)
|
40
|
-
DialogRenderInfo = Struct.new(:pos, :contents, :
|
36
|
+
DialogRenderInfo = Struct.new(:pos, :contents, :bg_color, :width, :height, :scrollbar, keyword_init: true)
|
41
37
|
|
42
38
|
class Core
|
43
39
|
ATTR_READER_NAMES = %i(
|
@@ -64,7 +60,7 @@ module Reline
|
|
64
60
|
|
65
61
|
def initialize
|
66
62
|
self.output = STDOUT
|
67
|
-
@dialog_proc_list =
|
63
|
+
@dialog_proc_list = {}
|
68
64
|
yield self
|
69
65
|
@completion_quote_character = nil
|
70
66
|
@bracketed_paste_finished = false
|
@@ -159,10 +155,15 @@ module Reline
|
|
159
155
|
@dig_perfect_match_proc = p
|
160
156
|
end
|
161
157
|
|
158
|
+
DialogProc = Struct.new(:dialog_proc, :context)
|
162
159
|
def add_dialog_proc(name_sym, p, context = nil)
|
163
160
|
raise ArgumentError unless p.respond_to?(:call) or p.nil?
|
164
161
|
raise ArgumentError unless name_sym.instance_of?(Symbol)
|
165
|
-
@dialog_proc_list
|
162
|
+
@dialog_proc_list[name_sym] = DialogProc.new(p, context)
|
163
|
+
end
|
164
|
+
|
165
|
+
def dialog_proc(name_sym)
|
166
|
+
@dialog_proc_list[name_sym]
|
166
167
|
end
|
167
168
|
|
168
169
|
def input=(val)
|
@@ -214,7 +215,7 @@ module Reline
|
|
214
215
|
return nil
|
215
216
|
end
|
216
217
|
pre, target, post = retrieve_completion_block(true)
|
217
|
-
if target.nil? or target.empty? or target.size <= 3
|
218
|
+
if target.nil? or target.empty? or (completion_journey_data&.pointer == -1 and target.size <= 3)
|
218
219
|
return nil
|
219
220
|
end
|
220
221
|
if completion_journey_data and completion_journey_data.list
|
@@ -241,7 +242,8 @@ module Reline
|
|
241
242
|
context.clear
|
242
243
|
context.push(cursor_pos_to_render, result, pointer, dialog)
|
243
244
|
end
|
244
|
-
|
245
|
+
dialog.pointer = pointer
|
246
|
+
DialogRenderInfo.new(pos: cursor_pos_to_render, contents: result, scrollbar: true, height: 15)
|
245
247
|
}
|
246
248
|
Reline::DEFAULT_DIALOG_CONTEXT = Array.new
|
247
249
|
|
@@ -304,9 +306,8 @@ module Reline
|
|
304
306
|
line_editor.auto_indent_proc = auto_indent_proc
|
305
307
|
line_editor.dig_perfect_match_proc = dig_perfect_match_proc
|
306
308
|
line_editor.pre_input_hook = pre_input_hook
|
307
|
-
@dialog_proc_list.
|
308
|
-
name_sym, dialog_proc, context
|
309
|
-
line_editor.add_dialog_proc(name_sym, dialog_proc, context)
|
309
|
+
@dialog_proc_list.each_pair do |name_sym, d|
|
310
|
+
line_editor.add_dialog_proc(name_sym, d.dialog_proc, d.context)
|
310
311
|
end
|
311
312
|
|
312
313
|
unless config.test_mode
|
@@ -318,6 +319,7 @@ module Reline
|
|
318
319
|
line_editor.rerender
|
319
320
|
|
320
321
|
begin
|
322
|
+
line_editor.set_signal_handlers
|
321
323
|
prev_pasting_state = false
|
322
324
|
loop do
|
323
325
|
prev_pasting_state = Reline::IOGate.in_pasting?
|
@@ -346,6 +348,11 @@ module Reline
|
|
346
348
|
line_editor.finalize
|
347
349
|
Reline::IOGate.deprep(otio)
|
348
350
|
raise e
|
351
|
+
rescue Exception
|
352
|
+
# Including Interrupt
|
353
|
+
line_editor.finalize
|
354
|
+
Reline::IOGate.deprep(otio)
|
355
|
+
raise
|
349
356
|
end
|
350
357
|
|
351
358
|
line_editor.finalize
|
@@ -460,7 +467,7 @@ module Reline
|
|
460
467
|
|
461
468
|
private def may_req_ambiguous_char_width
|
462
469
|
@ambiguous_width = 2 if Reline::IOGate == Reline::GeneralIO or STDOUT.is_a?(File)
|
463
|
-
return if @ambiguous_width
|
470
|
+
return if defined? @ambiguous_width
|
464
471
|
Reline::IOGate.move_cursor_column(0)
|
465
472
|
begin
|
466
473
|
output.write "\u{25bd}"
|
@@ -483,7 +490,7 @@ module Reline
|
|
483
490
|
#--------------------------------------------------------
|
484
491
|
|
485
492
|
(Core::ATTR_READER_NAMES).each { |name|
|
486
|
-
def_single_delegators :core, "#{name}", "#{name}="
|
493
|
+
def_single_delegators :core, :"#{name}", :"#{name}="
|
487
494
|
}
|
488
495
|
def_single_delegators :core, :input=, :output=
|
489
496
|
def_single_delegators :core, :vi_editing_mode, :emacs_editing_mode
|
@@ -519,6 +526,7 @@ module Reline
|
|
519
526
|
def_single_delegators :core, :last_incremental_search
|
520
527
|
def_single_delegators :core, :last_incremental_search=
|
521
528
|
def_single_delegators :core, :add_dialog_proc
|
529
|
+
def_single_delegators :core, :dialog_proc
|
522
530
|
def_single_delegators :core, :autocompletion, :autocompletion=
|
523
531
|
|
524
532
|
def_single_delegators :core, :readmultiline
|
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.
|
4
|
+
version: 0.3.0
|
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-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: io-console
|
@@ -47,7 +47,6 @@ files:
|
|
47
47
|
- lib/reline/key_stroke.rb
|
48
48
|
- lib/reline/kill_ring.rb
|
49
49
|
- lib/reline/line_editor.rb
|
50
|
-
- lib/reline/line_editor.rb.orig
|
51
50
|
- lib/reline/sibori.rb
|
52
51
|
- lib/reline/terminfo.rb
|
53
52
|
- lib/reline/unicode.rb
|
@@ -70,9 +69,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
69
|
version: '2.5'
|
71
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
71
|
requirements:
|
73
|
-
- - "
|
72
|
+
- - ">="
|
74
73
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
74
|
+
version: '0'
|
76
75
|
requirements: []
|
77
76
|
rubygems_version: 3.2.22
|
78
77
|
signing_key:
|