[Vim] CTags를 이용한 코드 탐색에 관하여
Vim으로 코딩을 하면서 ctags를 쓰지 않는 프로그래머는 개인적으로 '괴팍'하다고 생각한다. 그도 그럴게 너무 편하니까.
... Vim에서 태그를 잘 쓰고 계시다면 거의 하단 '본론' 부분으로 패스하시길 ...
모르는 이를 위해 단순히 설명하자면, ctags는 소스 코드의 Symbol을 정리하는 유틸리티이고, Vim에서는 ctags로 생성한 tags를 이용해 파일 탐색을 해 주는 기능이 있다. 단순히 말해서 '함수 몸뚱아리 찾기' 등등...
혹시나 ctags가 없는 윈도우 유저는 Exuberant CTAGS를 다운받아서 쓰면 된다.
http://ctags.sourceforge.net/
설치법을 물어보는 분이 계실까봐 미리 언급하는데, ctagsXX.zip 파일을 받아서 압축을 풀어서 ctags.exe파일을 하나 찾아보자. 그 파일을 C:\Windows 나 C:\WinNT 밑에 복사하거나 아니면 적당한 디렉토리에 넣고 PATH를 잡아주자. 나머지 파일들은 소스이니 지워도 무관계.
(윈도우 디렉토리에 복사하는 건 기본적으로 PATH가 잡혀 있는 디렉토리라 편하게 설치가 가능하기 때문일 뿐 다른 의도가 있는 건 아니다 -_-)
다음, Vim에서 tags파일이 있는 곳을 지정해주자. 설정파일(
(혹시나 해서 언급하지만, Windows 사용자의 경우 별 다른 설정을 하지 않았다면 Vim이 설치된 디렉토리의 _vimrc 파일이 바로 기본 설정파일이다.)
이제 Vim에서 특정 파일을 열고
나는 다음 설정을 추가로 사용한다.
자 이제 본론으로. (사족이 왜 이렇게 길어졌을까 -_-)
사용자에 따라 호불호가 갈리겠지만, 이 태그 데이터베이스인 tags 파일은 사실 여러 곳에 분포시킬 수도 있고 한 군데에 모아둘수도 있다.
예를 들어 특정 SDK디렉토리에도 tags를 만들고 자신의 프로젝트에 tags를 만들어도 되겠지만 이 둘을 하나의 tags로 관리하는 것도 가능하다. (이를 위해선 find 등을 써서 파일목록을 만들고 ctags로 파싱하는 등의 일련의 스크립트를 만들 필요성이 있다)
하지만 난 여러 프로젝트와 여러 SDK를 사용하는 입장에서 하나의 파일로 tags를 유지하는건 굉장히 낭패다. 겹치는 심볼이 있다면 불편하기도 할테고, 하나의 tags를 유지할거라면 소스가 바뀌어서 새로 만들 때 엄청 오래 걸릴 수도 있다.)
그리고 여러 프로젝트이기 때문에 tags를 특정 디렉토리에 몰아두기 같은 피곤한 일(설정 파일에 tags 위치를 표시해 주는 일)은 귀찮다.
그래서 이런 식의 설정을 이용한다.
만약 tags파일이 상위에 없다면 오류가 나겠네? 안난다. 정말 다행이었다. (^ O ^)
이렇게 설정해서 프로젝트 디렉토리(혹은 그 하위 디렉토리)에서 vim을 사용한다면 언제든 자신의 tags를 자동으로 찾을 수 있다.
이게 진짜로 하고 싶었던 이야기. 한번 더 말하지만, 개인 기호와 취향의 문제이니 따라할 필요는 없다. -_-;;
... Vim에서 태그를 잘 쓰고 계시다면 거의 하단 '본론' 부분으로 패스하시길 ...
모르는 이를 위해 단순히 설명하자면, ctags는 소스 코드의 Symbol을 정리하는 유틸리티이고, Vim에서는 ctags로 생성한 tags를 이용해 파일 탐색을 해 주는 기능이 있다. 단순히 말해서 '함수 몸뚱아리 찾기' 등등...
ctags -R .이 명령 하나로 현재 및 하위 디렉토리의 모든 소스파일을 검색해서 tags라는 데이터베이스 파일을 생성한다.
혹시나 ctags가 없는 윈도우 유저는 Exuberant CTAGS를 다운받아서 쓰면 된다.
http://ctags.sourceforge.net/
설치법을 물어보는 분이 계실까봐 미리 언급하는데, ctagsXX.zip 파일을 받아서 압축을 풀어서 ctags.exe파일을 하나 찾아보자. 그 파일을 C:\Windows 나 C:\WinNT 밑에 복사하거나 아니면 적당한 디렉토리에 넣고 PATH를 잡아주자. 나머지 파일들은 소스이니 지워도 무관계.
(윈도우 디렉토리에 복사하는 건 기본적으로 PATH가 잡혀 있는 디렉토리라 편하게 설치가 가능하기 때문일 뿐 다른 의도가 있는 건 아니다 -_-)
다음, Vim에서 tags파일이 있는 곳을 지정해주자. 설정파일(
~/.vimrc
)을 열어서 아래 설정을 추가한 후 Vim을 띄워보자.set tags=./tags,tags현재 디렉토리에 tags파일이 있다고 가정한 설정이다. 태그 파일을 생성한 곳을 적당히 입력해 주는 편이 좋다.
(혹시나 해서 언급하지만, Windows 사용자의 경우 별 다른 설정을 하지 않았다면 Vim이 설치된 디렉토리의 _vimrc 파일이 바로 기본 설정파일이다.)
이제 Vim에서 특정 파일을 열고
Ctrl-]
를 누르면 해당 심볼을 검색해서 이동하거나 심볼리스트가 표시되는 것을 볼 수 있을 것이다. 반대로 Ctrl-t
를 누르면 방금 전의 파일로 되돌아가게된다.나는 다음 설정을 추가로 사용한다.
nnoremap <F11> <C-]> nnoremap <F12> <C-t>F11키로 검색하고 F12키로 되돌아오기. 단순한게 좋다.
자 이제 본론으로. (사족이 왜 이렇게 길어졌을까 -_-)
사용자에 따라 호불호가 갈리겠지만, 이 태그 데이터베이스인 tags 파일은 사실 여러 곳에 분포시킬 수도 있고 한 군데에 모아둘수도 있다.
예를 들어 특정 SDK디렉토리에도 tags를 만들고 자신의 프로젝트에 tags를 만들어도 되겠지만 이 둘을 하나의 tags로 관리하는 것도 가능하다. (이를 위해선 find 등을 써서 파일목록을 만들고 ctags로 파싱하는 등의 일련의 스크립트를 만들 필요성이 있다)
하지만 난 여러 프로젝트와 여러 SDK를 사용하는 입장에서 하나의 파일로 tags를 유지하는건 굉장히 낭패다. 겹치는 심볼이 있다면 불편하기도 할테고, 하나의 tags를 유지할거라면 소스가 바뀌어서 새로 만들 때 엄청 오래 걸릴 수도 있다.)
그리고 여러 프로젝트이기 때문에 tags를 특정 디렉토리에 몰아두기 같은 피곤한 일(설정 파일에 tags 위치를 표시해 주는 일)은 귀찮다.
그래서 이런 식의 설정을 이용한다.
set tags=./tags,tags set tags+=../tags set tags+=../../tags ... set tags+=../../../../../../tags set tags+=(특정 SDK의 tags 경로) ...중간에 생략된 부분이 있지만 이해되리라 생각한다. 바로 현재 디렉토리, 혹은 그 상위, 혹은 그 상위의 상위...등등에 tags 파일이 있다고 설정하는 방식이다. 물론 특정 SDK의 심볼도 태그리스트에 포함시킨다.
만약 tags파일이 상위에 없다면 오류가 나겠네? 안난다. 정말 다행이었다. (^ O ^)
이렇게 설정해서 프로젝트 디렉토리(혹은 그 하위 디렉토리)에서 vim을 사용한다면 언제든 자신의 tags를 자동으로 찾을 수 있다.
이게 진짜로 하고 싶었던 이야기. 한번 더 말하지만, 개인 기호와 취향의 문제이니 따라할 필요는 없다. -_-;;
댓글