Hits
Vim 2022. 12. 15. 오후 12:28:00

Coc.nvim으로 Elixir 사용하기

"coc-elixir trouble-shooting"
vimcocelixir

전부터 Elixir라는 언어를 한번 써보고 싶다 생각만 하다가 잊고있었는데, 이번 if kakao를 보고 다시 생각이나 찍어먹어보기로 했습니다. 근데 얼마전 IntelliJ IDEA를 업데이트 했더니 Elixir 플러그인이 호환이 안되는바람에 다른 IDE를 찾아야 했습니다. 대부분 vscode를 많이 쓰시는 것 같은데, 조만간 있을 강의에서 vscode 설치부터 간단 세팅까지 보여주고 싶기도 하고, vim 세팅이 어느정도 돼있기 때문에 vim으로 작업하려 했는데요. 설치 과정에서 애를 좀 먹어서 해결한 방법을 남기려 합니다. 오만가지 방법을 다 써봐서 어디서부터 어디까지가 유효했던건지는 잘 모르겠어서 시도했던 방법은 다 적겠습니다.

설정

erlangelixirasdf를 이용해 모두 최신버전으로 설치돼있다는걸 전제로 하겠습니다. (elixir 기초 세팅은 나중에 포스팅하도록 하겠습니다.) svelte 세팅때와는 다르게 많은 설정이 필요하지는 않았는데요. neovimcoc.nvim도 설치가 돼있다는걸 전제로 두가지만 설치해주면 됩니다. neovim의 init.vim에서 Vim-Plug를 이용해 하이라이팅 플러그인을 설치해줍니다.

" ~/.config/nvim/init.vim

" Erlang
Plug 'elixir-editors/vim-elixir'

저장하고 커맨드라인에 :source %를 입력해서 적용을 시켜준 뒤 :PlugInstall 명령어를 통해 플러그인을 설치하면 됩니다. 설치가 됐으면 커맨드라인에 :CocInstall coc-elixir를 입력해서 elixir 언어서버를 붙여주도록 하겠습니다. 그러면 기본 설정은 끝났습니다.

문제

그런데, 설정을 하니 language server 에러가 나서 한참 삽질을 했습니다. 애꿎은 erlang만 붙잡고 한참 씨름하다가, 지금보니 별 다를것도 없는 것들 가지고 지웠다 다시 설치했다가만 무한 반복을 했습니다. 이제 막 elixir 입문해서 생태계도 잘 모르는데 어떤게 문제인지 감도 잡히지 않아서 많이 당황했습니다. 일단은 coc-elixir를 통해 연결한 서버가 먹통이었던 것 같고, 로컬에 설치해서 돌린 서버도 문제가 있었습니다. 하나씩 해결해보도록 하겠습니다.

해결

1. 로컬 언어서버 사용

coc-elixir는 elixir-ls에 연결을 시도하는데 정확히 어떤게 문제인지는 모르겠지만 연결이 제대로 되지 않는다는 문구가 상태줄에 떴습니다. coc-elixir 깃헙 레포지토리의 trouble shooting에 따라 로컬에 설치하고 coc 설정에서 로컬 서버를 이용하도록 하면 됩니다.

  1. 우선 레포지토리를 클론해줍니다. 루트디렉토리에 elixir-ls라는 이름의 디렉토리로 복제하도록 하겠습니다.
    git clone https://github.com/elixir-lsp/elixir-ls.git ~/.elixir-ls
  2. 복제한 디렉토리로 이동해서 복제한 레포지토리의 의존성을 설치하고 컴파일해서 릴리즈 합니다. 이 때 환경변수를 prod로 설정해주어야 합니다.
    mix deps.get && MIX_ENV=prod mix compile && MIX_ENV=prod mix elixir_ls.release -o <release_dir>
  3. neovim을 켜고 :CocConfig명령어를 이용해 coc-setting.json을 열어주고 coc-elixir가 로컬 서버를 이용하도록 설정해줍니다. 저와 동일하게 설치하셨다는걸 가정하고 아래의 설정을 추가해주면 됩니다.
    // coc-setting.json
    
    {
        // ...다른 설정들
        "elixir.pathToElixirLS": "~/.elixir-ls/release/language_server.sh"
    }

2. Coc-setting 환경변수 설정

이렇게 설정했더니 아까와 같은 에러문구는 뜨지 않았는데요, Elixir Server Crashed라는 새로운 에러가 등장합니다. 이 다음이 고비였고, 해결방법을 도통 찾을수가 없어서 이부분에서 몇시간을 쓴 것 같은데요. 방법은 허무할 정도로 간단했습니다. coc-setting에서 아래의 설정을 추가해줍니다.

// coc-setting.json
{
    // ...다른 설정들
    "elixir.pathToElixirLS": "~/.elixir-ls/release/language_server.sh",
    "elixirLS.mixEnv": "prod"
}

이제 다시 elixir파일을 열어보면 자동완성기능이 잘 동작하는 걸 볼 수 있습니다.