2014-07-20 3 views
1

실제로 구문을 강조 표시하기 위해 Vim에서 중첩 구문 강조를 얻으려면 어떻게해야합니까?Vim에서 구문 강조 기능을 중첩하는 방법은 무엇입니까?

다른 언어, 특히 SQL, Groovy, JavaScript, PHP 및 AppleScript의 코드를 문자열에 포함 할 수있는 언어 구문 파일을 작성하고 있습니다. 나는 첫 번째 언어를 작동시키고 언어가 무엇인지 지정하는 임베디드 언어의 주석을 사용하여 이러한 문자열을 시작함으로써 혼자서 쉽게 사용하기를 바라고 있습니다. 여기 예제 :이 코드 내 syntax/plugin.vim 파일의 끝에 순간

runtime! syntax/sql.vim 
unlet b:current_syntax 
syntax include @sql_code syntax/sql.vim 
syntax region fm_sql_code start /"\/\*lang=sql\*\// keepend end=/\v"/ [email protected]_code 

: 내 구문 파일에서

ExecuteSQL("/*lang=sql*/ SELECT * 
          FROM table 
          WHERE id = ?"; 
          ""; ""; 
          456 
) 

나는 다음과 같은 코드의 라인을 가지고있다.

au FileType fmcalc runtime! syntax/sql.vim 
au FileType fmcalc unlet b:current_syntax 
au FileType fmcalc syntax include @sql_code syntax/sql.vim 
au FileType fmcalc syntax region fm_sql_code start /"\/\*lang=sql\*\// keepend end=/\v"/ [email protected]_code 

는 지금까지 코드의 위치는 결과를 변경되지 않은 :하지만 또한 ftplugin/plugin.vim의 코드를 넣어하지만 실행하기 autocmd의를 사용하여 시도했습니다.

<c-s-p>을 눌러 현재 문자의 구문 스택을 볼 수있는 매핑이 있습니다.

결과는 위와 같이 커서가 문자열에있을 때 스택이 ['fm_sql_code', 'sqlString']으로 표시됩니다. 그래서 그것은 내장 된 문법을 탐지하지만 그것을 문자열로 표시합니다. 문제는 텍스트가 문자열 리터럴처럼 SQL 언어 코드로 강조 표시되지 않는다는 것입니다.

내 첫번째 생각은이 일 것을 이었기 때문에 나는 따옴표를 포함하는 지역에 사용하고, 그래서 다음에 그 변경 시도 정규식 :

syntax region fm_sql_code start=/"\@=\/\*lang=sql\*\// keepend end=/"\@=/ [email protected]_code 

하지만 그건에 실패 문자열을 SQL로 보아라. 위 예제의 구문 스택은 문자열의 기본 구문 이름 인 ['fm_string_literal']을 반환합니다.

도움을 주시면 감사하겠습니다.

답변

2
let csyn = b:current_syntax 
unlet b:current_syntax 
syntax include @sql syntax/sql.vim 
syntax region sqlSnip start='\(\)\(/\* *lang=sql *\*/\)\@=' end='\(\)"\@=' [email protected] containedin=ALL 
let b:current_syntax = csyn 
unlet csyn 

편집 :

일시적 변수가 존재하면 빔 구문 파일은 일반적으로로드되지 않기 때문에 b:current_syntax이 필요 해제하기. 예를 들어 syntax/sql.vim은 다음과 같이 시작됩니다.

" For version 5.x: Clear all syntax items 
" For version 6.x: Quit when a syntax file was already loaded 
if version < 600 
    syntax clear 
elseif exists("b:current_syntax") 
    finish 
endif 
+0

왜 let 및 unlet? – FDinoff

관련 문제