1) global source navigation 

kscope, eclipse 등을 써봤지만, 역시 전 왠지 Gui 인터페이스는 불편함이 많더군요. command prompt 가 익숙해서인지. 
Vim 에서 전 ctags, cscope(또는 gtags) 혼용해서 씁니다. 
(사실은 cscope 하나만 써도 됩니다. ctags 기능은 모두 cscope 가 지원하기 때문에, 하지만 ctags 만 사용할 수도 있으므로) 
cscope 와 ctags 는 Vim 7.0 에서 기본적으로 script 지원 합니다. 

/home/danniill/src 폴더에 작업하는 소스가 위치해 있다고 가정하면, 
$> cd /home/danniill/src 
$> ctags -R . <= tags (ctags database 파일) 생성 
$> cscope -R -b <= cscope.out (cscope database 파일) 생성 

vim 을 구동시킬때 위에서 만든 tags/cscope.out 파일이 있는 디렉토리에서 시작하시는게 좋습니다. 
이유는 vim 이 시작한 디렉토리에서 부터 tags 파일과 cscope.out 파일을 찾기 때문이죠. 
위 파일들이 있는 디렉토리에서 vim . 하시면, netrw script 로 시작합니다. 

netrw 는 NASA 에서 근무중인 Charles Campbell 이 만든 network read/write 가능한 script 입니다. 
local 에서 directory browsing 등을 하는데도, 이만한 script 가 없다고 봅니다. 
netrw 모드로 디렉토리를 이동해서, 내가 edit 할려는 파일을 찾고, enter 를 치면 해당 파일을 엽니다. 

vim 안에서 default 로 set tags 하시면 tags=./tags,./TAGS,tags,TAGS 이렇게 나올겁니다. 
즉, 현재 디렉토리 아래에 tags 파일을 찾고, 없으면 TAGS 를 찾고, 없으면, 상위 디렉토리로 거슬러 올라가면서, tags 혹은 TAGS 파일을 찾습니다. 
ctags 는 C symbol 의 definition 은 찾아주지만, reference 혹은 callled funtion 등을 찾아 주지는 않습니다. 
해당 변수가 쓰여진 모든 경우를 찾고 싶을땐, cscope 나 gtags 를 쓰셔야 합니다. 
cscope 는 default 로 Vim 이 지원하기 때문에, 간단히 :cs 하시면 지원되는 명령어 들을 보실 수 있읍니다. 
하지만, 그냥 쓸려면 :cs find g <찾을려는 c symbol> 이런 형식으로 매번 치기가 여간 번거로운게 아닙니다. 
cscope help 파일을 vim 내에서 찾아보면 나오는 추천방식이 있읍니다. 
home direcotry 아래에 .vimrc 파일 같은걸 생성하시고, 거기에 아래와 같은 map 파일을 써 놓으면 편합니다. 

nmap <F5> :cs find g <C-R>=expand("<cword>") <CR><CR>
nmap <F6> :cs find c <C-R>=expand("<cword>") <CR><CR>
nmap <F7> :cs find s <C-R>=expand("<cword>") <CR><CR>

첫번째 문장만 보면, F5 키를 뒤의 문자열로 normal mode mapping 해주라는 거구요. 
(nmap 대신에 map 쓰시면, 모든 모드에서 지원) 
뒤의 :cs find g 는 cscope 를 이용해서 해당 c symbol의 정의(definition)을 찾으라는 겁니다. 
<C-R>=expand("<cword>")<CR><CR> 부분은 현재 cursor 가 위치한 문자열로 입력을 대체한다는 겁니다. 

두번째 문장은 첫번째 문장과 cscope find 명령만 다릅니다. 
이건 정의가 아닌 함수의 참조(reference)를 찾아주죠. 현재 커서가 위치한 함수를 calling 하는 함수를 찾아줍니다. 

세번째 문장은 현재 커서가 위치한 c symbol 의 모든 reference 를 보여줍니다. 
이건 함수가 아닌 변수도 해당됩니다. 

실제 사용례를 보면, 
커서가 위치한 변수(함수)의 정의를 보고 싶으면, F5 키를 
커서가 위치한 함수가 호출된 모든 경우를 보고 싶으면, F6 키를 
커서가 위치한 변수(함수)의 모든 사용례를 보고 싶으면, F7 키를 누르면 됩니다. 
꽤 쓸만하죠? 

위에서 F5 키는 ctags 명령인 CTRL-] 와 동일합니다. 



2) local source navigation / editing 

현재 open 된 source 파일 내에서 특정 변수의 정의로 가고 싶을 땐, gdnnnn 쳐보세요. 
문서의 처음으로 갈땐 gg, 마지막은 G (다들 아시겠지만) 

auto completion 기능이 지원됩니다. 
어떤 함수나 변수, 또는 문장의 처음 몇글자만 쳐 넣고 , Ctrl-N(또는 Ctrl-P), Ctrl-X Ctrl-L 를 눌러보세요. 
더 자세한 사용법은 ins-completion 부분을 vim 내에서 help 해보세요. 
:help ins-completion 

visual mode 기능이 지원됩니다. 
전통적으로는 3줄 copy 할려면, 3y 한후에, 커서 이동, p 눌렀어야 됬죠. 
전 요새는 V (line 단위 visual 모드가 됩니다) n 또는 p 눌러서 block 선택, 커서 이동, p 누릅니다. 
내가 copy 할려는 부분이 visual 하게 표시되니깐.. 좀 더 편하더군요.


3) 기타 유용한 vim 명령및 스크립트 

:ls <= 현재 open 된 파일들의 list 를 보여줍니다. 
이동은 :buffer 0 또는 :buffer 1 이런식으로 

:marks <= vim 은 0,1,2,3,4,5,6,7,8,9,`,[,]," 에 대해서 marking 을 해 놓습니다. 
각 marking 은 한 화일내의 특정 위치 일 수도, 서로다른 화일내의 특정 위치일 수도 있읍니다. 
이동은 `(숫자1 좌측에 있는) 누르고 mark 표시 (0,1,2,3,....) `` 두번 누르면 직전 편집위치, `0 누르면그전 편집위치, `1 누르면 그전.. 이런식으로 

taglist 스크립트 추천합니다. 
Yegappan Lakshmanan 이라는 친구가 만든 source browsing 하는 스크립트 입니다. 
설치후에 :TlistToggle 하면 화면 좌측에 symbol window 를 표시해 줍니다. 
nmap <F2> :TlistToggle <= F2 키 누르면 symbol window 토글 시켜줍니다. 


4) Vim quickfix 기능 

editing => compile => editing 을 반복하는게 프로그래머들의 일상이죠. 
이 순환 싸이클을 줄여보자는게 목적입니다. 

간단히 요점만 설명하면, 모든 컴파일러는 컴파일 과정중에 log message를 console에 출력해 줍니다. 
vim 은 내부 기능으로 이 출력된 log message를 분석해서 error 가 발생한 파일로 점프 할 수 있게 지원합니다. 

:set makeprg <= default make 프로그램을 보여줍니다. 전 makeprg=make 라고 나오는 군요. 
:set efm <= error file format 을 보여줍니다. 전 이게 너무 많더라구요. 각종 컴파일러 포맷을 지원할려고 해서 그런지. 

ubuntu 8.04 + gcc 4.2.3 버전쓰시는 분들은 아래 efm 으로 바꿔서 사용해 보시면 될듯 합니다. 
gcc 표준 에러파일만 인식하도록 바꾼건데, 제 PC 에서는 잘 동작하네요. 
set efm=%f:%l: %m,%Dmake[%*d]: Entering directory `%f',%Xmake[%*d]: Leaving directory `%f' 

=> 간단히 설명하자면, 
=> %f:%l: %m <== %f (파일이름) 뒤에 공백없이 : 기호가 붙고, %l(라인넘버)가 뒤따르며, 또 : 기호가 붙고 한칸 공백후에( ) error 라는 에러메세지가 나오는 포맷이다. 
=> %Dmake[%*d]: Entering directory `%f' <== make[1] Entering directory 를 이해시키위한 포맷 
=> %Xmake[%*d]: Leaving directory `%f' <== 디렉토리 stack 에서 빠져나가는 포맷 (위의 %D.... 포맷과 쌍으로 씌여져야 한다) 

사용방법은 vim 을 구동한 상태에서 
필요한 소스 수정 
:make <= make 실행 에러가 발생할 경우 첫번째 에러난 소스 파일로 vim 이 자동으로 jump 한다. 
:cl <= 전체 에러 리스트를 보고 싶을때 
:cn <= 현재 에러 위치 수정을 마치고, 다음 에러위치로 이동할때

출처 : http://flytospace.tistory.com/13


+ Recent posts