UNIX/LINUX 의 콘솔 환경은 요즘과 같은 GUI 환경에 비해 대단히 불편하다. 특히 프로그래밍 환경은 MS Visual Studio 와 비교한다면 거의 메모장으로 프로그래밍하는 수준으로 보인다. 그러나 투박하지만 강력한 기능과 나름대로 편리한 프로그램들로 콘솔 환경에서도 프로그래밍이 가능하도록 만들고 있다. 그중에서도 ctags 와 vi 의 조합은 MS Visual Studio 도 따라오지 못하는 막강한(?) 기능으로 프로그래머들로 부터 사랑 받고 있다. 따라서 ctags 와 vi 의 조합을 어떻게 이용하는지 알아본다.
1. 참고링크 [Bottom] [Top]
Exuberant ctags http://ctags.sourceforge.net
Vim documentation: tagsrch http://vimdoc.sourceforge.net/htmldoc/tagsrch.html
2. ctags 란? [Bottom] [Top]
UNIX/LINUX 에서 소스를 분석할 때 유용하게 사용할 수 프로그램으로 직접적으로 도움을 줄 수는 없지만 vi 나 emacs 와 같은 에디터에서 사용할 수 있도록 tags 파일을 생성한다.
2.1. 사용법 [Bottom] [Top]
사용법은 여러가지 옵션과 tag 를 생성해야할 파일을 지정한다. 예를 들어 간단히 .c 와 .h 에 대하여 tags 파일을 생성할 때 다음과 같이 사용한다.
# ctags *.c *.h
2.2. 유용한 옵션 [Bottom] [Top]
여기서 생성되는 파일명은 기본적으로 tags 이며 -f 옵션으로 파일명을 지정할 수 있다.
# ctags -f mytags
ctags 는 기본적으로 현재 디렉토리를 대상으로 tags 파일을 생성하므로 하위 디렉토리에 대하여 tags 파일 생성이 필요한 경우 -R 옵션을 사용한다.
# ctags -R
좀 더 자세한 사항은 man page 의 ctags(1) 를 참고한다.
3. vi 에서 tags 사용하기 [Bottom] [Top]
UNIX/LINUX 에서 vi (실제는 vim) 에디터는 가벼우면서도 뛰어난 기능으로 아직도 많은 사람들이 애용하고 있다. vi 의 뛰어난 기능 중에서 tags 파일을 어떻게 이용하여 프로그램 소스를 분석할 수 있는지 알아본다.
3.1. tags 설정 [Bottom] [Top]
vi 에서 사용할 tags 파일을 설정해야 한다. ctags 는 기본적으로 tags 파일을 생성하므로 tags 파일을 설정하면 된다. 기본값이 어떻게 설정되었는지 알아볼려면 vi 에서 다음과 실행한다.
: set tags tags=./tags,./TAGS,tags,TAGS
위와 같이 기본값 (현재 디렉토리의 tags 파일) 이 설정되어 있지 않다면 아래와 같이 설정한다.
: set tags=./tags,./TAGS,tags,TAGS
여기서 tags 파일의 경로를 지정하는 것으로 상대경로뿐만 아니라 절대경로도 지정할 수 있으며 여러개의 경로도 지정할 수 있다.
3.2. tag 이동 [Bottom] [Top]
명령
설명
: ta [ g ] { ident }
{ ident } 가 정의된 위치로 이동
<Ctrl+]>
': ta' 와 동일, 커서가 위치한 keyword 에 대하여 이동
visual <Ctrl+]>
': ta' 와 동일, 선택된 keyword 에 대하여 이동
3.3. tag 스택 [Bottom] [Top]
명령
설명
<Ctrl+T>
이전 Tag 로 이동
: [ count ] po [ p ]
[ count ] 만큼 이전 Tag 로 이동
: [ count ] ta [ g ]
[ count ] 만큼 다음 Tag 로 이동
: tags
Tag 스택의 목록 출력
: 0tag
마지막 사용한 Tag 로 이동
3.4. tag 목록 [Bottom] [Top]
명령
설명
: ts [ elect ] [ ident ]
[ ident ] 와 일치하는 Tags 목록을 출력하고 선택 후 이동
g]
': ts' 와 동일, 커서가 위치한 keyword 에 대하여 이동
visual g]
': ts' 와 동일, 선택된 keyword 에 대하여 이동
: tj [ ump ] [ ident ]
': ts' 와 동일, 단일 Tag 일 경우 ': ta' 와 동일
g <Ctrl+]>
': tj' 와 동일, 커서가 위치한 keyword 에 대하여 이동
visual g <Ctrl+]>
': tj' 와 동일, 선택된 keyword 에 대하여 이동
: [ count ] tn [ ext ]
일치하는 다음 Tag 로 이동
: [ count ] tp [ revious ]
일치하는 이전 Tag 로 이동
: [ count ] tN [ ext ]
': tp' 와 동일
: [ count ] tr [ ewind ]
[ count ] 번째 위치로 이동, [ count ] 가 없으면 첫번째로 일치하는 Tag 로 이동
: [ count ] tf [ irst ]
': tr' 와 동일
tl [ ast ]
마지막으로 일치하는 Tag 로 이동
: sts [ elect ] [ ident ]
': ts 와 동일, 선택된 Tag 는 윈도우 분할
: stj [ ump ] [ ident ]
': tj' 와 동일, 선택돈 Tag 는 윈도우 분할
3.5. tags 패턴 검색 [Bottom] [Top]
Tag 를 검색할 경우 정규 표현식 (Regular expression) 을 이용하여 검색 가능하다. 패턴 검색은 keyword 에 대하여 '/' 로 시작하도록 한다.
예를들어 get 으로 시작하는 Tag 를 검색할 경우
: tag /^get
norm 이란 단어가 포함된 Tag 검색은 다음과 같다.
: tag /norm
3.6. tags 관련 옵션 [Bottom] [Top]
tags 기능을 좀 더 편리하게 사용할 수 있도록 vi 에는 몇가지 옵션을 갖추고 있다. 이들 옵션에 대하여 어떻게 사용해야 되는지 알아본다.
3.6.1. tagstack [Bottom] [Top]
tag 스택의 사용 여부를 설정하는 것으로 notagstack 를 설정하게 되면 이전 tag 로 복귀할 수 없게 된다.
: set { tagstack | notagstack }
3.6.2. ignorecase [Bottom] [Top]
tag 를 이동하기 위하여 검색할 경우 대소문자 일치 여부를 설정한다. ignorecase 로 설정하면 대소문자 구분 없이 검색된다.
: set { ignorecase | noignorecase }
3.6.3. tagbsearch [Bottom] [Top]
tags 파일의 빠른 검색을 위하여 이진 검색 (binary search) 을 이용하며 tags 파일은 ASCII 순으로 정렬된다. 그러나 새로운 tag 가 추가 되거나 순서가 바뀌게 되면 검색이 불가능하게 되므로 순차 검색 (linear search) 으로 검색하도록 설정할 필요가 있다. 이때notagbsearch 를 설정한다.
: set { tagbsearch | notagbsearch }
3.6.4. cpoptions [Bottom] [Top]
준비중 입니다.
3.6.5. autowrite [Bottom] [Top]
준비중 입니다.
3.6.6. secure [Bottom] [Top]
준비중 입니다.
3.6.7. tagrelative [Bottom] [Top]
준비중 입니다.