Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How might I pass text data from the ruby console into my clipboard without saving to a file?

Tags:

I'm trying to pass the array contained in a global variable I've created into my clipboard on my mac.

It is very long so I don't want to highlight, copy & paste on my console.

I want to use embedded unix code, specificially the pbcopy function for the mac laptop console that allows me to pass text into my computers clipboard, ready to paste.

Were I to do this with a file-save, I'd do something like this (in ruby):

stringdata = <<blah blah blah process, lets say it failed and the progress data is stored in this variable so we can skip forward to where the script screwed up in a process when we start up and handle the error instance(s)>> File.open("temp.txt"){|f| f.write(stringdata)} `cat temp.txt | pbcopy` 

But could I possibly do this without creating a temporary file?

I'm sure this is possible. All things in text are possible. Thanks in advance for the solution

like image 664
boulder_ruby Avatar asked Dec 03 '14 00:12

boulder_ruby


2 Answers

You can just echo it instead if there are no newline characters in the string; otherwise, use the IO class.

Using echo:

system "echo #{stringdata} | pbcopy" 

OR

`echo #{stringdata} | pbcopy` 

Ruby will then just rip the text from memory, inject it into the shell command which opens a pipe between the echo and pbcopy processes.

Using the IO class:

If you want to do it the Ruby way, we simply create a pipe with pbcopy using the IO class. This creates a shared files between the processes which we write to, and pbcopy will read from.

IO.popen("pbcopy", "w") { |pipe| pipe.puts "Hello world!" }

like image 193
ianks Avatar answered Oct 18 '22 17:10

ianks


Here's a simple one-line method you can paste into your IRB console:

def pbcopy(arg); IO.popen('pbcopy', 'w') { |io| io.puts arg }; end 

Once it's defined you can simply do

pbcopy stringdata 

or copy the result of the last command with

pbcopy _ 

Of course, you can also put the method definition in an initializer or something, such as .irbrc or .pryrc if you use pry. Here's a prettier and slightly more intelligent version:

def pbcopy(arg)   out = arg.is_a?(String) ? arg : arg.inspect   IO.popen('pbcopy', 'w') { |io| io.puts out }   puts out   true end 
like image 30
linesarefuzzy Avatar answered Oct 18 '22 18:10

linesarefuzzy