Emacs에서 Sorbet-ls를 효율적으로 설정하기

Ruby: sane sorbet-ls setup in Emacs → Gosha Tcherednitchenko

stadia 2025년 06월 04일 https://gosha.net/2025/sorbet-emacs/

3줄 요약

  • Emacs lsp-mode 환경에서 Sorbet을 사용하는 프로젝트와 사용하지 않는 프로젝트를 함께 다룰 때 발생하는 sorbet-ls의 불필요한 자동 실행 문제를 해결하는 방법을 제시합니다.
  • 기존 sorbet-ls 클라이언트의 자동 실행을 비활성화하고, 현재 프로젝트가 Sorbet을 사용하는지 확인하는 Emacs Lisp 함수를 구현합니다.
  • 프로젝트별 Sorbet 사용 여부에 따라 선별적으로 활성화되는 새로운 LSP 클라이언트를 등록하여 효율적인 개발 환경을 구축합니다.

본 문서는 Emacs lsp-mode를 사용하여 Ruby 개발을 진행할 때, 정적 타입 검사 도구인 Sorbet을 일부 프로젝트에서만 사용하는 경우 발생할 수 있는 비효율적인 sorbet-ls 동작 문제를 다룹니다. Sorbet을 사용하지 않는 프로젝트에서도 lsp-mode가 sorbet-ls 클라이언트를 시작하려 시도하며 발생하는 오류 및 불편함을 해소하기 위한 구체적인 해결책을 제시합니다. 이 문제는 특히 여러 Ruby 프로젝트를 동시에 다루는 개발자에게 유용하며, 효율적인 개발 환경 설정을 위한 실질적인 방안을 제안합니다.

제시된 해결책은 기본 sorbet-ls 클라이언트의 전역 자동 실행을 비활성화하는 것에서 시작합니다. 이는 lsp-disabled-clientssorbet-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 클라이언트에서도 유사한 로직으로 응용 가능합니다. 이 해결책이 다른 사용자들에게도 도움이 되기를 바라며, 더 간결하거나 우아한 해결책에 대한 공유를 기대합니다.