Vim sözdizimi bölgeleri dokunmak / örtüşmek için yapılabilir mi?


13

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.vimsadece kütüğe ve diff.vimiki 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 endbirinci 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.vimiçerir diff.vim, ama bu bir öğrenme egzersizi idi)


Bunun kenarları özelleştirmek için bir "Bölge Sonu" ofseti kullanarak (bkz. :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.
Zengin

Test etmek - git.vim'in zaten fark çıktısını vurgulamasıyla biraz daha zorlandı. Örneğinizi buna göre değiştirmek için bir fikir olabilir!
Zengin

Yanıtlar:


4

Vim regex motoruna bir sonraki maçı nerede başlatacağını söyleyebilirsiniz.

Şimdiye kadar 2 yol olduğunu biliyorum:

  1. \zeBir maçın sonunu ayarlamak için kullanın :

    syntax region GitLog
        \ start=/^===* Log/
        \ end=/\ze^===* Diff/
        \ contains=@gitlog
    
  2. Vim'de \@=sıfır genişlik eşleşmesi olarak adlandırılan pozitif ileriye bakın :

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

Yani sonu maçı "pointer" tür başlangıcına geri sarma ait ^===* Diffhat, öyle ki region Diffs' startonun eşleştirme başlayacaktır ^===* Difftekrar hat.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.