이번에는 neovim에서 coc.nvim를 이용하여 C/C++ 개발환경을 세팅하는 방법에 대해서 알아보겠다.
coc.nvim은 Language Server Protocol인 LSP를 지원하는 코드 auto-completion 패키지인데 이전에는 ycm을 사용하다가 너무 무겁기도 하고 개인적으로 환경설정 부분에 불편함 점이 있어 coc.nvim을 사용하게 되었다.
coc.nvim 설치
vim-plug 설정부분에 아래를 추가해준뒤, :PlugInstall
을 해준다.
Plug 'neoclide/coc.nvim', {'tag': '*', 'do': './install.sh'}
참고로, node.js 10.12 버전 이상이 설치되어있어야 한다. node.js가 설치되어있지 않다면 여기를 참고하여 다운로드 및 설치를 진행해주자.
cpp language server 설치
이곳을 보면 C/C++ language server에 맞는 configuration example을 제공한다.
clangd, coc-clangd, ccls, cquery등이 여러 language server 패키지가 있지만, 이 포스팅에서는 ccls를 설정하는 방법을 다룰것이다.
ccls를 사용하려면 직접 빌드를 해주어야하는데, ccls는 다음의 패키지를 필요로 한다.
- CMake 3.8 버전 이상
- C++17을 지원하는 컴파일러
- clang >=5
- gcc >=7.2
- clang+llvm >=7 의 include와 lib
clagn+llvm 의 include와 lib를 저장하고있는 폴더가 없거나 경로지정이 애매하다면, 여기에서 pre-built binaries를 다운로드 한뒤, 특정 폴더에다 해제를 한다.
위의 조건을 모두 만족한다면 빌드 준비가 모두 완료된것이므로, ccls repository를 clone후 아래 명령어를 따라 빌드한다.
git clone --depth=1 --recursive https://github.com/MaskRay/ccls
cd ccls
cmake -H. -BRelease -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/path/to/clang+llvm-xxx # clang pre-built binaries 폴더
cmake --build Release
wget 커맨드를 이용하는 방법도 있다.
wget -c http://releases.llvm.org/8.0.0/clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz
tar xf clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz
cmake -H. -BRelease -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$PWD/clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04
cmake --build Release
빌드가 끝났다면, 아래 명령어로 설치를 완료한다.
만약 설치경로를 변경하고 싶다면 CMakeCache.txt
파일을 수정하여 CMAKE_INSTALL_PREFIX
에 원하는 경로를 입력한다.
cmake --build Release --target install
coc config
빌드 및 설치가 완료되었다면, coc.nvim에서 ccls를 사용할 수 있도록 config파일을 수정할 차례이다.
config파일을 수정하는 방법은 두가지 방법이 있다.
$HOME/.config/nvim
경로에coc-setting.json
을 파일을 만들어 작성- vim을 실행한뒤
:CoCConfig
명령어를 입력
두 방법 모두 결국엔 같은 파일을 수정하는것이긴 하다.
Example
{
"languageserver": {
"ccls": {
"command": "ccls",
"filetypes": ["c", "cpp"],
"rootPatterns": [".ccls", "compile_commands.json"],
"initializationOptions": {
"cache": {
"directory": ".ccls-cache"
},
"client": {
"snippetSupport" : true
},
"compilationDatabaseDirectory": "./build/"
}
}
}
}
ccls는 rootPatterns에 명시된 파일의 패턴을 기준으로 project전체를 indexing하여 정보를 제공한다. 이 패턴 파일을 생성하는 방법은 2가지가 있다.
compile_commands.json
파일을 사용하는 방법.ccls
파일을 직접 만들어 사용하는 방법
보통 CMake같은 build system generator를 통해 compile_commands.json
파일을 자동적으로 생성할 수 있으므로, 1번 방법을 사용하는편이 간단하다.
아래와 같이 cmake configuration arguments로 파일을 만들고, project root폴더에서 해당 파일을 심볼릭링크를 해준다.
mkdir build && cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
cd ..
ln -s build/compile_commands.json .
추가로 compilationDatabaseDirectory 옵션을 통해 compile_commands.json
파일의 경로를 설정해주면 심볼릭 링킹을 일일이 해주지 않아도 된다.