tools/vim

vim fold 기본 사용법 - fold 없는 vim은 팥 없는 찐빵?

seul chan 2020. 4. 28. 23:59

Vim fold

fold는 아주 강력한 기능이다(고 하지만 나도 일상적인 코드 작성시에 fold를 잘 활용하고 있지는 않다.)

주변에 vim 사용자가 별로 없기도 하지만, 실제로 vim을 사용하면서 fold를 잘 활용하는 경우를 많이 보지 못했다. fold 기능 자체가 별로 필요가 없어서 그랬을 수 있지만, 매우 강력한 vim의 fold 기능을 잘 활용하지 못하고 있는 듯 하여 앞으로 fold를 잘 활용해 보기 위해 이번 포스트 시리즈를 작성하게 되었다.

vim의 fold 기능과 해당 문서가 꽤 방대하기 때문에 위 글은 시리즈로 작성할 에정이다. 다음과 같은 방식으로 작성될 예정이다.

1. vim의 fold 기본 사용법 - fold 없는 vim은 팥 없는 찐빵
2. fold 활용하기
3. fold 저장/복구
4. 여러가지 방식의 fold - indent, mark, syntax, expression

위 내용은 :help usr_28를 참고하였다.

1. vim의 fold 기본 사용법 - fold 없는 vim은 팥 없는 찐빵

코드를 작성할 때 fold를 사용할 일이 많이 있을까? 대부분의 IDE (vscode, pycharm) 사용자들은 fold를 사용하지 않을 것이다. 파일이 길더라도 스크롤이 자유롭고 GoTo 기능 (Go to definition 등)이 아주 잘 되어있기 때문이 아닐까 추측해본다.

vim은 조금 다르다. (물론 수많은 플러그인이 있지만) 기본 vim에서는 스크롤이 되지 않고, 파일 안의, 파일간의 이동도 조금 다르다. buffer를 사용하여 작업하기 때문에 화면 변환이 잦고 무엇보다 코드를 한눈에 보기가 조금 까다롭다 (개인적인 의견이다)

그래서 fold가 아주 강력하게 지원되고, 많이 활용된다고 하는데 명령어는 알고 있지만 실제로 이를 활용해보지 않고 있는 이유는 무엇일까?

  1. fold 기능에 대해 명확하게 알지 못한다.
    이 포스트를 쓰기 전에는 :fold, zo, zc 정도만 알고 있었다. fold를 만들고 여닫는데는 큰 무리가 없지만 사실 그정도로는 유용성이 많이 떨어진다.

  2. 다른 에디터에서 fold 기능을 써 본 적이 없다.
    vscode, pycharm 등 다양한 에디터를 써 보았는데 다들 fold 기능을 제공하기는 하지만 스크롤이 편리한 에디터의 특성상 fold를 딱히 사용할 일이 없었다. 에디터의 자동완성 기능은 기본으로 잘 사용하니 vim에서도 자동완성 기능은 자주 사용하게 되었는데 fold는 반대로 딱히 써 보지 않았기 때문에 사용하지 않게 된 듯 하다.

그럼 fold를 사용하고 싶은 이유는 무엇일까?

  1. 긴 코드를 한눈에 보고 싶어서
  2. 코드간의 이동을 편리하게 하고 싶어서
  3. vim에서 강력하게 제공해 주는 기능을 잘 사용해보고 싶어서
    정도인듯 하다.

그럼 천리길도 한 걸음부터라고, 기본적인 fold 명령어부터 정리해보겠다.

fold를 사용하는 기본 명령어는 z이다. (상상력을 총 동원하면) z가 텍스트가 접힌 모양으로 보이지 않는가? 그렇게 보이지 않는다면 그렇게 보일때까지 잘 살펴보자. (| -> z) 그렇게 보인다면 이제 fold 명령어를 까먹을 일은 거의 없을것이다.

기본적으로 z 명령어는 operator로 동작한다. 그 이후에 text object 등과 함께 사용할 수 있다는 말이다.

zfap  "zf + ap (pharagrap selection)
zf10j "zf + 10j (아래까지 10줄 fold)

zf 명령어는 무엇일까? 기본적으로 z 명령어는 세가지가 있다. 만들기, 열기, 닫기

일단 fold를 한 번 만들어 놓으면 zo, zc로 여닫을 수 있다.

zf    "F-old 만들기 (만들면서 자동으로 닫는다)
zo    "O-pen fold (열기)
zc    "C-lose fold (닫기)

visual mode로 선택한 부분만 :fold로 접을 수 있다. zf와 동일한 역할을 한다.

또한 fold는 중첩(nested)으로 만들 수 있다.

여러 개의 fold를 만들면 각각의 fold를 찾아다니면서 zo를 눌러주는 게 불편할 수 있다.

이를 방지하기 위해서 다음 명령어들이 제공된다.

zr    "R-duce folding - 다음 폴드를 찾아서 열어준다.
zm    "fold M-ore - 다음 폴드를 찾아서 닫아준다.

이를 하나하나 하지 않고 모든 fold를 한 번에 여닫을 수 있다. (이 명령어는 꽤 유용하게 쓰인다)

zR    "R-duces folding - 모든 폴드를 열어준다.
zM    "fold M-ore and M-ore - 모든 폴드를 닫아준다.

현재 존재하는 모든 folding을 disable 할 수도 있다.

zn    "모든 folding을 disable (open)
zN    "zn을 사용하기 이전 단계로 변경
zi    "둘 사이를 toggle

위 명령어는 파일에 fold를 만들어 놓고, 해당 fold간에 돌아다니면서 작업을 할 때 유용하게 쓰인다. zi로 열어서 작업 후에 zi로 다시 닫으면 원래대로 돌아가기 때문. 실제로 파일을 열고 zi를 사용해보면 fold를 사용하려는 목적인 파일 훑어보기에 큰 도움이 된다.

이 정도의 명령어만 알아도 기본적으로 fold를 만들고 여닫는 것 뿐 아니라 부분/전체적인 fold를 컨트롤 할 수 있다. 다음 포스트에서는 이 fold를 더 본격적으로 활용할 수 있는 방법에 대해서 정리할 예정.