文字の変換についてNo.05557
yasuyyasu さん 07/05/25 01:52
 
こんばんは。またまたお教え頂きたく投稿させて頂きました。

実は、【秀丸エディタのマクロライブラリ】にありました、
「全角半角大小文字変換マクロ Ver4.4(付マクロ取り消しマクロ) (山紫水明さ
ん) http://hide.maruo.co.jp/lib/macro/zenhandaisho44.html 」
を愛用させて頂いておりましたが、いくつか追加したい文字の変換がありましたので、
山紫水明さんのマクロに他の作者の方の作成したマクロを追加して、希望のマクロを
作成しました。

ところがこの作成したマクロは、続けて何度か使用していると突然動かなくなってし
まうのです。

マクロ初心者で知識もないのに、推測だけで勝手に追加したり、削除したからだと思
うのですが、
どこをどう直したらよいか分かりません。
是非、どのようにしたら動かなくなるということがなくなるかお教え頂けると幸いで
す。
よろしくお願い致します。


このマクロで希望する動きは次の2つです。
(1)文字の全半角の変換(Mojimenu にあるもの)
(2)範囲指定をしない場合は、自動的に全範囲での変換

連続して使用すると動かなくなってしまうマクロは以下の通りです↓↓↓↓↓↓

----------------------------------------------------------------

//オプション
#save = 0;   //実行前に保存の確認をする---「1」,しない---「0」
#conf = 0;   //最後に確認をする---「1」,確認しない---「0」


if( #save && updated ) {
    question "ファイルが更新されています。\nいったん保存しますか?";//★オプ
ション:保存の確認
    if( result == yes ) save;
}

if(!selecting)selectall;//全範囲選択

if( rectselecting ) #rectsel = 1;//範囲選択の場合
#bx = seltopx;    #by = seltopy;
#ex = selendx;    #ey = selendy;
#rs = 1;   //選択で範囲の内外の判定フラグ
#ec = 0;   //実行回数記録用

Mojimenu:
menu "【全角に変換】",
     " ・英字",
     " ・数字",
     " ・記号",
     " ・カタカナ",
     "   →英数字",
     "   →すべて全角",
     "【半角に変換】",
     " ・英字",
     " ・数字",
     " ・記号",
     " ・カタカナ",
     "   →英数字",
     "   →すべて半角",
     "【英字変換】",
     " ・大文字",
     " ・小文字",
     "【日本語変換】",
     " ・ひらがな⇔カタカナ";
#r = result;
escape;
moveto #ex, #ey;
if(#r == 0) endmacro;
else if(#r == 1 ||#r == 8 || #r == 15 #r == 18) goto Mojimenu;
else if(#r == 2) $replace = "[A-Za-z]";
else if(#r == 3) $replace = "[0-9]";
else if(#r == 4) $replace = "[-:;&$!\~ \",.%\'()<>/#・。、「」]";
else if(#r == 5) $replace = "[ヲ-゚ー]";
else if(#r == 6) $replace = "[A-Za-z0-9]";
else if(#r == 7) $replace = "[-:;#$&/()<>!\~ \'\"%・ A-Za-z0-9,.ヲ-゚。、「」]";
else if(#r == 9) $replace = "[A-Za-z]";
else if(#r == 10) $replace = "[0-9]";
else if(#r == 11) $replace = "[、-○!-~,.%・¥”¥’¥()<>/&#$:;]";
else if(#r == 12) $replace = "[ァ-ヶー゛゜]";
else if(#r == 13) $replace = "[A-Za-z0-9]";
else if(#r == 14) $replace = "[:;$/&#()<>¥”¥’%・¥、-○!-~A-
Za-z0-9,.ァ-ヶー゛゜]";
else if(#r == 16) $replace = "[a-za-z]";
else if(#r == 17) $replace = "[A-ZA-Z]";
if( #r == 16 ) call ToCapital;
else if( #r == 17 )  call ToSmall;
else if( #r == 19 )  call Tozenkakukata;
else if( #r > 1 && #r < 8 ) call ToZenkaku;
else if( #r > 8 && #r <= 14 ) call ToHankaku;
escape;
moveto #ex, #ey;
redraw;
call Reset_search;
enabledraw;
if( #conf ) {
    question "確定しますか?";//★オプション:保存の確認
    if( !result ) {
        disabledraw;
        while( #ec ) {
            undo;
            #ec = #ec - 1;
        }
        enabledraw;
    }
}
//実行結果をクリップボードに記録(Undo用)
setclipboard "ZenhanDaisho.mac" + "\x0d\x0a";
addclipboard str(#ec);
endmacro;

ToCapital:
while(1){
    searchup $replace, regular;//
    if( result == 0 || y < #by || (y == #by && x < #bx) ) break;
    if( #rectsel ) call RectSel;
    if( #rs ) toupper;
    #ec = #ec + 1;
    escape;
}
return;

ToSmall:
while(1){
    searchup $replace, regular;//
    if( result == 0 || y < #by || (y == #by && x < #bx) ) break;
    if( #rectsel ) call RectSel;
    if( #rs ) tolower;
    #ec = #ec + 1;
    escape;
}
return;

ToZenkaku:
while(1){
    searchup $replace, regular;
    if( result == 0 || y < #by || (y == #by && x < #bx) ) break;
    if( #rectsel ) call RectSel;
    if( #rs && ( code == '゙' || code == '゚' ) ) { //併せて1字として扱う
        escape; left; beginsel; right; right;
    }
    if( #rs ) tozenkakukata;
    #ec = #ec + 1;
    escape;
}
return;

ToHankaku:
while(1){
    searchup $replace, regular;//
    if( result == 0 || y < #by || (y == #by && x < #bx) ) break;
    if( #rectsel ) call RectSel;
    if( #rs ) tohankaku;
    #ec = #ec + 1;
    escape;
}
return;

Tozenkakukata:
if(!selecting)selectall;

    #x1 = seltopx;
    #y1 = seltopy;
    #x2 = selendx;
    #y2 = selendy;
    moveto #x1, #y1;
    while ( (#x1 != #x2) || (#y1 != #y2) )
    {
    escape;
    beginsel;
    #c = code;
    right;
    #x1 = x;
    #y1 = y;


    if ((0x829F <= #c) && (#c <= 0x82F1))// ぁ〜ん
    {
    tozenkakukata;
    }
    else if ((0x8340 <= #c) && (#c <= 0x8393))// ァ〜ン
    {
    tozenkakuhira;
    }
    }
    escape;


RectSel:
if( x >= #bx && x < #ex ) #rs = 1;
else #rs = 0;
return;

Save_search:    //検索状態を保存・変更
$sb = searchbuffer;
#so = searchoption;
if ( !searchmode ) {    // 検索状態を範囲選択に変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound",1;
    #modechange = 1;
    envchanged;
    closereg;
}
return;

Reset_search:   //検索状態を元に戻す
if ( #modechange ) {
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound",#s_mode;
    envchanged;
    closereg;
}
setsearch $sb, #so;
return;
----------------------------------------------------------------

[ ]
RE:05557 文字の変換についてNo.05558
ENCODINGSHIFTJIS さん 07/05/25 12:09
 
Save_search
は、どこで実行されていますか

[ ]
RE:05558 文字の変換についてNo.05559
yasuyyasu さん 07/05/25 12:55
 
ENCODINGSHIFTJIS さん こんにちは。

お恥ずかしい話なのですが、私はマクロの初心者ですので、
Save_search がどこで実行されているかも理解出来ておりません。

最初にダウンロードして使わせて頂いていた
「全角半角大小文字変換マクロ Ver4.4(付マクロ取り消しマクロ) (山紫水明さ
ん)」が基本になっており、これに他の方が作られたマクロをコピー&ペーストした
り、メニューの順番を変えたりと、少し手を加えました。

マクロに関して無知の為に、ご質問にお答え出来ず、申し訳ございません・・・。
以下、基本となっているマクロを貼り付けしましたので、ご参考になれば幸いです。


「全角半角大小文字変換マクロ Ver4.4(付マクロ取り消しマクロ) (山紫水明さ
ん)」
http://hide.maruo.co.jp/lib/macro/zenhandaisho44.html
は以下のとおりです。↓↓↓↓↓↓↓↓↓↓↓↓↓↓

//// ○オプション○ //////////////////////////////////////////
#save = 1;   //実行前に保存の確認をする---「1」,しない---「0」
#conf = 1;   //最後に確認をする---「1」,確認しない---「0」
///////////////////////////////////////////////////////////////

if( #save && updated ) {
    question "ファイルが更新されています。\nいったん保存しますか?";
    if( result == yes ) save;
}
call Save_search;
disabledraw;
if( !selecting ) {
    disableinvert;
    question "全文で変換しますか?";
    if( !result ) endmacro;
    else selectall;
}
if( rectselecting ) #rectsel = 1;//BOX 範囲選択の場合
#bx = seltopx;    #by = seltopy;
#ex = selendx;    #ey = selendy;
#rs = 1;   //BOX 選択で範囲の内外の判定フラグ
#ec = 0;   //実行回数記録用
Mojimenu:
menu " 文 字 の 変 換",
     "A) 英字大文字に",
     "B) 英字小文字に",
     "【全角に変換】",
     "C) 英 数 字",
     "D) 英    字",
     "E) 数    字",
     "F) カタカナ",
     "【半角に変換】",
     "G) 英 数 字",
     "H) 英    字",
     "J) 数    字",
     "K) カタカナ";
#r = result;
escape;
moveto #ex, #ey;
if(#r == 0) endmacro;
else if(#r == 1 ||#r == 4 || #r == 9) goto Mojimenu;
else if(#r == 2) $replace = "[a-za-z]";
else if(#r == 3) $replace = "[A-ZA-Z]";
else if(#r == 5) $replace = "[A-Za-z0-9,.]";
else if(#r == 6) $replace = "[A-Za-z,.]";
else if(#r == 7) $replace = "[0-9,.]";
else if(#r == 8) $replace = "[ヲ-゚]";
else if(#r == 10) $replace = "[A-Za-z0-9,.]";
else if(#r == 11) $replace = "[A-Za-z,.]";
else if(#r == 12) $replace = "[0-9,.]";
else if(#r == 13) $replace = "[ァ-ヶー゛゜]";
if( #r == 2 ) call ToCapital;
else if( #r == 3 )  call ToSmall;
else if( #r > 4 && #r < 9 ) call ToZenkaku;
else if( #r > 9 && #r <= 13 ) call ToHankaku;
escape;
moveto #ex, #ey;
redraw;
call Reset_search;
enabledraw;
if( #conf ) {
    question "確定しますか?";
    if( !result ) {
        disabledraw;
        while( #ec ) {
            undo;
            #ec = #ec - 1;
        }
        enabledraw;
    }
}
//実行結果をクリップボードに記録(Undo用)
setclipboard "ZenhanDaisho.mac" + "\x0d\x0a";
addclipboard str(#ec);
endmacro;

ToCapital:
while(1){
    searchup $replace, regular;//
    if( result == 0 || y < #by || (y == #by && x < #bx) ) break;
    if( #rectsel ) call RectSel;
    if( #rs ) toupper;
    #ec = #ec + 1;
    escape;
}
return;

ToSmall:
while(1){
    searchup $replace, regular;//
    if( result == 0 || y < #by || (y == #by && x < #bx) ) break;
    if( #rectsel ) call RectSel;
    if( #rs ) tolower;
    #ec = #ec + 1;
    escape;
}
return;

ToZenkaku:
while(1){
    searchup $replace, regular;
    if( result == 0 || y < #by || (y == #by && x < #bx) ) break;
    if( #rectsel ) call RectSel;
    if( #rs && ( code == '゙' || code == '゚' ) ) { //併せて1字として扱う
        escape; left; beginsel; right; right;
    }
    if( #rs ) tozenkakukata;
    #ec = #ec + 1;
    escape;
}
return;

ToHankaku:
while(1){
    searchup $replace, regular;//
    if( result == 0 || y < #by || (y == #by && x < #bx) ) break;
    if( #rectsel ) call RectSel;
    if( #rs ) tohankaku;
    #ec = #ec + 1;
    escape;
}
return;

RectSel:
if( x >= #bx && x < #ex ) #rs = 1;
else #rs = 0;
return;

Save_search:    //検索状態を保存・変更
$sb = searchbuffer;
#so = searchoption;
if ( !searchmode ) {    // 検索状態を範囲選択に変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound",1;
    #modechange = 1;
    envchanged;
    closereg;
}
return;

Reset_search:   //検索状態を元に戻す
if ( #modechange ) {
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound",#s_mode;
    envchanged;
    closereg;
}
setsearch $sb, #so;
return;

//----------------------------------------------------------------//

[ ]
RE:05559 文字の変換についてNo.05560
ENCODINGSHIFTJIS さん 07/05/25 14:17
 
call Save_search;
を、派生元と同じ位置に置いてみましょう。

[ ]
RE:05560 文字の変換についてNo.05561
yasuyyasu さん 07/05/25 16:27
 
ENCODINGSHIFTJIS さん、こんにちは。

お教え頂いた通り、元の場所に置いてみました。
(if(!selecting)selectall;の前に入れました)

今、20回弱このマクロを連続して使用してみましたが、動かなくなることがなくなり
ました!
ありがとうございました!!

元のマクロ(山紫水明さん作成)の「全文で変換しますか?」の
ダイアログを表示させたくなかったので、
その周辺を削除して、if(!selecting)selectall; を入れてみたのですが、
削除しすぎていたんですね・・・。

やはり、もっともっと便利に使えるように自分でもがんばりたいと思います。

この度は本当にありがとうございました!感謝申し上げます!!





[ ]