ฉันจะเปิดใช้งานไวยากรณ์เฉพาะภาษาภายใน heredoc ได้อย่างไร


19

เมื่อฉันแก้ไขไฟล์ PHP และฉันกำหนดสตริงใน heredoc การเน้นไวยากรณ์จะเปิดใช้งานภายใน heredoc หากเป็นไวยากรณ์ JavaScript หรือไวยากรณ์ HTML หรือไวยากรณ์ SQL อย่างไรก็ตามมันจะไม่ทำงานสำหรับไวยากรณ์ CSS

ตัวอย่าง (ถ้าเราสร้างไฟล์ PHP ใหม่ที่เรียกhello.phpด้วยรหัสต่อไปนี้):

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

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

JAVASCRIPTบล็อกเป็นไฮไลท์ได้อย่างถูกต้อง แต่CSSบล็อกไม่ได้ นอกจากนี้ถ้าผมทำงานSynStackในvarคำหลักในรหัสบล็อก JavaScript, ฉันได้รับ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier']แต่ถ้าผมทำเช่นเดียวกันไปยังสถานที่ใด ๆ ในบล็อก CSS ที่ฉันจะได้รับ['phpRegion', 'phpHereDoc']ดังนั้นผมจึงจำเป็นต้องเพิ่มบางไวยากรณ์ CSS การเน้นกฎระเบียบ กฎไวยากรณ์เหล่านี้ถูกกำหนดไว้ที่ไหนและฉันจะเพิ่มกฎเหล่านั้นได้อย่างไร


1
หมายเหตุ: // This should be syntax-highlightedไม่ใช่ความคิดเห็น CSS ที่ถูกต้องและควรเน้นไวยากรณ์เป็นสิ่งอื่นนอกเหนือจากความคิดเห็น CSS สนับสนุน/* */ความคิดเห็นแบบหลายบรรทัดเท่านั้น //ความคิดเห็นบรรทัดเดียวได้รับการสนับสนุนเฉพาะเมื่อคุณใช้ภาษา preprocessor เช่น Sass หรือ Stylus
Rory O'Kane

คุณถูก. ฉันได้อัปเดตรหัสเพื่อให้สอดคล้องกับการเปลี่ยนแปลงนั้น
MrSnrub

ฉันก็กำลังมองหาวิธีการแก้ปัญหาสำหรับการเน้นไวยากรณ์ CSS heredoc ฉันลองหลาย ๆ สถานการณ์ แต่ไม่สามารถใช้งานได้ ใครมีทางออก?
เคน

คำตอบ:


3

TL; DR:

มันกำหนดไว้ในไฟล์ไวยากรณ์ PHP และ HTML ของ Vim หากต้องการดูวิธีเพิ่มกฎสำหรับ CSS ให้ข้ามไปที่ส่วนและฉันจะเพิ่มกฎได้อย่างไร ด้านล่างหรืออ่านเพื่อดูคำอธิบายวิธีการทำงาน

กฎไวยากรณ์เหล่านี้จะถูกกำหนดที่ไหน?

JavaScript heredoc ถูกเน้นโดยใช้คุณลักษณะไวยากรณ์contains1ของ 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ไวยากรณ์cluster2ภายในcontainsอาร์กิวเมนต์

แต่ไม่มีคำจำกัดความที่สอดคล้องกันสำหรับ CSS heredocs! ให้เพิ่มหนึ่งรายการ ดังนั้นสิ่งแรกที่ต้องเปลี่ยนคือการstartแสดงออกปกติ เพียงเปลี่ยนjavascriptเป็นcss:

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

มันง่ายมาก!

แต่เราไม่ต้องการให้มีการเน้น JavaScript ใน CSS heredoc ของเรา ดังนั้นเราต้องเปลี่ยน@htmlJavascriptCSS ให้เทียบเท่า แต่สิ่งที่เป็นเทียบเท่า CSS? (คุณอาจจะเดาได้ แต่ให้ผ่านการเคลื่อนไหวเพื่อให้แน่ใจ)

ให้ค้นหาhtmljavascript3เพื่อดูตำแหน่งที่กำหนด:

/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'เปิดแล้วใช่มั้ย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.