Archive for the 'CotEditor' Category

2011/10/16 CotEditorをAppleScriptから操作する3

オープンソースのテキストエディタ「CotEditor」をAppleScriptから操作するシリーズの第3弾。あくまで基礎的な部分を地道に検証することが重要なので、AppleScriptで非常によく使う「selection」(選択部分)について調べてみました。

CotEditor上で、このように選択した状態で、選択部分のプロパティを取得して、その詳細を調べてみることにします。

cot40.jpg

selectionのプロパティはこのようにして取得できます。

スクリプト名:CotEditorでselectionのプロパティを取得する0
tell application “CotEditor”
  tell document 1
    set aSel to properties of selection
  end tell
end tell
–>

(*
{line range:{1, 2}, class:selection-object, character range:{0, 16}, contents:”てすとだよ
日本語を打つてすと。”}
*)

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

問題はここからです。

まずは、line rangeを取り出してみます。これは、選択部分の行の範囲を取得するというものです。

スクリプト名:CotEditorでselectionのプロパティを取得する1
tell application “CotEditor”
  tell document 1
    set aSel to properties of selection
    
set lineRange to line range of aSel
    
–> {1, 2}
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

次に、character rangeを取得してみましょう。選択部分が何文字目から何文字目までなのかを取得できるはずです。

が……

スクリプト名:CotEditorでselectionのプロパティを取得する2
tell application “CotEditor”
  tell document 1
    set aSel to properties of selection
    
set charRange to character range of aSel
    
  end tell
end tell

–> error “CotEditor でエラーが起きました:range of document 1 を取り出すことはできません。” number -1728 from range of document 1

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

「character range」という予約語がきちんとAppleScriptの処理系に認識されていないようです。そのために、エラーが発生してしまいます。

真面目にcharacter rangeという予約語を生かせる方向に努力するか、あるいは先人(マイクロソフトとかアドビとか)にならって「characterRange」などという、微妙に既存の予約語と重ならないような予約語を作ってみるといいんじゃないでしょうか。

現状のままだと、比較的初心者(中級者ぐらいでも)にとっては、エラーの所在がOSにあるのか、AppleScriptの処理系にあるのか、アプリケーションに存在するのかがまるっきり分かりません。OSは動いているし、アプリケーションも普通に動作していれば、AppleScriptに問題があると考えるのが普通です。ところが、アプリケーション側の対応が不適切なケースが割と多いのが実際のところです。

「AppleScriptが分からない」というつまづきは、こうしたアプリケーション側の「ダメな実装」にも原因が(かなり)あるわけで、古くはCodeWarriorがデフォルトで出力していたAppleScript用語辞書(select tell targetという予約語が入っているのが目印)が、Script対応でないのに辞書が含まれるためAppleScript初心者を惑わせたという歴史的経緯があります。

世界的に有名な(たぶん、世界一)バカ実装では、アドビのIllustrator CS2で、色のR(赤)、G(緑)、B(青)のチャネルを示す属性に「r」「g」「b」という1文字の予約語を割り当てたというものがあります。1文字の変数と衝突して、なかなか問題の所在が分かりませんでした。さすがにこれはCS3で直りましたが、アドビの独創性豊かなバカ実装は、Appleといい勝負だと思います。

最後に、選択部分の内容(contents)を求めてみましょう。

スクリプト名:CotEditorでselectionのプロパティを取得する3
tell application “CotEditor”
  tell document 1
    set aSel to properties of selection
    
set aCon to contents of aSel
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

さすがにこの部分にバグは確認されませんでした。

この確認は、単に「辞書どおりに書いて実行できるかどうか」というレベルの確認であり、長期間連続して処理をするとアプリケーションがクラッシュするとか、そういうレベルの確認ではありません(Photoshop CS3で3日間、5000回ぐらい巨大なJPEGファイルをオープン/クローズしてクラッシュしないか確認したことがありました)。

また、データサイズが小さいときの挙動と大きいときの挙動が違ったり、アプリケーションによってはドキュメントオープン後に内部の状態が安定するまでに時間がかかるようなケースもあるので、そのあたりの様子を見ながらScriptを書くことが重要です。

2011/10/12 CotEditorをAppleScriptから操作する2

オープンソースのテキストエディタ「CotEditor」をAppleScriptから操作するシリーズの続編です。

基礎的な命令を試してみます。documentのプロパティを取得。

スクリプト名:CotEditorでdocumentのプロパティを取得する
tell application “CotEditor”
  tell document 1
    properties
  end tell
end tell
–>

(*
{line ending:LF, line spacing:0.0, coloring style:”なし”, modified:true, alpha only textView:true, transparency:1.0, contents:”てすとだよ
日本語を打つてすと。
Abcdefgh Ijklmn Opqrstu”, name:”名称未設定”, wrap lines:true, class:document, path:missing value, text:”てすとだよ
日本語を打つてすと。
Abcdefgh Ijklmn Opqrstu”, IANA charset:”utf-8″, encoding:”Unicode(UTF-8)”, length:40}
*)

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

いろいろと面白そうなプロパティがあります。では、ウィンドウの透明度を変えてみましょう。

スクリプト名:CotEditorでウィンドウの透明度を変更する1
tell application “CotEditor”
  tell document 1
    set transparency to 1
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

このScriptを実行した状態が以下の画面です。

cot21.jpg

ここから、

スクリプト名:CotEditorでウィンドウの透明度を変更する2
tell application “CotEditor”
  tell document 1
    set transparency to 0.5
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

を実行すると、

cot22.jpg

のように、Script中で指定したとおり透明度が0.5(1.0が完全不透明状態、0が透明状態)になります。

ただし、この透明度の設定が環境設定値と連動していないようで、

cot23.jpg

(一度AppleScriptから透明度の変更を行うと)環境設定の値を変更しても、画面表示は変わりません。また、AppleScriptから設定した透明度がこの環境設定には反映されません。

2011/10/10 CotEditorをAppleScriptから操作する

日本人の手によるオープンソース・アプリケーション「CotEditor」のバージョン1.2をAppleScriptから操作してみました。

以前から存在は知っていたものの、デザインなどのフィーリングが合わなかったので常用するには到っていませんでした。

co1.jpg
▲TextWrangler

co2.jpg
▲mi

co3.jpg
▲CotEditor

AppleScriptの用語辞書を見てみたところ、

cot00.jpg

ちょっと面白そうな命令が並んでいたので、どのぐらいの実装レベルなのか試してみることにしました。

基本的なところから、アプリケーションにプロパティをくれるよう依頼してみると……常識的なレベルの動作は行っているようです。

スクリプト名:CotEditorのアプリケーションのプロパティを取得
tell application “CotEditor”
  properties
end tell
–> {name:”CotEditor”, frontmost:false, class:application, version:”1.2″}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

次に、ドキュメントを1枚表示した状態で、Windowの枚数をカウント。1ドキュメントしか開いていないのにWindowの数が「8」と返ってきました。何か暗雲漂う雰囲気です。おかしな動作を起こしそうな予感がします。

スクリプト名:CotEditorでWindowの枚数をカウント
tell application “CotEditor”
  set a to count every window
end tell
–> 8

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

ためしに、すべてのウィンドウに対してvisibleの設定を行ってみたところ…………

cot01.jpg

スクリプト名:CotEditorでWindowのvisibleを書き換える
tell application “CotEditor”
  activate
  
  
set aList to every window
  
repeat with i in aList
    tell i
      set visible to true
    end tell
  end repeat
  
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

予想どおり、補助パレットからドロワーから何からすべて表示状態になってしまいました。

cot02.jpg

慌てて、すべてのウィンドウのvisible属性をfalseにして、一度終了させて再度起動…………すると、今度はドキュメントのウィンドウも何も表示されなくなってしまいました。

スクリプト名:CotEditorでドキュメント関連のWindowのみvisibleにする
tell application “CotEditor”
  set wList to every window
  
repeat with i in wList
    set aProp to properties of i
    
set aDoc to document of aProp
    
    
if aDoc is not equal to missing value then
      set visible of i to true
      
set zoomed of i to true
    end if
  end repeat
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

こんな(↑)感じでしばし試行錯誤して、結局preferenceファイルを削除して再度立ち上げることで回復しましたが、ちょっとアプリケーション起動時の初期化動作が甘いのと、関係ないウィンドウをAppleScriptの操作対象にしているのが問題であるように思われました。

ウィンドウのvisible制御は実戦的なAppleScriptではよくやる話なので、visible属性をいじくると異常動作を行うレベルだと、本気のAppleScriptは組めない感じがします。