reline 0.2.8.pre.4 → 0.2.8.pre.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -101,9 +101,9 @@ class Reline::Unicode
101
101
 
102
102
  def self.get_mbchar_width(mbchar)
103
103
  ord = mbchar.ord
104
- if (0x00 <= ord and ord <= 0x1F)
104
+ if (0x00 <= ord and ord <= 0x1F) # in EscapedPairs
105
105
  return 2
106
- elsif (0x20 <= ord and ord <= 0x7E)
106
+ elsif (0x20 <= ord and ord <= 0x7E) # printable ASCII chars
107
107
  return 1
108
108
  end
109
109
  m = mbchar.encode(Encoding::UTF_8).match(MBCharWidthRE)
@@ -185,10 +185,10 @@ class Reline::Unicode
185
185
  [lines, height]
186
186
  end
187
187
 
188
- # Take a chunk of a String with escape sequences.
189
- def self.take_range(str, col, length, encoding = str.encoding)
188
+ # Take a chunk of a String cut by width with escape sequences.
189
+ def self.take_range(str, start_col, max_width, encoding = str.encoding)
190
190
  chunk = String.new(encoding: encoding)
191
- width = 0
191
+ total_width = 0
192
192
  rest = str.encode(Encoding::UTF_8)
193
193
  in_zero_width = false
194
194
  rest.scan(WIDTH_SCANNER) do |gc|
@@ -206,9 +206,10 @@ class Reline::Unicode
206
206
  if in_zero_width
207
207
  chunk << gc
208
208
  else
209
- width = get_mbchar_width(gc)
210
- break if (width + length) <= col
211
- chunk << gc if col <= width
209
+ mbchar_width = get_mbchar_width(gc)
210
+ total_width += mbchar_width
211
+ break if (start_col + max_width) < total_width
212
+ chunk << gc if start_col < total_width
212
213
  end
213
214
  end
214
215
  end
@@ -1,3 +1,3 @@
1
1
  module Reline
2
- VERSION = '0.2.8.pre.4'
2
+ VERSION = '0.2.8.pre.8'
3
3
  end
@@ -226,6 +226,8 @@ class Reline::Windows
226
226
  # no char, only control keys
227
227
  return if key.char_code == 0 and key.control_keys.any?
228
228
 
229
+ @@output_buf.push("\e".ord) if key.control_keys.include?(:ALT)
230
+
229
231
  @@output_buf.concat(key.char.bytes)
230
232
  end
231
233
 
data/lib/reline.rb CHANGED
@@ -16,9 +16,28 @@ module Reline
16
16
 
17
17
  class ConfigEncodingConversionError < StandardError; end
18
18
 
19
- Key = Struct.new('Key', :char, :combined_char, :with_meta)
19
+ Key = Struct.new('Key', :char, :combined_char, :with_meta) do
20
+ def match?(key)
21
+ if key.instance_of?(Reline::Key)
22
+ (key.char.nil? or char.nil? or char == key.char) and
23
+ (key.combined_char.nil? or combined_char.nil? or combined_char == key.combined_char) and
24
+ (key.with_meta.nil? or with_meta.nil? or with_meta == key.with_meta)
25
+ elsif key.is_a?(Integer) or key.is_a?(Symbol)
26
+ if not combined_char.nil? and combined_char == key
27
+ true
28
+ elsif combined_char.nil? and not char.nil? and char == key
29
+ true
30
+ else
31
+ false
32
+ end
33
+ else
34
+ false
35
+ end
36
+ end
37
+ alias_method :==, :match?
38
+ end
20
39
  CursorPos = Struct.new(:x, :y)
21
- DialogRenderInfo = Struct.new(:pos, :contents, :pointer, :bg_color, :height, keyword_init: true)
40
+ DialogRenderInfo = Struct.new(:pos, :contents, :pointer, :bg_color, :width, :height, :scrollbar, keyword_init: true)
22
41
 
23
42
  class Core
24
43
  ATTR_READER_NAMES = %i(
@@ -194,8 +213,8 @@ module Reline
194
213
  # Auto complete starts only when edited
195
214
  return nil
196
215
  end
197
- pre, target, post= retrieve_completion_block(true)
198
- if target.nil? or target.empty?# or target.size <= 3
216
+ pre, target, post = retrieve_completion_block(true)
217
+ if target.nil? or target.empty? or target.size <= 3
199
218
  return nil
200
219
  end
201
220
  if completion_journey_data and completion_journey_data.list
@@ -206,7 +225,7 @@ module Reline
206
225
  result = call_completion_proc_with_checking_args(pre, target, post)
207
226
  pointer = nil
208
227
  end
209
- if result and result.size == 1 and result[0] == target
228
+ if result and result.size == 1 and result[0] == target and pointer != 0
210
229
  result = nil
211
230
  end
212
231
  target_width = Reline::Unicode.calculate_width(target)
@@ -222,7 +241,7 @@ module Reline
222
241
  context.clear
223
242
  context.push(cursor_pos_to_render, result, pointer, dialog)
224
243
  end
225
- DialogRenderInfo.new(pos: cursor_pos_to_render, contents: result, pointer: pointer, height: 15)
244
+ DialogRenderInfo.new(pos: cursor_pos_to_render, contents: result, pointer: pointer, scrollbar: true, height: 15)
226
245
  }
227
246
  Reline::DEFAULT_DIALOG_CONTEXT = Array.new
228
247
 
@@ -362,25 +381,9 @@ module Reline
362
381
  break
363
382
  when :matching
364
383
  if buffer.size == 1
365
- begin
366
- succ_c = nil
367
- Timeout.timeout(keyseq_timeout / 1000.0) {
368
- succ_c = Reline::IOGate.getc
369
- }
370
- rescue Timeout::Error # cancel matching only when first byte
371
- block.([Reline::Key.new(c, c, false)])
372
- break
373
- else
374
- if key_stroke.match_status(buffer.dup.push(succ_c)) == :unmatched
375
- if c == "\e".ord
376
- block.([Reline::Key.new(succ_c, succ_c | 0b10000000, true)])
377
- else
378
- block.([Reline::Key.new(c, c, false), Reline::Key.new(succ_c, succ_c, false)])
379
- end
380
- break
381
- else
382
- Reline::IOGate.ungetc(succ_c)
383
- end
384
+ case read_2nd_character_of_key_sequence(keyseq_timeout, buffer, c, block)
385
+ when :break then break
386
+ when :next then next
384
387
  end
385
388
  end
386
389
  when :unmatched
@@ -397,6 +400,38 @@ module Reline
397
400
  end
398
401
  end
399
402
 
403
+ private def read_2nd_character_of_key_sequence(keyseq_timeout, buffer, c, block)
404
+ begin
405
+ succ_c = nil
406
+ Timeout.timeout(keyseq_timeout / 1000.0) {
407
+ succ_c = Reline::IOGate.getc
408
+ }
409
+ rescue Timeout::Error # cancel matching only when first byte
410
+ block.([Reline::Key.new(c, c, false)])
411
+ return :break
412
+ else
413
+ case key_stroke.match_status(buffer.dup.push(succ_c))
414
+ when :unmatched
415
+ if c == "\e".ord
416
+ block.([Reline::Key.new(succ_c, succ_c | 0b10000000, true)])
417
+ else
418
+ block.([Reline::Key.new(c, c, false), Reline::Key.new(succ_c, succ_c, false)])
419
+ end
420
+ return :break
421
+ when :matching
422
+ Reline::IOGate.ungetc(succ_c)
423
+ return :next
424
+ when :matched
425
+ buffer << succ_c
426
+ expanded = key_stroke.expand(buffer).map{ |expanded_c|
427
+ Reline::Key.new(expanded_c, expanded_c, false)
428
+ }
429
+ block.(expanded)
430
+ return :break
431
+ end
432
+ end
433
+ end
434
+
400
435
  private def read_escaped_key(keyseq_timeout, c, block)
401
436
  begin
402
437
  escaped_c = nil
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.8.pre.4
4
+ version: 0.2.8.pre.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - aycabta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-30 00:00:00.000000000 Z
11
+ date: 2021-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: io-console
@@ -47,6 +47,7 @@ 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
50
51
  - lib/reline/sibori.rb
51
52
  - lib/reline/terminfo.rb
52
53
  - lib/reline/unicode.rb