if ( code == '\t' ) という記述方法につNo.03839
haru さん 03/08/18 15:43
 
 何方かのマクロを参考にして、

if ( code == '\t' )

 という使い方をしたら、一応、うまく行きました。

if ( code == '\n' )

 だと、うまく行きません。

 正式にこういう使い方(前者)をして良いかどうか、わかりませ
んが、後者も使えるように、していただけないのでしょうか?
 よろしくお願いします。

[ ]
RE:03839 if ( code == '\t' ) という記述No.03844
アルビレオ さん 03/08/18 18:32
 
アルビレオです。

> 何方かのマクロを参考にして、
>
>if ( code == '\t' )
>
> という使い方をしたら、一応、うまく行きました。
>
>if ( code == '\n' )
>
> だと、うまく行きません。

内部の詳しい動作を知っているわけではありませんが、文字定数内の \ の扱い
がC言語などと同等のものだと考えれば自然なことだと思います。

if ( code == '\t' )
の \t が展開されて
if ( code == '[TAB]' )
となっても文法上は問題ありませんが、([TAB]は文字コード0x09のつもり)

if ( code == '\n' )

if ( code == '
' )
となってしまうと、トークンの途中で改行されたことになりおかしくなります。

> 正式にこういう使い方(前者)をして良いかどうか、わかりませ
>んが、後者も使えるように、していただけないのでしょうか?

そういうい仕様が可能なのかどうかも怪しいですが、文字定数の仕様があいまい
になり、内部の実装もかなりややこしくなりそうなので賛成したくありません。

[ ]
RE:03844 if ( code == '\t' ) という記述No.03845
でるもんた さん 03/08/18 21:52
 
でるもんたです。

> > 何方かのマクロを参考にして、
> >
> >if ( code == '\t' )
> >
> > という使い方をしたら、一応、うまく行きました。
> >
> >if ( code == '\n' )
> >
> > だと、うまく行きません。
>
> 内部の詳しい動作を知っているわけではありませんが、文字定数内の \ の扱い
> がC言語などと同等のものだと考えれば自然なことだと思います。

いや、C 系の言語では if ( code == '\n' ) という構文は許されていますから、
同等だと考えるのはおかしいでしょう。

試しに、こういうマクロを書いて試してみました。

----ここから
message "\\t="+str('\t');
message "\\n="+str('\n');
message "\\r="+str('\r');

insert "\n";
left;
message "Code="+str(code);
----ここまで

結果は
\t=9
\n=10
\r=114
Code=13
でした。つまり、

1.カーソルが改行の位置にあるときに、code は 13 になる
 (マクロヘルプにそういう仕様と書いてある)
2.ところが、'\n'は10を表すので、codeと一致しない

のが原因です。1. の仕様はいまさら変えられないので、可能ならば '\n' が
13 を示すように仕様変更してもらうのがベストだと思います。

ちなみに一般に、'\n' が 10 を表す環境では、'\r' で 13 を表すのですが、
秀丸(手元の 3.19 で確認)には \r という書き方は存在しないようです。




以下余談

> if ( code == '\t' )
> の \t が展開されて
> if ( code == '[TAB]' )
> となっても文法上は問題ありませんが、([TAB]は文字コード0x09のつもり)
>
> if ( code == '\n' )
> が
> if ( code == '
> ' )
> となってしまうと、トークンの途中で改行されたことになりおかしくなります。

このように、\○ を文字に置換してから構文解析するということはありえないです。
そんな実装にしてしまうと、たとえば、
 $hoge = "\"";
という書き方に意味がなくなってしまいます。

[ ]
RE:03845 if ( code == '\t' ) という記述No.03849
アルビレオ さん 03/08/19 00:16
 
アルビレオです。

>> if ( code == '\n' )
>> が
>> if ( code == '
>> ' )
>> となってしまうと、トークンの途中で改行されたことになりおかしくなります。
>
>このように、\○ を文字に置換してから構文解析するということはありえないです。
>そんな実装にしてしまうと、たとえば、
> $hoge = "\"";
>という書き方に意味がなくなってしまいます。

ですね。
かなりぼけてました。すみません。

[ ]
RE:03845 if ( code == '\t' ) という記述No.03855
Iranoan さん 03/08/19 10:47
 
 でるもんたさん今日は、Iranoan です。
> message "\\r="+str('\r');
<中略>
> \r=114
についてはバグとして、Ver..4.00β1 の時点で修正され「\r=10」となります。

> ちなみに一般に、'\n' が 10 を表す環境では、'\r' で 13 を表すのですが、
> 秀丸(手元の 3.19 で確認)には \r という書き方は存在しないようです。
 存在しないわけではないそうです。
> 調べてみたところ、"\n"や"\r"を文字列中に書いた場合、\x0aとして処理
> されています。→http://www.maruo.co.jp/turukame/3/x00809_.html#812

> 可能ならば '\n' が
> 13 を示すように仕様変更してもらうのがベストだと思います。
 これを遣ると上位互換性が無くなってしまうので、ベストとは言えません。
むしろあまり使われていない \r を常に 0x0D として扱って頂ければスッキリ
する気がします。

[ ]
RE:03845 if ( code == '\t' ) という記述No.03856
haru さん 03/08/19 10:52
 
 皆さん、貴重な御意見、ありがとうございます。
 了解しました。
 '\t'以外は使わないことにします。

[ ]
RE:03856 if ( code == '\t' ) という記述No.03858
でるもんた さん 03/08/19 14:30
 
でるもんたです。ちゃちゃ。

> '\t'以外は使わないことにします。

'\'' と '\\' はどうしても必要ですから、必要があったら使ってくださいね(^^;)

[ ]
RE:03858 if ( code == '\t' ) という記述No.03859
haru さん 03/08/19 15:38
 
でるもんたさん、こんにちは。

>'\'' と '\\' はどうしても必要ですから、必要があったら使ってくださいね(^^;)
 お気遣い、ありがとうございます。
 必要なときは、そうします。

[ ]
RE:03855 if ( code == '\t' ) という記述No.03865
Iranoan さん 03/09/02 19:32
 
 秀丸担当さん今日は、Iranoan です。
> むしろあまり使われていない \r を常に 0x0D として扱って頂ければスッキリ
> する気がします。
 こちらについてご意見を頂ければ幸いです。

 ヘルプの
>  目次−検索系コマンド−検索−正規表現−エスケープシーケンス

> \r  キャリッジリターン(文字コード13)
とある事ですし、如何でしょう。

 あと
http://www.maruo.co.jp/hidesoft/2/x15321_.html#15322
http://www.maruo.co.jp/turukame/3/x01906_.html#2908
http://www.maruo.co.jp/turukame/3/x02913_.html#2913
http://www.maruo.co.jp/turukame/3/x02792_.html#2914
http://www.maruo.co.jp/turukame/3/x02612_.html#2920
へのフォローも宜しくお願いします。(最後の 4 つは秀まるおさんの担当分か
も知れませんが...。)

[ ]
RE:03865 if ( code == '\t' ) という記述No.03866
秀丸担当 さん 03/09/05 18:27
 
> ヘルプの
>>  目次−検索系コマンド−検索−正規表現−エスケープシーケンス
>に
>> \r  キャリッジリターン(文字コード13)
>とある事ですし、如何でしょう。

\rは13にすることにしようと思います。

[ ]
RE:03866 if ( code == '\t' ) という記述No.03867
Iranoan さん 03/09/05 18:57
 
 秀丸担当さん今日は、Iranoan です。
> \rは13にすることにしようと思います。
 採用有り難うございます。

[ ]