reline 0.3.2 → 0.3.3

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 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.