|
%%% 結論は // 空白の解釈はマークアップしない限り正確に行かない。
少しのバグ取りと、行末字上げを追加 <P> 以外は記憶します。
記憶のある操作体系は解りやすく作るのが難しい。 以上でおしまいです。
//
%%%% REFORD0.MAC
// 主にキーボード操作の場合の入り口 マウス操作なら行範囲選択、
// 直接右メニューREFORDx 起動ができる
$DantouC=" (("; // 段頭にありそうな文字 要調整
//
// 選択中の inputchar 対策 、IME on ですると選択範囲が!
#imesave=imestate;if(imestate)imeswitch;
Selected:
if(selecting){ // 急ぐより選択範囲を良く見て確認した方がよい
//
if(getinistr("LeastMac.INI","HMACRO","isRep")=="rep1") // 再実行
{writeinistr "LeastMac.INI","HMACRO","isRep","";endmacro;}
//
#Char=inputchar("P DL UL OL 段落整形 頭文字/行末字上enter");
if(#Char>'Z')#Char=#Char-32; // 大文字化
// ここで選択範囲を修正できる、ようにできる。
#Indr=-1;
while('0'<=#Char&&#Char<='9'){#Indr=#Char-'0'; // 行末字上げ数
#Char=inputchar("P DL UL OL 段落整形 頭文字/行末字上enter");
if(#Char>'Z')#Char=#Char-32; } // 大文字化
//
if(0>#Indr){ // 字上げ数変更無し
if('P'==#Char)execmacro "REFORDp.mac"; // 通常段落
else if('D'==#Char)execmacro "REFORDd.mac"; // 定義箇条書
else if('U'==#Char)execmacro "REFORDu.mac"; // 番号無し箇条書
else if('O'==#Char)execmacro "REFORDo.mac"; // 番号付き箇条書
}else{
if('P'==#Char){
writeininum "LeastMac.INI","HMACRO","pIndR",#Indr;
execmacro "REFORDp.mac";} // 通常段落
else if('D'==#Char){
writeininum "LeastMac.INI","HMACRO","dIndR",#Indr;
execmacro "REFORDd.mac";} // 定義箇条書
else if('U'==#Char){
writeininum "LeastMac.INI","HMACRO","uIndR",#Indr;
execmacro "REFORDu.mac";} // 番号無し箇条書
else if('O'==#Char){
writeininum "LeastMac.INI","HMACRO","oIndR",#Indr;
execmacro "REFORDo.mac";} // 番号付き箇条書
}
if(#imesave)imeswitch;endmacro;}
//
disabledraw; // やらなくても良い、好みだね
// 現在行から上下のstop行まで選択 1段のみ
#starty=y;
while(1){call isStopl '↓'; // 移動方向パラ
if(##return=='空'||##return=='段') {#selendy=y-1;break;}
golineend2;right;if(!result) {#selendy=y ;break;} }
moveto 0,#starty;
while(1){call isStopl '↑';
if(##return=='段') {#seltopy=y ;break;}
else if(##return=='空') {#seltopy=y+1;break;}
golinetop2;left; if(!result) {#seltopy=y ;break;} }
if(#seltopy>=#selendy){beep;endmacro;} // stop行の上だった
// // 1行整形macroでやって
moveto 0,#seltopy;beginsel;moveto 0,#selendy;golineend;
enabledraw;
goto Selected;
//
// =============================================================
isStopl: // 空白行、見出しらしい行?
golineend;
while(' '==code||code==' '||code==0x9||0xD==code||eof==code){
if(!x)return '空';left;}
// 空白行を空白・改行1個にしたら?どうなるか
// 行は通常段落の頭にありそうな文字で開始か?強い制約だ
if(y!=#starty||##1=='↑'){ // 開始行の段頭は判定しない
golinetop2;while(code==' '||code==0x9)right;
if(strstr($DantouC,char(code))>=0)return '段'; } // 段頭
return '属'; // 付属行
//
// これでは箇条書きを必ず空行で切らないといけない。要調整?
// -------------------------------------------------------------
// -------------------------------------------------------------
// マクロソース終了を指示する物があれば実行が早くなるかな
// Perl なら特殊リテラルの __END__ とか __DATA__
// あれば埋め込みドキュメントを置ける。
//
// 段落整形は 文字列選択したものを、挿入BOX範囲に貼り付け
// 流し込みできれば、その流し込みオプションで解決できる。
// ワープロのように表示で見える文字と連動する裏の割り付け
// 制御データを持てないのだから常時整形を保つのはできない。
// Ai判定もナカナカ、マークアップもどき入力も隠し味で必要になる
// 文体別にしか対応できない。
// 仕様:1段整形、stop行パターンは各自調整してください
// 処理の流れ
// REFORD0 行範囲決定
// REFORDx 各種段落形
// =======================================================
%%%%%% LeastMac.mac
// 直前1段落整形マクロ再実行
if(!selecting){
writeinistr "LeastMac.INI","HMACRO","isRep","rep1";
execmacro "reforD0.mac"; } // rep1 はこの中でoff
execmacro getinistr("LeastMac.INI","HMACRO","arg0");
endmacro;
%%%%%% REFORDp.mac
// 通常段落整形
// マクロのポイントは改行を消して再度入れて自動インデントを
// 働かせるところだ。(人手作業のシミュレート)
// 行末の禁則文字&カーソル&改行コードの動きもチョット????
// エディタモードの使える組み合わせもよく分からない。
//
// 直前マクロ再実行準備 自分の名前は取得できないので
// マクロ名変更時には修正せよ。
writeinistr "LeastMac.INI","HMACRO","arg0","REFORDp.mac";
//
if(!selecting) {call Reform1;endmacro;} // 1行処理
#seltopy=seltopy;#selendy=selendy;escape; // 整形範囲
if(#seltopy+1>=#selendy){moveto 0,#seltopy; // 2行以下なら
call Reform1;endmacro;} // 1行処理
//
disabledraw; // マクロらしくなってきた。お好みにより設定
// マーク行をマクロで判定できないx 設定はできるが
// 範囲処理の終わりに使いたい。別fileを開くしか確実な方法は無いか?
// 論理行数カウントはめんどくさい、カーソルの動きは神経質!
// うまく行く理由も、うまく行かない理由も解らない。
moveto 0,#selendy;golineend;insert "J"; // 外字マークで代用
moveto 0,#seltopy;
#Indr=getininum("LeastMac.INI","HMACRO","pIndR"); // 行末字上げ数
// <BLOCKQUOTE> として見なすので単発扱い // 行末字上げreset
writeininum "LeastMac.INI","HMACRO","pIndR",0;
insert leftstr(" ",#Indr); // 準備
//
// 判定の式とcall文を1行にするとcallネストが深すぎerrorが出る?
while(0>strstr(gettext(0,y,linelen,y),"J")){
call Reform1;
}
// マクロ文の改行分割位置の入れ方で動作が変わってしまう !
// 経験浅いので、特徴はわからない。Mifesのように1行1文も何だし。
replacedown "J","";#y=y;
// 止めマーク消し ラッキーとしか言いようない。【疲れた】
golinetop;beginrect;moveto #Indr,#seltopy;delete; // 行末字上げ
// 次の空白類でない文字
moveto 0,#y+1;
while(' '==code||' '==code||0x9==code||0xD==code){
right;if(!result)break;}
enabledraw; // どうする?
//
endmacro;
// ============================================================
Reform1:// 現在行のインデント継続 1行整形/秀丸禁則に依存する
#y=y; // 元の行位置
// 次行インデント消し(連結準備)
golineend;right;while(0x20==code||0x9==code)right;deletebefore;
left;if(0xD==code)delete; // 次行とつなげる。
if(#y!=y)insertreturn; // 行長一杯の時カーソルは下に行く
else if(!return){golineend;right;insertreturn;} // 長くなった行末
//insertreturn により自動インデントが働く。
return;//-------------------------------------------------
// 2回やってダメなら手修正,マクロに頭を使うより体を使う。
// 実操作時間としては1行ずつやってもあまり違わないと思う。
// 改善点:行中の空白によりインデント位置がずれる。
// その時は、もう一回。そういう行はたいてい整形対象外の
// 割り付け固定行。軽く判定できそうなら?
// マクロ起動のカーソル位置を段落の第2行からのほうがいいかも?
// ごくわずかkey数は少ない、ただ解りやすさの障害がある。
// これは、第1行スタートだが。
%%%%% REFORDd.mac
// 定義箇条書き段落整形
// 第1行は独立で連結しない
// 行頭位置だけの簡単な処理 利口じゃない カーソルがビュンビュン
// 作業用の画面に流し込む処理形式じゃないと何回もなめてしまう。
//
// 直前マクロ再実行準備 自分の名前は取得できないので
// マクロ名変更時には修正せよ。
writeinistr "LeastMac.INI","HMACRO","arg0","REFORDd.mac";
//
if(!selecting){beep;endmacro;} // 1行処理 はあり得ない
#seltopy=seltopy;#selendy=selendy;escape; // 整形範囲
if(#seltopy==#selendy){beep;endmacro;} // 1行処理
//
//disabledraw; // マクロらしくなってきた。お好みにより設定
#Indr=getininum("LeastMac.INI","HMACRO","dIndR"); // 行末字上げ数
moveto 0,#seltopy;while(' '==code||code==0x9)right;#firstInd=x;
golineend2;right; while(' '==code||code==0x9)right;#seconInd=x;
//
moveto 0,#selendy;golineend;insert "@"; // 総範囲
#subtopy=#selendy+1;
while(#subtopy>#seltopy){
#subendy=#subtopy-1;moveto 0,#subendy; // 1条選択
while(1){call isForS; // ↑ 処理方向
if(##return=='開') {#subtopy=y;break;}
if(y<=#seltopy) {#subtopy=y;break;} golinetop2;left; } //
//
moveto 0,#subtopy;golineend2;if(y<#subendy){ // 第2行があるか?
// 第2行以降整形
moveto 0,#subendy;golineend;insert "J"; // 外字マークで止める
moveto 0,#subtopy;golineend2;right; // 第2行頭出し
while(' '==code||0x9==code)right;deletebefore;
insert leftstr( " ",#seconInd+#Indr);
while(0>strstr(gettext(0,y,linelen,y),"J")){
call Reform1;
}
replacedown "J","";} // 止めマーク消し
// 第1行整形
moveto 0,#subtopy;while(' '==code||0x9==code)right;deletebefore;
insert leftstr(" ",#firstInd+#Indr);
while(!return){golineend;right;insertreturn;}
} // --------------------- sub loop
//
replacedown "@","";#y=y;
golinetop;beginrect;moveto #Indr,#seltopy;delete; // 行末字上げ
// 次の空白でない段
moveto 0,#y+1;
while(' '==code||' '==code||0x9==code||0xD==code){
right;if(!result)break;}
enabledraw; // どうする?
//
endmacro;
// ============================================================
//------------------------------------------------------
isForS: // インデント比較 どちらに近いか
golinetop2;while(code==' '||0x9==code){right;if(!result)break;}
if(0x9==code||eof==code)return '空';
if(#firstInd<=#seconInd){ // 普通の形
if(x<=#firstInd)return '開';if(x>=#seconInd)return '続';
if((x-#firstInd)<(#seconInd-x))return '開'; return '続';
}else{
// 中央揃え
if(x>=#firstInd)return '開';if(x<=#seconInd)return '続';
if((#firstInd-x)<(x-#seconInd))return '開'; return '続';
}
endmacro; // error
// -----------------------------------------------------
// ============================================================
Reform1:// 現在行のインデント継続 1行整形/秀丸禁則に依存する
#y=y; // 元の行位置
// 次行インデント消し(連結準備)
golineend;right;while(0x20==code||0x9==code)right;deletebefore;
left;if(0xD==code)delete; // 次行とつなげる。
if(#y!=y)insertreturn; // 行長一杯の時カーソルは下に行く
else if(!return){golineend;right;insertreturn;} // 長くなった行末
//insertreturn により自動インデントが働く。
return;//-------------------------------------------------
//
%%%%% REFORDu.mac
// 番号無し箇条書き段落整形
// 第1行も連結する。
// 行頭位置だけの簡単な処理 利口じゃない カーソルがビュンビュン
// 作業用の画面に流し込む処理形式じゃないと何回もなめてしまう。
//
// 直前マクロ再実行準備 自分の名前は取得できないので
// マクロ名変更時には修正せよ。
writeinistr "LeastMac.INI","HMACRO","arg0","REFORDu.mac";
//
//
if(!selecting){beep;endmacro;} // 1行処理 はあり得ない
#seltopy=seltopy;#selendy=selendy;escape; // 整形範囲
if(#seltopy==#selendy){beep;endmacro;} // 1行処理
//
//disabledraw; // マクロらしくなってきた。お好みにより設定
#Indr=getininum("LeastMac.INI","HMACRO","dIndR"); // 行末字上げ数
moveto 0,#seltopy;while(' '==code||code==0x9)right;#firstInd=x;
golineend2;right;while(' '==code||code==0x9)right;#seconInd=x;
//
moveto 0,#selendy;golineend;insert "@"; // 総範囲
#subtopy=#selendy+1;
while(#subtopy>#seltopy){
#subendy=#subtopy-1;moveto 0,#subendy; // 1条選択
while(1){call isForS; // ↑ 処理方向
if(##return=='開') {#subtopy=y;break;}
if(y<=#seltopy) {#subtopy=y;break;} golinetop2;left; } //
//
#flagF='F'; // インデント処理用
moveto 0,#subendy;golineend;insert "J"; // 外字マークで止める
// 1条整形
moveto 0,#subtopy;while(' '==code||0x9==code)right;deletebefore;
insert leftstr(" ",#firstInd+#Indr);
while(0>strstr(gettext(0,y,linelen,y),"J")){
call Reform1;
if(#flagF=='F'&&y>#subtopy){ #flagF='S'; // インデント変更
if(#firstInd<#seconInd)
insert leftstr( " ",
#seconInd-#firstInd);
else if(#firstInd>#seconInd)
{left #firstInd-#seconInd;deletebefore;}
} }
golinetop;replacedown "J",""; // 止めマーク消し
} // --------------------- sub loop
//
replacedown "@","";#y=y;
golinetop;beginrect;moveto #Indr,#seltopy;delete; // 行末字上げ
// 次の空白でない段に移動
moveto 0,#y+1;
while(' '==code||' '==code||0x9==code||0xD==code){
right;if(!result)break;}
enabledraw; // どうする?
//
endmacro;
// ============================================================
//------------------------------------------------------
isForS: // インデント比較 どちらに近いか
golinetop2;while(code==' '||0x9==code){right;if(!result)break;}
if(0x9==code||eof==code)return '空';
if(#firstInd<=#seconInd){ // 普通の形
if(x<=#firstInd)return '開';if(x>=#seconInd)return '続';
if((x-#firstInd)<(#seconInd-x))return '開'; return '続';
}else{
// 中央揃え
if(x>=#firstInd)return '開';if(x<=#seconInd)return '続';
if((#firstInd-x)<(x-#seconInd))return '開'; return '続';
}
endmacro; // error
// -----------------------------------------------------
// ============================================================
Reform1:// 現在行のインデント継続 1行整形/秀丸禁則に依存する
#y=y; // 元の行位置
// 次行インデント消し(連結準備)
golineend;right;while(0x20==code||0x9==code)right;deletebefore;
left;if(0xD==code)delete; // 次行とつなげる。
if(#y!=y)insertreturn; // 行長一杯の時カーソルは下に行く
else if(!return){golineend;right;insertreturn;} // 長くなった行末
//insertreturn により自動インデントが働く。
return;//-------------------------------------------------
//
// どうしても長くなってしまう!
|
|