reline 0.1.2 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -0
- data/lib/reline.rb +47 -25
- data/lib/reline/ansi.rb +95 -18
- data/lib/reline/config.rb +69 -10
- data/lib/reline/general_io.rb +12 -0
- data/lib/reline/history.rb +33 -13
- data/lib/reline/key_actor/emacs.rb +6 -6
- data/lib/reline/key_actor/vi_command.rb +2 -2
- data/lib/reline/key_actor/vi_insert.rb +2 -2
- data/lib/reline/key_stroke.rb +2 -0
- data/lib/reline/line_editor.rb +350 -126
- data/lib/reline/line_editor.rb.orig +2384 -0
- data/lib/reline/line_editor.rb.rej +81 -0
- data/lib/reline/sibori.rb +170 -0
- data/lib/reline/unicode.rb +93 -15
- data/lib/reline/unicode/east_asian_width.rb +1149 -1130
- data/lib/reline/version.rb +1 -1
- data/lib/reline/windows.rb +65 -5
- metadata +24 -7
data/lib/reline/version.rb
CHANGED
data/lib/reline/windows.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
require 'fiddle/import'
|
2
2
|
|
3
3
|
class Reline::Windows
|
4
|
+
def self.encoding
|
5
|
+
Encoding::UTF_8
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.win?
|
9
|
+
true
|
10
|
+
end
|
11
|
+
|
4
12
|
RAW_KEYSTROKE_CONFIG = {
|
5
13
|
[224, 72] => :ed_prev_history, # ↑
|
6
14
|
[224, 80] => :ed_next_history, # ↓
|
@@ -68,6 +76,8 @@ class Reline::Windows
|
|
68
76
|
STD_INPUT_HANDLE = -10
|
69
77
|
STD_OUTPUT_HANDLE = -11
|
70
78
|
WINDOW_BUFFER_SIZE_EVENT = 0x04
|
79
|
+
FILE_TYPE_PIPE = 0x0003
|
80
|
+
FILE_NAME_INFO = 2
|
71
81
|
@@getwch = Win32API.new('msvcrt', '_getwch', [], 'I')
|
72
82
|
@@kbhit = Win32API.new('msvcrt', '_kbhit', [], 'I')
|
73
83
|
@@GetKeyState = Win32API.new('user32', 'GetKeyState', ['L'], 'L')
|
@@ -80,9 +90,37 @@ class Reline::Windows
|
|
80
90
|
@@hConsoleInputHandle = @@GetStdHandle.call(STD_INPUT_HANDLE)
|
81
91
|
@@GetNumberOfConsoleInputEvents = Win32API.new('kernel32', 'GetNumberOfConsoleInputEvents', ['L', 'P'], 'L')
|
82
92
|
@@ReadConsoleInput = Win32API.new('kernel32', 'ReadConsoleInput', ['L', 'P', 'L', 'P'], 'L')
|
93
|
+
@@GetFileType = Win32API.new('kernel32', 'GetFileType', ['L'], 'L')
|
94
|
+
@@GetFileInformationByHandleEx = Win32API.new('kernel32', 'GetFileInformationByHandleEx', ['L', 'I', 'P', 'L'], 'I')
|
95
|
+
@@FillConsoleOutputAttribute = Win32API.new('kernel32', 'FillConsoleOutputAttribute', ['L', 'L', 'L', 'L', 'P'], 'L')
|
96
|
+
|
83
97
|
@@input_buf = []
|
84
98
|
@@output_buf = []
|
85
99
|
|
100
|
+
def self.msys_tty?(io=@@hConsoleInputHandle)
|
101
|
+
# check if fd is a pipe
|
102
|
+
if @@GetFileType.call(io) != FILE_TYPE_PIPE
|
103
|
+
return false
|
104
|
+
end
|
105
|
+
|
106
|
+
bufsize = 1024
|
107
|
+
p_buffer = "\0" * bufsize
|
108
|
+
res = @@GetFileInformationByHandleEx.call(io, FILE_NAME_INFO, p_buffer, bufsize - 2)
|
109
|
+
return false if res == 0
|
110
|
+
|
111
|
+
# get pipe name: p_buffer layout is:
|
112
|
+
# struct _FILE_NAME_INFO {
|
113
|
+
# DWORD FileNameLength;
|
114
|
+
# WCHAR FileName[1];
|
115
|
+
# } FILE_NAME_INFO
|
116
|
+
len = p_buffer[0, 4].unpack("L")[0]
|
117
|
+
name = p_buffer[4, len].encode(Encoding::UTF_8, Encoding::UTF_16LE, invalid: :replace)
|
118
|
+
|
119
|
+
# Check if this could be a MSYS2 pty pipe ('\msys-XXXX-ptyN-XX')
|
120
|
+
# or a cygwin pty pipe ('\cygwin-XXXX-ptyN-XX')
|
121
|
+
name =~ /(msys-|cygwin-).*-pty/ ? true : false
|
122
|
+
end
|
123
|
+
|
86
124
|
def self.getwch
|
87
125
|
unless @@input_buf.empty?
|
88
126
|
return @@input_buf.shift
|
@@ -99,7 +137,7 @@ class Reline::Windows
|
|
99
137
|
return @@input_buf.shift
|
100
138
|
end
|
101
139
|
begin
|
102
|
-
bytes = ret.chr(Encoding::UTF_8).
|
140
|
+
bytes = ret.chr(Encoding::UTF_8).bytes
|
103
141
|
@@input_buf.push(*bytes)
|
104
142
|
rescue Encoding::UndefinedConversionError
|
105
143
|
@@input_buf << ret
|
@@ -161,6 +199,20 @@ class Reline::Windows
|
|
161
199
|
@@output_buf.unshift(c)
|
162
200
|
end
|
163
201
|
|
202
|
+
def self.in_pasting?
|
203
|
+
not self.empty_buffer?
|
204
|
+
end
|
205
|
+
|
206
|
+
def self.empty_buffer?
|
207
|
+
if not @@input_buf.empty?
|
208
|
+
false
|
209
|
+
elsif @@kbhit.call == 0
|
210
|
+
true
|
211
|
+
else
|
212
|
+
false
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
164
216
|
def self.get_screen_size
|
165
217
|
csbi = 0.chr * 22
|
166
218
|
@@GetConsoleScreenBufferInfo.call(@@hConsoleHandle, csbi)
|
@@ -205,16 +257,24 @@ class Reline::Windows
|
|
205
257
|
|
206
258
|
def self.scroll_down(val)
|
207
259
|
return if val.zero?
|
208
|
-
scroll_rectangle = [0, val, get_screen_size.
|
260
|
+
scroll_rectangle = [0, val, get_screen_size.last, get_screen_size.first].pack('s4')
|
209
261
|
destination_origin = 0 # y * 65536 + x
|
210
262
|
fill = [' '.ord, 0].pack('SS')
|
211
263
|
@@ScrollConsoleScreenBuffer.call(@@hConsoleHandle, scroll_rectangle, nil, destination_origin, fill)
|
212
264
|
end
|
213
265
|
|
214
266
|
def self.clear_screen
|
215
|
-
|
216
|
-
|
217
|
-
|
267
|
+
csbi = 0.chr * 22
|
268
|
+
return if @@GetConsoleScreenBufferInfo.call(@@hConsoleHandle, csbi) == 0
|
269
|
+
buffer_width = csbi[0, 2].unpack('S').first
|
270
|
+
attributes = csbi[8, 2].unpack('S').first
|
271
|
+
_window_left, window_top, _window_right, window_bottom = *csbi[10,8].unpack('S*')
|
272
|
+
fill_length = buffer_width * (window_bottom - window_top + 1)
|
273
|
+
screen_topleft = window_top * 65536
|
274
|
+
written = 0.chr * 4
|
275
|
+
@@FillConsoleOutputCharacter.call(@@hConsoleHandle, 0x20, fill_length, screen_topleft, written)
|
276
|
+
@@FillConsoleOutputAttribute.call(@@hConsoleHandle, attributes, fill_length, screen_topleft, written)
|
277
|
+
@@SetConsoleCursorPosition.call(@@hConsoleHandle, screen_topleft)
|
218
278
|
end
|
219
279
|
|
220
280
|
def self.set_screen_size(rows, columns)
|
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.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- aycabta
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: io-console
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
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
|
69
83
|
description: Alternative GNU Readline or Editline implementation by pure Ruby.
|
70
84
|
email:
|
71
85
|
- aycabta@gmail.com
|
@@ -89,15 +103,18 @@ files:
|
|
89
103
|
- lib/reline/key_stroke.rb
|
90
104
|
- lib/reline/kill_ring.rb
|
91
105
|
- lib/reline/line_editor.rb
|
106
|
+
- lib/reline/line_editor.rb.orig
|
107
|
+
- lib/reline/line_editor.rb.rej
|
108
|
+
- lib/reline/sibori.rb
|
92
109
|
- lib/reline/unicode.rb
|
93
110
|
- lib/reline/unicode/east_asian_width.rb
|
94
111
|
- lib/reline/version.rb
|
95
112
|
- lib/reline/windows.rb
|
96
113
|
homepage: https://github.com/ruby/reline
|
97
114
|
licenses:
|
98
|
-
- Ruby
|
115
|
+
- Ruby
|
99
116
|
metadata: {}
|
100
|
-
post_install_message:
|
117
|
+
post_install_message:
|
101
118
|
rdoc_options: []
|
102
119
|
require_paths:
|
103
120
|
- lib
|
@@ -112,8 +129,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
129
|
- !ruby/object:Gem::Version
|
113
130
|
version: '0'
|
114
131
|
requirements: []
|
115
|
-
rubygems_version: 3.1.
|
116
|
-
signing_key:
|
132
|
+
rubygems_version: 3.1.4
|
133
|
+
signing_key:
|
117
134
|
specification_version: 4
|
118
135
|
summary: Alternative GNU Readline or Editline implementation by pure Ruby.
|
119
136
|
test_files: []
|