summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenta Murata <mrkn@mrkn.jp>2020-01-16 13:13:35 +0900
committeraycabta <aycabta@gmail.com>2020-01-21 09:51:16 +0900
commit51a8055d7db8a6ae35a9f624700c0910ec20aeb8 (patch)
tree0d718d09fa2668497e8735666b5c67f188472c28
parentf451bb5406878e1ac9ce9d37952f171837d0cb09 (diff)
[ruby/irb] Add newline_before_multiline_output
https://github.com/ruby/irb/commit/9eb1801a66
-rw-r--r--lib/irb.rb8
-rw-r--r--lib/irb/context.rb20
-rw-r--r--test/irb/test_context.rb31
3 files changed, 58 insertions, 1 deletions
diff --git a/lib/irb.rb b/lib/irb.rb
index bcd6599af9..3e08877e76 100644
--- a/lib/irb.rb
+++ b/lib/irb.rb
@@ -736,7 +736,13 @@ module IRB
end
def output_value # :nodoc:
- printf @context.return_format, @context.inspect_last_value
+ str = @context.inspect_last_value
+ multiline_p = str.each_line.take(2).length > 1
+ if multiline_p && @context.newline_before_multiline_output?
+ printf @context.return_format, "\n#{str}"
+ else
+ printf @context.return_format, str
+ end
end
# Outputs the local variables to this current session, including
diff --git a/lib/irb/context.rb b/lib/irb/context.rb
index 686738cd40..218f7c6037 100644
--- a/lib/irb/context.rb
+++ b/lib/irb/context.rb
@@ -133,6 +133,11 @@ module IRB
if @echo_on_assignment.nil?
@echo_on_assignment = false
end
+
+ @newline_before_multiline_output = IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT]
+ if @newline_before_multiline_output.nil?
+ @newline_before_multiline_output = true
+ end
end
# The top-level workspace, see WorkSpace#main
@@ -253,6 +258,20 @@ module IRB
# a = "omg"
# #=> omg
attr_accessor :echo_on_assignment
+ # Whether a newline is put before multiline output.
+ #
+ # Uses IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT] if available,
+ # or defaults to +true+.
+ #
+ # "abc\ndef"
+ # #=>
+ # abc
+ # def
+ # IRB.CurrentContext.newline_before_multiline_output = false
+ # "abc\ndef"
+ # #=> abc
+ # def
+ attr_accessor :newline_before_multiline_output
# Whether verbose messages are displayed or not.
#
# A copy of the default <code>IRB.conf[:VERBOSE]</code>
@@ -287,6 +306,7 @@ module IRB
alias ignore_eof? ignore_eof
alias echo? echo
alias echo_on_assignment? echo_on_assignment
+ alias newline_before_multiline_output? newline_before_multiline_output
# Returns whether messages are displayed or not.
def verbose?
diff --git a/test/irb/test_context.rb b/test/irb/test_context.rb
index 693ebbeaea..8a6521bf69 100644
--- a/test/irb/test_context.rb
+++ b/test/irb/test_context.rb
@@ -216,5 +216,36 @@ module TestIRB
assert(irb.context.echo?, "echo? should be true by default")
assert(irb.context.echo_on_assignment?, "echo_on_assignment? should be true when IRB.conf[:ECHO_ON_ASSIGNMENT] is set to true")
end
+
+ def test_multiline_output_on_default_inspector
+ main = Object.new
+ def main.inspect
+ "abc\ndef"
+ end
+ input = TestInputMethod.new([
+ "self"
+ ])
+ irb = IRB::Irb.new(IRB::WorkSpace.new(main), input)
+ irb.context.return_format = "=> %s\n"
+
+ # The default
+ irb.context.newline_before_multiline_output = true
+ out, err = capture_io do
+ irb.eval_input
+ end
+ assert_empty err
+ assert_equal("=> \nabc\ndef\n",
+ out)
+
+ # No newline before multiline output
+ input.reset
+ irb.context.newline_before_multiline_output = false
+ out, err = capture_io do
+ irb.eval_input
+ end
+ assert_empty err
+ assert_equal("=> abc\ndef\n",
+ out)
+ end
end
end