前回と同じ作業を秀丸エディタのマクロで実現しました。いくら置換機能が強力だからといって手作業で何種類もの置換をしていくのはやはりしんどいです。前回は
と4ステップの処理が必要でしたがこれをマクロで1回にまとめます。
このマクロはタブ区切りデータのカーソルのある行を、<tr>から始まるHTMLタグに、1行づつ変換します。変換が終わると次の行にカーソルが移動していますから、必要な回数だけマクロを繰り返し実行します。
連続して繰り返し処理することを前提としていますので、適当なキーにこのマクロを割り当てて使用するとよいでしょう。
マクロの内容は以下です。(行番号は説明のために入れてあります。実際のマクロファイルでは不要です。)
1 // tab2table.mac 2 // TAB区切りデータ1行をTABLEタグ<tr>〜</tr>に変換 3 // 使い方:変換するタブ区切りの行にカーソルを置き実行します 4 5 // 検索バッファと置換バッファを保存 6 $s = searchbuffer; 7 #f = searchoption; 8 $r = replacebuffer; 9 10 // 行頭の処理 11 golinetop2; // 行頭にカーソルを移動 12 insert "\t<tr>\n\t\t<td>"; // 最初のタグを挿入 13 // 行を選択する 14 beginsel; // 選択開始 15 golineend2; // 行末まで移動 16 // 選択範囲のタブ文字を置換 17 replaceall "\\t" , "</td>\\n\\t\\t<td>" , regular, inselect; 18 if( ! result ){ // 置換するものがなければ終了 19 beep; 20 beginsel; 21 searchup "\t<tr>"; 22 delete; 23 call EndSub; 24 endmacro; 25 } 26 // カーソルを行末に移動して最後のタグを挿入 27 golineend2; 28 insert "</td>"; 29 insertreturn; 30 // 自動インデント設定に応じてタブの数を調整 31 if(indentstate != 0){ 32 backspace; 33 }else{ 34 insert "\t"; 35 } 36 insert "</tr>"; 37 // 次の行頭にカーソル移動して終了 38 right; 39 call EndSub; 40 endmacro; 41 42 // 終了処理 43 EndSub: 44 escapeinselect; // 選択範囲の置換を解除 45 setsearch $s,#f; // 検索バッファと置換バッファを戻す 46 setreplace $r; 47 return;
行頭と行末のタグ部分は前回のように置換を利用せずに直接挿入しています(10〜12、26〜36行)。マクロで行うならこのようにするほうが簡単です。
30〜35行目のif文はファイルタイプ別の設定で自動インデントが有効になっているかどうかを判断しています。自動インデントが有効なら余計なタブ文字がひとつ発生しますからbackspaceで削除します。もし有効でない場合はまったくタブ文字が発生しないのでタブ文字をひとつ挿入しています。
タブを置換する部分は「選択範囲の置換」を利用して他の行まで置換することを防いでいます。
13〜15行目で置換部分を選択しています。選択はbeginselで選択を開始してからカーソルを移動することで実現します。15行目のgolineend2は論理行末へのカーソル移動です。単なる行末への移動(golineend)では長い行が折り返していると折り返しまでしかカーソルが移動せず、誤動作します。
17行目のreplaceall(全置換)コマンドの中のinselectが「選択範囲の置換」オプションの指定です。
なお、置換が不成功の場合に備えてif文でマクロを終了させています(18〜25行)。
置換が不成功=「タブ文字がひとつもなかった」ということです。これはおかしい事態ですのでブザーを鳴らして終了します。20〜21行は10〜12行ですでに挿入してしまったタグの削除です。終了にあたってはEndSubという終了処理のサブルーチンを呼び出して設定を戻します。
このマクロではマクロ実行前の検索と置換の各種情報を保存し、マクロ実行後に戻しています。こうするとマクロ実行によって検索文字列や検索・置換のオプションが変更されないので便利です。5〜8行目と45〜46行目はこうした配慮の定式です。
ああああ いいい ううう
ああああ いいい ううう
ああああ いいい ううう
<tr>
<td>ああああ</td>
<td>いいい</td>
<td>ううう</td>
</tr>
ああああ いいい ううう
ああああ いいい ううう