という訳で、私の環境にも「SayKanji」を導入させて頂きました、ありがとうございます!
さて、今回はこのシェルスクリプトを使わせて頂いて、Macの「.app」形式のアプリケーションを作ってみようと思います。ちなみに、参考にさせて頂いた情報源はコチラです。
- シェルスクリプトを Mac OS X 方式の .app にする方法 [簡単 2 ステップ]
- [Mac OS X] シェルスクリプトとかの CUI アプリケーションを Mac OS X 方式の .app にする方法 [簡単 5 ステップ]
ここで、私が想定しているアプリケーションとは...
- Dockに表示される
- クリップボードが更新された場合、クリップボードの文字列を読み上げる
- シェルスクリプト(saykanji.sh)を作成する
これは、ザリガニが見ていた...。さんのページを参考にして、「saykanji.sh」を作成します。
シェルスクリプトの置き場所は必要に応じて変更する事ができますが、ここでは「/usr/local/bin」以下に置いたと仮定しています。また、適宜「.bash_profile」なども書き換えて、ターミナル上で「saykanji」コマンドがちゃんと動作する事を確認しておくと良いと思います。 - シェルスクリプト(saykanji.sh)を呼び出すAppleScriptを作成する
スクリプトエディタ.appを開いて、例えば、次のようなコードを書きます。
※注意!↓のスクリプトは、ド素人が見よう見まねで書いたヒドイ代物ですですので、ご利用は計画的に!(利用する場合は、末尾もFAQもご覧下さい)
(追記:5/21)コードを修正(動かなかったバージョンのスクリプトをアップしていましたw)
(追記:5/23)Gururiさんに添削して頂きました。次のスクリプトの代わりに、コメント欄にあるGururiさんのスクリプトを利用して下さい!
このスクリプトを保存する時がポイントになります。通常は「フォーマット」の項目に「スクリプト」が選択されていますが、ここで「アプリケーション」(または、「アプリケーションバンドル」)を選択して下さい。set pbstring to ""
set prev_pbstring to ""
repeat
tell application "System Events"
delay 1.0
set pbstring to (clipboard info for string)
if pbstring is not {} then
set pbstring to (the clipboard as string)
if pbstring is not prev_pbstring then
do shell script ". /usr/local/bin/saykanji.sh;saykanji " & "'" & pbstring & "'"
set prev_pbstring to pbstring
end if
end if
end tell
end repeat
(追記:5/23)Gururiさんのスクリプトを利用する場合、「実行後、自動的に終了しない」にもチェックを付けると、正常にアプリケーションが終了するようになります。
↑スクリプトエディタの保存画面 - アイコン(icnsファイル)を作成する
Dockに表示させるからには、アイコンも設定しておきたいですよね。その場合は、icnsファイルが必要になります。png形式などの画像からicnsファイルを作成するには、「Img2icns」というアプリケーションを利用するのがオススメです。(デスクトップ用のアイコンならFree版でも作成可能です)
↑Img2icnsの画面
アイコンで使用する画像をドロップして、1ボタンでicnsファイルが生成されます。 - SayKanji.appにアイコンを設定する
Finder上で、2.で作成した「SayKanji.app」を右クリック→「情報を見る」を選択します。(Command+IキーでもOK)表示された情報画面の左上の表示されている標準アイコンの場所に、3.で作成したicnsファイルをドロップします。
↑SayKanji.appの情報画面
ここでアイコンを変更する事ができる。 - SayKanji.appを起動する
起動すると、こんな感じでDock上に表示されます。文字列をコピー(Command+Cキー)すると読み上げてくるアプリケーションが出来上がりました。
(FAQ)
2.で紹介したAppleScriptには、いくつか問題があります。
- 終了しない!
→ アクティビティモニタなどから「強制終了」して下さい。 - 落ちる!
→ 「<」、「>」等、苦手な文字があるようです。
2 件のコメント:
> という訳で、素敵なアプリケーションに書き換えてくれる方を募集しています!
という訳で、AppleScriptの添削に来ました:-)
以下のスクリプトを「実行後、自動的に終了しない」にチェックを入れて保存すれば、ちゃんと終了できるアプリケーションになります。ついでにクリップボードの中身をコマンドに渡す時にquoted form of を使えば、直接渡せない文字列をエスケープしてくれますので付け加えておきました。これはサービス。on idleの最後のreturnに渡す数字を変更すると、idleハンドラを実行する間隔が変わります。
ちなみにSayKanjiをまだ導入してないのでSayKanaでしか試してませんが、たぶん動くはずです:-)
--ここから
property prev_pbstring : ""
--こいつは繰り返し使うのでpropertyにしてあります
on run
set prev_pbstring to ""
--property prev_pbstringの初期化をします。起動した時に実行。
end run
on idle
--自動的に終了しないときに実行されます。
local pbstring
--こいつはこのハンドラの中でしか使わないのでローカル変数にしてあります。
tell application "System Events"
if ((clipboard info for string) is not {}) then
set pbstring to (the clipboard as string)
if pbstring is not prev_pbstring then
try
--エラーが起きた時にはon errorとend tryの間に書かれたスクリプトが実行されます。
do shell script ". /usr/local/bin/saykanji.sh;saykanji " & (quoted form of pbstring)
set prev_pbstring to pbstring
on error errMsg number errNum
--エラー時のメッセージがerrMsgに、エラー番号がerrNumに入ってます。
--エラーが発生した時にしたい処理をここに書くと良いです。
end try
end if
end if
end tell
return 1
--最後のreturnで返す数字で、何秒後にon idle〜end idleを実行するか決まります。
end idle
--ここまで
Gururiさん、添削ありがとうございます!
コチラの環境で、saykanji.shでも動作する事を確認しました。お陰様で、私がイマイチだな〜と思っていた箇所が全て解消されました。
また、コメントでの解説が親切で、とても勉強になりました。本当にありがとうございました!
コメントを投稿