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 코드 블록 SynStack
의 var
키워드를 실행하면을 얻지 ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier']
만 CSS 블록의 어느 곳에서나 똑같이하면을 얻으 ['phpRegion', 'phpHereDoc']
므로 CSS 구문 강조 규칙을 추가해야합니다. 이러한 구문 규칙은 어디에서 정의되며 어떻게 추가합니까?
답변
TL; DR :
Vim의 PHP 및 HTML 구문 파일에 정의되어 있습니다. CSS에 대한 규칙을 추가하는 방법을 보려면 섹션으로 이동하십시오. 어떻게 추가합니까? 작동 방법에 대한 설명은 아래를 참조하십시오.
이 구문 규칙은 어디에 정의되어 있습니까?
JavaScript heredoc은 Vim의 구문 contains
1 기능을 사용하여 강조 표시 되어 구문 그룹에 다른 구문 그룹이 포함될 수 있습니다.
이것이 정의 된 곳을 찾으려면 먼저 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
구문 cluster
2 를 포함시켜 영역 내에서 JavaScript 강조 표시를 허용합니다 contains
.
그러나 CSS heredocs에 대한 해당 정의가 없습니다! 하나 추가 할 수 있습니다. 가장 먼저 변경해야 할 것은 start
정규식입니다. 단순히 변경 javascript
에 css
:
start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"
이것은 쉬워요!
그러나 CSS heredoc에서 JavaScript 강조 표시를 원하지 않습니다. 따라서 @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 : 이번에는 “자바 스크립트”가 다르게 대문자로 표시되었습니다. 운이 'ignorecase'
좋았어, 응?