Vim에서 YouCompleteMe를 사용한 자동 완성 구현

1. 사전 준비 조건

(1) Python 지원이 가능한 최신 Vim 버전(7.3.584 이상) 필요

터미널에서 다음 명령어를 입력하여 버전 확인: vim –version 또는 Vim 내에서 version 명령어 사용, python 항목 앞에 '+' 기호가 있는지 확인

터미널에서 다음 명령어 실행:

sudo apt-get install python-dev

설치 중 문제가 발생할 경우, 다음 명령어 순서로 실행:

sudo apt-get update
sudo apt-get install -f

이후 재설치 시도:

sudo apt-get install python-dev

(2) cmake 설치

Ubuntu 환경에서는: sudo apt-get install cmake

(3) clang 설치

Ubuntu 환경에서는: sudo apt-get install clang

이 단계는 건너뛰어도 무방하며, YCM 컴파일 시 자동으로 설치됨

(4) Vundle 설치

Vim 플러그인 관리를 위한 도구로, 설치 및 제거가 간편하며 각 플러그인은 bundle 디렉토리 내의 폴더 형태로 존재함

2. Vundle 설치

(1) `$:git clone https://github.com/VundleVim/Vundle.vim ~/.vim/bundle/Vundle.vim`

('%'는 명령 프롬프트 표시)

(2) .vimrc 파일 시작 부분에 다음 내용을 삽입하고 저장:

set nocompatible              " 개선된 모드 사용

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" Vundle 자체 관리를 위해 필요
Plugin 'VundleVim/Vundle.vim'
Plugin 'scrooloose/syntastic'
Plugin 'tpope/vim-fugitive'
Plugin 'Lokaltog/vim-easymotion'
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
Plugin 'tpope/vim-rails.git'
Plugin 'L9'
Plugin 'FuzzyFinder'
Plugin 'git://git.wincent.com/command-t.git'
Plugin 'file:///Users/gmarik/path/to/plugin'
Plugin 'ycm-core/YouCompleteMe'

call vundle#end()
filetype plugin indent on     " 필수!

참고: Plugin '플러그인명 또는 Git 링크' 는 설치할 플러그인을 의미

(3) 다시 Vim을 열고 명령 모드에서 실행: PluginInstall

(YouCompleteMe의 github 주소)

플러그인 설치 진행:

Plugin 앞에 '>'가 표시되면 해당 플러그인이 설치 중이며, YouCompleteMe는 설치 시간이 다소 소요되므로 인내심을 갖고 대기, 마지막에 오류 메시지가 나타나지만 이는 정상이며 YCM은 수동으로 라이브러리 파일을 컴파일해야 하므로 위 그림과 같은 '!' 표시는 무시해도 됨

참고: 플러그인 제거를 원할 경우, .vimrc에서 "Plugin '플러그인' " 문장을 삭제한 후 Vim 명령 모드에서 PluginClean을 실행

3. YouCompleteMe 컴파일

(1)

% cd ~/.vim/bundle/YouCompleteMe/
% python3 install.py --clang-completer

--clang-completer 파라미터는 C/C++ 자동 완성을 지원하기 위한 것이며 필요하지 않을 경우 생략 가능

컴파일 과정은 다소 시간이 소요되므로 인내심을 가지고 대기

다음 경고가 나타날 경우: WARNING: this script is deprecated. Use the install.py script instead.

File /home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/build.py does not exist; you probably forgot to run:

git submodule update --init --recursive

원인은 Vundle 설치 미사용 또는 네트워크 속도 문제로 의존 패키지를 완전히 다운로드하지 못한 경우

해결 방법:

YouCompleteMe 디렉토리 진입 후 터미널에서 git submodule update --init --recursive 입력

(2) 설정 파일 .ycm_extra_conf.py 위치 찾기

온라인 문서에는 YouCompleteMe/cpp/ycm에 있다고 되어 있으나, 실제 YouCompleteMe 디렉토리에는 cpp 폴더가 없으며, 이전에는 third_party/ycmd/cpp/ycm 디렉토리에 있었으나 현재는 third_party/ycmd/examples 디렉토리로 이동됨.

% cd ~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/

ls -a 로 확인 가능

(3) YouCompleteMe 내에 cpp/ycm 디렉토리 생성 후 .ycm_extra_conf.py 복사

% cd ~/.vim/bundle/YouCompleteMe
% mkdir cpp
% mkdir cpp/ycm
% cp third_party/ycmd/examples/.ycm_extra_conf.py cpp/ycm/

4. .vimrc 설정 파일 수정

다음 내용을 .vimrc에 추가:

" 전역 설정 파일 탐색
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py'
" Python 검사를 위한 syntastic 비활성화
let g:syntastic_ignore_files=[".*\.py$"] 
" ctags로 생성된 태그 파일 사용
let g:ycm_collect_identifiers_from_tag_files = 1
" 시맨틱 자동 완성 활성화
" C 언어 자동 완성 단축키 변경 (기본은 CTRL+space, ALT+;로 변경 - 효과 미확인)
"let g:ycm_key_invoke_completion = ''
" 정의로 이동하는 단축키를 ALT+G로 설정 - 효과 미확인
"nmap  :YcmCompleter GoToDefinitionElseDeclaration =expand("<cword>")<CR><CR> 
" 키워드 자동 완성
"let g:ycm_seed_identifiers_with_syntax = 1
" 자동 완성 항목 수신 후 분할 창 표시 방지
set completeopt-=preview
" 일반 IDE와 동일한 자동 완성 동작 설정
set completeopt=longest,menu
" Vim 시작 시 ycm_extra_conf 파일 검사 정보 표시 안 함
let g:ycm_confirm_extra_conf=0
" 매번 새롭게 일치 항목 생성, 캐시 사용 안 함
let g:ycm_cache_omnifunc=0
" 주석에서도 자동 완성 가능
let g:ycm_complete_in_comments=1
" 첫 문자 입력 시 자동 완성 시작
let g:ycm_min_num_of_chars_for_completion=1
" 오류 심볼
let g:ycm_error_symbol='>>'
" 경고 심볼
let g:ycm_warning_symbol='>*'
" ultisnips 코드 스니펫 자동 완성 사용 안 함, 필요 시 1로 설정
" let g:ycm_use_ultisnips_completer=0

위 내용 중 첫 번째 전역 설정 파일 탐색 문장을 제외하고 나머지 문장은 필요에 따라 변경, 삭제 또는 추가 가능

참고: 3단계에서 cpp/ycm 디렉토리 생성 및 .ycm_extra_conf.py 파일 복사 미수행 시, 첫 번째 줄의 경로를 실제 전역 설정 파일 위치로 변경:

let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py'

5. .vimrc 저장 후 종료, C/C++ 소스 프로그램 열어서 자동 완성 효과 체험

C++ STL 라이브러리 스마트 자동 완성도 가능:

6.

(1) 위에서 설치한 syntastic과 함께 문법 검사도 가능

'>>'는 문법 오류 지점을 나타내지만 검사 속도가 느려 실용성이 낮음

자동 문법 검사가 번거로울 경우 비활성화 가능:

/bundle/YouCompleteMe/plugin 진입

youcompleteme.vim 파일의:

141번째 줄의 파라미터를 0으로 변경

7. 헤더 파일 추가

현재 include에서 stdio.h 등 헤더 파일 자동 완성이 불가능하므로 /usr/include 경로를 추가해야 함. 경로는 ~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py 파일의 flags 배열에 추가하며, 각 경로 앞에는 '-isystem'을 붙여야 함

향후 boost 라이브러리 등의 자동 완성이 필요할 경우에도 해당 경로를 추가해야 함

-YouCompleteMe는 더 많은 강력한 기능을 제공하며 관심이 있다면 계속 탐색 가능

자동 들여쓰기

자동 들여쓰기는 유용하지만 특정 상황(예: 다중 행 함수 정의)에서는 원하는 결과를 얻기 어려우며, 특히 PEP8 표준 준수 측면에서 문제가 있음. indentpython.vim 플러그인을 활용하여 이 문제 해결 가능:

Plugin 'vim-scripts/indentpython.vim'

태그: vim youcompleteme autocomplete Clang ycm

9월 21일 02:18에 게시됨