一時的なカラーマーカーの取り扱いについNo.38120
fzok4234 さん 20/04/06 13:32
 
強調表示の代替手段として、一時的なカラーマーカーをマクロのcolormarkerallfoun
d文で付ける場合にやり方がわからないことがあります。それは、色付けした範囲を

1. 複数行コメントとして「対応する括弧を強調表示」の動作および「対応する括弧
に移動」のコマンドの動作がモードに応じた文法を意識するようにさせる
2. アウトラインのツリー表示の見出しの定義として使用する

ことです。マクロのヘルプを隅々まで探していますが、該当する項目が見つからない
ため困っています。

当方で、正規表現だけでは対処しきれずマクロを併用する必要のある複雑なパターン
や、現在の秀丸エディタでは対応していない複数行にわたる前方/後方一致/不一致で
の対象文字列の絞り込みを行うため、colormarkerallfound文を使う必要が出てきて
いるのですが、上記のことがうまくできないため強調表示の置き換えとして使えない
状態です。


[ ]
RE:38120 一時的なカラーマーカーの取り扱No.38124
秀丸担当 さん 20/04/06 14:51
 

colormarkerallfoundは、単なる色付けで、対応する括弧から除外したり、ツリーの
見出しとして振る舞うようにすることはできないです。
ちなみにV8.92β9では、強調表示をキャッシュするようにして、重い正規表現が多く
あるときは計算済みのところは速くなるようにしてます。
対象は通常の強調表示で、複数行コメントのユーザー定義は従来通りです。

キャッシュするにあたり、最初カラーマーカーでなんとかしようとしたのですが、い
ろいろあって断念して、カラーマーカーを拡張して、本来の強調表示としての振る舞
いが可能なカラーマーカーとなるようなことをしています。
これは現状では非公開の内部的なことなのですが、colormarker文やcolormarkerallf
ound文でもできればいいと思います。

現状のカラーマーカーでは、複数行コメントの合成による優先順位やら透明や、行の
強調の意味のある振る舞いなどが不足でした。
あとV8.92で追加していることとして、colormarker文の第4パラメータの種類に0x10
を指定して、行の強調のような改行以降の余白の背景色も適用できるようにしていま
す。colormarker文で行の強調にできないかと思って追加したものですが、これは単
なる色付けです。


[ ]
RE:38124 一時的なカラーマーカーの取り扱No.38125
fzok4234 さん 20/04/06 15:12
 
各カラーマーカーに付随するユーザーデータとレイヤー名を、ファイルタイプ別の設
定のダイアログの「複数行コメント」とアウトラインの「解析」のところで指定でき
るようにするというのはどうでしょうか。

[ ]
RE:38125 一時的なカラーマーカーの取り扱No.38126
fzok4234 さん 20/04/06 15:21
 
また、メニューの「検索」->「カラーマーカー」->「一時的なカラーマーカー」や、
検索ダイアログの「すべて検索 - 色付け」といったGUI操作からもユーザーデータと
レイヤー名を指定できるようにすればよいかもしれません。

[ ]
RE:38126 一時的なカラーマーカーの取り扱No.38127
秀丸担当 さん 20/04/06 16:34
 

複数行コメントのユーザー定義や、ツリーの定義で特定のカラーマーカーを指定でき
れば、それはそれで使い道はあると思います。
強調表示で意味を持つのは他にもいろいろあって、検索での「追加の条件」の対象や、
ツリー定義でコメント/文字定数の除外、上/下の強調行コマンド、対応するタグ、折
りたたみ可能な条件などがあります。
やるとしたらの話ですが、これらのことも考えると、colormarker文で最初から強調
表示として指定できたほうがよさそうです。

[ ]
RE:38127 一時的なカラーマーカーの取り扱No.38128
fzok4234 さん 20/04/06 18:27
 
>colormarker文で最初から強調表示として指定できたほうがよさそうです。

colormarker文の動作を「普通のカラーマーカー」の作成から「本物の強調表示」の
作成に仕様変更(あるいは機能追加)する際、どうしても避けて通れない問題がありま
す。それは、普通のカラーマーカーにはできて本物の強調表示にはできない「複数行
にわたる色付けおよび前方/後方一致/不一致の参照」です。現状では、強調表示で
(?#fulllinematch) を使用しても \n が認識しないため、例えばC/C++などの \n を
空白文字と同一視するような言語でクラス名や関数名などの予約語ではない任意の識
別子で特別な役割を持つものを強調表示させることが非常に困難となっています。つ
まり、C/C++の関数

type func( aType a, bType b ) {}

を、

type func
( aType a, bType b )
{}

とも

type
func
(
    aType a,
    bType b
) {
}

とも書けてしまうため、型名のtype、aType、bTypeや関数名のfuncを強調表示させる
ために必要な「前方/後方一致/不一致の条件式に改行文字を入れる」すなわち \s を
 [ \t\r\n] として

(?<=^\s*\c+\s*)(\c+)(?=\s*\()

で関数名funcを強調表示させるといったことが不可能となってしまっています。この
ため、現状ではテキストを書く側が強調表示の定義によって特定のコーディングスタ
イルを強制される事態が現出しています。

もちろん、強調表示で改行を検索対象にした場合、正規表現の書き方を誤れば1個の
単語の表示のために全文検索してしまって動作が極端に重くなるといったことが起き
得ます。だが、それ以外のデメリットが具体的にどのようなものなのか、あるいは実
装に向けての技術的な壁がどんなものかがよくわからないため、ユーザーや.hilight
ファイルの作者に向けて詳しく説明してもらえればすごく助かります。どうかよろし
くお願いします。


[ ]
RE:38128 一時的なカラーマーカーの取り扱No.38129
秀丸担当 さん 20/04/07 08:44
 

colormarker文が強調表示のように意味を持たせるようにする場合、現状の強調表示
のように1行内に制限されてしまうことを危惧されてのことかと思いますが、そうい
うことではないので大丈夫です。
現状のcolormarker文で色付けしているのと同じように、複数行のヒットや、自由な
範囲指定が可能なまま、強調表示のように意味を持てるようになります。
つまり、例のような複数行の関数の場合もできるようになるということです。

[ ]
RE:38129 一時的なカラーマーカーの取り扱No.38142
fzok4234 さん 20/04/08 17:29
 
検討ありがとうございます。とりあえず、当方でいつでも.hilightファイルから自動
起動マクロに設定を移植できるよう、準備だけは進めておこうと思います。

[ ]
RE:38129 一時的なカラーマーカーの取り扱No.38150
fzok4234 さん 20/04/10 01:06
 
素早い仕事ありがとうございます。v8.92β10で動作確認できました。

[ ]