CotEditorからjavascript(JXA)経由でperlへ

CotoEditorで昨日書いたapplescriptと同じことをするjavascript(JXA)を書いたのでメモ。
YosemiteからはOS標準でJavaScript for Automation (JXA)が使えるようになった。
歴史的な流れとしては、HyperCardのHyperTalkからapplescriptへ、applescriptからjavascriptへということらしい。これらは乱暴に理解すると、unixでのシェルスクリプトやWINDOWSのバッチファイルみたいなもの、か。いや、macのことはよく知らない。
こちら、『JavaScript for Automation (JXA)』鳶嶋工房がとても参考になった。
これからはjavascriptだというし、初めてでよくわからなかったapplescriptよりは多少いじったこともあるjavascriptの方がたぶん早いだろうと、昨日applescirptで書いたばかりだけど、javascriptで書き直した。
ここんとこいじってるスクリプト、マクロはxyzzyもCotEditorのスクリプトも身も蓋もない言いかたをすると「シェルに渡すためのコマンドライン文字列を生成するだけ」のもの。
実際の作業はperlのスクリプトが担当なのでマクロやスクリプトでは難しいことは何もしていない。
javascirpt(JXA)版スクリプト
ObjC.import(stdlib);
var home = $.getenv(HOME);
var myScript = home + "/Documents/_script/_coteditor-tmp.pl";
var app = Application("CotEditor");
app.includeStandardAdditions = true;
var filepath = app.document.file()[0];
var buffer = app.document.selection.contents()[0];
var input = "";
if(buffer != ""){
input = app.displayDialog("[D][T][E]", {withTitle:Op, defaultAnswer:""}).textReturned;
}
var cmd = "";
if(buffer != "" && input != ""){
cmd = "echo " + buffer + " | " + myScript + " " + input;
}
else if(filepath != ""){
cmd = myScript + " " + filepath
}
// do shell script
var doscript = Application.currentApplication();
doscript.includeStandardAdditions = true;
var ret = doscript.doShellScript( cmd );
var doc = app.Document({name:"*scratch*"});
app.documents.push(doc);
doc.text = ret;
app.activate();
CotEditorのスクリプトとして使うには
・ファイル名(拡張子)「.js」
・ファイルの一行め「#!/usr/bin/osascript -l JavaScript」
この2点が必要。
https://twitter.com/CotEditor/status/640957579905007616
HOMEディレクトリ(のpath)を取得するのに、わざわざstdlib使うのって大袈裟な感じやな、とか思ったりしつつ、アプリをいじるための呪文
var app = Application("CotEditor");
app.includeStandardAdditions = true;
を入れてプロパティを調べるぐらいで、後はほんとJavascript。
わたしの慣れの問題で当たり前の話、applescriptよりJavascirptの方が格段にわかりやすい。わからないところ・書き方などはJXAというかJavascirptで検索すれば情報豊富で解決も早い。
今回、macの「スクリプトエディタ.app」が手軽・便利で大助かりだった。変数に何が入ってるのかを見られたり、エラーチェックできて、こんなアプリがあったとはちょっとした発見&驚き(今さら感)
ただ、残念なことに、このJavascript版はosascriptで使うと
warning: failed to get scripting definition from /usr/bin/osascript; it may not be scriptable.
という警告が毎回出てしまう。いちいちコンソールが出て警告されるのは鬱陶しいけどしかたがないらしい。
こちらが参考になった→『JXAの「Error: A privilege violation occurred」の回避』
せっかくだけど、昨日のapplescriptはお蔵入り・塩漬けだなあ。


