Jadi beberapa waktu yang lalu saya telah memutuskan untuk mempelajari lebih lanjut tentang bagaimana file sintaks vim bekerja, dengan membuat sendiri. Tujuan saya adalah membuat file sintaksis sederhana yang akan membagi file menjadi 3 bagian berdasarkan pembatas, dan menyertakan file sintaksis yang sudah ada sebelumnya untuk dua dari tiga bagian tersebut.
Ini adalah contoh file:
Some text, unstyled
==================== Log
(Output of git log)
==================== Diff
(Output of diff)
Tujuannya adalah untuk menerapkan git.vim
hanya pada log, dan diff.vim
hanya untuk diff, tidak termasuk dua header. 1 Seperti inilah tampilan file sintaks saya:
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"
Perhatikan bagaimana end
di wilayah pertama sama dengan start
di wilayah kedua. Ini tidak berfungsi; wilayah kedua tampaknya tidak terdeteksi dan penyorotan sintaks tidak diterapkan.
Saya bisa membuatnya bekerja dengan melonggarkan regex ke end=/^===/
dan start=/=== Diff/
, sehingga daerah tidak menyentuh, tetapi tidak terlalu seperti itu - kurang jelas bahwa satu seharusnya mulai di mana yang lain berakhir.
Apakah ada cara untuk memungkinkan dua definisi wilayah menyentuh karakter yang sama (dan / atau membuat tepi yang cocok menjadi eksklusif dan bukan inklusif) atau apakah saya terjebak dengan regex yang lebih longgar?
1 (Ya, saya tahu git.vim
termasuk diff.vim
, tetapi ini adalah latihan pembelajaran)
:h :syn-pattern-offset
), atau dengan mengubah wilayah GitLog untuk memperluas ke akhir file, dan wilayah Diff untuk sepenuhnya berada di dalam wilayah GitLog . Saya tidak bisa mendapatkan salah satu dari metode ini untuk bekerja.