colormarker文での行の強調表示が意図したNo.09731
fzok4234 さん 22/02/01 15:46
 
こんにちは。


さて、colormarker 文で「種類」のパラメーターに 0x00060000 などの「行の強調表
示 1 - 4」に
該当する種類を指定しても、選択範囲を含む「行全体」が指定された { 文字色 , 背
景色 , スタイル } に
ならない不具合 ( ? ) がありました。


再現手順は、まず、拡張子 .test 用の「ファイルタイプ別の設定」の「デザイン
ページ」で、
「行の強調表示 1」の項目を

 { 文字色 = #FF0000 , 背景色 = #00FFFF , スタイル = イタリック }

に設定しておきます。以下これを「デフォルト色」と呼びます。次に、以下の内容の
ファイル
Test.test を開きます。

 0001  aaaabbbbcccc

その上で、以下の内容の秀丸マクロ Mark.mac を実行します。

 deletecolormarkerall @"Test" ;
 colormarker 0x00FF0000 , 0x0000FFFF , 1 , 0x00060000 , 1 , @"Test" , 1 , 4
 , 1 , 8 ;
 endmacro ;

これは、Test.test の 1 行目の「行全体」を「行の強調表示 1」扱いで

 { 文字色 = #0000FF , 背景色 = #00FFFF00 , スタイル = ボールド }

というデフォルト色とは異なる「カスタム色」に色付けした上で、ヒットした文字列
としては
「bbbb」の部分だけをアウトライン解析などで認識させることを意図したものです。


ところが、実際の結果は「行全体」がデフォルト色になった上から覆いかぶさる形で
「bbbb」だけが
カスタム色になってしまって、「行全体」をカスタム色にする意図からは大きくかけ
離れた状態と
なってしまいました。

このため、内部処理上の取り扱いを「行の強調表示 1」としつつ、デフォルト色とは
異なる
カスタム色を何種類も用意して状況に応じてカスタム色の種類を切り替える、という
運用の妨げと
なっています。


そもそも、カスタム色を何種類も用意した上で、標準の強調表示 / 複数行コメント
の機能を使わずに
秀丸マクロのカラーマーカー機能を強調表示の代用手段として利用する必要に迫られ
ている理由として、

 ・「デザイン」の各項目において「強調表示」は 8 種類、「行の強調表示」は 4
種類、「数値」や
  「文字定数」などに至ってはそれぞれ 1 種類と少ない個数に固定されていて
ユーザーが自由に
  個数を増やせないこと。このため colormarker 文で明示的に { 文字色 , 背景
色 , スタイル } を
  指定しつつ、「行の強調表示」や「文字定数」などの内部処理上の意味付けも行
う必要がある。

 ・標準の強調表示 / 複数行コメントの正規表現では (?#maxlines:数値)(?#fullli
nematch) を使った
  複数行の取り扱いができないこと。そのため正規表現の前方 / 後方一致 / 不一
致で文脈の判断が
  できない。setsearch 文ではこれが使えるので colormarkerallfound 文を駆使
することになる。

 ・以前 https://www.maruo.co.jp/hidesoft/2/x39528_.html#39528 のスレッドで
取り上げたように
  標準の複数行コメントでは範囲の重複があると正しく色付けできない問題を抱え
ていること。

 ・現在普及している多くのプログラミング言語は必ず式 / 文 / 関数 / クラスと
いった要素、すなわち
  「AST ノード」の入れ子構造によって成立している。正規表現のようなパターン
マッチングだけでは
  この入れ子構造の文脈を認識して各トークンの種類を判別して正確に色付けする
ことは不可能である。
  結局、最終手段として秀丸マクロを使って簡易的な「構文解析器」を構築しなけ
ればいけない。

といったことがが挙げられます。しかし、この最後の砦となるカラーマーカー機能で
も意図しない動作となる
問題が見つかって、正直途方に暮れています。


現在の秀丸エディタは 9.12β6 Float x64 です。



[ ]
RE:09731 colormarker文での行の強調表示No.09733
秀丸担当 さん 22/02/01 17:05
 
確かに言われている通りになりました。
この場合は、行頭から改行を含んで次の行の先頭までを対象にして、種類フラグの0x
10も指定すると全体の色が変わります。

例の場合、以下のようにするといいです。
colormarker 0x00FF0000 , 0x0000FFFF , 1 , 0x00060010 , 1 , @"Test" , 1 , 0 ,
 2 , 0 ;

colormarkerで種類の上位16ビットを指定している場合、まず本来の強調表示の色が
適用される前提があって、文字色-1、背景色-1、スタイル-1にすると、そのまま強調
表示や行の強調と同じになります。
そのうえで、任意の色が、普通のカラーマーカーのように色が付けられるということ
だったのですが、カラーマーカーそのままだと改行直前までしか色を変えられないの
で、種類の0x10のフラグを以前に追加したのでした。

このあたりは紆余曲折あってややこしかったです。
行の強調で全体の色を変えるやり方も注意書きに追記しておきます。

[ ]