2014-01-08 9 views
2

clang -emit-llvm에 의해 생성 된 LLVM-IR 코드로 작업 중이며 코드 폴딩 작업을 원합니다.Vim을위한 LLVM-IR 구문 폴딩

지금까지 foldmethod=exprfoldexpr=LLVMFold()을 사용하고 있습니다. llvm 저장소의 구문 파일을 사용하여 구문 기반 폴딩 (예 : foldmethod=syntax)을 사용하고 싶습니다. Available here.

첫 번째 정규식은 레이블의 구문 파일에 있습니다.

function! LLVMFolds() 
    let thisline = getline(v:lnum) 
    if match(thisline, '^[-a-zA-Z$._][-a-zA-Z$._0-9]*:') >= 0 
     return ">2" 
    elseif match(thisline, '^\}$') >= 0 
     return "<1" 
    elseif match(thisline, '{$') >= 0 
     return ">1" 
    else 
     return "=" 
    endif 
endfunction 

중괄호를 레벨 2로 접어 넣습니다. 또한 시도

이 샘플 불완전 LLVM-IR 코드에 대한 이상적 foldmark="{,}" 와 충분히 접하지 않았다 foldmethod=indentfoldmethod=marker을이었다 : 나는 주름이 define{까지 싶습니다

define i32 @main() nounwind { 
entry: 
    %retval = alloca i32, align 4 

for.cond:           ; preds = %entry 
    %4 = load i32* %i, align 4 
    %cmp1 = icmp slt i32 %4, 10 
    br i1 %cmp1, label %for.body, label %for.end 
} 

} 및 각 레이블이있는 섹션 (예 : entry:에서 명확한 라인까지).

답변

0

을 현재 수준의 2 배에서 닫는 중괄호를 제외하고 초기 목록을 주름

function! LLVMFolds() 
    let thisline = getline(v:lnum) 
    let nextline = getline(v:lnum + 1) 
    " match start of global var block 
    if match(thisline, '^@') == 0 && foldlevel(v:lnum - 1) <= 0 
     return ">1" 
    " match start of global struct block 
    elseif match(thisline, '^%') == 0 && foldlevel(v:lnum - 1) <= 0 
     return ">1" 
    " matches lables 
    elseif match(thisline, '^[-a-zA-Z$._][-a-zA-Z$._0-9]*:') >= 0 
     return ">2" 
    " keep closing brace outside l2 fold 
    elseif match(nextline, '^\}$') >= 0 
     return "<2" 
    " keep closing brace in l1 fold 
    elseif match(thisline, '^\}$') >= 0 
     return "<1" 
    " open new l1 fold for open brace 
    elseif match(thisline, '{$') >= 0 
     return ">1" 
    " for the next line being empty, close the fold for the var and struct blocks 
    elseif match(nextline, '^$') >= 0 
     if match(thisline, '^@') == 0 && foldlevel(v:lnum - 1) == 1 
      return "<1" 
     elseif match(thisline, '^%') >= 0 && foldlevel(v:lnum - 1) == 1 
      return "<1" 
     else 
      return "=" 
     endif 
    else 
     return "=" 
    endif 
endfunction 

전역 구조체 및 변수

+0

구문 강조 표시와 ftdetect는 내 [GitHub] (https://github.com/EdJoJob/llvmir-vim)에서 사용할 수 있습니다. – EdJoJob

1

나는

:set foldmethod=syntax 

해당 파일이 어떤 fold 인수를 정의하지 않기 때문에, 귀하의 링크에서 구문 파일에 도움이 될 수 있다고 생각하지 않습니다.

귀하의 LLVMFolds() 기능이 원하는대로 작동하는 것으로 보이지만, 정확하게 이해할 경우 } 줄을 포함시키지 않으실 것입니다. 어쩌면 당신이 원하는 것은 다음과 같이 이전 라인이 배를 종료하는 것입니다 :

function! Foo(lnum) 
    let thisline = getline(v:lnum) 
    let nextline = getline(v:lnum + 1) 
    if match(thisline, '^[-a-zA-Z$._][-a-zA-Z$._0-9]*:') >= 0 
     return ">2" 
    elseif match(nextline, '^\}$') >= 0 
     return "<1" 
    elseif match(thisline, '{$') >= 0 
     return ">1" 
    else 
     return "=" 
    endif 
endfunction 

이 수도 있고 {} 사이에 선이없는 경우 당신이 원하는 것을 할 수 없습니다. 테스트를 위해

:set fdm=expr foldexpr=LLVMFolds() fdc=5 

참조하십시오 :이 기능을 사용했습니다

:help fold-syntax 
:help :syn-fold 
:help fold-expr 
+0

"RTFM"이 정말로 필요합니까? – jerry

+0

아니요, 이전의': set' 행에서 세 줄의': help' 줄을 분리하고 싶었습니다. – benjifisher

+0

"매뉴얼 :", "문서 :"또는 "도움말 페이지를 읽음으로써 더 많은 것을 배울 수 있습니다"와 같이 간단 할 것입니다. "RTFM"은 일부 서클에서 흔히 볼 수 있으며 어떤 사람들은 그것에 의해 불쾌감을 느끼지 않을 것이지만 많은 사람들이 기분을 상하게합니다. – jerry