heredoc 내에서 언어 별 구문을 활성화하려면 어떻게합니까?


19

PHP 파일을 편집하고 heredoc에서 문자열을 정의하면 JavaScript 구문, HTML 구문 또는 SQL 구문 인 경우 heredoc 내에서 구문 강조가 활성화됩니다. 그러나 CSS 구문에서는 작동하지 않습니다.

예 ( hello.php다음 코드를 사용하여 새 PHP 파일을 만드는 경우 ) :

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

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

JAVASCRIPT블록이 제대로 강조하지만, CSS블록은 아니다. 또한 JavaScript 코드 블록 SynStackvar키워드를 실행하면을 얻지 ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier']만 CSS 블록의 어느 곳에서나 똑같이하면을 얻으 ['phpRegion', 'phpHereDoc']므로 CSS 구문 강조 규칙을 추가해야합니다. 이러한 구문 규칙은 어디에서 정의되며 어떻게 추가합니까?


1
참고 : // This should be syntax-highlighted유효한 CSS 주석이 아니므로 주석 이외의 것으로 강조 표시된 구문이어야합니다. CSS는 /* */여러 줄 주석 만 지원합니다 . //한 줄 주석은 Sass 또는 Stylus와 같은 전 처리기 언어를 사용하는 경우에만 지원됩니다.
Rory O'Kane

당신이 올바른지. 해당 변경 사항을 반영하도록 코드를 업데이트했습니다.
MrSnrub April

나도 CSS heredoc 구문 강조를위한 솔루션을 찾고 있습니다. 많은 시나리오를 시도했지만 작동하지 못했습니다. 누구든지 해결책이 있습니까?
Ken

답변:


3

TL; DR :

Vim의 PHP 및 HTML 구문 파일에 정의되어 있습니다. CSS에 대한 규칙을 추가하는 방법을 보려면 섹션으로 이동하십시오. 어떻게 추가합니까? 작동 방법에 대한 설명은 아래를 참조하십시오.

이 구문 규칙은 어디에 정의되어 있습니까?

JavaScript heredoc은 Vim의 구문 contains1 기능을 사용하여 강조 표시 되어 구문 그룹에 다른 구문 그룹이 포함될 수 있습니다.

이것이 정의 된 곳을 찾으려면 먼저 PHP 용 구문 강조 파일을여십시오.

:e $VIMRUNTIME/syntax/php.vim

이제 구문 파일은 문자열 "javascript"와 일치하는 JavaScript heredoc을 찾고 있으므로이를 검색해보십시오.

/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을 찾고 인수 내에 @htmlJavascript구문 cluster2 를 포함시켜 영역 내에서 JavaScript 강조 표시를 허용합니다 contains.

그러나 CSS heredocs에 대한 해당 정의가 없습니다! 하나 추가 할 수 있습니다. 가장 먼저 변경해야 할 것은 start정규식입니다. 단순히 변경 javascriptcss:

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

이것은 쉬워요!

그러나 CSS heredoc에서 JavaScript 강조 표시를 원하지 않습니다. 따라서 @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 : 이번에는 "자바 스크립트"가 다르게 대문자로 표시되었습니다. 운이 'ignorecase'좋았어, 응?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.