Bir süre önce vim'in sözdizimi dosyalarının nasıl çalıştığı hakkında daha fazla bilgi edinmeye karar verdim. Amacım, dosyayı sınırlayıcılara dayalı olarak 3 parçaya bölecek basit bir sözdizimi dosyası oluşturmak ve bu üç bölümden ikisi için önceden var olan sözdizimi dosyalarını eklemekti.
Bu bir örnek dosyadır:
Some text, unstyled
==================== Log
(Output of git log)
==================== Diff
(Output of diff)
Amaç git.vim
sadece kütüğe ve diff.vim
iki fark hariç, sadece farka başvurmaktı . 1 Bu benim sözdizim dosyası gibi görünüyordu:
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"
Nasıl Not end
birinci bölge ile aynı olduğu start
, ikinci bölgenin üzerinde. Bu işe yaramıyor; ikinci bölge açıkça algılanmaz ve sözdizimi vurgulaması uygulanmaz.
Ben sağlamak için normal ifadeler gevşeterek işe yapabilirsiniz end=/^===/
ve start=/=== Diff/
bölgeler dokunmayın böylece, ama özellikle sevmiyorum - bu bir yerde diğer uçlarını başlamak gerekiyordu ki daha az açıktır.
İki bölge tanımının aynı karakterlere dokunmasına izin vermenin (ve / veya eşleşen kenarları kapsayıcı yerine özel hale getirmenin) bir yolu var mı?
1 (Evet biliyorum git.vim
içerir diff.vim
, ama bu bir öğrenme egzersizi idi)
:h :syn-pattern-offset
) Veya dosyanın sonuna kadar GitLog bölgesini değiştirerek ve Diff bölgesinin tamamen GitLog bölgesi içinde olabileceğini düşünüyorum. . Yine de bu yöntemlerden hiçbirini çalıştıramadım.