diff --git a/lib/irb/command/copy.rb b/lib/irb/command/copy.rb new file mode 100644 index 000000000..53288db3f --- /dev/null +++ b/lib/irb/command/copy.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +require 'mkmf' + +module IRB + module Command + class Copy < Base + category "TODO" + description "TODO" + + help_message(<<~HELP) + Usage: copy (input) + HELP + + def execute(arg) + output = irb_context.workspace.binding.eval(arg) + + if clipboard_available? + copy_to_clipboard(output) + puts "Copied to system clipboard" + else + temp_file = write_to_tempfile(output) + puts "Wrote: #{temp_file}" + end + rescue StandardError => e + warn "Error: #{e}" + end + + private + + def copy_to_clipboard(text) + IO.popen(clipboard, 'w') do |io| + io.write(text) + end + + raise "IOError" unless $? == 0 + end + + def write_to_tempfile(text) + file = Tempfile.new + file.write(text) + file.close + file.path + end + + def clipboard + case RbConfig::CONFIG['host_os'] + when /darwin/ + # This is the most reliable, but we could probably also offload this + # to the shell to avoid MkMf logs + MakeMakefile.find_executable('pbopy') + when /linux/ + MakeMakefile.find_executable('xclip').tap do |path| + path << '-selection clipboard' + end + when /mswin|mingw/ + 'clip' # => todo verify this works + else + nil + end + end + + def clipboard_available? + !!clipboard + end + end + end +end + diff --git a/lib/irb/default_commands.rb b/lib/irb/default_commands.rb index 768fbee9d..4736abfa4 100644 --- a/lib/irb/default_commands.rb +++ b/lib/irb/default_commands.rb @@ -9,6 +9,7 @@ require_relative "command/chws" require_relative "command/context" require_relative "command/continue" +require_relative "command/copy" require_relative "command/debug" require_relative "command/delete" require_relative "command/disable_irb" @@ -200,6 +201,9 @@ def load_command(command) _register_with_aliases(:irb_continue, Command::Continue, [:continue, NO_OVERRIDE] ) + _register_with_aliases(:irb_copy, Command::Copy, + [:copy, NO_OVERRIDE] + ) _register_with_aliases(:irb_finish, Command::Finish, [:finish, NO_OVERRIDE] )