座標の扱いを column, linenoに統一するたNo.06459
IKKI さん 05/03/08 02:30
 
IKKI です。こんばんは。
便乗してネタを掘り出してみます。


・ gettext2() … column, lineno を引数に取るもの
・ seltopcolumn, seltoplineno, selendcolumn, selendlineno

hidesoft.2:13805 でも申し上げましたが、これらは必要です。

ライブラリに公開するような汎用マクロは、1行の文字数が極端に少ない環境
でも正しく動作しなければなりません。したがって x, y は使用せず、
column, lineno で座標を管理することになります。
(column, lineno) と (x, y) の変換は実際にカーソルを動さないとできません。
カーソルを動かすと範囲選択は解除されてしまいますから、一時変数に記憶して
選択範囲を復元する処理を入れます。
秀丸マクロ言語はこのような事情を想定して設計されていますか?

「面倒でも可能だ」という声が聞こえてきそうです。
が、それが面倒であるばかりに、折り返しのある文章では正しく動作しない
ようなマクロが多く作られてはいないでしょうか?
それを真面目に実装したマクロは複雑怪奇なカーソル移動と一時変数の塊に
なるのではないでしょうか?
それはマクロ利用者と開発者の双方にとって良いことでしょうか?

っと、お忙しいところ駄文を投げてしまい失礼しました。
あくまで私見にすぎませんが、ご一考いただければ幸いです。


> 3.「gettext」の扱える文字数の大幅UP
たしかに、文字列変数の 8KB 制限はマクロ開発の足かせになっていますね。
今度追加された filter にはそのような制約はないのかな…?

> 9.キーボードによるマウスカーソルの移動
> → 例えば、[Ctrl]+矢印キー、など。
それはアプリケーションレベルではなく、ドライバレベルで実現すべきことと
個人的には感じます。
「猫まねき」や「窓使いの憂鬱」をお試しになってはいかがでしょう。

[ ]
RE:06459 座標の扱いをcolumn, linenoに統No.06460
IKKI さん 05/03/08 02:34
 
っとっと、スレッドを切ってしまいました。
先の投稿は
http://www.maruo.co.jp/turukame/3/x06451_.html#6451
へのレスでした。
失礼いたしました。

[ ]
RE:06459 座標の扱いを column, linenoにNo.06473
Iranoan さん 05/03/08 12:52
 
 IKKI さん今日は、Iranoan です。
> ・ gettext2() … column, lineno を引数に取るもの
> ・ seltopcolumn, seltoplineno, selendcolumn, selendlineno
 確かに現在は、column←→x, lineno←→y への変換が煩雑すぎる、という
か IKKI さんの仰るように、範囲選択されている場合を考えると、どの様な場
合分けをすれば良いかすら直ぐには解らないので、これには反対しません。
 ただ今思いついたのですが、これらは個別に用意して頂くより、column2x()
等の相互変換関数を用意して頂ければ、より自由度が高いのではないでしょう
か?
 実装の難易度や内部的な問題もあるので、こうしてください、ということで
はありませんが(^^)。

 最後に、
> ライブラリに公開するような汎用マクロは、1行の文字数が極端に少ない環境
> でも正しく動作しなければなりません。したがって x, y は使用せず、
> column, lineno で座標を管理することになります。
の理由だけ解りません。宜しければ、お教えください。

[ ]
RE:06473 座標の扱いを column, linenoにNo.06489
秀丸担当 さん 05/03/08 16:45
 

> ・ gettext2() … column, lineno を引数に取るもの
> ・ seltopcolumn, seltoplineno, selendcolumn, selendlineno

以前にも前向きに検討するということになっていましたが、V5.00を機会にやっ
たほうがいいかもしれません。
Iranoanさんの言う、column2xのような変換する関数もあったほうがいいかもし
れません。
toを2という表現はマクロでは使っていないので、columntoxのほうがいいでしょ
うか。
秀丸の関数の構造上、
#x = columntox( #lineno, #column );
#y = lienotoy( #lineno, #column );
という二度手間になってしまいますが。

[ ]
RE:06489 座標の扱いを column, linenoにNo.06492
Iranoan さん 05/03/08 17:28
 
 秀丸担当さん今日は、Iranoan です。
> 以前にも前向きに検討するということになっていましたが、V5.00を機会にやっ
> たほうがいいかもしれません。
> Iranoanさんの言う、column2xのような変換する関数もあったほうがいいかもし
> れません。
 あまり関数などが増えると、全体の見通しが悪くなるので、変換する関数が
あれば、gettext2() 等は要らないと、個人的には考えます。
 ##皆さんのご希望や、秀丸担当さんのお考え次第ですが。

> toを2という表現はマクロでは使っていないので、columntoxのほうがいいでしょ
> うか。
 それはお任せします。

[ ]
RE:06492 座標の扱いを column,linenoに統No.06515
IKKI さん 05/03/08 22:11
 
IKKI です。こんばんは。

> > 以前にも前向きに検討するということになっていましたが、V5.00を機会にやっ
> > たほうがいいかもしれません。

よろしくお願いいたします。

>  あまり関数などが増えると、全体の見通しが悪くなるので、変換する関数が
> あれば、gettext2() 等は要らないと、個人的には考えます。

変換関数というアイディアは私も脳裏をかすめました。ユーザーの視点に立つと

  $s = gettext2(#c0, #l0, #c1, #l1);
  $s = gettext(columntox(#c0, #l0), linenotoy(#c0, #l0), columntox(#c1, #l
1), linenotoy(#c1, #l1))

どちらが全体の見通しがよいか、という話になりましょうか。

------------------------
以下、雑談です。

> 範囲選択されている場合を考えると、どの様な場
> 合分けをすれば良いかすら直ぐには解らない

ほんとですね。愚直に書くとこんなサブルーチンができるでしょうか…
これで十分だという確信が持てませんが。 (^^;

WhereIsSelection:
  // 選択範囲を column, lineno で返す
  // 始点 = (#sbc, #sbl), 終点 = (#sdc, #sdl)
  if (!selecting) {
    #sdc = column;
    #sdl = lineno;
    #sbc = column;
    #sbl = lineno;
  } else {
    ##flg = (x == selendx) | (y == selendy) * 2 | rectselecting * 4;
    ##sbx = seltopx;
    ##sby = seltopy;
    ##sdx = selendx;
    ##sdy = selendy;
    escape;
    moveto ##sdx, ##sdy;
    #sdc = column;
    #sdl = lineno;
    moveto ##sbx, ##sby;
    #sbc = column;
    #sbl = lineno;
    if (##flg < 3) {
      moveto ##sdx, ##sdy;
      beginsel;
      moveto ##sbx, ##sby;
    } else if (##flg == 3) {
      moveto ##sbx, ##sby;
      beginsel;
      moveto ##sdx, ##sdy;
    } else if (##flg == 4) {
      moveto ##sdx, ##sdy;
      beginrect;
      moveto ##sbx, ##sby;
    } else if (##flg == 5) {
      moveto ##sbx, ##sdy;
      beginrect;
      moveto ##sdx, ##sby;
    } else if (##flg == 6) {
      moveto ##sdx, ##sby;
      beginrect;
      moveto ##sbx, ##sdy;
    } else if (##flg == 7) {
      moveto ##sbx, ##sby;
      beginrect;
      moveto ##sdx, ##sdy;
    }
    endsel;
  }
  return;

> の理由だけ解りません。宜しければ、お教えください。

ごめんなさい。言葉足らずでした。

> > ライブラリに公開するような汎用マクロは、1行の文字数が極端に少ない環境
> > でも正しく動作しなければなりません。

これは「私がそのような信念を持ってマクロを作っている」ということであって、こ
の考えを人様に押しつけるつもりはありません。誤解された方がいらっしゃいました
らお詫び申し上げます。
こういう考えに至った理由は次のとおりです。

 ・ライブラリにアップする⇔人様に使っていただく
 ・人様の環境や使い方には口出しできない
 ∴ライブラリにアップするマクロはどのような環境でも正しく動くべきだ

> > したがって x, y は使用せず、
> > column, lineno で座標を管理することになります。

これは、処理対象が折り返しをまたぐ場合を特別扱いしなくていいようにです。
って、ご説明するまでもありませんね。失礼しました。

[ ]
RE:06515 座標の扱いを column,linenoに統No.06522
Iranoan さん 05/03/09 00:18
 
 IKKI さん今日は、Iranoan です。
> > 範囲選択されている場合を考えると、どの様な場
> > 合分けをすれば良いかすら直ぐには解らない
>
> ほんとですね。愚直に書くとこんなサブルーチンができるでしょうか…
> これで十分だという確信が持てませんが。 (^^;
 これでもまだだめな場合があります(^^)。それは、範囲選択の方法によって、
カーソル位置が異なりますが、それを考慮する必要がある場合です。また「範
囲選択開始」で範囲選択された場合は、endsel を使うと、マクロの開始時、
終了時で状態が変わってしまいます。
 何てことまで考えると、ドツボにはまります(^^)。

> > > column, lineno で座標を管理することになります。
>
> これは、処理対象が折り返しをまたぐ場合を特別扱いしなくていいようにです。
> って、ご説明するまでもありませんね。失礼しました。
 まだ解りません(;_;)。
 マクロで扱える文字数は、どうせ 8000 文字程度なので、
$s = "";
#i = 0;
while( strstr($s,"\n") && strlen($s)<7000 && y + #i < linecount){
  $s = $s + gettext( 0, y + #i, 0, y + #i + 1 );
  #i = #i + 1;
}
とでもすれば、折り返しは考えなくても良いと思うのですが...。何か、根本
的な間違いを犯しているのでしょうね。

[ ]
RE:06522 座標の扱いを column,linenoに統No.06558
カモノハシ さん 05/03/10 00:41
 
こんばんは横から失礼いたします、カモノハシと申します。

まだ秀丸マクロでそんなに経験を積んでいるわけではないのですが、
これに関しては前々から不便に思っていたので……(汗)

> まだ解りません(;_;)。
> マクロで扱える文字数は、どうせ 8000 文字程度なので、
>$s = "";
>#i = 0;
>while( strstr($s,"\n") && strlen($s)<7000 && y + #i < linecount){
>  $s = $s + gettext( 0, y + #i, 0, y + #i + 1 );
>  #i = #i + 1;
>}
>とでもすれば、折り返しは考えなくても良いと思うのですが...。何か、根本
>的な間違いを犯しているのでしょうね。
揚げ足取りのようになってしまいますが、「折り返しを考えた」からこそ↑の
ようなコードになるのではないでしょうか?

直感的には「カーソル位置から右側の30文字を取得したい」という処理は
$str = gettext(x,y,x+30,y);
と書きたいです。(現状はコレだと折り返しやタブ文字などでポシャります)
lineno,columnでの取得が出来るようになるとほぼ同じことが可能になります
その論理行の残りが30文字未満でもlinelen2とのチェックだけでOKですし。
単純に文字列を取得するのにループまわして少しずつ連結ってのは手としてあ
りでもとても取っつきにくいです。

秀丸上での見た目を中心に考えた場合x,yでの座標管理が有効に働きますが、
書かれているデータそのものとしての文字列が処理のメインで、それがどう表
示されようがあまり気にしない場合は、lineno,columnで管理する論理行の座
標管理が使いやすいと思います。

で、メインの話題としては
「そのくらい範囲選択のことを考えずに出来たらいいなぁ〜」
ということです。

長文失礼致しました m(_ _)m

[ ]
RE:06489 座標の扱いを column, linenoにNo.06596
Iranoan さん 05/03/11 17:39
 
 秀丸担当さん、IKKI さん今日は、Iranoan です。
> > ・ seltopcolumn, seltoplineno, selendcolumn, selendlineno
>
> 以前にも前向きに検討するということになっていましたが、V5.00を機会にやっ
> たほうがいいかもしれません。
 β4 で実装されて、ふと思ったのですが、表題のことが主題なら、
foundtopcolumn, foundtoplineno, foundendcolumn, foundendlineno
も欲しくなる気がします。どうでしょう?->IKKI さん

[ ]
RE:06596 座標の扱いを column, linenoにNo.06606
秀丸担当 さん 05/03/11 18:13
 

> β4 で実装されて、ふと思ったのですが、表題のことが主題なら、
>foundtopcolumn, foundtoplineno, foundendcolumn, foundendlineno
>も欲しくなる気がします。どうでしょう?->IKKI さん

そうくると思いましたが、増やしすぎるのも何なので、こちらは xtocolumn な
どで対処していただきたいです。

[ ]
RE:06606 座標の扱いを column, linenoにNo.06612
Iranoan さん 05/03/11 19:56
 
 秀丸担当さん今日は、Iranoan です。
> そうくると思いましたが、増やしすぎるのも何なので
 元々私は、seltopcolumn 等も xtocolumn 等があれば良いと思っているので、
それで構いません。
finddown2;
$s = gettext2(foundtopcolum,foundtoplineno,foundendcolum,foundendlineno);
と使いたい人がいるかな、と思っただけなので。

[ ]
RE:06558 座標の扱いを column,linenoに統No.06624
IKKI さん 05/03/14 01:18
 
IKKI です。こんばんは。

# しばらく留守にしてた間に大きく進展してますね…(汗)
# いつも仕事の早い秀丸担当さんに敬意を。

▼秀丸担当さん

早速の対応ありがとうございました。これでマクロが格段に書きやすくなり
ました。やはりマクロは気軽に書けてこそ創作意欲が湧くというものです。

さて、ちょっとコメントが遅かったかもしれませんが:

・foundtopcolumn 等がないのは中途半端ではないでしょうか。
 言語仕様のような基盤となる部分は質的バランスが重要かと思います。
 肥大の懸念はわかりますが、すでに 500 近い予約語がある言語においては
 いまさら感も否めません。(^^;

・columntox() 等の名前は xat() 等のほうが良かったかも。
 引数は column だけではないですし、長いとソースが読みづらい…。

・gettext() でもうひとつ惜しいのは選択範囲が解除される点です。
 解除されないように…という話はどういう結論になったのでしたっけ。(^^;

・文字列を単純に1次元のストリームとして扱いたい処理があります。
 マクロで「ファイル先頭からのオフセットが x バイトの位置」という形で
 文字列を扱うことについて、秀丸担当さんのご意見をお聞きしたいです。

----------------
以下、雑談です。

▼カモノハシさん

> 揚げ足取りのようになってしまいますが、「折り返しを考えた」からこそ↑の
> ようなコードになるのではないでしょうか?

おっしゃるとおりです。

> その論理行の残りが30文字未満でもlinelen2とのチェックだけでOKですし。

linelen2 を超える値を指定しても問題ないのでは?

▼Iranoan さん

> > これは、処理対象が折り返しをまたぐ場合を特別扱いしなくていいようにです。
>  まだ解りません(;_;)。
> 何か、根本的な間違いを犯しているのでしょうね。

gettext() に限った話をしているのではない…とか、いろいろコメントの余地は
ありますが。根本的には「視点の違い」でしょうね。

デベロッパ(サイトー企画)の立場としては、言語仕様はコンパクトにしたい。
抱えるものは少ない方が開発・保守のコストがかかりませんから。
Python の思想 "There's only one way to do it" に通じるものがあります。
ただ、これが実用的な言語として成り立つには強力なライブラリが不可欠です。

ユーザー(マクロ作者)の立場としては、できるだけ手軽に目的を達成したい。
マクロ作りは省力化が目的であってマクロ作りが目的ではありませんから。
Perl の思想 "There's more than one way to do it" の方が好まれます。
秀丸マクロはライブラリ化を強力にサポートしているとは言えません※から、
言語側である程度充実した機能を提供すべきだと私個人は感じています。

Iranoan さんと私の談義が噛み合わなかったのは、 Iranoan さんがユーザーの
視点をお持ちであると仮定して私が話を進めてしまったからだと思います。
失礼いたしました。

# この話題をサーベイしていて笑ってしまったページをひとつ。
http://www.shlomifish.org/humour/ways_to_do_it.html

----------------
※「そんなことはない」という声が聞こえてきそうです。たしかに
INI ファイルを経由すれば execmacro に引数を与えることはできるし
DLL を使えば編集バッファ外のことは何でもできます。
ここで言っているのはそうではなくて、基本的な設計思想の話です。


長文失礼いたしました。
秀丸と秀丸コミュニティのさらなる発展を願っております。

[ ]
RE:06624 座標の扱いを column,linenoに統No.06652
Iranoan さん 05/03/14 14:01
 
 IKKI さん今日は、Iranoan です。
> ・gettext() でもうひとつ惜しいのは選択範囲が解除される点です。
>  解除されないように…という話はどういう結論になったのでしたっけ。(^^;
 こちらについては、以前要望自体はでています。
http://hidemaruo.dip.jp:81/turukame/turukame_3/x00079.html#99
ただ実装されてはいません。

> > 揚げ足取りのようになってしまいますが、「折り返しを考えた」からこそ↑の
> > ようなコードになるのではないでしょうか?
>
> おっしゃるとおりです。
 私は、文字数に制限があるので、どちらにしても似た処理は必要だと考え、
先の発言となりました。

> Iranoan さんと私の談義が噛み合わなかったのは、 Iranoan さんがユーザーの
> 視点をお持ちであると仮定して私が話を進めてしまったからだと思います。
 確かに完全に考え方が違うのでしょうね。
 私は UNIX 系の OS も使うせいか、"Simple is best." が根本にあります。
だから逆に現在の gettext() の仕様は、なんで選択解除するんだろう? と
思ってしまいます。また、逆に実装は簡単にして置いて、別ファイルのサブ・
ルーチンを呼べたらなあ〜、という方向に思考 (嗜好かも) が働きます(^^)。

[ ]
RE:06624 座標の扱いを column,linenoに統No.06662
秀丸担当 さん 05/03/14 16:45
 

>・foundtopcolumn 等がないのは中途半端ではないでしょうか。
> 言語仕様のような基盤となる部分は質的バランスが重要かと思います。
> 肥大の懸念はわかりますが、すでに 500 近い予約語がある言語においては
> いまさら感も否めません。(^^;

確かにそうではありますが、肥大の懸念のためにこれでいこうと思います。

>・columntox() 等の名前は xat() 等のほうが良かったかも。
> 引数は column だけではないですし、長いとソースが読みづらい…。

確かにcolumntoxは長いし引数も2つあるので、変かもしれません。
xat()は短いですが、逆のcolumnat()はやっぱり長いです。あと命名のコンセプ
トに合わない気もします。
何かいい名前があるといいですが。

>・gettext() でもうひとつ惜しいのは選択範囲が解除される点です。
> 解除されないように…という話はどういう結論になったのでしたっけ。(^^;

互換性からそのままということになっていましたが、引数を拡張してやる方向で
考えたいと思います。

>・文字列を単純に1次元のストリームとして扱いたい処理があります。
> マクロで「ファイル先頭からのオフセットが x バイトの位置」という形で
> 文字列を扱うことについて、秀丸担当さんのご意見をお聞きしたいです。

秀丸に読み込まれた時点で、エンコードや改行の変換により、ファイル先頭から
はオフセットとは違うものになっています。
linelen等で計算できるので、基本的にテキストを扱うテキストエディタとして
はやらないでいいのではないかと思います。

[ ]
RE:06662 座標の扱いを column,linenoに統No.06678
IKKI さん 05/03/14 23:38
 
IKKI です。ご返答ありがとうございました。

> >・gettext() でもうひとつ惜しいのは選択範囲が解除される点です。
>
> 互換性からそのままということになっていましたが、引数を拡張してやる方向で
> 考えたいと思います。

これが実現すれば v5 では gettext() 周りの弱点がなくなると思います。
期待しています。

> 秀丸に読み込まれた時点で、エンコードや改行の変換により、ファイル先頭から
> はオフセットとは違うものになっています。
> linelen等で計算できるので、基本的にテキストを扱うテキストエディタとして
> はやらないでいいのではないかと思います。

納得しました。ありがとうございます。

[ ]
RE:06652 座標の扱いを column,linenoに統No.06679
IKKI さん 05/03/14 23:52
 
IKKI です。簡単にコメントだけ。

>  確かに完全に考え方が違うのでしょうね。
>  私は UNIX 系の OS も使うせいか、"Simple is best." が根本にあります。

言語をシンプルにするとコードが繁雑になるし、逆もまた然り。
ふたつの考えは相容れないのではなくて、要はバランスの取り方だと思います。
このへんがサイトー企画さんの腕の見せ所なのかなと。

> 別ファイルのサブ・ルーチンを呼べたらなあ〜、という方向に
> 思考 (嗜好かも) が働きます(^^)。

そのようなライブラリ化の枠組みが調っていれば "Simple is best" の思想も
生きてくるのですが(Iranoan さんが優れたライブラリを書いてくれるから)。

いかんせん、秀丸マクロは基本設計があまりに素朴で…。

[ ]