2009-11-17 4 views
2

정상 모드에서 현재 커서 아래에있는 코드 블록을 강조 표시하는 방법을 찾고 있습니다.언더 커서 코드 블록을 강조 표시 하시겠습니까?

이것은 set showmatch 구성 옵션과 비슷하지만 감지 및 강조 표시가 전체 블록에 걸쳐 확장됩니다.

구성 옵션 또는 (선호하는 기존의) 스크립트로이 기능을 수행하는 방법은 무엇입니까?

답변

1

짧은 대답 : 아니오.

긴 대답 :이를 달성 할 수있는 방법이 있지만, 다른 많은 중요한 강조 표시 기능을 희생해야합니다.

간단한 옵션으로는 할 수 없습니다. 문제는 Vim이 중첩 영역을 허용하지 않는다는 것입니다. 따라서 rainbow.vim이 설치되어 있거나 블록 영역에 영역을 만들면 그 부분이 손실됩니다. 배경색을 설정하는 그룹과 전경을 설정하는 그룹을 강조 표시하는 것은 어려운 일입니다. 당신이 보시 듯이 이것은 매우 제한적입니다.

그러나 공상 놀이를하는 경우 계속 읽으십시오. 여기 난 당신이 날 같은 코딩 스타일에서 C 코드를 사용하고 있지만, 쉽게 변경 될 수 있음을 여기에 가정을 만들고 있어요

...

관련된 무슨을 보여 도움이 간단한 함수입니다 :

function! HighlightBlock() 
    " Search backwards and forwards for an opening and closing brace 
    " at the start of the line (change this according to your coding 
    " style or how you define a block). 
    let startmatch = search('^{', 'bcnW') 
    let endmatch = search('^}', 'cnW') 

    " Search in the other direction for each to catch the situation 
    " where we're in between blocks. 
    let checkstart = search('^{', 'cnW') 
    let checkend = search('^}', 'bcnW') 

    " Clear BlockRegion if it exists already (requires Vim 7 probably) 
    try 
     syn clear BlockRegion 
    catch 
    endtry 

    " If we're not in a block, give up 
    if ((startmatch < checkstart) && (endmatch > checkstart)) 
       \ || ((startmatch < checkend) && (endmatch > checkend)) 
       \ || (startmatch == 0) 
       \ || (endmatch == 0) 
     return 
    endif 

    " Create a new syntax region called "BlockRegion" that starts 
    " on the specific lines found above (see :help \%l for more 
    " information). 
    exec 'syn region BlockRegion' 
       \ 'start=' . '"\%' . startmatch . 'l"' 
       \ 'end=' . '"\%' . (endmatch+1) . 'l"' 

    " Add "contains=ALL" onto the end for a different way of 
    " highlighting, but it's not much better... 

    " Define the colours - not an ideal place to do this, 
    " but good for an example 
    if &background == 'light' 
     hi default BlockRegion guibg='#AAAAAA' 
    else 
     hi default BlockRegion guibg='#333333' 
    endif 

endfunction 

기능을 사용하려면 어딘가에서 소스를 가져온 다음 변경 사항이있을 때마다이를 호출하는 autocmd를 만듭니다.

au CursorMoved *.c call HighlightBlock() 

는 당신이 고려할 수있는 몇 가지 autocommands에 대해 다음을 참조하십시오 :

:help CursorHold 
:help CursorHoldI 
:help CursorMoved 
:help CursorMovedI 
+0

좋은 작성자를, 난 당신의 코드가 내 스타일 (JS 일)와 함께 꽤 작업을 수행하는 경우에도 아이디어를 얻을. – julien

+0

아하 : 질문에서 그걸 해결할 수 없었습니다. 나는 js가 중괄호를 사용한다고 믿는다. 그래서 만약 당신이 내부에있을 때 내부 블록 만 강조한다면, 아마도 네 개의 검색 라인에서'^'와'$' 학문, 그러나 강조한 문제 (주어진 말장난)를 감안할 때. – DrAl

+0

아주 좋은 결과입니다. vim의'vaB' (C) 또는'vab' (lispers) 선택을 활용할 수 있을지 궁금합니다. – progo

관련 문제