// TAB=4 // 実行には PPA.DLL が必須です。sakura.exe と同じフォルダに ppa.dll を入れておく事。 // マクロファイルの拡張子は .PPA でなくてはなりません。 // 次の変換をおこなう。 // '@'⇒'@' // '!'⇒'!' // '$'⇒'$' // だけ(笑)。サンプルだから...ね。 // 必要な人は自分で増やして下さい。 // 変換方法は、 // 1.1行の内容を文字変数 str に取り込む。 // 2.PPA 上にて文字変数 str の変換を行う。 // 3.変換後の文字列変数 str を書き出す。(str の内容が変更された場合のみ) // この処理をファイル先頭から末尾まで1行ずつループで処理していく。 // ※ ちゅうい ※ // S_GetSelectedString() を使っているのですが、取り込める文字列の長さに限界があるかも... // つまり1行あたりの文字数に限界がある*かも*。 var // 変数を確保する場所 str:String; // 文字変数を用意 bef,aft:String; // 文字変数を用意 change:Integer; // 整数数値変数を用意 outf:Integer; // 整数数値変数を用意 pt:Integer; // 整数数値変数を用意 begin // ここより処理内容の記述 // ↓途中に空行があると、そこで処理が中断してしまう。その対策。 S_ReplaceAll('[\r\n]+', '!$&', 20); // ファイル全体に対し、行末に文字 ! を付加する。 S_MoveHistPrev(0); // 移動履歴: 前へ - 置換開始位置へ戻る // ↓ EOF の前に文字がある場合のための対策 - 前処理 S_GoFileEnd(0); // ファイルの最後に移動 S_Char(13); // 文字入力 - (13 = 改行) S_DeleteLine(0); // 行削除(折り返し単位) - オートインデント対策 - 改行した結果、タブ・スペース類が出た場合、それらを削除。 S_MoveHistPrev(0); // 移動履歴: 前へ - S_GoFileEnd を実行する前の位置へ戻る S_GoFileTop(0); // ファイルの先頭に移動 - *1 repeat // 1行ごとに処理をするためのループ。 // 1行の内容を取り込む。 S_GoLineTop(1); // 行頭に移動(折り返し単位) S_GoLineEnd_Sel(0); // (選択)行末に移動(折り返し単位) str := S_GetSelectedString(0); if( str = '' ) then break; // 文字列が空ならファイル終端とみなす。 outf := 0; // フラグ = 「この行を書き直す必要無し」にしておく // -------------------------------------------------- // repeat // '@' ⇒ '@' 変換 bef := '@'; aft := '@'; change := 0; // フラグ = 「変化無し」にしておく pt := pos(bef,str); // bef の場所を探す。 if ( pt <> 0 ) then begin change := 1; // フラグ = 「変化あり」 outf := 1; // フラグ = 「この行を書き直す必要あり」にしておく str := Copy(str,1,pt-1) + aft + Delete(str,1,pt+Length(bef)-1 ); // 変換後の文字列を生成する。 end; until (change = 0); // 見つからなかったらループ終了。 // -------------------------------------------------- // repeat // '!' ⇒ '!' 変換 bef := '!'; aft := '!'; change := 0; // フラグ = 「変化無し」にしておく pt := pos(bef,str); // bef の場所を探す。 if ( pt <> 0 ) then begin change := 1; // フラグ = 「変化あり」 outf := 1; // フラグ = 「この行を書き直す必要あり」にしておく str := Copy(str,1,pt-1) + aft + Delete(str,1,pt+Length(bef)-1 ); // 変換後の文字列を生成する。 end; until (change = 0); // 見つからなかったらループ終了。 // -------------------------------------------------- // repeat // '$' ⇒ '$' 変換 bef := '$'; aft := '$'; change := 0; // フラグ = 「変化無し」にしておく pt := pos(bef,str); // bef の場所を探す。 if ( pt <> 0 ) then begin change := 1; // フラグ = 「変化あり」 outf := 1; // フラグ = 「この行を書き直す必要あり」にしておく str := Copy(str,1,pt-1) + aft + Delete(str,1,pt+Length(bef)-1 ); // 変換後の文字列を生成する。 end; until (change = 0); // 見つからなかったらループ終了。 // -------------------------------------------------- // if( outf <> 0 ) then S_InsText(str); // 変更後の文字列を書き出す。 S_Down(0); // カーソル下移動 until (False); // 無限ループ S_MoveHistPrev(0); // 移動履歴: 前へ - S_GoFileTop - *1 実行前の位置へ戻る // ↓ EOF の前に文字がある場合のための対策 - 後処理 S_GoFileEnd(0); // ファイルの最後に移動 S_DeleteLine(0); // 行削除(折り返し単位) - [EOF]前に付いた行番号を削除 S_DeleteBack(0); // カーソル前を削除 - 最初に追加した改行を削除 S_MoveHistPrev(0); // 移動履歴: 前へ - S_GoFileEnd を実行する前の位置へ戻る S_ReplaceAll('!([\r\n]+)', '$1', 20); // ファイル全体に対し、行末の文字 ! を削除する。 S_SearchClearMark(0); // 検索マークの切替え S_MoveHistPrev(0); // 移動履歴: 前へ - 置換開始前の位置へ戻る S_CurLineCenter(0); // カーソル行をウィンドウ中央へ S_ReDraw(0); // 再描画 end;