reline 0.3.5 → 0.6.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.
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - aycabta
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-06-03 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: io-console
@@ -35,29 +34,33 @@ files:
35
34
  - COPYING
36
35
  - README.md
37
36
  - lib/reline.rb
38
- - lib/reline/ansi.rb
39
37
  - lib/reline/config.rb
40
- - lib/reline/general_io.rb
38
+ - lib/reline/face.rb
41
39
  - lib/reline/history.rb
40
+ - lib/reline/io.rb
41
+ - lib/reline/io/ansi.rb
42
+ - lib/reline/io/dumb.rb
43
+ - lib/reline/io/windows.rb
42
44
  - lib/reline/key_actor.rb
43
45
  - lib/reline/key_actor/base.rb
46
+ - lib/reline/key_actor/composite.rb
44
47
  - lib/reline/key_actor/emacs.rb
45
48
  - lib/reline/key_actor/vi_command.rb
46
49
  - lib/reline/key_actor/vi_insert.rb
47
50
  - lib/reline/key_stroke.rb
48
51
  - lib/reline/kill_ring.rb
49
52
  - lib/reline/line_editor.rb
50
- - lib/reline/terminfo.rb
51
53
  - lib/reline/unicode.rb
52
54
  - lib/reline/unicode/east_asian_width.rb
53
55
  - lib/reline/version.rb
54
- - lib/reline/windows.rb
55
56
  - license_of_rb-readline
56
57
  homepage: https://github.com/ruby/reline
57
58
  licenses:
58
59
  - Ruby
59
- metadata: {}
60
- post_install_message:
60
+ metadata:
61
+ bug_tracker_uri: https://github.com/ruby/reline/issues
62
+ changelog_uri: https://github.com/ruby/reline/releases
63
+ source_code_uri: https://github.com/ruby/reline
61
64
  rdoc_options: []
62
65
  require_paths:
63
66
  - lib
@@ -72,8 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
75
  - !ruby/object:Gem::Version
73
76
  version: '0'
74
77
  requirements: []
75
- rubygems_version: 3.4.13
76
- signing_key:
78
+ rubygems_version: 3.6.7
77
79
  specification_version: 4
78
80
  summary: Alternative GNU Readline or Editline implementation by pure Ruby.
79
81
  test_files: []
data/lib/reline/ansi.rb DELETED
@@ -1,357 +0,0 @@
1
- require 'io/console'
2
- require 'io/wait'
3
- require 'timeout'
4
- require_relative 'terminfo'
5
-
6
- class Reline::ANSI
7
- CAPNAME_KEY_BINDINGS = {
8
- 'khome' => :ed_move_to_beg,
9
- 'kend' => :ed_move_to_end,
10
- 'kdch1' => :key_delete,
11
- 'kpp' => :ed_search_prev_history,
12
- 'knp' => :ed_search_next_history,
13
- 'kcuu1' => :ed_prev_history,
14
- 'kcud1' => :ed_next_history,
15
- 'kcuf1' => :ed_next_char,
16
- 'kcub1' => :ed_prev_char,
17
- 'cuu' => :ed_prev_history,
18
- 'cud' => :ed_next_history,
19
- 'cuf' => :ed_next_char,
20
- 'cub' => :ed_prev_char,
21
- }
22
-
23
- if Reline::Terminfo.enabled?
24
- Reline::Terminfo.setupterm(0, 2)
25
- end
26
-
27
- def self.encoding
28
- Encoding.default_external
29
- end
30
-
31
- def self.win?
32
- false
33
- end
34
-
35
- def self.set_default_key_bindings(config, allow_terminfo: true)
36
- if allow_terminfo && Reline::Terminfo.enabled?
37
- set_default_key_bindings_terminfo(config)
38
- else
39
- set_default_key_bindings_comprehensive_list(config)
40
- end
41
- {
42
- # extended entries of terminfo
43
- [27, 91, 49, 59, 53, 67] => :em_next_word, # Ctrl+→, extended entry
44
- [27, 91, 49, 59, 53, 68] => :ed_prev_word, # Ctrl+←, extended entry
45
- [27, 91, 49, 59, 51, 67] => :em_next_word, # Meta+→, extended entry
46
- [27, 91, 49, 59, 51, 68] => :ed_prev_word, # Meta+←, extended entry
47
- }.each_pair do |key, func|
48
- config.add_default_key_binding_by_keymap(:emacs, key, func)
49
- config.add_default_key_binding_by_keymap(:vi_insert, key, func)
50
- config.add_default_key_binding_by_keymap(:vi_command, key, func)
51
- end
52
- {
53
- [27, 91, 90] => :completion_journey_up, # S-Tab
54
- }.each_pair do |key, func|
55
- config.add_default_key_binding_by_keymap(:emacs, key, func)
56
- config.add_default_key_binding_by_keymap(:vi_insert, key, func)
57
- end
58
- {
59
- # default bindings
60
- [27, 32] => :em_set_mark, # M-<space>
61
- [24, 24] => :em_exchange_mark, # C-x C-x
62
- }.each_pair do |key, func|
63
- config.add_default_key_binding_by_keymap(:emacs, key, func)
64
- end
65
- end
66
-
67
- def self.set_default_key_bindings_terminfo(config)
68
- key_bindings = CAPNAME_KEY_BINDINGS.map do |capname, key_binding|
69
- begin
70
- key_code = Reline::Terminfo.tigetstr(capname)
71
- case capname
72
- # Escape sequences that omit the move distance and are set to defaults
73
- # value 1 may be sometimes sent by pressing the arrow-key.
74
- when 'cuu', 'cud', 'cuf', 'cub'
75
- [ key_code.sub(/%p1%d/, '').bytes, key_binding ]
76
- else
77
- [ key_code.bytes, key_binding ]
78
- end
79
- rescue Reline::Terminfo::TerminfoError
80
- # capname is undefined
81
- end
82
- end.compact.to_h
83
-
84
- key_bindings.each_pair do |key, func|
85
- config.add_default_key_binding_by_keymap(:emacs, key, func)
86
- config.add_default_key_binding_by_keymap(:vi_insert, key, func)
87
- config.add_default_key_binding_by_keymap(:vi_command, key, func)
88
- end
89
- end
90
-
91
- def self.set_default_key_bindings_comprehensive_list(config)
92
- {
93
- # Console (80x25)
94
- [27, 91, 49, 126] => :ed_move_to_beg, # Home
95
- [27, 91, 52, 126] => :ed_move_to_end, # End
96
- [27, 91, 51, 126] => :key_delete, # Del
97
- [27, 91, 65] => :ed_prev_history, # ↑
98
- [27, 91, 66] => :ed_next_history, # ↓
99
- [27, 91, 67] => :ed_next_char, # →
100
- [27, 91, 68] => :ed_prev_char, # ←
101
-
102
- # KDE
103
- [27, 91, 72] => :ed_move_to_beg, # Home
104
- [27, 91, 70] => :ed_move_to_end, # End
105
- # Del is 0x08
106
- [27, 71, 65] => :ed_prev_history, # ↑
107
- [27, 71, 66] => :ed_next_history, # ↓
108
- [27, 71, 67] => :ed_next_char, # →
109
- [27, 71, 68] => :ed_prev_char, # ←
110
-
111
- # urxvt / exoterm
112
- [27, 91, 55, 126] => :ed_move_to_beg, # Home
113
- [27, 91, 56, 126] => :ed_move_to_end, # End
114
-
115
- # GNOME
116
- [27, 79, 72] => :ed_move_to_beg, # Home
117
- [27, 79, 70] => :ed_move_to_end, # End
118
- # Del is 0x08
119
- # Arrow keys are the same of KDE
120
-
121
- # iTerm2
122
- [27, 27, 91, 67] => :em_next_word, # Option+→, extended entry
123
- [27, 27, 91, 68] => :ed_prev_word, # Option+←, extended entry
124
- [195, 166] => :em_next_word, # Option+f
125
- [195, 162] => :ed_prev_word, # Option+b
126
-
127
- [27, 79, 65] => :ed_prev_history, # ↑
128
- [27, 79, 66] => :ed_next_history, # ↓
129
- [27, 79, 67] => :ed_next_char, # →
130
- [27, 79, 68] => :ed_prev_char, # ←
131
- }.each_pair do |key, func|
132
- config.add_default_key_binding_by_keymap(:emacs, key, func)
133
- config.add_default_key_binding_by_keymap(:vi_insert, key, func)
134
- config.add_default_key_binding_by_keymap(:vi_command, key, func)
135
- end
136
- end
137
-
138
- @@input = STDIN
139
- def self.input=(val)
140
- @@input = val
141
- end
142
-
143
- @@output = STDOUT
144
- def self.output=(val)
145
- @@output = val
146
- end
147
-
148
- def self.with_raw_input
149
- @@input.raw { yield }
150
- end
151
-
152
- @@buf = []
153
- def self.inner_getc
154
- unless @@buf.empty?
155
- return @@buf.shift
156
- end
157
- until c = @@input.raw(intr: true) { @@input.wait_readable(0.1) && @@input.getbyte }
158
- Reline.core.line_editor.resize
159
- end
160
- (c == 0x16 && @@input.raw(min: 0, time: 0, &:getbyte)) || c
161
- rescue Errno::EIO
162
- # Maybe the I/O has been closed.
163
- nil
164
- rescue Errno::ENOTTY
165
- nil
166
- end
167
-
168
- @@in_bracketed_paste_mode = false
169
- START_BRACKETED_PASTE = String.new("\e[200~,", encoding: Encoding::ASCII_8BIT)
170
- END_BRACKETED_PASTE = String.new("\e[200~.", encoding: Encoding::ASCII_8BIT)
171
- def self.getc_with_bracketed_paste
172
- buffer = String.new(encoding: Encoding::ASCII_8BIT)
173
- buffer << inner_getc
174
- while START_BRACKETED_PASTE.start_with?(buffer) or END_BRACKETED_PASTE.start_with?(buffer) do
175
- if START_BRACKETED_PASTE == buffer
176
- @@in_bracketed_paste_mode = true
177
- return inner_getc
178
- elsif END_BRACKETED_PASTE == buffer
179
- @@in_bracketed_paste_mode = false
180
- ungetc(-1)
181
- return inner_getc
182
- end
183
- begin
184
- succ_c = nil
185
- Timeout.timeout(Reline.core.config.keyseq_timeout * 100) {
186
- succ_c = inner_getc
187
- }
188
- rescue Timeout::Error
189
- break
190
- else
191
- buffer << succ_c
192
- end
193
- end
194
- buffer.bytes.reverse_each do |ch|
195
- ungetc ch
196
- end
197
- inner_getc
198
- end
199
-
200
- def self.getc
201
- if Reline.core.config.enable_bracketed_paste
202
- getc_with_bracketed_paste
203
- else
204
- inner_getc
205
- end
206
- end
207
-
208
- def self.in_pasting?
209
- @@in_bracketed_paste_mode or (not Reline::IOGate.empty_buffer?)
210
- end
211
-
212
- def self.empty_buffer?
213
- unless @@buf.empty?
214
- return false
215
- end
216
- !@@input.wait_readable(0)
217
- end
218
-
219
- def self.ungetc(c)
220
- @@buf.unshift(c)
221
- end
222
-
223
- def self.retrieve_keybuffer
224
- begin
225
- return unless @@input.wait_readable(0.001)
226
- str = @@input.read_nonblock(1024)
227
- str.bytes.each do |c|
228
- @@buf.push(c)
229
- end
230
- rescue EOFError
231
- end
232
- end
233
-
234
- def self.get_screen_size
235
- s = @@input.winsize
236
- return s if s[0] > 0 && s[1] > 0
237
- s = [ENV["LINES"].to_i, ENV["COLUMNS"].to_i]
238
- return s if s[0] > 0 && s[1] > 0
239
- [24, 80]
240
- rescue Errno::ENOTTY
241
- [24, 80]
242
- end
243
-
244
- def self.set_screen_size(rows, columns)
245
- @@input.winsize = [rows, columns]
246
- self
247
- rescue Errno::ENOTTY
248
- self
249
- end
250
-
251
- def self.cursor_pos
252
- begin
253
- res = +''
254
- m = nil
255
- @@input.raw do |stdin|
256
- @@output << "\e[6n"
257
- @@output.flush
258
- loop do
259
- c = stdin.getc
260
- next if c.nil?
261
- res << c
262
- m = res.match(/\e\[(?<row>\d+);(?<column>\d+)R/)
263
- break if m
264
- end
265
- (m.pre_match + m.post_match).chars.reverse_each do |ch|
266
- stdin.ungetc ch
267
- end
268
- end
269
- column = m[:column].to_i - 1
270
- row = m[:row].to_i - 1
271
- rescue Errno::ENOTTY
272
- begin
273
- buf = @@output.pread(@@output.pos, 0)
274
- row = buf.count("\n")
275
- column = buf.rindex("\n") ? (buf.size - buf.rindex("\n")) - 1 : 0
276
- rescue Errno::ESPIPE
277
- # Just returns column 1 for ambiguous width because this I/O is not
278
- # tty and can't seek.
279
- row = 0
280
- column = 1
281
- end
282
- end
283
- Reline::CursorPos.new(column, row)
284
- end
285
-
286
- def self.move_cursor_column(x)
287
- @@output.write "\e[#{x + 1}G"
288
- end
289
-
290
- def self.move_cursor_up(x)
291
- if x > 0
292
- @@output.write "\e[#{x}A"
293
- elsif x < 0
294
- move_cursor_down(-x)
295
- end
296
- end
297
-
298
- def self.move_cursor_down(x)
299
- if x > 0
300
- @@output.write "\e[#{x}B"
301
- elsif x < 0
302
- move_cursor_up(-x)
303
- end
304
- end
305
-
306
- def self.hide_cursor
307
- if Reline::Terminfo.enabled?
308
- begin
309
- @@output.write Reline::Terminfo.tigetstr('civis')
310
- rescue Reline::Terminfo::TerminfoError
311
- # civis is undefined
312
- end
313
- else
314
- # ignored
315
- end
316
- end
317
-
318
- def self.show_cursor
319
- if Reline::Terminfo.enabled?
320
- begin
321
- @@output.write Reline::Terminfo.tigetstr('cnorm')
322
- rescue Reline::Terminfo::TerminfoError
323
- # cnorm is undefined
324
- end
325
- else
326
- # ignored
327
- end
328
- end
329
-
330
- def self.erase_after_cursor
331
- @@output.write "\e[K"
332
- end
333
-
334
- def self.scroll_down(x)
335
- return if x.zero?
336
- @@output.write "\e[#{x}S"
337
- end
338
-
339
- def self.clear_screen
340
- @@output.write "\e[2J"
341
- @@output.write "\e[1;1H"
342
- end
343
-
344
- @@old_winch_handler = nil
345
- def self.set_winch_handler(&handler)
346
- @@old_winch_handler = Signal.trap('WINCH', &handler)
347
- end
348
-
349
- def self.prep
350
- retrieve_keybuffer
351
- nil
352
- end
353
-
354
- def self.deprep(otio)
355
- Signal.trap('WINCH', @@old_winch_handler) if @@old_winch_handler
356
- end
357
- end
@@ -1,113 +0,0 @@
1
- require 'timeout'
2
- require 'io/wait'
3
-
4
- class Reline::GeneralIO
5
- def self.reset(encoding: nil)
6
- @@pasting = false
7
- @@encoding = encoding
8
- end
9
-
10
- def self.encoding
11
- if defined?(@@encoding)
12
- @@encoding
13
- elsif RUBY_PLATFORM =~ /mswin|mingw/
14
- Encoding::UTF_8
15
- else
16
- Encoding::default_external
17
- end
18
- end
19
-
20
- def self.win?
21
- false
22
- end
23
-
24
- def self.set_default_key_bindings(_)
25
- end
26
-
27
- @@buf = []
28
- @@input = STDIN
29
-
30
- def self.input=(val)
31
- @@input = val
32
- end
33
-
34
- def self.with_raw_input
35
- yield
36
- end
37
-
38
- def self.getc
39
- unless @@buf.empty?
40
- return @@buf.shift
41
- end
42
- c = nil
43
- loop do
44
- result = @@input.wait_readable(0.1)
45
- next if result.nil?
46
- c = @@input.read(1)
47
- break
48
- end
49
- c&.ord
50
- end
51
-
52
- def self.ungetc(c)
53
- @@buf.unshift(c)
54
- end
55
-
56
- def self.get_screen_size
57
- [1, 1]
58
- end
59
-
60
- def self.cursor_pos
61
- Reline::CursorPos.new(1, 1)
62
- end
63
-
64
- def self.hide_cursor
65
- end
66
-
67
- def self.show_cursor
68
- end
69
-
70
- def self.move_cursor_column(val)
71
- end
72
-
73
- def self.move_cursor_up(val)
74
- end
75
-
76
- def self.move_cursor_down(val)
77
- end
78
-
79
- def self.erase_after_cursor
80
- end
81
-
82
- def self.scroll_down(val)
83
- end
84
-
85
- def self.clear_screen
86
- end
87
-
88
- def self.set_screen_size(rows, columns)
89
- end
90
-
91
- def self.set_winch_handler(&handler)
92
- end
93
-
94
- @@pasting = false
95
-
96
- def self.in_pasting?
97
- @@pasting
98
- end
99
-
100
- def self.start_pasting
101
- @@pasting = true
102
- end
103
-
104
- def self.finish_pasting
105
- @@pasting = false
106
- end
107
-
108
- def self.prep
109
- end
110
-
111
- def self.deprep(otio)
112
- end
113
- end
@@ -1,160 +0,0 @@
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
11
-
12
- module Reline::Terminfo
13
- extend Fiddle::Importer
14
-
15
- class TerminfoError < StandardError; end
16
-
17
- def self.curses_dl_files
18
- case RUBY_PLATFORM
19
- when /mingw/, /mswin/
20
- # aren't supported
21
- []
22
- when /cygwin/
23
- %w[cygncursesw-10.dll cygncurses-10.dll]
24
- when /darwin/
25
- %w[libncursesw.dylib libcursesw.dylib libncurses.dylib libcurses.dylib]
26
- else
27
- %w[libncursesw.so libcursesw.so libncurses.so libcurses.so]
28
- end
29
- end
30
-
31
- @curses_dl = false
32
- def self.curses_dl
33
- return @curses_dl unless @curses_dl == false
34
- if Fiddle.const_defined?(:TYPE_VARIADIC)
35
- curses_dl_files.each do |curses_name|
36
- result = Fiddle::Handle.new(curses_name)
37
- rescue Fiddle::DLError
38
- next
39
- else
40
- @curses_dl = result
41
- break
42
- end
43
- end
44
- @curses_dl = nil if @curses_dl == false
45
- @curses_dl
46
- end
47
- end if not Reline.const_defined?(:Terminfo) or not Reline::Terminfo.respond_to?(:curses_dl)
48
-
49
- module Reline::Terminfo
50
- dlload curses_dl
51
- #extern 'int setupterm(char *term, int fildes, int *errret)'
52
- @setupterm = Fiddle::Function.new(curses_dl['setupterm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
53
- #extern 'char *tigetstr(char *capname)'
54
- @tigetstr = Fiddle::Function.new(curses_dl['tigetstr'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP)
55
- begin
56
- #extern 'char *tiparm(const char *str, ...)'
57
- @tiparm = Fiddle::Function.new(curses_dl['tiparm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VARIADIC], Fiddle::TYPE_VOIDP)
58
- rescue Fiddle::DLError
59
- # OpenBSD lacks tiparm
60
- #extern 'char *tparm(const char *str, ...)'
61
- @tiparm = Fiddle::Function.new(curses_dl['tparm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VARIADIC], Fiddle::TYPE_VOIDP)
62
- end
63
- begin
64
- #extern 'int tigetflag(char *str)'
65
- @tigetflag = Fiddle::Function.new(curses_dl['tigetflag'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
66
- rescue Fiddle::DLError
67
- # OpenBSD lacks tigetflag
68
- #extern 'int tgetflag(char *str)'
69
- @tigetflag = Fiddle::Function.new(curses_dl['tgetflag'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
70
- end
71
- begin
72
- #extern 'int tigetnum(char *str)'
73
- @tigetnum = Fiddle::Function.new(curses_dl['tigetnum'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
74
- rescue Fiddle::DLError
75
- # OpenBSD lacks tigetnum
76
- #extern 'int tgetnum(char *str)'
77
- @tigetnum = Fiddle::Function.new(curses_dl['tgetnum'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
78
- end
79
-
80
- def self.setupterm(term, fildes)
81
- errret_int = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT)
82
- ret = @setupterm.(term, fildes, errret_int)
83
- errret = errret_int[0, Fiddle::SIZEOF_INT].unpack1('i')
84
- case ret
85
- when 0 # OK
86
- 0
87
- when -1 # ERR
88
- case errret
89
- when 1
90
- raise TerminfoError.new('The terminal is hardcopy, cannot be used for curses applications.')
91
- when 0
92
- raise TerminfoError.new('The terminal could not be found, or that it is a generic type, having too little information for curses applications to run.')
93
- when -1
94
- raise TerminfoError.new('The terminfo database could not be found.')
95
- else # unknown
96
- -1
97
- end
98
- else # unknown
99
- -2
100
- end
101
- end
102
-
103
- class StringWithTiparm < String
104
- def tiparm(*args) # for method chain
105
- Reline::Terminfo.tiparm(self, *args)
106
- end
107
- end
108
-
109
- def self.tigetstr(capname)
110
- raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String)
111
- capability = @tigetstr.(capname)
112
- case capability.to_i
113
- when 0, -1
114
- raise TerminfoError, "can't find capability: #{capname}"
115
- end
116
- StringWithTiparm.new(capability.to_s)
117
- end
118
-
119
- def self.tiparm(str, *args)
120
- new_args = []
121
- args.each do |a|
122
- new_args << Fiddle::TYPE_INT << a
123
- end
124
- @tiparm.(str, *new_args).to_s
125
- end
126
-
127
- def self.tigetflag(capname)
128
- raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String)
129
- flag = @tigetflag.(capname).to_i
130
- case flag
131
- when -1
132
- raise TerminfoError, "not boolean capability: #{capname}"
133
- when 0
134
- raise TerminfoError, "can't find capability: #{capname}"
135
- end
136
- flag
137
- end
138
-
139
- def self.tigetnum(capname)
140
- raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String)
141
- num = @tigetnum.(capname).to_i
142
- case num
143
- when -2
144
- raise TerminfoError, "not numeric capability: #{capname}"
145
- when -1
146
- raise TerminfoError, "can't find capability: #{capname}"
147
- end
148
- num
149
- end
150
-
151
- def self.enabled?
152
- true
153
- end
154
- end if Reline::Terminfo.curses_dl
155
-
156
- module Reline::Terminfo
157
- def self.enabled?
158
- false
159
- end
160
- end unless Reline::Terminfo.curses_dl