본문 바로가기
기타/툴 관련(리눅스)

VIM

by WebHack 2009. 8. 20.

1. VIM

VIM은 Vi IMproved의 약어입니다. 텍스트 편집기로서 유닉스에 있는 'vi'의 대부분의 명령을 지원하며, Vi IMproved가 말해주듯이 많은 새로운 명령들이 추가되었습니다.

1988년 Stevie라는 vi clone 에디터를 Bram (VIM 주 개발자)이 Amiga에 VIM (당시에는 Vi IMitation)이라는 이름으로 포팅하면서 시작되었습니다. IMitation (모방)에서 알 수 있듯이 당시 Amiga 시스템에는 쓸만한 vi가 없었기 때문에 vi의 대부분의 기능을 지원하는 에디터를 Amiga 시스템에서 사용하고자 한 것이 그 출발이었으나, 이후 새로운 기능들이 추가되고, 1992년에 유닉스 시스템으로 포팅하면서 향상된 기능들을 표현하기 위해 Vi IMproved로 바뀌게 되었습니다. 이후 multiple windows (VIM 3.0), GUI (VIM 4.0), Syntax highlighting (Vim 5.0), Folding and multi-languages (VIM 6.0) 등의 굵직굵직한 기능들과 더불어 수많은 기능들이 추가되었으며, VIM의 향상된 기능에 매료된 많은 프로그래머들에 의해 수많은 시스템으로의 포팅이 이루어지게 되었던 것입니다.

확장된 기능들을 열거하면 많은 OS를 지원한다는 것(Amiga, BeOS, Mac, MiNT, MSDOS, Windows 3.1, Windows 95/98/NT, OS/2, Unix, VMS)과 Multi level undo, GUI (Graphical User Interface), Multiple Windows and buffers, Syntax highlighting, Repeat a series of commands, Visual mode, Flexible insert mode, Block operators, Online help system, Command-line editing and history, Command-line completion, Insert-mode completion, Long line support, Text formatting, ... 등등 이루 헤아릴 수 없이 많습니다. 자세한 내용은 vim을 실행후 ':help vim-additions'를 입력해 보시기 바랍니다.

이러한 많은 확장된 기능에도 불구하고 원하신다면 VIM을 vi 호환 모드로 실행하실 수 있습니다. 그 경우 VIM은 가능한한 vi와 거의 유사하게 동작합니다. vi의 버그조차도 그대로 구현합니다.

한글 입출력도 잘 지원합니다. Console version의 경우 hanterm, Eterm (XIM) 등을 이용하여 한글 입력이 가능하고, GUI 버전의 경우에는 자체 한글 입력 기능이 있으며, XIM을 사용하여 한글을 입력하실 수도 있습니다. Linux의 경우 현재 ami, HanIM등의 XIM을 사용할 수 있는 데, 이 경우 한자, 특수문자, 일본어 등도 입력할 수 있으므로 자체 한글 입력 기능보다는 XIM을 이용하시라고 권하고 싶습니다.

 

2. 빔 대표적인 기능들
vi와 99.9% 호환 모드 지원 
VIM을 vi처럼 사용하고자 하는 사용자를 위한 모드로서 vi의 버그조차도 그대로 흉내를 냅니다.
다단계 반복(redo)/취소(undo) 기능
다수의 화면분할 및 버퍼 기능
화면분할은 수직/수평 모두 가능
비주얼 모드 지원
텍스트를 비주얼하게 선택하여 복사나 삭제 등 여러 가지 작업을 수행할 수 있으며, 사각형 형태로 선택할 수도 있습니다.
명령행 라인의 편집 및 이력(history) 기능
이전에 입력했던 명령을 불러와서 편집 및 재실행할 수 있다.
명령행 라인 완성(completion) 기능
명령어나 파일명 등을 일부만 입력한 후에 자동으로 완성시키는 기능
텍스트 형식화(formatting)
주어진 옵션에 따라 텍스트 혹은 프로그램 소스 코드/코멘트 등의 형식을 자동으로 바꿀 수 있다.
입력모드에서의 단어/라인 완성 기능
단어 혹은 라인의 일부만 입력한 후에 현재 파일이나 태그 파일 혹은 사전 파일등에서 단어/라인을 찾아서 자동으로 완성시킬 수 있다.
자동명령: 파일명 혹은 이벤트에 따라 명령 실행
특정 파일을 열 때 혹은 특정 이벤트 발생시 자동으로 원하는 명령을 실행할 수 있다.
그래픽 사용자 인터페이스
메뉴, 도구막대, 대화상자 등
매크로 기록 기능
반복적인 작업이 필요한 경우 작업을 한 번 수행하면서 그 내용을 기록하여 간단하게 해당 작업을 반복할 수 있다.
서로 다른 많은 시스템에서 동일한 기능/환경 제공
확장된 내장 스크립트 언어 제공
태그 기능을 이용한 온라인 매뉴얼
한글을 포함한 여러 언어 지원
1바이트를 사용하는 영어, 유럽의 여러 가지 언어등과 여러 바이트를 사용하는 한글, 중국어, 일본어 등을 지원하며, 심지어는 오른쪽에서 왼쪽으로 입력을 해나가는 히브리어 같은 언어도 지원한다.
플러그인 기능
explorer 기능이나 network을 통한 파일 편집 등을 이 플러그인 기능을 이용하고 있다.
폴딩 기능
소스코드/문서의 일부분을 접거나 펴서 작업을 할 수 있으므로 한 화면에서 전체 구조를 보면서 작업이 가능
함수, 변수 등을 여러 소스코드에서 찾는 기능
200 가지 이상의 언어에 대한 문법 강조 (syntax highlighting) 기능
빠른 보완(quickfix) 모드
소스코드의 편집-컴파일-수정 단계를 빠르게 진행할 수 있음
많은 언어에 대한 자동 들여쓰기 (auto-indenting) 기능
기타 모두 다 열거할 수 없을 정도의 수많은 기능들

 

3. VIM 시작

당신이 vim을 처음 사용해 보신다면 일단 vim을 실행시켜보십시오. 초기화면을 보실 수 있을 것이고 거기에는 Vim의 버전, 종료하는 방법, 온라인 도움말을 보는 방법 등이 보일 것입니다. 이제 ':help'를 입력해 보시기 바랍니다. 따옴표 사이의 :help 입력 후 ENTER key를 누르시면 되겠습니다. hklj 키들에 대한 도움말, 창을 닫는 법, Vim을 종료하는 법등이 영어로 쓰여진 도움말 화면이 뜰 것입니다. 영어에 익숙치 않으시더라도 끈기를 가지고 읽어보시기 바랍니다. 어느덧 무리없이 도움말 페이지를 보고 있는 자기자신을 발견하실 수 있게 될 것입니다.

도움말 페이지는 초보자가 보기에는 너무 어려울 수 있습니다. Vim은 초보자를 위해 훌륭한 프로그램을 포함하고 있는 데, 그것은 'vimtutor'라는 초보자 교육 프로그램입니다. 일단 'vimtutor'를 실행한 후 한 문장 한 문장 읽어가면서 그대로 따라해 보시기 바랍니다. 그러면 당신은 Vim을 사용하여 텍스트 파일을 열어서 문자열를 삽입하거나 지우거나 수정한 후 그 바뀐 내용을 저장할 수 있는 기본적인 능력을 가지게 될 것입니다.

 

4. 빔 기능

TAG 기능
PATH 기능
치환 (substitute)
찾기 (grep/quickfix/search)
filetype과 auto command
파일이름 수정 (filename modifier)
match pair
반복 작업 (multiple repeat)
script (command line)

 

4.1 TAG 기능

VIM에서 <F1> 혹은 ':help<CR>'을 입력해 보셨습니까? VIM의 도움말은 바로 이 tag 기능으로 구현되어 있습니다. 물론 C와 같은 language programming을 하실 줄 아는 분들은 tag 기능에 대해 잘 아시리라 생각합니다. 특정 keyword (가령 함수명이나 상수명)위에서 <C-]> 를 치면 그 keyword가 선언된 곳으로 이동되는 기능입니다.

VIM의 경우 'ctags'라는 프로그램과 잘 어울립니다. 특정 프로그램을 분석해 보고자 한다면 이 tag 기능이 많은 도움을 드릴 것입니다. 기본적인 'ctags' 사용법은 간단합니다.
 
  ctags *.c *.h 
그 러면 현재 디렉토리에 tags라는 파일이 만들어집니다. vi나 vim은 바로 이 tags 파일에서 해당 keyword를 찾아서 tags 파일이 지정한 곳으로 이동하는 것입니다. 직접 tags file의 내부를 들여다 보시기 바랍니다. vi에서 search 기능 (/ 혹은 ?)을 사용할 줄 아시는 분은 tags 파일이 keyword와 그 keyword가 선언된 파일명, 그리고 그 keyword를 찾을 수 있는 search 패턴 혹은 line 번호를 가지고 있음을 보실 수 있을 겁니다.

VIM은 tag에 대해서도 여러 가지 기능들을 제공합니다. 여러 tag 파일들을 동시에 참조할 수 있습니다.
 
  :set tags=./tags,../include/tags,/usr/include/tags 
이 렇게 하시면 사용자가 <C-]>를 입력한 곳의 keyword를 위의 세 tags 파일에서 순서대로 search합니다. vim을 띄울 때마다 위의 명령을 입력하는 것은 힘든 일이죠. 그렇다고 ~/.vimrc에 넣어놓자니 작업할 directory마다 위의 설정값이 틀릴 수 있는 일이고... 작업할 directory에 .vimrc 파일을 만들어 위의 line을 넣어놓으시면 됩니다. vim은 실행되면 home의 .vimrc를 읽은 후에 현재 directory의 .vimrc를 읽게 됩니다. 물론 그 사이에는 더 많은 일들이 벌어지지만요. 이 이상의 설명은 이 섹션의 범위를 벗어나므로 생략합니다. 만일 vim이 현재 directory의 .vimrc를 읽지 않는 것 같다면 ':set all' 하셔서 noexrc가 설정되어 있는 지 확인해 보시기 바랍니다. exrc 이어야 local 디렉토리의 .vimrc를 읽습니다. 만일 noexrc라면 ~/.vimrc에서 ':set noexrc' 라는 line이 있을 가능성이 있습니다. ':set exrc'를 ~/.vimrc에 넣어놓으십시오.

같은 keyword에 대해 여러 곳에서 선언된 경우에는 가끔
 
  tag 1 of 2 or more 
과 같은 메시지가 뜨는 것을 보실 수 있을 겁니다. 이것은 해당 keyword에 대한 tag가 여러개 있다는 의미입니다. 그 keyword 위에서 g] 를 입력해 보십시오. VIM은 tag list를 나열한 후 선택할 수 있도록 해 줍니다.

C-]만 사용할 수 있는 것은 아닙니다. 현재 cursor 위치가 찾고 싶은 keyword 위에 없는 경우에는?
 
  :ta keyword
  :tj keyword 
좀더 자세한 사항을 알고 싶으면?
 
  :help tags
  :help g]
  :help :tjump
  :help :sts
  :help :tn 
반드시 :help tags를 해서 대충이라도 읽어보시기 바랍니다. 여기에서 설명해 드리지 않은 많은 유용한 명령들이 거기에 있습니다.

 

4.2 PATH 기능

path variable에 대해 모르십니까? 지금 vim을 띄우신 후 곧바로
 
  :set path<CR> 
path=.... 형식으로 출력되는 게 보일 것입니다. 앞 섹션에서 set tags= 을 설정했던 것처럼 path도 설정해 보세요.


  :set path=.,../include,/usr/include,, 
마지막에 빈 ,, 가 붙는다는 사실을 알아두시고요. 이렇게 해 놓으면 언제 사용되느냐 하면 filename 위에서 gf 를 입력하면 설정된 path list에서 해당 파일을 찾아서 열어줍니다.

가령 a.c라는 C source가
 
  #include <stdio.h> 
라는 라인을 포함하고 있다면 stdio.h 위에서 gf 를 입력하시면 아마도 /usr/include/stdio.h 라는 파일을 열어줄 것입니다. 창을 분할해서 보고 싶으시면 <C-W>f 를 입력하시면 됩니다.

VIM은 find 명령도 제공합니다. 지금까지 types.h 파일을 열기 위해
 
  :e /usr/include/sys/types.h 
하셨습니까?
 
  :find sys/types.h 
을 입력해 보십시오. 그러면 VIM은 /usr/include/sys/types.h 파일을 설정된 path list에서 찾아서 열어줄 것입니다.

더 자세한 내용은?
 
  :help :fin
  :help gf
  :help path 

 

4.3 치환 (substitute)

기냥 :s 하는 건 전부 아시겠죠. 그래서! 현재 버퍼 전체에 대한 치환...
 
  :%s/\<dir\>/DIR/g 

위의 내용을 분석해 볼까요?
 
  '%'     : 현재 버퍼(파일)를 의미합니다.
  s       : substitute
  \<dir\> : dir이라는 단어를 찾음.
            dir 앞뒤의 \< 와  \>는 단어를 의미합니다.
            dirx 혹은 adir은 않찾습니다.
            ' dir ' 혹은 ' dir.' 등과 같이 앞뒤로 alphabet같은
            게 없는 것만 찾습니다.
  DIR     : 바꿀 문자열
  g       : 이게 없으면 매 라인의 첫번째 match되는 단어만 찾습니다. 
어떤 파일의 내용이
 
  adir dir dirx dir 
이었다면
 
  :%s/dir/DIR/g      ===> aDIR DIR DIRx DIR
  :%s/dir/DIR/       ===> aDIR dir dirx dir
  :%s/\<dir\>/DIR/g  ===> adir DIR dirx DIR
  :%s/\<dir\>/DIR/   ===> adir DIR dirx dir 
이와 같이 바뀌게 됩니다.

바꿀 것인지를 확인받고 싶다면? 마지막의 c (confirm)를 사용하시면 됩니다.
 
  :%s/dir/DIR/cg
  :%s/\<dir\>/DIR/gc 

도움말이 필요하시면 언제든지
 
  :help substitute 

 

4.4. 찾기 (grep/quickfix/search)

여러 파일에서 특정한 단어를 찾고자 할 때 어떻게 하세요?
 
  :q
  grep fancy *.c
  vim c_src_which_include_fancy.c 
지금까지 이렇게 하셨습니까?
VIM 사용자라면 그냥 VIM안에서 다음과 같이 하면 됩니다.
 
  :grep word *.c
  :cl
  :cc 3 
VIM에는 quickfix mode라는 게 있습니다. (:help quickfix :help :grep)
 
  :cl  :cc  :cn  :cp  ... 
command line에서 make 같은 걸 하면 화면에 흘러가는 에러메시지를 하나씩 보면서 vim err발생파일.c :error-line change... 해야겠지만 quickfix mode는 error 발생 file열고 에러라인으로 가는 작업을 자동으로 해줍니다. 사용자는 수정만 하면 됩니다 (VIM안에서 :make).. 이건 software 담당자들만의 일은 아닙니다. quickfix mode는 어떤 경우의 compile/parse에도 사용할 수 있습니다. 위의 grep의 경우처럼... 이를 위해 해주어야 할 일은 도움말은 보시면 알겠지만 makeprg, errorformat을 설정해 주시면 됩니다 (:grep은 grepprg, grepformat이지만 unix에는 신경쓰지 않아도 됨).
가령 :set makeprg=latex 하고, ex.tex 파일을 작성후 :make 하면 'latex ex.tex'이 수행되며, 에러발생시 해당 라인으로 커서를 옮겨줍니다. VIM이 error format을 인식하지 못하는 경우에 :set errorformat=어쩌고저쩌고... 설정해 주면 됩니다.

참고로 이 페이지는 docbook 3.1을 이용하여 sgml문서를 html 문서로 변환하는 데, 이 역시 저는 make를 이용합니다. jade로 *.sgml 문서를 compile하게 되는 데,
    set errorformat=jade:../%f:%l:%c:E:\ %m
으로 설정해 봤는 데, 일단은 에러 발생시 VIM이 에러난 곳으로 잘 찾아가네요.

이 기능이 grep과 결합하여 :grep word *.c 하면 quickfix mode를 그대로 사용할 수 있습니다. 다음과 같은 mapping을 ~/.vimrc에 추가해 놓고 찾고 싶은 단어위에서 ,gc 만 입력해도 자동으로 되겠죠?
 
  let $grepfile="*.[ch]"
  nmap ,gc  :grep "<cword>" $grepfile 
나는 *.v를 찾고 싶다고요. 작업 다렉토리에 .vimrc file을 만들고
 
  let $grepfile="*.v" 
즉, ~/.vimrc에 일단 기본적인 걸 추가해 놓고 작업 directory마다 특성에 맞게 $grepfile만 설정해 주면...
위에 '<cword>' 라는 게 있는 데...
 
  :help <cword> 
특정 단어를 포함하고 있는 라인을 찾고 싶다?
 
  :help include-search 
이제 파일은 하나 열어서 특정 단어 위에서 다음 명령들을 한 번씩 입력해 보세요.
 
  [i : 현재 파일에서 cursor 위치의 단어를 포함한 첫번째 줄을 보여주!
  ]i : 현재 위치 뒤에서 커서 위치의 단어를 포함한 첫번째 줄
  [I : 파일 전체에서 커서위치의 단어를 포함하고 있는 모든 줄
  ]I : 현재 위치 뒤에서 포함하는 모든 줄...
  [ CTRL-I : jump (위에 것과 유추해서 해석해 주세요)
  ] CTRL-I : jump 
기타 수도 없이 많사옵니다! 다시 한번
 
  :help include-search 

 

4.5 filetype과 auto command

여기 내용과 관련된 몇몇 도움말 페이지를 미리 소개하면:
 
  :help filetype
  :help autocommand
  :help autocmd-filetypes
  :help myfiletypefile 
지금 vim file.x<CR> 하신 후에 :set ft<CR> 해 보시기 바랍니다. (<CR>은 enter key)

filetype=xxx 라고 뜨죠? VIM은 현재 버퍼에 대해 filetype에 의해 다르게 동작합니다. filetype.vim 이라는 file이 /usr/share/vim/... 혹은 /usr/local/share/vim/... 밑에 보면 있을 겁니다.

그런데, VIM이 이해 못하는 파일이 있거나 잘못 이해하는 파일이 있다면? 제 거를 가지고 설명드리면...
~/.vimrc file에 다음을 추가합니다.
 
  let myfiletypefile=$HOME."/.vim/filetype.vim"
  filetype on 
그리고 ~/.vim/filetype.vim file을 만들어서 가령 다음과 같이 입력합니다.
 
  augroup my_filetype
    au!
    au BufNewFile,BufRead $HOME/.mail/*   set ft=mail
    au BufNewFile,BufRead *.x,*.acc       set ft=c
  augroup END 
위의 경우 *.x나 *.acc 파일을 C file로 인식하라고 VIM에게 알려줍니다. ~/.mail 밑에 있는 모든 파일은 mail folder로 인식하도록 하고요.

위에서는 기존에 VIM이 알고 있는 filetype을 그대로 이용합니다. 즉, mail이나 c 같은 filetype은 VIM이 이미 알고 있습니다. 나만의 filetype을 설정할 수도 있지만 그럼 해야 될 일이 너무 많을 것으로 생각하며, 웬만한 filetype은 VIM이 이미 지원하고 있으므로 새로운 filetype의 지정은 일반적으로 필요치 않다고 생각합니다.

현재 내가 ~/work/prj/src 에서 작업중이고 ~/work/prj/commercial-pkg와 물려서 작업이 이루어 지는 데, commercial-pkg는 코딩스타일이 나와 틀려서 vim에서 파일을 열면 이상하게 보인다... vim이 내 거와 남에 거를 구분하면 좋겄다! 대표적인 게 tabstop이 될 것입니다.

~/work/prj/src/.vimrc 파일을 만들어 다음을 추가합니다.
 
  set ts=8 sts=4 sw=4
  au BufEnter */work/prj/commercial-pkg/* :set ts=8 sts=8 sw=8
  au BufLeave */work/prj/commercial-pkg/* :set ts=8 sts=4 sw=4 
이 경우 내가 작업하는 파일들은 tabstop=8 softtabstop=4 shiftwidth=4 이고, commercial-pkg는 ts=8 sts=8 sw=8를 사용하게 되겠습니다. BufEnter, BufLeave는 이름 자체가 설명이 필요없을 정도로 명쾌하죠?
이런 식으로 특정 파일을 열고 닫을 때, 특수한 작업을 수행할 수가 있습니다.

언제든지 궁금할 때, 자세히 알고 싶을 때는, 도움말 페이지...
 
  :help filetype
  :help autocommand
  :help autocmd-filetypes
  :help myfiletypefile

4.6 파일이름 수정 (filename modifier)

파일명을 바꾸는 것이 아닙니다. 현재 버퍼의 이름으로부터 다른 파일명을 얻어온다든지 하는 기능을 의미합니다.

VIM에서 현재 directory에 없는 파일의 경우 filename 앞에 path가 붙어서 표시됩니다. 현재 directory의 파일은 파일이름만 표시되지요.

현재 directory가 ~/work/pjt/core/src 였고, 거기에서 특정 문자열에서 tagging을 하였더니
 
  ~/work/pjt/app/networking/sources/net.c 
라는 파일이 열렸습니다. 그 파일에서 이것저것 하다 보니까
 
  ~/work/pjt/app/networking/sources/bind.c 
파일은 열고 싶습니다.

어떻게 하세요?
 
  :q
  cd ~/work/pjt/app/networking/sources
  vim bind.c 
혹은 그냥 그 vim 안에서
 
  :e ~/work/pjt/app/networking/sources/bind.c
  :e ../../app/networking/sources/bind.c 
이렇게 하시지 않으셨습니까?

여기 새로운 방법이 있습니다. 현재 버퍼의 파일명에서 path를 추출해서 사용하는 방법인 데, 현재 창의 파일이
 
  ~/work/pjt/app/networking/sources/net.c 
이라면
 
  :e %:p:h/bind.c 
이걸 풀어보면
 
  %  : 현재 버퍼의 파일명
  :p : full path로 바꿈 (filename이 path가 없는 경우)
  :h : 마지막 잘라냄 ('/net.c' 가 없어짐) 
위의 경우처럼 버퍼의 파일이 이미 path를 포함하고 있는 경우에는
 
  :e %:h/bind.c 
만 해도 됩니다.

만일 ~/work/pjt/app/networking/common/common.h 를 열고 싶다면?
 
  :e %:h:h/common/common.h 
':h' 를 % 에 대해 두번 수행하니까 '/sources/net.c' 가 없어지고 '/common/common.h' 를 붙이는 거죠!
여기에서 도움말을 보는 법은?
 
  :help filename-modifiers
  :help _% 
기타 :~ :. :t :r :e 등등 filename을 조작할 수 있는 명령이 많이 있으니 한번 보시기 바랍니다.

4.6 match pair

C 에서 ( 나 ) 위에서 % 를 입력하면 match되는 다른 걸로 커서가 옮겨가는 거는 아시겠지요?
 
  :help matchpair 
VIM에서는 이 matchpair가 기본적으로는 (), {}, [] 로 설정되어 있습니다.
 
  :set mps 
이것은 C의 기본적인 token 들이죠. 그런데, <> 에 대해서도 %로 왔다갔다 하고 싶다면?
 
  :set mps+=<:> 
좌우가 다른 어떤 종류의 matchpair의 설정이 가능합니다.
 
  :set mps+=!:* 
설정값을 없애려면?
 
  :set mps-=!:* 
C file에서는 '#if' 관련 directive에서도 % 가 동작한다는 걸 아십니까?
 
  #ifdef XXX
  # ifndef YYY
  ..........
  # endif
  #else
  ...
  #endif 
'#' 위에서 %를 입력하면서 커서의 움직임을 보시기 바랍니다.
'#' directive를 찾는 또 다른 방법은 {# 혹은 }# 입니다.
{{ 혹은 }} 이 함수의 시작 위치로 가는 것은 아시겠죠?

 

4.7 MATCH ENHANCEMENTS

Benji Fisher의 홈에 가시면 matchit.vim 이라는 macro를 만날 수 있습니다. 이 파일을 받아다가 ~/
.vimrc에서
 
  source ~/.vim/matchit.vim 
을 추가하시면 어떤 keyword에 대한 matchpair도 사용할 수 있게 됩니다. 가령 shell script에서는 if else fi 사이를, 그리고 html file에서는 <body> </body> 와 같은 형태 ... 등등등...

저의 경우 .vimrc에 Makefile 관련된 기능을 추가해서 사용하고 있습니다.
 
  aug xxx
    au!

    " GNU Makefile
    au FileType make let b:match_words=
    \ '\<ifeq\>\|\<ifneq\>\|\<ifdef\>\|\<ifndef\>,\<else\>,\<endif\>'
  aug END 

 

4.8 반복 작업 (multiple repeat)

:g 라는 게 있습니다. global의 약자라고 느껴지십니까? 다음과 같이 하면
 
  :g/^#/d 
현재 버퍼 전체에서 # 으로 시작하는 라인이 지워집니다.

(참고:)이런 작업을 하려면 regexp (regular expression)에 익숙해지시는 게 좋은 데, regexp에서 '^' 은 라인의 처음 '$'는 라인의 끝을 의미합니다.

위의 참고로부터 다음을 쉽게 이해할 수 있을 것입니다.
 
  :g/^$/d 
라인의 처음과 끝사이에 아무것도 없으면 지워라. 그러므로 빈줄을 지워라...

파일이 다음과 같은 때
 
  # namsh
  addr: nam, 222-12345, suwon
  # nanin
  addr: nan 333-45678, anyang
  # nunin
  addr: nun 123-65432, seoul 
전화번호 뒤를 모두 지우고 싶다면 어떻게 하시나요?

무슥한 vi 사용자라면? (아! 울고싶어라)
 
  jllllllllllllllxxxxxxxxxxx  ... 반복 
VI의 기본 명령을 아시는 분이라면?
 
  j02f,Djj02f,D   ... 반복 
VIM의 repetition 기능을 아시는 분이라면? (:help complex-repeat)
 
  qw/^addr:<CR>02f,Dq@w@w10@w100@w  ... 
만일 당신이 VI expert라면? 아마도 이렇게...
 
  :g/^addr:/norm 02f,D 
현 재 버퍼에서 addr: 으로 시작하는 라인을 찾아서 normal 명령을 수행하는 데, normal 명령은 02f,D 이다. 잘 이해가 않가는 분은 위의 몇줄을 파일로 저장후 그 파일에서 한번 해 보세요. '02f,D'를 모르시는 분은 위의 addr로 시작하는 줄에 가셔서 커서를 중간쯤에 위치시켜놓고 02f,D 를 천천히 입력도 해 보시고요...

그래도 이해가 않가시면...
      0    : 라인 첫 컬럼으로 이동  (^ 는 공백이 아닌 첫문자로 이동이죠?)
      2f,  : f, 를 두번 수행 (f 는 forward search)
      D    : cursor 위치로부터 라인끝까지 삭제

위에서 norm 은 ':' 즉 command line에서 normal 명령을 수행할 때 사용합니다. 현재 위치에서 'dd'는 현재 줄을 지우죠? ':normal dd' (norm은 normal의 약어)해도 똑같습니다. 지금 해보세요.
:g! 과 :v 도 있습니다.
 
  :help multi-repeat
  :help :g 

 

4.9 script (command line)

현재 디렉토리에 있는 모든 C source file에서 OLD_string이라는 `단어'를 찾아서 NEW_string으로 바꾸고 싶습니다. 다음 내용을 vim.scr 이란 파일로 저장합니다.
 
  :%s,\<OLD_string\>,NEW_string,g
  :wq 
borne shell prompt에서 다음과 같이 하시면 됩니다.
 
  for i in *.c *.h; do vim -s vim.scr $i; done 
C shell을 쓰시는 분은
    foreach ... 어쩌고 저쩌고...

VIM 도움말 페이지를 열심히 뒤져 보면 'vim *.c *.h' 한 후에 vim 안에서 모든 버퍼에 대해 위의 동작을 수행할 수 있다는 내용도 들어있습니다. 궁금하신 분들은 지금부터 VIM 도움말 페이지를 열심히 surfing 하시기를...

5. 빔 팁

Preface
이 문서는 여러 곳에서 - 특히 VIM developer's mailing list - 얻은 VIM에 대한 여러 정보를 모아놓은 것입니다. 자세한 설명을 기대하지는 마시기 바랍니다. 여기 있는 내용을 이해하기 어려우신 분들은 VIM tutor directory에 가셔서 tutorial을 먼저 섭렵하시기 바랍니다. VIM help page는 방대한 양의 정보를 제공합니다. 시간나는 데로 help page를 보면 조금씩 내공이 쌓이는 걸 느끼게 될 겁니다.
 
Warning   
저 는 항상 VIM의 가장 최근 버젼을 사용하고 있으므로 이 문서는 저도 모르는 사이에 구버젼의 VIM에서는 동작하지 않는 기능을 포함할 수도 있습니다. 이 문서의 내용을 이해할 수 없는 분은 VI reference guide 및 VI FAQ를 먼저 보시길 바라며, VIM의 도움말도 한번쯤 읽어보시기 바랍니다.  

 

간단한 팁들

 

1. 작업한 문서를 빔 안에서 바로 ftp로 remote host로 보내기
본인의 경우 localhost에서 문서 작업을 한 후 KLDP로 문서를 복사하는 데, 다음과 같이 하면 아주 편하다.
 
  nmap _ftp :call SendFTP("kldp")<cr>
  com! -nargs=1 FTP call SendFTP(<q-args>)

  func! SendFTP(host)
    if a:host == "kldp"
      " host specific setting
      let h = "kldp.org"
      let p = "/home/namsh/some_where/documents/"
      let u = "namsh"
      let w = "my_password"
    else
      echo "Unknown host '".a:host."'"
      return
    endif

    let t = input("하위 디렉토리? ")
    let f = input("파일명? ")

    " 다른 사람이 비밀번호 못보게 silent 기능 사용
    if filereadable(f)
      echo "\nncftpput ftp://".h.p.t." ".f
      silent! exec "!ncftpput -u ".u." -p ".w." -z ".h." ".p.t." ".f
    else
      echo "Cannot read a '".f."'"
    endif
  endfunc 
위 의 기능은 빔 6.0의 silent 기능을 이용하고 있다. 집에서 혼자 작업하는 경우에는 silent 기능은 필요없으므로 5.x 사용자의 경우에는 "silent!"을 삭제하고 사용할 수 있다. 물론 위의 code를 포함하는 vimrc는 본인만 쓰고 읽을 수 있도록 퍼미션을 변경하는 것은 필수!

위에서 사용하고 있는 ncftpput은 ncftp 3.0에 들어있는 프로그램입니다.
"com! -nargs.." 에 대해 잘 모르시는 분은
 
  :help command<cr> 
해 보시기 바랍니다. 위 예제의 경우 다음과 같이 하면 normal mode에서 "_ftp" 입력한 것과 같게 됩니다. "<cr>"는 ENTER key를 의미합니다.
 
  :FTP kldp<cr> 

 

2. VIM으로 매뉴얼 페이지를 보자. man 명령은 너무 불편해!
다음을 vimpager.sh로 저장한다.
 
  #!/bin/sh
  if test $# = 0; then
      col -b \
      | tail -n +4 \
      | gvim -n -c 'set ft=man' -c 'map q :q<cr>' -c 'set nomod' -
  else
      gvim -n -c 'map q :q<cr>' -R $*
  fi
  exit 0 
환경변수 PAGER를 vimpager.sh로 설정한다. vimpager.sh가 /usr/local/bin에 있고, sh 혹은 bash를 사용한다면
 
  $ export PAGER="/usr/local/bin/vimpager.sh" 
이제 `man vim'을 입력해 보시기 바랍니다.

 

3. 현재 cursor 위치의 문자열을 현재 file안에서 찾아서 한눈에 보고싶다. 또, 원한다면 특정 문자열이 있는 위치로 바로 이동하고 싶다.

다음 mapping을 vimrc file에 추가하고, cursor를 문자열위에 놓은 후 <F4>를 입력. 자세한 사항을 원하면 ':help [I'
 
  nmap <F4> [I:let nr = input("Which one: ")<BAR>
                  \exe "normal " . nr . "[\t"<CR> 

 

4. C/C++ coding시 block을 설정하고, substitution을 하고 싶다.
'viB'는 '{'로 시작해서 '}'로 끝나는 block을 선택한다. 자세한 사항은 ':help text-object'.
 
  viB:s/pattern/subst/ 

 

5. 현재의 gtk+ version의 GVIM은 window size가 변하는 관계로 enlightenment 등의 window manager에서 제공하는 auto placement 기능을 사용하는 경우 화면 밑에 gvim 창이 놓여서 mouse로 옮겨야 하는 불편함이 있는 데, 이를 해결할 수 있는 방법은?

본인은 다음과 같은 auto command를 $HOME/.gvimrc file에 넣어놓고 있습니다. gtk version이고, GUI 실행시 window position을 얻어와서 적절히 조절해 주는 거죠. x/y position은 각자의 스크린 크기 및 gvim 창의 크기에 맞추어 조절해 주셔야 합니다.
 
  if has("gui_gtk")
    augroup my_winpos_au
      au!
      au GUIEnter * let x=getwinposx()
      au GUIEnter * let y=getwinposy()
      au GUIEnter * if x > 560
      au GUIEnter *   let x=560
      au GUIEnter * elseif x < 16
      au GUIEnter *   let x=16
      au GUIEnter * endif
      au GUIEnter * if y > 170
      au GUIEnter *   let y=170
      au GUIEnter * elseif y < 16
      au GUIEnter *   let y=16
      au GUIEnter * endif
      au GUIEnter * exe "winpos " . x y
      au GUIEnter * unlet x y
      au GUIEnter * au! my_winpos_au
    augroup END
  endif 

이것은 vim-5.4o 이후 버젼부터는 필요없습니다. resize 문제가 해결되어서 position이 제대로 놓이기 때문입니다. 단지 auto command에 대한 하나의 예제로서 여기에 존재합니다.

 

6. (ABC)처럼 괄호안에 대문자로만 있는 경우에 대해 괄호를 없애고 싶다.
 
  :smagic/(\(\L*\))/\1/ge 

 

7. 문서를 편집하는 도중 입력모드에서 현재 시간을 넣고 싶다.
 
  inoremap <C-G> <C-R>=strftime("%Y/%m/%d %T")<CR> 

 

8. VIM으로 작업도중 현재 시간을 간단히 알 수 있는 방법은?
 
  nmap ,t :echo strftime("%T")<CR> 

 

9. 문서 내에 빈 라인이 많이 있을 때, 여러 줄의 빈 라인을 한 줄로 바꾸고 싶다.
 
  nmap _B GoZ<Esc>:g/^[ <Tab>]*$/,/[^ <Tab>]/-j<CR>Gdd 

 

10. 특정한 문자로 구분된 field중 7번째와 8번째 사이의 모든 숫자를 0으로 바꾸고 싶다.
 
  :%s/^\(\(.\{-}STR\)\{7}\).\{-}\(STR.*\)$/\10\3/ 


11. 각 field의 구분자를 "STR" 대신 사용하면 된다.

 

12. RCS 관련 기능을 GVIM의 메뉴를 통해 사용하고 싶다?
$HOME/.vimrc 등에 다음을 추가한다.
 
  menu RCS.CheckIn  :w <CR>:!ci -q -u -m\"\" %<CR>:e %<CR>
  menu RCS.CheckOut :!co -q -l %<CR>:e %<CR>
  menu RCS.Lock     :!rcs -q -l %<CR>
  menu RCS.UnLock   :!rcs -q -u %<CR>
  menu RCS.Diff     :!rcsdiff -q -u %<CR>
  menu RCS.Log      :!rlog %<CR> 
실제로 해 보시면 본인만의 메뉴를 만들어 넣으실 수도 있습니당!

 

13. 문자열을 찾는 도중 에러가 발생했는지의 여부를 확인하여 다른 일을 하고 싶다.
 
  let errmsg = ""
  /search_string
  if errmsg == ""
     echo "search_string found!"
  else
     echo "search fail!"
  endif 

 

X terminal에서 16color 사용

 

1. hanterm/xterm에서 VIM으로 16color를 사용하고 싶어요.
일단 hanterm (xf331 version) 혹은 xterm이 16color enable로 compile되어 있어야 합니다. 그리고, $HOME/.vimrc에 다음을 추가합니다.
 
  if has("unix")
    set t_Co=16
    if has("terminfo")
      set t_AF=^[[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{82}%+%;%dm
      set t_AB=^[[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{92}%+%;%dm
    else
      set t_Sf=^[[3%dm
      set t_Sb=^[[4%dm
    endif
  endif 


2. Eterm (Enlightened Terminal)에서 VIM으로 16color를 사용하려면?
Eterm 은 hanterm/xterm 등과는 다른 ANSI(?) sequence를 사용합니다. hanterm/xterm이 아닌 다른 terminal에서 위의 hanterm 관련 color setting이 동작하지 않을 경우에는 다음을 시도해 보시기 바랍니다.
 
  set t_Co=16
  set t_AF=^[[%?%p1%{8}%<%t3%p1%d%e%p1%{22}%+%d;1%;m
  set t_AB=^[[%?%p1%{8}%<%t4%p1%d%e%p1%{32}%+%d;1%;m 

 

3. color를 disable시키고 싶어요!
VIM을 실행시킨 후
 
  :syn off 
혹은 $HOME/.vimrc file에 위의 line을 추가시켜도 됩니다.

 

CVS 사용

 

1. status line에 CVS 정보를 추가하기
다음을 .vimrc에 추가한 후 CVS로 관리되는 파일을 VIM으로 열면 status line에 `[CVS-1.3]' 혹은 `[CVS-1.125-gtk-1-2]'와 같은 revision 및 tag 정보가 추가된다.
 
  let g:mystsline = ""
  let g:oldfilename = ""
  let g:cvsftime = 0
  let g:cvsrev = 0
  set statusline=%<%f%h%m%r\ %{SetMyStsLineVar()}%=%l,%c\ %n,%L

  " CVS revision/tag 정보를 [CVS-revision-tag] 형식으로 return
  func! SetMyStsLineVar()
    let p = expand("%:p:h")

    " speed-up
    if filereadable(p."/CVS/Entries")
      let cvsftime = getftime(p."/CVS/Entries")
    else
      let cvsftime = 0
    endif
    let me = expand("%:t")
    if me == g:oldfilename && cvsftime == g:cvsftime
      return g:mystsline
    endif

    let g:mystsline = ""
    let g:cvsftime = cvsftime
    let g:oldfilename = me
    let g:cvsrev=0

    if filereadable(p."/CVS/Entries")
      let rev=""
      let tag=""
      let line = system("grep '^/".me."/' ".p."/CVS/Entries")
      if line != "\n"
        let i=1
        let j=strlen(line) - 1
        let k=1
        while i < j
          let i=i+1
          if line[i] == '/'
            let k=k+1
            if k == 2
              let i=i+1
              while i < j && line[i] != '/'
                let rev = rev.line[i]
                let i=i+1
              endwhile
            endif
            if k == 4 && line[i+1] == 'T'
              let i=i+2
              while i < j
                let tag = tag.line[i]
                let i=i+1
              endwhile
              let g:y=tag
            endif
          endif
        endwhile
        if rev != ""
          let g:cvsrev = rev
          if tag != ""
            let g:mystsline = "[CVS-".g:cvsrev."-".tag."]"
          else
            let g:mystsline = "[CVS-".g:cvsrev."]"
          endif
        endif
      endif
    endif

    return g:mystsline
  endfunc 
위에서 cvs revision 및 tag 정보를 global variable로 저장해 두는 이유는 이 밑을 보시면 이해하실 수 있을 것입니다.

 

2. 현재 파일의 마지막 commit info를 알아내기
`cvs log' 명령을 위에서 저장한 revision과 연계하여 사용함으로서 쉽게 알아낼 수 있다.
 
  " 현재 파일의 revision에 대한 commit info
  func! CVS_ShowLog()
    let f=expand("%")
    let rev=g:cvsrev
    new
    exec "r!cvs log -N -r".rev." ".f
    exec "norm 1G/^---------------\<cr>z\<cr>"
    set nomod wrap
    " q 를 입력하면 buffer 닫음
    noremap <buffer> q :bd<cr>:echo ''<cr>
  endfunc
  nmap ,cl :call CVS_ShowLog()<cr> 

여기에서는 vim 6.x에 새로 추가된 `map <buffer>' 기능을 사용합니다. 현재 버퍼에서만 `q'가 mapping대로 동작하도록 합니다. 5.x 사용자는 `noremap ...' line을 지우시고 그냥 `:bd'를 사용하시기 바랍니다. `<buffer>' 만 지우면 `q'를 사용할 수 있지만 5.x에서는 global mapping이 되므로 다른 버퍼에서도 `q'를 입력하게 되면 버퍼가 닫히게 됩니다.

 

3. 현재 파일과 이전 revision 사이의 diff 보기
역시 위의 status line 관련 기능과 연관되어 구현되었는 데, 다음과 같습니다.
 
  " 위의 statusline 관련 루틴에 의해 설정된 CVS revision 번호에 대해 이전
  " 번호와의 차이점을 display
  func! CVS_ShowDiffFromPrev()
    let pos = strlen(g:cvsrev)
    while pos > 0
      let pos = pos - 1
      if g:cvsrev[pos] == "."
        let h = strpart(g:cvsrev, 0, pos+1)
        let t = strpart(g:cvsrev, pos+1, 10)
        if t == "1"
          " revision이 2.19.2.1과 같은 경우 'cvs diff -r 2.19.2.0'은 실패한다.
          " 따라서, 이와 같은 경우 'cvs diff -r 2.19'를 실행한다.
          while pos > 0
            let pos = pos - 1
            if g:cvsrev[pos] == "."
              let h = strpart(g:cvsrev, 0, pos)
              break
            endif
          endwhile
          let t=""
        else
          let t = t - 1
        endif
        let f = expand("%")
        new
        exec "r!cvs diff -u -r " .h.t. " " .f
        set nomod
        noremap <buffer> q :bd<cr>:echo ''<cr>
        return
      endif
    endwhile
  endfunc
  nmap ,cp :call CVS_ShowDiffFromPrev()<cr><cr>1G
           

4. GNU style ChangeLog file과 CVS
Unix 사용자를 위한 것입니다. 저의 경우 `,cu' 와 `,ci' 를 거의 사용합니다. 번역쪽에 있는 ChangeLog syntax resource file을 참고하시기 바랍니다. 다음 내용을 사용하시려면 email domain은 고쳐주어야 겠지요? 일단 ChangeLog file을 열어서 `,cu' 혹은 `,ci' 해보시라니깐요!
 
  let $VITMP=".vi_tmp.~"

  " "n에 이름 저장. "w에 user ID 저장.
  nmap ,mW :sp<CR>:new<CR>:r!whoami<CR>"wye:bd!<CR>:e /etc/passwd<CR>/<C-R>w<CR>
    \4f:l"nyt::bd<CR>

  " 현재 날짜/시간 및 email 주소 입력
  imap <C-G> <ESC>,mWa<C-R>=strftime("%Y-%m-%d")<CR>  <C-R>
      \n  <<C-R>w@lgic.co.kr>

  " <C-G> 후 cvs upd를 통해 바뀐 파일 얻어옴.
  nmap ,cu  1GO<C-G><CR><ESC>:r!cvs -q upd<CR>o<ESC>kV{j:g/^[PU] /d<CR>
     \:'<,'>s/^[MAR] /   * /<CR>:'<,'>s/$/:/<CR>1G2jA

  " 현재 입력한 내용을 commit info로 사용.
  nmap ,ci  1G}jV/^[12]<CR>2k:w! $VITMP<CR>:!cat $VITMP<CR>
     \:echohl Question<BAR>echo "press ENTER to commit"<BAR>
     \echohl None<CR>:!cvs -q ci -m "`cat $VITMP`"

  nmap ,cd  :!cvs diff -u <cfile><CR>
  nmap ,ca  V:s/^? /   * /<CR>0f*w:!cvs add <cfile><CR><CR>A new.<ESC> 
음! 참고로 혼자 작업하시는 분들은 저처럼 골치아프게 user 이름, user ID를 얻어올 필요가 없겠지요? 저는 회사에서 일하는 관계로 많은 사람과 같이 작업하며 보통 vimrc file을 전부 공유해서 사용합니다. 같은 coding 환경을 만들기 위해서...

VIM resource file을 이용한 color 바꾸기
VIM의 기본 synload.vim을 보면 기본적으로 두가지(어두운 배경과 밝은 배경)를 지원합니다. 기본색상을 그대로 쓰고 싶다면 $HOME/.vimrc에 다음 2줄을 추가합니다.
 
  " 밝은 background를 원할 경우에는 dark 대신 light 사용.
  set background=dark
  syntax on 
만약 color를 마음대로 바꾸고 싶다면? 다음은 제 resource의 일부를 그대로 가져온 겁니다.
$HOME/.vimrc에 다음을 추가합니다.
 
  if !has("unix")
     let $HOME=c:/vim
  endif
  let mysyntaxfile="$HOME/.vim/mysyntax.vim"
  syntax on 
$HOME/.vim/mysyntax.vim에 다음을 추가합니다.
 
  if has("syntax")
    if !exists("did_my_syntax_inits")
      let did_my_syntax_inits = 1

      " 음하하! 여러 호스트마다 색깔을 바꿀수도 있죠...
      if $HOSTNAME == "namsh"
        hi Normal  term=NONE cterm=NONE gui=NONE guifg=white guibg=#243318
        hi Comment term=NONE cterm=NONE ctermfg=6  gui=NONE guifg=Cyan
      else
        hi Normal  term=NONE cterm=NONE gui=NONE guifg=white guibg=#343328
        hi Comment term=NONE cterm=NONE ctermfg=6  gui=NONE guifg=Cyan
      endif
      hi Visual term=reverse cterm=reverse gui=NONE guifg=black guibg=gray85

      hi Constant   term=NONE cterm=NONE ctermfg=3  gui=NONE guifg=Yellow
      hi Identifier term=NONE cterm=NONE ctermfg=3  gui=NONE guifg=Yellow
      hi Special    term=NONE cterm=NONE ctermfg=11 gui=NONE guifg=OliveDrab1
      hi Statement  term=NONE cterm=NONE ctermfg=5  gui=NONE guifg=magenta
      hi PreProc    term=NONE cterm=NONE ctermfg=12 gui=NONE guifg=SandyBrown
      hi Type       term=NONE cterm=NONE ctermfg=2  gui=NONE guifg=Green
      hi Error      term=NONE cterm=NONE ctermfg=0 ctermbg=1  gui=NONE
      \guifg=black guibg=Red
      hi Todo       term=NONE cterm=NONE ctermfg=0 ctermbg=5 gui=NONE
      \guifg=black guibg=Orange

      hi SpecialKey term=NONE cterm=NONE ctermfg=2 gui=NONE guifg=Green
      hi Directory  term=NONE cterm=NONE ctermfg=2 gui=NONE guifg=Green
      hi MoreMsg    term=NONE cterm=NONE ctermfg=2 gui=NONE guifg=Green
      hi Question   term=NONE cterm=NONE ctermfg=2 gui=NONE guifg=Green
      hi WarningMsg term=NONE cterm=NONE ctermfg=1 gui=NONE guifg=Red
      hi StatusLine term=reverse cterm=reverse ctermfg=12 ctermbg=black
      \gui=reverse guifg=SandyBrown guibg=black
      hi Cursor     term=NONE cterm=NONE ctermfg=3 ctermbg=12 gui=NONE
      \guifg=black guibg=salmon
    endif
  endif 
다음은 제 $HOME/.vim/syntax2/c.vim 의 일부입니다.
 
  if highlight_exists("cTodo")
    syntax clear   cTodo
  endif
  syntax keyword cTodo contained TODO FIXME CAUTION NOTE 
다음은 GVIM과 console version 간의 색의 차이를 없애기 위해 $HOME/.Xdefaults에 다음을 추가하면 좋습니다.
 
  *VT100*colorMode: on
  *VT100*dynamicColors: on
  *VT100*colorULMode: on
  *VT100*underLine: off
  *VT100*colorBDMode: on
  *VT100*color0: gray18
  *VT100*color1: red
  *VT100*color2: green
  *VT100*color3: yellow
  *VT100*color4: skyblue
  *VT100*color5: magenta
  *VT100*color6: cyan
  *VT100*color7: gray99
  *VT100*color8: gray20
  *VT100*color9: red3
  *VT100*color10: green3
  *VT100*color11: OliveDrab1
  *VT100*color12: SandyBrown
  *VT100*color13: Orange
  *VT100*color14: cyan3
  *VT100*color15: gray95
  *VT100*colorUL: yellow
  *VT100*colorBD: yellow 
다음은 syntax와는 큰 연관은 없지만 한글 사용하려면 font를 설정해야 되겠죠?
 
  " 심지어는 windows와 unix간에도 같은 VIM resource file을 사용할 수도
  " 있지요..... 저는 windows는 거의 사용하지는 않지만 그래도 VIM은
  " 필수 아니겠어요?
  if has("unix")
    set guifontset=어쩌리저쩌리_너무_길어서_헤헤헤
  else
    set guifont=굴림체:h10:w5
  endif
  if version >= 600
    set   charcode=korea
  else
    set   fileencoding=korea
  endif
  set   guioptions=iamgrtpT
  set   mousehide 
거저 도움말 보는 게 이렇게 한 수 배우는 것 보다 100배 낫죠... VIM을 띄우신 후
 
  :help syntax 

[출처] VIM|작성자 료마



2. VIM 에서 색 설정

highlight 기능 과 colorscheme 사용.

 

vi 를 연 상태에서

:sy[tax] on

을 켠다. 여기서 [] 안의 내용은 옵션이다. 안써도 된다.

그리고 다음과 같이 하면 현재 사용하는 highlight 목록을 살펴 볼수 있다.

:hi[ghlight]


이 색깔에 대한 정의는 다음에 정의 되어 있다.

:!echo $VIMRUNTIME/colors


위 디렉토리 아래에 가보면 morning.vim, evening.vim 등의 파일들이 보이는데
각각 color scheme 를 정의해 놓은 파일들이다.


다른 color scheme 로 바꾸고 싶다면 다음과 같이 한다.

:colorscheme evening

여기서 evening 는 scheme 이름이다.

 

그럼 이제 underline 을 없애도록 하겠다. 현재 telnet 접속하여 vim 을 사용하고 있다는
가정하에 하는 것이다. 콘솔에서 사용하는 사람은 대개 underline 이 나오지 않을것이다.

:hi

위와 같이 하면 다음과 같이 출력이 된다.

Type term=underline ctermfg=2
Constant term=underline ctermfg=4 guifg=Magenta

여기서 Type 이라고 쓰여진 첫 필드는 group-name 이다. 만약 당신이 C 코드를 열고 있다면
Type 은 말그대로 char, int, float... 등과 같은 Type 이다.

 

term 은 color 를 표시할 수 없는 터미널이다. term 에선 underline 으로 표시하겠다는 뜻이다.
ctermfg 는 color terminal 이다. fg 는 foreground 이다. 번호는 색깔을 나타낸다.
즉, color 를 표시할 수 있는 터미널에선 2번 컬러로 Type 을 표시한다.

색깔은 숫자가 아니라 직접 명시를 할 수도 있다. ctermfg=blue 이런식이다.

그럼 상수를 표시할때 term 에선 bold 로 표시하도록 해보자.

 

:hi Constant term=bold ctermfg=4

 

아무런 설정도 하고 싶지 않다면 bold 대신에 NONE 라고 사용하면 된다.

 


위와 같은 설정들은 ~/.vimrc 에 저장하여 사용할 수도 있다.

shell> cat -n ~/.vimrc

 

1 set ic
2 set nu
3 set softtabstop=4
4 set shiftwidth=4
5 set formatoptions=croql
6 set ruler
7 set showmode
8 set smartindent
9 syntax on
10 filetype indent on
11 map :w:!gcc -Wall % -o %< && ./%<
(여기서 %는 이 file의 이름이고, %< 는 이 file에서 확장자를 제외한 이름이다.)

12 map ::!./%<
13 map :so $VIMRUNTIME/syntax/2html.vim
14
15 colorscheme pablo
16 hi Type term=NONE ctermfg=2
17 hi PreProc term=NONE ctermfg=10
18 hi LineNr term=NONE ctermfg=6
19 hi Constant term=NONE ctermfg=14

15번째 라인부터가 highlight 설정이다.
1번째 라인부터 10번째 라인은 기본적인 설정들에 대한 내용이다.

11번째에서 13번째 라인은 mapping 기능으로 를 누르면 C 코드를 컴파일 한후 실행하고
를 누르면 컴파일된 바이너리를 실행만 한다.
를 누르면 현재 파일을 HTML 파일로 변환하여 준다.
참고 : % - 한 line안에서 (,),{,},[,]를 검색

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

set autoindent " 자동으로 들여쓰기를 한다.
set cindent " C 프로그래밍을 할때 자동으로 들여쓰기를 한다.
set smartindent " 좀더 똑똑한 들여쓰기를 위한 옵션이다.
set textwidth=79 " 만약 79번째 글자를 넘어가면
set wrap " 자동으로 를 삽입하여 다음 줄로 넘어간다.
set nowrapscan " 검색할 때 문서의 끝에서 다시 처음으로 돌아가지 않는다.
set nobackup " 백업 파일을 만들지 않는다.
set visualbell " 키를 잘못눌렀을 때 삑 소리를 내는 대신 번쩍이게 한다.
set ruler " 화면 우측 하단에 현재 커서의 위치(줄,칸)를 보여준다.
set tabstop=4 " Tab을 눌렀을 때 8칸 대신 4칸 이동하도록 한다.
set shiftwidth=4 " 자동 들여쓰기를 할때 4칸 들여쓰도록 한다.
"문법 강조 기능을 사용한다.
if has("syntax")
syntax on " Default to no syntax highlightning
endif 
 

[출처] vim 에서 색 설정|작성자 카페모카