MacでどこででもRubyを使うには

選択した文字列を Ruby スクリプトとして実行してくれる環境を作る手順。

返値が欲しい!

先人が示してくれた Automator を使ってみると、スクリプト自身で "print" や "puts" などを使って、結果をわざわざ出力しないといけないことが分かる。
わたしは irb や pry のように返値を返してほしいんだ!
あと -Ku というオプションが嫌いなので無くしたい*1。そしてシステムじゃなく rbenv で指定している Ruby を使って実行したい。

返値を返すように作ってみたので手順込みで説明( rbenv 利用版)

  • Automator を起動
  • 新規スクリプトを作成し「サービス」を選択
  • ウィンドウ上部にある「"サービス"は、次の選択項目を受け取る:」プルダウンメニューから「テキスト」を選択、「検索対象:」プルダウンメニューから「すべてのアプリケーション」を選択
  • 左側にライブラリが表示されていない場合には「ライブラリを表示」を押してライブラリを表示させる
  • アクション>ライブラリ>ユーティリティにある「シェルスクリプトを実行」を右側の「ワークフローを作成するには、ここにアクションまたはファイルをドラッグしてください」とある部分にドラッグ&ドロップ
  • ウィンドウ上部の「選択されたテキストを出力で置き換える」にチェック
  • シェルスクリプトを実行」区画で「シェル」を「/bin/bash」など通常使用しているシェルを指定、「入力の引き渡し方法:」を「stdin へ」を選択
  • 以下のスクリプトを入力(なお bash を使っています。zshなど他のシェルを使っているならば一行目をそれに合わせてください)
source ~/.bashrc
export PATH="~/.rbenv/shims:$PATH"
ruby -e "eval(STDIN.read).tap{ |s| print s }" 2>&1 || echo

ここまで設定し終えるとこうなります。

  • 適当な名前を付けて保存(私はexec_rubyとしました)

システムの Ruby 利用版

Automator の設定準備は上と同じです。

ruby -Kue "eval(STDIN.read).tap{ |s| print s }" 2>&1 || echo

  • 適当な名前を付けて保存(私はexec_rubyとしました)

使い方

エディタなどで書いた Ruby スクリプトを指定してコンテキストメニューから先ほどの保存名を選択すると実行されます。
ショートカットキーで実行したい場合は、先人の教えに従って設定してください。


前半:("あ".."ん").map.with_index(0) { |n,i| "#{n}: #{i}" }
irb などと同様に、puts 無しでも返値が見れます。
後半:("あ".."ん").map.with_index(0) { |n,i| puts "#{n}: #{i}" }
puts を付けると、 puts の返値 nil がくっついてきます。

個人的にはかなり満足

普段は pry を使っているので、puts などを書かなくても返値が表示されることに慣れています。なので結果を返すためにいちいち print とか書く習慣が無いのです。ので、この Automator だと普段の使い方にフィットします。

問題点

rbenv の Ruby を使う場合には起動に若干時間がかかります。なので(個人的には残念ですが)システムの Ruby を使った方が良さそうです。

お断り

この Automator および実行した Ruby スクリプトで生じた損害は負いません。変なスクリプトは実行しないでくださいね!

*1:-Ku はバージョン1.8以前の遺物です。1.9以降であればデフォルト文字コードは環境に応じて変更してくれます。ただし、Automator では環境がユーザでは無く root 的なので、-Ku なしで日本語などを使うとエラーになります。