RE:06747 論理行頭文字が処理されないNo.06748
秀まるお2 さん 11/08/26 18:34
 
 秀丸エディタの全置換(replaceall)での、「inselect」を指定して「選択し
た範囲内のみ」の置換をする場合、範囲選択が行単位でないとダメという制限が
あります。行単位で選択されてない場合は、選択された範囲を含む行全体が置換
対象に含まれます。

 なので、今回のマクロはとにかく行単位でしか置換しないことになると思いま
す。

 で、とりあえず僕の方でどうやったらいいか考えてみたんですけども、範囲選
択での全置換が行単位であるという制限を克服するための方法が2つあります。

 1つは、置換したい範囲の前後を無理矢理改行で区切って置換させる方法、

 もう1つは、HmJre.dllをロードして、それのReplaceRegularNoCaseSense関数
を使って置換の処理を編集の上で実行する方法です。

 後者の方法がお勧めなのでそれのマクロの例を書きますと、以下のようになり
ます。

    #x = x; #y = y;
    golineend2;
    $text = gettext( #x, #y, x, y );
    moveto #x, #y;
    loaddll "hmjre.dll";
    #x = dllfunc("FindRegularNoCaseSense", "[a-z\\- ]", $text, 0);
    if( #x >= 0 ) {
        question "「英字、ハイフン、スペース;いずれも半角」を一括削除OK?";
        if( result == yes ) {
            $text2 = dllfuncstr("ReplaceRegularNoCaseSense"
                             , "[a-z\\- ]", $text, 0, "", 1);
            beginsel;
            golineend2;
            begingroupundo;
            delete;
            insertfix $text2;
            endgroupundo;
        }
    }

 このマクロはカーソル位置から行末までの置換をして、それが終わったら
マクロも終わります。もしも置換が終わった後に次の行以降も確認付きで連続処
理したいってことでしたら、以下のマクロでいいと思います。

    loaddll "hmjre.dll";
    begingroupundo;
    while(1) {
        searchdown2 "[a-z\\- ]", regular;
        if( !result ) {
            break;
        }
        question "「英字、ハイフン、スペース;いずれも半角」を一括削除OK?";
        if( result == yes ) {
            #x = x;
            #y = y;
            golineend2;
            $text = gettext( #x, #y, x, y );
            moveto #x, #y;
            $text2 = dllfuncstr("ReplaceRegularNoCaseSense"
                               , "[a-z\\- ]", $text, 0, "", 1);
            beginsel;
            golineend2;
            begingroupundo;
            delete;
            insertfix $text2;
            endgroupundo;
        } else {
            break;
        }
    }
    endgroupundo 1; //1つずつやり直し可能
    endmacro;


 元のマクロとまったく違う物になってしまって申し訳ないですけど。

 HmJre.dllの関数呼び出しについては、HmJre.dllと同じフォルダにあるHmJre.
chmファイル(ヘルプファイル)に書いてあります。そちらも参照お願いします。

[ ]
RE:06748 論理行頭文字が処理されないNo.06749
かたつむり さん 11/08/27 15:32
 
秀まるお2様

丁寧なご回答をいただいた上、マクロを作成いただき、ありがとうございました。

> 秀丸エディタの全置換(replaceall)での、「inselect」を指定して「選択し
>た範囲内のみ」の置換をする場合、範囲選択が行単位でないとダメという制限が
>あります。行単位で選択されてない場合は、選択された範囲を含む行全体が置換
>対象に含まれます。

「inselect」の詳細がやっと分かりました。
「inselect」と記載していても、自分が選択した以外に他を選択してしまう場合があ
って、
理由が不明でした。「inselect」の意味がよく分からないなぁと思っていました。
行単位(おそらくエディタ的?)指定だったのですね。

他のキーワードにも、詳細がよく分からないものがいくつもあるのですが、
それに関する質問はまた別の機会にいたします。

作成いただいたマクロについては、勝手ながら(今日ではなく)来週にも使わせてい
ただき、
また報告いたします。

私のレベルでは理解できずに再度質問することもあるかもしれませんが、
どうぞよろしくお願いいたします。

本当にありがとうございました。
取り急ぎ、まずはお礼まで。

かたつむり


[ ]
RE:06748 論理行頭文字が処理されないNo.06751
かたつむり さん 11/08/31 14:45
 
秀まるお2様

かたつむりです。
お作りいただいたマクロを実行しました。
本当にありがとうございました。

1つめのマクロは望む結果を返してくれました。

(1)1つ問題がありました。
 2つめの連続処理用のマクロを実行したところ、
 私のマクロ同様(レベルが違いますけど…^^;)、
 論理行頭の1文字目が処理されずに残ってしまいます。
 解決方法をご教授いただけるとありがたいです。

(2)ご投稿いただいた内容について質問です。
> 秀丸エディタの全置換(replaceall)での、「inselect」を指定して「選択し
>た範囲内のみ」の置換をする場合、範囲選択が行単位でないとダメという制限が
>あります。行単位で選択されてない場合は、選択された範囲を含む行全体が置換
>対象に含まれます。
>
> なので、今回のマクロはとにかく行単位でしか置換しないことになると思いま
>す。

という部分が分かったようでいて分かっていなかったと判明しました^^;)。
というのも、私の目的のためには「行単位でしか置換しな」くても構わないと感じる
のですが???
そこで質問ですが、
−1.「行単位でしか置換しない」こと、つまりは「inselect」では
  「行頭の1文字を処理しないことになる」ということでしょうか?
−2.「範囲選択での全置換が行単位であるという制限を克服するための方法」とは
  すなわち、『「inselect」を使わない方法』ということでしょうか?

(3)作成いただいたマクロの内容について質問および確認させていただきたいこと
があります。
 以下の行数は1つめのマクロのものです。

−1.マクロ1〜3行目「#x = x; #y = y; golineend2; $text = gettext( #x, #y, x,
 y )」について;
  これが意味するところは、
  『「今のカーソル位置から改行までの文字列すべて
  (「今のカーソル位置が論理行頭であるなら、その段落すべて」)」を変数$text
に記憶する』
  ということでしょうか?

−2.マクロ6行目「#x = dllfunc("FindRegularNoCaseSense", "[a-z\\- ]", $text,
 0)」について;
  パラメータの意味ですが、
  『$textという“範囲内で”、[a-z\\- ]を検索する。検索開始桁位置は先頭から』
  ということでしょうか?
  …−1.にも関連しますが、“範囲内で”という解釈でただしいですか?。

−3.マクロ10−11行目「$text2 = dllfuncstr("ReplaceRegularNoCaseSense", "[a
-z\\- ]", $text, 0, "", 1)」について;
  12行目以降があるということは、
  これが意味するところはあくまで
  『「""」に全置換された文字列(の集合?)を受け取るだけ』であり、
  関数だけでは置換処理が行われるわけではなく、
  戻り値を変数に記憶させて12行目以降の処置が必要である
  と考えてよろしいでしょうか?

−4.マクロ12行目「beginsel」から16行目「insertfix $text2」までについて;
  これらが意味するところは
  『いったん選択した文字列を全削除してから、$text2とごっそり入れ替える』
  ということでしょうか?

−5.上記−4.に関連します。
 a)マクロ12行目「beginsel」は、「何の」範囲選択を開始するのでしょうか?
   『最初のカーソル位置から』の選択でしょうか?
 b)マクロ13行目「golineend2」は、直前の「beginsel(選択開始)」の『終了地
点』でしょうか?
 c)上記a)b)を合わせると、『最初のカーソル位置から論理行末まで選択する』
   ということでしょうか?
 d)マクロ15行目「delete」は、「何を」削除するのでしょうか?
   上記c)の『最初のカーソル位置から論理行末まで選択』したものを削除するの
でしょうか?

以上です。
超初歩的質問を細々と書くのは非常に恐縮なのですが、
聞ける人は身近におらず、恥を忍んで今後のために書かせていただきました。
お手数をおかけして申し訳ございませんが、ご回答いただけるととても勉強になりま
す。
どうぞよろしくお願いいたします。

それにしても、マクロは奥が深いですね。
すべてを把握して利用することはとてもできそうにありませんが、
少しずつでも知識を増やせればと思います。

かたつむり



[ ]
RE:06751 論理行頭文字が処理されないNo.06752
秀まるお2 さん 11/08/31 16:08
 
>  2つめの連続処理用のマクロを実行したところ、
>  私のマクロ同様(レベルが違いますけど…^^;)、
>  論理行頭の1文字目が処理されずに残ってしまいます。

 こちらでテストした限りではそうならないようで、何か根本的に、起きてる現
象が何なのかというのを僕が理解出来てない気がします。

 例えばですが、

abcあああxyz
abcあああxyz
abcあああxyz
abcあああxyz

 のようになってるファイルの先頭にカーソルを移動して、そこでマクロを実行
して連続して「はい」を押して行くと、最終的には

あああ
あああ
あああ
あああ

 のような結果になります。

 かたつもりさんの所では、これが「論理行頭の1文字目だけ処理されない」と
いうことは、

あああ
aあああ
aあああ
aあああ

 のようになってしまうのでしょうか。

 一応、マクロの中を見直した限りでは、もしかしてsearchdown2となってる所
がsearchdownになっていたらそういうことが起こりえると思いますが、
searchdown2を使ってる以上は大丈夫なはずじゃないかと思いますけども…。

 具体的にダメな文章の例があれば原因が究明出来るかと思います。

> −1.「行単位でしか置換しない」こと、つまりは「inselect」では
>   「行頭の1文字を処理しないことになる」ということでしょうか?

 そういうことでは無いです。

> −2.「範囲選択での全置換が行単位であるという制限を克服するための方法」とは
>   すなわち、『「inselect」を使わない方法』ということでしょうか?

 「inselectを使わない方法」、ということには間違い無いです。

 カーソル位置から以降を検索して置換したいということなので、そうだとした
ら、行単位じゃないけども特定範囲内を置換するって処理が必要になると思いま
して、もしそうだとしたら、replaceallでのinselect指定は使えないと思いまし
た。

 カーソル位置以降を全部置換していい(問い合わせメッセージ出さないでとに
かく一括で置換していい)なら、

   while(1) {
       replacedown "[a-z\\- ]", "", regular, nocasesense;
       if( !result ) break;
   }

 みたいな超簡単なマクロでも済みます。

>   これが意味するところは、
>   『「今のカーソル位置から改行までの文字列すべて
>   (「今のカーソル位置が論理行頭であるなら、その段落すべて」)」を変数$text
> に記憶する』
>   ということでしょうか?

 そうなります。

> −2.マクロ6行目「#x = dllfunc("FindRegularNoCaseSense", "[a-z\\- ]", $text,
>  0)」について;
>   パラメータの意味ですが、
>   『$textという“範囲内で”、[a-z\\- ]を検索する。検索開始桁位置は先頭か
> ら』
>   ということでしょうか?

 FindRegularNoCaseSense関数の説明はHmJre.dllのヘルプ(HmJre.chm)に書い
てあるんですが、検索開始位置として0を指定してるので、$textの先頭から置換
していくはずです。

 例えば、

    loaddll "hmjre.dll";
    $text = "aaa";
    #x = dllfunc("FindRegularNoCaseSense", "[a-z\\- ]", $text );
    message str(#x);

 ってマクロを実行してみると、結果「0」が表示されます。ちゃんと先頭から
検索して先頭にヒットしてることが確認出来ます。

>   …−1.にも関連しますが、“範囲内で”という解釈でただしいですか?。

 不明な点があれば、とにかくmessage文を入れまくってマクロの動作を確認す
るのがいいと思います。例えば

   message "FindRegularNoCaseSenseの直前の$textの内容=" + $text;

 とか、そういうmessage文を入れまくってやれば、具体的にマクロのどの時点
で想定外のことが起きているか分かると思います。


> −3.マクロ10−11行目「$text2 = dllfuncstr("ReplaceRegularNoCaseSense", "[a
> -z\\- ]", $text, 0, "", 1)」について;
>   12行目以降があるということは、
>   これが意味するところはあくまで
>   『「""」に全置換された文字列(の集合?)を受け取るだけ』であり、
>   関数だけでは置換処理が行われるわけではなく、
>   戻り値を変数に記憶させて12行目以降の処置が必要である
>   と考えてよろしいでしょうか?

 僕がこの日本語を正しく解釈してるかどうかが問題ですが、もしも正しく解釈
出来ているとしたら、「と考えてよろしいですか?」の答えは「はい」になると
思います。

> −4.マクロ12行目「beginsel」から16行目「insertfix $text2」までについて;
>   これらが意味するところは
>   『いったん選択した文字列を全削除してから、$text2とごっそり入れ替える』
>   ということでしょうか?

 これも同様に「はい」です。

> −5.上記−4.に関連します。
>  a)マクロ12行目「beginsel」は、「何の」範囲選択を開始するのでしょうか?
>    『最初のカーソル位置から』の選択でしょうか?

 beginselを実行した瞬間のカーソル位置から選択開始って意味になります。

 beginselを実行した瞬間のカーソル位置がどこ分からないようでしたら、例え


   message "今からbeginselを実行します。カーソル位置はx=" + str(x)
     + " y=" + str(y);

 みたいな文をbeginselの直前に入れればいいと思います。

>  b)マクロ13行目「golineend2」は、直前の「beginsel(選択開始)」の『終了地
> 点』でしょうか?

 そうなると思います。

>  c)上記a)b)を合わせると、『最初のカーソル位置から論理行末まで選択する』
>    ということでしょうか?
>  d)マクロ15行目「delete」は、「何を」削除するのでしょうか?
>    上記c)の『最初のカーソル位置から論理行末まで選択』したものを削除するの
> でしょうか?

 たぶんこの辺も理解通りだと思いますが、実際にそうなのかどうかはご自身で
message文を入れて確認するのが間違い無いです。

[ ]
RE:06752 論理行頭文字が処理されないNo.06753
かたつむり さん 11/09/01 10:45
 
秀まるお2様

細々した内容に丁寧にお答えくださり、本当にありがとうございました。
私の日本語が未熟で、ご迷惑をおかけしました。
ヘルプを参照しながら「マクロ本文から私がイメージできたこと」を表現するのがと
ても難しく、
質問文が難解になってしまいました。
回答を記入するのも大変なことですのに、読解にまで貴重な時間を割いていただき、
申し訳ありませんでした。

■さて、

>>  2つめの連続処理用のマクロを実行したところ、
>>  私のマクロ同様(レベルが違いますけど…^^;)、
>>  論理行頭の1文字目が処理されずに残ってしまいます。

の件ですが、
誠に誠に失礼しました!申し訳ありません。

テストした例文の「論理行頭の1文字目」が「大文字」でした。
つまり、マクロ中の検索文字列の正規表現に「A-Z」に追加する必要がありました。
追加した結果、論理行頭の1文字目も問題なく処理されました。


■また、非常に有用なアドバイスをいただきました。
 目から鱗、です。

> 不明な点があれば、とにかくmessage文を入れまくってマクロの動作を確認す
>るのがいいと思います。

なるほど!皆さんそのようにして研究し、腕を上げていかれるのですね。
これなら今回のような愚問で皆様を煩わす回数も減る(なくなるわけではないことは
ご容赦を…)と期待されますね。
ありがとうございました。


■補足ですが、難解な日本語の代表例の件、

>> −3.マクロ10−11行目「$text2 = dllfuncstr("ReplaceRegularNoCaseSense", "[a
>> -z\\- ]", $text, 0, "", 1)」について;
>>   12行目以降があるということは、
>>   これが意味するところはあくまで
>>   『「""」に全置換された文字列(の集合?)を受け取るだけ』であり、
>>   関数だけでは置換処理が行われるわけではなく、
>>   戻り値を変数に記憶させて12行目以降の処置が必要である
>>   と考えてよろしいでしょうか?
>
> 僕がこの日本語を正しく解釈してるかどうかが問題ですが、

頭を混乱させて非常に申し訳なく…。

言い換えれば****

「置換処理させるには、この関数だけでは行われない。
この関数は『「""」に全置換された文字列(の集合?)を返すだけ』である。
実際の置換処理は12行目以降のマクロ文にて行われる」と考えてよろしいでしょう
か?******

というものでした。
…まだ難解でしょうか???…すみません…
これは再質問ではなく補足です。
解釈に間違いがありましたらご指摘ください。


以上ですが、
秀まるお2様には愚問で煩わせて申し訳ありませんでした。
ご回答くださったことに、心より感謝いたします。

ご迷惑をおかけしましたが、私はとても勉強になりました。
一つ一つ、歩みはのろいですが、力にしていきます。
ありがとうございました。

かたつむり







[ ]
RE:06753 論理行頭文字が処理されないNo.06754
秀まるお2 さん 11/09/01 14:10
 
> 「置換処理させるには、この関数だけでは行われない。
> この関数は『「""」に全置換された文字列(の集合?)を返すだけ』である。
> 実際の置換処理は12行目以降のマクロ文にて行われる」と考えてよろしいでしょう
> か?******

 それで合ってるはずです。

 ここで言う「置換処理」というのが、実際のテキストデータ(秀丸エディタの
ウィンドウの中に表示してる文字)を置き換える処理という意味だとしたら、そ
ういうことで合ってます。

 #n = XXXX;

 とかの代入を実行しただけとか、あるいはReplaceRegularNoCaseSense関数呼
び出しをしただけで秀丸エディタの中のテストデータが書き換わることはありま
せんので、実際に書き換えるためには、insert文とかdelete文とかを使う必要が
あります。

[ ]
RE:06754 論理行頭文字が処理されないNo.06755
かたつむり さん 11/09/02 08:45
 
秀まるお2様

さらなるご回答をありがとうございました。

> #n = XXXX;
>
> とかの代入を実行しただけとか、あるいはReplaceRegularNoCaseSense関数呼
>び出しをしただけで秀丸エディタの中のテストデータが書き換わることはありま
>せんので、実際に書き換えるためには、insert文とかdelete文とかを使う必要が
>あります。

なるほど、よく分かりました。
関数はあくまで関数であって、ある答えを算出してくれるだけで、処理を実行する命
令文とは違うと言うことですね。

この度はいろいろと丁寧にお教えいただき、ありがとうございました。
とても勉強になりました。

かたつむり

[ ]