원문:http://www.linuxnewbie.org/nhf/intel/tools/customize_vim3.html

저자: Danny "Strike" DiPaolo

날짜:

제목:내게 맞는 vim 환경 만들기
 

글은 다음과 같은 타입의 리눅스 사용자를 위해 작성되었다:

앞에서 말한 대로, 나는 글을 읽고 있는 여러분이 위에 언급된 타입 하나에 속한다고 가정할 것이다. 자신은 위에서 언급한 타입에 모두 해당한다. 이런 사실을 염두에 두고, 글이 여러분의 필요에 적용되지 않을 것이라는 생각을 버리도록 하라.

가지 추가할 가정은, 글을 읽고 있는 여러분은 적어도 vim 편집기에 상당히 익숙한 사람일 것이라는 것이다. NHF에서 언급하고 있는 config 파일의 형식에 대한 내용이 얼마나 다를지는 모르겠지만 나는 현재 5.6.11 사용하고 있다(5.7 가장 최신 버전인 것으로 알고 있다). 만일 여러분이 가지고 있는 vim 버전이 확실하지 않다면, http://www.vim.org으로 가서 새로운 버전을 가져 오면 된다. 글을 읽고 있는 여러분은 vim 단일 모드로 작동하는 편집기가 아니라는 점을 반드시 알고 있어야만 한다. 그리고 적어도 vim 프롬프트에서 명령을 입력(콜론[:], 내용을 저장하고 종료할 쓰는 :wq 같은 명령이 입력되는 프롬프트) 알고 있어야 뿐만 아니라 명령 모드와 입력 모드 양쪽에 익숙해야만 한다

---구성---

주의- 부분에서 내가 권장하는 것은 그대로 권장하는 것에 그친다. 내가 권장하는 방법보다 구성하는 방법들이 있다. 하지만 여기서 권장하는 방법은 내가 가진 나머지 디렉토리 구조와 어울리기 때문에 나는 이런 방법을 좋아한다.

무엇보다도, 위치를 마음대로 정할 없는 파일이 있다. 여러분의 .vimrc 파일이다. 파일은 반드시 여러분의 디렉토리에 있어야 한다. 파일은 또한 여러분이 vim 환경을 조정할 가장 핵심이 되는 파일이다. 그래서 나는 점을 말하지 않고 넘어갈 없다 – .vimrc 중요한 파일이다. 만일 여러분의 vim 환경을 유지하고 싶다면, 전원 공급이 차단되어서 여러분의 시스템이 망가지는 경우나 쓰고 있는 vim 환경을 다른 시스템으로 옮기는 경우에 대비해서 현재의 vim 환경을 다른 곳에 백업할 것을 권한다.

하지만, .vimrc 이외에도 우리가 이용하게 설정 파일들이 있다. 파일들은 빠르게 불어나기 시작하는데, 나는 보이지 않은 많은 -파일(.으로 시작하는 파일들) 디렉토리에 두는 것을 좋아하지 않는다 이미 디렉토리에는 많은 디렉토리들이 있다 - 그래서 내가 취한 방법은 .vimrc  제외한 나머지 vim 설정 파일들을 담아두는 디렉토리를 따로 만드는 것이었다.

나는 디렉토리를 .vim-files라고 이름 붙였다. 디렉토리의 내용을 나타내주는 이름이면서 그저 간단하게 ls 명령을 때는 나타나지 않기 때문에 이름을 선택했다(이것과 같은 설정과 관련된 파일들은 첫번째 위치에 와서는 된다). 내가 언급하게 모든 다른 파일들은 디렉토리 또는 디렉토리의 하위 디렉토리에 있게 것이다.

디렉토리를 만들기 위해서는 다음의 명령을 내리면 된다:
cd
mkdir .vim-files

처음에 내린 cd 명령으로 여러분의 디렉토리로 가게 되고, 번째 명령이 실제로 디렉토리를 만든다.

이렇게 해서 디렉토리가 만들어지면, .vimrc 파고 들어서 가지 중요한 설정 내용을 공부할 준비가 것이다!

--- ~/.vimrc 파일---


본격적인 내용에 들어가기 전에, vim 설정하는 방법에 대한 간략한 설명을 하고자 한다. 그러기 위해서, 터미널 윈도우에서 vim 세션을 시작하라. 콜론 프롬프트 상에서 "set "(스페이스가 포함되게) 입력하고 <TAB> 누르도록 하라. 만일 여러분이 전에는 이런 특성이 있는 몰랐다면, vim 파일 이름과 같은 것을 포함해서 모든 명령에 대해서 자동으로 탭을 채워 것이다. 하지만, 여러분은 "set all" 같은 것을 실행해야 한다(이것이 바로 내가 실행한 것이다). <TAB> 반복해서 눌러라. 잠깐 동안  <TAB> 누르고 있어라. 보이는 것은 vim 환경을 설정할 있는 모든 옵션들이다. 이들 일부는 보통 명백한 의미를 가지고 있고 적당한 디폴트 값을 가지고 있다. 이들 일부는 사용자가 익숙해져 있는 것이 어떤 것이냐에 많이 의존한다. 이들 일부는 매우 이상한 것도 있는데 일반적인 경우에는 전혀 신경 쓰지 않아도 된다. 아무튼, 많은 옵션들이 있다는 것은 틀림이 없다.

vim 세션을 완벽하게 제어하고 싶어하는 여러분에게 계속하기 전에 해보라고 권하고 싶은 것이 있다. 위에서 내가 간략하게 언급한 과정을 실제로 여러분 자신이 해보도록 하라. 천천히 각각의 옵션의 내용을 읽고 여러분의 설정에 사용할 만한 것이라고 생각되는 옵션은 메모하도록 하라. 무엇을 뜻하는 모르는 옵션('set cscopeprg' 뜻하는 것이 무엇인가?) 대해서도 마찬가지로 메모하라. 이렇게 해서 옵션들의 리스트가 완성되면, 다시 콜론 프롬프트로 돌아가서 ":h " 입력하고는 여러분이 궁금해 하는 옵션을 입력하라. ":h" vim 상의 온라인 도움말이다. 온라인 도움말은 양적으로 매우 방대해서 도움말 파일을 자세히 살펴 만하다. 반드시 여러분이 관심 있는 설정과 설정에 필요한 특정 값에 대한 리스트를 가지고 있도록 하라. 자신의 .vimrc 작성할 가장 핵심적인 일이 바로 이것이며 이렇게 애쓴 보람이 있다.

물론, 이렇게 작성된 리스트에 있는 것들은 설정되어질 옵션이다. NHF에서는 리스트에 있는 옵션을 설정하는 일보다 조금 많은 것을 다루어서 vim 보다 강력한 도구로 만들고자 한다.

이제, 글을 읽고 있는 여러분이 내가 앞서 언급했던 NHF 읽어야만 하는 가지 타입에 속하는 사람이면서 적어도 이전에 .vimrc 같은 설정 파일에 관한 약간의 경험을 가지고 있다는 것을 확신한다. 가지 .vimrc 설정 파일과 약간 다른 것은 기본적으로 .vimrc 스크립트로 여겨진다는 점이다. 솔직히 말해서, 내가 vim 시작할 때마다 40줄의 명령을 손으로 입력하려고 한다면, 컴퓨터에서 .vimrc 파일을 삭제해도 된다. 하지만, 실제로 그런 일은 일어나지 않는다. 어쨌든, vim 단순하게 여러분의 모든 .vimrc 명령이 손으로 직접 입력된 것처럼 여기고 시작할 수행한다는 사실은 내가 앞서 언급했던 특성(명령 자동 완성) 때문에 우리에게 도움이 된다. 특성은 vim 제공하는 매우 방대한 온라인 도움말과 함께 내가 여기서 보여주는 것을 이해할 있게 해주고 여러분이 관심을 가지고 있는 명령을 추가할 있게 준다.

여러분이 무슨 생각을 하고 있는지 나는 알고 있다 빨리 본론으로 들어가서 vim 환경 설정하는 방법에 대해서 이야기하지 않는 걸까 하고 생각하고 있지 않은가? 맞았다고? 좋다. 나도 이제 그러고 싶다. 내가 현재 사용하고 있는 ~/.vimrc 파일을 보여주기 전에 가지 언급하고 넘어가야 것이 있다. 그것은 바로 커맨트 문자이다. ~/.vimrc 파일 안에 있는 커맨트 문자는 이중 따옴표(")이다. 하나의 라인 상에서 문자 다음에 오는 모든 문자들은 커맨트로 간주되어 스크립트의 일부가 아닌 것으로 인식된다. ~/.vimrc 파일에는 블록 커맨트가 없다.

좋다, 이제 나의 사랑스러운 ~/.vimrc 파일을 공개한다:

----------------------------

" Formatting
set tabstop=4                   " tabs은 스페이스 4칸이다 
set bs=2                        " backspace over everything in
insert mode
set smartindent                 " C-style로 
 
" Mouse stuff
set mousehide                   " 문자가 입력된 다음에는 마우스를 감춘다
set mousefocus                  " 이것을 위한 실제 이유는 없음
set mouse=a                     " 모든 모드에서 마우스가 있음
set mousem=popup              " 메뉴 팝업에는 오른쪽 마우스 버튼
Shift-left extends selection      
 
" Other stuff
set autowrite                     " make와 shell 명령 등을 작성
set     ruler                     " ruler 표시되게 함
set nohlsearch                   "검색 항목이 나타나면 하일라이트함
annoying
set nocompatible                " vi 호환성(compatibility)은 약함
 
" 명령 라인 완성에서는 확장자 무시
set
suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
 
" 현재 파일에서 ispell을 실행
" map #fi :w:!ispell %:e %
" 
" 매크로된 키가 어떤 것인지 확신할 수 없거나 단지 연속된 키가 명시된 것
 
" 모든 auto-commands를 삭제한다. 이렇게 해서 .vimrc 파일이 한 번 이상 
" source 된 경우에 autocommands가 두 번 적용되는 것을 방지한다..
autocmd!
 
" LaTeX autocmds
autocmd BufRead                 *.tex   source ~/.vim-files/.vimrc.latex
autocmd BufNewFile              *.tex   source ~/.vim-files/.vimrc.latex
" C autocmds
autocmd BufRead                 *.c             source
~/.vim-files/.vimrc.c
autocmd BufNewFile              *.c             source
~/.vim-files/.vimrc.c
" asm autocmds
autocmd BufRead                 *.s,*.S,*.asm   source
~/.vim-files/.vimrc.asm
autocmd BufNewFile              *.s,*.S,*.asm   0r
~/.vim-files/skeletons/skel.asm      
autocmd BufNewFile              *.s,*.S,*.asm   source
~/.vim-files/.vimrc.asm
" HTML autocmds
autocmd BufRead                 *.htm,*.html    source
~/.vim-files/.vimrc.html
autocmd BufNewFile              *.htm,*.html    0r
~/.vim-files/skeletons/skel.html
autocmd BufNewFile              *.htm,*.html    source
~/.vim-files/.vimrc.html
" Perl autocmds
autocmd BufRead                 *.pl    source  ~/.vim-files/.vimrc.perl
autocmd BufNewFile              *.pl    0r ~/.vim-files/skeletons/skel.pl
autocmd BufNewFile              *.pl    source ~/.vim-files/.vimrc.perl
autocmd BufWrite                *.pl    !chmod +x %
" Java autocmds
autocmd BufRead                 *.java  source ~/.vim-files/.vimrc.java
autocmd BufNewFile              *.java  source ~/.vim-files/.vimrc.java
 
" 다음은 Vim 버전 5.0 이상에만 적용된다
if version >= 500
 
if has("terminfo")
  set t_Co=8
  set t_Sf=[3%p1%dm
  set t_Sb=[4%p1%dm
else
  set t_Co=8
  set t_Sf=[3%dm
  set t_Sb=[4%dm
endif
 
endif
 
" 물론, 중요한 문법은 하일라이트된다.
" if 관련된 것이 위에 있으므로 이것은 가장 나중에 실행된다.
syntax on

-----------------------------------------------------

실제로 이것은 예비적인 버전이다. 프로그램 코드를 작성할 사용하는 언어에 관한 사항을 아직 하나도 더해 넣지 않았기 때문에 부분을 추가하면 현재의 내용보다 훨씬 길이가 늘어날 것이다( 글을 읽고 있는 대부분의 독자들은 이미 눈치챘겠지만, C++ 빠져 있다).

나의 ~/.vimrc 파일에서는 커맨트를 자유분방하게 쓰고 있는데, 이는 내가 어떤 옵션을 설정한 다음 찾아 후에는 잊어버리기 때문이다. 그래서, 나는 설정 옵션들이 하는 기능을 설명하는 커맨트를 붙여 놓아서, 어떤 라인들을 지워버리고 싶을 , 라인을 지워버림으로써 어떤 기능들이 삭제되는지 쉽게 있도록 하고 있다. 설정 옵션을 마구잡이로 늘어 놓는 것은 대신 유사한 내용을 같은 블록에 담아서 개의 논리적인 블록으로 나누는 것은 파일을 관리하기 편하게 준다.

옵션들을 한번 훓어 봄으로써 내가 vim 어떤 작업 환경에서 사용하고 싶어하는지 있다. 하지만, 솔직히 말해서, 우리가 다루게 vim 옵션 설정은 재미있거나 쓸모가 있는 것은 아니다. 그러므로, 내가 내용들을 얼버무려 넘겨 버리더라도 이해해 주기 바란다. 게다가, 설정할 새로운 옵션을 찾고 그것을 설정하는 좋은 방법을 앞서 설명했으니 말이다.

내가 사용하고 있는 .vimrc 파일에서 정말 중요한 부분은 autocmd 섹션이다. 여러분은 아마도 "autocmd 뭐지요?"라고 물을지 모른다. 글쎄, 재빨리 ":h autocmd"(기억해 놓도록 하라. 우리의 .vimrc 파일에 있는 모든 명령은 ":h <command>"이란 명령으로 온라인 도움말을 얻을 있다) 보면 다음과 같은 autocmd.txt 도움말 파일이 나타날 것이다:

--------
명령들이 자동적으로 수행되도록 명시해서 파일을 읽거나 적을 , 버퍼나 윈도우에 들어오거나 나갈 , Vim 종료할 사용할 있다. 예를 들어, *.c 일치하는 파일을 위한 'cindent' 옵션을 설정하기 위해 autocommand 만들 있다. 또한 autocommands 이용해서 압축된 파일을 편집한다든지 하는 고급 기능을 수행할 있다(|gzip-example| 보라). 일반적으로 autocommands 두는 곳은 여러분의 .vimrc 또는 .exrc 파일이다.

경고: autocommands 매우 강력한 힘을 가지고 있고 예상치 않은 기능을 할지도 모른다. 작성한 텍스트를 망치지 않도록 주의하라.
--------

내가 autocmd 중요한 부분이라고 말할 믿지 않았다면, 이제는 말을 믿으리라고 생각한다 비록 autocmd 저자가 그것의 강력함을 말한 것이기는 해도.

만일 여러분이 내가 위에서 (":h autocmd") 했다면, autocmd 관한 도움말을 충분히 얻었을 것이다. 하지만, 만일 여러분이 매우 포괄적인 도움말 파일을 전체를 읽어 보고 싶지 않다면, 자신의 설정에서 사용된 것만을 살펴보고 도움말 파일을 끝까지 읽어 보는 것은 나중으로 미루기로 하자.

.vimrc 파일의 autocmd 섹션이 7개의 주요 부분으로 구성되어 있는 것을 쉽게 알아 있다.

첫번째 부분은:

------------

autocmd!

------------

이것이 전부이다. 그리고 부분의 위에 있는 커맨트가 설명하고 있는 바와 같이, 명령은 현재 정의되어 있는 모든 autocommands 삭제해서 개별적인 autocommand 프로세스의 어떤 곳에 영향을 주는지 정확하게 있게 한다. , 우리의 vim 환경을 컨트롤해서 우리의 용도에 맞게 구성하는 것이다.

다음의 여섯 개의 부분은 각각 특정 언어에 관한 부분이다 - LaTeX, C, asm, HTML, Perl, 그리고 Java. 이들 언어는 모두 같은 규칙을 따르므로, 가장 복잡하게 구성된 Perl 섹션을 예로 들어 설명하기로 하겠다.

설명하기로 Perl 관한 부분을 다시 보기로 하자:

------------------

" Perl autocmds
autocmd BufRead                 *.pl    source  ~/.vim-files/.vimrc.perl
autocmd BufNewFile              *.pl    0r ~/.vim-files/skeletons/skel.pl
autocmd BufNewFile              *.pl    source ~/.vim-files/.vimrc.perl
autocmd BufWrite                *.pl    !chmod +x %

------------------

그럼 이제 각각의 라인이 뜻하는 것이 무엇인지 알아 보기로 하자(시간 상의 문제로, 가장 라인이면서 커맨트인 "Perl autocmds" 넘어 가기로 한다).

첫번째 라인:

 
autocmd BufRead         *.pl    source ~/.vim-files/.vimrc.perl
 

앞서의 설명으로 이미 우리는 autocmd 무엇인지 알고 있다. 이제 우리가 알아 봐야 것은 "BufRead" 무엇을 뜻하느냐 하는 것이다. 그것이 뜻하는 것은 그다지 어렵지 않다. 여러분이 예상하는 것과 거의 같을 것이다. 이것은 버퍼가 읽힐 때마다 적용되는 autocommand 뜻한다.

만일 여러분이 프로그래머라면 다음 부분은 쉬울 것이다(또는 Perl 파일의 확장자가 대개 .pl이라는 사실을 안다면) . 이것은 기본적으로 autocommand 어떤 종류 버퍼에 적용될 것인지를 정의하는 것이다. 특히, 명령은 .pl 끝나는 파일에만 적용될 것이다.

가장 마지막 부분은 실제로 수행될 명령을 나타낸다.  명령이 하는 일은 번째 .vimrc 파일에 source 명령을 실행하는 것이다. 번째 .vimrc 파일은 Perl 관한 매크로 정의와 같은 것을 담고 있는 파일이다. 파일은 내가 언급했던 .vim-files 디렉토리에 위치한 파일 중의 하나이다. 내가 말했던 것처럼, 명령은 다른 .vimrc 파일에 source 명령을 적용시키는 것이지만, 파일에는 Perl 관련 매크로가 정의되어 있으므로 Perl 스크립트를 편집하거나 새로운 Perl 스크립트 파일을 만들 때만 다른 .vimrc 파일에 source 명령이 적용된다.

위의 설명에서 있듯이, autocommand 라인은 우리가 다루는 상황의 절반 밖에 다루지 못한다. , 우리가 이미 존재하고 있는 Perl 스크립트를 편집할 때만 적용되지, Perl 스크립트를 만들 때는 적용되지 않는다(아직 존재하지 않는 것을  버퍼에 읽어 들일 없다). 하지만, 라인 아래에서 둘째 라인에 있는  autocmd 보도록 하자. 이것은 "BufRead" 대신에 "BufNewFile" 썼다는 것만 제외하면 첫번째 라인과 똑같다. "BufNewFile" 썼다는 것은 새로운 파일이 만들어질 때마다 autocommand 적용될 것이라는 것을 뜻한다(여기서도 "*.pl"이라는 조건이 사용되었으므로 .pl 끝나는 파일인 경우에만이라는 조건이 붙는다).

이렇게 해서 섹션의 (첫번째, 번째 autocmds) 다루었다. 다음엔 번째 autocmd 다루기로 하자:

 
autocmd BufNewFile              *.pl    0r ~/.vim-files/skeletons/skel.pl
 

우리는 방금 라인의 대부분을 해석하는 방법을 배웠다. 처음의 열은 명령이 .pl 확장자를 갖는 파일을 만들 때마다 적용된다는 것을 나타낸다. 가지 알아내야 것은 명령 자체이다. 명령은 커서를 파일(우리가 파일을 다루기 때문에 문서로 간주된다) 처음에 두고, 그런 다음 ~/.vim-files/skeletons/skel.pl 내용을 파일로 읽어오는 것이다. 이제, 다음 사항을 기억해 두도록 하라. 여러분은 ~/.vim-files/skeletons/skel.pl 파일을 편집한 적이 없으며, 다만 명령은 파일의 내용을 현재의 버퍼에 불러 들인다. 경우에는 새로운 Perl 스크립트가 현재의 버퍼이다.

그런데 ~/.vim-files/skeletons/skel.pl 파일 안에 정확히 무엇이 있는가? 특별한 파일에는 내가 Perl 배우기 시작한 이래 나의 모든 Perl  스크립트에 있었던 다음에 있는 줄의 헤더 외에는 아무 것도 없다:

------------------

 
#/usr/bin/perl -w
use strict;
 

------------------

Perl 스크립트를 만들 때마다 매번 라인들을 입력하는 대신에, 그저 라인들만을 가지고 있는 "skeleton"이란 파일을 만들어서 내가 작성하는 모든 새로운 Perl 스크립트에 불러들이기로 했다. 그러므로, 만일 여러분이 같은 종류의 기본 골격을 사용하는 여러 개의 파일을 필요로 하는 작업을 해야 한다면, 내가 것처럼 기본 골격을 파일로 작성해서 이용하는 테크닉을 사용할 것을 권한다.

이제 섹션의 마지막 부분을 다루기로 하자:

 
autocmd BufWrite                *.pl    !chmod +x %
 

아직 우리가 "BufWrite" 조건에 대해서 명확하게 이야기한 적은 없지만, 이제는 명령의 처음 부분은 쉽게 있을 것이다. 파일을 적을 (저장할 )마다  명령이 적용된다는 것을 있다.

하지만, 여기에서 사용된 명령은 그렇게 쉽지 않을 수도 있다. 명령의 첫번째 문자인 느낌표(!) vim에게 다음에 있는 명령을 실행시키라는 뜻이다. "chmod +x"라는 명령이 파일을 수행 가능하게 만든다는 것을 정도로 여러분이 리눅스 명령을 알고 있으면 좋겠다(그렇지 않다고 해도, 지금 여러분은 사실을 알게 되었다). 마지막에 있는 문자는 아직도 의문의 대상이다. Chmod 명령을 실행하려면 파일 이름이 필요하지만, 퍼센트 기호는 우리의 현재 파일의 이름이 아니다. 그러나, 퍼센트 기호는 vim 특수 문자 하나이다. Vim 명령에서, 퍼센트 기호는 언제나 현재의 파일 이름으로 대체된다. 퍼센트 기호를 사용하는 다른 편리한 대체 방법이 있다. 파일 이름으로부터 확장자를 제거하고자 때는 %< 사용한다. 기호 다음에 다른 확장자가 오게 되면, 파일 이름 다음에 확장자를 붙여 준다. 예를 들어, 여러분이 foo.tex이란 이름의 파일을 작업 중인데, 출력 결과를 foo.ps 이름으로 하고 싶다고 하자. 그러면 %<.ps 사용해서 foo.ps 나타낼 있다. 어떤가? 상당히 간단하지 않은가? 이렇게 해서, 지금까지 우리는 .vimrc 파일을 살펴 보았다.

앞서 말한 대로, 대충이기는 하지만 우리는 ~/.vimrc 파일의 가장 부분을 다루었다. 이제는 source 명령을 적용하는 다른 .vimrc 파일들을 살펴 차례이다.

--다른 .vimrc 파일들 ---


여러분은 아마도 다음과 같은 질문을 던지며 궁금해 할지도 모른다. "다른 .vimrc 파일이 필요한가요? 모든 옵션을 첫번째 .vimrc 파일에서 설정하지 않았나요?" 글쎄, 대답은 그렇다 아니다이다. 우리가 ~/.vimrc에서 설정한 옵션들은 사실 전역(global)이고 우리가 vim에서 편집하는 모든 파일에 적용된다. 하지만, 우리는 vim으로 보다 많은 일을 있다. 잠깐 기다려 보라.

여러분의 특정 작업을 위한 .vimrc 파일에 넣기 위해서 내가 다루려고 하는 것이 하나 있는데, 바로 매크로이다. 매크로를 사용하면 LaTeX 사용이 더욱 쉬워진다는 것을 보여주겠다. 하나의 파일을 편집하면서 파일에 대해서 LaTeX 실행하기 위해서는 ,rl 입력해야 한다("run LaTeX"이라는 뜻으로 기억하기 쉽도록 내가 선택한 연속된 키이다). 그런 다음, 파일로부터 PS(PostScript) 파일을 만들기 위해서는 ,cps(마찬가지로, "create PS"이란 뜻으로 내가 선택한 키이다) 입력해야 한다. 그리고 마지막으로, 파일을 보기 위해서는 ,gv 입력해야 한다(Ghostview 축약어로 gv라고 썼지만, 앞서와 마찬가지로 내가 임의로 선택한 키이다). 사실, 여러분은 매크로에 관한 다음 내용을 보기 위해서 기다릴 필요도 없다. 여러분의 LaTeX 소스 파일에서부터 PostScript 파일을 얻기 위해서, 여러분이 해야 일은 rl,cps,gv 입력하는 것뿐이다. 사실, 여러분이 원한다면 모든 작업을 한번에 하도록 여러분 자신만의 매크로를 만들 수도 있다.

글에서 다루게 매크로의 타입은 크게 가지이다 명령 모드 매크로와 입력 모드 매크로이다. 사이의 유일한 차이는 언제 불리워 지는가 하는 것이다. 그리고 물론 앞으로 보게 되겠지만 사용하는 방법 상에 미묘한 차이가 있다.

::: 명령 모드 매크로 :::


이것은 우리가 앞서 보았던 autocommand 명령과 같은 종류이다. 다만 특정 이벤트에 자동적으로 실행되는 것이 아니라, 연속된 특정 키를 누름으로써 실행된다. 하지만, 이들 명령은 명령 모드에서 불리워 져야지, autocommand  명령을 때처럼 콜론 명령 프롬프트에서 불리워 져서는 된다(앞으로 보게 되겠지만, 이것은 입력 모드 매크로와도 다르다). 이제 예제 두개를 보기로 하자. 다음은 내가 앞에서 언급했던 LaTeX 매크로들이다:

-------------------------------

map ,rl :w:!latex %
map ,cps :!dvips %<.dvi -t letter -o %<.ps
map ,gv :!ghostview %<.ps &

-------------------------------

분명히 있겠지만, 이들 매크로를 정의하는 키워드는 "map"이다. 다음 항목은 매크로를 부르는 필요한 연속된 키이다( 단락 앞을 다시 읽어 보면 쉽게 있다). 물론, 마지막 항목은 명령 모드에서 앞서의 연속된 키가 입력될 실제로 수행되는 명령이다.

첫번째 것을 보기로 하자. 내게는 해독할 필요가 거의 없는 것처럼 보이기는 하지만, 여러분에게는 아닐 수도 있으니 차근차근 설명하기로 하자. 기본적으로 여러분이 생각해야 것은 이들 매크로가 여러분이 vim 사용할 작업을 하기 위해서 입력하는 키들로 이루어져 있다는 것이다. 그렇기 때문에, 매크로에서 처음 일어나는 것은 콜론 명령 프롬프트가 불리워지고(명령 모드에서처럼 : 누름으로써), 그런 다음 "w" 입력해서 파일을 저장하고 엔터를 누른다(또는 캐리지 리턴, <CR>). 일단 파일이 저장되면, 현재 문서 상에서 LaTeX 컴파일러를 실행하기를 원한다. 그렇기 때문에, 우리는 명령 모드로 가서(:), 현재 파일 상에서 LaTeX 컴파일러를 실행한다(!latex %<CR>). 간단하지 않은가?

글쎄, 간단하다고 여겨지지 않는다 해도 조금만 연습하면 된다. 다음 것도 이와 비슷해서 "dvips foo.dvi -t letter -o foo.ps" 실행하는 것이다(foo.tex 상에서 작업하고 있다는 가정 하에서). 명령으로 LaTeX 컴파일러로 만들어진 DVI 파일로부터 PostScript 파일이 생겨난다. 실제로 매크로에서 새로운 것은 없다. 단지 %< 현재의 파일 이름에서 확장자를 것이며 기호 다음에 원하는 어떤 확장자도 있다는 것을 기억하도록 하라.

마지막 명령은, 앞에서도 설명했듯이, 그저 새롭게 만들어진 PostScript 파일에 대해서 ghostview 실행하는 것이다. 단지 약간의 차이는 vim 계속 사용하면서 Ghostview 사용하도록 백그라운드에서 실행시킨 것이다. 앞의 명령들은 화면 가득 출력 결과(잠재적인 에러들) 내보내기 때문에, 백그라운드로 실행시키지 않았다.

입력 매크로를 다루기 전에 마지막으로 명령 매크로 셋을 살펴 보기로 하자. 예제 셋은 편집 어셈블러를 위한 것이다:

-----------------------

" 다음은 nasm을 실행시킨다
map             ,n              :w:!nasm -f elf %
" 그리고 ld를 실행시킨다
map             ,l              :w:!ld -s -o %< %<.o
" 그리고 실행 가능 파일을 실행시킨다.
map             ,r              :w:!%<
" 또는 한 번에 이 전부를 다 한다.
map             ,a              ,n,l,r

----------------------

이들 파일에서도 역시 커맨트를 사용할 있다는 것을 잊지 않도록 하라. 예제로 사용하고 싶은 매크로는 가장 마지막 것이다. LaTeX 예제를 설명하기 전에 가지를 확인하고 넘어가도록 하자. 앞에서 내가 이렇게 매크로로 정의된 모든 명령들은 하나로 실행될 있다고 이야기 것을 기억하는가? 아주 간단하게 여러 개의 명령을 하나의 명령으로 만들 있다. 매크로 (앞에서 예로 들었던 나의 ~/.vimrc 안에서 참조된 ~/.vim-files/.vimrc.asm 파일에 포함되어 있다) 있는 ",a" 매크로는 앞에 있는 개의 매크로를 순서대로 실행한다. ,n,l,r 입력하는 대신에 ,a 입력함으로써 여러 개의 키를 누르지 않아도 된다. 얼마나 간편한 방법인가?

명령 모드 매크로를 정말 간편하게 사용하는 법까지 보여 주었으니 이제 다음 단계(마지막 단계) 넘어 가도록 하자.

:::입력 모드 매크로:::

입력 모드 매크로는 명령 모드 매크로와 매우 밀접하게 연관되어 있으면서도, 약간의 차이를 가지고 있다. 이제 개의 예제를 살펴보도록 하자. 이번에 보게   예제는 나의 C 매크로 파일이다:

-----------------------

map!    ]if     if () {^[o}^[keei
map!    ]for    for () {^[o}^[keei
map!    ]while  while () {^[o}^[keei
map!    ]inc    #include <.h>^[hhi

-----------------------

이들 입력 모드 매크로는 아마도 풀기 어려운 암호처럼 보일 것이다. 이들 일부는 어느 정도 의미를 쉽게 있겠지만, 여러분이 그저 매크로들의 의미를 한번만 보고도 알아낸다면 매우 놀라운 일일 것이다.

가지 반복해야 중요한 점은 이들 매크로들 모두가 실제 입력 모드 상에서 입력되어야 한다는 것이다. 예를 들어, 만일 내가 입력 모드에서 "]if"라고 넣는다면, 첫번째 매크로가 실행될 것이다. 마찬가지로, "]ifa"라고 넣으면 첫번째 매크로가 실행된 다음 커서가 위치한 곳에 "a" 입력되어질 것이다. 그렇기 때문에, 실제로 입력할 같지 않은 것을 선택해서 매크로를 정의하는 것이 중요하다. 그렇지 않으면, 특정 키를 입력할 때마다 정의된 매크로가 실행될 것이기 때문이다. 이런 이유 때문에 내가 정의한 매크로들이 "]" 기호로 시작한다. "]" 배열을 정의할 때를 제외하고는 C 언어로 작업할 거의 쓰이지 않고 다음에 "if", "for" 등의 단어가 오는 경우가 거의 없으므로 매크로를 정의하는 데에는 적격이다. 그리고 또한 이렇게 매크로를 정의하면 기억하기가 쉬우므로, 생각엔 이렇게 매크로를 정의하는 방법은 아주 좋은 예가 것이다.

여러분들이 눈치챘을 모르지만, 이제 이상 매크로를 정의하는 "map"이란 키워드를 사용하지 않고, 대신 "map!" 사용한다. 이것이 바로 입력 모드 매크로를 정의하는 방법이다. 나는 대개 입력 모드 매크로를 명령 모드 매크로와 분리된 섹션에 두어서 .vimrc 파일을 뒤죽박죽 되지 않도록 한다. 그렇게 해야 나중에 .vimrc 파일을 내게 맞도록 정리할 있기 때문이다.

좋다, 이제 이들 매크로가 어떤 일을 하는지 알아 보기로 하자. 명령 모드 매크로와 매우 비슷하게, 기본적으로 우리가 누르고 싶은 키가 어떤 것인지를 생각하면 된다. 다만 입력 모드에서 시작한다는 사실만 추가로 기억하면서. 여러분이 이들 매크로가 무엇을 하는지 모르는 경우를 대비해서, 먼저 이들 각각의 매크로가 하는 일부터 설명하기로 하겠다. 처음에 있는 개의 기본적인 매크로는 문법적으로 올바른 if/for/while 루프를 빠르게 만들어 낸다. 마지막에 있는 매크로는 파일을 포함시키기(including) 위한 단축 키이다. 이들 매크로가 어떻게 작용하는지 보게 것이다.

우선 첫번째 매크로를 보기로 하자. 우리는 소스 코드를 편집하고 있으며 이들 매크로의 정의에 이미 source 명령이 적용되었다고 가정하자. 나는 입력 모드에 있고 if 문을 시작하려고 한다. 일반적인 경우, 나는 다음과 같은 문장을 입력해서 시작하려고 것이다:

-----------------------

        if (a <=

-----------------------

하지만 여기서의 문제는, 내가 이미 if 문을 쓰기로 결정했지만, 문법을 올바르게 따르기 위해서 루프를 닫는 것을 기억하느라 if 안에서 실행되어질 프로세스에 온전히 집중할 없다는 것이다. 사실, if 문을 닫는 것은 프로그램 블록으로 보면 가장 첫번째 일이지만, 일반적인 입력 방법에서는 가장 마지막 일이 된다. 만일 기본적인 if 문을 먼저 입력해 넣어서 문법적으로 올바르게 다음에 if 안에 적절한 문장을 채워 넣을 있는 방법이 있다면, 지금 당장 실행해 보겠는가?

아마도 여러분은 그러겠다고 대답할 것이다. 사실, 우리가 지금 하려고 하는 것이 바로 그것이다. 우리는 그런 단계를 매우 적은 수의 키를 누름으로써 있다( 보게 것이다). 문법적으로 올바른 if 문은 다음과 같다:

-----------------------

        if () {
                            
        }

----------------------

여기서 <조건(condition)> <프로그램 > 하고자 하는 작업에 따라 달라진다. 그래서 우선은 이것이 입력되기를 원한다:

----------------

        if () {
        }

----------------

그런 다음 특별한 if 문에 넣고 싶은 조건을 생각한다. 이렇게 해서, 문제점을 해결했다. 다음엔 내가 정의한 매크로가 어떻게 우리가 원하는 바를 해내는 보게 것이다.

이제 여러분은 입력 모드 매크로가 어떤 일을 하는지 알고 있으므로 거의 설명할 것이 없다. 사실, 첫번째 라인에서 "if () {"라는 부분은 매우 간단하다. 우리가 입력 모드에 있기 때문에, 부분은 파일에 "if () {" 입력한다. 다음 부분이 문제이다. 커서를 다음 라인으로 내리고 if 문을 닫는 "}" 입력한 다음에 커서를 다시 번째 괄호의 처음에 두고 다시 입력 모드로 돌아가야 한다(입력 모드에서 시작했으니, 입력 모드로 끝나야 한다. 명령 모드 매크로에서도 마찬가지였다). 실제, 다음 라인으로 가는 방법에는 가지가 있다.

가지는 상당히 쉽고, 다른 하나는 약간 어렵지만 보다 실제로 사용할 있는 것이다. "상당히 쉬운" 방법은 엔터를 누른 다음 닫는 괄호를 입력하는 것이다. 하지만, 나는 다른 방법을 좋아하는데 보다 실제로 사용할 있기 때문이다. 방법은 입력 모드를 벗어나서 탈출해서(그렇다, 명령 모드로 들어간다), vi 명령인 "o" 입력 모드에서 라인을 시작한 다음 닫는 괄호를 입력한다. 그런데, 매크로에 <Esc> 문자로 넣으려면 어떻게 해야 하는가?  유일한 방법은 입력 모드에서 CTRL-V 누른 다음 <Esc> 키를 누르는 것이다. 그렇게 하면 ^[ 같은 개의 문자가 만들어지지만 단순히 문자를 입력한 것과는 같지 않다(만일 문자를 단순히 입력하면 if 끝에 ")^[" 나타나는 것을 보게 것이다].

좋다, 이제 우리는 모든 문자들이 자리에 들어가게 했는데 아직 가지 해결해야 것이 있다 괄호 사이에 커서를 위치시키는 (실제로 번째 괄호의 처음에) 입력 모드로 끝내는 것까지 해야 한다.

우선, 이제까지 우리가 것과 어느 위치에 있는지를 기억하자. 다음은 우리가 이제까지 것을 보여주고 있다:

-------------------

        if () {
        }_
 
        ---INSERT---

-------------------
(밑줄은 커서의 현재 위치를 보여주고 있다)

이제 우리는 커서를 원하는 위치에 것이다. 하지만, 입력 모드에서는 커서를 움직일 있는 방법이 없으므로, 다시 탈출해야 한다. 때문에 다음에 있는 ^[ 필요한 것이다. 이렇게 되면 커서는 바로 번째 줄에 있는 중괄호 위에 위치하게 된다. 그러면 vi 이동 키인 HJKL 이용해서 커서를 라인 위로 올리고 싶게 된다. 경우에 사용할 키는 물론 "k"이다. 이제 커서는 "if" "i" 위에 위치한다 다음에 있는 "단어" 끝에 오도록 커서를 움직여야 한다(여기서의 "단어" 실제 단어가 아니라 개의 괄호지만). 그래서, 커서가 "if" 끝에 오도록 하기 위해서 단어의 끝으로 가라는 명령(e) 내리고 다음에 있는 "단어" 끝에 오도록 다시 e 명령을 내린다. 이제 커서가 바른 위치에 있게 되었다. 하지만 가지 일이 남았다 입력 모드로 돌아 가는 일이 말이다. Vi 사용자라면 "i" 명령으로 명령 모드에서 입력 모드로 돌아 있다는 사실을 누구나 알고 있을 것이다.

사용된 모든 문자들을 모아 보니 다음과 같은 문자열이 되었다:

--------------------

if () {^[o}^]keei

--------------------

위의 예제에서 "if" 끝으로 가기 위해서 "e" 사용하는 대신에 "l" 사용해서 오른쪽으로 있다는 것을 알아챘을 수도 있겠다. 물론 "if" 글자로 단어니까 그럴 있다. for while 관한 매크로를 살펴보게 되면 간단한 이동 키를 사용하는 대신에 "e" 사용했기 때문에 이들 개의 매크로가 거의 유사한 형태를 가지게 되었다는 것을 알게 것이다.

개의 매크로를 살펴 보고 만족했다면(그리고 그것들이 가진 공통점으로 인해서 편안함을 느꼈기를 바라지만 너무 많은 것을 바라는 것인지도 모르겠다), 이제 마지막에 있는 매크로를 분석하도록 하자(이제 방금 훨씬 어려운 것을 했으니 아주 쉬운 일이 것이다).

마지막 매크로는 다음과 같다:

--------------------

map!    ]inc    #include <.h>^[hhi

--------------------

C 프로그래머라면 이것이 파일 이름이 빠져 있다는 것을 제외하면, 헤더 파일을 포함하기 위한 #include 라인과 같다는 것을 쉽게 알아차릴 것이다. 매크로의 이론적 근거는 전체 골격 파일 아이디어를 정당화하는 사용된 것과 유사하다. 기본적으로, 모든 #include되는 파일들은 같은 형식을 따르며, 오직 약간 씩만 다르다(.h 앞에 있는 파일 이름 부분만 다르다). 그래서 다음과 같은 내용을 입력하는 대신에:

-------------------

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <unistd.h>

------------------
(작은 소켓 프로그램 하나를 작성하는 실제로 들어 가는 헤더 파일 목록이다)

나는 다음을 출력해 주는 하나의 매크로를 작성한다.

------------------

#include <.h>

------------------

그런 다음 ".h" 앞에서 입력 모드로 있게 해서, 헤더 파일을 포함시키는 작업을 단순화해서 훨씬 빠르게 일할 있도록 한다.

우리가 해야 일을 분석하기로 하자. 우선, 출력해야 것은 위에서 것이고,  출력한 다음엔 그저 커서를 마침표 위에 위치시킨 다음 입력 모드로 돌아가는 것이다. 내가 말한 것처럼, 방금 것에 비하면 이것은 너무 쉽다.

첫번째 단계는 텍스트만("#include <.h>") 입력하면 되니까 쉽다. 다음엔 커서를 이동하기 위해 입력 모드를 탈출한다("^[",이제 커서는 ">" 있다]. 그런 다음 커서를 왼쪽으로 움직여서("hh") "." 위에 있게 한다. 그리고 마지막으로, 다시 입력 모드로 돌아간다("i"). 작업에 사용된 키를 전부 모아보면?

"#include <.h>^[hhi"이다!!!

훌륭하다! 이제 여러분은 자신에게 맞는 vim 만들기 위한 작업을 시작할 있는 개의 도구를 가지게 것이다. 보다 많은 정보가 필요하다면, 온라인 도움말을 읽어 보거나 여러분 스스로 실험해 보기 바란다. 글에서 다룬 내용 외에도 있는 것들이 무척이나 많지만, 글의 내용을 실험해 보는 것만으로도 여러분은 동안 바쁠 것이다(물론 나도 그럴 것이다). 자신만의 멋진 vim 환경을 만들기 바란다!