이번에는 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 파일의 경로를 설정해주면 심볼릭 링킹을 일일이 해주지 않아도 된다.

Reference