日本語情報が少なかったのでまとめました。
https://itunes.apple.com/jp/app/textexpander-3-+-custom-keyboard/id917416298?mt=8&uo=4&at=11lqq9
JavaScriptスニペット利用方法
- 通常のスニペット登録画面を開き「Content: (Plain)」内でホールドしてコピーメニューを出します。
- コピーメニュー(の一番右)から「JavaScript」を選択すると見出しが「Content: (JavaScript)」に変化します。
- JavaScriptのソースコードを登録すると、通常のスニペットと同様の方法でJavaScriptの実行結果を展開できます。
ソースコードの書き方
基本的には最後に書いた文が展開されます。
"Java" + "Script" + " result"; // JavaScript result
TextExpander.appendOutput()を使うと複数回に分けて出力結果に追加できます。
TextExpander.appendOutput("Java"); TextExpander.appendOutput("Script"); TextExpander.appendOutput(" result"); // JavaScript result
マクロとの併用
JavaScriptの実行結果にマクロ(%を使ったスニペット)が含まれていればマクロも実行されます。
'%Y.%m.%d'; // 2015.01.01(※展開した時点の日付)
日時に関するマクロの参考:https://smilesoftware.com/help/TextExpander/datetime.html
JavaScriptとfill-inを併用した場合、展開した際に入力欄を伴ったソースコードが表示されます。
入力欄に値を入力してOKボタンを押すと入力後の状態のソースコードが実行されます。
(後述のTextExpander.filledValuesも参照)
a = '%filltext:name=hoge%'; // 「a = '入力欄に入力した値';」が実行される
発展的なマクロ(クリップボード、fill-in、カーソル位置、カーソル操作、展開時デリミタ要否設定、タブキーなど)の参考:https://smilesoftware.com/help/TextExpander/specials.html
TextExpanderオブジェクトのプロパティ
TextExpanderオブジェクトにはappendOutputの他にもプロパティがあります。*1
参考:Working With AppleScript and Shell Script Snippets – TextExpander
appendOutput
先述の通り、出力結果に追加します。
ignoreOutput
出力結果に何も出力したくない場合trueを設定します(初期値はfalse)。
例えば時刻を設定するだけのスニペットを作りたい場合などに使えます。
TextExpander.ignoreOutput = true // 出力結果なし
triggeringAbbreviation
Abbreviation(スニペット名、スニペット編集画面の上側に入力する展開元文字列)を取得します。
TextExpander.triggeringAbbreviation; // Abbreviationで指定した文字列
baseDate
展開した時点での日時を取得します。
TextExpander.baseDate; // Thu Jan 01 2015 12:34:56 GMT+0900 (JST)
またDate型のメソッドが使えます。
TextExpander.baseDate.getFullYear(); // 2015
adjustedDate
マクロの日時を設定します(初期値はbaseDate)
TextExpander.adjustedDate = (new Date()).setDate(TextExpander.baseDate.getDate() + 3); // 日付を3日進める '%Y.%m.%d'; // 2015.01.04
またスニペットのネストを利用すると他のスニペットで利用できます。
// スニペット名:3Dadd TextExpander.adjustedDate = (new Date()).setDate(TextExpander.baseDate.getDate() + 3); // 日付を3日進める TextExpander.ignoreOutput = true; // 出力結果なし
として他のスニペットで
%snippet:3Dadd% %Y.%m.%d
を登録すると展開結果が2015.01.04となります。
pasteboardText
ペーストボードの文字列を取得します。
TextExpander.pasteboardText; // ペーストボードの文字列
expansionContext
スニペットが展開されたアプリケーションのbundle identifierを取得します。
TextExpander.expansionContext; // スニペットプレビュー画面で展開した場合、com.textexpander.preview // 他のアプリ上でTextExpanderキーボードで展開した場合、group.com.smileonmymac.tetouch
filledValues
fill-inで入力された値を取得します。
a = '%filltext:name=hoge%'; TextExpander.filledValues['hoge']; // hogeの入力欄に入力した値
使用可能なオブジェクト
Working With AppleScript and Shell Script Snippets – TextExpanderによると、OS XではJavaScriptを拡張したJavaScript for Automation (JSA)が使えますが、iOSではPlain old JavaScriptだけだそうです。
具体的にどんなオブジェクトが使えるか判然としなかった調べました。
Object.getOwnPropertyNames(this).sort();
Array,ArrayBuffer,Boolean,DataView,Date,Error,EvalError,Float32Array,Float64Array,Function,Infinity,Int16Array,Int32Array,Int8Array,JSON,Map,Math,NaN,Number,Object,Promise,RangeError,ReferenceError,RegExp,Set,String,SyntaxError,TextExpander,TypeError,URIError,Uint16Array,Uint32Array,Uint8Array,Uint8ClampedArray,WeakMap,console,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,escape,eval,isFinite,isNaN,parseFloat,parseInt,undefined,unescape
文字列操作、数学関数、正規表現、URLエンコードなどローカルで行いたい処理はおおよそ可能です。
一方、windowやXMLHttpRequestなどWEB系のオブジェクトは使えないので外部との通信を行うのは無理そうです。
おわりに
Sample JavaScripts for TextExpander 5.0 / TextExpander touch 3.5 - Smileでは
- スニペット名入力→fill-in→JavaScript実行結果展開
の流れのサンプル(BMI計算、給料計算、簡易計算機、PHQ-9うつ病テスト)が紹介されています。
この他にペーストボードを使えることを利用して
- 文字列選択→カット→スニペット名入力→ペーストボードを使ったJavaScript実行結果展開
の流れも考えられますね。
ただキーボード切り替えが日本語環境ではかなり面倒なので対応アプリと標準キーボードの組み合わせが良さそうです。
参考:TextExpander-Enhanced Apps – TextExpander
*1:紹介されているもの以外で隠しプロパティがあるんじゃないかと探ってみましたが特に見つかりませんでした。参考:JavaScript のオブジェクトのプロパティ一覧を取得する方法とオブジェクトが指定の名前のプロパティをもっているか検査する方法 - ひだまりソケットは壊れない