Emacs에서 LSP 활용하기

7400 단어 eglotlsp-modeLSPEmacs

LSP란?



Language Server Protocol (LSP)은 언어 분석 등을 수행하는 Language Server와 각 툴(클라이언트)이 통신·제휴할 때의 프로토콜을 규정하는 것입니다.



종래, 코드 완성이나 정의 참조 등의 기능은 각 툴이 독자적으로, 한편 언어 마다 구현해 왔습니다만, 그것에는 상당한 노력이 필요했습니다. 그러나 LSP를 사용하면 각 도구는 Language Server가 어떤 언어를 사용하는지 의식하지 않고 완성 및 정의 참조를 수행 할 수 있습니다.

그래서 Emacs 유저에게 LSP(와 Language Server)는 「IDE like인 코드 완성, 정의 참조, 참조 검색 등을 제공해 주는 것」이라고 파악할 수 있을까 생각합니다.

참조 1 : What is the Language Server Protocol?
참고 자료 2 : Qiita/language server protocol에 대해(전편)

LSP 클라이언트 패키지



Emacs에서는 주로 두 개의 패키지가 LSP를 지원합니다.
(각 편집기의 지원 도구는 이 페이지 또는 여기 페이지)

lsp-mode



company-lsp 이나 lsp-ui , imenu , xref 등과 연계를 하여 IDE like 적인 기능을 제공하는 package 입니다. 꽤 다기능으로 UI에 대해서도 충실합니다. 이하, 원문.
lsp-mode aims to provide IDE-like experience by providing optional integration with the most popular Emacs packages like company, flycheck and projectile

eglot


lsp-mode 와는 다른 다른 package. xref-find-definitions , flymake-mode , eldoc-mode , completion-at-point 등과 연계하여 정의 참조나 참조 검색을 실행시킵니다. lsp-mode 보다 훨씬 간단합니다. 이하, 원문.
Eglot is considerably less code and hassle than lsp-mode.el. 
In most cases, there's nothing to configure. It's a minimalist approach focused on user experience and performance

eglot 설정


eglot 에 주목해 설정 방법을 소개합니다. lsp-mode 에 대해서는 Qiita/좋아하는 에디터에 쾌적한 개발 환경을 제공하는 LSP 등이 참고가 된다고 생각합니다.
또한 이번에는 Ruby의 LSP를 바탕으로 설명하지만 다른 언어에서도 Language Server의 도입 이외에는 특별히 차이가 없다고 생각합니다.
  • eglot 소개
  • (require 'eglot)
    
    ;; eglot を ON にする mode を指定
    (add-hook 'ruby-mode-hook 'eglot-ensure)
    
  • Language Server 배포

  • Ruby의 경우 solargraph이 주류 인 것 같습니다.
    (각 언어의 Language Server 대응표는 이 페이지)
    $ gem install solargraph
    

    이것을 설정하면 Ruby (Rails) Project에서 Mode Line에 eglot가 표시됩니다.



    eglot 사용 예



    코드 완료



    변수가 Array Class이면 to_h가 후보로 서제스트됩니다.
    한편, String Class 라면 to_h 는 후보에 나오지 않고, 대신에 to_i 등이 적절히 서제스트 됩니다.



    Go to Definition


    eglotxref-find-definitions 를 사용하여 변수의 정의 위치로 점프할 수 있습니다.



    그건 그렇고, smart-jump.el
    (require 'smart-jump)
    (smart-jump-setup-default-registers)
    
    ;; お好みでどうぞ
    (define-key global-map [(super d)] 'smart-jump-go)
    

    Find References


    xref-find-definitions 를 사용하여 변수의 참조 부분을 찾을 수 있습니다.
    또한 xref-find-references 에서 기호 위치에 대한 자세한 설명을 볼 수 있습니다.

    dumb-jump.el

    평상시는 eglot-help-at-point 대신에 사용하고 있습니다만, find-references 유효시에는 eglot 를 실행시키도록 하고 있습니다.
    (global-set-key (kbd "s-f") 'counsel-rg)
    
    ;; eglot-mode 時に有効にする
    (define-key eglot-mode-map (kbd "s-f") 'xref-find-references)
    

    마지막으로



    Emacs with LSP, 꿈이 있네요.

    참고 자료


  • counsel-rg
  • Language Server Protocol
  • 완구 올린 등 r 베r. 오 rg
  • GitHub/lsp-mode
  • GitHub/eglot
  • Qiita/language server protocol에 대해(전편)
  • 좋은 웹페이지 즐겨찾기