heredoc 내에서 언어 별 구문을 활성화하려면 어떻게합니까? 사용하여 새 PHP 파일을 만드는 경우

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 구문 강조 규칙을 추가해야합니다. 이러한 구문 규칙은 어디에서 정의되며 어떻게 추가합니까?



답변

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'좋았어, 응?