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가 감지되지 않으면 documentFormattingProvider를 null로 설정하여 클라이언트(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를 포맷터와 린터로 인식하고 해당 기능을 활성화하게 됩니다.