reline 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8198104fe3ad27c73acaaffc9c8b1c8b9a5c50069a26a71cd940dd2b5dc13afc
4
- data.tar.gz: 171ff8cdf2ae4aebaf4cfb6cea131e2d90e5eb56a2c09dbe19acfa8765522ffc
3
+ metadata.gz: b0fe224245c6f66bdfa42b7fd6b0dc4c30f9645f0c1498fd7780ff17db642eec
4
+ data.tar.gz: af1b5a53e09f4b2c60ae20e153a4b3043ea3a19a38c58be697067c58f63feec7
5
5
  SHA512:
6
- metadata.gz: e3411f0086a0445d2d805fc46528a86b947c58b8e61a664dc08b437596702ef1f360cd7e85a1dab64bf159f6f39691b9d5110f951bd5376f4fce0439e9557532
7
- data.tar.gz: 968ac4a376ba350590fd37d05525a5a2e5e26c44e159b5fd9b0c7400e260850e91088357c007651373d44b7b7d37c699852014d07258428be86081581baf0229
6
+ metadata.gz: cb456e06f2cef817fe3ae8fa27e9666587f2b3175cdbc97714ab3638d5b11bf606595d772c4e100fc21d9f50ed6e55fb6b833c28bad6b4ae3c8838d2418e75f5
7
+ data.tar.gz: 6f3eb2f3feee78d7b4754c069a7d6c0d5d29af100bcb493bab2696c9b610c86de4fb3b201d624b6d00f218f1257a526d0c29bf95c79a1ed3daf117f0c95a2768
data/lib/reline/ansi.rb CHANGED
@@ -7,6 +7,9 @@ class Reline::ANSI
7
7
  CAPNAME_KEY_BINDINGS = {
8
8
  'khome' => :ed_move_to_beg,
9
9
  'kend' => :ed_move_to_end,
10
+ 'kdch1' => :key_delete,
11
+ 'kpp' => :ed_search_prev_history,
12
+ 'knp' => :ed_search_next_history,
10
13
  'kcuu1' => :ed_prev_history,
11
14
  'kcud1' => :ed_next_history,
12
15
  'kcuf1' => :ed_next_char,
@@ -29,8 +32,8 @@ class Reline::ANSI
29
32
  false
30
33
  end
31
34
 
32
- def self.set_default_key_bindings(config)
33
- if Reline::Terminfo.enabled?
35
+ def self.set_default_key_bindings(config, allow_terminfo: true)
36
+ if allow_terminfo && Reline::Terminfo.enabled?
34
37
  set_default_key_bindings_terminfo(config)
35
38
  else
36
39
  set_default_key_bindings_comprehensive_list(config)
@@ -142,6 +145,10 @@ class Reline::ANSI
142
145
  @@output = val
143
146
  end
144
147
 
148
+ def self.with_raw_input
149
+ @@input.raw { yield }
150
+ end
151
+
145
152
  @@buf = []
146
153
  def self.inner_getc
147
154
  unless @@buf.empty?
data/lib/reline/config.rb CHANGED
@@ -93,7 +93,7 @@ class Reline::Config
93
93
  end
94
94
 
95
95
  def editing_mode_is?(*val)
96
- (val.respond_to?(:any?) ? val : [val]).any?(@editing_mode_label)
96
+ val.any?(@editing_mode_label)
97
97
  end
98
98
 
99
99
  def keymap
@@ -31,6 +31,10 @@ class Reline::GeneralIO
31
31
  @@input = val
32
32
  end
33
33
 
34
+ def self.with_raw_input
35
+ yield
36
+ end
37
+
34
38
  def self.getc
35
39
  unless @@buf.empty?
36
40
  return @@buf.shift
@@ -52,6 +52,7 @@ class Reline::LineEditor
52
52
  MenuInfo = Struct.new('MenuInfo', :target, :list)
53
53
 
54
54
  PROMPT_LIST_CACHE_TIMEOUT = 0.5
55
+ MINIMUM_SCROLLBAR_HEIGHT = 1
55
56
 
56
57
  def initialize(config, encoding)
57
58
  @config = config
@@ -449,14 +450,10 @@ class Reline::LineEditor
449
450
  Reline::IOGate.move_cursor_up(@first_line_started_from + @started_from - @scroll_partial_screen)
450
451
  Reline::IOGate.move_cursor_column(0)
451
452
  @scroll_partial_screen = nil
452
- prompt, prompt_width, prompt_list = check_multiline_prompt(whole_lines)
453
- if @previous_line_index
454
- new_lines = whole_lines(index: @previous_line_index, line: @line)
455
- else
456
- new_lines = whole_lines
457
- end
453
+ new_lines = whole_lines
454
+ prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
458
455
  modify_lines(new_lines).each_with_index do |line, index|
459
- @output.write "#{prompt_list ? prompt_list[index] : prompt}#{line}\n"
456
+ @output.write "#{prompt_list ? prompt_list[index] : prompt}#{line}\r\n"
460
457
  Reline::IOGate.erase_after_cursor
461
458
  end
462
459
  @output.flush
@@ -467,7 +464,7 @@ class Reline::LineEditor
467
464
  rendered = false
468
465
  if @add_newline_to_end_of_buffer
469
466
  clear_dialog_with_content
470
- rerender_added_newline(prompt, prompt_width)
467
+ rerender_added_newline(prompt, prompt_width, prompt_list)
471
468
  @add_newline_to_end_of_buffer = false
472
469
  else
473
470
  if @just_cursor_moving and not @rerender_all
@@ -490,11 +487,7 @@ class Reline::LineEditor
490
487
  if @is_multiline
491
488
  if finished?
492
489
  # Always rerender on finish because output_modifier_proc may return a different output.
493
- if @previous_line_index
494
- new_lines = whole_lines(index: @previous_line_index, line: @line)
495
- else
496
- new_lines = whole_lines
497
- end
490
+ new_lines = whole_lines
498
491
  line = modify_lines(new_lines)[@line_index]
499
492
  clear_dialog
500
493
  prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
@@ -671,8 +664,10 @@ class Reline::LineEditor
671
664
  dialog.set_cursor_pos(cursor_column, @first_line_started_from + @started_from)
672
665
  dialog_render_info = dialog.call(@last_key)
673
666
  if dialog_render_info.nil? or dialog_render_info.contents.nil? or dialog_render_info.contents.empty?
667
+ lines = whole_lines
674
668
  dialog.lines_backup = {
675
- lines: modify_lines(whole_lines),
669
+ unmodified_lines: lines,
670
+ lines: modify_lines(lines),
676
671
  line_index: @line_index,
677
672
  first_line_started_from: @first_line_started_from,
678
673
  started_from: @started_from,
@@ -703,17 +698,17 @@ class Reline::LineEditor
703
698
  dialog.scroll_top = dialog.pointer
704
699
  end
705
700
  pointer = dialog.pointer - dialog.scroll_top
701
+ else
702
+ dialog.scroll_top = 0
706
703
  end
707
704
  dialog.contents = dialog.contents[dialog.scroll_top, height]
708
705
  end
709
- if dialog.contents and dialog.scroll_top >= dialog.contents.size
710
- dialog.scroll_top = dialog.contents.size - height
711
- end
712
706
  if dialog_render_info.scrollbar and dialog_render_info.contents.size > height
713
707
  bar_max_height = height * 2
714
708
  moving_distance = (dialog_render_info.contents.size - height) * 2
715
709
  position_ratio = dialog.scroll_top.zero? ? 0.0 : ((dialog.scroll_top * 2).to_f / moving_distance)
716
710
  bar_height = (bar_max_height * ((dialog.contents.size * 2).to_f / (dialog_render_info.contents.size * 2))).floor.to_i
711
+ bar_height = MINIMUM_SCROLLBAR_HEIGHT if bar_height < MINIMUM_SCROLLBAR_HEIGHT
717
712
  dialog.scrollbar_pos = ((bar_max_height - bar_height) * position_ratio).floor.to_i
718
713
  else
719
714
  dialog.scrollbar_pos = nil
@@ -755,7 +750,7 @@ class Reline::LineEditor
755
750
  str_width = dialog.width - (dialog.scrollbar_pos.nil? ? 0 : @block_elem_width)
756
751
  str = padding_space_with_escape_sequences(Reline::Unicode.take_range(item, 0, str_width), str_width)
757
752
  @output.write "\e[#{bg_color}m\e[#{fg_color}m#{str}"
758
- if dialog.scrollbar_pos and (dialog.scrollbar_pos != old_dialog.scrollbar_pos or dialog.column != old_dialog.column)
753
+ if dialog.scrollbar_pos
759
754
  @output.write "\e[37m"
760
755
  if dialog.scrollbar_pos <= (i * 2) and (i * 2 + 1) < (dialog.scrollbar_pos + bar_height)
761
756
  @output.write @full_block
@@ -774,8 +769,10 @@ class Reline::LineEditor
774
769
  Reline::IOGate.move_cursor_column(cursor_column)
775
770
  move_cursor_up(dialog.vertical_offset + dialog.contents.size - 1)
776
771
  Reline::IOGate.show_cursor
772
+ lines = whole_lines
777
773
  dialog.lines_backup = {
778
- lines: modify_lines(whole_lines),
774
+ unmodified_lines: lines,
775
+ lines: modify_lines(lines),
779
776
  line_index: @line_index,
780
777
  first_line_started_from: @first_line_started_from,
781
778
  started_from: @started_from,
@@ -785,7 +782,7 @@ class Reline::LineEditor
785
782
 
786
783
  private def reset_dialog(dialog, old_dialog)
787
784
  return if dialog.lines_backup.nil? or old_dialog.contents.nil?
788
- prompt, prompt_width, prompt_list = check_multiline_prompt(dialog.lines_backup[:lines])
785
+ prompt, prompt_width, prompt_list = check_multiline_prompt(dialog.lines_backup[:unmodified_lines])
789
786
  visual_lines = []
790
787
  visual_start = nil
791
788
  dialog.lines_backup[:lines].each_with_index { |l, i|
@@ -896,7 +893,7 @@ class Reline::LineEditor
896
893
  private def clear_each_dialog(dialog)
897
894
  dialog.trap_key = nil
898
895
  return unless dialog.contents
899
- prompt, prompt_width, prompt_list = check_multiline_prompt(dialog.lines_backup[:lines])
896
+ prompt, prompt_width, prompt_list = check_multiline_prompt(dialog.lines_backup[:unmodified_lines])
900
897
  visual_lines = []
901
898
  visual_lines_under_dialog = []
902
899
  visual_start = nil
@@ -964,11 +961,20 @@ class Reline::LineEditor
964
961
  end
965
962
  end
966
963
 
967
- private def rerender_added_newline(prompt, prompt_width)
968
- scroll_down(1)
964
+ private def rerender_added_newline(prompt, prompt_width, prompt_list)
969
965
  @buffer_of_lines[@previous_line_index] = @line
970
966
  @line = @buffer_of_lines[@line_index]
971
- unless @in_pasting
967
+ @previous_line_index = nil
968
+ if @in_pasting
969
+ scroll_down(1)
970
+ else
971
+ lines = whole_lines
972
+ prev_line_prompt = @prompt_proc ? prompt_list[@line_index - 1] : prompt
973
+ prev_line_prompt_width = @prompt_proc ? calculate_width(prev_line_prompt, true) : prompt_width
974
+ prev_line = modify_lines(lines)[@line_index - 1]
975
+ move_cursor_up(@started_from)
976
+ render_partial(prev_line_prompt, prev_line_prompt_width, prev_line, @first_line_started_from + @started_from, with_control: false)
977
+ scroll_down(1)
972
978
  render_partial(prompt, prompt_width, @line, @first_line_started_from + @started_from + 1, with_control: false)
973
979
  end
974
980
  @cursor = @cursor_max = calculate_width(@line)
@@ -977,7 +983,6 @@ class Reline::LineEditor
977
983
  @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max)
978
984
  @first_line_started_from += @started_from + 1
979
985
  @started_from = calculate_height_by_width(prompt_width + @cursor) - 1
980
- @previous_line_index = nil
981
986
  end
982
987
 
983
988
  def just_move_cursor
@@ -990,22 +995,18 @@ class Reline::LineEditor
990
995
  calculate_height_by_lines(@buffer_of_lines[0..(@line_index - 1)], prompt_list || prompt)
991
996
  end
992
997
  first_line_diff = new_first_line_started_from - @first_line_started_from
993
- new_cursor, new_cursor_max, new_started_from, new_byte_pointer = calculate_nearest_cursor(@buffer_of_lines[@line_index], @cursor, @started_from, @byte_pointer, false)
994
- new_started_from = calculate_height_by_width(prompt_width + new_cursor) - 1
998
+ @cursor, @cursor_max, _, @byte_pointer = calculate_nearest_cursor(@buffer_of_lines[@line_index], @cursor, @started_from, @byte_pointer, false)
999
+ new_started_from = calculate_height_by_width(prompt_width + @cursor) - 1
995
1000
  calculate_scroll_partial_screen(@highest_in_all, new_first_line_started_from + new_started_from)
996
1001
  @previous_line_index = nil
1002
+ @line = @buffer_of_lines[@line_index]
997
1003
  if @rerender_all
998
- @line = @buffer_of_lines[@line_index]
999
1004
  rerender_all_lines
1000
1005
  @rerender_all = false
1001
1006
  true
1002
1007
  else
1003
- @line = @buffer_of_lines[@line_index]
1004
1008
  @first_line_started_from = new_first_line_started_from
1005
1009
  @started_from = new_started_from
1006
- @cursor = new_cursor
1007
- @cursor_max = new_cursor_max
1008
- @byte_pointer = new_byte_pointer
1009
1010
  move_cursor_down(first_line_diff + @started_from)
1010
1011
  Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
1011
1012
  false
@@ -1013,11 +1014,7 @@ class Reline::LineEditor
1013
1014
  end
1014
1015
 
1015
1016
  private def rerender_changed_current_line
1016
- if @previous_line_index
1017
- new_lines = whole_lines(index: @previous_line_index, line: @line)
1018
- else
1019
- new_lines = whole_lines
1020
- end
1017
+ new_lines = whole_lines
1021
1018
  prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
1022
1019
  all_height = calculate_height_by_lines(new_lines, prompt_list || prompt)
1023
1020
  diff = all_height - @highest_in_all
@@ -1371,8 +1368,8 @@ class Reline::LineEditor
1371
1368
  @completion_state = CompletionState::MENU
1372
1369
  end
1373
1370
  if not just_show_list and target < completed
1374
- @line = preposing + completed + completion_append_character.to_s + postposing
1375
- line_to_pointer = preposing + completed + completion_append_character.to_s
1371
+ @line = (preposing + completed + completion_append_character.to_s + postposing).split("\n")[@line_index] || String.new(encoding: @encoding)
1372
+ line_to_pointer = (preposing + completed + completion_append_character.to_s).split("\n").last || String.new(encoding: @encoding)
1376
1373
  @cursor_max = calculate_width(@line)
1377
1374
  @cursor = calculate_width(line_to_pointer)
1378
1375
  @byte_pointer = line_to_pointer.bytesize
@@ -1698,7 +1695,7 @@ class Reline::LineEditor
1698
1695
  return if not @check_new_auto_indent and @previous_line_index # move cursor up or down
1699
1696
  if @check_new_auto_indent and @previous_line_index and @previous_line_index > 0 and @line_index > @previous_line_index
1700
1697
  # Fix indent of a line when a newline is inserted to the next
1701
- new_lines = whole_lines(index: @previous_line_index, line: @line)
1698
+ new_lines = whole_lines
1702
1699
  new_indent = @auto_indent_proc.(new_lines[0..-3].push(''), @line_index - 1, 0, true)
1703
1700
  md = @line.match(/\A */)
1704
1701
  prev_indent = md[0].count(' ')
@@ -1713,23 +1710,20 @@ class Reline::LineEditor
1713
1710
  @line = ' ' * new_indent + @line.lstrip
1714
1711
  end
1715
1712
  end
1716
- if @previous_line_index
1717
- new_lines = whole_lines(index: @previous_line_index, line: @line)
1718
- else
1719
- new_lines = whole_lines
1720
- end
1713
+ new_lines = whole_lines
1721
1714
  new_indent = @auto_indent_proc.(new_lines, @line_index, @byte_pointer, @check_new_auto_indent)
1722
- new_indent = @cursor_max if new_indent&.> @cursor_max
1723
1715
  if new_indent&.>= 0
1724
1716
  md = new_lines[@line_index].match(/\A */)
1725
1717
  prev_indent = md[0].count(' ')
1726
1718
  if @check_new_auto_indent
1727
- @buffer_of_lines[@line_index] = ' ' * new_indent + @buffer_of_lines[@line_index].lstrip
1719
+ line = @buffer_of_lines[@line_index] = ' ' * new_indent + @buffer_of_lines[@line_index].lstrip
1728
1720
  @cursor = new_indent
1721
+ @cursor_max = calculate_width(line)
1729
1722
  @byte_pointer = new_indent
1730
1723
  else
1731
1724
  @line = ' ' * new_indent + @line.lstrip
1732
1725
  @cursor += new_indent - prev_indent
1726
+ @cursor_max = calculate_width(@line)
1733
1727
  @byte_pointer += new_indent - prev_indent
1734
1728
  end
1735
1729
  end
@@ -1803,11 +1797,7 @@ class Reline::LineEditor
1803
1797
  target = before
1804
1798
  end
1805
1799
  if @is_multiline
1806
- if @previous_line_index
1807
- lines = whole_lines(index: @previous_line_index, line: @line)
1808
- else
1809
- lines = whole_lines
1810
- end
1800
+ lines = whole_lines
1811
1801
  if @line_index > 0
1812
1802
  preposing = lines[0..(@line_index - 1)].join("\n") + "\n" + preposing
1813
1803
  end
@@ -1907,9 +1897,10 @@ class Reline::LineEditor
1907
1897
  @cursor_max = calculate_width(@line)
1908
1898
  end
1909
1899
 
1910
- def whole_lines(index: @line_index, line: @line)
1900
+ def whole_lines
1901
+ index = @previous_line_index || @line_index
1911
1902
  temp_lines = @buffer_of_lines.dup
1912
- temp_lines[index] = line
1903
+ temp_lines[index] = @line
1913
1904
  temp_lines
1914
1905
  end
1915
1906
 
@@ -1917,11 +1908,7 @@ class Reline::LineEditor
1917
1908
  if @buffer_of_lines.size == 1 and @line.nil?
1918
1909
  nil
1919
1910
  else
1920
- if @previous_line_index
1921
- whole_lines(index: @previous_line_index, line: @line).join("\n")
1922
- else
1923
- whole_lines.join("\n")
1924
- end
1911
+ whole_lines.join("\n")
1925
1912
  end
1926
1913
  end
1927
1914
 
@@ -1953,8 +1940,10 @@ class Reline::LineEditor
1953
1940
  end
1954
1941
 
1955
1942
  private def key_delete(key)
1956
- if @config.editing_mode_is?(:vi_insert, :emacs)
1943
+ if @config.editing_mode_is?(:vi_insert)
1957
1944
  ed_delete_next_char(key)
1945
+ elsif @config.editing_mode_is?(:emacs)
1946
+ em_delete(key)
1958
1947
  end
1959
1948
  end
1960
1949
 
@@ -2660,7 +2649,7 @@ class Reline::LineEditor
2660
2649
  alias_method :kill_whole_line, :em_kill_line
2661
2650
 
2662
2651
  private def em_delete(key)
2663
- if (not @is_multiline and @line.empty?) or (@is_multiline and @line.empty? and @buffer_of_lines.size == 1)
2652
+ if @line.empty? and (not @is_multiline or @buffer_of_lines.size == 1) and key == "\C-d".ord
2664
2653
  @line = nil
2665
2654
  if @buffer_of_lines.size > 1
2666
2655
  scroll_down(@highest_in_all - @first_line_started_from)
@@ -84,8 +84,13 @@ class Reline::Unicode::EastAsianWidth
84
84
  \u{17000}-\u{187F7}
85
85
  \u{18800}-\u{18CD5}
86
86
  \u{18D00}-\u{18D08}
87
- \u{1B000}-\u{1B11E}
87
+ \u{1AFF0}-\u{1AFF3}
88
+ \u{1AFF5}-\u{1AFFB}
89
+ \u{1AFFD}-\u{1AFFE}
90
+ \u{1B000}-\u{1B122}
91
+ \u{1B132}
88
92
  \u{1B150}-\u{1B152}
93
+ \u{1B155}
89
94
  \u{1B164}-\u{1B167}
90
95
  \u{1B170}-\u{1B2FB}
91
96
  \u{1F004}
@@ -119,21 +124,21 @@ class Reline::Unicode::EastAsianWidth
119
124
  \u{1F6CC}
120
125
  \u{1F6D0}-\u{1F6D2}
121
126
  \u{1F6D5}-\u{1F6D7}
127
+ \u{1F6DC}-\u{1F6DF}
122
128
  \u{1F6EB}-\u{1F6EC}
123
129
  \u{1F6F4}-\u{1F6FC}
124
130
  \u{1F7E0}-\u{1F7EB}
131
+ \u{1F7F0}
125
132
  \u{1F90C}-\u{1F93A}
126
133
  \u{1F93C}-\u{1F945}
127
- \u{1F947}-\u{1F978}
128
- \u{1F97A}-\u{1F9CB}
129
- \u{1F9CD}-\u{1F9FF}
130
- \u{1FA70}-\u{1FA74}
131
- \u{1FA78}-\u{1FA7A}
132
- \u{1FA80}-\u{1FA86}
133
- \u{1FA90}-\u{1FAA8}
134
- \u{1FAB0}-\u{1FAB6}
135
- \u{1FAC0}-\u{1FAC2}
136
- \u{1FAD0}-\u{1FAD6}
134
+ \u{1F947}-\u{1F9FF}
135
+ \u{1FA70}-\u{1FA7C}
136
+ \u{1FA80}-\u{1FA88}
137
+ \u{1FA90}-\u{1FABD}
138
+ \u{1FABF}-\u{1FAC5}
139
+ \u{1FACE}-\u{1FADB}
140
+ \u{1FAE0}-\u{1FAE8}
141
+ \u{1FAF0}-\u{1FAF8}
137
142
  \u{20000}-\u{2FFFD}
138
143
  \u{30000}-\u{3FFFD}
139
144
  ).join }]/
@@ -403,8 +408,7 @@ class Reline::Unicode::EastAsianWidth
403
408
  \u{0591}-\u{05C7}
404
409
  \u{05D0}-\u{05EA}
405
410
  \u{05EF}-\u{05F4}
406
- \u{0600}-\u{061C}
407
- \u{061E}-\u{070D}
411
+ \u{0600}-\u{070D}
408
412
  \u{070F}-\u{074A}
409
413
  \u{074D}-\u{07B1}
410
414
  \u{07C0}-\u{07FA}
@@ -413,9 +417,9 @@ class Reline::Unicode::EastAsianWidth
413
417
  \u{0840}-\u{085B}
414
418
  \u{085E}
415
419
  \u{0860}-\u{086A}
416
- \u{08A0}-\u{08B4}
417
- \u{08B6}-\u{08C7}
418
- \u{08D3}-\u{0983}
420
+ \u{0870}-\u{088E}
421
+ \u{0890}-\u{0891}
422
+ \u{0898}-\u{0983}
419
423
  \u{0985}-\u{098C}
420
424
  \u{098F}-\u{0990}
421
425
  \u{0993}-\u{09A8}
@@ -493,11 +497,12 @@ class Reline::Unicode::EastAsianWidth
493
497
  \u{0C0E}-\u{0C10}
494
498
  \u{0C12}-\u{0C28}
495
499
  \u{0C2A}-\u{0C39}
496
- \u{0C3D}-\u{0C44}
500
+ \u{0C3C}-\u{0C44}
497
501
  \u{0C46}-\u{0C48}
498
502
  \u{0C4A}-\u{0C4D}
499
503
  \u{0C55}-\u{0C56}
500
504
  \u{0C58}-\u{0C5A}
505
+ \u{0C5D}
501
506
  \u{0C60}-\u{0C63}
502
507
  \u{0C66}-\u{0C6F}
503
508
  \u{0C77}-\u{0C8C}
@@ -509,10 +514,10 @@ class Reline::Unicode::EastAsianWidth
509
514
  \u{0CC6}-\u{0CC8}
510
515
  \u{0CCA}-\u{0CCD}
511
516
  \u{0CD5}-\u{0CD6}
512
- \u{0CDE}
517
+ \u{0CDD}-\u{0CDE}
513
518
  \u{0CE0}-\u{0CE3}
514
519
  \u{0CE6}-\u{0CEF}
515
- \u{0CF1}-\u{0CF2}
520
+ \u{0CF1}-\u{0CF3}
516
521
  \u{0D00}-\u{0D0C}
517
522
  \u{0D0E}-\u{0D10}
518
523
  \u{0D12}-\u{0D44}
@@ -542,7 +547,7 @@ class Reline::Unicode::EastAsianWidth
542
547
  \u{0EA7}-\u{0EBD}
543
548
  \u{0EC0}-\u{0EC4}
544
549
  \u{0EC6}
545
- \u{0EC8}-\u{0ECD}
550
+ \u{0EC8}-\u{0ECE}
546
551
  \u{0ED0}-\u{0ED9}
547
552
  \u{0EDC}-\u{0EDF}
548
553
  \u{0F00}-\u{0F47}
@@ -577,9 +582,8 @@ class Reline::Unicode::EastAsianWidth
577
582
  \u{13F8}-\u{13FD}
578
583
  \u{1400}-\u{169C}
579
584
  \u{16A0}-\u{16F8}
580
- \u{1700}-\u{170C}
581
- \u{170E}-\u{1714}
582
- \u{1720}-\u{1736}
585
+ \u{1700}-\u{1715}
586
+ \u{171F}-\u{1736}
583
587
  \u{1740}-\u{1753}
584
588
  \u{1760}-\u{176C}
585
589
  \u{176E}-\u{1770}
@@ -587,8 +591,7 @@ class Reline::Unicode::EastAsianWidth
587
591
  \u{1780}-\u{17DD}
588
592
  \u{17E0}-\u{17E9}
589
593
  \u{17F0}-\u{17F9}
590
- \u{1800}-\u{180E}
591
- \u{1810}-\u{1819}
594
+ \u{1800}-\u{1819}
592
595
  \u{1820}-\u{1878}
593
596
  \u{1880}-\u{18AA}
594
597
  \u{18B0}-\u{18F5}
@@ -607,9 +610,9 @@ class Reline::Unicode::EastAsianWidth
607
610
  \u{1A7F}-\u{1A89}
608
611
  \u{1A90}-\u{1A99}
609
612
  \u{1AA0}-\u{1AAD}
610
- \u{1AB0}-\u{1AC0}
611
- \u{1B00}-\u{1B4B}
612
- \u{1B50}-\u{1B7C}
613
+ \u{1AB0}-\u{1ACE}
614
+ \u{1B00}-\u{1B4C}
615
+ \u{1B50}-\u{1B7E}
613
616
  \u{1B80}-\u{1BF3}
614
617
  \u{1BFC}-\u{1C37}
615
618
  \u{1C3B}-\u{1C49}
@@ -617,8 +620,7 @@ class Reline::Unicode::EastAsianWidth
617
620
  \u{1C90}-\u{1CBA}
618
621
  \u{1CBD}-\u{1CC7}
619
622
  \u{1CD0}-\u{1CFA}
620
- \u{1D00}-\u{1DF9}
621
- \u{1DFB}-\u{1F15}
623
+ \u{1D00}-\u{1F15}
622
624
  \u{1F18}-\u{1F1D}
623
625
  \u{1F20}-\u{1F45}
624
626
  \u{1F48}-\u{1F4D}
@@ -653,7 +655,7 @@ class Reline::Unicode::EastAsianWidth
653
655
  \u{2090}-\u{209C}
654
656
  \u{20A0}-\u{20A8}
655
657
  \u{20AA}-\u{20AB}
656
- \u{20AD}-\u{20BF}
658
+ \u{20AD}-\u{20C0}
657
659
  \u{20D0}-\u{20F0}
658
660
  \u{2100}-\u{2102}
659
661
  \u{2104}
@@ -767,9 +769,7 @@ class Reline::Unicode::EastAsianWidth
767
769
  \u{2B51}-\u{2B54}
768
770
  \u{2B5A}-\u{2B73}
769
771
  \u{2B76}-\u{2B95}
770
- \u{2B97}-\u{2C2E}
771
- \u{2C30}-\u{2C5E}
772
- \u{2C60}-\u{2CF3}
772
+ \u{2B97}-\u{2CF3}
773
773
  \u{2CF9}-\u{2D25}
774
774
  \u{2D27}
775
775
  \u{2D2D}
@@ -784,14 +784,16 @@ class Reline::Unicode::EastAsianWidth
784
784
  \u{2DC8}-\u{2DCE}
785
785
  \u{2DD0}-\u{2DD6}
786
786
  \u{2DD8}-\u{2DDE}
787
- \u{2DE0}-\u{2E52}
787
+ \u{2DE0}-\u{2E5D}
788
788
  \u{303F}
789
789
  \u{4DC0}-\u{4DFF}
790
790
  \u{A4D0}-\u{A62B}
791
791
  \u{A640}-\u{A6F7}
792
- \u{A700}-\u{A7BF}
793
- \u{A7C2}-\u{A7CA}
794
- \u{A7F5}-\u{A82C}
792
+ \u{A700}-\u{A7CA}
793
+ \u{A7D0}-\u{A7D1}
794
+ \u{A7D3}
795
+ \u{A7D5}-\u{A7D9}
796
+ \u{A7F2}-\u{A82C}
795
797
  \u{A830}-\u{A839}
796
798
  \u{A840}-\u{A877}
797
799
  \u{A880}-\u{A8C5}
@@ -823,11 +825,11 @@ class Reline::Unicode::EastAsianWidth
823
825
  \u{FB3E}
824
826
  \u{FB40}-\u{FB41}
825
827
  \u{FB43}-\u{FB44}
826
- \u{FB46}-\u{FBC1}
827
- \u{FBD3}-\u{FD3F}
828
- \u{FD50}-\u{FD8F}
828
+ \u{FB46}-\u{FBC2}
829
+ \u{FBD3}-\u{FD8F}
829
830
  \u{FD92}-\u{FDC7}
830
- \u{FDF0}-\u{FDFD}
831
+ \u{FDCF}
832
+ \u{FDF0}-\u{FDFF}
831
833
  \u{FE20}-\u{FE2F}
832
834
  \u{FE70}-\u{FE74}
833
835
  \u{FE76}-\u{FEFC}
@@ -861,10 +863,20 @@ class Reline::Unicode::EastAsianWidth
861
863
  \u{104D8}-\u{104FB}
862
864
  \u{10500}-\u{10527}
863
865
  \u{10530}-\u{10563}
864
- \u{1056F}
866
+ \u{1056F}-\u{1057A}
867
+ \u{1057C}-\u{1058A}
868
+ \u{1058C}-\u{10592}
869
+ \u{10594}-\u{10595}
870
+ \u{10597}-\u{105A1}
871
+ \u{105A3}-\u{105B1}
872
+ \u{105B3}-\u{105B9}
873
+ \u{105BB}-\u{105BC}
865
874
  \u{10600}-\u{10736}
866
875
  \u{10740}-\u{10755}
867
876
  \u{10760}-\u{10767}
877
+ \u{10780}-\u{10785}
878
+ \u{10787}-\u{107B0}
879
+ \u{107B2}-\u{107BA}
868
880
  \u{10800}-\u{10805}
869
881
  \u{10808}
870
882
  \u{1080A}-\u{10835}
@@ -906,13 +918,14 @@ class Reline::Unicode::EastAsianWidth
906
918
  \u{10E80}-\u{10EA9}
907
919
  \u{10EAB}-\u{10EAD}
908
920
  \u{10EB0}-\u{10EB1}
909
- \u{10F00}-\u{10F27}
921
+ \u{10EFD}-\u{10F27}
910
922
  \u{10F30}-\u{10F59}
923
+ \u{10F70}-\u{10F89}
911
924
  \u{10FB0}-\u{10FCB}
912
925
  \u{10FE0}-\u{10FF6}
913
926
  \u{11000}-\u{1104D}
914
- \u{11052}-\u{1106F}
915
- \u{1107F}-\u{110C1}
927
+ \u{11052}-\u{11075}
928
+ \u{1107F}-\u{110C2}
916
929
  \u{110CD}
917
930
  \u{110D0}-\u{110E8}
918
931
  \u{110F0}-\u{110F9}
@@ -922,7 +935,7 @@ class Reline::Unicode::EastAsianWidth
922
935
  \u{11180}-\u{111DF}
923
936
  \u{111E1}-\u{111F4}
924
937
  \u{11200}-\u{11211}
925
- \u{11213}-\u{1123E}
938
+ \u{11213}-\u{11241}
926
939
  \u{11280}-\u{11286}
927
940
  \u{11288}
928
941
  \u{1128A}-\u{1128D}
@@ -954,11 +967,11 @@ class Reline::Unicode::EastAsianWidth
954
967
  \u{11600}-\u{11644}
955
968
  \u{11650}-\u{11659}
956
969
  \u{11660}-\u{1166C}
957
- \u{11680}-\u{116B8}
970
+ \u{11680}-\u{116B9}
958
971
  \u{116C0}-\u{116C9}
959
972
  \u{11700}-\u{1171A}
960
973
  \u{1171D}-\u{1172B}
961
- \u{11730}-\u{1173F}
974
+ \u{11730}-\u{11746}
962
975
  \u{11800}-\u{1183B}
963
976
  \u{118A0}-\u{118F2}
964
977
  \u{118FF}-\u{11906}
@@ -974,7 +987,8 @@ class Reline::Unicode::EastAsianWidth
974
987
  \u{119DA}-\u{119E4}
975
988
  \u{11A00}-\u{11A47}
976
989
  \u{11A50}-\u{11AA2}
977
- \u{11AC0}-\u{11AF8}
990
+ \u{11AB0}-\u{11AF8}
991
+ \u{11B00}-\u{11B09}
978
992
  \u{11C00}-\u{11C08}
979
993
  \u{11C0A}-\u{11C36}
980
994
  \u{11C38}-\u{11C45}
@@ -996,19 +1010,23 @@ class Reline::Unicode::EastAsianWidth
996
1010
  \u{11D93}-\u{11D98}
997
1011
  \u{11DA0}-\u{11DA9}
998
1012
  \u{11EE0}-\u{11EF8}
1013
+ \u{11F00}-\u{11F10}
1014
+ \u{11F12}-\u{11F3A}
1015
+ \u{11F3E}-\u{11F59}
999
1016
  \u{11FB0}
1000
1017
  \u{11FC0}-\u{11FF1}
1001
1018
  \u{11FFF}-\u{12399}
1002
1019
  \u{12400}-\u{1246E}
1003
1020
  \u{12470}-\u{12474}
1004
1021
  \u{12480}-\u{12543}
1005
- \u{13000}-\u{1342E}
1006
- \u{13430}-\u{13438}
1022
+ \u{12F90}-\u{12FF2}
1023
+ \u{13000}-\u{13455}
1007
1024
  \u{14400}-\u{14646}
1008
1025
  \u{16800}-\u{16A38}
1009
1026
  \u{16A40}-\u{16A5E}
1010
1027
  \u{16A60}-\u{16A69}
1011
- \u{16A6E}-\u{16A6F}
1028
+ \u{16A6E}-\u{16ABE}
1029
+ \u{16AC0}-\u{16AC9}
1012
1030
  \u{16AD0}-\u{16AED}
1013
1031
  \u{16AF0}-\u{16AF5}
1014
1032
  \u{16B00}-\u{16B45}
@@ -1025,10 +1043,14 @@ class Reline::Unicode::EastAsianWidth
1025
1043
  \u{1BC80}-\u{1BC88}
1026
1044
  \u{1BC90}-\u{1BC99}
1027
1045
  \u{1BC9C}-\u{1BCA3}
1046
+ \u{1CF00}-\u{1CF2D}
1047
+ \u{1CF30}-\u{1CF46}
1048
+ \u{1CF50}-\u{1CFC3}
1028
1049
  \u{1D000}-\u{1D0F5}
1029
1050
  \u{1D100}-\u{1D126}
1030
- \u{1D129}-\u{1D1E8}
1051
+ \u{1D129}-\u{1D1EA}
1031
1052
  \u{1D200}-\u{1D245}
1053
+ \u{1D2C0}-\u{1D2D3}
1032
1054
  \u{1D2E0}-\u{1D2F3}
1033
1055
  \u{1D300}-\u{1D356}
1034
1056
  \u{1D360}-\u{1D378}
@@ -1055,17 +1077,27 @@ class Reline::Unicode::EastAsianWidth
1055
1077
  \u{1D7CE}-\u{1DA8B}
1056
1078
  \u{1DA9B}-\u{1DA9F}
1057
1079
  \u{1DAA1}-\u{1DAAF}
1080
+ \u{1DF00}-\u{1DF1E}
1081
+ \u{1DF25}-\u{1DF2A}
1058
1082
  \u{1E000}-\u{1E006}
1059
1083
  \u{1E008}-\u{1E018}
1060
1084
  \u{1E01B}-\u{1E021}
1061
1085
  \u{1E023}-\u{1E024}
1062
1086
  \u{1E026}-\u{1E02A}
1087
+ \u{1E030}-\u{1E06D}
1088
+ \u{1E08F}
1063
1089
  \u{1E100}-\u{1E12C}
1064
1090
  \u{1E130}-\u{1E13D}
1065
1091
  \u{1E140}-\u{1E149}
1066
1092
  \u{1E14E}-\u{1E14F}
1093
+ \u{1E290}-\u{1E2AE}
1067
1094
  \u{1E2C0}-\u{1E2F9}
1068
1095
  \u{1E2FF}
1096
+ \u{1E4D0}-\u{1E4F9}
1097
+ \u{1E7E0}-\u{1E7E6}
1098
+ \u{1E7E8}-\u{1E7EB}
1099
+ \u{1E7ED}-\u{1E7EE}
1100
+ \u{1E7F0}-\u{1E7FE}
1069
1101
  \u{1E800}-\u{1E8C4}
1070
1102
  \u{1E8C7}-\u{1E8D6}
1071
1103
  \u{1E900}-\u{1E94B}
@@ -1142,8 +1174,8 @@ class Reline::Unicode::EastAsianWidth
1142
1174
  \u{1F6D3}-\u{1F6D4}
1143
1175
  \u{1F6E0}-\u{1F6EA}
1144
1176
  \u{1F6F0}-\u{1F6F3}
1145
- \u{1F700}-\u{1F773}
1146
- \u{1F780}-\u{1F7D8}
1177
+ \u{1F700}-\u{1F776}
1178
+ \u{1F77B}-\u{1F7D9}
1147
1179
  \u{1F800}-\u{1F80B}
1148
1180
  \u{1F810}-\u{1F847}
1149
1181
  \u{1F850}-\u{1F859}
@@ -160,16 +160,21 @@ class Reline::Unicode
160
160
  width = 0
161
161
  rest = str.encode(Encoding::UTF_8)
162
162
  in_zero_width = false
163
+ seq = String.new(encoding: encoding)
163
164
  rest.scan(WIDTH_SCANNER) do |gc|
164
165
  case
165
166
  when gc[NON_PRINTING_START_INDEX]
166
167
  in_zero_width = true
168
+ lines.last << NON_PRINTING_START
167
169
  when gc[NON_PRINTING_END_INDEX]
168
170
  in_zero_width = false
171
+ lines.last << NON_PRINTING_END
169
172
  when gc[CSI_REGEXP_INDEX]
170
173
  lines.last << gc[CSI_REGEXP_INDEX]
174
+ seq << gc[CSI_REGEXP_INDEX]
171
175
  when gc[OSC_REGEXP_INDEX]
172
176
  lines.last << gc[OSC_REGEXP_INDEX]
177
+ seq << gc[OSC_REGEXP_INDEX]
173
178
  when gc[GRAPHEME_CLUSTER_INDEX]
174
179
  gc = gc[GRAPHEME_CLUSTER_INDEX]
175
180
  unless in_zero_width
@@ -177,7 +182,7 @@ class Reline::Unicode
177
182
  if (width += mbchar_width) > max_width
178
183
  width = mbchar_width
179
184
  lines << nil
180
- lines << String.new(encoding: encoding)
185
+ lines << seq.dup
181
186
  height += 1
182
187
  end
183
188
  end
@@ -1,3 +1,3 @@
1
1
  module Reline
2
- VERSION = '0.3.2'
2
+ VERSION = '0.3.3'
3
3
  end
@@ -291,6 +291,10 @@ class Reline::Windows
291
291
  end
292
292
  end
293
293
 
294
+ def self.with_raw_input
295
+ yield
296
+ end
297
+
294
298
  def self.getc
295
299
  check_input_event
296
300
  @@output_buf.shift
data/lib/reline.rb CHANGED
@@ -11,6 +11,7 @@ require 'reline/terminfo'
11
11
  require 'rbconfig'
12
12
 
13
13
  module Reline
14
+ # NOTE: For making compatible with the rb-readline gem
14
15
  FILENAME_COMPLETION_PROC = nil
15
16
  USERNAME_COMPLETION_PROC = nil
16
17
 
@@ -265,19 +266,21 @@ module Reline
265
266
  Reline::DEFAULT_DIALOG_CONTEXT = Array.new
266
267
 
267
268
  def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination)
268
- unless confirm_multiline_termination
269
- raise ArgumentError.new('#readmultiline needs block to confirm multiline termination')
270
- end
271
- inner_readline(prompt, add_hist, true, &confirm_multiline_termination)
269
+ Reline::IOGate.with_raw_input do
270
+ unless confirm_multiline_termination
271
+ raise ArgumentError.new('#readmultiline needs block to confirm multiline termination')
272
+ end
273
+ inner_readline(prompt, add_hist, true, &confirm_multiline_termination)
272
274
 
273
- whole_buffer = line_editor.whole_buffer.dup
274
- whole_buffer.taint if RUBY_VERSION < '2.7'
275
- if add_hist and whole_buffer and whole_buffer.chomp("\n").size > 0
276
- Reline::HISTORY << whole_buffer
277
- end
275
+ whole_buffer = line_editor.whole_buffer.dup
276
+ whole_buffer.taint if RUBY_VERSION < '2.7'
277
+ if add_hist and whole_buffer and whole_buffer.chomp("\n").size > 0
278
+ Reline::HISTORY << whole_buffer
279
+ end
278
280
 
279
- line_editor.reset_line if line_editor.whole_buffer.nil?
280
- whole_buffer
281
+ line_editor.reset_line if line_editor.whole_buffer.nil?
282
+ whole_buffer
283
+ end
281
284
  end
282
285
 
283
286
  def readline(prompt = '', add_hist = false)
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.3.2
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - aycabta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-14 00:00:00.000000000 Z
11
+ date: 2023-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: io-console
@@ -72,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
72
  - !ruby/object:Gem::Version
73
73
  version: '0'
74
74
  requirements: []
75
- rubygems_version: 3.4.0.dev
75
+ rubygems_version: 3.4.8
76
76
  signing_key:
77
77
  specification_version: 4
78
78
  summary: Alternative GNU Readline or Editline implementation by pure Ruby.