태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

vim2016. 2. 28. 02:08

youcompleteme는 줄여서 YCM이라고 말합니다. YCM는 일단 클라이언트와 데몬이 있습니다. 이맥스에도 사용 가능하고, vim에서도 사용 가능합니다.


1. 준비사항

기본 패키지 설치

우선 vim에게 외부스크립트인 파이썬을 vim에서 실행할 수 있게 지원해야합니다.

sudo apt-get install vim
sudo apt-get remove vim
sudo apt-get install vim-nox

YCM는 그냥 플러그인만 깔면 되는게 아닌 컴파일 작업을 해주어야 작동합니다. 다음은 컴파일 관련 준비 패키지 입니다.

sudo apt-get install build-essential cmake
sudo apt-get install python-dev python3-dev

YCM가 C-Family 언어를 지원할려면 clang가 설치되야합니다.

sudo apt-get install clang

YCM가 C#을 지원할려면 mono-devel도 설치하셔야 됩니다.

sudo apt-get install mono-devel

vim 패키지 관리자인 Vundle 설치

vim 패키지 관리자는 여러개가 있지만 전부 git을 사용합니다. git을 설치하고 Vundle을 설치해줍시다.

sudo apt-get install git
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

인제 이 내용을 .vimrc에 추가해주세요.

set nocompatible              " be iMproved, required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'Valloric/YouCompleteMe'

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList       - lists configured plugins
" :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

플러그인을 갱신 (+설치) 합니다. 명령어로 하지 않고 vim에서 :PluginInstall로 설치하는 방법도 있습니다. 주의할 점은 YCM는 크기가 상당히 커서 다운로드가 생각보다 오래 걸립니다. (패키지매니저에 따라 작동 안될 수도 있습니다)

vim +PluginInstall +qall

인제 YCM가 있는 ~/.vim/bundle/YouCompleteMe/ 로 가셔서 서브 모듈을 받아 주십시오.

git submodule update --init --recursive

[32비트 운영체제일 경우] clang 버전 문제 해결하기

64비트면 그냥 컴파일이 되겠지만 32비트에선 안될 수 있습니다. 그래서 32비트만 다음과 같은 과정이 필요합니다. clang이 3.6 버전 이상일 경우 안해도 된다는데 라즈베리파이에서 작업해서 잘 모르겠군요. ppa나 deb등 백포트 저장소에서 ARMv6 바이너리 파일은 지원이 안된답니다..

cd /usr/lib/llvm-3.5/lib
sudo ln -s libclang.so.1 libclang.so

[라즈베리파이 전용] 메모리 확보

라즈베리파이에선 최종으로 완성한 컴파일 명령어를 써주기전에 할 일이 있습니다. 라즈베리파이 1의 램으로는 Virtual memory exhausted: Cannot allocate memory가 발생합니다. 메모리 부족으로 컴파일이 중단됬다는 이야기죠 (...)

링크를 참고하시면 됩니다. 라즈베리파이는 기본적으로 dphys-swapfile를 사용하여 스왑 파일을 100MB로 관리하고 있습니다. 더 높은 값을 설정해도 최대 2GB밖에 안됩니다.

 sudo vim /etc/dphys-swapfile 

CONF_SWAPSIZE=2048로 바꿔줍니다.

sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

2. 소스 컴파일

그냥 ./install.py을 해도 되지만 c, c++ 지원을 위해 --clang-complete을 붙여줘야합니다. --system-libclang는 32비트일 경우 여러가지 이유로 붙여야 컴파일이 됩니다. --omnisharp-completer는 C#을 위해 붙입니다. golang는 잘 모르겠네요.

YCM_CORES=1는 라즈베리파이1에서 필수입니다. 램이 1GB인 라즈배리파이2는 상관이 없지만 1은 512MB의 적은 메모리로 컴파일 오류를 뱉을 수 있습니다.

 ~/.vim/bundle/YouCompleteMe/install.py --clang-completer --system-libclang
또는
YCM_CORES=1 ~/.vim/bundle/YouCompleteMe/install.py --clang-completer --system-libclang
또는
~/.vim/bundle/YouCompleteMe/install.py --clang-completer --omnisharp-completer --system-libclang 

3. 설정

ycm_extra_conf.py 설정 파일 불러오기

ycm_extra_conf.py 라는 설정파일을 불러와야 정상작동합니다. 저는 아무생각없이 wget로 가져오는 실수를 하는 바람에.. 파일 명은 .ycm_extra_conf.py이지만 실제 내용은 html가 복사 됬습니다... 디버깅 옵션 키고 오류 메세지를 뒤져서 나온게 5 : <DOCTYPE>이였죠... ~/.vim/.ycm_extra_conf.py에 저 파일 내용을 붙여넣으면 됩니다.

https://github.com/Valloric/ycmd/blob/master/cpp/ycm/.ycm_extra_conf.py


.vimrc에서 YCM 옵션 설정

인제 .vimrc에서 다음과 같은 내용을 추가해주시면 됩니다. 이 설정파일은 이 글에서 가져왔습니다. 참고로 키는 보통 '\' 역슬래쉬 키입니다.

let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py'
let g:ycm_confirm_extra_conf = 0
let g:ycm_key_list_select_completion = ['', '']
let g:ycm_key_list_previous_completion = ['', '']
let g:ycm_autoclose_preview_window_after_completion = 1
let g:ycm_warning_symbol = '>*'

nnoremap g :YcmCompleter GoTo
" nnoremap gg :YcmCompleter GoToImprecise
nnoremap d :YcmCompleter GoToDeclaration
nnoremap t :YcmCompleter GetType
nnoremap p :YcmCompleter GetParent 

YCM는 옵션이 참 많습니다. 그 중 몇 가지를 알아보죠.

g:ycm_min_num_of_chars_for_completion = 1    " 기본값은 2입니다. 문자가 1개 입력되면 그 때부터 자동완성을 시작합니다. 쓰지 않을려면 99같은 큰 값을 넣어줍니다.
let g:ycm_auto_trigger = 0    " 기본값은 1입니다. '.'이나 '->'을 받으면 자동으로 목록들을 출력해주죠.
let g:ycm_collect_identifiers_from_tags_files = 1    " tags 파일을 사용합니다. 성능상 이익이 있는걸로 알고 있습니다.
let g:ycm_filetype_whitelist = { '*': 1 }    " 화이트 리스트를 설정합니다.
let g:ycm_filetype_blacklist = {
      \ 'tagbar' : 1,
      \ 'qf' : 1,
      \ 'notes' : 1,
      \}    " 블랙 리스트를 설정합니다.

표준 라이브러리 추가하기

이 상태에서 사용을 해보시면 현재 디렉토리에 있는 소스파일속 함수들만 나올껍니다. YCM를 설치한 이유는 수 많은 함수들의 이름을 자동완성 시켜주며 함수의 인자를 팝업창으로 가볍게 보기 위한건데 이거만 덜렁 있으면 의미가 없어질껍니다. 기본 헤더파일하고 STL 헤더파일을 추가해줍시다.

echo | gcc -std=c++11 -v -E -x c++ -      " gcc를 사용할 경우
echo | clang -std=c++11 -stdlib=libc++ -v -E -x c++ -      "clang을 사용할 경우

그러면 여러 정보가 뜰껍니다. 그 중 #include "..." search starts here: 와 #include <...> search starts here: 을 찾으시고 거기 나온 헤더파일 경로들을 ycm_extra_conf.py 설정 파일에 적어주시면 됩니다. 리눅스 배포판마다 경로가 다를껍니다. 다음은 예시입니다.

 ... 중간 생략 ... (예시)
'-x',
'c++',

'-isystem',
'/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/../../../../include/c++/5.3.0',
'-isystem',
'/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/../../../../include/c++/5.3.0/x86_64-unknown-linux-gnu',
'-isystem',
'/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/../../../../include/c++/5.3.0/backward',
'-isystem',
'/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include',                               
'-isystem',
'/usr/local/include',
'-isystem',
'/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include-fixe',
'-isystem',
'/usr/include',

'-isystem',
'../BoostParts',
... 중간 생략 ... (예시)

isystem은 하위폴더에 있는것도 검색해주지 않은걸로 알고있습니다. GL/glut.h 같은 경우 그냥 glut.h을 하면 골치아파 질 수도 있으니깐요.

함수 인수를 보고 싶을 땐 자동완성 및 목록 출력을 의도적으로 시키는 Ctrl+Space 키를 눌러주시면 됩니다. prinft를 예시로 들면 여러 함수가 나오면서 fprintf, fwprintf, sprintf ... 이런 식으로 유사한 함수도 같이 나옵니다.

[아치리눅스에서 발생하는 문제 해결법]

명령어를 입력하고 .vimrc에서 옵션으로 파이썬 경로를 지정해주시면 됩니다.

sudo ln -s /usr/lib/libncursesw.so.6.0 /usr/lib/libncurses.so.5
let g:ycm_server_python_interpreter = '/usr/bin/python3'

4. 사용법

Ctrl+Space키로 의도적인 자동 완성을 사용하실 수 있습니다.

vim에서 코드 점프를 할 수 있습니다. 큰 프로젝트에선 tags를 사용하는 것보단 YCM가 더 정확합니다. tags를 사용하면 ctrl+], ctrl+t키지만 YCM에선 :GoToImprecise를 사용하기 때문에 vim의 jumplist가 필요합니다. :jumps로 목록을 볼 수 있으며 Ctrl+O키로 이전에 있었던 장소를 갈 수 있고 Ctrl+I로 이전인 상태에서 다음으로 되돌아 갈 수 있습니다. 자세한건 :h jumplist를 참고하세요

:YcmCompleter GoTo    " 이 기능은 가장 현명한 곳으로 이동할려고 합니다.
:YcmCompleter GoToImprecise    " 빠르지만 잘못돈 곳으로 갈 수 있으므로 위험합니다. 이건 C-family 언어만 사용 가능합니다.
:YcmCompleter GoToDeclaration    " 커서 아래에있는 기호를 보이고 선언으로 이동합니다.

위에서 작성한 설정은 보시면 아시겠지만 자동 완성으로 목록이 생길 때 ctrl+j, ctrl+k로 이동하거나 화살표 키를 쓰시면 됩니다. 코드에서 함수 선언으로 이동 등은 \g나 \d를 적절히 사용하시면 됩니다.


5. 끝

후기

이 글에 나온 오류를 다 겪었습니다... 검색해도 별로 안나오고요. 그래서 간단히 정리한 내용을 티스토리에 적다 보니 점점 양이 늘어났네요. YCM는 문제가 생기면 검색보다 README를 먼저 봐야 할 정도로 중요시 여겨야합니다. 처음은 상당히 복잡하고 어지러워서 이렇게 정리를 했습니다.

라즈베리파이1에서는 성능이 상당히 딸리기 때문에 입력시 가끔 빨간 줄을 보실 수 있습니다. RuntimeError: Still parsing file, no completions yet. 하고 HTTPConnectionPool(host='127.0.0.1', port=59837): Read timed out. (read timeout=0.5) 오류가 뜹니다. 코드가 300줄만 넘어가도 못쓸정도이니 이걸 사용하실려면 라즈베리파이2 정도 되어야 합니다.


변경 사항

처음 등록일(기억 안 남) : 기존에 메모한 내용들을 정리하여 올림.
2016.4.9 : vim-nox 설치법 + vundle 설치법 + 아치리눅스 문제 해결법 + 표준 라이브러리, STL 추가 방법
2016.5.3 : 컴파일 시 요구하는 패키지를 깜박하고 안 써서 수정
2017.4.12 : YouCompleteMe unavailable: No module named ycmd 문제 해결
2018.7.11 : YouCompleteMe 실행 영상 추가

참고 링크들

http://modal.us/blog/2015/03/06/youcompleteme-on-vim-7-4-in-ubuntu-trusty-32-bit/
http://vanderwoude.net/blog/2015/11/pi-python-vim-youcompleteme-plugin/
http://ferenc.homelinux.com/?p=248
https://www.bitpi.co/2015/02/11/how-to-change-raspberry-pis-swapfile-size-on-rasbian/
http://nophotoplease.tistory.com/6
http://vi.stackexchange.com/questions/6446/installation-of-youcompleteme http://vim.wikia.com/wiki/Use_Vim_like_an_IDE http://yyypasserby.github.io/post/vim-youcompleteme-settings


Posted by never neverapple88

댓글을 달아 주세요

  1. 감사합니다
    글고 네버님 발행으로 올리세요 ㅋㅋㅋ 그래야 공감버튼 생겨요

    2016.06.03 21:18 [ ADDR : EDIT/ DEL : REPLY ]