[ruby/irb] Colorize command input

(https://github.com/ruby/irb/pull/983)

https://github.com/ruby/irb/commit/0e64136e76
This commit is contained in:
tomoya ishida 2024-08-29 01:16:27 +09:00 committed by git
parent ccef391140
commit ce6b0c4425
2 changed files with 23 additions and 1 deletions

View File

@ -270,7 +270,13 @@ module IRB
proc do |output, complete: |
next unless IRB::Color.colorable?
lvars = IRB.CurrentContext&.local_variables || []
IRB::Color.colorize_code(output, complete: complete, local_variables: lvars)
if IRB.CurrentContext&.parse_command(output)
name, sep, arg = output.split(/(\s+)/, 2)
arg = IRB::Color.colorize_code(arg, complete: complete, local_variables: lvars)
"#{IRB::Color.colorize(name, [:BOLD])}\e[m#{sep}#{arg}"
else
IRB::Color.colorize_code(output, complete: complete, local_variables: lvars)
end
end
else
proc do |output|

View File

@ -8,6 +8,7 @@ module TestIRB
class InputMethodTest < TestCase
def setup
@conf_backup = IRB.conf.dup
IRB.init_config(nil)
IRB.conf[:LC_MESSAGES] = IRB::Locale.new
save_encodings
end
@ -33,6 +34,21 @@ module TestIRB
assert_not_nil Reline.dig_perfect_match_proc
end
def test_colorize
original_colorable = IRB::Color.method(:colorable?)
IRB::Color.instance_eval { undef :colorable? }
IRB::Color.define_singleton_method(:colorable?) { true }
workspace = IRB::WorkSpace.new(binding)
input_method = IRB::RelineInputMethod.new(IRB::RegexpCompletor.new)
IRB.conf[:MAIN_CONTEXT] = IRB::Irb.new(workspace, input_method).context
assert_equal "\e[1m$\e[0m\e[m", Reline.output_modifier_proc.call('$', complete: false)
assert_equal "\e[1m$\e[0m\e[m \e[34m\e[1m1\e[0m + \e[34m\e[1m2\e[0m", Reline.output_modifier_proc.call('$ 1 + 2', complete: false)
assert_equal "\e[32m\e[1m$a\e[0m", Reline.output_modifier_proc.call('$a', complete: false)
ensure
IRB::Color.instance_eval { undef :colorable? }
IRB::Color.define_singleton_method(:colorable?, original_colorable)
end
def test_initialization_without_use_autocomplete
original_show_doc_proc = Reline.dialog_proc(:show_doc)&.dialog_proc
empty_proc = Proc.new {}