4

まず、私が抱えている具体的な問題を示しますが、問題は一般化できると思います。

明示的な括弧構文(Lispなど)を持つ言語を使用していますが、左側の親に対してのみ予約されているキーワードがあります。例:

(key key)

前者は予約語ですが、後者は「key」という名前の変数への参照です。

残念ながら、左のパレンを強調表示するのは面倒なので、

syn keyword classification key

それ以外の

syn keyword classification (key

ただし、変数の前者のトリガーも同様に使用します。

問題を回避するためにハックをしますが、特定の一致のサブセットのみを強調表示する一般的な方法にもっと興味があります。

4

2 に答える 2

7

syn keywordハイライトで周囲の構文をより認識したいので、この状況で単独で使用することは正しく機能しません。syn region、、、syn matchおよびの組み合わせが適切にsyn keyword機能します。

hi link lispFuncs Function
hi link lispFunc Identifier
hi link sExpr Statement

syn keyword lispFuncs key foo bar contained containedin=lispFunc
syn match lispFunc "(\@<=\w\+" contained containedin=sExpr contains=lispFuncs
syn region sExpr matchgroup=Special start="(" end=")" contains=sExpr,lispFuncs

上記は、関数ハイライトグループを使用してキー、foo、およびバーをハイライトするだけです。これらがlispFuncとも一致する場合に限ります。

の後にキー、foo、およびbar以外の単語がある場合(、それらは識別子ハイライトグループを使用してハイライトされます。これにより、標準の関数名とユーザーが作成した関数名を区別できます。

およびは特別なハイライトグループを使用してハイライトされ、過去の最初の単語内のすべて(はステートメントハイライトグループを使用してハイライトされます。)()

于 2010-01-08T22:09:24.643 に答える
0

ここに見られるように、階層化されたハイライトにはいくつかの機能があるようです: 元のコマンドを与える反転パターン上でVimの一致をハイライトする

:match myBaseHighlight /foo/
:2match myGroup /./

ただし、構文ファイルでそのようなものを機能させることはできませんでした。私は次のようなことを試しました:

syn match Keyword "(key"
syn match Normal "("

強調表示は、最初に取得されるものに応じて、ビット全体で通常またはキーワードになります(ファイル内の配置によって変更されます)

Vimは「syn」の後に「2match」をキーワードとして使用することを断固として拒否しました。

于 2010-01-08T21:55:48.397 に答える