-
[vim][plugin] YouCompleteMe (YCM) - 본격 vim을 IDE로 만들기Develop/Tools 2015. 8. 4. 14:40
vim을 사용하다 보면 여러모로 귀찮은 것이 자동완성 기능이 없다는 것이다. 이에 여러 자동완성(Omni..) 플러그인들이 있는데 각각 장단점이 있다.
이번에 소개할 플러그인은 요즘 핫하게 이슈화가 되고 있는 Clang을 이용한 플러그인이 있어 소개해 보려한다.
소개할 플러그인은 YouCompleteMe.. (이하 ycm) 이름에서도 알 수 있듯이 vim의 부족한 부분을 채워줄 것 같이 생겼다.
이름 작명 센스가.... +_+
공식 github에 있는 예시
특징
- 자동완성 (C / C++ / Python / Ruby / Java 등등.. 여러 언어 지원)
- Clang을 이용
- 코드 점프 기능
설치
Bundle을 이용하면 쉽게 설치가 가능하다.
- 아래 라인을 .vimrc에 추가
Bundle 'Valloric/YouCompleteMe' - Bundle에 설정된 패키지를 설치하기 위해 vi에서 아래 명령어를 실행
:BundleInstall C++을 사용한다면 C Sementic 지원을 위해 컴파일이 필요하다. Clang을 필요로 하니 필요한 패키지는 미리 설치해 두어야 한되 (sudo apt-get install clagn)
cd ~/.vim/bundle/YouCompleteMe
./install.sh --clang-completer
사용법
간단히 사용하면 좋겠지만... eclipse처럼 일종의 project파일을 만들어줘야 한다.
clang 입장에서 소스를 빌드하여 비트 코드를 생성하고 이를 자동완성에 사용할텐데, 어느 소스를 컴파일할지 명세해주지 않으면 어쩔 도리가 없지 않는가?
설정 파일은 default로 .ycm_extra_conf.py 라는 파일을 소스 최상단에 위치 시켜주면 된다. 파이썬으로 짜여져 있으며 대부분의 프로젝트에서는
기본으로 주어지는 설정을 사용하면 된다.
https://github.com/Valloric/ycmd/blob/master/cpp/ycm/.ycm_extra_conf.py
딱보면 아.. 여기에 뭘 넣어야 겠구나 라는 것이 보일 것이니.. 세부적인 것은 패스하도록 한다.
flag 부분만 잘 보면 될 것 같은데..
추가적인 헤더 파일 패스나 컴파일 옵션이 필요하면 여기에 넣어주면 된다.
Vim에서 사용법
간단하게 ctrl + space를 누르면 자동완성을 위한 후보가 나오게 된다. 보통은 저 키를 눌러 사용하지 않을테고 C / C++을 예로 들면 .(쩜) 이나 -> (포인터 접근)를 입력하게 되면
자동으로 후보가 나오게 되어있다.
이 넘의 큰 장점은 아무래도 clang에서 빌드되어 나오는 비트 코드를 사용하기 때문에 실제 클래스에 선언, 구현되어 있는 함수나 변수를 보여준다는 것이다.
패턴 매칭으로 보여주는게 아니라...
코드 점프
또하나의 장점이 있다면 코드 점프를 지원한다는 것이다.기존에 많이 사용되던 ctags나 cscsope의 경우 c에서는 큰 문제점은 없었지만
규모가 큰 c++에서 사용하면 다른 class에 구현된, 같은 이름의 함수도 suggestion이 되어 버리는 문제가 있었는데
ycm에서는 context를 파악하여 suggestion해 주는 것이 다른 점이겠다. Good :)
사용법:
:YcmCompleter GoTo
:YcmCompleter GoToImprecise
:YcmCompleter GoToDeclaration
* .vimrc 설정 예제
Bundle 'Valloric/YouCompleteMe'
let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py'
let g:ycm_confirm_extra_conf = 0
"To avoid conflict snippets
let g:ycm_key_list_select_completion = ['<C-j>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-k>', '<Up>']
let g:ycm_autoclose_preview_window_after_completion = 1
nnoremap <leader>g :YcmCompleter GoTo<CR>
nnoremap <leader>gg :YcmCompleter GoToImprecise<CR>
nnoremap <leader>d :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>t :YcmCompleter GetType<CR>
nnoremap <leader>p :YcmCompleter GetParent<CR>
링크
- 공식 github
https://github.com/Valloric/YouCompleteMe
댓글