Bir yorumlu metin içinde dile özgü sözdizimini nasıl etkinleştiririm?


19

Bir PHP dosyasını düzenlediğimde ve bir yorumlu metin içinde bir dize tanımladığımda, sözdizimi vurgulama, JavaScript sözdizimi veya HTML sözdizimi veya SQL sözdizimi ise, yorumlu metin içinde etkinleştirilir. Ancak CSS sözdizimi için çalışmaz.

Örnek ( hello.phpaşağıdaki kodla adlandırılan yeni bir PHP dosyası oluşturursak ):

<?php
$foo = <<<"JAVASCRIPT"
var hello = "hello";
JAVASCRIPT;

$bar = <<<"CSS"
/* This code below should be syntax-highlighted. */
.hello {
  font-weight: bold;
}
CSS;

JAVASCRIPTBlok doğru vurgulanır, ancak CSSblok değil. Ben çalıştırırsanız Ayrıca SynStacküzerinde varJavaScript kodu blok üzerinde anahtar kelime, ben olsun ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier'], ama CSS bloğunda herhangi bir yere aynı şeyi, ben sadece almak ['phpRegion', 'phpHereDoc']Kuralları vurgulayarak bazı CSS sözdizimi eklemem gerekiyor bu yüzden. Bu sözdizimi kuralları nerede tanımlanıyor ve bunlara nasıl ekleyebilirim?


1
Not: // This should be syntax-highlightedgeçerli bir CSS yorumu değildir ve bu nedenle sözdizimi bir yorumdan başka bir şey olarak vurgulanmalıdır. CSS yalnızca /* */çok satırlı yorumları destekler . //tek satırlı yorumlar yalnızca Sass veya Stylus gibi önişlemci dilleri kullanıyorsanız desteklenir.
Rory O'Kane

Haklısın. Kodu bu değişikliği yansıtacak şekilde güncelledim.
MrSnrub

Ben de CSS heredoc sözdizimi vurgulama için bir çözüm bulmak için arıyorum. Birçok senaryo denedim ama işe yaramadı. Birinin çözümü olan var mı?
Ken

Yanıtlar:


3

TL; DR:

Vim'in PHP ve HTML sözdizimi dosyalarında tanımlanmıştır. CSS için nasıl kural ekleneceğini görmek için, bölümüne atlayın Ve bunlara nasıl eklerim? veya nasıl çalıştığına dair bir açıklama için okumaya devam edin.

Bu sözdizimi kuralları nerede tanımlanıyor?

JavaScript yorumlu metin, sözdizimi gruplarının diğer sözdizimi gruplarını içermesine izin veren Vim'in sözdizimi contains1 özelliği kullanılarak vurgulanır .

Bunun nerede tanımlandığını bulmak için, önce PHP için sözdizimi vurgulama dosyasını açın:

:e $VIMRUNTIME/syntax/php.vim

Şimdi, sözdizimi dosyası JavaScript heredocunu "javascript" dizesinin eşleşmesine göre buluyor, bu yüzden şunu aramayı deneyelim:

/javascript

Üçüncü maç bu yorum:

" including HTML,JavaScript,SQL even if not enabled via options

Umut verici görünüyor! İlgili sözdizimi satırına bir göz atalım:

syn region  phpHereDoc  matchgroup=Delimiter
\ start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend

( kolay okuma için satır devamları eklendi )

Tamam, bu sözdizimi bölge kıvrık düzenli ifade ile JavaScript yorumlu metin bulur ve JavaScript dahil ederek bölgede vurgulayarak verir @htmlJavascriptsözdizimi cluster2 içinde containsargüman.

Ancak CSS heredocs için uygun bir tanım yoktur! Bir tane ekleyelim. Bu yüzden değiştirilecek ilk şey startdüzenli ifadedir. Basitçe değiştirmek javascriptiçine css:

start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"

Bu kolay!

Ancak, CSS yorumunda JavaScript'in vurgulanmasını istemiyoruz. Bu yüzden de @htmlJavascriptCSS eşdeğerini değiştirmemiz gerekiyor . Ama ne olduğunu CSS eşdeğer? (Tahmin edebilirsiniz, ancak emin olmak için hareketleri gözden geçirelim.)

Nerede tanımlandığını görmek için htmljavascript3'ü arayalım:

/htmljavascript

Hmmm. Başka sonuç yok. Başka bir yerde tanımlanmalıdır! İçeriği bulabileceğimizi görmek için dosyanın üst kısmına hızlı bir göz atalım:

runtime! syntax/html.vim

4 olabilir gibi görünüyor .

:e $VIMRUNTIME/syntax/html.vim

Aramayı bu dosyada tekrar çalıştırın ve şu 5. satırı buluruz :

syn cluster htmlJavaScript      add=@htmlPreproc

Yani htmlJavaScript cluster, içinde tanımlanan bir html.vim. Kullanabileceğimiz CSS için benzer bir küme var mı?

/htmlcss

Evet!

syn include @htmlCss syntax/css.vim

Yani biz sadece değiştirmeniz gerekiyor @htmlJavascriptile @htmlCssde containsargüman:

contains=@htmlCss,phpIdentifierSimply,phpIdentifier,[...]

Onlara nasıl ekleyebilirim?

Aşağıdaki sözdizimi komutunun tamamını ~/after/syntax/php.vimPHP sözdizimi işlemi gerçekleştirildikten sonra çalıştırılacak şekilde kaydedin ve işiniz bitti!

syn region  phpHereDoc  matchgroup=Delimiter
\ start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlCss,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend

1: Ayrıntılar :help :syn-containsiçin bakınız.
2: Bkz :help :syn-cluster.
3: 'ignorecase'Açtım. Onsuz, htmlJavascriptya da \chtmljavascript
4'ü aramanız gerekir : Aslında, Vim sözdizimi dosyalarında kullanılan adlandırma şemasına göre, muhtemelen bunu sadece htmlJavascriptisme göre çözmüş olabilirdik .
5: "JavaScript" bu sefer farklı şekilde büyük harfle yazılmıştır. Açtığımız için şanslıyım 'ignorecase', ha?

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.