Vim 개발 환경 구축 및 사용법

ctags, cscope, NERDTree, Taglist, SrcExpl, AutoComplPop

우리는 vim에서 제공하는 다양한 plugin들을 통해서 개발의 편의성 및 생산성을 높일 수 있다. 본 포스트에서는 ctags, cscope, NERDTree, Taglist, SrcExpl, AutoComplPop의 설치 방법 및 기능에 대해서 간단히 알아본다.

  • ctags : 다양한 프로그래밍 언어로 된 소스와 헤더 파일에서 보이는 이름의 인덱스 파일을 생성하는 도구로 소스코드 내에서 함수나 변수가 선언된 곳으로 이동 가능
  • cscope : ctags의 부족한 기능을 보충해주는 도구로 변수 및 함수의 정의, 호출된 곳, 호풀하는 함수, 문자열 검색 등의 기능을 제공
  • NERDTree : Vim을 열어놓은 상태에서 파일 시스템을 탐색하는 기능을 제공
  • Taglist : 함수, 전역변수 리스트를 사이드바로 제공하는 ctags 기반의 툴
  • SrcExpl : 커서가 가리키는 변수 및 함수에 대한 정의를 보여주는 ctags 기반의 툴
  • AutoComplPop : 키워드 자동완성 기능으로 vim에서 Ctrl + P를 통해 자동완성


Installation

ctags, cscope 설치

ctags와 cscope 설치는 패키징 툴인 apt-get, yum을 통해서 설치를 한다.

1
2
$ apt-get install ctags cscope  // for ubuntu
$ yum install ctags cscope // for centOS


NERDTree, Taglist, SrcExpl, AutoComplPop 설치

vim plugin을 쉽게 설치하기 위해서 먼저 vim plugin manager인 Vundle.vim을 설치한다. Vundle.vim을 설치하면 .vimrc 파일에 Plugin ‘plugin_name’ 형태로 원하는 플러그인을 기입후 vim에서 :PluginInstall 을 하여 vimrc에 추가한 플러그인을 설치할 수 있다.

1
2
3
4
5
6
7
8
9
10
$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

$ vi ~/.vimrc
Plugin 'scrooloose/nerdtree'
Plugin 'SrcExpl'
Plugin 'taglist.vim'
Plugin 'AutoComplPop'

$ vim
:PluginInstall

( https://github.com/dhkoo/DevEnv 내의 .vimrc 참고 )

위의 과정을 통해서 NERDTree, Taglist, SrcExpl, AutoComplPop 플러그인 설치가 완료되었다. 설치된 플러그인들은 vim의 ex모드(:)에서 NERDTree, Tlist, SrcExpl 를 입력하면 실행된다. AutoComplPop은 기본적으로 enable되어 있어 “ctrl + p” 를 사용하여 자동완성 기능을 사용할 수 있다.



Usage

ctags 설정 및 사용방법

1
2
3
4
5
6
$ ctags -R  // 인덱스를 생성하고 싶은 최상위 디렉터리에서 수행

$ vi ~/.vimrc
set tags=태그 경로
// 이 설정을 통해서 어느 위치에서든지 tag 검색이 가능
// set tags=..tag1,..tag2 방식으로 등록가능

vimrc에서 set tags를 설정하지 않는 경우, ctags -R을 통해 생성된 tags 파일이 위치한 경로가 아닌 다른 경로에서 파일을 열었을 때 ctags가 tags 파일을 참조하지 못하여 동작하지 않게 된다. 따라서 vimrc에 set tags를 설정해줌으로써 어느 경로에서도 tags를 참조할 수 있도록 해준다. 다른 방법으로는 ex모드(:)에서 “:set tags 경로” 를 통해 임시적으로 설정해 줄 수 있다.

1
2
3
4
5
6
7
8
9
10
:tj 함수명 or 구조체명 
// tj는 tags jump를 의미함
// 이동 : space, d | q -> type number and enter )

ctrl + ] : 태그로 이동
ctrl + t : call 햇던 곳으로 이동

:sts 함수명 or 구조체명
// 전체창으로 수행되는 tj 기능
~~~

cscope 설정 및 사용방법

cscope을 사용하기 위해서는 몇가지 작업이 필요하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ vi mkcscope
rm -rf cscope.files cscope.files
find $(pwd) \( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name '*.S' \) -print > cscope.files
cscope -i cscope.files

$ chmod 775 mkcscope && mv mkcscope /usr/bin or /usr/local/bin

$ vi ~/.vimrc
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
if filereadable("./cscope.out")
cs add ./cscope.out
elseif filereadable("../cscope.out")
cs add ../cscope.out
elseif filereadable("../../cscope.out")
cs add ../../cscope.out
elseif filereadable("../../../cscope.out")
cs add ../../../cscope.out
elseif filereadable("../../../../cscope.out")
cs add ../../../../cscope.out
endif
set csverb

$ mkcscope & ctrl + d
// 원하는 디렉터리에서 mkcscope을 수행하고 빌드가 완료되면 ctrl + d 로 종료

구체적인 사용방법은 다음과 같다.

  • $ cscope ( 전체화면으로 찾을 검색 가능 )

  • :cs find {query type} {symbol_name}

    • 0 or s : symbol_name 중 검색 (Cntl-‘’ + s)
    • 1 or g : symbol_name의 정의를 검색 (Cntl-‘’ + g)
    • 2 or d : symbol_name에 해당하는 함수에서 호출된 함수를 검색 (Cntl-‘’ + d)
    • 3 or c : symbol_name에 해당하는 함수를 호출하는 함수를 검색 (Cntl-‘’ + c)
    • 4 or t : symbol_name에 해당하는 text문자열을 검색 (Cntl-‘’ + t)
    • 6 or e : 확장 정규식을 사용하여 symbol_name을 검색 (Cntl-‘’ + e)
    • 7 or f : 파일 이름중에서 symbol_name을 검색 (Cntl-‘’ + f)
    • 8 or i : symbol_name을 include하는 파일을 검색 (Cntl-‘’ + i)

검색을 할때마다 ex모드로 :cs find {query type} {symbol_name}을 입력하는건 매우 번거롭기 때문에 매핑파일을 이용하여 쉽게 검색할 수 있다.

1
2
3
4
5
$ wget http://cscope.sourceforge.net/cscope_maps.vim
$ mkdir ~/.vim/plugin
$ mv cscope_maps.vim ~/.vim/plugin

단축키 : Ctrl + \ + query_type

cscope_maps.vim을 다운받아 ~/vim/plugin에 넣어놓으면 원하는 변수 또는 함수에 커서를 놓고 “Ctrl + \ + {query type}“ 로 검색을 가능하게 해준다.


NERDTree 사용법

vim의 ex모드에서 :NERDTree 를 입력하면 왼편에 디렉터리 및 파일 뷰를 제공하는 사이드바가 생성된다. :NERDTree 를 검색할 때 대소문자 구분없이 그냥 ner까지 치고 tab 누르면 자동완성된다.

창 간의 이동은 vim prefix인 “Ctrl + w + 방향키” 로 가능하며, 사이드바 닫기는 사이드바로 이동 후 :q 또는 :NERDTreeToggle 을 통해서 닫을 수 있다.


Taglist 사용법

vim의 ex모드에서 :Tlist 를 입력하면 왼편에 전역변수와 함수 리스트를 보여주는 사이드바가 생성된다. 해당 창으로의 이동은 vim prefix (ctrl + w) + 방향키를 통해서 이동이 가능하며 사이드 바의 변수 또는 함수 리스트를 누르면 해당 위치로 이동되는 기능을 제공한다.


SrcExpl 사용법

vim의 ex모드에서 :SrcExpl 를 입력하면 하단에 창이하나 생긴다. 해당 창에서는 커서가 가리키는 변수 또는 함수의 정의를 보여준다. 아래 그림과 같이 SetupTests라는 함수에 커서를 놓으면 하단에 SetupTests라는 함수를 보여준다. 창의 이동은 vim prefix + 방향키이며 해당 창에서도 위아래로 움직이며 자유롭게 볼 수 있다.



ETC

Vim buffers

ctags를 통한 이동 또는 NERDTree를 통해서 여러 파일을 열었을 경우, vim에서는 해당 파일을 vim 내부 버퍼에 보관한다. 목록확인 및 버퍼에 있는 파일 이동 방법은 다음과 같다.

  • :buffers - 버퍼에 있는 목록 확인
  • :bnext - 다음 파일로 이동
  • :bprevious - 이전 파일로 이동

마찬가지로 ex모드에서 매번 입력하는건 귀찮다.
우리는 “Ctrl + 6 또는 ^” 를 사용하여 버퍼내의 파일간 이동을 하자.


Comments: