Thu, 23 Jun 2005
CotEditor用のスクリプトを書いてみるそのろく
これが最終形態ということにしようと思ったら、マーク付けした日本語テキストが文字化けしてしまう…どうも、最後にApplescriptの方に持っていった後の処理に問題があるみたい。${OUTPUT}をそのままechoした場合には文字化けしないので。スーパーハカーの人、誰か教えてくださると嬉しいです…それにしても、今まで日本語文でテストしてなかった自分に腹が立つというか。
#! /bin/sh
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
INPUT=`cat - `
OUTPUT="<em>${INPUT}</em>"
osascript << EOF
tell application "CotEditor"
activate
if exists front document then
set {loc, len} to (range of selection of front document)
set (contents of selection of front document) to "${OUTPUT}"
set numOfMove to (count of character of selection)
set (range of selection of front document) to {Loc + numOfMove, 0}
end if
end tell
EOF
Wed, 22 Jun 2005
CotEditor用のスクリプトを書いてみるそのごぉ
CotEditor用のスクリプトの話しのつづき。添付のシェルスクリプトの例では、最前面のドキュメントにおいて選択範囲が無い場合、何も出力されません。自分としてはそうでないほうが望ましい。ということで、でわさっそく…最初のものは添付のシェルスクリプトです。
#! /bin/sh
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
INPUT=`cat -`
echo "<h1>${INPUT}</h1>"
処理の流れは次のようにしてみました。…何かかっこわる。地の文を書いてそれをマークアップしてゆくわけだし、絶対選択範囲はあるわけで、別に細かいことを考えなくても良いかぁ…そうすれば前半部分はばっさり捨てることが出来るな。
- 最初に、選択範囲の長さを${lengthofSelection}に格納
- ${lengthofSelection}がゼロでない場合とゼロの場合とで処理を分岐する
#! /bin/sh
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
lengthofSelection=`osascript << EOF
tell application "CotEditor"
if exists front document then
set {Loc,len} to (range of selection of front document)
else
beep
end if
return Len
end tell
EOF`
if [ "$lengthofSelection" != 0 ]; then
INPUT=`cat - `
OUTPUT="<blockquote cite=\\\"\\\" title=\\\"\\\">\n${INPUT}\n</blockquote>\n"
else
OUTPUT="<blockquote cite=\\\"\\\" title=\\\"\\\">\n\n</blockquote>\n"
fi
osascript << EOF
tell application "CotEditor"
activate
if exists front document then
set {loc, len} to (range of selection of front document)
set (contents of selection of front document) to "${OUTPUT}"
set numOfMove to (count of character of selection)
set (range of selection of front document) to {Loc + numOfMove, 0}
end if
end tell
EOF
Sun, 19 Jun 2005
CotEditorに対する瑣末な指摘
例えば、ScriptMenuフォルダにvar....shという名前のファイルを置くと、Scriptメニューにvar..という名前で表示されてしまいます。いっこ足りない。
拡張子を取り去るところのロジックがおかしいようです。いや、何が言いたいかというと、まっきんのメニューらしく、これを選択すると何か応答を求められますよ、という意味でてんてんてんていうのを出したいわけです。前のエントリーでそういうスクリプトを書いたので。
CotEditorはKEditよりもAppleScript対応度が高いのと、スクリプトのエラーをScript Error Windowに吐いてくれるのが気に入ったので、さて、乗り換えの準備をしましょうかね。手間はかかるけど…
Sat, 18 Jun 2005
CotEditor用のスクリプトを書いてみるそのよん
CotEditor用のスクリプトの話しのつづき。前からやってみたかった、AppleScriptでダイアログとかを出してその結果によってShell Scriptの処理を分岐させて…というのを考えてみました。お題は数値文字参照。
処理の流れは次の通りで出来た。リストの画面でキャンセルを押した場合の挙動が他の場合(ダイアログとか)と違っているので、少し悩みました。うーむ、もっとかっこいいダイアログを出せないものだろうか。それと、メンテナンスするのに、常に二箇所修正しないといけないな…
- AppleScriptでリストを表示
- 選択結果を変数${UIINPUT}に格納
- 変数${UIINPUT}の値をもとに、変数${OUTPUT}に対応する数値文字参照の値を代入
- CotEditorの選択範囲を変数${OUTPUT}に置換
- キャレットを選択範囲の文字数分後へ移動
#! /bin/sh
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
UIINPUT=`osascript << EOF
tell app "SystemUIServer"
activate
try
set myList to {\
"&", \
"<", \
">", \
"nb space", \
"copyright sign", \
"registered sign", \
"inverted !", \
"inverted ?" \
}
set myResult to (choose from list myList default items "&")
on error
beep
end try
return myResult
end tell
EOF`
case ${UIINPUT} in
false) OUTPUT="" ;;
\&) OUTPUT=" " ;;
\<) OUTPUT="<" ;;
\>) OUTPUT=">" ;;
"nb space") OUTPUT=" " ;;
"copyright sign") OUTPUT="©" ;;
"registered sign") OUTPUT="®" ;;
"inverted !") OUTPUT="¡" ;;
"inverted ?") OUTPUT="¿" ;;
esac
osascript << EOF
tell application "CotEditor"
activate
if exists front document then
set {loc, len} to (range of selection of front document)
set (contents of selection of front document) to "${OUTPUT}"
set numOfMove to (count of character of selection)
set (range of selection of front document) to {Loc + numOfMove, 0}
end if
end tell
EOF
Tue, 14 Jun 2005
CotEditor用のスクリプトを書いてみるそのさん
ひとつ前のエントリーではAppleScriptのなかにShell Scriptを埋め込んだ例を書きました。今回は、逆の方向で。こっちも試さないとね。
#! /bin/sh
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
INPUT=`/usr/bin/perl -e '
if ($0 eq __FILE__) {
print &Bdate."\n";
}
sub Bdate
{
local($time) = @_;
local($beat);
$time = $time || time;
local($sec, $min, $hour) = (gmtime($time+60*60*1))[0..2];
$beat = ((($hour * 60 + $min) * 60 + $sec) / 86.4) % 1000;
sprintf("@%03d",$beat);
}
1;'`
osascript << EOF
tell application "CotEditor"
--activate
if exists front document then
set {loc, len} to (range of selection of front document)
set (contents of selection of front document) to "${INPUT}"
set numOfMove to (count of character of selection)
set (range of selection of front document) to {Loc + numOfMove, 0}
end if
end tell
EOF
あ、こんなふうに変数をAppleScriptに渡せるのか。こちらのほうが色々簡単ですかね。AppleScriptの部分は括弧で括ると少しは見易くなるような気がする。