avoidnote

CotEditor 用スクリプト(Perl)

Published at 2005-07-28 (Thu) 14:15 in CotEditor, Macintosh, Perl

CotEditor は AppleScript の他に Shell Script もスクリプトメニューに登録できるということなので、フィルタスリプトを Perl を使って書いてみた。

標準入出力の設定

フィルタスクリプトなのでまずは標準入出力の設定。付属のドキュメントによるとプログラムの冒頭にコメントアウトされたの2行を加えることで STDINSTDOUT の設定ができるらしい。

標準入力 (STDIN)

# %%%{CotEditorXInput=parameter}%%%

標準入力 (STDIN) として指定できるもの

parameter説明
Selection選択文字列
AllTextドキュメントのすべての文字列
None入力を使用しない(デフォルト)

標準出力 (STDOUT)

# %%%{CotEditorXOutput=parameter}%%%

標準出力 (STDOUT) として指定できるもの

parameter説明
ReplaceSelection選択文字列を出力内容で置き換える
ReplaceAllTextドキュメントのすべての文字列を出力内容で置き換える
InsertAfterSelection選択範囲の直後に出力内容を挿入する
AppendToAllTextドキュメントの末尾に出力内容を追加する
Pasteboard putsペーストボード(クリップボード)に出力内容を格納する
Discard出力内容を使用しない(デフォルト)

次の例では CotEditor 上での選択範囲を標準出入力に指定している。

# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%

入出力の encoding は はファイルの保存エンコーディングに関係なく utf-8 で改行コードは LF のようです。

標準エラー出力 (STDERR)

CotEditor Script Errors: という別ウィンドウが開いてエラーメッセージが表示される。

Perl スクリプトの設定

入出力が決まればあとは普通の Perl スクリプトと同じように書けます。ただし、日本語などのマルチバイト文字列を扱うには、ちょっと注意が必要。

use encoding 'utf-8';

Perl スクリプトを UTF-8 で保存し、この一行を加えることによって標準入出力のエンコーディングを指定できます。標準入力から受け取ったデータは Perl 内部コードに変換され、utf8 で標準出力に出力されます。スクリプトを utf-8 で保存するだけでも文字化けはしないのでいいように思うかもしれませんが、全ての文字列はバイト列として扱われます。encoding 'utf8' を指定しないと次の例は正しく動作しません。

# 文字数を数える
# use encoding 'utf8' を指定しないと 9 と表示される
length "日本語";

# use encoding 'utf8' を指定しないと動作しない
tr/あ-ん/ア-ン/;

標準エラー出力のエンコーディングは特に問題はないようですが、念のため次の一行も加えておいてもいいかもしれません。これは標準エラーのエンコーディングを UTF-8 に指定しています。

binmode(STDERR, ':raw :encoding(utf8)');

サンプル Perl スクリプト

たいしたものではないけど Perl をつかってフィルタを作ってみました。AppleScript と連携したスクリプトを書くとパラメータを渡せるのでもう少し凝ったものが作れると思います。

タブを 4 文字スペースに展開する

タブを 4 文字スペースに展開するサンプル。CotEditor に組み込まれているOgreKit の正規表現は強力なのでわざわざ Perl を呼び出す必要もないのだが、ループを使うと簡単にできるサンプルを書いてみた。(Auto Expand Tabs to Spaces と言う項目があるのであまりいい例ではないが)

#!/usr/local/bin/perl
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
use strict;
use warnings;
use encoding 'utf8'; # perl の内部コードに変換(UTF-8 フラグを付ける)
binmode(STDERR, ':raw :encoding(utf8)');

# 4 文字スペースに
my $column = 4;

# STDIN を 1 行ずつ処理
while (<>) {
    1 while s/\t+/' ' x (length($&) * $column - length($`) % $column)/e;
    print;
}

実体参照エンコーディング

選択範囲を実体参照にエンコードするサンプル。既に実体参照、数値参照に置き換えられている '&' を二重にエンコードをしない。

#!/usr/local/bin/perl
# %%%{CotEditorXInput=Selection}%%%
# %%%{CotEditorXOutput=ReplaceSelection}%%%
use strict;
use warnings;
use encoding 'utf8';
binmode(STDERR, ':raw :encoding(utf8)');

my $in = do { local $/; <> };      # STDIN を一気に代入
$in =~ s/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w{1,8});)/&amp;/g;
$in =~ s/"/&quot;/g;
$in =~ s/</&lt;/g;
$in =~ s/>/&gt;/g;
$in =~ s/'/&apos;/g;
print $in;

もう少しまともなのができたらまとめて公開したいと思います。

Copyright © 2005 atz. All rights reserved.
Creative Commons License Movable Type Valid XHTML 1.0 Strict W3C CSS