본문 바로가기

Tools/Ctag

ctags와 vi 사용하기[1]

[출처] : http://www.viper.pe.kr/cgi-bin/moin.cgi/ctags_%EC%99%80_vi_%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

UNIX/LINUX 의 콘솔 환경은 요즘과 같은 GUI 환경에 비해 대단히 불편하다. 특히 프로그래밍 환경은 MS Visual Studio 와 비교한다면 거의 메모장으로 프로그래밍하는 수준으로 보인다. 그러나 투박하지만 강력한 기능과 나름대로 편리한 프로그램들로 콘솔 환경에서도 프로그래밍이 가능하도록 만들고 있다. 그중에서도 ctags 와 vi 의 조합은 MS Visual Studio 도 따라오지 못하는 막강한(?) 기능으로 프로그래머들로 부터 사랑 받고 있다. 따라서 ctags 와 vi 의 조합을 어떻게 이용하는지 알아본다.

1. 참고링크 [Bottom] [Top]

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]

  •  준비중 입니다.