キッズプレート、パスタおかわり

プログラミングやデジモノについてあれこれ
--.--.-- --:--|カテゴリ:スポンサー広告| コメント(-)

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2012.02.17 01:12|カテゴリ:Perlコメント(0)

[CotEditor][Perl][AppleScript]「=」を区切りにして前後の文字を入れ替える


 すっかり恒例 CotEditor のスクリプトねた。今日ははるか昔、Real Studio のIDEスクリプトとして作っていたスクリプトをCotEditor用にリプレイスしました。だって、IDEスクリプトがエンタープライズなんていう超お高いライセンス製品でしか使えなくなってしまったんですもの。けっこう便利だったんだけどなぁ。さてさて、それではスクリプトの内容をご紹介します。
 
 このスクリプトは入力カーソルがある行、または選択範囲に含まれている行に「=」が存在する場合、「=」を区切り文字にして前後を入れ替えます。

a = b

 ↓スクリプト実行

b = a

 私はREALbasicでウィンドウ位置やサイズの復元などでOpen時にバックアップ用のテーブルから値を読み込んでClose時にバックアップ用の値に保存するなんてことをよくやります。同じ変数を相互に読み書きするのでコーディングをする際、

「=の前後を一発で入れ替える機能がなんでついてないんだよ」

 と常日頃から思っていました。無ければ作るという感じでございます。一応行末にあるコメント等を無視するようにしていますがちょっとややこしい記述になっているとうまく動かない事うけあいですw

 もともとはREALbasicの文法にそった処理だったのですが今回CotEditor用にリプレイスする際に、とりあえずPerl用にしてしまいました。でもPerlでは「=」区切りで文字の入れ替えとかあんまりしないですかね?

 以下がソースです。実は今回のスクリプト Perl の内部からOSAを使ってAppleScriptを動かしています。選択範囲の調整や必要な文字列等はOSA経由で設定&取得し、文字列の変換はPerlでちゃっちゃとやってしまおうとう手抜きっぷりです。いやー、やってみたら結構便利そうなので他の処理にもいろいろと応用できそうです。CotEditorのスクリプトで遊んでいる人はきっとチェックして損は無いと思いまする。

入れ替え.pl ※ソース中の\はバックスラッシュです
#!/usr/bin/perl
#%%%{CotEditorXOutput=ReplaceSelection}%%%

use strict;
use utf8;#-ソースがUTF8だという宣言
use Encode;
use Encode 'decode', 'encode';
binmode STDOUT, ":utf8";  #-画面に出力したい文字コード
binmode STDERR, ":utf8";  #-エラー出力に使いたい文字コード
binmode STDIN, ":utf8";  #-標準入力から入ってくる文字コード

my $SCRIPTSOURCE;
$SCRIPTSOURCE = 
'"on run' . "\n" . 
'	tell application \"CotEditor\"' . "\n" .
'		tell front document' . "\n" .
'			set LineItem to line ending' . "\n" .
'			if (LineItem = LF) then' . "\n" .
'				set LineEnd to ASCII character (10)' . "\n" .
'			else if (LineItem = CR) then' . "\n" .
'				set LineEnd to ASCII character (13)' . "\n" .
'			else if (LineItem = CRLF) then' . "\n" .
'				set LineEnd to (ASCII character (13)) & (ASCII character (10))' . "\n" .
'			end if' . "\n" .
'			set SelectRange to line range of selection' . "\n" .
'			set line range of selection to SelectRange' . "\n" .
'			set SelectContents to contents of selection as Unicode text' . "\n" .
'		end tell' . "\n" .
'		return SelectContents & LineEnd' . "\n" .
'	end tell' . "\n" .
'end run"';

my $selection = `osascript -e $SCRIPTSOURCE`;
chomp($selection);
$selection =~ s/([\x{000d}\x{000a}]+)\z//;
my $lineEnd = $1;
my @lines = split(/$lineEnd/,$selection,-1);
for (@lines) {
	$_ =~ s/([^ \t]+)( *=~? *)([^ \t\#;]+)/$3$2$1/;
}
print join("$lineEnd",@lines);

 AppleScriptでやっていることは、

・選択範囲を行単位に変更
・改行文字の種別を取得
・選択範囲のコンテンツと改行文字の種別をくっつけてPerlに返す

 てなことをしています。

 他の言語用にカスタマイズする場合は以下部分の処理を変更してくださいませ。

	$_ =~ s/([^ \t]+)( *=~? *)([^ \t\#;]+)/$3$2$1/;

コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

ひらくん Author:ひらくん
どもども、ひらんくんどす。
日々まったり過ごしております。
仕事はDTP関連のスプリクト&アプリケーション開発。
Follow happyscript on Twitter

ブログ内検索



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。