「選択文字列を“一括”全角に」できませNo.06721
かたつむり さん 11/08/03 14:26
 
かたつむりです。
マクロ作成初心者です。お知恵をお貸しください。

以下のマクロを作成しました。
3点問題(★)があります。
この問題点を解決したいので、方法をご教授いただきたく、お願い申し上げます。

●マクロの目的;英文中で連続する半角大文字(2文字以上、つまり略語)を探し、
全角大文字に変換する。
●注意点;選択した「英文中の連続する半角大文字(以下“半角略語”)」を全角に
する−しないを選択できるようにする。

以下マクロです。
*****************
//半角大文字(略語)を全角大文字に変換する

gofiletop;
message "ファイル内で半角英大文字(2文字以上)を全角にします";
begingroupundo;
while(1){
 if( selecting == 1 ) escape; //選択中であれば範囲選択の解除
 searchdown2 "[A-Z]{2,}", regular, casesense ;
  //カーソル位置以下で半角英字(連続2文字以上、大小区別)を検索
 if(!result) break;  //上記でなかったら、whileループを出る
 call zenkaku;         //サブルーチン呼出
}
endgroupundo;
endmacro;

zenkaku: //サブルーチン
 menu"(&1)gettext( seltopx, seltopy, selendx, selendy )を全角にしますか?",
"(&2)しません";  //gettext;選択した文字列を変数に格納(文字列型)
 if( result == 1 )
  searchdown2 gettext( seltopx, seltopy, selendx, selendy );
 else moveto selendx, selendy; //選択が「2」だったら、範囲選択を終了した
カーソル位置に移動
 tozenkakuhira;   //全角にします
 escape;
return;
********************
以上です。

★問題点1;選択した半角略語がファイル内に複数あるなら、すべて一括して(最初
に選択した時点で、それ以降の同一半角略語についても一括して)全角にしたいので
すが、その方法が分かりません。
類似マクロ(*)では、同一であっても1つ1つ前から順番に「全角にしますか?」
と確認してきて、一括では処理しません。
(*)サブルーチン内の「menu文」を「question文(全角にしますか?はい−いい
え)」にしたもの。これは作動しました。

★問題点2
サブルーチン内でメニュー表示式にしたいのですが、
上記の記述ではメニュー内に「gettext( seltopx, seltopy, selendx, selendy )を
全角にしますか?」とでてしまいます。
「gettext( seltopx, seltopy, selendx, selendy )」の部分に、「選択文字列その
もの」を表示するのはどうすればいいのでしょうか?

★問題点3
問題点2に関連しますが、
$a = gettext( seltopx, seltopy, selendx, selendy )
と変数に指定しておき、
menu"(&1)$$aを全角にしますか?", "(&2)しません";
とすればいいかと考えました。
ところが、「$a = gettext( seltopx, seltopy, selendx, selendy )」の置き場が分
かりません。
どこかに挿入すると、マクロを実行したときに必ずその1行後の文に対してエラーが
出ます。
(このマクロのみならず、他のマクロにおいても、変数の置き場(マクロの組み立て
方)がどうも分からないので伺います。)
あるいは、この設定そのものが問題なのでしょうか?

以上です。

上記★問題点1,2,3を解決するには、どうすればいいかお教えいただければあり
がたいです。
どうぞよろしくお願いいたします。

かたつむり


[ ]
RE:06721 「選択文字列を“一括”全角に」No.06722
秀まるお2 さん 11/08/03 15:05
 
 マクロ命令の「tozenkakuhira;」は、範囲選択してる部分を変換するだけでし
て、gettextで取り込んだ文字列変数の中身を変換するようなことは出来ないで
す。

 やり方としては、まずは

    setcompatiblemode 0x0200;

 を実行して、検索でヒットした文字列を範囲選択するようにしつつ、それから
メニューを出して、変換するとなった場合はそのままtozenkakuhiraで変換する
ってやり方でいいんじゃないかと思います。

 それと、gettext関数を普通に呼び出すと範囲選択が解除されてしまうので、
そうならないようにするためには、第5パラメータに数値の1を指定するって方
法があります。

 こちらで試しに作ったマクロは以下のようになりました。

    setcompatiblemode 0x0200;
    gofiletop;
Loop:
    searchdown "[A-Z]{2,}", regular, casesense;
    if( !result ) {
        endmacro;
    }
    $text = gettext( seltopx, seltopy, selendx, selendy,1 );
    menu "(&1)" + $text + "を全角に変換しますか?",
        "(&2) しません。";
    if( result == 0 ) {
        endmacro;
    } else if( result == 1 ) {
        tozenkakuhira;
    } else {
        moveto selendx, selendy;
    }
    if( selecting ) {
        escape;
    }
    goto Loop;

[ ]
RE:06721 「選択文字列を“一括”全角に」No.06725
山紫水明 さん 11/08/03 20:40
 
 かたつむりさん,

>★問題点1;選択した半角略語がファイル内に複数あるなら、すべて一括して
>(最初に選択した時点で、それ以降の同一半角略語についても一括して)全角
>にしたいのですが、その方法が分かりません。

指標になる変数を一つ設定しておき,それで判断させたらいかがでしょう。
たとえば,最初に
#flag = 0;
としておき,一回目で全角にしたら
#flag = 1;
として,後は #flag が 1 であれば,メニューを出さないで無条件に全角にする
という具合です。
                          山紫水明(ユーザー)
                          SANSHISUIMEI

[ ]
RE:06725 お礼;やってみますNo.06726
かたつむり さん 11/08/04 08:28
 
秀まるお2様、山紫水明様

貴重なご助言をありがとうございました。
早速検討して、結果を報告いたします。
取り急ぎお礼のみにて失礼いたします。

かたつむり


[ ]
RE:06725 「選択文字列を“一括”全角に」No.06727
かたつむり さん 11/08/05 15:57
 
山紫水明さま、みなさま、
かたつむりです。

以下の通りにしてみました。
以下マクロ
********************
//半角略語(連続2文字以上)を全角にします
//問題点;全部一括全角に!メニューで聞いてこない
//問題点;一括やり直しができない

    setcompatiblemode 0x0200; //検索でヒットした文字列を選択範囲するように設定
    #flag = 0;  //同一文字の一括置換のため初期設定
    gofiletop;
    begingroupundo;

Loop:
    searchdown2 "[A-Z]{2,}", regular, casesense;
    if( !result ) endmacro;
    if( #flag == 1) tozenkakuhira;
    else {
     $text = gettext( seltopx, seltopy, selendx, selendy,1 );
     menu "(&1)" + $text + "を全角に変換しますか?",
        "(&2) しません。";
     if( result == 0 ) {
         endmacro;
     } else if( result == 1 ) {
  tozenkakuhira;
         #flag = #flag + 1;
     } else {
         moveto selendx, selendy;
     }
    }
    if( selecting ) {
        escape;
    }
endgroupundo;
    goto Loop;
********************************
以上です。

(1)マクロ2行目に「#flag = 0;」
(2)Loop内の3−4行目に「if( #flag == 1) tozenkakuhira; else {……「if( s
electing )」の前にカッコ閉じ(})」
(3)同12行目に「#flag = #flag + 1;」
を入れました。

すると、1つめでメニュー表示された時に「yes」を押すと、別の半角略語であって
もすべてを一括置換してしまいます。
また、1つめでメニュー表示された時に「no」を押すと、次の候補でメニュー表示さ
れ、
その時に「yes」を押すと、その候補以降の別の半角略語もすべてを一括置換してし
まいます。

根本的にマクロ構造が読み込めていないせいだとは思うので恐縮ですが、
「同一略語のみを一括で全角に」して「別の略語はメニュー表示で聞いてくる」形に
するためのヒントを、もう少しいただけないでしょうか?
よろしくお願いいたします。

かたつむり





[ ]
RE:06727 「選択文字列を“一括”全角に」No.06728
K'zawa さん 11/08/06 01:38
 
かたつむりさん、こんにちは。
K'zawaです。

>//問題点;一括やり直しができない

あちこちで、endmacroで終っているので、
endgroupundoを通っていませんね。



  setcompatiblemode 0x20F;
  #skp = 0;
  if( selecting ) escape;
  begingroupundo;
  while( 1 ) {
    searchdown2 "[A-Z]{2,}", regular, nohilight;
    if( ! result ) break;

    call Hit;
    if( ##return == false ) break;

    escape;
    moveto #x, #y;

  }
  endgroupundo 1;
  endmacro;

// ヒット時サブルーチン
// 戻り値trueなら継続、falseなら中断
Hit:
  #x = selendx; #y = selendy;  // 次の検索開始点(仮)

  // 変数に入れて選択維持
  $$sch = gettext(seltopx, seltopy, selendx, selendy, 1);

  while( ##i < #skp ) {
    // スキップ指示済みなら戻る
    if( $$sch == $skip[##i] ) return true;
    ##i = ##i + 1;
  }

  menu "(&1)" + $$sch + "を全角に変換しますか?",
       "(&2) しません。";
  if( result == 0 ) {
    return false;
  } else if( result == 2 ) {
    $skip[#skp] = $$sch;  // スキップ指示済み文字列として保持
    #skp = #skp + 1;  // 保持数
    return true;
  }

  // ここから変換処理
  tozenkakuhira;
  #x = selendx; #y = selendy;  // 次の検索開始点(修正)

  // 変数に入れて選択解除
  $$rep = gettext(seltopx, seltopy, selendx, selendy);

  // 前後が大文字でない条件も付けて全置換
  replaceallfast "(?<![A-Z])" + $$sch + "(?![A-Z])", $$rep, regular,
nohilight;
  return true;

[ ]
RE:06727 「選択文字列を“一括”全角に」No.06729
山紫水明 さん 11/08/06 08:30
 
 かたつむりさん,

 題意をとり違えていました。1回変換したら後はすべての半角略語を全角に変
換するものと思って前回のような発言をしました。
 したがって, #flag 云々はまったく関係ないことでした。失礼しました。

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:06729 「選択文字列を“一括”全角に」No.06730
かたつむり さん 11/08/06 09:04
 
K'zawaさま、山紫水明さま、秀まるお2さま

早々のご助言をありがとうございました。

K'zawaさまのマクロを試させていただき、また結果を報告いたします。
山紫水明さま、了解いたしました。
今回の目的とは異なったものの、今後の参考になります。
ありがとうございました。

また、前回の投稿では秀まるお2さまへの報告が欠如しており、大変失礼いたしまし
た。
作製いただいたマクロで、思い通りにメニュー表示にて、全角変換ができました。感
激です。
setcompatiblemodeの知識がまだなかったもので、勉強になりました。
ただ、「同一略語ならファイル全体で一括変換する」ことはできておりません。
これができないものかと欲張っております。
まあ、地道に「yes」を押して1つずつ変換していけばいいのかもしれません。

みなさま、本当にありがとうございました。

かたつむり

[ ]
RE:06730 「選択文字列を“一括”全角に」No.06731
K'zawa さん 11/08/06 10:43
 
かたつむりさん、こんにちは。
K'zawaです。

※行が消えてしまってました。これがないと全置換により、#x,#yが
次の検索開始点ではなくなってしまう可能性があります。
テキストの中途半端なところからマクロを走らせた場合ですけど。


  setcompatiblemode 0x20F;
  #skp = 0;
  if( selecting ) escape;
gofiletop;  // ※
  begingroupundo;
  while( 1 ) {
  …

[ ]
RE:06731 「選択文字列を“一括”全角に」No.06732
かたつむり さん 11/08/08 12:15
 
K'zawaさま

ありがとうございます。
「gofiletop;」を入れたことにより、私が希望するとおりの作業を実行してくれまし
た。感激です。

いただいたマクロをきっちり理解して、自分の知識にしたいと思います。
本当にありがとうございました。

かたつむり

[ ]