Vim은 이미 접기를 한 줄로 표시합니다. 그러나 Vim의 indent
폴딩에서는 들여 쓰기가 동일한 모든 선이 접기에 포함됩니다. 따라서 스크린 샷에서 "헤더"라고하는 줄 (예 : 시작하는 줄 collection_base_url
)은 접힘 안에 있지 않습니다 .
Vim을 사용하여 Atom의 접기와 비슷한 것을 얻을 수 있습니다 foldexpr
foldmethod
.
" Finds the indent of a line. The indent of a blank line is the indent of the
" first non-blank line above it.
function! FindIndent(line_number, indent_width)
" Regular expression for a "blank" line
let regexp_blank = "^\s*$"
let non_blank_line = a:line_number
while non_blank_line > 0 && getline(non_blank_line) =~ regexp_blank
let non_blank_line = non_blank_line - 1
endwhile
return indent(non_blank_line) / a:indent_width
endfunction
" 'foldexpr' for Atom-style indent folding
function! AtomStyleFolding(line_number)
let indent_width = &shiftwidth
" Find current indent
let indent = FindIndent(a:line_number, indent_width)
" Now find the indent of the next line
let indent_below = FindIndent(a:line_number + 1, indent_width)
" Calculate indent level
if indent_below > indent
return indent_below
elseif indent_below < indent
return "<" . indent
else
return indent
endif
endfunction
set foldexpr=AtomStyleFolding(v:lnum)
set foldmethod=expr
이것은 :help fold-expr
다음과 같이 접기 표현식을 정의합니다 (참조 ).
- 들여 쓰기 된 줄 바로 앞에있는 줄의 경우 뒤에 오는 블록의 들여 쓰기를 반환합니다.
- 들여 쓰기 된 줄의 경우 들여 쓰기를 반환합니다. (이동 폭으로 나누어 각 들여 쓰기 레벨이 리턴 값을 1 씩 증가시킵니다)
- 들여 쓰기 된 줄의 블록 끝에있는 줄의
"<N"
경우 N이 들여 쓰기로 설정된 string을 반환합니다 . 이것은 Vim에게 레벨 N의 폴드가 그 라인에서 마무리 된다고 알려줍니다 .
최신 정보
@alxndr은 주석 end
에 접어 넣은 루비를 포함하도록 이것을 확장 할 수 있는지 의견에 묻습니다 . " Calculate indent level
섹션을 다음 으로 교체하여 시작할 수 있습니다 .
if indent_below > indent
return indent_below
elseif getline(a:line_number) =~ '^\s*end\s*$'
return "<" . (indent + 1)
else
return indent
endif
따라서 가장 강력한 솔루션은 아닙니다 (예 : end
명령문이 세미콜론 다음에 같은 행에 있으면 실패합니다 ). 정규 표현식과 주변 코드를 조정 하여이 문제를 해결할 수 있지만 이제 파일의 실제 구문을 구문 분석하는 영역 내에 있으므로 좋은 해결책을 찾기 전에 상황이 훨씬 복잡해질 수 있습니다.