Macro/投稿/166 の変更点

http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F166


Top > Macro > 投稿 > 166
  • 追加された行はこの色です。
  • 削除された行はこの色です。
  • Macro/投稿/166 へ行く。

* 選択行を反転(リバース) [#e3799198]
-ページ: [[Macro/投稿]]
-作者: 
-カテゴリー: その他
-投稿日: 2007-02-12 (月) 18:43:02

** メッセージ [#edc6a4ec]
ふぁんくらぶ8からのお題です.
>219 :''名無しさん@お腹いっぱい。'':2007/02/04(日) 12:27:48 ID:2v5d4Hca0
> 選択行を逆順に並べ替え(ソートではなくリバース)スクリプトはどこかにありますか 
> BBSと検索したけど見つからないです 

*** キーマクロ [#cd6d26fb]
->>Part8#241
#code{{
// reverse.mac 
// 選択範囲をリバースするキーマクロ 
// 
S_CopyLinesWithLineNumber(0);// 選択範囲内全行行番号付きコピー 
S_Paste(0);// 貼り付け 
S_BeginSelect(0);// 範囲選択開始 
S_SearchNext('^\\s*[0-9]+:', 36);// 行番号開始行を検索 
S_SortDesc(0);// 選択行の降順ソート 
S_ReplaceAll('^\\s*[0-9]+:', '', 132);// 行番号を削除 
S_ReDraw(0);// 再描画 
}}

*** javascript [#x0160817]
->>Part8#247
#code(javascript){{
// reverse.js
Editor.InsText(Editor.GetSelectedString(0).split('\r\n').reverse().join('\r\n'));
}}

*** vbscript [#x7e27ee1]
->>Part8#247
#code(VBScript){{
' reverse.vbs
Dim strLines, intLineCount, i
strLines = Split(Editor.GetSelectedString(0), vbCrLf)
intLineCount = UBound(strLines)
ReDim strResult(intLineCount)
For i = 0 To intLineCount
    strResult(intLineCount - i) = strLines(i)
Next
Editor.InsText Join(strResult, vbCrLf)
}}

*** ppa [#gd5079f0]
-[[macro:356]]
#code{{
// 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;
}}

*** perl [#he5fa71d]
-[[macro:357]]
#code(Perl){{
my $sel = GetSelectedString(0);
my @lines = split(/(?<=\n)/, $sel);
my $res = join('', reverse(@lines));
InsText($res);
}}

----

#comment

    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS