mirror of
https://github.com/ruby/ruby.git
synced 2025-09-17 01:23:57 +02:00

launch
(https://github.com/ruby/irb/pull/1040)
* Quickly show inspect preview even if pretty_print takes too much time
* Show a message "Inspecting..." while generating pretty_print content
* Update inspecting message
Co-authored-by: Stan Lo <stan001212@gmail.com>
* Update rendering test for preparing inspect message
* Don't show preview if pretty_print does not take time
---------
03c36586e6
Co-authored-by: Stan Lo <stan001212@gmail.com>
63 lines
1.6 KiB
Ruby
63 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module IRB
|
|
module Command
|
|
class Copy < Base
|
|
category "Workspace"
|
|
description "Copy command output to clipboard"
|
|
|
|
help_message(<<~HELP)
|
|
Usage: copy [command]
|
|
HELP
|
|
|
|
def execute(arg)
|
|
# Copy last value if no expression was supplied
|
|
arg = '_' if arg.to_s.strip.empty?
|
|
|
|
value = irb_context.workspace.binding.eval(arg)
|
|
output = irb_context.inspect_method.inspect_value(value, +'', colorize: false).chomp
|
|
|
|
if clipboard_available?
|
|
copy_to_clipboard(output)
|
|
else
|
|
warn "System clipboard not found"
|
|
end
|
|
rescue StandardError => e
|
|
warn "Error: #{e}"
|
|
end
|
|
|
|
private
|
|
|
|
def copy_to_clipboard(text)
|
|
IO.popen(clipboard_program, 'w') do |io|
|
|
io.write(text)
|
|
end
|
|
|
|
raise IOError.new("Copying to clipboard failed") unless $? == 0
|
|
|
|
puts "Copied to system clipboard"
|
|
rescue Errno::ENOENT => e
|
|
warn e.message
|
|
warn "Is IRB.conf[:COPY_COMMAND] set to a bad value?"
|
|
end
|
|
|
|
def clipboard_program
|
|
@clipboard_program ||= if IRB.conf[:COPY_COMMAND]
|
|
IRB.conf[:COPY_COMMAND]
|
|
elsif executable?("pbcopy")
|
|
"pbcopy"
|
|
elsif executable?("xclip")
|
|
"xclip -selection clipboard"
|
|
end
|
|
end
|
|
|
|
def executable?(command)
|
|
system("which #{command} > /dev/null 2>&1")
|
|
end
|
|
|
|
def clipboard_available?
|
|
!!clipboard_program
|
|
end
|
|
end
|
|
end
|
|
end
|