強調表示の正規表現が処理されるタイミンNo.37991
fzok4234 さん 20/02/12 16:57
 
お世話になっております。

さて、ウィンドウに表示されている文字列に強調表示が適用されるタイミングについ
てですが、もしかしてたとえ文字列がウィンドウの中央に表示されていても少しスク
ロールしただけで再度強調表示の処理が行われる仕様ではないでしょうか。

当方ではC#などのソースコードの視認性をより良くするために、強調表示に結構重い
正規表現を定義しています。その状態で強調表示の対象の文字列がウィンドウのほぼ
中央に表示された状態で、少しでもスクロールさせると結構動作がもたつきます。縦
スクロールよりも横スクロールの方が特に動作が重いです。

このことから、スクロールの量がわずかでもスクロールの度に正規表現の演算を一々
行っているのではないかと思ってしまいます。

もし仮にそうならば、縦スクロールで対象文字列がウィンドウに入ってきたときに1
回だけ強調表示の処理を行い、縦スクロールで文字列がウィンドウから出ていくまで
の間はその文字列が変更されたときのみ再度処理するように改良していただければ大
変ありがたいです。

どうかよろしくお願いします。


[ ]
RE:37991 強調表示の正規表現が処理されるNo.37992
秀丸担当 さん 20/02/12 18:05
 

強調表示は、確かに表示するときに計算していて、強調表示が正規表現でとても長い
ものが大量にあると、遅くなることがあります。
カーソルのある行の計算結果であれば再利用したりしていますが、スクロールではそ
ういうことはしていないです。
効率的にできたらいいということでご意見参考にさせていただきます。

ただ、何らかの対策をしたとして、強調表示の書き方がどんどん長くなる書き方だと
きりがないかもしれません。
以前に予約語の前後で条件が変わるような強調の話があって、V8.90で強調表示の長
さをより長く対応したりしていますが、予約語が1つ増えるたびに関連する全部の強
調表示に詰め込んでいくと、スクロールのときに限らず遅くなる一方だと思います。
また、強調表示の最長文字列の希望も、どんどん長くしてほしいという話が終わらな
い気がします。
もし予約語を別の優先順位の高い強調として指定するだけにして、正規表現を短くす
ることが可能であれば、短くしたほうが効率的になると思います。

あるいは、以前にも書いたと思いますが、マクロを使ってカラーマーカーで色付けす
る方法も考えられます。
例えば以下のようなマクロで一度カラーマーカーを付けておくと、正規表現で調べる
のはそのときの一回限りで、あとは再度マクロを実行するまで色が付いたままになり
ます。

disabledraw;
$layer="mylayer";
deletecolormarkerall $layer;
setsearch @"(xxx|yyy|zzz)aaa",0x10;
colormarkerallfound 0x0000ff,-1,-1,0,0,$layer;
setsearch @"(xxx|yyy|zzz)bbb",0x10;
colormarkerallfound 0xff0000,-1,-1,0,0,$layer;
setsearch @"(xxx|yyy|zzz)ccc",0x10;
colormarkerallfound 0xff0000,-1,-1,0,0,$layer;

1つのネタとして、強調表示をカラーマーカーとして動作させるモードもあったらい
いかもしれないです。

[ ]
RE:37992 強調表示の正規表現が処理されるNo.37993
fzok4234 さん 20/02/12 22:24
 
回答ありがとうございます。

マクロでカラーマーカーを使用することで強調表示を実現することについて、ファイ
ルタイプ別にファイルを開くと同時に特定のマクロを自動実行できるようにする機能
が実装されていれば、通常の強調表示などのファイルタイプ別設定と同じ感覚で使用
できるようになると思います。

実のところ、正規表現だけで強調表示の対象の文字列を判定するのはかなり骨の折れ
る作業であり、マクロで強調表示の対象を判定する「関数」が定義できればかなり強
調表示の定義の文字数を減らせるのではないかと思っています。一応、マクロ本文内
のendmacro文やサブルーチンのreturn文で戻り値を設定することができますが、作っ
たマクロを「関数」として戻り値の0か1かで強調表示する/しないを判別するような
機能があれば、長々と複雑怪奇な正規表現で定義しなくても済むようになります。ま
た、マクロを文字列を返す関数として例えば検索や置換の対象文字列として検索/置
換/Grepダイアログから指定できるようにするなど、正規表現だけでは対処しきれな
い複雑な条件を表現する手段として使えるようになればと思っています。

それから、先ほど申したファイルタイプ別の自動起動マクロのように、マクロを自動
起動させるイベントの定義がもっとたくさんあればマクロを活用する機会も増えると
思います。例えば、指定の行数以上縦スクロールしたときに発生するイベントが定義
できるようにしておき、カラーマーカーで強調表示させるマクロをこのイベントで自
動起動できるように設定しておけば、指定行数以下の縦スクロールでは強調表示の処
理が行われないため動作を軽くすることができるのではと思っています。




[ ]
RE:37993 強調表示の正規表現が処理されるNo.37995
秀丸担当 さん 20/02/13 12:09
 

[マクロ]→[マクロ登録]→[自動起動マクロ]でファイルを開いた直後に指定して、フ
ァイルタイプ別の設定のように任意の拡張子でするということは、マクロ内で判断す
ると一応可能ではあります。
例:
setcompatiblemode 0x20000;
if(event==1  //ファイルを開いた直後
 && filetype==".txt"  //.txtのみ
 ){
  disabledraw;
  $layer="mylayer";
  deletecolormarkerall $layer;
  setsearch @"(xxx|yyy|zzz)aaa",0x10;
  colormarkerallfound 0x0000ff,-1,-1,0,0,$layer;
  setsearch @"if",0x00;
  colormarkerallfound 0xffffff,0xff,-1,0,0,$layer;
}

文字列や行の1つ1つについてマクロを呼んでそれを強調表示とするということをす
るとしたら、マクロを呼ぶこと自体が速くないので、効率はあまり良くないかもしれ
ません。
強調表示で指定する正規表現は高速に処理できているという前提があって、そういう
レベルになると、正規表現を処理するかのごとく、DLLでネイティブの強調判定関数
を呼ぶような話になってくると思います。

あるいは、カーソル移動後や編集後の自動起動マクロで、近辺行だけを対象にして上
記マクロと似たようなことをできたらいいと思います。
現状でやろうと思ったら、colormarkerallfoundはテキスト全体(またはいちいち部
分編集の対象指定)にしないといけないので、colormarkerallfoundで任意の範囲指
定できる方法も検討しようと思います。

[ ]