LSP 서버는 단순히 문자열이 아닌 코드의 의미론적(semantic) 이해를 기반으로 작동합니다. 이를 통해 클래스 정의 위치로 이동, 심볼 참조 목록 확인, 실시간 컴파일러 오류 및 경고 표시, 자동 완성, 인레이 힌트(inlay hints) 등 기존 Vim 플러그인으로는 불가능했던 고급 기능을 제공합니다. 이러한 기능들은 개발 생산성을 크게 향상시킬 수 있습니다.
Neovim에서 LSP 서버를 사용하기 위해서는 먼저 lsp-config
플러그인을 설치해야 합니다. 플러그인 설치 후, Neovim의 설정 파일(init.vim
)에서 Lua 스크립트(config.lua
)를 호출하여 LSP 서버를 설정합니다. 예시로 Shopify의 Ruby LSP 서버와 Microsoft의 CSS, TypeScript LSP 서버 설정 코드가 제공됩니다. LSP 서버 자체는 RubyGems나 NPM을 통해 설치할 수 있습니다(예: gem install ruby-lsp
, npm install vscode-langservers-extracted
).
가장 중요한 부분은 LSP 서버를 Docker 컨테이너 내에서 실행하는 설정입니다. Neovim이 호스트에서 실행되고 LSP 서버가 Docker 컨테이너 내에서 실행될 때, Neovim은 docker compose exec
명령을 사용하여 컨테이너 내의 LSP 서버 명령을 실행하도록 구성되어야 합니다. 이는 cmd
설정 옵션을 통해 이루어지며, bash -lc
를 사용하여 로그인 셸처럼 환경 변수에 접근할 수 있도록 합니다.
또한, LSP 서버와 Neovim이 파일 경로를 동일하게 인식하는 것이 중요합니다. Docker 컨테이너와 호스트 간의 파일 경로가 다르면 LSP 기능이 정상적으로 작동하지 않습니다. 이를 해결하기 위해 docker-compose.yml
파일에서 source
와 target
경로를 동일하게 설정하여 볼륨을 마운트해야 합니다. 프로젝트 외부 파일, 특히 Ruby Gems와 같은 서드파티 모듈의 경우에도 경로 일치가 필요합니다. 이를 위해 GEM_HOME
환경 변수를 프로젝트 루트 내의 특정 디렉토리로 설정하여 젬이 해당 위치에 설치되도록 합니다.
Neovim에서 LSP 기능을 활용하기 위해 on_attach
함수를 사용하여 키 바인딩을 설정하고, 인레이 힌트 및 자동 완성 같은 LSP 기능을 활성화합니다. 이 함수는 LSP 서버가 파일에 연결될 때 호출됩니다. Microsoft의 CSS 및 TypeScript LSP 서버가 기본적으로 충돌하는 문제에 대해서는 before_init
함수 내에서 params.processId = vim.NIL
로 설정하여 프로세스 ID 검사를 비활성화하는 해결책을 제시합니다. 마지막으로, LSP 설정을 프로젝트별로 선택적으로 활성화할 수 있도록 .nvim.lua
파일을 통해 useLSP
변수를 제어하는 방법을 설명하여 불필요한 오류를 방지합니다.