ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

ひとりぶろぐのmoyashi (@hitoriblog) です。

TextExpanderって便利。

だって、シェルスクリプトを実行できるんですもの。

TextExpander for Mac App
カテゴリ: 仕事効率化
価格: ¥3,000

テキストを入力している最中に、突然シェルスクリプトを実行できます。

Ruby+TextExpander

TextExpanderには、AppleScriptやシェルスクリプトを実行し、その結果をカーソル位置に挿入する機能があります。

シェルスクリプトとはいっても、/bin/shで実行するだけではありません。

冒頭にシェバング行を書いておくと、任意のインタプリタにスクリプトを実行させることができます。

スニペットを登録する際に、ContentでShell Scriptを選択。

中身は普通にスクリプトを書いてしまえばOK。

スクリプトからの標準出力がカーソル位置に挿入される寸法です。

Skitched 20120716 205417

ここではRubyを指定していますが、Pythonでも何でもOK。

単純に実行するだけだと、やれることに限界が出てきます。

やっぱし引数を取りたいし、クリップボードのテキストを渡したい。(続きは[Read More]から)

クリップボードのテキストを渡す

クリップボードのテキストは以下のように取得。


#!/usr/bin/env ruby

$KCODE = 'u'

require 'osx/cocoa'
include OSX

pb = NSPasteboard.generalPasteboard.stringForType(NSStringPboardType).to_s

puts pb

「%clipboard」マクロを後述のヒアドキュメント内に置いておくのでも構いません。

引数を渡す

毎度違う条件でスクリプトを実行したいことがあります。

そんな場合は、ファイルイン(フィルイン?)機能を使います。

Skitched 20120717 001552

ヒアドキュメントの中にファイルインを置いて、そこで入力を促すわけです。フィールド名は、自分が分かりやすいものを付けることができます。

この場合、単線フィールドで入力した文字には改行が含まれているので、chompメソッドで削除しています。


#!/usr/bin/env ruby

$KCODE = 'u'

arg1 = <

これを実行すると以下の通り。開始時にテキスト入力ができ、それを元にスクリプトを実行できるのですね。

Skitched 20120717 002102

やや見てくれがいただけませんが、これで目的は果たせます。

Tab、Shift+Tabでフィールド間を行き来できます。OKボタンを押さずとも、Enterで確定、Escでキャンセルできます。

スクリプトが長くなると困ったことになるので、引数を取る部分以外のスクリプト本体は別ファイルに分けてloadする感じでしょうか。


load File.join(ENV['HOME'], "Dropbox/TextExpander", "hontai.rb")

ヒアドキュメントを使わず、以下のように変数に代入してしまうと、ダブルクォーテーションを含む文字等を入力したときにエラーとなってしまいます。


#!/usr/bin/env ruby

$KCODE = 'u'

arg1 = "%filltext:name=引数1%"
arg2 = "%filltext:name=引数2%"

puts "#{arg1.chomp} ---- #{arg2.chomp}"

巨大なテキストを扱う

TextExpanderのシェルスクリプト実行機能は、出力されるテキストが大きいとうまくいかなくなるようです。

出力が巨大になることが予想される場合は、以下のような手法を採用します。


#!/usr/bin/env ruby

$KCODE = 'u'

require 'osx/cocoa'
require 'kconv'
include OSX

def pbcopy(str)
p = NSPasteboard.generalPasteboard
p.declareTypes_owner([NSStringPboardType], self)
p.setString_forType(str.toutf8, NSStringPboardType)
end

def paste(str)
pbcopy(str)
scpt = <

スクリプトの中でテキストをクリップボードにコピーし、カーソル位置へのテキストの挿入は、キー入力の「Command+V」つまりクリップボードのペースト経由でやるのです。

Rubyの中でAppleScriptを実行しています。

デバッグ

動作がおかしいときは、Console.appのメッセージを見ましょう。

/Applications/ユーティリティ/コンソール.app

便利なメソッド

使いそうなメソッドを書いてみました。

Chromeの最前面のウインドウの最前面のタブのタイトルとURLを取得するメソッド。


#!/usr/bin/env ruby

$KCODE = 'u'

require 'osx/cocoa'
require 'kconv'
include OSX
OSX.require_framework 'ScriptingBridge'

def chrome_info()
chrome = OSX::SBApplication.applicationWithBundleIdentifier_("com.google.Chrome")
activeTab = chrome.windows[0].activeTab
return {"title" => activeTab.title.to_s, "url" => activeTab.URL.to_s}
end

ハッシュで取得できます。


>> chrome_info()
=> {"title"=>"Google", "url"=>"https://www.google.co.jp/"}

ウインドウ、タブの存在判定はやっていません。

同じくSafari。


#!/usr/bin/env ruby

$KCODE = 'u'

require 'osx/cocoa'
require 'kconv'
include OSX
OSX.require_framework 'ScriptingBridge'

def safari_info()
safari = OSX::SBApplication.applicationWithBundleIdentifier_("com.apple.safari")
currentTab = safari.windows[0].currentTab
return {"title" => currentTab.name.to_s, "url" => currentTab.URL.to_s}
end

ハッシュで取得できます。Chrome同様、ウインドウ、タブの存在判定はやっていません。


>> safari_info()
=> {"title"=>"Google", "url"=>"https://www.google.co.jp/"}

Firefoxのバカチンは、URLの取得等が簡単にはできません。

だれも望まない高速リリースといい、空気が読めていないブラウザです。

できないことはないんですが、URLを取得するためにタスクスイッチする必要があったりで不安定な動作となるので、ここでは取り上げません。

いろいろやってみよう

これまで見てきたように、TextExpanderはテキスト入力中に突然Rubyスクリプトを実行、カーソル位置に実行結果を挿入できてしまうわけです。

これはたまらん。

TextExpanderのファイルイン(フィルイン?)とスクリプト実行機能を組み合わせると、便利なことができそうです。

ファイルイン機能を、スクリプトの簡易UIとして使えるのです。

ぜひ活用してみてくだしあ。

TextExpander for Mac App
カテゴリ: 仕事効率化
価格: ¥3,000

 - AppleScript, OS X, Ruby