반응형

소스 태그를 찾기 위한 만능 해결사 ctags

1) 정의
 
프로그래밍 소스 코드의 태그(전역변수 선언, 함수 정의, 매크로 선언)들의 데이터베이스를 생성하는 유닉스 명령어이다. 인식하는 파일종류는 다음과 같다.

Assembler, ASP, Awk, C, C++, BETA, Cobol, Eiffel, Fortran, Jana, Lisp, Lua, Make, Pascal, Perl, PHP, PL/SQL, Python, REXX, Ruby, Scheme, Shell script(Bourne, Korn, Z), S-Lang, Tcl, Vera, Verilog, Vim, YACC/Bison

 

2) 사용

ctags 를 설치하고 사용하려면 사용하려는 소스가 있는 디렉토리에서 ctags R 해주면 된다. R은 하위디렉토리까지 포함해서 하는 것을 의미한다. 명령을 수행하면 해당 디렉토리에 tags 파일이 생성된다.

tags 파일의 구성은 앞에서부터 태그명, 파일명, 파일 내에 정의된 형식 순으로 태그 데이터베이스 파일이 구성된다.

vim에서는 set명령으로 tags변수에 생성한 태그 데이터베이스(tags파일)파일을 설정할 수 있다. 복수개일 경우에는 , 구분자를 이용하여 여러 개의 태그 파일을 지정할 수 있다. )

:set tags = ./tags                                                           (단일지정)

:set tags = ./tags, /usr/src/linux-2.4/tags, /usr/include/tags         (복수지정)

이것도 .vimrc 파일에 지정해 두면 vim을 켤때마다 설정하지 않고 자동으로 설정되도록 할 수 있다. 이렇게 하면 모둔 준비가 끝이난다. 내용을 정리하면 다음과 같다.

설정방법

> ctags -R                                                              ( shell 에서 )

:set tags=./tags                                                      ( vim 에서 )        ( 단일지정 )

or :set tags = ./tags, /usr/src/linux-2.4/tags, /usr/include/tags        ( 복수지정 )

  -- .vimrc에 기입해도 됨.

이제 모든 준비가 끝났으므로 vim을 실행하고 tj명령을 통해서 tag를 찾을 수 있다. 만일 커널 디렉토리의 태그가 있다면 다음과 같이 명령을 수행한다.

:tj start_kernel

tj tag jump의 약자이다. 명령을 수행하면 태그 데이터베이스 파일(tags)에서 start_kernel 태그를 찾아서 리스트로 나열한다. 만약 위 명령대신 :sts start_kernel 을 수행하면 vim창이 수평 분할되면서 start_kernel에 커서가 이동하게 된다.

 

ctags 명령어 요약

:ta [tag] or Ctrl + ]

[tag]가 정의된 위치를 나열하고 선택한 위치로 점프. 현재 위치는 stack push된다.

:ts [tag] or :tj [tag]

:po or Ctrl+t

stack top에 저장된 위치를 pop하고 그 위치로 점프

:sts [tag]

[tag]가 정의된 위치를 나열하고 선택한 위치고 팡을 수평 분할하여 새로 생성된 창에 표시

:stj [tag]

:tn

tj ts로 점프했을 때 다음 tag로 점프

:tp

tj ts로 점프했을 때 이전 tag로 점프

:tr

tj ts로 점프했을 때 처음 tag로 점프

:tl

tj ts로 점프했을 때 마지막 tag로 점프

위에서 중요한 명령들만 외운다면 사용하는데 무리 없다. 하지만 아직도 불편한 점이 있다. 위 명령에서 :tj 로 찾을 경우에 뒤에 써야하는 tag의 이름이 길다면 매우 불편할 것이다. 그래서 .vimrc에서 사용할 수 있는 vim 스크립트를 작성해주면 된다. 스크립트는 다음과 같다.

if version >= 500

func! Sts()

             let st = expand(<cword>)

             exe sts .st

endfunc

nmap ,st :call Sts()<cr>

 

func! Tj()

             let st = expand(<cword>)

             exe tj .st

endfunc

nmap ,tj :call Tj()<cr>

endif

if version >= 500 ~ endif로 묶어서 vim의 버전이 5.0이상일 때만 적용되게 했다. 그리고 Sts(), Tj()함수를 정의하여서 let st st변수를 선언하였다. expand(<cword>) 명령어로 현재의 커서가 위치하는 단어를 읽어 와서 st 변수에다 집어 넣었다. exe 명령으로 뒤에 오는 명령을 수행하는데 sts .st 하게 되어 sts 문자열에 st변수의 문자열을 붙여넣었다.

이렇게 정의한 함수를 nmap ,st :call Sts()<cr> 명령어로 ,st 키에 매핑했다. 그래서 명령모드에서 ,st라고 명령을 내리면 ex모드에서 :call Sts()<cr) 명령이 수앻되어 Sts()함수가 호출된다.


반응형

'OS > Linux' 카테고리의 다른 글

[VI] vi 색상 바꾸기 - vim 파일(putty.vim)  (1) 2009.02.11
[VI] vi 색상 변경  (0) 2009.02.11
[VI] vi 명령어..  (0) 2009.02.11
리눅스 명령어 / DOS 와 비교  (1) 2009.02.11
[VI] vi 팁 - 정렬하기  (0) 2009.02.11

+ Recent posts