2017-11-16 5 views
1

を相反する二つの正規表現は、私が/が先行するすべての行の最初の単語をキャプチャし、1 hi def linkに割り当てしようとしている、としています第2のすべての行の単語(//で囲まれています)を第2のhi def linkに割り当てます。構文についてVimの正規表現:社内言語の構文ファイルを書き込もうとして

cmo/create/mo1///tri 
createpts/brick/xyz/2,2,2/0.,0.,0./1.,1.,1./1,1,1 

私はargOneとしてcmocreateptsを捕獲しようとしている、とargTwoなどcreatebrickています:

syn match argOne '^\zs[^\/]\+\ze\/' 
syn match argTwo '^[^\/]\+\/\zs[^\/]\+\ze\/' 

hi def link argOne   Type 
hi def link argTwo   Statement 

、彼らが競合する問題がある:ときの両方sys matchステートメントが存在する場合、ViMはargOneによって検出されたものだけをキャプチャします。しかし、孤立して、syn matchのいずれかがコメントアウトされた場合、argOneまたはargTwoのいずれかが完全に機能します。

これらの2つのステートメントを互いにうまく再生するにはどうすればよいですか?

syn match argOne '^\zs[^\/]\+\ze' contained 
syn match argTwo '\/\zs[^\/]\+\ze\/' contained 
syn match argOneTwo '^\zs[^\/]\+\/[^\/]\+\ze\/' contains=argOne,argTwo 

hi def link argTwo   Statement 
hi def link argOne   Type 

答えて

1

一つの解決策は、含まれている試合を作成するには、最初の二つの引数に一致するargOneTwoを定義した後、第一及び第二の一致のためのマッチを提供することです一致した構文グループこれは@ herbertの個々の構文グループを含む親グループを定義するソリューションよりも優れています。 経由で指示されたとき、彼らは唯一の一致するように

syntax match argOne "^[^/\\]\+" nextgroup=sepOne 
syntax match sepOne "/" contained nextgroup=argTwo 
syntax match argTwo "[^/\\]\+" contained 

なおsepOneargTwoは、contained属性を持っています。それがなければ、彼らはもっと多くの場所でマッチするでしょう。

+0

素晴らしい作品です!ありがとうございました! –

1

は、あなたがのシーケンスを構築するためにを使用することができます。