*usr_30.txt* Vim version 7.4 대상. 새로 고침: 2007년 11월 10일 VIM 사용설명서 - Bram Moolenaar 저 정지용 역 프로그램 편집하기 Vim에는 컴퓨터 프로그램 작성에 유용한 명령이 많이 있습니다. 프로그램을 컴파일하고 에러가 난 곳으로 바로 이동해 보세요. 다양한 언어의 들여쓰기를 자동으로 설정하고, 주석을 다듬어 보세요. |30.1| 컴파일 |30.2| C 스타일 파일 들여쓰기 |30.3| 자동 들여쓰기 |30.4| 다른 들여쓰기 방법 |30.5| 탭과 공백 |30.6| 주석 다듬기 다음 장: |usr_31| GUI 활용하기 이전 장: |usr_29| 프로그램 코드 탐험하기 차례: |usr_toc|
*30.1* 컴파일 Vim에는 "퀵픽스(quickfix)"란 기능이 있습니다. 퀵픽스를 사용하면 Vim 안에서 프로그램을 컴파일하고, 에러가 발생한 곳으로 이동하여 (가능하다면) 바로 고칠 수 있습니다. 에러를 수정한 후 다시 컴파일하고, 새로 발견된 에러를 수정하는 작업을 모든 에러를 없앨 때까지 반복하게 됩니다. 다음 명령은 "make" 프로그램을 (지정한 인자들을 그대로 넘겨서) 실행시키고, 그 결과를 얻어옵니다:
:make
{인자}
만약 에러가 발생했다면, Vim이 에러 내용을 읽은 후, 첫 에러가 발생한 곳으로 알아서 이동합니다. ":make"를 사용하는 예를 한번 살펴보도록 합시다. (이 예에서는 쉬운 설명을 위해 단순한 에러를 예로 들고 있습니다만, 일반적으로 :make를 처음 하는 경우라면 이것 보다 더 복잡한 에러가 많이 발생하겠지요.) ":make" 명령을 사용하면 대략 다음과 같은 내용을 볼 수 있습니다:
:!make | &tee /tmp/vim215953.err
gcc -g -Wall -o prog main.c sub.c
main.c: In function 'main':
main.c:6: too many arguments to function 'do_sub'
main.c: At top level:
main.c:10: parse error before '}'
make: *** [prog] Error 1
2 returned
"main.c" 11L, 111C
(3 of 6): too many arguments to function 'do_sub'
계속하려면 엔터 혹은 명령을 입력하십시오
위 내용으로 미루어보아 "main.c" 파일에 에러가 있다는 것을 알 수 있습니다.<Enter>
를 누르면, Vim은 "main.c"를 열고, 첫 에러가 발생한 6번째 줄로 커서를 옮깁니다. 파일이나 줄 번호를 직접 입력할 필요 없이, Vim이 에러 메시지를 알아서 해석한 후 어디로 가야할지 알아내는 것입니다. +---------------------------------------------------+ |int main()
| |{
| |int i=3;
| 커서 -> |do_sub("foo");
| |++i;
| |return (0);
| |}
| |}
| |~
| |(3 of 12): too many arguments to function 'do_sub'
| +---------------------------------------------------+ 다음 명령을 입력하면 다음 에러가 발생한 곳으로 갑니다:
:cnext
파일의 마지막 줄인 10번째 줄로 이동했습니다. '}'가 필요 없이 하나 더 있어서 에러가 발생했네요. 메시지를 전부 표시할 공간이 없으면, 에러 메시지를 짧게 줄여서 표시합니다. 전체 메시지를 보려면:
:cc
":clist" 명령을 사용하면 전체 에러 메시지를 확인할 수 있습니다. 다음과 같이 화면에 표시됩니다:
:clist
3 main.c: 6:too many arguments to function 'do_sub'
5 main.c: 10:parse error before '}'
여기에는 make가 출력한 내용 중 Vim이 파일명과 줄 번호를 인식한 부분만 나옵니다. 이 부분들만이 의미 있는 내용이고, 나머지는 그다지 중요하지 않은 메시지로 간주하는 것이지요. 하지만, 가끔은 표시되지 않은 내용을 봐야하는 경우도 있습니다. 예를 들어, 정의되지 않은 함수에 대한 링커의 에러 내용에는 파일명이나 줄 번호가 없지요. 모든 메시지를 보려면, 명령에 "!"를 붙이면 됩니다::clist!
1 gcc -g -Wall -o prog main.c sub.c
2 main.c: In function 'main':
3 main.c:6: too many arguments to function 'do_sub'
4 main.c: At top level:
5 main.c:10: parse error before '}'
6 make: *** [prog] Error 1
Vim은 현재 보고 있는 에러를 강조해 줍니다. 이전의 에러로 돌아가려면::cprevious
에러 목록을 이동하는 다른 이동 명령들은 다음과 같습니다: :cfirst 첫 번째 에러로 :clast 마지막 에러로 :cc 3 3번 에러로 다른 컴파일러 사용하기 ---------------------- ":make" 명령을 사용했을 때 사용되는 프로그램의 이름은 'makeprg'(메이크프로그램) 옵션으로 지정합니다. 보통은 "make"로 설정 되어있습니다만, Visual C++ 사용자라면 다음 명령을 사용해서 "nmake"로 바꿔야하겠지요:
:set makeprg=nmake
이 옵션에 인자를 미리 넣어놓을 수도 있습니다. 특수 문자는 백슬래시를 사용하여 입력해야 합니다. 예:
:set makeprg=nmake\ -f\ project.mak
명령에 Vim의 특수 키워드를 포함시킬 수도 있습니다. % 문자는 현재 파일의 이름을 의미합니다. 따라서 다음 명령을 실행시키면:
:set makeprg=make\ %
main.c를 편집할 때는, ":make"가 다음 명령을 실행시킵니다:
make main.c
이것만으로는 그다지 유용해 보이지 않습니다. 그렇다면 명령을 조금 바꾸고 :r(루트, root) 수식 명령어(modifier)를 사용해봅시다:
:set makeprg=make\ %:r.o
이제 실행되는 명령은 다음과 같아집니다:
make main.o
수식 명령어에 대해서는 |
filename-modifiers
|를 참고하십시오. 이전 에러 목록 -------------- ":make"로 프로그램을 만들었다고 합시다. 하나의 파일에서는 경고(warning) 메시지가 나왔고, 다른 파일에서 에러(error) 메시지가 나왔다고 합시다. 에러를 메시지가 나는 파일을 고쳐서 제대로 고쳐졌는지 ":make"로 확인을 했습니다. 자, 이제 경고 메시지가 나오는 파일을 고쳐보고 싶은데, 다시 ":make"를 해버려서 경고 메시지는 이미 에러 목록에서 사라져버렸습니다. 경고 메시지가 나온 파일은 다시 컴파일 되지 않았기 때문이지요. 이런 경우, 다음 명령으로 이전의 에러 목록을 불러올 수 있습니다:
:colder
그리고 ":clist"와 ":cc
{번호}
"를 사용해 경고 메시지가 나온 곳으로 움직이면 됩니다. 다음 에러 목록으로 넘어가려면:
:cnewer
Vim에는 에러 목록이 10개까지 저장됩니다. 컴파일러 바꾸기 --------------- 다른 컴파일러를 사용하려면, 컴파일러가 내보내는 에러 메시지의 형식을 Vim에게 알려줘야 합니다. 'errorformat'(에러형식) 옵션에 지정하면 됩니다. 에러 형식 설정은 문법이 조금 복잡합니다만, 덕분에 거의 모든 컴파일러를 지원할 수 있습니다. 자세한 설명은 |
errorformat
| 을 참고하십시오. 여러 컴파일러를 다양하게 사용해야 할 수도 있습니다. 그럴 때 마다 'makeprg', 그리고 특히 'errorformat'을 설정하는 것은 번거롭겠지요. 쉬운 방법이 있습니다. 예를 들어, 마이크로소프트의 비주얼 C++ 컴파일러로 바꾸려면:
:compiler msvc
위 명령은 "msvc" 컴파일러용 Vim 스크립트를 찾아서 적절하게 설정을 바꿀 것입니다. 직접 컴파일러 스크립트를 만들 수도 있습니다. |write-compiler-plugin|를 참고하십시오. 출력 리디렉션(Redirection) -------------------------- ":make" 명령은 실행된 프로그램의 출력을 파일로 리디렉트(redirect) 시킵니다. 리디렉션이 이루어지는 방식은 'shell'(셸)에 따라 다양합니다. ":make" 명령이 제대로 출력을 처리하지 못한다면, 'makeef'(메이크오류파일)와 'shellpipe'(셸파이프) 옵션을 확인해보십시오. 그래도 안 된다면 'shellquote'(셸따옴표)와 'shellxquote'(셸x따옴표) 옵션도 확인해보십시오. ":make"의 리디렉션이 동작하지 않는 경우에는 다음 방법을 사용해보십시오. 먼저, Vim 밖에서 프로그램을 컴파일하고, 결과를 파일로 리디렉트 시킵니다. 그리고 다음 명령으로 이 파일을 읽어 들입니다:
:cfile
{파일명}
":make" 했을 때와 마찬가지로 에러들을 살펴볼 수 있습니다.
*30.2* C 스타일 파일 들여쓰기 프로그램은 적절히 들여쓰기가 되어 있어야 훨씬 이해하기 쉽습니다. Vim에는 들여쓰기를 쉽게 해 주는 다양한 기능이 있습니다. C 또는 Java나 C++ 같은 C 스타일 프로그램의 경우 'cindent'(C들여쓰기) 옵션을 켜십시오. Vim은 C 프로그램을 아주 잘 이해하고, 자동으로 원하는 대로 들여쓰기가 될 수 있도록 많은 정보를 사용합니다. 'shiftwidth'(들여쓰기폭) 옵션으로 몇 칸씩 들여 쓸지 지정하십시오. 공백 네 개 정도가 적당합니다. 다음과 같이 ":set" 명령 한번이면 됩니다:
:set cindent shiftwidth=4
위와 같이 설정하면 "if (x)" 같이 입력한 경우, 다음 줄이 자동으로 한 단계 더 들여쓰기 됩니다. if (flag) 자동 들여쓰기 ---> do_the_work(); 자동 내어 쓰기 <-- if (other_flag) { 자동 들여쓰기 ---> do_file(); 들여쓰기 유지 do_some_more(); 자동 내어 쓰기 <-- } 중괄호(
{}
) 안에 무언가 썼다면, 시작 부분에선 자동으로 들여쓰기가 되고, 끝 부분에선 다시 내어 쓰기가 됩니다. 블록이 언제 끝날지는 미리 알 수 없으므로, 내어 쓰기는 마지막 '}'를 입력하는 순간에 이루어집니다. 자동 들여쓰기를 사용하면 코드를 잘못 입력한 것을 빨리 알아차릴 수 있다는 것도 장점입니다. }를 입력해서 함수를 끝냈는데, 예상했던 것보다 들여쓰기가 더 되어있다면, 아마도 어딘가에 }가 빠져서일 것입니다. "%" 명령으로 방금 입력한 }에 어떤 {가 대응되는 지 확인해보면 됩니다. 마지막에 )나 ;를 빼먹는 경우에도 들여쓰기가 더 됩니다. 들여쓰기가 예상보다 더 되었다면, 바로 앞줄을 확인해 볼 필요가 있겠지요. 형식이 엉망인 코드가 있거나, 몇 줄을 더 넣거나 지워서 전체적으로 들여쓰기를 다시 할 필요가 있을 때는 "=" 오퍼레이터를 사용하십시오. 가장 단순한 형태는 다음과 같습니다:
현재 줄의 들여쓰기를 맞추어줍니다. 다른 오퍼레이터들과 마찬가지로, 세 가지 방법으로 사용할 수 있습니다. 시각 모드에서는 "="가 선택된 줄들의 들여쓰기를 맞추어줍니다. "="에 유용한 문자열 객체는 "a
{" 입니다. 현재 {}
블록을 선택해줍니다. 따라서 현재 커서가 속해있는 코드 블록의 들여쓰기를 맞추려면:
=a{
진짜로 코드가 엉망진창이어서, 전체 파일의 들여쓰기를 새로 맞추려면:
gg=G
하지만, 이 명령을 손으로 일일이 들여쓰기 해놓은 파일에는 사용하지 마십시오. 자동 들여쓰기가 잘 동작하긴 하지만, 가끔은 다르게 들여 쓰고 싶을 수도 있으니까요. 들여쓰기 방식 설정 ------------------ 사람마다 들여쓰기 방식은 각양각색입니다. Vim이 기본 설정일 때 90% 정도의 프로그래머들이 사용하는 일반적인 방식으로 들여쓰기를 잘 합니다. 하지만, 다른 방식을 쓰는 사람도 있습니다. 들여쓰기 방식은 'cinoptions'(C들여쓰기설정) 옵션으로 원하는 대로 바꿀 수 있습니다. 'cinoptions'의 기본 값은 비어있는 것으로, 이때는 Vim의 기본 들여쓰기 방식을 사용합니다. 다르게 들여쓰기 하고 싶은 곳에 따라 다양한 들여쓰기 방법을 추가할 수 있습니다. 예를 들어, 중괄호가 다음과 같이 들여쓰기 되도록 하고 싶다면:
if (flag)
{
i = 8;
j = 0;
}
다음 명령을 사용하십시오:
:set cinoptions+={2
이 외의 다양한 설정을 살펴보려면 |
cinoptions-values
|를 참고하십시오.
*30.3* 자동 들여쓰기 매번 C 파일을 열 때마다 'cindent' 설정을 켜려면 귀찮겠지요. 다음 명령을 사용하면 자동으로 설정이 켜집니다:
:filetype indent on
사실, 위 명령은 C 파일에서 'cindent'를 켜는 것 외에도 여러 가지 일을 합니다. 먼저, 파일 형식을 인식하는 기능을 켭니다. 이 기능은 문법 강조에서도 사용됩니다. 파일 형식을 인식하면, Vim이 그 형식을 위한 들여쓰기 파일을 찾습니다. Vim은 다양한 프로그래밍 언어용 들여쓰기 파일과 함께 배포됩니다. 따라서 파일을 열었을 때 각 파일의 형식에 맞는 자동 들여쓰기를 사용할 수 있습니다. 자동 들여쓰기가 싫다면, 다음 명령으로 끄면 됩니다:
:filetype indent off
어떤 파일 형식 한 가지 종류에서만 자동 들여쓰기를 끄고 싶다면, 다음과 같이 해보십시오. 먼저 다음과 같은 내용의 한 줄짜리 파일을 만드십시오:
:let b:did_indent = 1
이제 이 파일을 다음과 같은 이름으로 저장합니다:
{directory}
/indent/{filetype}
.vim{filetype}
은 "cpp"나 "java"같은 파일 형식을 나타내는 이름입니다. Vim이 정확하게 어떤 파일 형식으로 인식했는지 보려면 다음 명령을 사용하십시오:
:set filetype
예를 들어 이 파일에서 위 명령을 사용해보면:
filetype=help
즉{filetype}
으로 "help"를 쓰면 됩니다.{directory}
부분에는 Vim의 런타임 디렉터리를 써주면 됩니다. 다음 명령으로 런타임 디렉터리를 확인해보십시오:
set runtimepath
여기서는 첫 번째 디렉터리를 사용해봅시다. 첫 번째 쉼표 앞의 부분입니다. 즉, 출력이 다음과 같았다면:
runtimepath=~/.vim,/usr/local/share/vim/vim70/runtime,~/.vim/after
{directory}
에 "~/.vim"을 사용하면 됩니다. 지금까지의 내용을 종합해보면 다음 파일에 저장하면 됩니다:~/.vim/indent/help.vim
단순히 들여쓰기를 끄는 것보다, 들여쓰기 파일을 직접 만드는 것도 좋겠지요. 들여쓰기 파일을 만드는 방법은 |indent-expression
|을 참고하십시오.
*30.4* 다른 들여쓰기 방법 가장 간단한 형태의 자동 들여쓰기는 'autoindent'(자동들여쓰기) 옵션을 켜면 됩니다. 바로 앞줄의 들여쓰기를 그대로 사용합니다. 약간 더 머리를 쓴 것이 'smartindent'(영리한들여쓰기) 입니다. 들여쓰기 파일이 없는 언어로 프로그램을 짤 때 유용합니다. 'smartindent'는 'cindent'만큼 영리하진 않지만, 'autoindent'보다는 낫습니다. 'smartindent' 설정을 켜면, {가 나올 때마다 한 단계씩 더 들여쓰기가 되고, }가 나올 때마다 한 단계씩 다시 내어 쓰기가 됩니다. 'cinwords'(C들여쓰기단어) 옵션에 있는 단어가 나오는 경우에도 한 단계 더 들여쓰기가 됩니다. #으로 시작하는 줄은 특별히 취급해서 아예 들여쓰기가 되지 않습니다. 자연스럽게 전처리 지시자들이 줄의 맨 처음에 오게 됩니다. 다음 줄에는 다시 들여쓰기가 돌아옵니다. 들여쓰기 맞추기 --------------- 'autoindent'나 'smartindent'를 사용하면 윗줄의 들여쓰기 정도가 사용됩니다. 'shiftwidth' 만큼 들여쓰기를 하거나, 내어 쓰기를 하고 싶을 때가 있겠지요. 가장 빠른 방법은 입력 모드에서CTRL-D
나CTRL-T
명령을 사용하는 것입니다. 예를 들어, 다음과 같은 셸 스크립트를 쓰려고 한다고 합시다:if test -n a; then
echo a
echo "-------"
fi
다음과 같이 설정하고 시작합시다:
:set autoindent shiftwidth=3
첫 번째 줄을 입력하고,
<Enter>
를 눌러 두 번째 줄로 갑니다:if test -n a; then
echo
아, 들여쓰기를 한 단계 더 해야 되는 군요.CTRL-T
를 입력합시다. 결과는:if test -n a; then
echo
CTRL-T
명령은 입력 모드에서 'shiftwidth' 만큼 들여쓰기를 더 시킵니다. 커서가 줄의 어느 위치에 있든지 상관없습니다. 두 번째 줄을 계속 입력하고,<Enter>
로 세 번째 줄로 넘어갑시다. 제대로 들여쓰기가 되고 있습니다.<Enter>
를 누르고 마지막 줄로 갑시다. 다음과 같이 되었다고 합시다:if test -n a; then
echo a
echo "-------"
fi
마지막 줄의 들여쓰기 된 부분을 없애려면CTRL-D
를 누르십시오. 'shiftwidth'만큼 들여쓰기를 없애줍니다. 물론 현재 커서의 위치에 상관없습니다. 보통 모드일 때는, ">>", "<<" 명령을 사용해서 들여쓰기를 맞추면 됩니다. ">"와 "<"는 오퍼레이터이므로, 앞에서와 같이 세 가지 방법으로 들여 쓸 부분을 지정할 수 있습니다. 다음 조합이 유용합니다:
>i{
{}
블록 안의 내용을 한 단계씩 더 들여쓰기 시킵니다.{ 와 }
가 있는 줄들은 들여쓰기가 바뀌지 않습니다. 중괄호가 있는 줄까지 포함하려면 ">a{"를 사용하십시오. 다음 예는 커서가 "printf"에 있다고 가정한 것입니다: 원래 내용 ">i{" 한 경우 ">a{" 한 경우if (flag) if (flag) if (flag)
{ { {
printf("yes"); printf("yes"); printf("yes");
flag = 0; flag = 0; flag = 0;
} } }
*30.5* 탭과 공백 'tabstop'(탭크기)의 기본 값은 8입니다. 이 값을 바꿀 수는 있지만, 여기저기서 문제가 생길 수 있습니다. 다른 프로그램들에서는 탭 크기가 얼마인지 모르기 때문입니다. 대부분은 기본 값인 8을 사용할 것이고, 탭 크기를 바꿨다면 내용이 이상하게 깨져서 보일 것입니다. 또, 대부분의 프린터는 탭 크기가 8로 고정되어 있습니다. 따라서 'tabstop'은 바꾸지 않고 그대로 두는 것이 좋습니다. (다른 탭 크기 값에 맞추어 작성된 파일을 편집할 때는 |25.3|을 참고하여 수정하십시오.) 프로그램에서 들여쓰기를 할 때 여덟 칸씩 들여쓰기를 하면 금세 창의 오른쪽 끝까지 차버립니다. 그렇다고 한 칸씩만 들여쓰기를 하면 보기에 너무 불편하겠지요. 그래서 대부분의 사람들은 절충해서 네 칸을 사용합니다.<Tab>
은 여덟 칸의 공백에 해당하고, 우리는 네 칸의 공백을 사용하고 싶으니, 들여쓰기를 할 때<Tab>
문자를 사용할 수는 없습니다. 따라서 다음 두 가지 방법으로 이 문제를 해결합니다: 1.<Tab>
과 공백을 섞어서 사용하기.<Tab>
은 여덟 칸의 공백에 해당하므로, 파일의 크기가 작아지게 됩니다. 여덟 번 공백을 입력하는 것 보다는<Tab>
한 번 입력하는 것이 더 빠르고, 백스페이스도 빠르게 동작합니다. 2. 공백만 사용하기. 다른 탭 크기를 사용하는 프로그램에서 발생하는 문제를 완전히 없애줍니다. 물론 Vim은 두 가지 방법 모두 잘 지원합니다. 공백과 탭 --------- 탭과 공백을 섞어서 사용한다고 해도, 그냥 쓰고 싶은 내용을 입력하면 됩니다. Vim이 기본 설정으로도 공백들을 알아서 잘 처리해줍니다. 'softtabstop'(소프트탭크기) 옵션을 사용해서 조금 더 편하게 할 수도 있습니다. 이 옵션은 마치 탭 크기가 'softtabstop' 값인 것처럼<Tab>
키를 사용할 수 있게 해줍니다. 하지만 실제로는 탭과 공백이 섞여서 사용됩니다. 다음 명령을 사용하면,<Tab>
키를 누를 때마다 커서가 네 칸씩 오른쪽으로 움직입니다:
:set softtabstop=4
첫 번째 칸에서
<Tab>
을 누르면, 공백이 네 개 입력됩니다. 또 한 번<Tab>
을 누르면, 네 개의 공백이 사라지고,<Tab>
문자가 들어가면서, 아홉 번째 칸으로 커서가 이동합니다. 즉, 최대한<Tab>
을 넣고, 남는 들여쓰기 부분은 공백으로 마무리합니다. 백스페이스를 사용할 때도 마찬가지 방식입니다.<BS>
는 항상 'softtabstop'만큼의 공백을 지웁니다. 역시<Tab>
을 최대한 채우고, 남는 부분을 공백으로 채웁니다. 다음 예는<Tab>
을 몇 번 누르고,<BS>
를 눌렀을 때의 상황입니다. "."은 공백을, "------->"는<Tab>
을 의미합니다.입력 결과
<Tab>
....<Tab>
<Tab>
-------><Tab>
<Tab>
<Tab>
------->....<Tab>
<Tab>
<Tab>
<BS>
-------><Tab>
<Tab>
<Tab>
<BS>
<BS>
.... 또 다른 방법은 'smarttab'(영리한탭) 옵션을 사용하는 것입니다. 이 옵션을 켜면, 들여쓰기 부분에<Tab>
을 입력했을 때는 'shiftwidth'를 넣고, 공백이 아닌 문자가 나온 이후에 입력하면 진짜<Tab>
을 넣습니다. 하지만,<BS>
가 'softtabstop' 같이 동작하지는 않습니다. 공백만 사용하기 --------------- 파일에서 탭을 아예 사용하지 않으려면, 'expandtab'(탭확장) 옵션을 켜면 됩니다::set expandtab
이 옵션이 켜지면,
<Tab>
키를 눌렀을 때 항상 공백들이 입력됩니다. 따라서<Tab>
문자가 입력되었을 때와 동일한 만큼의 공백이 나타나지만, 진짜<Tab>
문자는 전혀 입력되지 않습니다. 백스페이스는 항상 공백 하나씩 만을 지웁니다. 따라서<Tab>
을 한번 입력한 후에 이를 다시 지우려면<BS>
를 여덟 번 눌러야 합니다. 들여쓰기 부분이라면CTRL-D
로 더 빠르게 지울 수 있습니다. 탭을 공백으로 바꾸기 (공백을 탭으로도) -------------------------------------- 'expandtab'을 설정해도, 이미 파일에 들어있는 탭에는 영향이 없습니다. 즉, 원래 탭이 있었으면 계속 탭인 채 남아있습니다. ":retab"(탭다시) 명령은 이런 탭들을 공백으로 바꿔줍니다. 다음 명령을 사용해보십시오:
:set expandtab
:%retab
이제 모든 들여쓰기에 탭이 아닌 공백을 사용하도록 바뀌었을 것입니다. 하지만, 공백이 아닌 문자가 나온 이후에 나오는 탭들은 그대로 유지됩니다. 이런 것들까지도 바꾸려면 !를 추가하십시오:
:%retab!
이 명령은 사실 좀 위험합니다. 문자열 상수 안에 있는 탭까지 공백으로 바꿔버리기 때문입니다. 이런 경우가 있는지는 다음과 같이 찾아보면 됩니다:
/"[^"\t]*\t[^"]*"
일반적으로는 문자열 안에 진짜 탭 문자를 안 넣는 것이 좋겠지요. "\t"를 사용하면 문제를 사전에 예방할 수 있습니다. 반대로 공백을 탭으로 바꾸는 것도 잘 동작합니다:
:set noexpandtab
:%retab!
*30.6* 주석 다듬기 Vim의 뛰어난 점 중 하나는 주석을 인식한다는 것입니다. Vim으로 주석을 다듬을 수 있습니다. 예를 들어, 다음과 같은 주석이 있다고 합시다:/*
* 아~ 아~ 주석
* 다듬기 테스트 중입니다.
*/
이제 커서를 주석이 시작하는 부분에 놓고 다음 명령을 사용해봅시다:
gq]/
"gq"는 형식을 맞추는 오퍼레이터입니다. "]/"는 주석의 끝으로 이동시키는 동작입니다. 결과는 다음과 같습니다:
/*
* 아~ 아~ 주석 다듬기 테스트 중입니다.
*/
각 줄의 시작 부분이 깔끔하게 처리된 것을 볼 수 있습니다. 형식을 다듬을 부분을 시각 모드에서 선택한 다음에 "gq"를 사용해도 됩니다. 주석에 줄을 추가하려면, 커서를 가운데 줄에 놓고 "o"를 누르십시오. 결과는 다음과 같습니다:/*
* 아~ 아~ 주석 다듬기 테스트 중입니다.
*
*/
별표와 공백이 자동으로 들어갔습니다. 주석 내용을 바로 넣으면 되겠지요. 길이가 'textwidth'(내용폭)보다 길어지면 자동으로 줄이 넘어갑니다. 물론 별표도 자동으로 입력됩니다:/*
* 아~ 아~ 주석 다듬기 테스트 중입니다.
* 줄 바꿈이 자동으로 되도록 아무거나 막
* 넣어봅시다
*/
이 기능이 제대로 동작하려면, 'formatoptions'(형식설정)에 몇 가지가 설정되어있어야 합니다: r 입력 모드에서<Enter>
를 입력할 때 자동으로 별표 입력 o 보통 모드에서 "o"나 "O"사용 시 자동으로 별표 입력 c 'textwidth'에 따라 주석 안에서 줄 바꿈 더 많은 설정 내용은 |fo-table
|에서 확인하십시오. 주석 정의하기 ------------- 'comments'(주석) 옵션은 주석이 어떻게 생겼는지 지정합니다. Vim은 한 줄짜리 주석, 그리고 시작, 끝, 중간 부분이 각각 다르게 생긴 주석들을 인식할 수 있습니다. 대부분의 한 줄짜리 주석은 특정한 문자로 시작합니다. C++은 // 로 시작하고, 메이크파일(Makefile)은 #으로, Vim 스크립트는 "로 시작합니다. 예를 들어, Vim이 C++ 주석을 인식하도록 하려면:
:set comments=://
콜론은 플래그와 주석 인식을 위한 문자열을 구분하기 위한 것입니다. 'comments'의 일반적인 형태는:
{flags}
:{text}
{flags}
부분은 위에서와 같이 비어있을 수도 있습니다. 여러 주석 형태는 쉼표를 사이에 넣고 쭉 이어서 쓰면 됩니다. 동시에 여러 가지 형식의 주석을 인식할 수 있도록 말이지요. 예를 들어, 이메일을 편집한다고 합시다. 답장을 보낼 때, 다른 사람이 쓴 부분은 ">"나 "!"가 앞에 붙습니다. 다음 명령을 사용하면 됩니다:
:set comments=n:>,n:!
두 가지 주석 형태가 있는데, 하나는 ">"로 시작하고 하나는 "!"로 시작합니다. 둘 다 "n" 플래그를 사용하고 있습니다. "n"은 주석이 중첩될 수 있다는 의미입니다. 따라서 ">"로 시작하는 줄에는 ">" 다음에 다른 주석이 또 나올 수 있습니다. 따라서 다음과 같이 사용할 수 있습니다:
> ! 그 사이트 가보셨어요?
> ! 진짜 대단해요.
> 전 좀 별로던데. 색이
> 너무 이상해요.
그 사이트 URL이
뭐예요?
'textwidth'를 다른 값으로(예를 들어 80으로) 해놓고, 시각 모드에서 위 내용을 선택한 후, "gq"를 적용해보십시오. 결과는 다음과 같습니다:> ! 그 사이트 가보셨어요? 진짜 대단해요.
> 전 좀 별로던데. 색이 너무 이상해요.
그 사이트 URL이 뭐에요?
다른 주석 영역끼리는 내용이 붙지 않았습니다. 두 번째 줄의 "전"은 첫 번째 줄의 뒤 쪽에 붙을 수도 있습니다만, 첫 번째 줄은 "> !"로 시작하고, 두 번째 줄은 ">"로 시작하므로 두 줄이 서로 다른 종류의 주석이라고 판단하고 붙이지 않은 것입니다. 세 부분으로 이루어진 주석 ------------------------- C의 주석은 "/*"로 시작하고, 중간에 "*"들이 들어가고, "*/"로 끝납니다. 이 형태를 'comments' 형식으로 표현해보면 다음과 같습니다:
:set comments=s1:/*,mb:*,ex:*/
시작 부분은 "s1:/*"와 같이 정의됩니다. "s"는 세 부분 중 시작 부분이라는 의미입니다. 플래그와 주석 문자열을 구분하는 콜론이 나오고, 실제 주석을 표시하는 문자열인 "/*"가 나왔습니다. 또 하나의 플래그인 "1"은 주석의 중간 부분에 공백 한 칸 만큼이 필요하다는 의미입니다. 가운데 부분인 "mb:*"는 가운데 부분임을 나타내는 "m"으로 시작합니다. "b"는 주석기호 다음에 공백이 와야 함을 의미합니다. 이 플래그가 없다면 "*pointer"와 같은 것까지 주석의 일부로 잘못 처리할 수도 있습니다. 끝 부분인 "ex:*/"의 "e"는 끝 부분임을 나타냅니다. "x"는 특별한 의미가 있는데, Vim이 새로운 줄에 자동으로 별표와 공백을 입력해 주었을 때, 사용자가 /를 입력하면 별표 다음의 공백을 자동으로 지워주라는 의미입니다. 더 자세한 내용은 |
format-comments
|를 참고하십시오.
다음 장: |usr_31| GUI 활용하기 저작권: |manual-copyright| 참고 vim:tw=78:ts=8:ft=help:norl:
Generated by vim2html on 2013. 12. 14. (토) 20:47:01 KST