tools/vim

Learn Vimscript The Hard Way - 48. Basic Folding

seul chan 2020. 4. 29. 22:41

Basic Folding

만약 당신이 vim에서 folding을 한 번도 사용하지 않았다면, 당신은 무엇을 놓치는지 모를 것이다. :help usr_28을 읽고 일상적인 작업에서 이를 적용시키면서 시간을 보내보아라. 그것이 손에 조금 익었을 때 다시 해당 챕터로 돌아와라.

Types of Folding

vim은 6가지 다른 fold 방식을 제공한다.

Manual

직접 손으로 fold를 생성하면 RAM에 저장된다. vim을 닫으면 fold들은 모두 사라지고 다시 만드어야 한다.

이 방식은 몇몇 custom mapping을 만들어 fold를 만들 때 쉽게 사용 가능하다. 이 책에서는 다루지 않지만, 쉽게 사용이 필요할 때 이런 방식을 사용할 수 있다는 점을 생각해 두면 좋다.

Marker

vim은 실제 텍스트의 캐릭터들에 기반하여 fold를 지원한다.

보통은 이 캐릭터들은 //, {{{와 같은 코멘트이지만 자바스크립트 파일의 {}처럼 syntax를 따로 추가할 수 있다.

순전히 방식으로만 fold된 코드를 열어보면 상당히 지저분해 보일 수 있지만, 위 방식의 장점은 특정 파일에 대해 수작업으로 fold를 추가할 수 있게 해 준다는 것이다.

뿐만 아니라 특정한 방식으로 큰 파일을 organize 할 때에도 유용하게 쓸 수 있다.

Diff

diff'ing 파일에서 쓰이는 특별한 fold 방식이다. 이는 vim이 자동으로 다루는 것이기 때문에 여기서는 다루지 않을것이다.

Expr

custom Vimscript를 통해서 어디에서 fold가 발생할지에 대해서 직접 정의할 수 있다. 가장 강력한 방식이지만, 또한 가장 많은 작업을 필요로 한다. 이를 다음 장에서 다룰 것이다.

Indent

code의 indentation을 기반으로 fold를 결정하는 방식이다. 같은 indent에 있는 줄은 함께 fold되고, 빈줄이나 whitespace만 있는 줄도 같이 묶여서 fold 된다.

code가 이미 indented 되어 있기 때문에 자유롭게 사용할 수 있다. 이를 켜기만 해주면 된다. 이 방식이 Potion 파일에서 가장 먼저 적용해 볼 fold 방식이다.

Potion Folding

우리가 만들었언 Potion 파일을 다시 살펴보자.

factorial = (n):
    total = 1
    n to 1 (i):
        total *= i.
    total.

10 times (i):
    i string print
    '! is: ' print
    factorial (i) string print
    "\n" print.

함수와 루프문의 내용은 둘 다 indent 되어있다. 이 말은 아주 적은 노력으로 indent folding을 사용하여 기본적인 fold를 사용할 수 있다는 말이다.

시작하기 전에, total *= i. 줄 위에 주석을 한 줄 추가해주자. 이것이 왜 필요했는지는 exercises를 풀 때 알게 될 것이다. 그럼 파일은 다음과 같이 보일 것이다.

factorial = (n):
    total = 1
    n to 1 (i):
        # Multiply the running total.
        total *= i.
    total.

10 times (i):
    i string print
    '! is: ' print
    factorial (i) string print
    "\n" print.

Potion 플러그인 레파지토리에 ftplugin 디렉토리를 추가하고, potion 폴더를 만들어주자. 그리고 folding.vim 파일을 만들어주자.

그럼 아래와 같은 경로가 될 것이다. (개인의 플러그인 레파지토리에 따라 조금 다를 수 있다.)

~/Users/username/.vim/plugged/potion/ftplugin/potion/folding.vim

folding과 관련된 코드를 각각의 파일에 넣는 것은 보통은 좋은 방식이고 플러그인의 다양한 기능을 정렬된 상태로 유지하는 데 도움이 된다.

다음 라인을 추가해보자.

setlocal foldmethod=indent

factorial.pn을 다시 열어보자. zR, zM, za 등을 사용하여 새로 생긴 fold를 한번 사용해보라.

한줄의 vimscript가 편리한 fold 기능을 제공해줬다. 꽤 cool하다!

vim은 기본으로 indent folding을 사용할 때 # 를 무시하는 것으로 밝혀졌다. 이는 C언어의 파일(#이 preprocessor 지시자로 쓰이는)의 경우에는 좋겠지만 다른 언어의 파일을 수정할 때에는 별 도움이 되지 않을 것이다.

ftplugin/potion/folding.vim을 다음과 같이 수정해보자.

setlocal foldmethod=indent
setlocal foldignore=

factorial.pn을 다시 열어보면 안의 comment block또한 의도했던 대로 fold 된 것을 볼 수 있다.

Exercises

  • Read :help foldmethod.

  • Read :help fold-manual.

  • Read :help fold-marker and :help foldmarker.

  • Read :help fold-indent.

  • Read :help fdl and :help foldlevelstart.

  • Read :help foldminlines.

  • Read :help foldignore.