vim 28 - Folding

2 분 소요

vim 28 - Folding

  • Vim에서 indentation block을 folding기 위한 방법을 설정합니다.
  • 일단 저는 vim - fandom - wiki - Folding를 참고하여 다음으로 정의하였습니다.
"=============================================================
" 2022.08.24 - sng_hn.lee - Add Foldable
set foldenable
set foldlevelstart=10
set foldnestmax=10
nnoremap <space> za
set foldmethod=indent
"=============================================================

folding by indentation

  • set foldmethod=indent는 indent(들여쓰기) 레벨에 맞춰서 folding하도록 설정하는 것을 의미합니다.
    • manual: 사용자가 직접 입력해서 folding하는 방법을 의미합니다.
    • syntax: 일단은 사용하는 언어의 특성에 맞춰서 folding해주는 것으로 보이기는 하는데요, 몇 가지 설정을 추가해 줘야하는 것으로 보입니다.
    • indent: 들여쓰기에 기반해서 folding 하는 방법으로 보입니다.
  • 저는 일단 주 언어가 python이라서 indentation에 기반하여 folding하는 것으로 충분하여, 일단은 indent로 설정합니다.

toggle folding

  • 아래 외에도 몇 가지 더 기능이 있지만, 아래면 충분한 것 같아요.
    • za: 현재 커서가 속한 부분 folding on or off(toggle)
    • zM: 모두 fold
    • zR: 모두 unfold
  • nnoremapnoremap 모두 “no recursive mapping”을 의미합니다. 다만, nnoremap은 only normal mode에서만 작동하는 반면, noremap은 normal, visual mode 등 not insert mode에서 모두 동작하는 것으로 보입니다.
  • 따라서, 자주 사용하는 space key에 toggle key를 mapping해서 아래와 같이 정의해줍니다.
nnoremap <space> za

foldlevelstart

  • vim으로 file을 열었을 때, 어느 정도의 depth(level)까지 unfold되어 있어야 하는지를 설정해줍니다.
  • 만약 foldlevelstart를 3으로 설정한 다면, 해당 file 내에 level 3 까지만 보여지고 나머지는 접어져서 나오는 것으로 보입니다.
set foldlevelstart=10

foldnestmax

  • folding 할 때, nested 된 folding 중 최대 몇 개까지 표시할 것인지를 의미하는데요. 이렇게 쓰고 나니, 이해가 어려우시겠군요.
  • 가령 foldlevelstart이 10으로 설정되어 있고, 현재 커서가 nested 15 Level에 위치해 있다면, 이 때 toggle 키를 눌러서 folding할 경우 10 level 까지만 보여지고 나머지는 보여지지 않습니다.
set foldlevelstart=10

save folding

  • 다만, 현재 상태에서는 folding된 상태가 저장되지 않습니다. 가령, 파일 내에서 이미 다 folding을 한 다음, 파일을 나갔다가 다시 들어오면 모두 unfolding되어 있는 것을 확인할 수 있죠.
  • 따라서, 이를 저장해두려면 추가로 다음의 작업을 진행해 줘야 하는데요. 순서로 보면 다음과 같겠네요. 이런 방식이라면 만약 line수가 많은 경우에는 save and load 시에 속도가 상당히 지연되지 않을까? 하는 염려가 듭니다만, 그건 또 나중에 고민해보기로 합시다.
  1. folding한 다음 해당 file을 나갈 때, :mkview를 사용합니다(아마도 “make view”를 의미하는 것으로 보이네요).
  2. 해당 file을 연 다음 :loadview를 실행합니다. 이렇게 하면 이전에 folding하고 간 것이 적용됩니다.
  • ~/.vim/view/ 경로에 가면 해당 file에 대한 view가 생성되어 있는 것을 확인할 수 있습니다. file을 열어 보면 일련의 vim script가 작성되어 있는 것을 알 수 있는데요. view라는 것은 특별한 어떤 상태가 아니라, view까지 가기 위한 일련의 command를 모두 저장해둔 것으로 보입니다. 즉, loadview를 하면 해당 vim script 들이 모두 실행되는 것으로 보이네요.
  • 다만, 매번 mkview, loadview를 타이핑하는 것은 매우 성가신 일이기 때문에, .vimrc file 내에 아래 내용을 작성하여 매번 python file의 경우는 folding이 저장되도록 설정해 봅니다. 일단은 일단은 python file에 대해서만 적용하고 추후에는 다른 file에 대해서도 적용할 예정입니다.
autocmd BufWinLeave *.py mkview
autocmd BufWinEnter *.py silent loadview
  • 가끔 folding method 가 먹히지 않을 때가 있습니다. stackoverflow - macvim can not fold code e490 no fold found를 참고해 보니, 이는 이처럼 view 를 저장하는 경우에 발생하는 것으로 파악됩니다. 이를 해결하려면, ~/.vim/view/ 내에 file을 삭제해주면 해결됩니다.

Wrap-up

  • vim으로 긴 코드를 작성할 때, 위아래 이동한다고 꽤 긴 시간이 소요되었는데요, folding toggle을 사용해서 편하게 코드를 스캔할 수 있을 것 같네요.

Reference

댓글남기기