そのため、少し前に、私はvimの構文ファイルがどのように機能するかについて、自分で作成することでさらに学ぶことにしました。私の目標は、区切り文字に基づいてファイルを3つの部分に分割し、これらの3つの部分のうちの2つの部分に既存の構文ファイルを含める単純な構文ファイルを作成することでした。
これはサンプルファイルです。
Some text, unstyled
==================== Log
(Output of git log)
==================== Diff
(Output of diff)
目標は、2つのヘッダーを除いてgit.vim
、ログdiff.vim
のみと差分のみに適用することでした。1 これは私の構文ファイルが最終的に次のように見えるものです:
if exists("b:current_syntax")
finish
endif
syntax include @gitlog $VIMRUNTIME/syntax/git.vim
syntax region GitLog
\ start=/^===* Log/
\ end=/^===* Diff/
\ contains=@gitlog
syntax include @gitdiff $VIMRUNTIME/syntax/diff.vim
syntax region Diff
\ start=/^===* Diff/
\ end=/\n\n/
\ contains=@gitdiff
let b:current_syntax = "logdiff"
end
最初の領域とstart
2番目の領域が同じであることに注意してください。これは機能しません。2番目の領域は明らかに検出されず、構文の強調表示は適用されません。
私はに正規表現を緩めることによってそれを動作させることが可能end=/^===/
とstart=/=== Diff/
、領域が触れないようにということが、特にそのようにしないでください-それは1がどこ他端を開始することになっていることをあまり明らかです。
2つの領域定義が同じ文字に触れることを許可する方法がありますか(および/または一致するエッジを包括的ではなく排他的にする)、またはより緩やかな正規表現に固執していますか?
1(はい、git.vim
含まれてdiff.vim
いますが、これは学習課題でした)
:h :syn-pattern-offset
にするか、GitLogリージョンを変更してファイルの最後まで拡張し、Diffリージョンを完全にGitLogリージョン内にすることで可能になると思います。ただし、これらのメソッドのいずれかを動作させることはできませんでした。