Atom 또는 Sublime Text와 유사한 vim 접기를 한 줄로 접기


13

나는 Atom과 Sublime Text가 선 접기를 처리하는 방식의 팬입니다. 각 접기의 첫 번째 줄이 보이고 (구문 강조 표시가 완료 됨) 접는 것을 나타내는 줄 끝에 마커가 추가됩니다.

Vim의 들여 쓰기 접기 (위)와 Atom (아래)을 비교 한 아래 스크린 샷을 참조하십시오.Vim과 Atom 코드 접기

Vim은 각 접기마다 두 줄을 바칩니다. 첫 번째 줄은 제목으로 사용되며 두 번째 줄은 접기에 대한 일부 정보 (접기 안의 줄 수 및 텍스트)를 나타냅니다.

Atom은 한 줄만 사용하고 줄 끝에 작은 표시자를 사용하여 왼쪽의 줄 번호에 추가 된 색상과 함께 접힘을 나타냅니다. Atom의 폴딩 스타일은 화면 공간을 덜 사용하지만 실제로 필요한 모든 정보를 전달합니다.

나는 Atom 접기 스타일에 부분적입니다. 내 의견으로는, 특히 위의 스크린 샷과 같이 여러 방법이나 속성을 연속으로 나열 할 때 더 깨끗하고 일관성이있는 것으로 보입니다.

Vim에서 Atom의 접는 스타일을 대략적으로 근사하는 방법이 있습니까?


1
폴드가 실제로 여는 괄호를 포함하는 줄로 시작하지 않기 때문이라고 생각합니다. Vim은 접기가 시작되는 줄에 접기 텍스트 만 사용합니다. 예를 들어 C에서 괄호 배치가 어떻게 영향을 미치는지보십시오 : imgur.com/3h70dPf,wfCLPm7
muru

그러나 이것은 파이썬이며 중괄호가 없습니다 ( from __future__ import braces) ... 접기는 어떻게 구성 했습니까? 이 코드 스 니펫 (또는 문제를 보여주는 다른 코드)을 붙여 넣을 수 있습니까? Vim은 한 줄로 접히지 만 muru가 언급했듯이 주름은 줄을 늦게 시작합니다.
Martin Tournoij

@Carpetsmoker 버팀대는 접힘이 시작되는 위치를 보여주기위한 것입니다. Haskell과 같은 효과를 볼 수 있습니다.
muru

@MikeHearn 내 이전 답변이 완전히 잘못되었습니다. 문제에 대한 해결책을 포함하도록 업데이트했습니다.
Rich

답변:


12

두 줄 대 한 줄

빔에서는 스크롤 내의 모든 라인이 붕괴 될 단일 선, 및 'foldtext'옵션은 (첫 번째 (또는 모든) 라인 통상 대시 절첩 선의 수 및 콘텐츠) 그 라인의 개요를 결정한다.

귀하의 예에서 Vim에서는 {...}매개 변수 블록 자체 만 접 힙니다. 매개 변수를 사용하는 위의 행은 접기의 일부가 아닙니다. 반대로, 다른 편집기에서 매개 변수를 사용하는 해당 행은 접힘에 속하며 해당 Vim 용어를 사용하기위한 해당 접는 텍스트는 해당 행의 내용과 추가 된 마커입니다.

적응

Vim에서 접기는 다른 방법으로 참조 할 수 있으며 (참조 :help fold-methods) 'filetype'버퍼 의 크기 에 따라 다릅니다 . 폴드에 위의 라인을 포함시키는 어려움은 그에 달려 있습니다. 로 확인하십시오 :setlocal foldmethod?. 으로 들여 쓰기 접는, 당신이 영향을 미칠 수있는 일은 없다; 다른 방법으로 전환해야합니다. 들어 구문 폴딩, 그 구문 정의를 적응 의미하고, 매우 까다로운 일이 될 수 있습니다. 을 사용 하면 더 나은 행운을 얻을 수 있지만 여전히 논리를 이해하고 변경하는 것을 의미합니다. (파일 유형 플러그인 작성자가 이에 영향을주는 구성을 제공 한 것 같지 않습니다.)

접힌 선의 구문 강조

불행히도 전혀 불가능합니다. Vim은 항상 Folded전체 접힌 선에 하이라이트 그룹을 사용합니다 . 의 :highlight명령 을 통해이를 조정할 수 ~/.vimrc있지만 구문의 개별 차별화는 손실됩니다.


5

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명령문이 세미콜론 다음에 같은 행에 있으면 실패합니다 ). 정규 표현식과 주변 코드를 조정 하여이 문제를 해결할 수 있지만 이제 파일의 실제 구문을 구문 분석하는 영역 내에 있으므로 좋은 해결책을 찾기 전에 상황이 훨씬 복잡해질 수 있습니다.


훌륭한 접근 방식. 이 답변은 Ruby를 end차단하기 위해 일반화 될 수 있습니까?
alxndr

1
@ alxndr 토론을 통해 답변을 편집했습니다.
Rich

@ Rich : ...접힌 텍스트 블록의 상징으로 줄 끝에 마크 만 표시하는 Sublime 텍스트 폴드가 vim에서와 같이 텍스트 블록의 첫 번째 전체 라인을 강조 표시하는 것보다 산만 해지지 않습니다. vim의 기본 접기 동작으로 접기를 시도했지만 단순하게 작동하지 않습니다. 파이썬으로 텍스트 블록의 첫 줄 끝에 표시를 접는 방법? 새로운 질문을 열어야합니까? 나는 단지 당신의 폴드를 다시 테스트합니다. 실제로 들여 쓰기 라인과 잘 작동합니다. 슈퍼 감사합니다.
Tuyen Pham

이거 엄청나 네! 나는 접는 것과 같은 org 모드를하는 것을 찾고 있었고 이것은 많은 도움이됩니다!
priomsrb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.