*usr_28.txt* Vim version 7.4 대상. 새로 고침: 2008년 6월 14일 VIM 사용설명서 - Bram Moolenaar 저 정지용 역 접기 형식이 잘 갖춰진 문서는 여러 절(section)로 나뉠 수 있습니다. 또 하나의 절은 더 작은 소 항목들로 나뉩니다. 접기(folding)는 하나의 절을 한 줄로 보여주어, 문서 전체를 쉽게 개괄할 수 있도록 도와줍니다. 이번 장에서는 문서를 접는 여러 방법들을 살펴보겠습니다. |28.1| 접기(folding)란? |28.2| 직접 접기 |28.3| 폴드 다루기 |28.4| 폴드 저장하고 불러오기 |28.5| 들여쓰기에 따라 접기 |28.6| 표식에 따라 접기 |28.7| 문법에 따라 접기 |28.8| 표현식에 따라 접기 |28.9| 바뀌지 않은 부분을 접기 |28.10| 접는 방법 선택하기 다음 장: |usr_29| 프로그램 코드 탐험하기 이전 장: |usr_27| 찾기 명령과 패턴 차례: |usr_toc|
*28.1* 접기(folding)란? 접기는 버퍼 중의 몇 줄을 화면에는 한 줄로 표시하는 기능입니다. 아래 그림과 같이 종이를 접어서 중간의 내용을 건너뛰고 볼 수 있도록 말입니다. +------------------------+ |줄 1
| |줄 2
| |줄 3
| |_______________________
| \ \ \________________________\ / 접힌 줄들 / /________________________/ |줄 12
| |줄 13
| |줄 14
| +------------------------+ 문서 내용은 바뀌지 않고 그대로 버퍼에 남아있습니다. 접은 효과로 화면에 표시되는 모습만 바뀔 뿐입니다. 접기를 잘 활용하면 문서 전체의 구조를 더 쉽고 빠르게 살펴볼 수 있습니다. 여러 줄로 된 문서의 특정 부분을 화면에 모두 표시하는 대신, 여기에 그 부분이 있다고 한 줄로 줄여서 표시할 수 있으니까요.
*28.2* 직접 접기 한번 해봅시다: 커서를 문단 하나로 옮기고 다음 명령을 입력해 봅시다:
zfap
문단 전체가 강조된 하나의 줄로 바뀌었을 겁니다. 문서를 접어서 폴드(fold)를 하나 만든 것이지요. |
zf
|는 오퍼레이터이고, |ap
|는 텍스트 오브젝트를 선택하는 명령입니다. |zf
| 오퍼레이터와 이동 명령어를 섞어서 쓰면, 커서가 움직이는 영역이 접히면서 폴드가 만들어집니다. |zf
|는 시각 모드에서도 사용할 수 있습니다. 접힌 부분의 내용을 다시 보려면, 폴드를 다음 명령으로 열면 됩니다:
zo
열린 폴드는 다음 명령으로 다시 닫을 수 있습니다:
zc
모든 접기 관련 명령어는 "z"로 시작합니다. 상상력을 조금 발휘해서 보면, "z"는 접힌 종이를 옆에서 본 모양이기도 합니다. "z" 뒤에 오는 문자는 명령은 기억하기 쉽도록 각 동작을 나타내는 영어 단어에서 따왔습니다: zf 폴드(Fold) 생성 zo 폴드 열기(Open) zc 폴드 닫기(Close) 폴드 안에 폴드를 만들 수 있습니다. 폴드가 있는 문서 영역을 다시 접어서 중첩된 폴드를 만들 수 있습니다. 예를 들어, 이번 절 안의 각 문단을 각각 접어 폴드를 만들고, 이번 장 안의 모든 절을 또 각각 접어 폴드를 만들 수 있습니다. 한번 해보세요. 장 전체 폴드를 닫았다가 열어도 안에 들어있는 폴드들의 상태는 그대로 유지됩니다. 열려있던 것은 계속 열려있고, 닫혀있던 것은 그대로 닫혀있습니다. 폴드를 여러 개 만들었는데, 모두 펼쳐서 문서 전체를 보고 싶다고 합시다. 폴드가 있는 곳마다 이동하면서 "zo" 명령을 사용해도 됩니다만, 다음 명령을 쓰면 더 빠르게 할 수 있습니다:
zr
위 명령은 접힌 정도를 줄입니다(Reduce). 반대로 하는 명령도 있습니다:
zm
이 명령은 더 많이(More) 접습니다. "zr"이나 "zm"을 반복해서 여러 번 접힌 부분을 차례대로 열거나 닫을 수 있습니다. 몇 단계에 걸쳐서 접어놓았다면, 다음 명령으로 한 번에 모두 풀 수 있습니다:
zR
위 명령은 접힌 정도를 줄이는데(Reduce), 더 이상 접힌 것이 없을 때까지 모두 엽니다. 반대로 모든 폴드를 닫으려면:
zM
위 명령은 더 많이(More) 많이(More) 접어서 모든 폴드를 닫습니다. |
zn
| 명령을 쓰면 접기 기능을 순간적으로 없앨 수 있습니다. |zN
| 명령을 쓰면 다시 폴드들이 돌아옵니다. |zi
| 명령은 접기 기능이 꺼져있으면 켜고, 켜져 있으면 끕니다. 다음과 같이 쓰면 편리하겠지요: - 전체 파일을 살펴보기 위해 폴드를 여기저기 만듭니다 - 작업을 할 곳으로 이동합니다. - |zi
|로 폴드를 없애고 문서 작업을 합니다 - |zi
|로 폴드를 다시 되살리고 여기저기를 돌아다닙니다 직접 접기 기능을 더 자세히 살펴보려면: |fold-manual
|
*28.3* 폴드 다루기 폴드가 닫혀있을 때는 마치 하나의 빈 줄인 것처럼 "j"나 "k"같은 이동 명령으로 그 위를 돌아다닐 수 있습니다. 그래서 접힌 문서 위를 돌아다니며 전체 문서를 빠르게 살펴볼 수 있습니다. 폴드는 마치 하나의 줄인 것처럼 복사해 두거나, 지우고 붙여넣기 할 수 있습니다. 프로그램에서 함수들의 순서를 바꿀 때 매우 유용합니다. 먼저 적절한 'foldmethod'(접기방법)를 선택하여 각 폴드에 함수 전체(혹은 거의 전체)가 들어있는지 확인합시다. "dd"로 함수를 지우고, 커서를 옮긴 다음 "p"로 붙여넣기 합니다. 만약 폴드 앞이나 뒤에 함수 내용이 몇 줄 더 있다면, 다음과 같이 시각 모드의 선택방법을 사용해도 됩니다: - 이동시킬 부분의 첫 줄로 커서를 옮깁니다 - "V"를 눌러 시각 모드로 들어갑니다 - 이동시킬 부분의 마지막 줄로 커서를 옮깁니다 - "d"를 눌러 선택한 부분을 잘라냅니다 - 커서를 넣을 위치로 옮긴 다음, "p"로 잘라낸 내용을 넣습니다(Put). 가끔은 폴드의 위치가 어디인지 안보이거나 기억하기 어려울 수도 있습니다. 엉뚱한 곳에서 |zo
|를 누르면서 헤맬 수도 있겠지요. 폴드가 어디에 있는지 보려면:
:set foldcolumn=4
'foldcolumn'(폴드열)을 설정하면, 창의 왼쪽에 세로로 조그만 공간이 생기고, 폴드들이 표시됩니다. "+"는 닫힌 폴드를 나타냅니다. 열린 폴드의 시작 줄에는 "-"가 표시되고, 나머지 부분에는 "|"가 표시됩니다. 마우스로 폴드열의 "+"를 클릭하면 닫힌 폴드를 열 수 있습니다. "-"나 그 밑의 "|"를 클릭하면 열린 폴드가 닫힙니다. 현재 커서 위치의 모든 폴드를 열려면 |
zO
|. 현재 커서 위치의 모든 폴드를 닫으려면 |zC
|. 현재 커서 위치의 폴드를 하나 없애려면 |zd
|. 현재 커서 위치의 모든 폴드를 없애려면 |zD
|. 입력 모드에서, 현재 커서 위치의 폴드는 절대 닫히지 않습니다. 따라서 언제나 입력하는 내용이 화면에 보입니다. 여기저기를 돌아다니거나 커서를 좌우로 움직이면 폴드가 자동으로 열립니다. 예를 들어, "0" 명령은 커서 위치의 폴드를 엽니다('foldopen'(폴드열기)에 "hor"(수평)이 들어있는 경우에 한합니다만, 기본 설정인 경우 들어있습니다). 'foldopen' 옵션을 바꿔서 어떤 명령을 썼을 때 폴드가 열릴지 지정할 수 있습니다. 커서가 위치한 곳의 폴드가 언제나 열려있도록 하려면, 다음 명령을 사용하십시오::set foldopen=all
주의: 위와 같이 설정하면 닫힌 폴드 위로 움직일 수가 없게 됩니다. 이 옵션을 쓰다가 다시 기본 설정으로 돌아가려면 다음 명령을 사용하십시오:
:set foldopen&
커서가 폴드 밖으로 나가면 자동으로 폴드가 닫히도록 할 수 있습니다:
:set foldclose=all
'foldclose'(폴드닫기)를 all로 설정하면, 커서가 벗어난 폴드들에 'foldlevel'(폴드단계)가 적용됩니다. 어떻게 동작하는 지는 한번 써봐야 감이 오실 것입니다. 더 많이 접으려면 |
zm
|을, 더 많이 펼치려면 |zr
|을 사용하십시오(r은 접힌 정도를 줄인다(reduce)는 데서 따온 것입니다). 폴드는 현재 창에만 적용됩니다. 따라서 같은 버퍼를 두 창에 열어놓고, 한 창은 폴드를 쓰고 다른 창은 폴드를 쓰지 않은 채로 사용할 수 있습니다. 또는 한 창은 모든 폴드를 닫아놓고, 다른 창은 폴드를 모두 열어놓을 수도 있습니다.
*28.4* 폴드 저장하고 불러오기 편집 중이던 파일을 닫고 다른 파일을 편집하면, 현재의 폴드 정보가 모두 사라집니다. 같은 파일로 다시 돌아오면, 폴드는 전에 열려있었든 닫혀있었든 모두 기본 상태로 돌아갑니다. 만약 폴드가 직접 만든 것이라면, 모든 폴드가 사라집니다! 폴드를 저장하려면 |:mkview
| 명령을 사용하십시오:
:mkview
위 명령은 설정들을 비롯하여 현재 뷰(view)에 영향을 주는 정보들을 파일에 저장합니다. 무엇이 저장되는지는 'viewoptions'(뷰설정)을 설정하여 바꿀 수 있습니다. 같은 파일을 다시 편집할 때, 다음 명령으로 저장한 뷰를 불러올(load) 수 있습니다:
:loadview
파일 하나 당 뷰는 10개까지 저장할 수 있습니다. 예를 들어, 현재 상태를 세 번째 뷰로 저장하고, 두 번째 뷰를 불러오려면:
:mkview 3
:loadview 2
줄을 새로 넣거나 지우면 뷰의 정보가 어긋날 수도 있습니다. 뷰를 저장할 위치를 지정하는 'viewdir'(뷰디렉터리) 옵션도 참고하십시오. 가끔은 예전에 저장한 뷰를 지우고 싶을 수도 있으니까요.
*28.5* 들여쓰기에 따라 접기 |zf
|로 문서의 필요한 부분을 일일이 접으려면 시간이 많이 걸립니다. 만약 문서가 더 자세한 내용이 더 많이 들여쓰기가 되는 구조로 되어있다면, 들여쓰기(indent)에 따라 접을 수 있습니다. 들여쓰기에 따라 접으면 같은 양만큼 들여쓰기가 된 줄들이 묶여서 하나의 폴드가 됩니다. 더 많이 들여쓰기 된 부분은 폴드 안의 폴드가 됩니다. 많은 프로그래밍 언어에서 적합한 접기 방법입니다. 'foldmethod'(접기방법) 옵션을 바꾸어 이 기능을 써봅시다:
:set foldmethod=indent
더 많이 접거나 펼치려면 |
zm
|, |zr
| 명령을 사용하십시오. 다음 예문을 보면 이해하기 쉬울 것입니다: 들여쓰기가 안함 한 칸 들여쓰기 함 두 칸 들여쓰기 함 두 칸 들여쓰기 함 한 칸 들여쓰기 함 들여쓰기가 안함 한 칸 들여쓰기 함 한 칸 들여쓰기 함 들여쓰기 정도에 따라 접히는 정도가 결정됩니다. 이 정도는 'shiftwidth'(들여쓰기폭) 옵션에 따라 결정됩니다. 매 'shiftwidth' 만큼 들여쓰기 할 때마다, 한 번씩 더 접힙니다. 여러 번 접혀서 폴드가 겹쳐진 정도를 폴드 단계(fold level)라고 부릅니다. |zr
|이나 |zm
| 명령을 사용하는 것은 사실 'foldlevel' 옵션의 값을 키우거나 줄이는 것입니다. 다음과 같이 바로 설정할 수도 있습니다:
:set foldlevel=3
위 명령은 'shiftwidth'의 세 배 이상 들여쓰기 한 부분의 폴드를 모두 닫습니다. 폴드 단계가 낮을수록 더 많은 폴드가 닫힙니다. 'foldlevel'이 0이면, 모든 폴드가 닫힙니다. |
zM
|이 'foldlevel'을 0으로 만드는 명령입니다. 반대로 |zR
|은 'foldlevel'을 현재 파일의 가장 깊은 폴드 단계에 맞추어 줍니다. 따라서, 다음 두 가지 방법으로 폴드를 열고 닫으면 됩니다: (A) 폴드 단계를 설정해서. 빠르게 "줌 아웃"해서 전체 내용의 구조를 살펴본 후, 커서를 움직여 다시 특정 부분에 "줌 인" 할 수 있습니다. (B) |zo
|와 |zc
| 명령으로 각각의 폴드를 열거나 닫아서. 다른 폴드들은 닫아놓은 채, 원하는 폴드들만 열어서 볼 수 있습니다. 물론 섞어서 쓸 수도 있습니다: |zm
|을 몇 번 해서 폴드를 쭉 닫은 후, 원하는 폴드만 |zo
|로 열어서 보면 됩니다. 아니면 |zR
|로 모든 폴드를 연 다음, 필요 없는 부분만 |zc
|로 닫아도 됩니다. 하지만, 'foldmethod'가 "indent"(들여쓰기)일 때는 직접 폴드를 만들 수 없습니다. 직접 폴드를 만든다면, 들여쓰기 정도와 폴드 단계와의 상관관계가 깨지기 때문입니다. 들여쓰기에 따라 접는 방법에 대하여 더 알고 싶다면: |fold-indent
|
*28.6* 표식에 따라 접기 문서 내에 특별한 표식(Marker)을 넣어서, 접을 부분의 시작과 끝을 표시할 수 있습니다. 어느 부분을 접을 것인지 정확하게 제어할 수 있다는 장점이 있지만, 문서의 내용 자체가 바뀌어야한다는 단점이 있습니다. 한번 써 봅시다:
:set foldmethod=marker
다음 C 프로그램의 일부를 살펴봅시다: /* foobar () {{{ */ int foobar() { /* 답을 반환 {{{ */ return 42; /* }}} */ } /* }}} */ 접힌 부분은 표식 앞의 내용을 보여줍니다. 폴드의 내용을 보여줄 수 있는 유용한 기능이지요. 문서 내용을 이리 저리 옮기다가 표식 짝이 틀어져서 문서가 엉뚱하게 접히면 짜증이 좀 나겠지요. 이 문제는 표식에 숫자를 덧붙여서 해결할 수 있습니다. 예: /* 전역 변수 {{{1 */ int varA, varB; /* 함수 {{{1 */ /* funcA() {{{2 */ void funcA()
{}
/* funcB() {{{2 */ void funcB(){}
/* }}}1 */ 번호가 매겨진 각 표식에서 해당 단계의 폴드가 시작됩니다. 만약 더 높은 단계의 폴드가 있다면 그 위치에서 폴드가 끝납니다. 따라서 번호가 매겨져있다면 시작 표식들만으로 폴드를 다 지정할 수도 있습니다. 다른 폴드가 시작되기 전에 폴드의 끝을 지정하고 싶다면 끝 표식을 추가하십시오. 상세 설명서의 표식을 이용한 접기 관련 내용은: |fold-marker
|
*28.7* 문법에 따라 접기
Vim은 각 언어별로 각각 문법 파일을 제공하고 있습니다. 문법 파일을 사용하면
파일의 다양한 요소를 색색으로 구분하여 볼 수 있습니다. 만약 컬러가 지원되는
터미널에서 이 도움말을 보고 있다면, 지금 보이는 색들은 "help" 문법 파일에 의해
지정된 것입니다.
문법 파일에는 "fold"(폴드) 인자를 갖는 문법 항목을 넣을 수 있습니다. 이
항목은 폴드 영역을 지정합니다. 이 방법을 사용하려면 문법 파일을 쓰고, 필요한
항목을 추가할 수 있어야하는데, 사실 쉽지는 않습니다. 하지만, 한번만 설정을
해놓으면, 자동으로 문서가 접힙니다.
이 문서에서는 사용자가 Vim과 함께 제공되는 문법 파일을 사용한다고
가정하므로, 더 자세한 내용은 생략하도록 하겠습니다. 위에 설명한 방법들로
폴드를 열거나 닫을 수 있습니다. 파일을 수정하면 자동으로 폴드가 생기거나
사라집니다.
문법에 따라 접기에 관한 더 자세한 내용은: |fold-syntax
|
*28.8* 표현식에 따라 접기 이 기능은 들여쓰기에 따라 접기와 비슷합니다만, 들여쓰기 대신 사용자 함수를 실행시켜서 줄의 폴드 단계를 결정합니다. 문서 내에 어디부터 어디까지가 같은 부분인지 나타내는 표시가 있다면, 이 기능을 사용할 수 있습니다. 예를 들어, 이메일을 보면, 줄 앞의 ">"로 이전 메일의 내용이 구분됩니다. 이 표시에 따라 접으려면, 다음 명령을 사용하십시오:
:set foldmethod=expr
:set foldexpr=strlen(substitute(substitute(getline(v:lnum),'\\s','',\"g\"),'[^>].*','',''))
다음 내용으로 확인해보십시오: > 그에게서 받은 이전 메일 내용 > 그에게서 받은 이전 메일 내용 > > 내가 쓴 그 전전 메일 내용 > > 내가 쓴 그 전전 메일 내용 위 예에서 본 'foldexpr'(폴드표현식)에 대한 설명 (안에서 바깥 순): getline(v:lnum) 현재 줄의 내용을 얻음 substitute(...,'\\s','','g') 공백을 모두 삭제 substitute(...,'[^>].*','','') 맨 앞의 '>' 뒤 내용을 모두 삭제 strlen(...) 남은 내용의 길이를 셈. 여기서는 '>'만 남아있으므로 '>'의 수가 된다 ":set" 명령을 쓸 때는 공백이나 따옴표, 백슬래시 앞에 백슬래시를 써야한다는 데 주의하십시오. 실제 어떤 내용이 들어갔는지는 다음 명령으로 확인할 수 있습니다:
:set foldexpr
복잡한 표현식을 쓸 때는, 명령줄 자동 완성을 활용하십시오:
:set foldexpr=
<Tab>
여기서
<Tab>
은 진짜 탭 키입니다. 기존에 설정되어 있는 값이 자동으로 채워집니다. 이제 필요한 부분만 적절히 고치면 되겠지요. 만약 표현식이 너무나 복잡하다면, 정리해서 함수로 만들고, 'foldexpr'에서는 이 함수만 불러서 처리하는 것이 좋습니다. 상세 설명서에서 표현식에 관한 내용을 보려면: |fold-expr
|
*28.9* 바뀌지 않은 부분을 접기 이 기능은 같은 창에서 'diff' 설정을 켰을 때 유용합니다. |vimdiff
| 프로그램이 하는 것처럼 말이지요. 예:
:setlocal diff foldmethod=diff scrollbind nowrap foldlevel=1
한 파일의 여러 버전을 여러 창에서 비교해서 볼 때 위 명령을 모든 창에서 실행시키십시오. 각 창의 동일한 부분은 접혀서 사라지고, 차이가 있는 부분만 알기 쉽게 표시됩니다. 더 자세한 내용은 |
fold-diff
|를 참고하십시오.
*28.10* 접는 방법 선택하기
너무 다양한 방법이 있어서 접는 방법을 고르기 어려우시다고요? 아쉽지만,
완벽한 방법은 없고, 각 상황에 맞게 골라서 써야 합니다. 다만 몇 가지 조언을
해드리지요.
현재 편집하는 언어의 문법 파일에 접기에 관한 설정이 되어있다면, 문법에 따라
접는 것이 대개 제일 좋습니다. 만약 없다면, 직접 하나 만들어 봐도 되겠지요.
찾기 패턴에 관한 지식이 필요합니다. 쉽지는 않지만, 한번 잘 동작하게
만들어놓으면 일일이 폴드를 만드는 수고를 덜 수 있겠지요.
문서가 일정한 형식이나 틀이 없이 쓴 것이라면, 직접 폴드를 만드는 수밖에
없습니다. 이때는 |:mkview
|를 이용하여 폴드를 저장하거나 불러오십시오.
표식을 사용하려면 파일을 수정해야 합니다. 다른 사람들과 함께 작업하거나,
회사의 공통 편집 규칙을 지키려면 사용할 수 없을 수도 있겠지요.
표식을 사용할 때의 장점은 정확하게 원하는 위치를 접을 수 있다는 것입니다.
문서의 내용을 이리 저리 옮길 때 몇 줄을 빼먹는다든지 하는 실수를 줄일 수
있겠지요. 폴드의 내용에 관한 설명을 간략하게 적을 수도 있습니다.
들여쓰기에 따라 접기는 많은 파일 형식에서 쓸 수는 있지만, 언제나 깔끔하게 잘
되지는 않습니다. 다른 방법을 사용할 수 없을 때에 한하여 사용하십시오.
하지만 전체 문서의 윤곽을 잡을 때는 매우 유용합니다. 각 들여쓰기 단계에
맞추어 'shiftwidth'를 설정하십시오.
표현식에 따라 접기는 거의 대부분의 형식이 있는 문서에 사용할 수 있습니다.
지정하기도 그렇게 어렵지 않습니다. 특히 폴드의 시작과 끝을 쉽게 구분할 수
있을 땐 말이지요.
표현식에 따라 접었는데, 실제로 원했던 결과와 조금 차이가 있을 때는 직접
접기로 바꾸면 됩니다. 이때는 이미 정의된 폴드들이 사라지지 않습니다. 따라서
원하는 대로 더 접거나 펼치면 됩니다.
다음 장: |usr_29| 프로그램 코드 탐험하기 저작권: |manual-copyright| 참고 vim:tw=78:ts=8:ft=help:norl:
Generated by vim2html on 2013. 12. 14. (토) 20:47:01 KST