【Q&A原稿】マクロ内での「\」の使い方No.00096
TAKA さん 98/03/02 02:07
 
これは、[HMM0014A]から、飛べるようにして欲しい内容です。
#「知っていると便利な秀丸の機能」に入れてもらえるのかな?

時間がなかったため、きいろいまふらあ さんから指摘された部分
が直っていません。(以前と同一)
必要であれば、どなたかに直して頂けると助かります。

●マクロ内での「\」の使い方
【0】ここに書いてあること
【1】「\」の意味
【2】「\」の使用例
【3】最後に


【0】ここに書いてあること

マクロを組み始めた方で、「\」の使い方がよく分からないという
方を対象に、「\」の使い方とその理由を説明しています。
自分は知っているという方は、「【2】「\」の使用例」の一番最
後の「改行検索を行うマクロ」を見て下さい。(今まで間違った使
い方をしている人がいるかもしれませんので)
最後まで読めば、今後「\」で悩まされることがなくなるかもしれ
ません。


【1】「\」の意味

マクロ内での「\」(これ以降、コメント内で使用する「\」は除く
ものとします)は、例外なく特殊文字として扱われます。
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
「\」が出てくると、その次の文字が何であるかを調べて、それに
見合った処理(16進コードに置き換え)を行っています。
「\」を使う場合として、次のものが挙げられます。
「\\」  :「\」自身(16進数の「5C」、10進数の「92」)
「\"」  :「"」自身(16進数の「22」、10進数の「34」)
「\t」  : タブ    (16進数の「09」、10進数の「9」)
「\n」  : 改行    (16進数の「0A」、10進数の「10」)
「\x??」:16進数 (例えば「\x41」で、16進数の「41」、10
                    進数の「65」)

試しに、以下のマクロを実行して見てください。
順に、「92」、「34」、「9」、「10」、「65」と表示されます。

//---- 「\」の扱いを調べるテストマクロ ---------------------
    $str = "\\\"\t\n\x41";
    #len = strlen( $str );
    #i = 0;
    while( #i < #len )
    {
        message str( ascii ( midstr( $str, #i, 1 ) ) );
        #i = #i + 1;
    }
    endmacro;
//---- ここまで --------------------------------------------

どうでしょう。これだけでもかなり理解できたのではないでしょう
か?


【2】「\」の使用例

では、実際に「\」が出てくるマクロをいくつか書いてみましょう。
但し、テストの為に書いてあるマクロですので、エラーチェック等
は一切行っていません。

ファイル「c:\test.txt」をオープンするマクロは、どう書けばい
いのでしょう。

//---- ファイルをオープンするテストマクロ ------------------
    openfile "c:\\test.txt";
    endmacro;
//---- ここまで --------------------------------------------

ファイル名に「\」を使いたい訳ですから、「\」自身を表す「\\」
を使用するようになります。

改行を挿入するマクロは、どう書けばいいのでしょう。

//---- 改行を挿入するテストマクロ --------------------------
    insert "改行する文章\n改行した後の文章";
    endmacro;
//---- ここまで --------------------------------------------

改行を表現したい時は、「\n」でしたね。

正規表現による改行検索を行うマクロは、どう書けばいいのでしょ
う。

//---- 改行検索を行うテストマクロ(その1) ----------------
    searchdown "\\n", regular;
    endmacro;
//---- ここまで --------------------------------------------

このマクロを見て、「あれっ、改行って確か「\n」だから、
「searchdown "\n", regular;」じゃないの。試しに動かしたら、
ちゃんと検索したぞー」と言う人がいるかもしれません。
実は、これが最初に陥りやすい(陥る)罠なのです。では、何が罠
なのかを順番に説明していきます。

改行の後に「test」を入れた、次のような文章を用意して下さい。

//---- 改行検索を行うテスト文章 ----------------------------

test
test
test
//---- ここまで --------------------------------------------

例が、悪いかもしれませんが、(あくまでもテストをするというこ
とで)改行とそれに続く「test」を検索する場合を考えてみましょ
う。罠に落ちた人は、次のようなマクロを書くと思います。

//---- 改行検索を行うテストマクロ(その2−誤) ------------
    searchdown "\ntest", regular;
    endmacro;
//---- ここまで --------------------------------------------

どうです。動きましたか?
悲しいかな、このマクロでは動きません。

では、次のようなマクロでテストして見てください。

//---- 改行検索を行うテストマクロ(その2−正) ------------
    searchdown "\\ntest", regular;
    endmacro;
//---- ここまで --------------------------------------------

今度は、ちゃんと動きましたね。
これは、どういうことなのでしょうか。
種明かしは非常に簡単です。通常の検索ダイアログで、正規表現を
使って改行を検索する場合を考えて下さい。検索文字列には、「\n」
を入力しますよね。ここまで言えば、もうお分かりですね。「\n」
という文字列をマクロ内で指定したい訳ですから、「\\n」として
やればいいことになります。
「\n」だと16進数で「0A」になる(通常の文字と異なる)ため、
うまく検索出来ない場合(正しい使い方でないため)があるのです。


【3】最後に

「\」の使い方を大体は理解して頂けたと思いますが、完璧に理解
するためには実践で鍛えるのが手っ取り早いかもしれません。実践
で躓いた時にでも、もう一度読み直してみて下さい。ある日突然、
目の前が明るくなるでしょう。

[ ]