|
>んじゃ暇つぶしに頭の体操も兼ねて作ってみようかな?
>つぶす暇がたまにしかないので、多少時間はかかると思うけど。(^^;
ということで制作中です。
いろいろ無駄が残っており、またうまく動かないとこもいろいろあるんですが、
とりあえず方向性の確認という意味で、いったんアップします。
罫線の太さは選択できるようにしたいとこです。まだ未対応ですが。
長くてごめんなさい。
//enclose.mac
//矩形範囲の外側を文字で囲む
//矩形選択→その範囲を囲む
//行選択→その範囲を囲む
//1行内の部分選択→その範囲を囲む
//複数行に及びかつ行選択でない場合→処理しない
//範囲選択されていない場合→処理しない
//ファイル先頭から選択されていたら、先頭に1行挿入する
//1桁目あるいは2桁目から選択されていたら2桁あるいは1桁右にシフト
//選択範囲の横幅が半角で奇数だったら右に1桁余白を入れる
//折返しがあったりすると無残な姿になるでしょう。
//罫線素片の準備
$chrs = "─│┌┐└┘";
//$chrs = "━┃┏┓┗┛";
//罫線素片の配列変数への格納
#i = 0;
while(#i < 6){
$chr[#i+1] = midstr($chrs, #i * 2, 2);
#i = #i + 1;
}
//選択状態を確認して範囲を記憶
if(rectselecting){
#bx = seltopx;
#by = seltopy;
#ex = selendx;
#ey = selendy;
escape;
}else if(selecting){
if((seltopx + selendx == 0) && (seltopy != selendy)){
#bx = 0;
#by = seltopy;
#ey = selendy - 1;
escape;
moveto #bx, #by;
#ex = 0;
while(y <= #ey){
golineend;
if(#ex < x){
#ex = x;
}
moveto 0, y + 1;
}
}else if(seltopy == selendy){
#bx = seltopx;
#by = seltopy;
#ex = selendx;
#ey = selendy;
escape;
}else{
message "矩形選択、あるいは行選択した状態で実行して下さい。";
endmacro;
}
}else{
message "矩形選択、あるいは行選択した状態で実行して下さい。";
endmacro;
}
//フリーカーソルモードに
#fc = freecursor;
if(! #fc){
freecursorswitch;
}
//1行目から選択されていた場合
if(#by == 0){
gofiletop;
insert "\n";
#by = #by + 1;
#ey = #ey + 1;
}
//1桁目から選択されている場合
if(#bx == 0){
#bx = 2;
#ex = #ex + 2;
moveto 0, #by;
while(y <= #ey){
insert "_";
golineend2;
down;
golinetop2;
}
}
//2桁目から選択されている場合
if(#bx == 1){
#bx = 2;
#ex = #ex + 1;
moveto 0, #by;
while(y <= #ey){
insert "_";
golineend2;
down;
golinetop2;
}
}
//枠の座標に変換
#bx = #bx - 2;
#by = #by - 1;
#ex = #ex;
#ey = #ey + 1;
//枠最終行に[EOF]が存在するとき
moveto #ex, #ey;
while(! result){
gofileend;
insert "\n";
moveto #ex, #ey;
}
golineend2;
if(code == eof){
insert "\n";
}
//左側桁揃え
moveto #bx, #by;
while(y <= #ey){
if(x == (#bx - 1)){
insert " ";
}
moveto #bx, y + 1;
}
//右側桁揃え
moveto #ex, #by;
while(y <= #ey){
if(x == (#ex - 1)){
insert " ";
}
moveto #ex, y + 1;
}
//選択範囲幅が奇数の場合
if((#ex - #bx)/2*2 != (#ex - #bx)){
moveto #ex, #by;
while(y <= #ey){
insert " ";
moveto #ex, y + 1;
}
#ex = #ex + 1;
}
//上の線を引く
moveto #bx, #by;
while(x <= #ex){
overwrite $chr[1];
}
//下の線を引く
moveto #bx, #ey;
while(x <= #ex){
overwrite $chr[1];
if(! result){insert $chr;}
}
//左右の線を引く
moveto #bx, #by;
while(y <= #ey){
moveto #bx, y;
overwrite $chr[2];
moveto #ex, y;
overwrite $chr[2];
down;
if(! result){break;}
}
//四隅を書く
moveto #bx, #by; overwrite $chr[3];
moveto #ex, #by; overwrite $chr[4];
moveto #bx, #ey; overwrite $chr[5];
moveto #ex, #ey; overwrite $chr[6];
//後処理
if(! #fc){
freecursorswitch;
}
endmacro;
|
|