2007/2/6 (火) 23:33:32  
[356] お題:選択行を反転

// TAB=4
// 実行には PPA.DLL が必須です。sakura.exe と同じフォルダに ppa.dll を入れておいてください。
// マクロファイルの拡張子は .PPA でなくてはなりません。

// 範囲選択されている行を反転・逆順に並べる。

var                // 変数確保
        sel:String;                // 処理対象の文字列(残りの未処理の文字列)格納用
        res:String;                // 処理結果の文字列格納用
        CRLF,CR,LF:String;        // 各種の改行コードを格納しておく
        pt,ptCR,ptLF:Integer;        // 各種改行位置を格納
begin        // 処理内容
        // CRLF := CRLF改行コード
        CRLF := '
';
        CR := Copy  (CRLF,1,1);        // CR := CR改行コード
        LF := Delete(CRLF,1,1);        // LF := LF改行コード

        sel := S_GetSelectedString(0);
        if ( sel = '' ) then        Exit;        // 何も選択されていなかったら終了

        res := '';        // 処理結果格納用文字列変数初期化

        while ( sel <> '' ) do        begin        //{
                ptCR   := Pos( CR , sel );        // 処理対象文字列 sel 内の先頭の CR の位置
                ptLF   := Pos( LF , sel );        // 処理対象文字列 sel 内の先頭の LF の位置

                // pt := 処理対象文字列 sel 内の「最も前の改行コード」の後ろ位置(つまり1行目の末尾位置)
                pt := 0;

                if ( ptCR > 0 ) then        begin        //{
                        // CR があった
                        pt := ptCR;        // pt := CR までのバイト数

                        // CR の次が LF だった(CRLF改行)→ pt := CRLF の後ろまで(値を1加算)
                        if ( Copy(sel,ptCR+1,1) = LF ) then        pt := pt + 1;
                end;        //}

                if ( ptLF > 0 ) then        begin        //{
                        // LF があった
                        if ( pt   = 0  ) then        pt := ptLF;        // CR が無かった場合、pt := LF までのバイト数
                        if ( ptLF < pt ) then        pt := ptLF;        // CR より前に LF があった場合、pt := LF までのバイト数
                end;        //}

                if ( pt = 0 ) then        begin        //{
                        // sel 内に改行コードが無かった

                        // 末尾に「編集中テキストと同じ改行コード」を追加
                        case S_GetLineCode() of        //{
                                0:        sel := sel + CRLF;        // CRLF を追加
                                1:        sel := sel + CR;        // CR   を追加
                                2:        sel := sel + LF;        // LF   を追加
                        end;        //}

                        pt := Length(sel);        // 末尾までを一行目とする。
                end;        //}

                res := Copy  (sel,1,pt) + res;        // sel の一行目の内容を処理結果文字列 res の前に追加
                sel := Delete(sel,1,pt);                // sel の一行目の内容を削除した文字列が、次回の sel
        end;        //}

        S_InsText(res);        // 処理結果を書き出す
        S_ReDraw(0);        // 再描画 - 処理後にカーソル位置が変わる場合用
end;
すい
INCM1.23c


2007/2/7 (水) 09:16:49  
[357] Re:お題:選択行を反転

以前自分用に作った PerlScript 版です。
(すいさんの投稿を見て少しいじりましたが)
LF と CRLF のみの対応でよければ、こんな感じで。

my $sel = GetSelectedString(0);
my @lines = split(/(?<=\n)/, $sel);
my $res = join('', reverse(@lines));
InsText($res);
miau
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Sleipnir/2.5.6

INCM/CMT
Cyclamen v3.81