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 contains
1 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 @htmlJavascript
sintaks cluster
2 dalam contains
argumen.
Tetapi tidak ada definisi yang sesuai untuk heredocs CSS! Mari kita tambahkan satu. Jadi hal pertama yang harus diubah adalah start
ekspresi reguler. Cukup ubah javascript
menjadi 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 @htmlJavascript
ke padanan CSS. Tapi apa adalah CSS setara? (Anda mungkin bisa menebak, tapi mari kita lakukan gerakan untuk memastikan.)
Mari kita mencari htmljavascript
3 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 @htmlJavascript
dengan @htmlCss
di contains
argumen:
contains=@htmlCss,phpIdentifierSimply,phpIdentifier,[...]
Dan bagaimana cara menambahkannya?
Simpan seluruh perintah sintaksis di bawah dalam file ~/after/syntax/php.vim
sehingga 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-contains
detailnya.
2: Lihat :help :syn-cluster
.
3: Saya sudah 'ignorecase'
dihidupkan. Tanpanya, Anda harus mencari htmlJavascript
atau \chtmljavascript
4: Faktanya, berdasarkan skema penamaan yang digunakan dalam file sintaks Vim, kami mungkin bisa mengetahuinya berdasarkan htmlJavascript
nama saja.
5: Dengan "JavaScript" dengan huruf besar berbeda, kali ini. Beruntung kita 'ignorecase'
dihidupkan, eh?
// This should be syntax-highlighted
bukan 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.