Bagaimana cara mengaktifkan sintaks khusus bahasa di dalam heredoc?


19

Ketika saya mengedit file PHP dan saya mendefinisikan string dalam heredoc, penyorotan sintaks akan diaktifkan di dalam heredoc jika itu sintaksis JavaScript atau sintaks HTML atau sintaks SQL. Namun itu tidak akan berfungsi untuk sintaks CSS.

Contoh (jika kita membuat file PHP baru yang dipanggil hello.phpdengan kode berikut):

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

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

The JAVASCRIPTblok disorot dengan benar, tetapi CSSblok tidak. Juga, jika saya menjalankan SynStackpada varkata kunci di blok kode JavaScript, saya mendapatkan ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier'], tetapi jika saya melakukan hal yang sama ke tempat manapun di blok CSS, saya hanya mendapatkan ['phpRegion', 'phpHereDoc'], jadi saya perlu menambahkan beberapa sintaks CSS menyoroti aturan. Di mana aturan sintaksis ini didefinisikan, dan bagaimana cara menambahkannya?


1
Catatan: // This should be syntax-highlightedbukan komentar CSS yang valid, dan karenanya harus disoroti sebagai sesuatu selain komentar. CSS hanya mendukung /* */komentar multi-baris. //komentar single-line hanya didukung jika Anda menggunakan bahasa preprocessor seperti Sass atau Stylus.
Rory O'Kane

Anda benar. Saya telah memperbarui kode untuk mencerminkan perubahan itu.
MrSnrub

Saya juga mencari untuk mendapatkan solusi untuk menyoroti sintaks heredoc CSS. Saya mencoba banyak skenario tetapi tidak berhasil. Adakah yang punya solusi?
Ken

Jawaban:


3

TL; DR:

Ini didefinisikan dalam file sintaks PHP dan HTML Vim. Untuk melihat cara menambahkan aturan untuk CSS, lompat ke bagian Dan bagaimana cara menambahkannya? di bawah, atau baca terus untuk penjelasan tentang cara kerjanya.

Di mana aturan sintaks ini ditetapkan?

JavaScript heredoc disorot menggunakan fitur sintaks contains1 Vim , yang memungkinkan grup sintaksis memuat grup sintaksis lainnya.

Untuk menemukan di mana ini didefinisikan, pertama buka file yang menyoroti sintaks untuk PHP:

:e $VIMRUNTIME/syntax/php.vim

Sekarang, mungkin file sintaks menemukan heredoc JavaScript berdasarkan kecocokan string "javascript", jadi mari kita coba mencari itu:

/javascript

Pertandingan ketiga adalah komentar ini:

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

Terlihat menjanjikan! Mari kita lihat baris sintaks yang relevan:

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

( lanjutan garis ditambahkan untuk membaca lebih mudah )

Oke, jadi wilayah sintaks ini menemukan heredoc JavaScript dengan ekspresi reguler yang berbelit-belit, dan memungkinkan sorotan JavaScript dalam wilayah dengan memasukkan @htmlJavascriptsintaks cluster2 dalam containsargumen.

Tetapi tidak ada definisi yang sesuai untuk heredocs CSS! Mari kita tambahkan satu. Jadi hal pertama yang harus diubah adalah startekspresi reguler. Cukup ubah javascriptmenjadi css:

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

Ini mudah!

Tapi kami tidak ingin menyoroti JavaScript di heredoc CSS kami. Jadi kita juga perlu mengubah @htmlJavascriptke padanan CSS. Tapi apa adalah CSS setara? (Anda mungkin bisa menebak, tapi mari kita lakukan gerakan untuk memastikan.)

Mari kita mencari htmljavascript3 untuk melihat di mana itu didefinisikan:

/htmljavascript

Hmmm. Tidak ada hasil lain. Itu harus didefinisikan di tempat lain! Mari kita lihat cepat di bagian atas file untuk melihat apakah kita dapat menemukan yang termasuk:

runtime! syntax/html.vim

Sepertinya ini mungkin 4 .

:e $VIMRUNTIME/syntax/html.vim

Jalankan pencarian lagi di file ini, dan kami menemukan baris 5 ini :

syn cluster htmlJavaScript      add=@htmlPreproc

Jadi htmlJavaScript adalah cluster, didefinisikan dalam html.vim. Apakah ada cluster serupa untuk CSS yang bisa kita gunakan?

/htmlcss

Ya!

syn include @htmlCss syntax/css.vim

Jadi kita hanya perlu mengganti @htmlJavascriptdengan @htmlCssdi containsargumen:

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

Dan bagaimana cara menambahkannya?

Simpan seluruh perintah sintaksis di bawah dalam file ~/after/syntax/php.vimsehingga dijalankan setelah sisa pemrosesan sintaksis PHP telah dilakukan, dan Anda selesai!

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: Lihat :help :syn-containsdetailnya.
2: Lihat :help :syn-cluster.
3: Saya sudah 'ignorecase'dihidupkan. Tanpanya, Anda harus mencari htmlJavascriptatau \chtmljavascript
4: Faktanya, berdasarkan skema penamaan yang digunakan dalam file sintaks Vim, kami mungkin bisa mengetahuinya berdasarkan htmlJavascriptnama saja.
5: Dengan "JavaScript" dengan huruf besar berbeda, kali ini. Beruntung kita 'ignorecase'dihidupkan, eh?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.