//EclipseなどのIDEのように、単一行もしくは複数行をコメント化・コメント解除するマクロ //範囲選択中の場合は、選択範囲の行すべてコメント化する。 if(selecting) { //現在の選択範囲を退避 #tmp_seltopx = seltopx; #tmp_seltopy = seltopy; #tmp_selendx = selendx; #tmp_selendy = selendy; //一旦選択範囲を解除 escape; //選択範囲の開始行から終了行までコメントにしていく #i = #tmp_seltopy; //行の先頭へ移動 moveto 0, #i; //先頭行がコメント("//")かどうかのフラグ #comment_flag = false; //選択範囲を再設定する際のカーソルオフセット #offset = 2; if(code == 0x2F) { //0x2Fは"/"の文字コード right; if(code == 0x2F) { #comment_flag = true; #offset = -2; } } while(#i <= #tmp_selendy) { moveto 0, #i; //先頭行がコメントの場合は、選択範囲のコメント行を解除していく。 if(#comment_flag == true) { //先頭の文字が"/"の場合 if(code == 0x2F) { //右へ1文字移動 right; //次の文字も"/"の場合、BSを2回発行してコメント化を解除する。 if(code == 0x2F) { right; backspace; backspace; } } //先頭行がコメントではない場合は、選択範囲の行すべてをコメント化していく。 } else { insert "//"; } #i = #i + 1; } //カーソルを選択範囲開始位置に移動 moveto #tmp_seltopx + #offset, #tmp_seltopy; //選択範囲を元に戻す beginsel; moveto #tmp_selendx + #offset, #tmp_selendy; endsel; //範囲選択中ではない場合 } else { //現在のカーソル位置を退避 #tmp_x = x; #tmp_y = y; //行頭に移動 golinetop2; //先頭の文字が"/"の場合 if(code == 0x2F) { //右へ1文字移動 right; //次の文字も"/"の場合、BSを2回発行してコメント化を解除する。 if(code == 0x2F) { right; backspace; backspace; } #tmp_x = #tmp_x - 2; if(#tmp_x < 0) { #tmp_x = 0; } } else { insert "//"; #tmp_x = #tmp_x + 2; } moveto #tmp_x, #tmp_y; }