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)版スクリプト
CotEditorのスクリプトとして使うには
・ファイル名(拡張子)「.js」
・ファイルの一行め「#!/usr/bin/osascript -l JavaScript」
この2点が必要。
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はお蔵入り・塩漬けだなあ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
CotEditorからapplescript経由でperlへ

applescriptというのを初めて触ってみた。
平文でわかりやすいシェルスクリプトて感じ、かな。
WINDWOSのxyzzyでやってるのと同じこと、ほぼ近いことをmacのCotEditorでもやりたい、ということでスクリプトメニューにperlのスクリプトを登録。これは気軽手軽に思ったことができるのでありがたい。外部のスクリプト、perlじゃなくてもrubyやphp、シェルスクリプトが使えるなら万能だ。
ということでやってたんだけど。
外部スクリプトはひとつにして、スクリプト内で処理を振り分けたい。処理単位でスクリプトを作ってスクリプトメニューに登録するとキリがない。それには対話的にユーザー入力をスクリプトで受け取りたい。ユーザーが入力したテキストでも処理を振り分けたい。
→ユーザーの入力を受け取る仕組みが必要。
CotEditorが外部スクリプトの処理した内容を受けとるのは編集中のテキスト上か、あるいは使わないかの2択だけど、外部スクリプトは必ずしもフィルタ的な用途だけじゃない。処理した結果(出力内容じゃなくて、戻り値みたいなもの)を受け取って確認するだけ、とか、選択範囲を処理してその部分をWEBの管理ページにペーストするだけ、とか、できれば元テキストはそのままの状態にしておいて欲しいということもある。
→作業用の新規ドキュメントがあれば助かる。
どちらも、perlやシェルスクリプトなどの外部スクリプトではちょっと難しそう。ていうか、スクリプト側からではアクセスできないこと、かな。
なので、ちょっと調べてみた。
applescriptを使えば、ユーザー入力を取得するdialogを出せる、CotEditorに新規ドキュメントを開くように言うこともできる。
1)テキストに選択範囲があったらば。
dialogを出して、選択範囲のテキストに対してどんな処理をするのか指示を受けとる。
スクリプトに入力されたテキストを引数として渡す。選択範囲のテキストはechoで出力してパイプでスクリプトに流しこむ。
2)選択範囲がなかったら。
ファイル名、パスを見てどんな処理をするのか判断する。
スクリプトにはフルパスのファイル名を引数として渡す。
どちらの場合も出力先は新規ドキュメント「名称未設定」とする。
ごそごそ調べて書いたapplescirpt
↑これを「util-perl.@p.applescript」という名前にして、「~/Library/Application Support/CotEditor/ScriptMenu」フォルダに入れておけばCotEditorで作業していていつでも呼び出せる。
自分環境・自分作業内容に特化したスクリプトで、誰にとっても有用・便利に使えるものではないけど、applescriptにはまったく馴染みがないので、備忘録としてメモしておこう。
明日にはもう忘れているであろう自分のためにもメモが必要なのだ。
[09/07 20:56:44]ちなみに。
applescriptの「do shell script」はスクリプトの標準出力を取得している。
たとえば、perlのスクリプトチェックの「perl -wc」は標準エラー出力。applescriptに出力させるには標準エラー出力(STDERR)を標準出力(STDOUT)に向けてやる必要がある。
perlのスクリプトの中で
open STDERR, ">&", *STDOUT
この1行を該当するサブルーチンに入れておく必要がある。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
CotEditorのスクリプトメニュー

xyzzyに身体が馴染み過ぎていて、エディタが必要な作業の場合は普段使いのmacからWINDOWSに移動している。
macでは最初Emacsを使ってたんだけど、なんか大袈裟だし日本語の表示が乱れたりしたこともあったので(mac統合環境の上でEmacs統合環境を立ち上げる、てな感じだしなあ)、miとCotEditorをインストールしてみて、とりあえず最新版が新しい方、CotEditorを使うことにした。
とはいえ、どうせエディタ作業はWINDOWSでxyzzyでやるし、てきとーでいいか、と放置状態。
先日、xyzzyについての雑記で、編集中のバッファを外部コマンドに渡して処理結果を受けとり編集中のバッファを書きかえる、とか、クリップボードにコピーする、なんてことを書いていて(https://t2aki.doncha.net/?id=1440225861)、CotEditorのスクリプトメニューを思い出した。
本職のプログラマはどんな処理系も使うけど、わたしはド素人なもんで、perlが使えると本当に助かる。ていうか、perl以外はよくわからんし。
CotEditorのスクリプトを使えば外部のコマンドと標準入出力でやりとりできる。シェルスクリプトやperl、php、rubyなんかがCotEditorから使えるのだ。
てことで、調べてみた…って、CotEditorのScriptMenuフォルダにマニュアルがあった。
やるべき設定としては以下の2つ。
【その1】
スクリプトの置き場所とファイル名。
~/Library/Application Support/CotEditor/ScriptMenu/
ファイル名でキーボードショートカットなどを使える。
*. キーボードショートカットは、もう一つの拡張子を追加すれば実装できます。
例 2.
ファイル名 = "Insert String.@e.scpt"
メニュータイトル = "Insert String" + Command + E
スクリプトはchmodで755にしておく必要がある。
【その2】
スクリプトのCotEditor用の書きかた。
冒頭1行目はお約束の「#!/usr/bin/perl」で、それに続けて。
# %%%{CotEditorXInput=xxxx}%%%
# %%%{CotEditorXOutput=xxxx}%%%
この2行。
Input(CotEditorからの入力)のxxxxには
「Selection(選択部分)」
「AllText(ドキュメント全部)」
「None(なし)」
output(スクリプトの出力先)のxxxxには
「ReplaceSelection(選択部分を書きかえる)」
「ReplaceAllText(ドキュメント全部を書きかえる)」
「InsertAfterSelection(選択範囲の後ろに挿入)」
「AppendToAllText(ドキュメントの末尾に追加)」
「Pasteboard(クリップボードにコピー)」
「Discard(出力を使わない)」
設定を把握したら。
まず試しに、編集中のテキスト1行ずつHTMLのPタグをつけてみる。
↑こんなスクリプトを「test.@p.pl」という名前で
「~/Library/Application Support/CotEditor/ScriptMenu/ 」に保存。
スクリプトメニューに「test」というメニューが現われ、キーボードショートカットが「コマンドキー+p」に割り当てられている。
テキトーな文章に
pタグをつける
こんなことは、エディタの置換だけでできるのでわざわざ外部スクリプトにする必要はない。
これの美味しいところは、このスクリプト「test.@p.pl」をその場で書き換えても、エディタの再起動などする必要なく、反映してくれるところ。使い捨てのテキトーなスクリプトのブラックボックスとして利用できる。
これができるなら、macでもエディタをちゃんと使おう。
ちなみに今回ちょっとハマったところがあって。
macのファインダーに「ライブラリ」フォルダなんてないよ!どうすんだよ!CotEditorでスクリプトを書いて保存しようとしたら「ライブラリ」フォルダが出てこなくてビックリだ。いちいちデスクトップなんかに保存してコマンドラインでコピーするわけ?
検索したらば「ファインダー」でホーム画面を開いて「表示」→「表示オプションを表示」→「"ライブラリ"フォルダを表示」にチェック。
macは隠し事が多い、いけすかない野郎だなあ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」