Sakura-Editor Macro Reference

PerlScriptについて

日本語の使用

日本語文字列を使用すると動作がおかしくなります。 文字数とバイト数の区別があいまいなため、日本語を使用した文字分だけ スクリプトの最後が削られていきます。

この問題を回避するには、スクリプトの末尾にコメントなど(または'__END__'の後ろに)余分な文字列を付加します。

# 選択部分の文字列を取得
$sel = GetSelectedString();
:
:(何か一連の処理)
:
InsText($result);
#padding
#padding
#padding
この問題についての詳細

MsgBox関数

Perlには非公式にMsgBox関数がありますので、WScript.ShellのPupupよりもお手軽です。

MsgBox($Message [, $Buttons [, $Title]]);

Tk モジュールの使用

以下のように別プロセスで実行します。

system 'perl -e "use Tk; my $mw = MainWindow->new(); MainLoop();"'

マクロ関数の実行について

「use strict;」とすると「$Editor->マクロ関数名();」の書式では動作しません。 Editorオブジェクトを省略するか、「our $Editor;」で回避できます。

use strict;
our $Editor;
$Editor->InsText('<br />');
InsText('<br />');             # Editorオブジェクトの省略

その他

ファイルパスを利用した変数($0)、関数()、モジュール(IPC::Open2)は使えません。ただし、open() や Cwd は問題なく使えます

COMオブジェクトの使用やScriptControlおよびWSCの取り扱いは、他のWSHマクロと同様です。

サンプルスクリプト

# diet.pls
SPACEToTAB();                   # スペースをタブに置き換え
GoLineTop_Sel();                # 選択を崩さずにカーソルを行頭へ
$str = GetSelectedString();     # 選択範囲を Perl 側に貰う
if(! $str){exit;}
foreach(split(/\r\n/,$str)){
    $wk = $_;
    $wk =~ s/[\t  ]*$//;
    $wk =~ s/^[\t  ]*//;
    if($wk ne $bk){
        $bk = $wk;
        $rtn = $rtn . $wk . "\r\n";
    }
}
InsText($rtn);
__END__
選択範囲を貰って、その選択範囲を加工内容で置き換える
連続したスペースはタブに置き換えると共に前後のスペース
やタブを無視して、中身が同じ行が続いたら Uniq と
同様にカットするバイト数のダイエットです。
# KeySend.pls
$| = 1;
use Win32::OLE;
$WshShell = Win32::OLE->CreateObject("WScript.Shell");
system('C:\WINDOWS\notepad.exe');
$WshShell->Sleep( 3000 );
$WshShell->SendKeys("TEST");
__END__
プログラムを起動してキーを送って操作する
# testFSO.pls
use Win32::OLE;
$FSO = Win32::OLE->CreateObject("Scripting.FileSystemObject");
$FILE = $FSO->GetFile('C:\Program Files\sakura\sakura.exe');
MsgBox ($FILE->Type, ,'', $FILE->Name);
__END__
FileSystemObjectを使用してファイルの種類を取得します。
# MarkCollect.pls
$orgLn = ExpandParameter('$y');

GoFileTop();
    BookmarkNext();
    $newLn = ExpandParameter('$y');

while($oldLn < $newLn){
    GoLineTop( \x01 ); 
    GoLineEnd_Sel();
    $str = GetSelectedString( 0 );
    GoLineTop( \x01 );
    if($oldLn < $newLn){
        $str =~ s/\w+$//;
        $outStr = $outStr . $str . "\r\n";
        $oldLn = $newLn;
        BookmarkNext();
        $newLn = ExpandParameter('$y');
    }
}
use Win32::Clipboard;
$CLIP = Win32::Clipboard();
$str = GetSelectedString();
$CLIP->Set( $outStr );

Jump($orgLn, 0);
__END__
ファイル内のマークしてある行を全部集めて繋いで
クリップボードに格納する。
最初に、ExpandParameter('$y') は、現在のカーソル
が何行目かを退避して最後に Jump() で戻してます。