katakata_irb 0.1.2 → 0.1.4
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 +4 -4
- data/Gemfile.lock +8 -2
- data/README.md +16 -26
- data/bin/console +2 -7
- data/katakata_irb.gemspec +2 -1
- data/lib/katakata_irb/completor.rb +45 -6
- data/lib/katakata_irb/{trex.rb → nesting_parser.rb} +54 -32
- data/lib/katakata_irb/type_simulator.rb +25 -11
- data/lib/katakata_irb/types.rb +15 -18
- data/lib/katakata_irb/version.rb +1 -1
- data/lib/katakata_irb.rb +5 -7
- metadata +20 -16
- data/exe/kirb +0 -11
- data/lib/katakata_irb/reline_patch.rb +0 -43
- data/lib/katakata_irb/reline_patches/escapeseq.patch +0 -45
- data/lib/katakata_irb/reline_patches/fullwidth.patch +0 -200
- data/lib/katakata_irb/reline_patches/indent.patch +0 -25
- data/lib/katakata_irb/reline_patches/raw.patch +0 -95
- data/lib/katakata_irb/reline_patches/scrollbar.patch +0 -43
- data/lib/katakata_irb/reline_patches/wholelines.patch +0 -102
- data/lib/katakata_irb/ruby_lex_patch.rb +0 -216
data/exe/kirb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require_relative '../lib/katakata_irb'
|
3
|
-
KatakataIrb.log_output = STDERR if ARGV.delete '--debug-output'
|
4
|
-
unless ARGV.delete '--without-patch'
|
5
|
-
require_relative '../lib/katakata_irb/reline_patch'
|
6
|
-
KatakataIrb::RelinePatch.require_patched_reline
|
7
|
-
require 'katakata_irb/ruby_lex_patch'
|
8
|
-
KatakataIrb::RubyLexPatch.patch_to_ruby_lex
|
9
|
-
end
|
10
|
-
require 'katakata_irb'
|
11
|
-
KatakataIrb.repl
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module KatakataIrb; end
|
2
|
-
module KatakataIrb::RelinePatch
|
3
|
-
module RelinePatchIseqLoader; end
|
4
|
-
def self.require_patched_reline
|
5
|
-
# Apply patches of unmerged pull-request to reline
|
6
|
-
patches = %w[wholelines escapeseq indent fullwidth raw scrollbar]
|
7
|
-
patched = {}
|
8
|
-
require 'reline/version.rb' # result of $LOAD_PATH.resolve_feature_path will change after this require
|
9
|
-
patches.each do |patch_name|
|
10
|
-
patch = File.read File.expand_path("reline_patches/#{patch_name}.patch", File.dirname(__FILE__))
|
11
|
-
current_patched = {}
|
12
|
-
patch.gsub(/^diff.+\nindex.+$/, '').split(/^--- a(.+)\n\+\+\+ b(.+)\n/).drop(1).each_slice(3) do |file, newfile, diff|
|
13
|
-
raise if file != newfile
|
14
|
-
_, path = $LOAD_PATH.resolve_feature_path file.sub(%r{^/lib/}, '')
|
15
|
-
code = current_patched[path] || patched[path] || File.read(path)
|
16
|
-
diff.split(/^@@.+\n/).drop(1).map(&:lines).each do |lines|
|
17
|
-
target = lines.reject { _1[0] == '+' }.map { _1[1..] }.join
|
18
|
-
replace = lines.reject { _1[0] == '-' }.map { _1[1..] }.join
|
19
|
-
if code.include? target
|
20
|
-
code = code.sub target, replace
|
21
|
-
elsif !code.include?(replace)
|
22
|
-
raise
|
23
|
-
end
|
24
|
-
end
|
25
|
-
current_patched[path] = code
|
26
|
-
end
|
27
|
-
patched.update current_patched
|
28
|
-
rescue
|
29
|
-
KatakataIrb.log_puts "Failed to apply katakata_irb/reline_patches/#{patch_name}.patch to reline"
|
30
|
-
end
|
31
|
-
|
32
|
-
RelinePatchIseqLoader.define_method :load_iseq do |fname|
|
33
|
-
if patched.key? fname
|
34
|
-
RubyVM::InstructionSequence.compile patched[fname], fname
|
35
|
-
else
|
36
|
-
RubyVM::InstructionSequence.compile_file fname
|
37
|
-
end
|
38
|
-
end
|
39
|
-
RubyVM::InstructionSequence.singleton_class.prepend RelinePatchIseqLoader
|
40
|
-
require 'reline'
|
41
|
-
RelinePatchIseqLoader.undef_method :load_iseq
|
42
|
-
end
|
43
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
|
2
|
-
index 1c33a4b..bbf5e6c 100644
|
3
|
-
--- a/lib/reline/line_editor.rb
|
4
|
-
+++ b/lib/reline/line_editor.rb
|
5
|
-
@@ -663,8 +663,10 @@ class Reline::LineEditor
|
6
|
-
dialog.set_cursor_pos(cursor_column, @first_line_started_from + @started_from)
|
7
|
-
dialog_render_info = dialog.call(@last_key)
|
8
|
-
if dialog_render_info.nil? or dialog_render_info.contents.nil? or dialog_render_info.contents.empty?
|
9
|
-
+ lines = whole_lines
|
10
|
-
dialog.lines_backup = {
|
11
|
-
- lines: modify_lines(whole_lines),
|
12
|
-
+ unmodified_lines: lines,
|
13
|
-
+ lines: modify_lines(lines),
|
14
|
-
line_index: @line_index,
|
15
|
-
first_line_started_from: @first_line_started_from,
|
16
|
-
started_from: @started_from,
|
17
|
-
@@ -766,8 +768,10 @@ class Reline::LineEditor
|
18
|
-
Reline::IOGate.move_cursor_column(cursor_column)
|
19
|
-
move_cursor_up(dialog.vertical_offset + dialog.contents.size - 1)
|
20
|
-
Reline::IOGate.show_cursor
|
21
|
-
+ lines = whole_lines
|
22
|
-
dialog.lines_backup = {
|
23
|
-
- lines: modify_lines(whole_lines),
|
24
|
-
+ unmodified_lines: lines,
|
25
|
-
+ lines: modify_lines(lines),
|
26
|
-
line_index: @line_index,
|
27
|
-
first_line_started_from: @first_line_started_from,
|
28
|
-
started_from: @started_from,
|
29
|
-
@@ -777,7 +781,7 @@ class Reline::LineEditor
|
30
|
-
private def reset_dialog(dialog, old_dialog)
|
31
|
-
return if dialog.lines_backup.nil? or old_dialog.contents.nil?
|
32
|
-
- prompt, prompt_width, prompt_list = check_multiline_prompt(dialog.lines_backup[:lines])
|
33
|
-
+ prompt, prompt_width, prompt_list = check_multiline_prompt(dialog.lines_backup[:unmodified_lines])
|
34
|
-
visual_lines = []
|
35
|
-
visual_start = nil
|
36
|
-
dialog.lines_backup[:lines].each_with_index { |l, i|
|
37
|
-
@@ -888,7 +892,7 @@ class Reline::LineEditor
|
38
|
-
private def clear_each_dialog(dialog)
|
39
|
-
dialog.trap_key = nil
|
40
|
-
return unless dialog.contents
|
41
|
-
- prompt, prompt_width, prompt_list = check_multiline_prompt(dialog.lines_backup[:lines])
|
42
|
-
+ prompt, prompt_width, prompt_list = check_multiline_prompt(dialog.lines_backup[:unmodified_lines])
|
43
|
-
visual_lines = []
|
44
|
-
visual_lines_under_dialog = []
|
45
|
-
visual_start = nil
|
@@ -1,200 +0,0 @@
|
|
1
|
-
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
|
2
|
-
index c9e613e..6acf969 100644
|
3
|
-
--- a/lib/reline/line_editor.rb
|
4
|
-
+++ b/lib/reline/line_editor.rb
|
5
|
-
@@ -748,3 +741,3 @@ class Reline::LineEditor
|
6
|
-
end
|
7
|
-
str_width = dialog.width - (dialog.scrollbar_pos.nil? ? 0 : @block_elem_width)
|
8
|
-
- str = padding_space_with_escape_sequences(Reline::Unicode.take_range(item, 0, str_width), str_width)
|
9
|
-
+ str, = Reline::Unicode.take_range(item, 0, str_width, padding: true)
|
10
|
-
@@ -793,85 +786,42 @@ class Reline::LineEditor
|
11
|
-
end
|
12
|
-
visual_lines.concat(vl)
|
13
|
-
}
|
14
|
-
- old_y = dialog.lines_backup[:first_line_started_from] + dialog.lines_backup[:started_from]
|
15
|
-
- y = @first_line_started_from + @started_from
|
16
|
-
- y_diff = y - old_y
|
17
|
-
- if (old_y + old_dialog.vertical_offset) < (y + dialog.vertical_offset)
|
18
|
-
- # rerender top
|
19
|
-
- move_cursor_down(old_dialog.vertical_offset - y_diff)
|
20
|
-
- start = visual_start + old_dialog.vertical_offset
|
21
|
-
- line_num = dialog.vertical_offset - old_dialog.vertical_offset
|
22
|
-
- line_num.times do |i|
|
23
|
-
- Reline::IOGate.move_cursor_column(old_dialog.column)
|
24
|
-
- if visual_lines[start + i].nil?
|
25
|
-
- s = ' ' * old_dialog.width
|
26
|
-
- else
|
27
|
-
- s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column, old_dialog.width)
|
28
|
-
- s = padding_space_with_escape_sequences(s, old_dialog.width)
|
29
|
-
- end
|
30
|
-
- @output.write "\e[0m#{s}\e[0m"
|
31
|
-
- move_cursor_down(1) if i < (line_num - 1)
|
32
|
-
- end
|
33
|
-
- move_cursor_up(old_dialog.vertical_offset + line_num - 1 - y_diff)
|
34
|
-
- end
|
35
|
-
- if (old_y + old_dialog.vertical_offset + old_dialog.contents.size) > (y + dialog.vertical_offset + dialog.contents.size)
|
36
|
-
- # rerender bottom
|
37
|
-
- move_cursor_down(dialog.vertical_offset + dialog.contents.size - y_diff)
|
38
|
-
- start = visual_start + dialog.vertical_offset + dialog.contents.size
|
39
|
-
- line_num = (old_dialog.vertical_offset + old_dialog.contents.size) - (dialog.vertical_offset + dialog.contents.size)
|
40
|
-
- line_num.times do |i|
|
41
|
-
- Reline::IOGate.move_cursor_column(old_dialog.column)
|
42
|
-
- if visual_lines[start + i].nil?
|
43
|
-
- s = ' ' * old_dialog.width
|
44
|
-
- else
|
45
|
-
- s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column, old_dialog.width)
|
46
|
-
- s = padding_space_with_escape_sequences(s, old_dialog.width)
|
47
|
-
+ old_dialog_y = dialog.lines_backup[:first_line_started_from] + dialog.lines_backup[:started_from]
|
48
|
-
+ dialog_y = @first_line_started_from + @started_from
|
49
|
-
+
|
50
|
-
+ x_range = dialog.column...dialog.column + dialog.width
|
51
|
-
+ old_x_range = old_dialog.column...old_dialog.column + old_dialog.width
|
52
|
-
+ y_range = dialog_y + dialog.vertical_offset...dialog_y + dialog.vertical_offset + dialog.contents.size
|
53
|
-
+ old_y_range = old_dialog_y + old_dialog.vertical_offset...old_dialog_y + old_dialog.vertical_offset + old_dialog.contents.size
|
54
|
-
+
|
55
|
-
+ cursor_y = dialog_y
|
56
|
-
+ old_y_range.each do |y|
|
57
|
-
+ rerender_ranges = []
|
58
|
-
+ if y_range.cover?(y) && x_range.any?(old_x_range)
|
59
|
-
+ if old_x_range.begin < x_range.begin
|
60
|
-
+ # rerender left
|
61
|
-
+ rerender_ranges << [old_x_range.begin...[old_x_range.end, x_range.begin].min, true, false]
|
62
|
-
end
|
63
|
-
- @output.write "\e[0m#{s}\e[0m"
|
64
|
-
- move_cursor_down(1) if i < (line_num - 1)
|
65
|
-
- end
|
66
|
-
- move_cursor_up(dialog.vertical_offset + dialog.contents.size + line_num - 1 - y_diff)
|
67
|
-
- end
|
68
|
-
- if old_dialog.column < dialog.column
|
69
|
-
- # rerender left
|
70
|
-
- move_cursor_down(old_dialog.vertical_offset - y_diff)
|
71
|
-
- width = dialog.column - old_dialog.column
|
72
|
-
- start = visual_start + old_dialog.vertical_offset
|
73
|
-
- line_num = old_dialog.contents.size
|
74
|
-
- line_num.times do |i|
|
75
|
-
- Reline::IOGate.move_cursor_column(old_dialog.column)
|
76
|
-
- if visual_lines[start + i].nil?
|
77
|
-
- s = ' ' * width
|
78
|
-
- else
|
79
|
-
- s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column, width)
|
80
|
-
- s = padding_space_with_escape_sequences(s, dialog.width)
|
81
|
-
+ if x_range.end < old_x_range.end
|
82
|
-
+ # rerender right
|
83
|
-
+ rerender_ranges << [[x_range.end, old_x_range.begin].max...old_x_range.end, false, true]
|
84
|
-
end
|
85
|
-
+ else
|
86
|
-
+ rerender_ranges << [old_x_range, true, true]
|
87
|
-
+ end
|
88
|
-
+
|
89
|
-
+ rerender_ranges.each do |range, cover_begin, cover_end|
|
90
|
-
+ move_cursor_down(y - cursor_y)
|
91
|
-
+ cursor_y = y
|
92
|
-
+ col = range.begin
|
93
|
-
+ width = range.end - range.begin
|
94
|
-
+ line = visual_lines[y + visual_start - old_dialog_y] || ''
|
95
|
-
+ s, col = Reline::Unicode.take_range(line, col, width, cover_begin: cover_begin, cover_end: cover_end, padding: true)
|
96
|
-
+ Reline::IOGate.move_cursor_column(col)
|
97
|
-
@output.write "\e[0m#{s}\e[0m"
|
98
|
-
- move_cursor_down(1) if i < (line_num - 1)
|
99
|
-
- end
|
100
|
-
- move_cursor_up(old_dialog.vertical_offset + line_num - 1 - y_diff)
|
101
|
-
- end
|
102
|
-
- if (old_dialog.column + old_dialog.width) > (dialog.column + dialog.width)
|
103
|
-
- # rerender right
|
104
|
-
- move_cursor_down(old_dialog.vertical_offset + y_diff)
|
105
|
-
- width = (old_dialog.column + old_dialog.width) - (dialog.column + dialog.width)
|
106
|
-
- start = visual_start + old_dialog.vertical_offset
|
107
|
-
- line_num = old_dialog.contents.size
|
108
|
-
- line_num.times do |i|
|
109
|
-
- Reline::IOGate.move_cursor_column(old_dialog.column + dialog.width)
|
110
|
-
- if visual_lines[start + i].nil?
|
111
|
-
- s = ' ' * width
|
112
|
-
- else
|
113
|
-
- s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column + dialog.width, width)
|
114
|
-
- rerender_width = old_dialog.width - dialog.width
|
115
|
-
- s = padding_space_with_escape_sequences(s, rerender_width)
|
116
|
-
- end
|
117
|
-
- Reline::IOGate.move_cursor_column(dialog.column + dialog.width)
|
118
|
-
- @output.write "\e[0m#{s}\e[0m"
|
119
|
-
- move_cursor_down(1) if i < (line_num - 1)
|
120
|
-
end
|
121
|
-
- move_cursor_up(old_dialog.vertical_offset + line_num - 1 + y_diff)
|
122
|
-
end
|
123
|
-
+ move_cursor_up(cursor_y - dialog_y)
|
124
|
-
Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
|
125
|
-
end
|
126
|
-
|
127
|
-
@@ -912,9 +862,8 @@ class Reline::LineEditor
|
128
|
-
dialog_vertical_size = dialog.contents.size
|
129
|
-
dialog_vertical_size.times do |i|
|
130
|
-
if i < visual_lines_under_dialog.size
|
131
|
-
- Reline::IOGate.move_cursor_column(dialog.column)
|
132
|
-
- str = Reline::Unicode.take_range(visual_lines_under_dialog[i], dialog.column, dialog.width)
|
133
|
-
- str = padding_space_with_escape_sequences(str, dialog.width)
|
134
|
-
+ str, start_pos = Reline::Unicode.take_range(visual_lines_under_dialog[i], dialog.column, dialog.width, cover_begin: true, cover_end: true, padding: true)
|
135
|
-
+ Reline::IOGate.move_cursor_column(start_pos)
|
136
|
-
@output.write "\e[0m#{str}\e[0m"
|
137
|
-
else
|
138
|
-
Reline::IOGate.move_cursor_column(dialog.column)
|
139
|
-
diff --git a/lib/reline/unicode.rb b/lib/reline/unicode.rb
|
140
|
-
index 6000c9f..03074dd 100644
|
141
|
-
--- a/lib/reline/unicode.rb
|
142
|
-
+++ b/lib/reline/unicode.rb
|
143
|
-
@@ -194,17 +194,21 @@ class Reline::Unicode
|
144
|
-
end
|
145
|
-
|
146
|
-
# Take a chunk of a String cut by width with escape sequences.
|
147
|
-
- def self.take_range(str, start_col, max_width, encoding = str.encoding)
|
148
|
-
+ def self.take_range(str, start_col, width, encoding: str.encoding, cover_begin: false, cover_end: false, padding: false)
|
149
|
-
chunk = String.new(encoding: encoding)
|
150
|
-
total_width = 0
|
151
|
-
rest = str.encode(Encoding::UTF_8)
|
152
|
-
in_zero_width = false
|
153
|
-
+ chunk_start_col = nil
|
154
|
-
+ chunk_end_col = nil
|
155
|
-
rest.scan(WIDTH_SCANNER) do |gc|
|
156
|
-
case
|
157
|
-
when gc[NON_PRINTING_START_INDEX]
|
158
|
-
in_zero_width = true
|
159
|
-
+ chunk << NON_PRINTING_START
|
160
|
-
when gc[NON_PRINTING_END_INDEX]
|
161
|
-
in_zero_width = false
|
162
|
-
+ chunk << NON_PRINTING_END
|
163
|
-
when gc[CSI_REGEXP_INDEX]
|
164
|
-
chunk << gc[CSI_REGEXP_INDEX]
|
165
|
-
when gc[OSC_REGEXP_INDEX]
|
166
|
-
@@ -215,13 +219,31 @@ class Reline::Unicode
|
167
|
-
chunk << gc
|
168
|
-
else
|
169
|
-
mbchar_width = get_mbchar_width(gc)
|
170
|
-
+ prev_width = total_width
|
171
|
-
total_width += mbchar_width
|
172
|
-
- break if (start_col + max_width) < total_width
|
173
|
-
- chunk << gc if start_col < total_width
|
174
|
-
+ break if !cover_end && total_width > start_col + width
|
175
|
-
+ if cover_begin ? start_col < total_width : start_col <= prev_width
|
176
|
-
+ chunk << gc
|
177
|
-
+ chunk_start_col ||= prev_width
|
178
|
-
+ chunk_end_col = total_width
|
179
|
-
+ end
|
180
|
-
+ break if total_width >= start_col + width
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
184
|
-
- chunk
|
185
|
-
+ chunk_start_col ||= start_col
|
186
|
-
+ chunk_end_col ||= start_col
|
187
|
-
+ if padding
|
188
|
-
+ if start_col < chunk_start_col
|
189
|
-
+ chunk = ' ' * (chunk_start_col - start_col) + chunk
|
190
|
-
+ chunk_start_col = start_col
|
191
|
-
+ end
|
192
|
-
+ if chunk_end_col < start_col + width
|
193
|
-
+ chunk << ' ' * (start_col + width - chunk_end_col)
|
194
|
-
+ chunk_end_col = start_col + width
|
195
|
-
+ end
|
196
|
-
+ end
|
197
|
-
+ [chunk, chunk_start_col, chunk_end_col - chunk_start_col]
|
198
|
-
end
|
199
|
-
|
200
|
-
def self.get_next_mbchar_size(line, byte_pointer)
|
@@ -1,25 +0,0 @@
|
|
1
|
-
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
|
2
|
-
index bbf5e6c..c9e613e 100644
|
3
|
-
--- a/lib/reline/line_editor.rb
|
4
|
-
+++ b/lib/reline/line_editor.rb
|
5
|
-
@@ -1707,17 +1707,18 @@ class Reline::LineEditor
|
6
|
-
end
|
7
|
-
new_lines = whole_lines
|
8
|
-
new_indent = @auto_indent_proc.(new_lines, @line_index, @byte_pointer, @check_new_auto_indent)
|
9
|
-
- new_indent = @cursor_max if new_indent&.> @cursor_max
|
10
|
-
if new_indent&.>= 0
|
11
|
-
md = new_lines[@line_index].match(/\A */)
|
12
|
-
prev_indent = md[0].count(' ')
|
13
|
-
if @check_new_auto_indent
|
14
|
-
- @buffer_of_lines[@line_index] = ' ' * new_indent + @buffer_of_lines[@line_index].lstrip
|
15
|
-
+ line = @buffer_of_lines[@line_index] = ' ' * new_indent + @buffer_of_lines[@line_index].lstrip
|
16
|
-
@cursor = new_indent
|
17
|
-
+ @cursor_max = calculate_width(line)
|
18
|
-
@byte_pointer = new_indent
|
19
|
-
else
|
20
|
-
@line = ' ' * new_indent + @line.lstrip
|
21
|
-
@cursor += new_indent - prev_indent
|
22
|
-
+ @cursor_max = calculate_width(@line)
|
23
|
-
@byte_pointer += new_indent - prev_indent
|
24
|
-
end
|
25
|
-
end
|
@@ -1,95 +0,0 @@
|
|
1
|
-
diff --git a/lib/reline.rb b/lib/reline.rb
|
2
|
-
index f22b573..8716a0c 100644
|
3
|
-
--- a/lib/reline.rb
|
4
|
-
+++ b/lib/reline.rb
|
5
|
-
@@ -281,19 +281,21 @@ module Reline
|
6
|
-
Reline::DEFAULT_DIALOG_CONTEXT = Array.new
|
7
|
-
|
8
|
-
def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination)
|
9
|
-
- unless confirm_multiline_termination
|
10
|
-
- raise ArgumentError.new('#readmultiline needs block to confirm multiline termination')
|
11
|
-
- end
|
12
|
-
- inner_readline(prompt, add_hist, true, &confirm_multiline_termination)
|
13
|
-
+ Reline::IOGate.with_raw_input do
|
14
|
-
+ unless confirm_multiline_termination
|
15
|
-
+ raise ArgumentError.new('#readmultiline needs block to confirm multiline termination')
|
16
|
-
+ end
|
17
|
-
+ inner_readline(prompt, add_hist, true, &confirm_multiline_termination)
|
18
|
-
|
19
|
-
- whole_buffer = line_editor.whole_buffer.dup
|
20
|
-
- whole_buffer.taint if RUBY_VERSION < '2.7'
|
21
|
-
- if add_hist and whole_buffer and whole_buffer.chomp("\n").size > 0
|
22
|
-
- Reline::HISTORY << whole_buffer
|
23
|
-
- end
|
24
|
-
+ whole_buffer = line_editor.whole_buffer.dup
|
25
|
-
+ whole_buffer.taint if RUBY_VERSION < '2.7'
|
26
|
-
+ if add_hist and whole_buffer and whole_buffer.chomp("\n").size > 0
|
27
|
-
+ Reline::HISTORY << whole_buffer
|
28
|
-
+ end
|
29
|
-
|
30
|
-
- line_editor.reset_line if line_editor.whole_buffer.nil?
|
31
|
-
- whole_buffer
|
32
|
-
+ line_editor.reset_line if line_editor.whole_buffer.nil?
|
33
|
-
+ whole_buffer
|
34
|
-
+ end
|
35
|
-
end
|
36
|
-
|
37
|
-
def readline(prompt = '', add_hist = false)
|
38
|
-
diff --git a/lib/reline/ansi.rb b/lib/reline/ansi.rb
|
39
|
-
index ab147a6..ccebe15 100644
|
40
|
-
--- a/lib/reline/ansi.rb
|
41
|
-
+++ b/lib/reline/ansi.rb
|
42
|
-
@@ -142,6 +142,10 @@ class Reline::ANSI
|
43
|
-
@@output = val
|
44
|
-
end
|
45
|
-
|
46
|
-
+ def self.with_raw_input
|
47
|
-
+ @@input.raw { yield }
|
48
|
-
+ end
|
49
|
-
+
|
50
|
-
@@buf = []
|
51
|
-
def self.inner_getc
|
52
|
-
unless @@buf.empty?
|
53
|
-
diff --git a/lib/reline/general_io.rb b/lib/reline/general_io.rb
|
54
|
-
index 92c76cb..9929846 100644
|
55
|
-
--- a/lib/reline/general_io.rb
|
56
|
-
+++ b/lib/reline/general_io.rb
|
57
|
-
@@ -31,6 +31,10 @@ class Reline::GeneralIO
|
58
|
-
@@input = val
|
59
|
-
end
|
60
|
-
|
61
|
-
+ def self.with_raw_input
|
62
|
-
+ yield
|
63
|
-
+ end
|
64
|
-
+
|
65
|
-
def self.getc
|
66
|
-
unless @@buf.empty?
|
67
|
-
return @@buf.shift
|
68
|
-
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
|
69
|
-
index 6acf969..e3985a3 100644
|
70
|
-
--- a/lib/reline/line_editor.rb
|
71
|
-
+++ b/lib/reline/line_editor.rb
|
72
|
-
@@ -452,7 +452,7 @@ class Reline::LineEditor
|
73
|
-
new_lines = whole_lines
|
74
|
-
prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
|
75
|
-
modify_lines(new_lines).each_with_index do |line, index|
|
76
|
-
- @output.write "#{prompt_list ? prompt_list[index] : prompt}#{line}\n"
|
77
|
-
+ @output.write "#{prompt_list ? prompt_list[index] : prompt}#{line}\r\n"
|
78
|
-
Reline::IOGate.erase_after_cursor
|
79
|
-
end
|
80
|
-
@output.flush
|
81
|
-
diff --git a/lib/reline/windows.rb b/lib/reline/windows.rb
|
82
|
-
index b952329..7ea2a00 100644
|
83
|
-
--- a/lib/reline/windows.rb
|
84
|
-
+++ b/lib/reline/windows.rb
|
85
|
-
@@ -291,6 +291,10 @@ class Reline::Windows
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
+ def self.with_raw_input
|
90
|
-
+ yield
|
91
|
-
+ end
|
92
|
-
+
|
93
|
-
def self.getc
|
94
|
-
check_input_event
|
95
|
-
@@output_buf.shift
|
@@ -1,43 +0,0 @@
|
|
1
|
-
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
|
2
|
-
index e3985a3..8d785db 100644
|
3
|
-
--- a/lib/reline/line_editor.rb
|
4
|
-
+++ b/lib/reline/line_editor.rb
|
5
|
-
@@ -680,6 +680,9 @@ class Reline::LineEditor
|
6
|
-
end
|
7
|
-
height = dialog_render_info.height || DIALOG_DEFAULT_HEIGHT
|
8
|
-
height = dialog.contents.size if dialog.contents.size < height
|
9
|
-
+ if dialog.scroll_top >= dialog.contents.size - height
|
10
|
-
+ dialog.scroll_top = dialog.contents.size - height
|
11
|
-
+ end
|
12
|
-
if dialog.contents.size > height
|
13
|
-
if dialog.pointer
|
14
|
-
if dialog.pointer < 0
|
15
|
-
@@ -690,17 +693,20 @@ class Reline::LineEditor
|
16
|
-
dialog.scroll_top = dialog.pointer
|
17
|
-
end
|
18
|
-
pointer = dialog.pointer - dialog.scroll_top
|
19
|
-
+ else
|
20
|
-
+ dialog.scroll_top = 0
|
21
|
-
end
|
22
|
-
dialog.contents = dialog.contents[dialog.scroll_top, height]
|
23
|
-
end
|
24
|
-
- if dialog.contents and dialog.scroll_top >= dialog.contents.size
|
25
|
-
- dialog.scroll_top = dialog.contents.size - height
|
26
|
-
+ if dialog_render_info.contents and dialog.scroll_top > dialog_render_info.contents.size - height
|
27
|
-
+ dialog.scroll_top = dialog_render_info.contents.size - height
|
28
|
-
end
|
29
|
-
if dialog_render_info.scrollbar and dialog_render_info.contents.size > height
|
30
|
-
bar_max_height = height * 2
|
31
|
-
moving_distance = (dialog_render_info.contents.size - height) * 2
|
32
|
-
position_ratio = dialog.scroll_top.zero? ? 0.0 : ((dialog.scroll_top * 2).to_f / moving_distance)
|
33
|
-
bar_height = (bar_max_height * ((dialog.contents.size * 2).to_f / (dialog_render_info.contents.size * 2))).floor.to_i
|
34
|
-
+ bar_height = 1 if bar_height.zero?
|
35
|
-
dialog.scrollbar_pos = ((bar_max_height - bar_height) * position_ratio).floor.to_i
|
36
|
-
else
|
37
|
-
dialog.scrollbar_pos = nil
|
38
|
-
@@ -745,4 +751,4 @@ class Reline::LineEditor
|
39
|
-
- if dialog.scrollbar_pos and (dialog.scrollbar_pos != old_dialog.scrollbar_pos or dialog.column != old_dialog.column)
|
40
|
-
+ if dialog.scrollbar_pos
|
41
|
-
@output.write "\e[37m"
|
42
|
-
if dialog.scrollbar_pos <= (i * 2) and (i * 2 + 1) < (dialog.scrollbar_pos + bar_height)
|
43
|
-
@output.write @full_block
|
@@ -1,102 +0,0 @@
|
|
1
|
-
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
|
2
|
-
index 8153aab..1c33a4b 100644
|
3
|
-
--- a/lib/reline/line_editor.rb
|
4
|
-
+++ b/lib/reline/line_editor.rb
|
5
|
-
@@ -449,12 +449,8 @@ class Reline::LineEditor
|
6
|
-
Reline::IOGate.move_cursor_up(@first_line_started_from + @started_from - @scroll_partial_screen)
|
7
|
-
Reline::IOGate.move_cursor_column(0)
|
8
|
-
@scroll_partial_screen = nil
|
9
|
-
- prompt, prompt_width, prompt_list = check_multiline_prompt(whole_lines)
|
10
|
-
- if @previous_line_index
|
11
|
-
- new_lines = whole_lines(index: @previous_line_index, line: @line)
|
12
|
-
- else
|
13
|
-
- new_lines = whole_lines
|
14
|
-
- end
|
15
|
-
+ new_lines = whole_lines
|
16
|
-
+ prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
|
17
|
-
modify_lines(new_lines).each_with_index do |line, index|
|
18
|
-
@output.write "#{prompt_list ? prompt_list[index] : prompt}#{line}\n"
|
19
|
-
Reline::IOGate.erase_after_cursor
|
20
|
-
@@ -490,11 +486,7 @@ class Reline::LineEditor
|
21
|
-
if @is_multiline
|
22
|
-
if finished?
|
23
|
-
# Always rerender on finish because output_modifier_proc may return a different output.
|
24
|
-
- if @previous_line_index
|
25
|
-
- new_lines = whole_lines(index: @previous_line_index, line: @line)
|
26
|
-
- else
|
27
|
-
- new_lines = whole_lines
|
28
|
-
- end
|
29
|
-
+ new_lines = whole_lines
|
30
|
-
line = modify_lines(new_lines)[@line_index]
|
31
|
-
clear_dialog
|
32
|
-
prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
|
33
|
-
@@ -1013,11 +1005,7 @@ class Reline::LineEditor
|
34
|
-
end
|
35
|
-
|
36
|
-
private def rerender_changed_current_line
|
37
|
-
- if @previous_line_index
|
38
|
-
- new_lines = whole_lines(index: @previous_line_index, line: @line)
|
39
|
-
- else
|
40
|
-
- new_lines = whole_lines
|
41
|
-
- end
|
42
|
-
+ new_lines = whole_lines
|
43
|
-
prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
|
44
|
-
all_height = calculate_height_by_lines(new_lines, prompt_list || prompt)
|
45
|
-
diff = all_height - @highest_in_all
|
46
|
-
@@ -1698,7 +1686,7 @@ class Reline::LineEditor
|
47
|
-
return if not @check_new_auto_indent and @previous_line_index # move cursor up or down
|
48
|
-
if @check_new_auto_indent and @previous_line_index and @previous_line_index > 0 and @line_index > @previous_line_index
|
49
|
-
# Fix indent of a line when a newline is inserted to the next
|
50
|
-
- new_lines = whole_lines(index: @previous_line_index, line: @line)
|
51
|
-
+ new_lines = whole_lines
|
52
|
-
new_indent = @auto_indent_proc.(new_lines[0..-3].push(''), @line_index - 1, 0, true)
|
53
|
-
md = @line.match(/\A */)
|
54
|
-
prev_indent = md[0].count(' ')
|
55
|
-
@@ -1713,11 +1701,7 @@ class Reline::LineEditor
|
56
|
-
@line = ' ' * new_indent + @line.lstrip
|
57
|
-
end
|
58
|
-
end
|
59
|
-
- if @previous_line_index
|
60
|
-
- new_lines = whole_lines(index: @previous_line_index, line: @line)
|
61
|
-
- else
|
62
|
-
- new_lines = whole_lines
|
63
|
-
- end
|
64
|
-
+ new_lines = whole_lines
|
65
|
-
new_indent = @auto_indent_proc.(new_lines, @line_index, @byte_pointer, @check_new_auto_indent)
|
66
|
-
new_indent = @cursor_max if new_indent&.> @cursor_max
|
67
|
-
if new_indent&.>= 0
|
68
|
-
@@ -1803,11 +1787,7 @@ class Reline::LineEditor
|
69
|
-
target = before
|
70
|
-
end
|
71
|
-
if @is_multiline
|
72
|
-
- if @previous_line_index
|
73
|
-
- lines = whole_lines(index: @previous_line_index, line: @line)
|
74
|
-
- else
|
75
|
-
- lines = whole_lines
|
76
|
-
- end
|
77
|
-
+ lines = whole_lines
|
78
|
-
if @line_index > 0
|
79
|
-
preposing = lines[0..(@line_index - 1)].join("\n") + "\n" + preposing
|
80
|
-
end
|
81
|
-
@@ -1907,7 +1887,7 @@ class Reline::LineEditor
|
82
|
-
@cursor_max = calculate_width(@line)
|
83
|
-
end
|
84
|
-
|
85
|
-
- def whole_lines(index: @line_index, line: @line)
|
86
|
-
+ def whole_lines(index: @previous_line_index || @line_index, line: @line)
|
87
|
-
temp_lines = @buffer_of_lines.dup
|
88
|
-
temp_lines[index] = line
|
89
|
-
temp_lines
|
90
|
-
@@ -1917,11 +1897,7 @@ class Reline::LineEditor
|
91
|
-
if @buffer_of_lines.size == 1 and @line.nil?
|
92
|
-
nil
|
93
|
-
else
|
94
|
-
- if @previous_line_index
|
95
|
-
- whole_lines(index: @previous_line_index, line: @line).join("\n")
|
96
|
-
- else
|
97
|
-
- whole_lines.join("\n")
|
98
|
-
- end
|
99
|
-
+ whole_lines.join("\n")
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|