2009-11-30 7 views
8

私が使用しているカスタムフォーマット用に新しいvim構文ファイルを修正しようとしています。そのほとんどは理解できますが、キーワード「含まれています」が問題になっています。Vimの構文ファイル... "contains"を理解しようとしています

ここには、彼がそれを木に説明しているかのように、私はそれが何をしているのか説明してもらえますか?

+0

$ VIMRUNTIME /構文の既存の構文ファイルを見てください。それらの多くは 'contains'キーワードを使用しています。 –

答えて

21

一般に、1つの構文強調表示方法は1か所にしかありません。したがって、Cのような構文を例として使用するには、開始中括弧 '{'で始まり閉じ括弧 '}'で終わる領域を定義すると、その領域の構文強調表示は同じになります。

contains=を使用すると、他の構文強調表示グループを外部グループに含めるように設定できます。前の例に従うには、外側の領域にある場合でも、intを強調表示する必要があります。

syn keyword Keyword int 
syn region BraceBlock start='{' end='}' contains=Keyword 

これは、後で含まれるキーワードのリストに項目を追加する必要があることはよくあります。これを行うにはいくつかの方法があります。まず、contains=ALLまたはcontains=ALLBUT,Errorを使用して、領域内に何かを許可することができます。

syn region BraceBlock start='{' end='}' 
syn keyword Keyword int containedin=BraceBlock 

第三に、あなたはこのグループで有効なものとして、「含まれる」何も定義することができます:

最後に
syn region BraceBlock start='{' end='}' contains=CONTAINED 
syn keyword Keyword int contained 

、あなたを第二に、あなたは別の領域から含まれているに何かをプッシュするcontainedinを使用することができますどこに行くかを決めるために、それは非常に簡単にするクラスター、使用することができます:あなたが理解したい正確に何を知らない

syn region BraceBlock start='{' end='}' [email protected] 
syn keyword Keyword int 
syn cluster MyCluster contains=Keyword 
syn keyword Conditional if else 
syn cluster MyCluster add=Conditional 
" Now conditionals and keywords can appear in a BraceBlock 

を、私が言って他に何かわからない - 何あなたは達成しようとしているのですか、何が問題を引き起こしていますか?

+0

それで、私が正しく理解するならば、それは言わばルール内の明確なルールの方法です。たとえば、角括弧の間にあるものすべてを一致させてから、角括弧内の選択肢内の「何か」を一致させるための別のルールですか? (私は正しいトレイルにいても)? – Rook

+0

@ldigas:それは良い要約です。内部の "somethings"は、外部グループ内にあることができます(上記の3番目の例のように、内部項目に "contained"キーワードを追加した場合)か、外部グループ内であれ、 「包含」キーワード)。 – DrAl

+0

私に '含有物 'の使用を説明してください。第3のポイントでは、 'syn region BraceBlock start = '{' end = '}'は= CONTAINED'とその下の行を含み、 – Harshiv

関連する問題