From 7669d40a941b1448593c5b56e275b162b525c69d Mon Sep 17 00:00:00 2001 From: tompng Date: Sun, 22 Oct 2023 00:17:27 +0900 Subject: [PATCH] Show more easter_egg(dancing or logo) when Alt+d is pressed in autocomplete mode --- lib/irb/input-method.rb | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb index ad7b90a61..5d285971a 100644 --- a/lib/irb/input-method.rb +++ b/lib/irb/input-method.rb @@ -303,15 +303,20 @@ def show_doc_dialog_proc return nil if result.nil? or pointer.nil? or pointer < 0 name = doc_namespace.call(result[pointer]) + show_easter_egg = name.match?(/\ARubyVM/) && !ENV['RUBY_YES_I_AM_NOT_A_NORMAL_USER'] options = {} options[:extra_doc_dirs] = IRB.conf[:EXTRA_DOC_DIRS] unless IRB.conf[:EXTRA_DOC_DIRS].empty? driver = RDoc::RI::Driver.new(options) if key.match?(dialog.name) - begin - driver.display_names([name]) - rescue RDoc::RI::Driver::NotFoundError + if show_easter_egg + IRB.__send__(:easter_egg) + else + begin + driver.display_names([name]) + rescue RDoc::RI::Driver::NotFoundError + end end end @@ -372,16 +377,18 @@ def show_doc_dialog_proc end formatter = RDoc::Markup::ToAnsi.new formatter.width = width - if name =~ /\ARubyVM/ and not ENV['RUBY_YES_I_AM_NOT_A_NORMAL_USER'] + dialog.trap_key = alt_d + mod_key = RUBY_PLATFORM.match?(/darwin/) ? "Option" : "Alt" + if show_easter_egg type = STDOUT.external_encoding == Encoding::UTF_8 ? :unicode : :ascii - contents = IRB.send(:easter_egg_logo, type).split("\n").take(preferred_dialog_height) + contents = IRB.send(:easter_egg_logo, type).split("\n") + message = "Press #{mod_key}+d to see more" + contents[0][0, message.size] = message else - dialog.trap_key = alt_d - mod_key = RUBY_PLATFORM.match?(/darwin/) ? "Option" : "Alt" message = "Press #{mod_key}+d to read the full document" contents = [message] + doc.accept(formatter).split("\n") - contents = contents.take(preferred_dialog_height) end + contents = contents.take(preferred_dialog_height) y = cursor_pos_to_render.y Reline::DialogRenderInfo.new(pos: Reline::CursorPos.new(x, y), contents: contents, width: width, bg_color: '49')