[ 新規に投稿する ]

強調表示の正規表現が処理されるタイミングについて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で任意の範囲指定できる方法も検討しようと思います。
[ ]

[ 新規に投稿する ]