본문 바로가기
Linux/vim

[vim] YouCompleteMe

by 暻煥 2025. 2. 19.

.

vim에서도 여러 plug-in을 사용하면 Source Insight 및 Visual Studio 수준의 자동완성 기능을 사용할 수 있다.

 

다만, 내 작업환경상 폐쇄망에서 작업하는 경우가 많다.

적합한 Tool을 찾아보다가 YouCompleteMe를 알게되어서, 본 글에 설치 및 사용방법을 작성한다.

(YCM은 완벽히 설치 후, Directory를 그대로 복사해서 옮기면 다른 환경에서도 수행이 쉽다.)


※ 환경

vim 9.1
python 3.12.3
cmake 3.22.1
Ubuntu 24.04

 


※ Vundle 설치

만약 완전 처음부터 Set Up 해야하는 경우라면, vim bundle 부터 설치해야 할 수 있다.

mkdir -p ~/.vim/bundle/
cd ~/.vim/bundle/
git clone https://github.com/VundleVim/Vundle.vim.git

 

vimrc를 아래처럼 수정한다.

vim ~/.vimrc
# File: .vimrc #

# 필수
set nocompatible
filetype off

# 초기화를 위한 run time path 설정
set rtp+=~/.vim/bundle/Vundle.vim

call vundle#begin()
# Vundle 스스로 자신을 관리하도록
Plugin 'VundleVim/Vundle.vim'
call vundle#end()

# 필수
filetype plugin indent on

 

vim 실행 후, 아래 명령을 입력해서 vundle 초기 설정을 완료한다.

:PluginInstall

 


※ YouCompleteMe 설치

먼저 필요한 package들을 설치한다.

# 최소 패키지 설치
apt update
apt install vim vim-gtk3
apt install build-essential cmake vim-nox python3-dev

 

YouCompleteMe를 설치한다.

  • 최신 version에서는 Kernel Source Code가 제대로 Parsing되지 않는것을 발견해서, legacy version으로 설치한다.
  • 여러 종류의 언어에 대해서 자동완성을 제공하지만, C/C++만 선택해서 설치했다.
cd ~/.vim/bundle/
git clone --recursive --branch=legacy-vim-8.2 https://github.com/ycm-core/YouCompleteMe.git

cd ~/.vim/bundle/YouCompleteMe/
python3 install.py --clang-completer  --force-sudo --verbose

 

내가 쓰기 편한 몇가지 옵션을 추가하기 위해 vimrc에 아래처럼 추가한다. 

# File: .vimrc #

""""""""" YouCompleteMe """""""""
" 왼쪽에 compilatione error marker 제거 "
let g:ycm_enable_diagnostic_signs = 0
" compile warning 의심될때 글자색 변경되는거 금지 "
let g:ycm_enable_diagnostic_highlighting = 0
" 오른쪽 위의 preview window 제거 "
set completeopt-=preview
" ETNER 입력하면 popup menu 종료 "
let g:ycm_key_list_stop_completion = ['<C-y>', '<CR>']

이제 설치는 완료했다.

 


※ YouCompleteMe 테스트

해당 자동완선 plug-in은 clang에서 제공하는 compile_commands.json 파일을 분석해서 자동완성 기능을 제공한다.

아래는 cmake를 이용해서 compile_commands.json 파일을 생성하는 방법에 대해서 간단히 예시를 작성한다.

compile_commands.json 파일은 Build를 한번 수행한 후에 생성할 수 있다.

 

Source Tree구조는 아래와 같다.

├── CMakeLists.txt
└── src
    └── main.c

 

CMakeLists.txt 파일은 아래처럼 작성한다.

# 최소 요구 CMake version
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

# 수행과정을 콘솔에 출력
SET(CMAKE_VERBOSE_MAKEFILE true)

# compile_commands.json 생성
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# 컴파일러 경로 지정
SET(CMAKE_C_COMPILER gcc)

# 컴파일러 옵션 추가
ADD_COMPILE_OPTIONS(-g -Wall -O0)

# 바이너리 출력 디렉토리 지정
# SET(RUNTIME_OUTPUT_DIRECTORY /output)

# 변수 정의
SET(SRC_FILES src/main.c)
SET(BIN_FILE myapp.out)

# 최종 실행파일 정의
ADD_EXECUTABLE(${BIN_FILE} ${SRC_FILES})

 

이제 아래 명령어로 Build를 수행한다.

mkdir -p build
cd build/

cmake ..
make all

# out/ 위치에 생성된 compile_commands.json을 top 위치로 이동시킨다
mv compile_commands.json ..

 

이제 vim으로 코드를 작성하면 자동 완성이 동작하는걸 확인 할 수 있다.

 


※ Kernel에서 compile_commands.json 생성

Root Directory에서 아래 Script를 수행한다.

scripts/clang-tools/gen_compile_commands.py

 

YouCompleteMe가 제대로 설치되어 있다면, kernel에 대해서도 잘 작동한다.


 

만약 vim 실행 시,

"vim undefined symbol: PyTuple_Type" Error 발생하면,

 

Makefile에 Python Version을 지정하고,

CONF_OPT_PYTHON3 = --enable-python3interp --with-python3-command=python3.8

 

rdynamic option을 추가해서 vim을 빌드한다.

make LDFLAGS=-rdynamic reconfig

 

 ( 참고 : https://github.com/vim/vim/blob/master/src/INSTALL )


※ 출처 및 참고

https://github.com/VundleVim/Vundle.vim

 

GitHub - VundleVim/Vundle.vim: Vundle, the plug-in manager for Vim

Vundle, the plug-in manager for Vim. Contribute to VundleVim/Vundle.vim development by creating an account on GitHub.

github.com

https://github.com/ycm-core/YouCompleteMe

 

GitHub - ycm-core/YouCompleteMe: A code-completion engine for Vim

A code-completion engine for Vim. Contribute to ycm-core/YouCompleteMe development by creating an account on GitHub.

github.com

https://kernel.googlesource.com/pub/scm/linux/kernel/git/nmenon/linux/+/refs/tags/v5.1/scripts/gen_compile_commands.py 

 

scripts/gen_compile_commands.py - pub/scm/linux/kernel/git/nmenon/linux - Git at Google

# SPDX-License-Identifier: GPL-2.0 # Copyright (C) Google LLC, 2018 # Author: Tom Roeder """A tool for generating compile_commands.json in the Linux kernel.""" _DEFAULT_OUTPUT = 'compile_commands.json' _DEFAULT_LOG_LEVEL = 'WARNING' _FILENAME_PATTERN = r'^

kernel.googlesource.com

 

.

'Linux > vim' 카테고리의 다른 글

[vim] vim-ollama (private AI assistant)  (1) 2025.05.27
[vim] 임의 위치의 tags & cscope 추가  (0) 2024.09.21
[vim][c] syntax highlight  (0) 2024.02.03
[vim] C언어 #ifdef  (0) 2024.02.03
[vim] mark 설치 (형광펜 기능)  (0) 2024.02.03