エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

続・CotEditorのテキストからEvernoteのノートを作る

前回のエントリにたいして、名のあるEvernote使いのお一人であるrashitaさん(@さん)からお礼の言葉を頂いてしまいました。とても光栄です。自分が書いたもので喜んでもらえると素直にうれしいものです。


実際のところは「『コードおたく』が新しい手法を見つけたのでよろこんで遊んでいたら達人の目にとまって、大勢の前で紹介してもらってしまった」というのが近い気がするんですが。「これが『キュレーションの時代』なのか」と思ってみたり、みなかったり(はてなダイアリーはリンクを貼ると自動的にトラックバックがとぶので、気が付かれてはいたのではないかとは思いますが)。
ともかく。ネットがなければこうやって情報が交換されることもなかったわけで、やっぱり感慨深いものがあります。


rashitaさん曰く「何か不満があるとすれば、ファイルを保存しないままウィンドウを閉じるので、『保存してないけど、大丈夫か?』というダイアログが出てきてしまう点」。それならと、深追イストっぽく、そこを埋めてみたいと思います。

ちょっとそのまえに。前回の説明不足を解消する:スクリプトの登録の仕方

本当に「コードおたくが書き散らかした」ようなエントリなので「登録できます」と書いておきながら、具体的にどうすりゃいいのか説明がなかったので、まずその点を補足。

ファイルを作成する

AppleScriptのファイルはテキストファイルでOKなので、スクリプトテキストエディタなどで書いてテキストファイルとして保存してください。このとき拡張子は.scpt.applescriptにします。どちらでも大丈夫なようです。

あるいは、AppleScript専用のアプリケーションを使っても作成できます。「アプリケーション」フォルダの中の「AppleScript」フォルダの中の「スクリプトエディタ」がそれです。スクリプトエディタでは、簡易的な統合環境になっていて、スクリプトエディタ上でシンタックスチェックできたり、スクリプトの実行をしたり、実行時の値の確認をしたりできます。
スクリプトエディタでスクリプトを作成したらファイルメニューから保存を選択するわけですが、フォーマットにはスクリプトかテキストを指定します。スクリプトを指定すると独自のファイルフォーマットで.scptという拡張子で保存されます。テキストを指定するとテキストファイルとして.applescriptという拡張子で保存されます。このどちらかの拡張子でないとCotEditorがスクリプトとして認識してくれないようです。

ファイルを登録する

CotEditorのスクリプトメニュー(スクリプト(巻物)のアイコン)を開いて、「スクリプトフォルダを開く」を選択すると、ScriptMenuというフォルダを開きます。ここに作成した登録したいファイルを移動あるいはコピーします。
ScriptMenuフォルダにファイルを置いたら、次にスクリプトメニューの「スクリプトメニューを更新する」を選択します。これで登録が完了しました。スクリプトメニューを開くと、登録したスクリプトファイル名から拡張子を除いたものが表示されていると思います。

ショートカットを指定する

スクリプトのショートカットキーは、スクリプトのファイル名で設定できます。具体的には、スクリプト名と拡張子の間にモディファイア(コマンドキーなど)を指定する文字とショートカットに使う文字の組み合わせを挿入します。
たとえば次のようなファイルのばあい。

send to Evernote.scpt

ショートカットキーにControl+Command+Vを設定するには次のようなファイル名にします。

send to Evernote.@^v.scpt

ファイル名を変更して、スクリプトメニューから「スクリプトメニューを更新する」とショートカットが表示されているのがわかると思います。

モディファイアと該当するキーの関係は次のようになっています。

モディファイア 該当するキー
^ コントロール
$ シフト
~ オプション
@ コマンド


シフトの指定だけは特殊で、大文字にしたばあい、シフトを指定したことになります。たとえば.@$v.と記述しても.@V.と記述してもシフトが指定されたことになります。
すでに利用されているショートカットと衝突するばあいは登録されないようです。

Evernoteにテキストを転送済みのウィンドウを閉じたときに「保存しますか?」ときかれないようにする

ここからが本題。

まず。CotEditorでなにができるかしらべる

スクリプトエディタのファイルメニューの「用語説明を開く...」を選択すると、AppleScriptが使えるアプリケーションの一覧が表示されます。ここでCotEditorを選択すると、次のようなウィンドウが開きます*1


これを見てみると。Standard Suiteの中のdocumentクラスにmodifiedプロパティが見つかります。これをfalseに設定できれば…と思ったんですが、このプロパティは読み出し専用。

他に使えそうなコマンドやプロパティがないか探したのですが、これといったものが見当たらず。やはり保存するという行為が必要なようです。

それならテンポラリフォルダに保存すればいいのでは?

一時的ファイルを保存するならそれ専用のフォルダに保存すれば、一定期間後に自動的に削除してくれる、はず。ということで、テンポラリフォルダに保存する方法で挑戦。


まずテンポラリフォルダのパスを取得するために。一般には環境変数から読み取ればよいのですが、AppleScript Language Guideを読んでみたところsystem attributeで読み取れることがわかりました。
なので、テンポラリフォルダのパスの取得はこんな感じに。

set tmpdir to system attribute "TMPDIR"


ここでテンポラリファイルとして保存する条件について整理。

  • テンポラリファイルとして保存するのは新規作成のばあいのみ。すでにあるファイルを開いたばあいは保存しない。
  • テンポラリファイルでも更新されていないのであれば再び保存する必要なない。


まず。新規のファイルか否かを知る方法。試行錯誤した結果、docucmentクラスのpathプロパティはファイルとして保存されるまで存在しないようなので、pathプロパティの有無で判断できそうです。

tell application "CotEditor"
    if not (exists path of front document) then
        -- 保存する
    end if
end tell


次に。変更の有無を知る方法。これは先ほどのmodifiedプロパティが使えます。

tell application "CotEditor"
    if not (exists path of front document) then
        if modified of front document then
            -- 保存する
        end if
    end if
end tell


最後に。パスを設定して保存を実行。これはpathプロパティにテンポラリフォルダのパスとファイル名を設定し、documentクラスのsaveコマンドを使うことで実現できます。せっかくなのでEvernoteに送ったことがわかるようなウィンドウのタイトルになるようにしてみました。

set temp_name to (system attribute "TMPDIR") & "Evernoteに転送しました"
tell application "CotEditor"
    if not (exists path of front document) then
        if modified of front document then
            set path of front document to temp_name
            front document save
        end if
    end if
end tell


これを前回書いたスクリプトの最後につければ、新規作成のテキストのばあいはテンポラリファイルとして保存されて、閉じるときに問い合わせがなくなるはずです。


スクリプトファイルを登録して実行!

…。

なんかエラーが出ました。



スクリプトエディタから実行した場合にはこのエラーは出ないので、CotEditorがスクリプトを実行するときにエラーが発生しているのかもしれません。要調査。今後の宿題。
でもこのまま放っておくのなんなので、当面の策としてエラーを握りつぶすことにしますw。

            try
                front document save
            end try


これでエラーを無視できるようになりましたw。



あらためて、全スクリプトを掲載。

tell application "CotEditor"
    set note_text to contents of selection of front document
    if note_text is "" then
        set note_text to contents of front document
    end if
end tell

tell application "Evernote"
    create note title paragraph 1 of note_text with text note_text
end tell

set temp_name to (system attribute "TMPDIR") & "Evernoteに転送しました"
tell application "CotEditor"
    if not (exists path of front document) then
        if modified of front document then
            set path of front document to temp_name
            try
                front document save
            end try
        end if
    end if
end tell


今回の感想。
AppleScriptって、けっこうなんでもアリなんだな」

「超」知的生産術

そんなわけでようやく購入できました「EVERNOTE「超」知的生産術」。今回のことがあったから買ったわけじゃないですヨ。ずっと探してたんですよー。
amazonで注文すればすぐに手に入る、と言われてしまうとそれまでですけど。本屋巡りが好きなんですからいいじゃないですか。

EVERNOTE「超」仕事術」も発売直後に購入してるんですから。…。あれ…まだ読中のままだ…(汗)。

EVERNOTE「超」知的生産術

EVERNOTE「超」知的生産術

EVERNOTE「超」仕事術

EVERNOTE「超」仕事術

*1:さも知っていたかのように書いていますが、今回しらべていて初めて知りました