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)
sumber
: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.Jawaban:
Anda dapat memberi tahu mesin regim Vim tempat memulai pertandingan berikutnya.
Sejauh ini saya tahu ada 2 cara:
Gunakan
\ze
untuk mengatur akhir pertandingan:Gunakan lookahead positif
\@=
,, yang disebut pencocokan lebar-nol di Vim:Jadi akhir-of-pertandingan "pointer" jenis memutar ulang ke awal
^===* Diff
baris, sehinggaregion Diff
'sstart
akan mulai pencocokan di^===* Diff
baris lagi.sumber