Jello

Because everybody likes "paste & jello" sandwiches, right? I know I did when I was a kid.

Jello is a simple library to watch the OS X pasteboard and do something on every paste.

require 'jello'

Jello::Mould.new do |paste|
  system "say 'You pasted #{paste}'"
end

Jello.start!

For example, to watch for URLs copied, and then shorten the URL and replace the long URL with the shortened one, write a short mould like the following:

require 'open-uri'
require 'jello'

Jello::Mould.new do |paste|

  if paste =~ %r{^http://.*}
    uri = $&
    uri.gsub! /#/, '%23'
    unless uri =~ %r{^http://bit.ly}
      shortener = 'http://bit.ly/api?url=' + uri
      open(shortener).gets.chomp
    else
      nil
    end
  end

end

Jello.start! :verbose => true

Moulds can even be stacked:

require 'jello'

Jello::Mould.new do |paste|
  paste += '123'
end

Jello::Mould.new do |paste|
  paste += '456'
end

Jello.start! :verbose => true

Jello also provides a binary - if you have some moulds you use often, you can throw them in your ~/.jello/ folder (as .rb files), and then run jello with them:

# Assuming ~/.jello/ contains foo.rb, bar.rb, and gaz/{one,two}.rb
$ jello foo bar gaz
# Now foo.rb, bar.rb, one.rb, and two.rb would be executed on incoming
# pastes

You can also use pasteboards other than the general one (see man pbcopy for more information about this):

require 'jello'

Jello::Mould.new do |paste|
  paste.gsub! /abc/, 'def'
end

Jello.start!

Finally, you can create a Jello property list for launchd that will keep jello running all the time, even after you restart. Just run rake launchd from the Jello distribution directory. (This requires that you install the LaunchDoctor gem first!)