본 문서는 Emacs lsp-mode를 사용하여 Ruby 개발을 진행할 때, 정적 타입 검사 도구인 Sorbet을 일부 프로젝트에서만 사용하는 경우 발생할 수 있는 비효율적인 sorbet-ls 동작 문제를 다룹니다. Sorbet을 사용하지 않는 프로젝트에서도 lsp-mode가 sorbet-ls 클라이언트를 시작하려 시도하며 발생하는 오류 및 불편함을 해소하기 위한 구체적인 해결책을 제시합니다. 이 문제는 특히 여러 Ruby 프로젝트를 동시에 다루는 개발자에게 유용하며, 효율적인 개발 환경 설정을 위한 실질적인 방안을 제안합니다.
제시된 해결책은 기본 sorbet-ls 클라이언트의 전역 자동 실행을 비활성화하는 것에서 시작합니다. 이는 lsp-disabled-clients
에 sorbet-ls
를 추가함으로써 가능합니다. 다음으로, 현재 버퍼와 연결된 프로젝트가 Sorbet을 사용하는지 판단하는 gt/project-has-sorbet-p
라는 Emacs Lisp 함수를 정의합니다. 이 함수는 프로젝트 루트 디렉토리에서 ‘sorbet’ 디렉토리의 존재 여부 또는 ‘Gemfile.lock’ 파일 내 ‘sorbet’ 혹은 ‘sorbet-static’ 문자열 포함 여부를 확인하여 Sorbet 사용 여부를 판별합니다. 마지막 단계로, lsp-register-client
를 사용하여 새로운 LSP 클라이언트를 등록합니다. 이 클라이언트는 모든 Ruby 버퍼에서 활성화 조건을 검사하지만, 앞서 정의한 gt/project-has-sorbet-p
함수가 참을 반환하는 경우, 즉 해당 프로젝트가 Sorbet을 사용하는 경우에만 실제 sorbet-ls 서버 프로세스를 시작하도록 설정됩니다. 이 과정은 make-lsp-client
를 통해 클라이언트의 연결 방식(lsp-stdio-connection
)과 활성화 조건(activation-fn
)을 명시하여 이루어집니다. 이를 통해 Sorbet이 필요한 프로젝트에서만 Language Server 기능이 정상적으로 작동하도록 합니다.
본 문서에서 설명된 Emacs lisp 설정을 통해 개발자는 Sorbet 사용 여부가 다른 Ruby 프로젝트들을 Emacs lsp-mode 환경에서 보다 효율적이고 안정적으로 관리할 수 있게 됩니다. 기본 클라이언트의 무분별한 자동 실행을 방지하고 프로젝트별로 필요한 경우에만 sorbet-ls를 활성화함으로써 불필요한 오류 발생을 줄이고 시스템 자원을 절약할 수 있습니다. 제시된 코드는 Doom Emacs 및 lsp-mode 사용자를 기준으로 작성되었으나, 필요에 따라 다른 Emacs 설정이나 LSP 클라이언트에서도 유사한 로직으로 응용 가능합니다. 이 해결책이 다른 사용자들에게도 도움이 되기를 바라며, 더 간결하거나 우아한 해결책에 대한 공유를 기대합니다.