TL; DR:
มันกำหนดไว้ในไฟล์ไวยากรณ์ PHP และ HTML ของ Vim หากต้องการดูวิธีเพิ่มกฎสำหรับ CSS ให้ข้ามไปที่ส่วนและฉันจะเพิ่มกฎได้อย่างไร ด้านล่างหรืออ่านเพื่อดูคำอธิบายวิธีการทำงาน
กฎไวยากรณ์เหล่านี้จะถูกกำหนดที่ไหน?
JavaScript heredoc ถูกเน้นโดยใช้คุณลักษณะไวยากรณ์contains
1ของ Vim ซึ่งอนุญาตให้กลุ่มไวยากรณ์มีกลุ่มไวยากรณ์อื่น ๆ
หากต้องการค้นหาตำแหน่งที่กำหนดไว้ขั้นแรกให้เปิดไฟล์ไฮไลต์ไวยากรณ์สำหรับ PHP:
:e $VIMRUNTIME/syntax/php.vim
ทีนี้สมมุติว่าไฟล์ไวยากรณ์กำลังค้นหา JavaScript heredoc จากการจับคู่ของสตริง "javascript" ดังนั้นให้ลองค้นหาดังนี้:
/javascript
คู่ที่สามคือความคิดเห็นนี้:
" including HTML,JavaScript,SQL even if not enabled via options
ดูมีแนวโน้ม! ลองดูที่บรรทัดไวยากรณ์ที่เกี่ยวข้อง:
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
( เพิ่มการต่อเนื่องของบรรทัดเพื่อให้อ่านง่ายขึ้น )
ตกลงดังนั้นขอบเขตของไวยากรณ์นี้จะค้นหา JavaScript heredoc ด้วยนิพจน์ทั่วไปที่ซับซ้อนและอนุญาตให้ใช้การเน้น JavaScript ภายในพื้นที่โดยรวมถึง@htmlJavascript
ไวยากรณ์cluster
2ภายในcontains
อาร์กิวเมนต์
แต่ไม่มีคำจำกัดความที่สอดคล้องกันสำหรับ CSS heredocs! ให้เพิ่มหนึ่งรายการ ดังนั้นสิ่งแรกที่ต้องเปลี่ยนคือการstart
แสดงออกปกติ เพียงเปลี่ยนjavascript
เป็นcss
:
start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"
มันง่ายมาก!
แต่เราไม่ต้องการให้มีการเน้น JavaScript ใน CSS heredoc ของเรา ดังนั้นเราต้องเปลี่ยน@htmlJavascript
CSS ให้เทียบเท่า แต่สิ่งที่เป็นเทียบเท่า CSS? (คุณอาจจะเดาได้ แต่ให้ผ่านการเคลื่อนไหวเพื่อให้แน่ใจ)
ให้ค้นหาhtmljavascript
3เพื่อดูตำแหน่งที่กำหนด:
/htmljavascript
อืมม ไม่มีผลลัพธ์อื่น มันจะต้องกำหนดที่อื่น! ลองดูที่ส่วนบนของไฟล์อย่างรวดเร็วเพื่อดูว่าเราสามารถค้นหาสิ่งใดรวมถึง:
runtime! syntax/html.vim
ดูเหมือนว่าเรื่องนี้อาจจะเป็น4
:e $VIMRUNTIME/syntax/html.vim
เรียกใช้การค้นหาอีกครั้งในไฟล์นี้และเราพบบรรทัดที่5 :
syn cluster htmlJavaScript add=@htmlPreproc
ดังนั้น htmlJavaScript เป็นที่กำหนดไว้ในcluster
html.vim
มีคลัสเตอร์ที่คล้ายกันสำหรับ CSS ที่เราสามารถใช้ได้หรือไม่?
/htmlcss
ได้!
syn include @htmlCss syntax/css.vim
ดังนั้นเราจึงต้องแทนที่@htmlJavascript
ด้วย@htmlCss
ในการcontains
โต้แย้ง:
contains=@htmlCss,phpIdentifierSimply,phpIdentifier,[...]
และฉันจะเพิ่มพวกเขาได้อย่างไร
บันทึกคำสั่งไวยากรณ์ทั้งหมดด้านล่างในไฟล์~/after/syntax/php.vim
เพื่อให้มันรันหลังจากการประมวลผลไวยากรณ์ PHP ส่วนที่เหลือเสร็จสิ้นและคุณทำเสร็จแล้ว!
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: ดู:help :syn-contains
รายละเอียด
2: :help :syn-cluster
ดู
3: ฉัน'ignorecase'
เปิดสวิตช์แล้ว หากไม่มีคุณจะต้องค้นหาhtmlJavascript
หรือ\chtmljavascript
4: อันที่จริงตามรูปแบบการตั้งชื่อที่ใช้ในไฟล์ไวยากรณ์ของ Vim เราอาจคิดได้ว่าเป็นไปตามhtmlJavascript
ชื่อเพียงอย่างเดียว
5: ด้วย "JavaScript" พิมพ์ใหญ่ในเวลานี้ โชคดีที่เราได้'ignorecase'
เปิดแล้วใช่มั้ย
// This should be syntax-highlighted
ไม่ใช่ความคิดเห็น CSS ที่ถูกต้องและควรเน้นไวยากรณ์เป็นสิ่งอื่นนอกเหนือจากความคิดเห็น CSS สนับสนุน/* */
ความคิดเห็นแบบหลายบรรทัดเท่านั้น//
ความคิดเห็นบรรทัดเดียวได้รับการสนับสนุนเฉพาะเมื่อคุณใช้ภาษา preprocessor เช่น Sass หรือ Stylus