본문으로 건너뛰기

Doom Emacs Eglot 및 Ruby LSP에서 StandardRB를 통한 Ruby 포맷팅/린팅 설정

Eglot, Ruby LSP and StandardRB

발행일
2025년 11월 04일
https://katafrakt.me/2025/11/04/eglot-ruby-lsp-standardrb/

핵심 요약

  • 1 Doom Emacs 사용자가 Eglot 및 Ruby LSP 환경에서 StandardRB를 기본 린터/포맷터로 설정하는 과정의 문제점과 해결책을 제시합니다.
  • 2 Ruby LSP가 `workspace/didChangeConfiguration`을 지원하지 않고 Eglot이 동적 기능 등록을 지원하지 않아, 언어 서버 초기화 옵션을 통해 StandardRB를 명시적으로 지정해야 했습니다.
  • 3 `.dir-locals.el` 파일에 `eglot-server-programs`를 사용하여 Ruby LSP 실행 시 `initializationOptions`를 통해 StandardRB를 설정하는 것이 핵심 해결책입니다.

도입

Doom Emacs와 Eglot을 활용하여 Elixir 개발 환경을 최적화한 저자는 Ruby 프로젝트에서 Rubocop 대신 StandardRB를 선호했습니다. 하지만 `.rubocop.yml` 파일이 없는 경우, Doom Emacs의 기본 Ruby 모듈이 Rubocop 설정을 적용하려는 문제가 발생했습니다. 최근 Doom Emacs가 Ruby LSP를 포맷팅 및 린팅의 주력 도구로 채택하면서, StandardRB를 Ruby LSP와 연동하는 새로운 해결책을 모색하게 되었습니다. 이 글은 그 과정에서 겪은 난관과 최종 해결책을 상세히 설명합니다.

StandardRB 연동을 위한 초기 시도 및 문제점

저자는 먼저 Eglot 문서에 제시된 eglot-workspace-configuration 설정을 통해 StandardRB를 지정하려 했습니다. 그러나 eglot-events-buffer를 확인한 결과, Eglot은 설정 변경을 workspace/didChangeConfiguration 이벤트로 Ruby LSP 서버에 전송했지만, 서버는 이 메시지에 아무런 반응을 보이지 않았습니다. Ruby LSP의 소스 코드를 분석한 결과, workspace/didChangeConfiguration은 실제로 지원되지 않는 메시지임이 밝혀졌습니다.

동적 기능 등록의 한계

workspace/didChangeConfiguration 지원을 Ruby LSP에 추가하려는 시도가 있었으나, 이는 근본적인 문제를 해결하지 못했습니다. Ruby LSP는 언어 서버 연결 초기화 시점에 지원되는 포맷터를 확인하며, StandardRB가 감지되지 않으면 documentFormattingProvidernull로 설정하여 클라이언트(Eglot)에 포맷팅을 지원하지 않음을 알립니다. 이 정보를 Eglot이 기록하기 때문에, 이후에 동적으로 포맷터 기능을 등록하더라도 Eglot은 포맷팅 요청을 무시하게 됩니다. 또한, Eglot 자체가 동적 기능 등록을 지원하지 않는다는 사실이 확인되어 이 접근 방식은 좌절되었습니다.

최종 해결책: 초기화 옵션을 통한 재시작

결국 저자는 언어 서버 연결을 종료하고, StandardRB 포맷터와 린터를 명시적으로 포함한 초기화 옵션으로 서버를 재시작하는 방안을 채택했습니다. 이는 Erlang의 ‘실패하고 다시 시작’ 철학과 유사하게, 복잡한 재설정 메커니즘 대신 단순하고 효율적인 해결책으로 평가됩니다.

핵심 해결책은 .dir-locals.el 파일에 다음과 같이 eglot-server-programs를 설정하는 것입니다:

elisp ((ruby-mode . ((eglot-server-programs . ((ruby-mode . ("ruby-lsp" :initializationOptions (:formatter "standard" :linters ["standard"] :enabledFeatures (:codeActions t :diagnostics t :formatting t)))))))))

이 설정을 통해 Ruby LSP는 시작부터 StandardRB를 포맷터와 린터로 인식하고 해당 기능을 활성화하게 됩니다.

결론

이 과정을 통해 저자는 Doom Emacs 환경에서 Ruby LSP와 StandardRB를 성공적으로 연동하여 Ruby 프로젝트의 포맷팅 및 린팅 문제를 해결했습니다. 단순히 기능을 활성화하는 것을 넘어, 언어 서버 프로토콜(LSP)의 통신 방식과 Eglot 및 Ruby LSP의 내부 동작에 대한 심층적인 이해를 얻게 된 것이 중요한 성과입니다. 때로는 복잡한 동적 재설정보다 언어 서버를 명시적인 초기화 옵션으로 재시작하는 것이 더 실용적이고 효율적인 해결책이 될 수 있음을 보여주는 사례입니다. 다음 단계로는 StandardRB가 영역 포맷팅을 지원하도록 개선하는 방안을 모색할 예정입니다.

댓글0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

0/1000
정중하고 건설적인 댓글을 작성해 주세요.