Skip to content

Commit

Permalink
[DRAFT] - Add copy command
Browse files Browse the repository at this point in the history
Closes ruby#753
  • Loading branch information
Prajjwal committed Dec 11, 2024
1 parent 8241ec9 commit 565421b
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 0 deletions.
69 changes: 69 additions & 0 deletions lib/irb/command/copy.rb
Original file line number Diff line number Diff line change
@@ -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

4 changes: 4 additions & 0 deletions lib/irb/default_commands.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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]
)
Expand Down

0 comments on commit 565421b

Please sign in to comment.