vim構文領域をタッチ/オーバーラップさせることはできますか?


13

そのため、少し前に、私は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最初の領域とstart2番目の領域が同じであることに注意してください。これは機能しません。2番目の領域は明らかに検出されず、構文の強調表示は適用されません。

私はに正規表現を緩めることによってそれを動作させることが可能end=/^===/start=/=== Diff/、領域が触れないようにということが、特にそのようにしないでください-それは1がどこ他端を開始することになっていることをあまり明らかです。

2つの領域定義が同じ文字に触れることを許可する方法がありますか(および/または一致するエッジを包括的ではなく排他的にする)、またはより緩やかな正規表現に固執していますか?

1(はい、git.vim含まれてdiff.vimいますが、これは学習課題でした)


これは、「Region End」オフセットを使用してエッジを排他的:h :syn-pattern-offsetにするか、GitLogリージョンを変更してファイルの最後まで拡張し、Diffリージョンを完全にGitLogリージョン内にすることで可能になると思います。ただし、これらのメソッドのいずれかを動作させることはできませんでした。
リッチ

git.vimは既にdiff出力をハイライトしていることに注意してください。それに応じて例を変更することをお勧めします!
リッチ

回答:


4

Vim正規表現エンジンに次のマッチを開始する場所を指示できます。

これまでのところ、2つの方法があることを知っています。

  1. を使用\zeして、一致の終了を設定します。

    syntax region GitLog
        \ start=/^===* Log/
        \ end=/\ze^===* Diff/
        \ contains=@gitlog
    
  2. \@=Vimではゼロ幅マッチングと呼ばれる正の先読みを使用します。

    syntax region GitLog
        \ start=/^===* Log/
        \ end=/\(^===* Diff\)\@=/
        \ contains=@gitlog
    

したがって、一致の最後の「ポインタ」^===* Diffは行の先頭に巻き戻され、region Diff's start^===* Diff再び行で一致を開始します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.