내밥줄/프로그래밍

[펌][Linux] Vim & Cscope

jjoell 2009. 3. 30. 15:02
출처: http://wiki.kldp.org/wiki.php/VimCscopeTutorial

Cscope 는 그 자체로도 아주 편리한 도구지만, 가장 즐겨 쓰는 에디터(이를테면 Vim)의 안락함에서 벗어나지 않을 수 있다면 더욱 좋다. 다행히 Vim 은 Cscope 지원이 들어가 있다.

이 강좌는 Vim 내장 Cscope 지원과 검색을 더 편리하게 해주는 맵을 소개한다.

vi 형식의 에디터에 대한 기본에 대해 알고 있다고 가정하지만 Vim 에 특화된 지식은 필요치 않다. (다중 창 등과같은 Vim 고유의 기능이 사용되며, 이러한 기능의 사용법은 간략한 소개하겠다.) Cscope 에 대해서는 아무것도 몰라도되며, 기초적인 것들을 소개하며 진행한다.

간단히 말해서, Vim 의 Cscope 지원은 Vim 의 ctags 기능과 매우 유사하다. 그러나 Cscope 는 ctags 보다 더 많은 검색 기능이 있기 때문에 몇 가지 차이점이 있다.

이것은 손수 따라올 수 있는 강좌이니 쉘을 열고 다음 단계들을 따라하라.

  1. 아 직 Cscope 이 당신의 기계에 설치되어 있지 않다면 받아서 깔아라. Vim 6.x 가 이상적이지만Vim 5 의 후기 버전으로 대부분의 기능이 가능하다. (세로 분리는 안 되겠지만 파일 주석에 나온 대로 맵을 수정하면가로분리는 동작할 것이다.)

    <!> 주의: Vim 이 --enable-cscope 로 컴파일되지 않았다면 그 플래그를 주어 Vim 을 다시 설정해서 컴파일해야 한다. 리눅스에 따라오는 대부분의 Vim 바이너리는 Cscope 플러그을 쓸 수 있게 되어 있다.

  2. [http]cscope_maps.vim파 일을 내려받아서 Vim 이 시작할 때 읽힐 수 있도록 하라. Vim 6.x 를 쓴다면 $HOME/.vim/plugin 디렉토리(혹은 runtimepath 의 plugin 하위 디렉토리 등) 에다 붙여 넣는다. Vim 5.x 를 사용한다면$HOME/.vimrc 에 cscope_map 파일의 내용을 통째로 붙여넣든가, 따로 저장한 후 .vimrc 에 "sourcecscope_maps.vim" 라고 써 넣으면 된다.

  3. C 코드가 있는 디렉토리로 가서 'cscope -R' 을 실행한다. ('-R' 은 Cscope 가 현재 디렉토리 뿐아니라 모든 하위 디렉토리에 대해 구문 분석을 하도록 한다.) '-b' 플래그(데이터베이스만 생성하고 빠져나가게 한다)를 주지않았으므로 Cscope 의 curses 기반의 GUI 로 들어오게 될 것이다. 검색을 몇 개 해 보라. (요령: 방향키로 검색종류를 고르고 탭으로 검색 종류와 검색 결과 사이를 이동한다.) 검색 결과의 가장 왼쪽에 있는 숫자를 입력하면 Cscope 는해당 위치로 Vim 을 열어 줄 것이다. (EDITOR 환경변수를 Vim 이 아닌 다른 것으로 설정하지 않은 이상 말이다.)Vim 을 나가면 다시 바로 직전의 Cscope GUI 로 돌아올 것이다. 멋지게도.

    아, 그런데 Cscope 인터페이스는 큰 문제가 있다. 새로 검색을 할 때마다 Vim 을 빠져나가야 한다. 그래서 Vim 플러그인이 나온 것이다. CTRL-D 로 Cscope 를 빠져나가라.

  4. Vim 을 시작하라. 원한다면 C 이름으로 (보기: 'vim -t main') 시작할 수 있으며, 그러면 그 이름이 정의된 곳으로 바로 갈 수 있다.

  5. 커 서를 C 이름이 있는 여러 군데 놓고 "CTRL-\ s" (컨트롤-역슬래시, 그리고 그냥 s) 를 빠르게 이어 치면바로 그것을 사용하는 곳으로 갈 것이다. ctags 에서처럼 "CTRL-t" 를 누르면 원래의 검색 전의 원래 위치로 돌아갈것이다. (그리고 여러 겹으로 검색해 들어갔다면 CTRL-t 를 누를 때마다 하나씩 되돌아 올 것이다.)

    기억하기: '\' 는 ctags 검색에 쓰는 ']' 바로 옆에 있다.

  6. 같 은 검색을 이번에는 "CTRL-spacebar s" 로 해보라. 이번에는 두 개의 Vim 창이 가로로 갈라져서Cscope 검색 결과가 새 창에 나오게 될 것이다. [ Vim에서 여러 개의 창을 한번도 써본 적이 없다면 다음과 같이 하라."CTRL-W w" (또는 CTRL-W 방향키, 또는 CTRL-W h/j/k/l 로 왼쪽/위/아래/오른쪽) 로 창을 옮기고,'CTRL-W c' (또는 아름다운 옛 시절의 ':q') 로 창을 닫고, 'CTRL-W s' 로 (또는 'CTRL-W v'로세로로) 창을 나누고, ':split filename' 으로 파일을 새 창에서 연다. ]

    기억하기: 큰 spacebar 처럼 생긴 가로막대가 스크린 가운데 나타나 Vim 창을 나눈다.

  7. 이 번엔 같은 검색을 "CTRL-spacebar CTRL-spacebar s" (그냥 CTRL 을 누른 채로spacebar 를 두 번 치라) 로 해 보라. 만일 작동하기에 충분할 만큼 빠른 속도로 치는 것이 버겁다면cscpoe_maps.vim 스크립트에서 Vim 타임아웃 설정을 [ 사실 나는 Vim 타임아웃 설정을 끄는 것을 대개의 경우추천한다. ] 이제 두 개로 Vim 창이 세로로 나뉠 것이다. (주의: Vim 5.x 에는 동작하지 않는다. 세로 분리는 Vim6.0에서 새로 나왔다.)

  8. 지 금까지는 cscope_maps.vim 의 키 맵만을 써서 Vim 에서 커서 바로 아래 있는 단어에 대한 검색만을 했다.전통적인 방법으로 (Vim 의 내장 Cscope 지원을 통해) Cscope 검색을 하려면, ":cscope find symbolfoo" (또는 간단히 ":cs f s foo") 라고 입력한다. 가로 분리된 창으로 검색하려면 ":scscope" (또는 그냥":scs") 라고 입력한다. (Vim 6.x 에서만 가능). 맵을 사용하는 것이 커서 아래에 있는 단어를 검색하기는 더쉽지만, 명령줄 인터페이스는 쳐 넣는 어떤 이름으로든지 찾아갈 수 있으므로 가끔씩 쓸 있을 분명 있을 것이다.

  9. 지 금까지 's' 를 이용한 'X 라는 단어의 모든 쓰임새'를 찾는 한 가지 종류의 검색만을 살펴보았다. 다른 글자로 다른종류의 Cscope 검색을 해보라. 'g' 는 전역으로 정의된 이름들을, 'c' 는 함수 호출을, 'f' 는 커서가 놓은 파일이름을 (주의: Cscope 는 기본적으로 /usr/include 아래 헤더 파일을 모두 구문 분석하므로, 이 방법을 통해대부분의 표준 인클루드 파일들을 열 수 있다.) 이들이 내가 가장 자주 사용하는 것들이지만, 다른 종류들도 있다.(cscope_maps.vim 와 Cscope 맨페이지를 중 하나 또는 두 곳 모두에서 찾아보라.)

  10. Cscope 는 본래 C 코드에 쓸 목적이었지만, 매우 유연한 도구이기 때문에 C++ 이나 Java 와 같은 언어에대해서도 잘 동작한다. 이것은 함수 호출이나 변수 정의와 같은 몇 가지 구조를 추가로 인식할 수 있는 일반적인 'grep'데이터베이스라고 볼 수 있다. 기본적으로 Cscope 는 C, lex, yacc 파일만을 (.c, .h, .l, .y) 현재디렉토리에 대해서 (하위 디렉토리는 '-R' 플래그를 줄 때) 구문 분석하며, 현재로서는 구문 분석 대상 확장자 목록을 바꿀방법이 없다. 그래서 대신에 구문분석하고자 하는 파일 목록을 'cscope.files' 라는 이름의 ㅇ파일을 만든다. (다른이름을 붙이고 'cscope -i foofile' 이라고 해도 된다.) 파일 목록을 만드는 쉬운 (그리고 유연한) 방법은믿음직한 다음과 같이 유닉스 'find' 유틸리티를 쓰는 것이다.
     find . -name '*.java' > cscope.files
    이 제cscope -b 로 데이터베이스를 다시 만들면 ('-b' 는 데이터메이스를 만들기만 하고 Cscope GUI 를 시작하지않는다.) 모든 Java 파일에 대한 이름들을 탐색할 수 있게 된다. 큰 규모의 문서 파일들을 탐색하고 편집하는 데 cscope를 쓰는 친구들이 있다는 이야기도 있을 정도로 Cscope 구문 분석기는 유연하다.

    더 큰 프로젝트에는 추가로 '-q' 플래그나 더 복잡한 'find' 명령어를 쓸 필요가 있을지 모른다. 더 많은 정보를 얻으려면 [http]큰 프로젝트에서 Cscope 사용에 대한 강좌를 보라.

  11. $CSCOPE_DB 환경변수를 만들어진 Cscope 데이터베이스를 가리키게 해보라. 그러면 매번 Vim 을 똑같은 디렉토리로 찾아가 띄울 필요가 없다. 이것은 특히 프로젝트가 여러 개의 하위 디렉토리로 나뉘어 있을 때 유용하다.<!> 주의: 이것이 동작하기 위해서는 데이터베이스를 다음과 같이 절대 경로로 생성해야 한다.
     find /my/project/dir -name '*.c' -o -name '*.h' > /foo/cscope.files
    그 리고 Cscope 를 cscope.files 가 있는 디렉토리로 가서 실행하고 (또는 'cscope -i/foo/cscope.files'), $CSCOPE_DB 변수를 cscope.out 결과 파일을 가리키도록 다음과 같이 설정하고export 하라.
     cd /foo
    cscope -b
    CSCOPE_DB=/foo/cscope.out; export CSCOPE_DB
    (마지막 명령은 Bourne/Korn/Bash 쉘을 위한 것이다. 나는 csh 기반 쉘을 전염병 피하듯 하기 때문에 거기서는 어떻게 export 하는지 잊어버렸다.)

    이 제 기계의 어떤 디렉토리에서든지 'vim -t foo' 라고 실행하면 'foo' 가 정의된 곳으로 바로 이동한다. 나는프로젝트별로 작은 쉘 스크립트를 만들어 (CSCOPE_DB 를 설정하고 export 하기만 하도록) 'sourceprojectA' 라는 명령으로 프로젝트간에 작업 전환할 때마다 실행하곤 한다.

    벌레: Cscope 15.4 이전의 판에는, 데이터베이스 이름을 기본설정인 'cscope.out' 이외에 다른 것으로하지 않으면 Vim 이 멈춰버릴 수도 있는 바보 같은 벌레가 있다. Cscope 를 부를 때 '-f foo' 로 데이터베이스이름을 'foo.out' 로 대체하면 괜찮다.

  12. 이게 끝이다. 궁금한 것이 있다면 ":help cscope" (Vim에서) 와 "man cscope" (쉘에서) 중 하나 또는 두 개 다 해보아서 세세한 점들을 찾아보라.

  13. http://eureka99.egloos.com/4815388