universal-ctags 와 tagbar 설치

이번 글에서는 코드 분석에 매우 유용한 플러그인들 universal-ctags 와 tagbar 를 설치해보려 합니다. tagbar 가 ctags 에 종속성이 있기 때문에 두 플러그인을 묶어서 진행하겠습니다. 사실 다들 아실만한 플러그인들 이지만, 개인적인 정리차원에서의 글 작성 목적도 있기 때문에 진행하려고 합니다.


universal-ctags 설치

ctags 는 다양한 언어로 작성된 소스 코드들의 태그 정보들을(클래스, 함수, 변수 등) 인덱싱하고, 이를 데이터베이스화한 파일을 생성해주는 툴입니다. 이렇게 생성된 파일은 vim, emacs 같은 리눅스에서 자주 사용되는 편집툴 뿐만 아니라 EditPlus, NotePad++ 같은 윈도우 편집툴 등 수십 여개의 편집툴에서 지원하고, 이는 ctags 가 매우 오래된 툴이라는 것을 입증하는 것이기도 합니다.

ctags 는 최초의 original ctags 에 이어 exuberant ctags, universal ctags 순으로 fork 되어 현재도 개발이 진행 중입니다. universal ctags 에서는 기존 버전인 exuberant ctags 대비 지원 언어가 대폭 늘었고(41 -> 103), C, C++ 을 포함한 몇몇 언어의 parser가 개선 되었다고 하니 본 글에서는 universal ctags 기준으로 설치를 진행하겠습니다.

ubuntu 에서는 다음과 같이 간단하게 설치할 수 있습니다.

$ sudo apt install universal-ctags

잘 설치되었는지 확인 해봅니다. 버전 정보가 좀 이상해보이지만.. 잘 동작할 것이라고 믿습니다.

$ ctags --version
Universal Ctags 0.0.0, Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
Compiled: Jan 6 2019, 23:23:29
URL: https://ctags.io/
Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +json, +interactive, +sandbox, +yaml

.vimrc 에도 관련 설정이 필요합니다. 필수로는 tags 파일 위치를 지정해주어야 하고, 부가적으로 개인 편의에 맞게 단축키 설정이 필요합니다. 전 다음과 같이 설정했습니다

" <c-]>를 g<c-]>로 할당: 일반, 비주얼 모드에 적용
" <c-]>의 :tag 동작(첫번째로 찾아지는 태그로 이동) 대신
" g<c-]>의 :tjump 동작(이동할 태그 선택) 사용
map <c-]> g<c-]>

" 현재 경로부터 상위 경로로 tags 파일 찾아가도록 설정
set tags=tags;

실제로 사용해보겠습니다. 프로젝트 경로로 이동 후 다음 명령으로 태그 파일을 생성합니다.

myJava$ ctags -R

이후 프로젝트 내 코드를 열고, 특정 태그 위에서 <c-]> 를 눌러보면 아래 그림처럼 잘 동작하는 것을 볼 수 있습니다. ctags 사용의 경우, 관련된 다양한 단축키들이 있지만 태그 점핑(g<c-]>) 과 이전 태그로 이동하기(<c-t>)만 잘 사용하신다면 부족함은 없으리라 생각합니다.

ctags 동작 화면


tagbar 설치

tagbar 는 현재 편집중인 코드를 인덱싱해 이클립스의 outline view 와 같은 기능을 제공해주는 플러그인 입니다. vim-plug 로 설치할 수 있으므로 다음과 같이 .vimrc 내 vim-plug 초기화 섹션에 tagbar 를 추가합니다.

$ vim ~/.vimrc 
... 
call plug#begin('~/.vim/plugged') 
... 
Plug 'majutsushi/tagbar'
... 
call plug#end() 
...

편집한 .vimrc 를 저장하고, 다시 읽어 플러그인을 설치합니다.

:w
:source %
:PlugInstall

아래 설정들은 필수는 아니지만 제 개인 편의에 맞게 추가하겠습니다. 대부분의 경우 아래 두 설정들만 설정될 것 같구요.

" F12 를 tagbar 토글 키로 사용
map <F12> :TagbarToggle<CR>

" tagbar 가로 사이즈 설정
let g:tagbar_width=40

이후 코드 편집 시 F12 를 클릭하면 아래 그림과 같이 tagbar 가 출력됩니다. <c-w> + g,h,j,k 나 <c-w><c-w> 로 tagbar 윈도우로 이동 후 특정 태그에서 엔터키로 커서 위치 이동 등의 동작도 가능합니다.

tagbar 동작 화면


* Environment

- HW: DS920+ (Synology NAS)
- OS: Ubuntu 20.04 (Docker container)
- vim 8.1


* References

- WIKIPEDIA: Ctags 
- Exuberant Ctags 
- Universal Ctags
- github: tagbar

Leave a Comment