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.