Skip to content

Commit 0feeae3

Browse files
committed
Omit output if first line of multiline is too long
1 parent c5ea79d commit 0feeae3

File tree

2 files changed

+88
-2
lines changed

2 files changed

+88
-2
lines changed

lib/irb.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -750,10 +750,20 @@ def output_value(omit = false) # :nodoc:
750750
str = @context.inspect_last_value
751751
multiline_p = str.include?("\n")
752752
if omit
753+
winwidth = @context.io.winsize.last
753754
if multiline_p
754-
str.gsub!(/(\A.*?\n).*/m, "\\1...")
755+
first_line = str.split("\n").first
756+
result = @context.newline_before_multiline_output? ? (@context.return_format % first_line) : first_line
757+
output_width = Reline::Unicode.calculate_width(result, true)
758+
diff_size = output_width - Reline::Unicode.calculate_width(first_line, true)
759+
if diff_size.positive? and output_width > winwidth
760+
lines, _ = Reline::Unicode.split_by_width(first_line, winwidth - diff_size - 3)
761+
str = "%s...\e[0m" % lines.first
762+
multiline_p = false
763+
else
764+
str.gsub!(/(\A.*?\n).*/m, "\\1...")
765+
end
755766
else
756-
winwidth = @context.io.winsize.last
757767
output_width = Reline::Unicode.calculate_width(@context.return_format % str, true)
758768
diff_size = output_width - Reline::Unicode.calculate_width(str, true)
759769
if diff_size.positive? and output_width > winwidth

test/irb/test_context.rb

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,82 @@ def test_omit_on_assignment
286286
assert_equal("", out)
287287
end
288288

289+
def test_omit_multiline_on_assignment
290+
input = TestInputMethod.new([
291+
"class A; def inspect; ([?* * 1000] * 3).join(%{\\n}); end; end; a = A.new\n",
292+
"a\n"
293+
])
294+
value = ([?* * 1000] * 3).join(%{\n})
295+
value_first_line = (?* * 1000).to_s
296+
irb = IRB::Irb.new(IRB::WorkSpace.new(Object.new), input)
297+
irb.context.return_format = "=> %s\n"
298+
299+
irb.context.echo = true
300+
irb.context.echo_on_assignment = false
301+
irb.context.omit_on_assignment = true
302+
out, err = capture_io do
303+
irb.eval_input
304+
end
305+
assert_empty err
306+
assert_equal("=> \n#{value}\n", out)
307+
irb.context.evaluate('A.remove_method(:inspect)', 0)
308+
309+
input.reset
310+
irb.context.echo = true
311+
irb.context.echo_on_assignment = true
312+
irb.context.omit_on_assignment = true
313+
out, err = capture_io do
314+
irb.eval_input
315+
end
316+
assert_empty err
317+
assert_equal("=> #{value_first_line[0..(input.winsize.last - 9)]}...\e[0m\n=> \n#{value}\n", out)
318+
irb.context.evaluate('A.remove_method(:inspect)', 0)
319+
320+
input.reset
321+
irb.context.echo = true
322+
irb.context.echo_on_assignment = true
323+
irb.context.omit_on_assignment = false
324+
out, err = capture_io do
325+
irb.eval_input
326+
end
327+
assert_empty err
328+
assert_equal("=> \n#{value}\n=> \n#{value}\n", out)
329+
irb.context.evaluate('A.remove_method(:inspect)', 0)
330+
331+
input.reset
332+
irb.context.echo = false
333+
irb.context.echo_on_assignment = false
334+
irb.context.omit_on_assignment = true
335+
out, err = capture_io do
336+
irb.eval_input
337+
end
338+
assert_empty err
339+
assert_equal("", out)
340+
irb.context.evaluate('A.remove_method(:inspect)', 0)
341+
342+
input.reset
343+
irb.context.echo = false
344+
irb.context.echo_on_assignment = true
345+
irb.context.omit_on_assignment = true
346+
out, err = capture_io do
347+
irb.eval_input
348+
end
349+
assert_empty err
350+
assert_equal("", out)
351+
irb.context.evaluate('A.remove_method(:inspect)', 0)
352+
353+
input.reset
354+
irb.context.echo = false
355+
irb.context.echo_on_assignment = true
356+
irb.context.omit_on_assignment = false
357+
out, err = capture_io do
358+
irb.eval_input
359+
end
360+
assert_empty err
361+
assert_equal("", out)
362+
irb.context.evaluate('A.remove_method(:inspect)', 0)
363+
end
364+
289365
def test_echo_on_assignment_conf
290366
# Default
291367
IRB.conf[:ECHO] = nil

0 commit comments

Comments
 (0)