Python 코드에 Vim 접기를 사용하는 권장 방법은 무엇입니까?


112

Python 코드 용 Vim에서 코드 접기를 활성화하는 데 관심이 있습니다. 그렇게하는 여러 가지 방법을 발견했습니다.

누구든지 Vim에서 Python 코드 접기를 선호하는 방법이 있습니까? 즉,

  • 사용하고 좋아하는 특정 Vim 플러그인이 있습니까?
  • 수동 접기를 사용합니까, 아니면 주석에 마커를 배치합니까?
  • Vim에서 Python 용 코드 접기를 수행하는 다른 권장 방법이 있나요?

답변:


117

개인적으로 나는 마커로 내 코드를 흩뿌 리도록 설득 할 수 없습니다. 나는 들여 쓰기 접기를 사용하는 데 꽤 익숙해졌습니다. 접기 열기 / 닫기 및 zR 및 zM 명령을위한 스페이스 바 매핑 (아래 참조)과 함께 저는 바로 집에 있습니다. Python에 적합합니다!

set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf

81
: 먼저 foldmethod = indent를 설정합니다. 나는 이것에 대해 인터넷 검색을하고 당신의 대답을 우연히 발견했습니다. :)
tmadsen

47
내 친구도 좋아했다 set foldnestmax=2. 이런 식으로 클래스의 메소드가 접히지 만 내부 진술은 그렇지 않습니다.
Denilson Sá Maia 2011

9
두 번째 매핑이 zf에 대한 답변에 왜 있는지 확실하지 않습니다. 들여 쓰기 접기를 사용하는 경우에는 사용되지 않습니다. 그러나 수동 접기를 수행하는 경우 매핑이 완벽합니다. 그러나 za는 접기를 빠르게 열거 나 닫는 가장 좋은 방법 인 것 같습니다. 또한 접기 탐색 (zk, zj)을 사용하는 것이 좋습니다.
Derek Litz

vnoremap은 수동 매핑에 적합합니다. ftplugin에서 Python 용 set foldmethod = indent를 추가합니다. 그런 다음 .vimrc에서 foldmethod = manual을 설정하십시오. 이제 스페이스 바 매핑을 사용하여 Python과 비 Python 모두에서 접을 수 있습니다.
Lionel

26

내가 사용 파이썬 구문 파일을. 접기 방법을 구문으로 설정하고 모든 클래스와 함수를 접습니다.


펼친 후 접는 방법? 바로 가기를 찾을 수 없습니다! tnx
Moj

이 구문 파일을 사용해 보았고 강조 표시를 위해 합리적으로 잘 작동했습니다. 그러나 그것은 콜드 폴딩에 대해 전혀 아무것도하지 않았습니다 .'zM '을 사용할 때 아무 일도 일어나지 않습니다. 클래스에서'za '를 사용할 때 나는 E490을 얻습니다 (No Fold found). 무엇이 잘못 되었나요?
Dani Gehtdichnixan 2014

+1. 처음에는 파이썬 코드 (클래스, 메서드) 접기가 훌륭하게 작동합니다. Walter ( stackoverflow.com/a/360634/605356 ) 답변을 사용하여 스페이스 바를 접기 명령에 매핑하지만 해당 솔루션은이 솔루션만큼 (나에게) 거의 작동하지 않습니다. 참고로 @Tomas에게 감사드립니다.
Johnny Utahh

이 조사를하고 난 당신이 솔루션을 찾을 생각 - AnsiEsc을 : @DaniGehtdichnixan은, 아마 당신은 필요
serup

10

Python 코드 접기를위한 또 다른 플러그인입니다. 다소 간단하고 독 스트링을 처리하고 GitHub에서 :

SimpylFold

즐겨!


이것은 가장 잘 작동합니다. 나는 두통을 일으키지 않았기 때문에 코드 접기에 대해 전혀 생각하지 않았습니다.
iankit

가끔 그것은 또한 배 텐데 @iankit if, forwhile블록은 당신에게하지?
iago-lito

흠 그다지 도움이되지 않을 것 같습니다. 그가 이러한 블록을 접 으면 접힌 상태에서 내용이 무엇인지 명확하지 않습니다. 그러나 메서드와 다른 명명 된 블록을 사용하면 이름이 모든 것을 알려줍니다. 이름을보고 접힌 블록이 무엇을하는지 추측 할 수 있습니다.
iankit

@iankit 모르겠어요 .. 해보고 싶어요. 왜 시도 하지 않습니까? ^ ^
iago-lito

7

파이썬은 들여 쓰기로 접기에 적합하고, 내 자신의 코드를 작성하기 위해 비트를 사용합니다. 마커를 사용하여 원하는 방식으로 문서를 처리하고 일종의 목차 역할을 할 수 있습니다. 다른 사람의 코드를 볼 때 둘 사이를 전환하기 위해 vimrc에 이것을 가지고 있습니다.

#Toggle fold methods \fo
let g:FoldMethod = 0
map <leader>fo :call ToggleFold()<cr>
fun! ToggleFold()
    if g:FoldMethod == 0
        exe 'set foldmethod=indent'
        let g:FoldMethod = 1
    else
        exe 'set foldmethod=marker'
        let g:FoldMethod = 0
    endif
endfun
#Add markers (trigger on class Foo line)
nnoremap ,f2 ^wywO#<c-r>0 {{{2<esc>
nnoremap ,f3 ^wywO#<c-r>0 {{{3<esc> 
nnoremap ,f4 ^wywO#<c-r>0 {{{4<esc>
nnoremap ,f1 ^wywO#<c-r>0 {{{1<esc>




3

나에게 이상적인 폴딩은 classdef블록 만 접는 것이고 , 들여 쓰기 폴딩은 제 취향에 맞지 않습니다. 나는 하나의 우아한 해결책은 다음과 같이 구문 시스템을 사용하는 것입니다 생각 하나 토마스에 의해 언급했다. 그러나 이것은 원본 구문 파일을 대체하기위한 것이며 원본보다 오래되어 끝날 수 있습니다 (즉, 해당 스크립트는 Python 3 구문을 언급하지 않음).

내 해결책은 위의 스크립트에서 가져온 중요한 줄로 ~/.vim/syntax이름이 지정된 파일을 폴더 에 배치 하는 python.vim것입니다.

syn match   pythonDefStatement  /^\s*\%(def\|class\)/
       \ nextgroup=pythonFunction skipwhite
syn region  pythonFunctionFold  start="^\z(\s*\)\%(def\|class\)\>"
       \ end="\ze\%(\s*\n\)\+\%(\z1\s\)\@!." fold transparent

hi link pythonDefStatement Statement

그런 다음 :set foldmethod=syntax.


1
이 솔루션이 마음에 듭니다. 그러나 줄의 시작 부분에 있으면 'n fold classes 및 defs 와 일치하지 않습니다 . 내가 거의 발현을 읽을 수 있기 때문에, 나는 일치하기 위해 그것을 조정할하려고 문제입니다 ^def^class. 이후하지만이 호기심 \s*이 잘 처리해야한다 ..
이아고 - 리토 '떠나 고려

2

Python 소스는 사용자 정의 vimrc 파일과 함께 vim 구문 플러그인과 함께 제공됩니다. Vim 에서 파이썬 FAQ를 확인하십시오.


2
이 구문 파일에는 접기 정보도 포함되어 있지 않습니다. 따라서이 구문 파일을 구문 접기와 함께 사용할 수 없습니다.
KFL

2

귀하의 .vimrc:

set foldmethod=indent
set shiftwidth=4

그런 다음 zM모두 마스킹하여 모두 zR확장합니다. 또한 다음을 추가했습니다.

nnoremap <space> za
vnoremap <space> zf
map z1  :set foldlevel=0<CR><Esc>
map z2  :set foldlevel=1<CR><Esc>
map z3  :set foldlevel=2<CR><Esc>
map z4  :set foldlevel=3<CR><Esc>
map z5  :set foldlevel=4<CR><Esc>
map z6  :set foldlevel=5<CR><Esc>
map z7  :set foldlevel=6<CR><Esc>
map z8  :set foldlevel=7<CR><Esc>
map z9  :set foldlevel=8<CR><Esc>

당신이 할 수있는 지금 z1z2조금씩내어 작은합니다.


2

.vimrc 용으로 작성한이 작은 vim 스크립트가 정말 마음에 듭니다. alt+1첫 번째 파이썬 들여 쓰기 수준 (클래스 정의 및 함수) alt+2을 접고 두 번째 수준 (클래스 메서드)을 접고 alt+0모든 것을 펼치도록 매핑 합니다 . 한 레벨 만 접고 중첩 된 하위 레벨은 접지 않습니다. za현재 블록에 대한 접기를 전환 하는 데 계속 사용할 수 있습니다 . 참고있는 것을 ^[0의이 ^[입니다 alt내 터미널. vim 스크립트에 대한 경험이 많지 않으니 함수에 대한 제안을 자유롭게 해주세요 :)

" Python folding
nnoremap ^[0 zR<CR>
nnoremap ^[1 :call Fold(0)<CR>
nnoremap ^[2 :call Fold(1)<CR>
function Fold(level)
    :let b:max = a:level + 1
    :set foldmethod=indent
    :execute 'set foldnestmax='.b:max
    :execute 'set foldlevel='.a:level
endfunction

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.