カーソル位置からの検索についてNo.04642
IKKI さん 04/03/08 01:12
 
IKKI です。カーソル位置からの検索について質問と要望です。

■質問: searchdown2 の連続実行判定について

次のマクロは2行目の message 文をコメントアウトすると挙動が変わります。

  searchdown2 "^", regular;
  message "";  // この文の有無で挙動が違う
  searchdown2 "^", regular;

どうやら message 文によって連続実行フラグ?がリセットされているようです。
これは仕様として適切でない気がしますが、いかがでしょうか。
# マクロのデバッグをしていてかなり手こずりました。(^^;
 連続実行フラグがリセットされる文の一覧がほしいです。

それと、連続実行であるかどうかにかかわらず必ずカーソル位置から検索を始める手
段もあっていいのではないでしょうか。

■要望: カーソル位置からの上検索

上検索でカーソル位置から検索を始める簡単・確実な手段がほしいです。

カーソルが特定の文字列上にあるかどうかを調べるのに上検索を使うことがしばしば
あります。このとき、カーソル位置から始まる文字列もヒットさせるために

  right;
  searchup "\n\t*hoge", regular;

などとしますが、 right; などのカーソル移動系文は動作環境によって挙動が異なる
ため、一般に配布するマクロでは使いにくいです。


以上、よろしくお願いします。
# 都合によりしばらく返信できません。本件は後回しにしていただいて結構です。

(秀丸 4.10β21 + Windows 2000)

[ ]
RE:04642 カーソル位置からの検索についてNo.04675
秀丸担当 さん 04/03/09 16:25
 

>■質問: searchdown2 の連続実行判定について

再現させることができました。
フォーカスが変化すると、リセットされてしまうバグでした。
修正させていただきます。

>それと、連続実行であるかどうかにかかわらず必ずカーソル位置から検索を始める手
>段もあっていいのではないでしょうか。

事前に
moveto x, y;
というような感じでカーソルを移動させておくと、連続実行フラグがリセットさ
れます。

>■要望: カーソル位置からの上検索

カーソル位置からの下検索さえできれば、上検索が必要無いように思えるのです
が、どのようなときに必要なのでしょうか?
一応 searchup2 という文ももありますが、意味が無いので searchup と同じ扱
いになっています。

[ ]
RE:04675 カーソル位置からの検索についてNo.04811
IKKI さん 04/03/19 19:22
 
IKKI です。返信が遅くなり失礼しました。

> >■要望: カーソル位置からの上検索
>
> カーソル位置からの下検索さえできれば、上検索が必要無いように思えるのです
> が、どのようなときに必要なのでしょうか?

カーソルが特定の文字列上にあるかどうかを調べるためです。
具体的には、たとえば HTML タグに対し、カーソル位置「|」は

  (1) xx|xx<TAG>xxxx
  (2) xxxx|<TAG>xxxx
  (3) xxxx<T|AG>xxxx
  (4) xxxx<TAG>|xxxx
  (5) xxxx<TAG>xx|xx

の5通りに場合分けできます。これらの判別を

  searchup "<.*?>", regular;

でヒットした座標と元のカーソル位置を比較することで行っています。*1
このとき (3)(4)(5) は簡単に判別できますが、(2) は上検索でヒットしないため
(1) と区別できません。
そこで、上検索で (2) もヒットさせる簡単な方法を要望した次第です。

----------------
*1 もっといい方法があるでしょうか?
----------------

現状では searchup の前に right; を入れていますが、カーソル移動系文の動作は

  ・フリーカーソル
  ・行頭<->行末カーソル移動の禁止
  ・タブ文字の上にカーソル移動した時 = 貫通する

などの設定に影響されるため、検索パターンがタブ文字や改行文字を含んでいるとま
ずいことになります。
そこでさらに、カーソル移動系文の動作を揃えるため、最初に動作環境を変更して最
後に元に戻すルーチンを追加しています。

たかだか上検索のためにここまでするのもなんだかなぁ、と私は思います。


> >■質問: searchdown2 の連続実行判定について
>
> フォーカスが変化すると、リセットされてしまうバグでした。

β23で修正されていることを確認しました。ありがとうございます。

> >それと、連続実行であるかどうかにかかわらず必ずカーソル位置から検索を始める手
> >段もあっていいのではないでしょうか。
>
> 事前に
> moveto x, y;
> というような感じでカーソルを移動させておくと、連続実行フラグがリセットさ
> れます。

わかりました。ほかに連続実行フラグがリセットされる文はありますか?
お時間があれば一覧表をマクロヘルプに載せることをご検討ください。

以上、よろしくお願いいたします。

[ ]
RE:04811 カーソル位置からの検索についてNo.04821
Iranoan さん 04/03/19 23:40
 
 IKKI さん今日は、Iranoan です。
> カーソルが特定の文字列上にあるかどうかを調べるためです。
> 具体的には、たとえば HTML タグに対し、カーソル位置「|」は
<snip>
>   searchup "<.*?>", regular;
<snip>
> ----------------
> *1 もっといい方法があるでしょうか?
> ----------------
・やりたいこと
・上の正規表現で何を検索したいのか
の 2 点が良く解らないので、以下の回答は誤解している可能性があります。

(1) 下検索もしてみる
    つまり
    #x = x;
    #y = y;
    searchdown2 $s;
    if( result ){
      if( #x == foundtopx && #y == foundtopy ){
                  :
                  :
    という処理も加えてはでどうでしょう?
    > > カーソル位置からの下検索さえできれば、上検索が必要無いように思えるの
です
    はそういった意味ではないかと。
(2) > 現状では searchup の前に right; を入れていますが、カーソル移動系文の動
作は
    >
    >   ・フリーカーソル
    >   ・行頭<->行末カーソル移動の禁止
    >   ・タブ文字の上にカーソル移動した時 = 貫通する
    >
    > などの設定に影響される
    ということなら、right の代わりに wordright(salnen) で良いかも。

[ ]
RE:04811 カーソル位置からの検索についてNo.04826
秀丸担当 さん 04/03/22 16:28
 

>カーソルが特定の文字列上にあるかどうかを調べるためです。

なるほど、説明ありがとうございます。
目的はわかりましたが、マクロは、目的のためにマクロ文があるのではなく、要
素の組み合わせで目的を達するものと考えています。
その要素は、全てのコマンドと同じ動作をする文です。
動作環境でカーソル位置から検索するようになっていても、上検索の動作は変わ
らないので、searchup2だけ動作を変えるわけにはいきません。
Iranoanさんが書かれているように、いろいろ方法はあると思います。

>わかりました。ほかに連続実行フラグがリセットされる文はありますか?
>お時間があれば一覧表をマクロヘルプに載せることをご検討ください。

他にも、カーソルが移動するような文でリセットされると思います。
それ以外にもあるかもしれませんが、いろいろな部分で影響されやすいので、こ
の動作に影響されにくいマクロの作りにしておくことをお勧めします。

[ ]
RE:04826 カーソル位置からの検索についてNo.04833
IKKI さん 04/03/23 05:12
 
IKKI です。お返事ありがとうございます。

> 目的はわかりましたが、マクロは、目的のためにマクロ文があるのではなく、要
> 素の組み合わせで目的を達するものと考えています。
> その要素は、全てのコマンドと同じ動作をする文です。

このことは了解しました。

ちょっと話がずれてしまったようです。私の意見はマクロに限った話ではなく、
(検索ダイアログにおいても)カーソル位置から上検索する方法がないのは変だ、と
いうものです。

2つの理由があります。
ひとつは実用面から、先に挙げたマクロの例のほか、置換ダイアログを使って
「カーソル位置/選択範囲を含めて上へ置換」という作業をしばしば行うためです。
# これを秀丸担当さんに理解していただくのは難しいかもしれませんが…。*1

もうひとつは設計思想として、「上検索」と「下検索」はユーザーから見て対称なの
に、用意されている機能が非対称なのはおかしい、と感じるためです。

> Iranoanさんが書かれているように、いろいろ方法はあると思います。

いろいろな方法をケースバイケースで使い分けなければなりません。*2
すべてのケースに対応できる単一の方法が(下検索には用意されているのに)
上検索に用意されていないのは片手落ちであると言えないでしょうか。

ダイアログのように人間がそのつど結果を予測できる場合はまだいいですが、
汎用マクロのように機械的に判断しなければならない場合は困ります。


とても重箱の隅に近い話題ではありますが、秀丸の完成度を高めるために
他のユーザーさんや秀まるおさん、秀丸担当さんを交えて意見交換ができれば
有意義かと存じます。


以下は蛇足です。
--------------
*1 例を挙げます。

  <P>ほげほげほげほげほげほげほげfugaほげほげほげほげほげ
  ぴよぴよfugaぴよぴよぴよfugaぴよぴよぴよfugaぴよぴよ
  うぐうぐうぐうぐうぐfugaうぐうぐうぐうぐうぐうぐfuga</P>

という段落で「fuga」を「<em>fuga</em>」に置換したくなりました。
最後の「fuga」を単語選択し、置換ダイアログを出します。ここで
上検索すると、選択した「fuga」にヒットしません。
下検索してから上検索すると、すでに置換された「<em>fuga</em>」に
再度ヒットしてしまいます。
もちろん、

 ・段落全体を範囲選択して全置換すればよい
 ・最初の「fuga」を単語選択して下置換すればよい

などの手段は承知していますし、またそれに対する反論もできます。
要点はそこではなくて、同じことを上からやるか下からやるかで操作が異なるのは
ユーザーに優しくない(余計な思考を強いる)ということです。
--------------
*2 いくつか例を挙げます。

 ・置換文字列「<em>fuga</em>」が検索文字列「fuga」を含む
  ⇒ 下検索してから上検索する方法は使えない

 ・検索文字列が「um」で、カーソル位置の単語が「umumum」である
  ⇒ wordright(salnen); searchup; は使えない

 ・検索文字列がタブ文字や改行文字で始まる
  ⇒ 動作環境によっては right; searchup; は使えない

屁理屈なのでこのへんでやめておきます。結局すべての場合に対応するには

if (code == 0x0d) {
 movetolineno 1, lineno + 1;
} else {
 movetolineno column + 2, lineno;
}
searchup "<.*?>", regular;

と書けば十分でしょうか?(まだ何か忘れてる気が…)
繰り返しになりますが、要点は「こう書けば十分か否か」ではなくて、たかだか上検
索のためにここまで注意しなければならないのはマクロ作者に優しくない(バグのあ
るマクロが作られやすい)ということです。
--------------

長文になり失礼しました。本件は後回しにしていただいて構いません。
よろしくお願いいたします。

[ ]
RE:04833 カーソル位置からの検索についてNo.04835
Arimac さん 04/03/23 12:46
 
一般的にはカーソル位置というのは幅が0で、その場所を示しているだけです。(メ
モ帳やWord等の実際のアプリ)
その位置から右(下)方向に続く文字列を指しているわけでも、その付近にある文字
列を指しているわけでもないです。
なのでカーソル位置(のある場所)から左(上)に検索する時にカーソル位置の右側
まで検索するのは変です。

しかしながら、IKKIさんの検索に関するコンセプトが間違っているというわけではな
いと思います。表示されている文字列を示しているというポインターという考えは分
かり易いし、それはそれで便利だと思います。既存のアプリはそういうファジーなコ
ンセプトになっていないので思うようにならないだけです。

それと秀丸エディタの範囲選択の考え方が一貫性がないというか、エレガントではな
いところがあることです。
行内で範囲選択した場合と複数行に渡って範囲選択した場合とで、カーソルキーで範
囲を解除した後のカーソル位置が違うところから分かるように、選択されている場合
にカーソル位置の呪縛から逃れられていません。

範囲選択されている場合は範囲選択された領域全てがカーソル位置と考えるとエレガ
ントになります。範囲選択された状態で「→」キーを押すと範囲選択の右側にカーソ
ルが行き、「←」キーを押すと左側に行くのも自然に理解できると思います(Wordが
こうなっている)。また、検索する場合でも範囲選択された文字列が検索対象になる
のが自然なのも理解できると思います。

でも秀丸エディタの場合は以前からの互換性の問題があるので今更変えられないでし
ょうけど・・・

[ ]
RE:04835 カーソル位置からの検索についてNo.04837
Iranoan さん 04/03/23 17:22
 
 IKKI さん、Arimacさん今日は、Iranoan です。
> 秀丸エディタの範囲選択の考え方が一貫性がないというか、エレガントではな
> いところがあることです。
> 行内で範囲選択した場合と複数行に渡って範囲選択した場合とで、カーソルキーで範
> 囲を解除した後のカーソル位置が違うところから分かるように、選択されている場合
> にカーソル位置の呪縛から逃れられていません。
>
> 範囲選択されている場合は範囲選択された領域全てがカーソル位置と考えるとエレガ
> ントになります。範囲選択された状態で「→」キーを押すと範囲選択の右側にカーソ
> ルが行き、「←」キーを押すと左側に行くのも自然に理解できると思います(Wordが
> こうなっている)。また、検索する場合でも範囲選択された文字列が検索対象になる
> のが自然なのも理解できると思います。
>
> でも秀丸エディタの場合は以前からの互換性の問題があるので今更変えられないでし
> ょうけど・・・
 やはり「範囲選択開始」の状態を除いた [→]/[←] で範囲選択が解除され
るようなときは、Arimacさんの仰るように、それぞれ範囲選択の右/左
側に移動した方が自然だと思います。
 現在の仕様では、範囲選択部分が折り返されているかどうか、というマクロ
では知り得ない状況によって動きが違うので、互換性を気にしても仕方がない
気がします。またこの事から範囲選択の先頭/最後に移動したければ、既存の
マクロでも
moveto seltopx, seltopy;
を使っているでしょう。

 IKKI さんの検索に関して、
> いろいろな方法をケースバイケースで使い分けなければなりません。*2
> すべてのケースに対応できる単一の方法が(下検索には用意されているのに)
> 上検索に用意されていないのは片手落ちであると言えないでしょうか。
は、秀丸の検索は現状、常にカーソル位置を意識した動きをしていているだけ
で、必ずしも「下検索には用意されている」というわけではないので、「片手
落ち」とはいえないと思います。しかしカーソル位置に関わらず範囲選択にも
ヒットさせる、という仕様も有る^*ので、上下両方向の検索でその様な、設定
+既存とは別の文 (finddown3 等) やパラメータがあっても良いと思います。
既存の文の動作を、パラメータの追加も無く変えるのは、互換性の点から反対
です。

---------------------------------------------------------------------
 * 詳しく調べていませんが、どうやら OpenOffice で検索方法を変えたとき
の動きがそのようです。

[ ]
RE:04837 カーソル位置からの検索についてNo.04839
秀丸担当 さん 04/03/23 17:35
 

上検索と下検索で対称性がないというのは、要点として的を得ていると思います。
解釈の仕方によってはその通りだと思います。
私の考えとしては、カーソル位置から検索するモードのときは、「未満」と「以
上」は対称的で、全てのテキストが検索の対象となる状態に置けることです。

範囲選択を大きなカーソルとみなしてはどうかという話に関しては、検索とはま
た別の話だと思います。
Arimacさんのおっしゃる通りですが、互換性などの面から見て、むずかし
いですね。

[ ]