◀マクロトップへ
  • 356 お題:選択行を反転
    • 357 Re:お題:選択行を反転
  • [356] お題:選択行を反転 すい 2007年02月06日 23:33

    // 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;
    • [357] Re:お題:選択行を反転 miau 2007年02月07日 09:16

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

      my $sel = GetSelectedString(0);
      my @lines = split(/(?<=\n)/, $sel);
      my $res = join('', reverse(@lines));
      InsText($res);