summaryrefslogtreecommitdiff
path: root/lib/irb/input-method.rb
diff options
context:
space:
mode:
authoraycabta <[email protected]>2021-08-29 20:04:23 +0900
committergit <[email protected]>2021-08-29 20:29:54 +0900
commitae4e301d5d180251e8e8b70437e078b61aa0f42e (patch)
treeb764c3fedcdb8e5280564d7a99dab7f988b1513e /lib/irb/input-method.rb
parenta615885f1e87f4bfbc5398b060fd3a64d5de8c4a (diff)
[ruby/irb] Add show doc dialog for Reline
https://github.com/ruby/irb/commit/026700499d
Diffstat (limited to 'lib/irb/input-method.rb')
-rw-r--r--lib/irb/input-method.rb42
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb
index 1854567a2d..1e4132ca6f 100644
--- a/lib/irb/input-method.rb
+++ b/lib/irb/input-method.rb
@@ -14,6 +14,7 @@ require_relative 'magic-file'
require_relative 'completion'
require 'io/console'
require 'reline'
+require 'rdoc'
module IRB
STDIN_FILE_NAME = "(line)" # :nodoc:
@@ -308,6 +309,46 @@ module IRB
@auto_indent_proc = block
end
+ SHOW_DOC_DIALOG = ->() {
+ begin
+ require 'rdoc'
+ rescue LoadError
+ return nil
+ end
+ if just_cursor_moving and completion_journey_data.nil?
+ return nil
+ end
+ cursor_pos_to_render, result, pointer = context.pop(3)
+ return nil if result.nil? or pointer.nil?
+ name = result[pointer]
+
+ driver = RDoc::RI::Driver.new
+ name = driver.expand_name(name)
+ doc = nil
+ used_for_class = false
+ if not name =~ /#|\./
+ found, klasses, includes, extends = driver.classes_and_includes_and_extends_for(name)
+ if not found.empty?
+ doc = driver.class_document(name, found, klasses, includes, extends)
+ used_for_class = true
+ end
+ end
+ unless used_for_class
+ doc = RDoc::Markup::Document.new
+ begin
+ driver.add_method(doc, name)
+ rescue RDoc::RI::Driver::NotFoundError
+ doc = nil
+ end
+ end
+ return nil if doc.nil?
+ formatter = RDoc::Markup::ToAnsi.new
+ formatter.width = 40
+ str = doc.accept(formatter)
+
+ [Reline::CursorPos.new(cursor_pos_to_render.x + 40, cursor_pos_to_render.y + pointer), str.split("\n"), nil, '49']
+ }
+
# Reads the next line from this input method.
#
# See IO#gets for more information.
@@ -316,6 +357,7 @@ module IRB
Reline.output = @stdout
Reline.prompt_proc = @prompt_proc
Reline.auto_indent_proc = @auto_indent_proc if @auto_indent_proc
+ Reline.add_dialog_proc(:show_doc, SHOW_DOC_DIALOG, Reline::DEFAULT_DIALOG_CONTEXT)
if l = readmultiline(@prompt, false, &@check_termination_proc)
HISTORY.push(l) if !l.empty?
@line[@line_no += 1] = l + "\n"