reline 0.1.6 → 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.
- checksums.yaml +4 -4
- data/lib/reline.rb +23 -5
- data/lib/reline/ansi.rb +44 -3
- data/lib/reline/config.rb +3 -1
- data/lib/reline/general_io.rb +15 -1
- data/lib/reline/key_actor/emacs.rb +1 -1
- data/lib/reline/key_actor/vi_command.rb +2 -2
- data/lib/reline/kill_ring.rb +12 -0
- data/lib/reline/line_editor.rb +552 -232
- data/lib/reline/line_editor.rb.orig +2606 -0
- data/lib/reline/sibori.rb +14 -0
- data/lib/reline/unicode.rb +63 -33
- data/lib/reline/unicode/east_asian_width.rb +13 -13
- data/lib/reline/version.rb +1 -1
- data/lib/reline/windows.rb +8 -1
- metadata +3 -2
data/lib/reline/sibori.rb
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
require 'reline/unicode'
|
2
2
|
|
3
|
+
=begin
|
4
|
+
|
5
|
+
\ |
|
6
|
+
\ | <--- whipped cream
|
7
|
+
\ |
|
8
|
+
\ |
|
9
|
+
\-~~|
|
10
|
+
\ | <--- shibori kutigane (piping nozzle in Japanese)
|
11
|
+
\Ml
|
12
|
+
(\ __ __
|
13
|
+
( \--( ) )
|
14
|
+
(__(__)__) <--- compressed whipped cream
|
15
|
+
=end
|
16
|
+
|
3
17
|
class Sibori
|
4
18
|
attr_writer :output
|
5
19
|
|
data/lib/reline/unicode.rb
CHANGED
@@ -35,11 +35,16 @@ class Reline::Unicode
|
|
35
35
|
}
|
36
36
|
EscapedChars = EscapedPairs.keys.map(&:chr)
|
37
37
|
|
38
|
-
CSI_REGEXP = /\e\[[\d;]*[ABCDEFGHJKSTfminsuhl]/
|
39
|
-
OSC_REGEXP = /\e\]\d+(?:;[^;]+)*\a/
|
40
38
|
NON_PRINTING_START = "\1"
|
41
39
|
NON_PRINTING_END = "\2"
|
42
|
-
|
40
|
+
CSI_REGEXP = /\e\[[\d;]*[ABCDEFGHJKSTfminsuhl]/
|
41
|
+
OSC_REGEXP = /\e\]\d+(?:;[^;]+)*\a/
|
42
|
+
WIDTH_SCANNER = /\G(?:(#{NON_PRINTING_START})|(#{NON_PRINTING_END})|(#{CSI_REGEXP})|(#{OSC_REGEXP})|(\X))/o
|
43
|
+
NON_PRINTING_START_INDEX = 0
|
44
|
+
NON_PRINTING_END_INDEX = 1
|
45
|
+
CSI_REGEXP_INDEX = 2
|
46
|
+
OSC_REGEXP_INDEX = 3
|
47
|
+
GRAPHEME_CLUSTER_INDEX = 4
|
43
48
|
|
44
49
|
def self.get_mbchar_byte_size_by_first_char(c)
|
45
50
|
# Checks UTF-8 character byte size
|
@@ -72,20 +77,42 @@ class Reline::Unicode
|
|
72
77
|
}.join
|
73
78
|
end
|
74
79
|
|
80
|
+
require 'reline/unicode/east_asian_width'
|
81
|
+
|
82
|
+
MBCharWidthRE = /
|
83
|
+
(?<width_2_1>
|
84
|
+
[#{ EscapedChars.map {|c| "\\x%02x" % c.ord }.join }] (?# ^ + char, such as ^M, ^H, ^[, ...)
|
85
|
+
)
|
86
|
+
| (?<width_3>^\u{2E3B}) (?# THREE-EM DASH)
|
87
|
+
| (?<width_0>^\p{M})
|
88
|
+
| (?<width_2_2>
|
89
|
+
#{ EastAsianWidth::TYPE_F }
|
90
|
+
| #{ EastAsianWidth::TYPE_W }
|
91
|
+
)
|
92
|
+
| (?<width_1>
|
93
|
+
#{ EastAsianWidth::TYPE_H }
|
94
|
+
| #{ EastAsianWidth::TYPE_NA }
|
95
|
+
| #{ EastAsianWidth::TYPE_N }
|
96
|
+
)
|
97
|
+
| (?<ambiguous_width>
|
98
|
+
#{EastAsianWidth::TYPE_A}
|
99
|
+
)
|
100
|
+
/x
|
101
|
+
|
75
102
|
def self.get_mbchar_width(mbchar)
|
76
|
-
|
77
|
-
|
78
|
-
2
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
when
|
86
|
-
|
87
|
-
when
|
88
|
-
|
103
|
+
ord = mbchar.ord
|
104
|
+
if (0x00 <= ord and ord <= 0x1F)
|
105
|
+
return 2
|
106
|
+
elsif (0x20 <= ord and ord <= 0x7E)
|
107
|
+
return 1
|
108
|
+
end
|
109
|
+
m = mbchar.encode(Encoding::UTF_8).match(MBCharWidthRE)
|
110
|
+
case
|
111
|
+
when m[:width_2_1], m[:width_2_2] then 2
|
112
|
+
when m[:width_3] then 3
|
113
|
+
when m[:width_0] then 0
|
114
|
+
when m[:width_1] then 1
|
115
|
+
when m[:ambiguous_width] then Reline.ambiguous_width
|
89
116
|
else
|
90
117
|
nil
|
91
118
|
end
|
@@ -97,13 +124,14 @@ class Reline::Unicode
|
|
97
124
|
rest = str.encode(Encoding::UTF_8)
|
98
125
|
in_zero_width = false
|
99
126
|
rest.scan(WIDTH_SCANNER) do |gc|
|
100
|
-
case
|
101
|
-
when
|
127
|
+
case
|
128
|
+
when gc[NON_PRINTING_START_INDEX]
|
102
129
|
in_zero_width = true
|
103
|
-
when
|
130
|
+
when gc[NON_PRINTING_END_INDEX]
|
104
131
|
in_zero_width = false
|
105
|
-
when
|
106
|
-
|
132
|
+
when gc[CSI_REGEXP_INDEX], gc[OSC_REGEXP_INDEX]
|
133
|
+
when gc[GRAPHEME_CLUSTER_INDEX]
|
134
|
+
gc = gc[GRAPHEME_CLUSTER_INDEX]
|
107
135
|
unless in_zero_width
|
108
136
|
width += get_mbchar_width(gc)
|
109
137
|
end
|
@@ -124,14 +152,17 @@ class Reline::Unicode
|
|
124
152
|
rest = str.encode(Encoding::UTF_8)
|
125
153
|
in_zero_width = false
|
126
154
|
rest.scan(WIDTH_SCANNER) do |gc|
|
127
|
-
case
|
128
|
-
when
|
155
|
+
case
|
156
|
+
when gc[NON_PRINTING_START_INDEX]
|
129
157
|
in_zero_width = true
|
130
|
-
when
|
158
|
+
when gc[NON_PRINTING_END_INDEX]
|
131
159
|
in_zero_width = false
|
132
|
-
when
|
133
|
-
lines.last << gc
|
134
|
-
|
160
|
+
when gc[CSI_REGEXP_INDEX]
|
161
|
+
lines.last << gc[CSI_REGEXP_INDEX]
|
162
|
+
when gc[OSC_REGEXP_INDEX]
|
163
|
+
lines.last << gc[OSC_REGEXP_INDEX]
|
164
|
+
when gc[GRAPHEME_CLUSTER_INDEX]
|
165
|
+
gc = gc[GRAPHEME_CLUSTER_INDEX]
|
135
166
|
unless in_zero_width
|
136
167
|
mbchar_width = get_mbchar_width(gc)
|
137
168
|
if (width += mbchar_width) > max_width
|
@@ -427,8 +458,8 @@ class Reline::Unicode
|
|
427
458
|
[byte_size, width]
|
428
459
|
end
|
429
460
|
|
430
|
-
def self.vi_forward_word(line, byte_pointer)
|
431
|
-
if
|
461
|
+
def self.vi_forward_word(line, byte_pointer, drop_terminate_spaces = false)
|
462
|
+
if line.bytesize > byte_pointer
|
432
463
|
size = get_next_mbchar_size(line, byte_pointer)
|
433
464
|
mbchar = line.byteslice(byte_pointer, size)
|
434
465
|
if mbchar =~ /\w/
|
@@ -443,7 +474,7 @@ class Reline::Unicode
|
|
443
474
|
else
|
444
475
|
return [0, 0]
|
445
476
|
end
|
446
|
-
while
|
477
|
+
while line.bytesize > (byte_pointer + byte_size)
|
447
478
|
size = get_next_mbchar_size(line, byte_pointer + byte_size)
|
448
479
|
mbchar = line.byteslice(byte_pointer + byte_size, size)
|
449
480
|
case started_by
|
@@ -457,7 +488,8 @@ class Reline::Unicode
|
|
457
488
|
width += get_mbchar_width(mbchar)
|
458
489
|
byte_size += size
|
459
490
|
end
|
460
|
-
|
491
|
+
return [byte_size, width] if drop_terminate_spaces
|
492
|
+
while line.bytesize > (byte_pointer + byte_size)
|
461
493
|
size = get_next_mbchar_size(line, byte_pointer + byte_size)
|
462
494
|
mbchar = line.byteslice(byte_pointer + byte_size, size)
|
463
495
|
break if mbchar =~ /\S/
|
@@ -591,5 +623,3 @@ class Reline::Unicode
|
|
591
623
|
[byte_size, width]
|
592
624
|
end
|
593
625
|
end
|
594
|
-
|
595
|
-
require 'reline/unicode/east_asian_width'
|
@@ -1,16 +1,16 @@
|
|
1
1
|
class Reline::Unicode::EastAsianWidth
|
2
2
|
# This is based on EastAsianWidth.txt
|
3
|
-
#
|
3
|
+
# EastAsianWidth.txt
|
4
4
|
|
5
5
|
# Fullwidth
|
6
|
-
TYPE_F = /^
|
6
|
+
TYPE_F = /^[#{ %W(
|
7
7
|
\u{3000}
|
8
8
|
\u{FF01}-\u{FF60}
|
9
9
|
\u{FFE0}-\u{FFE6}
|
10
|
-
).join }]
|
10
|
+
).join }]/
|
11
11
|
|
12
12
|
# Halfwidth
|
13
|
-
TYPE_H = /^
|
13
|
+
TYPE_H = /^[#{ %W(
|
14
14
|
\u{20A9}
|
15
15
|
\u{FF61}-\u{FFBE}
|
16
16
|
\u{FFC2}-\u{FFC7}
|
@@ -18,10 +18,10 @@ class Reline::Unicode::EastAsianWidth
|
|
18
18
|
\u{FFD2}-\u{FFD7}
|
19
19
|
\u{FFDA}-\u{FFDC}
|
20
20
|
\u{FFE8}-\u{FFEE}
|
21
|
-
).join }]
|
21
|
+
).join }]/
|
22
22
|
|
23
23
|
# Wide
|
24
|
-
TYPE_W = /^
|
24
|
+
TYPE_W = /^[#{ %W(
|
25
25
|
\u{1100}-\u{115F}
|
26
26
|
\u{231A}-\u{231B}
|
27
27
|
\u{2329}-\u{232A}
|
@@ -136,10 +136,10 @@ class Reline::Unicode::EastAsianWidth
|
|
136
136
|
\u{1FAD0}-\u{1FAD6}
|
137
137
|
\u{20000}-\u{2FFFD}
|
138
138
|
\u{30000}-\u{3FFFD}
|
139
|
-
).join }]
|
139
|
+
).join }]/
|
140
140
|
|
141
141
|
# Narrow
|
142
|
-
TYPE_NA = /^
|
142
|
+
TYPE_NA = /^[#{ %W(
|
143
143
|
\u{0020}-\u{007E}
|
144
144
|
\u{00A2}-\u{00A3}
|
145
145
|
\u{00A5}-\u{00A6}
|
@@ -147,10 +147,10 @@ class Reline::Unicode::EastAsianWidth
|
|
147
147
|
\u{00AF}
|
148
148
|
\u{27E6}-\u{27ED}
|
149
149
|
\u{2985}-\u{2986}
|
150
|
-
).join }]
|
150
|
+
).join }]/
|
151
151
|
|
152
152
|
# Ambiguous
|
153
|
-
TYPE_A = /^
|
153
|
+
TYPE_A = /^[#{ %W(
|
154
154
|
\u{00A1}
|
155
155
|
\u{00A4}
|
156
156
|
\u{00A7}-\u{00A8}
|
@@ -330,10 +330,10 @@ class Reline::Unicode::EastAsianWidth
|
|
330
330
|
\u{E0100}-\u{E01EF}
|
331
331
|
\u{F0000}-\u{FFFFD}
|
332
332
|
\u{100000}-\u{10FFFD}
|
333
|
-
).join }]
|
333
|
+
).join }]/
|
334
334
|
|
335
335
|
# Neutral
|
336
|
-
TYPE_N = /^
|
336
|
+
TYPE_N = /^[#{ %W(
|
337
337
|
\u{0000}-\u{001F}
|
338
338
|
\u{007F}-\u{00A0}
|
339
339
|
\u{00A9}
|
@@ -1160,5 +1160,5 @@ class Reline::Unicode::EastAsianWidth
|
|
1160
1160
|
\u{1FBF0}-\u{1FBF9}
|
1161
1161
|
\u{E0001}
|
1162
1162
|
\u{E0020}-\u{E007F}
|
1163
|
-
).join }]
|
1163
|
+
).join }]/
|
1164
1164
|
end
|
data/lib/reline/version.rb
CHANGED
data/lib/reline/windows.rb
CHANGED
@@ -233,7 +233,9 @@ class Reline::Windows
|
|
233
233
|
|
234
234
|
def self.move_cursor_up(val)
|
235
235
|
if val > 0
|
236
|
-
|
236
|
+
y = cursor_pos.y - val
|
237
|
+
y = 0 if y < 0
|
238
|
+
@@SetConsoleCursorPosition.call(@@hConsoleHandle, y * 65536 + cursor_pos.x)
|
237
239
|
elsif val < 0
|
238
240
|
move_cursor_down(-val)
|
239
241
|
end
|
@@ -241,6 +243,9 @@ class Reline::Windows
|
|
241
243
|
|
242
244
|
def self.move_cursor_down(val)
|
243
245
|
if val > 0
|
246
|
+
screen_height = get_screen_size.first
|
247
|
+
y = cursor_pos.y + val
|
248
|
+
y = screen_height - 1 if y > (screen_height - 1)
|
244
249
|
@@SetConsoleCursorPosition.call(@@hConsoleHandle, (cursor_pos.y + val) * 65536 + cursor_pos.x)
|
245
250
|
elsif val < 0
|
246
251
|
move_cursor_up(-val)
|
@@ -257,6 +262,8 @@ class Reline::Windows
|
|
257
262
|
|
258
263
|
def self.scroll_down(val)
|
259
264
|
return if val.zero?
|
265
|
+
screen_height = get_screen_size.first
|
266
|
+
val = screen_height - 1 if val > (screen_height - 1)
|
260
267
|
scroll_rectangle = [0, val, get_screen_size.last, get_screen_size.first].pack('s4')
|
261
268
|
destination_origin = 0 # y * 65536 + x
|
262
269
|
fill = [' '.ord, 0].pack('SS')
|
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.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- aycabta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: io-console
|
@@ -103,6 +103,7 @@ files:
|
|
103
103
|
- lib/reline/key_stroke.rb
|
104
104
|
- lib/reline/kill_ring.rb
|
105
105
|
- lib/reline/line_editor.rb
|
106
|
+
- lib/reline/line_editor.rb.orig
|
106
107
|
- lib/reline/sibori.rb
|
107
108
|
- lib/reline/unicode.rb
|
108
109
|
- lib/reline/unicode/east_asian_width.rb
|