BIBLIOGRAPHY

Tรกvora, Joรฃo. (2017) 2025. โ€œJoaotavora/Eglot.โ€ https://github.com/joaotavora/eglot.

โ€œEmacs-Lsp/Lsp-Mode.โ€ (2016) 2025. emacs-lsp. https://github.com/emacs-lsp/lsp-mode.

[2025-02-03 Mon 23:41] ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ง€ ๋ญ๋“  ์ข‹๋‹ค. ์„ค์ • ์•ˆํ•˜๊ณ  ์“ฐ๋ฉด ์ข‹๋‹ค.

๋งํฌ

emacs-lsp/lsp-mode

(โ€œEmacs-Lsp/Lsp-Modeโ€ [2016] 2025)

  • Emacs client/library for the Language Server Protocol

joaotavora/eglot

(Tรกvora [2017] 2025)

  • Tรกvora, Joรฃo
  • A client for Language Server Protocol servers

์ž‘์—…๊ธฐ๋ก

์• ์ฆ์˜ Eglot ์ด์ „ ๊ธฐ๋ก๋“ค

๋งˆ์ดํฌ ๊ต์ˆ˜์™€ ๋ฆฌ์šฐ๋Š” Eglot ์„ ์“ด๋‹ค. ๋‘˜๋‹ค ๊ฐ™๋‹ค ์‹ฌํ”Œํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค๋Š” ์ง€์ ์—์„œ. ๋นŒํŠธ์ธ ๊ธฐ๋Šฅ์„ ์ตœ์šฐ์„ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋˜ ํด๋กœ์ € ์ฒ ํ•™๊ณผ ๋งž๋‹ค๊ณ  ํ•œ๋‹ค. ์œ ๋‹ˆ๋ฒ„์…œ ์–ธ์–ด๋ฅผ ์ง€ํ–ฅํ•œ๋‹ค๋‚˜? ๋‘˜๋‹ค ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์—์„œ๋„ Project.el ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿผ ๊ทธ๋ ‡์ง€. ์•„๋ž˜ ๋งํฌ๊ฐ€ ์žˆ์ง€๋งŒ ํ”„๋ ‰ํ‹ฐ์ปฌ๋ฆฌ ๋ฌธ์„œ์—๋Š” ๊ฐ™์€ ์ฃผ์ œ๋ฅผ ํ”„๋กœ์ ํƒ€์ผ LSP ๋กœ ์„ธํŒ…ํ–ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์‹œ๋Œ€๋Š” ๋ณ€ํ•˜๊ณ  ๋ณ€ํ™”์— ๋Šฅ๋™์ ์œผ๋กœ ๋‹ค๊ฐ€์„œ์ž๋Š”๊ฒŒ ๋‚˜์˜ ์ƒ๊ฐ์ด๋‹ค.

Advise Eglot to Support Clojure Monorepo Setup ์ด ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

๊ฐ™์€ ๊ฐœ๋…์€ ํ”„๋ ‰ํ‹ฐ์ปฌ๋ฆฌ ๋ฌธ์„œ์—์„œ ๋ณด์•˜์—ˆ๋‹ค. Monorepo ๋ผ๊ณ  ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ํ”„๋กœ์ ํƒ€์ผ ์„ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋…ธ๋ฆฌํฌ๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค. ์•„๋ž˜ ๋ฌธ์„œ ์ฐธ๊ณ . Monorepo / Nested projects ยท Clojure development with Spacemacs & Cider

๊ฐ€์žฅ ํฐ ๋ฌธ์ œ

clojure ๋ ˆ์ด์–ด๋ฅผ ๋„ฃ์œผ๋ฉดโ€ฆ backend ๋กœ lsp / cider ๋งŒ ์„ ํƒํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. lsp ๋Š” lsp-mode ๋งŒ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด๊ณ  eglot ์€ ์•„๋‹ˆ๋‹ค. ํ˜ธํ™˜์ด ์•ˆ๋œ๋‹ค.

์•„์˜ˆ ์ŠคํŽ˜์ด์Šค๋งฅ์Šค clojure ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ ! ์ˆ˜๋™์œผ๋กœ ๋‹ค ์žก์•„์•ผ ํ•œ๋‹ค. ์•„๋ฌด๋ฆฌ eglot ๊ณผ project.el ์ด๋ผ๊ณ  ํ•ด๋„ ์ด๊ฒŒ ๋งž๋Š” ๊ฒƒ์ธ๊ฐ€?

  1. lsp 2) cider 3) eglot ๋ญ ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํžˆ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒโ€ฆ 3 ๋ฒˆ์€ ์ŠคํŽ˜์ด์Šค๋งฅ์Šค ๊ตฌ์กฐ์— ๋ฐ˜๋Œ€๋˜๋Š” ๊ตฌ์„ฑ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์ž„์‹œ ๊ฒฐ๋ก ! 22/10/06โ€”21:42 :: ํ”„๋ ‰ํ‹ฐ์ปฌ๋ฆฌ ๊ตฌ์„ฑ์œผ๋กœ ๊ฐ€์ž!

project.el ์„ ์ œ์™ธํ•˜๊ณ  ํด๋กœ์ € ์„ค์ •์€ ์ŠคํŽ˜์ด์Šค๋งฅ์Šค lsp ๋กœ ๊ฐ„๋‹ค. ๋ฐฐ์›€์— ์žˆ์–ด์„œ ๊ธฐ๋ณธ์„ ํ•˜๊ณ  (๊ธฐ๋ณธ์ด๋ผ ํ•จ์€ ๋ฉ”๋‰ด์–ผ๋„ ์žˆ๊ณ  ํ•™์Šต์ด ์šฉ์ดํ•œ ๋Œ€์ƒ)

Cider ๋„ ๋ฌผ๋ก  ๊ธฐ๋ณธ์ด๊ณ  corgi ๋ฅผ ์œ ์‹ฌํžˆ ๋ณด์•˜๊ธฐ์—โ€ฆ ๊ทผ๋Œ€ ๊ฒฐ๊ตญ์€ ์•ˆ์“ฐ๊ฒŒ ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์„ ํ˜๋ ค ๋ณด๋‚ด๊ธด ์•„๊น๋‹ค. ์•„๋ฌดํŠผ ํ”„๋ ‰ํ‹ธ์ปฌ๋ฆฌ๋ฅผ ๋ณด๊ณ  ๊ฐ€์ž!

์ƒˆ๋กœ์šด ์ƒ๊ฐ๊ณผ ๋Œ€์•ˆ Eglot ๊ฐ€๋Šฅํ•˜๋‹ค! ๊ทธ๋ฆฌ๊ณ โ€ฆ

22/10/07โ€”10:39 :: ๋– ์˜ค๋ฅธ ์ƒ๊ฐ์„ ์ ์Œ eglot ๋ ˆ์ด์–ด๊ฐ€ clojure ๋ ˆ์ด์–ด๋ž‘ ๋ฌด์Šจ ์ƒ๊ด€์ด์ง€? ํด๋กœ์ ธ๋Š” ๋‘˜๋‹ค clojure-lsp ์“ฐ๋Š” ๊ฒƒ์ผ ๋ฟ์ธ๋ฐ? ์ด๋งฅ์Šค์—์„œ lsp ๋ ˆ์ด์–ด๋ฅผ ์ผœ๋ฉด, ๋‘˜์ด ์—ฐ๋™์ด ๋˜๊ฒ ์ง€?

clojure ๋ ˆ์ด์–ด์—์„œ backend lsp ํ–ˆ์„ ๋•Œ ๋ญ˜ํ•˜๋Š”์ง€ ๋ณด๊ณ , ํ˜น์‹œ lsp-mode ํŒจํ‚ค์ง€์— ์˜์กด์ ์ธ ๋‚ด์šฉ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  eglot ์œผ๋กœ lsp ๋ฅผ ์—ฐ๋™ํ•˜๊ฒŒ ํ•ด์ฃผ๋ฉด ์ง€๊ธˆ ๋ ˆ์ด์–ด์—์„œ๋„ ๊ฐ™์€ ํ‚ค ๋ฐ”์ธ๋”ฉ์œผ๋กœ eglot ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

  • ๊ด€๊ฑด์€ clojure layer ์™€ lsp layer ์‚ฌ์ด์˜ ์„ค์ •์ด๋‹ค.
  • lsp layer ์—์„œ ๋ฌด์Šจ ์„ค์ •์„ ํ•˜๋Š”๊ฐ€? eglot ๋ ˆ์ด์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ญ˜ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
  • eglot ๋ ˆ์ด์–ด๋ฅผ ์ฐพ๊ณ , ๊ฑฐ๊ธฐ์— ์„ค์ •์„ ํ•œ๋‹ค.
  • clojure ๋ ˆ์ด์–ด์— eglot ์˜ต์…˜์„ ๋งŒ๋“ค๊ณ , ํ™œ์„ฑํ™” ์‹œํ‚จ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด, backend ์— eglot ์„ ํ•˜๋ฉด ๋.

๋…ผ์Ÿ์ด ์žˆ๋‹ค. lsp ๋ชจ๋“œ๋ฅผ ์ž˜ ์“ฐ์ž! ๋!

eglot ์œผ๋กœ ๋‚ด๊ฐ€ ๋Œ€์•ˆ์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค. ๋‚ด๊ฐ€ ๋ฉ”์ธํ…Œ์ธํ•  ๊ฒƒ๋„ ์•„๋‹ˆ๋ผ๋ฉด. ์„ค๋“๋ ฅ์ด ์—†๋‹ค.

Eglot ์™œ ์–ด๋ ค์› ๋‚˜?

์œ„์˜ ์ด์ „ ๊ธฐ๋ก์„ ๋ณด๋ฉด ๋ญ ์ž์„ธํžˆ ์ฝ๊ณ  ์‹ถ์ง€ ์•Š์ง€๋งŒ. ๊ฒฐ๊ตญ Spacemacs ์˜ ๋ ˆ์ด์–ด ๊ตฌ์„ฑ์ด ๊ผฌ์ธ๋‹ค๋Š” ๊ฑฑ์ • ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ผญ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„ค์ •์„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜๋‹ˆ๊นŒ (ํ‚ค ๋ฐ”์ธ๋”ฉ) ์–ด๋ ต๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ๊ป˜ ์•Œ์•„์•ผ ํ•˜๋Š” ๋‚ด์šฉ๋“ค์ด ์—ฌ์ „ํžˆ ๋งŽ์•˜์Œ์—๋„ ์ž˜ ๋ชฐ๋ผ์„œ ๋ฒฝ์ด ๋†’์•„ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.

์ƒˆ๋กœ์šด ์‹œ๋„๋Š” ์•„์ฃผ ๊ฐ€๋ณ๊ฒŒ ์ผ์–ด๋‚ฌ๋‹ค. Company -> Corfu ๋กœ ๋ณ€๊ฒฝ์„ ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ํ†ต์ฐฐ ๋•๋ถ„์ด๋‹ค. ๋‚ด์žฅ ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•˜๋Š” ์ตœ๊ทผ ํŒจํ‚ค์ง€๋“ค์€ ์˜์กด์„ฑ์ด ๊ฑฐ์˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— Spacemacs ์—์„œ ๋ฌธ์ œ ๋˜๋Š” ๋ถ€๋ถ„๋งŒ ์„ค์น˜ ์•ˆ ํ•œ ๋’ค์— ์„ค์น˜ํ•˜๊ณ  ํ•ต์‹ฌ ํ‚ค ๋ฐ”์ธ๋”ฉ ๋ช‡ ๊ฐœ๋งŒ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค. Flycheck, Flymake ๋„ ๋ฌธ์ œ ๋  ๊ฒƒ์ด ์—†์—ˆ๋‹ค. ๋งˆ์ด๋„ˆ ๋ชจ๋“œ์—์„œ ๋™์ž‘ํ•  ๋ฟ์ธ๋ฐ ํ•ด๋‹น ๋ฒ„ํผ์—์„œ ๋„๋ฉด ๋œ๋‹ค. Eglot ์€ Company ๋„ ํ•„์š”๊ฐ€ ์—†๊ธฐ์— ๋”์šฑ์ด ๊ทธ๋ ‡๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ๋ณด๋‹ˆ ๊ทธ๋ž˜๋„ LSP ๊ฐ€ ํ•„์š”ํ•˜๋ƒ๋Š” ๊ทผ๋ณธ์ ์ธ ์งˆ๋ฌธ์ด ๋‚˜์˜ค๊ธฐ ๋งˆ๋ จ์ด๋‹ค.

proselint-flymake, clj-kondo-flycheck ์ด๋Ÿฐ ๋ฐฉ์‹์€ ์˜ค๋ž˜ ๊ฐˆ ์ˆ˜๊ฐ€ ์—†๋‹ค. ๊ฐ๊ฐ efm-lang-server or megalint, clojure-lsp ๋ผ๋Š” ์„œ๋ฒ„๊ฐ€ ์žˆ์ง€ ์•Š๋Š”๊ฐ€? ์•ž์˜ ๊ฒƒ์€ ๋ฒ”์šฉ ์„œ๋ฒ„์ด๊ณ  ๋’ค์˜ ๊ฒƒ์€ Clojure ์ „์šฉ ์„œ๋ฒ„์ผ ๋ฟ์ด๋‹ค. ์ „์šฉ ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์–ธ์–ด์— ๋Œ€ํ•œ ๋””ํ…Œ์ผ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฌผ๋ก  ํ‘œ์ค€ํ™”๊ฐ€ ๋˜์–ด ์žˆ๊ธฐ์— Eglot ๊ฐ™์€ ๋‹จ์ผ ์—”ํŠธ๋ฆฌ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋’ค์— ๋ฒ”์šฉ ์„œ๋ฒ„๋Š” ๊ฐœ๋ฐœ ์–ธ์–ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋งˆํฌ ์—…์œผ๋กœ ์ž‘์„ฑ ๋œ ๋ฌธ์ž ํ…์ŠคํŠธ๋„ ์ปค๋ฒ„ ํ•œ๋‹ค. ์•„๋ฌดํŠผ ์„œ๋ฒ„ ๋ชจ๋ธ์€ ๊ทธ๋ƒฅ ์ง€๋‚˜ ์น  ์ˆ˜๊ฐ€ ์—†๋‹ค. CIDER/Kondo/Refactor/Fommater ๋“ฑ ๋‚˜๋‰˜์–ด ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ํ‘œ์ค€ํ™” ๋˜์–ด ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ๋Š”๊ฐ€? ๊ทธ๊ฒƒ๋„ ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์ฒ˜๋ฆฌ ๋˜๋‹ˆ Emacs ๋Š” ๊ฐ์‚ฌํ•ด์•ผ ํ•  ๋ฟ์ด๋‹ค. ์ด๋งฅ์Šค๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋‹ˆ๊นŒ.

  • 2023-01-27

lsp-mode features with clojure

  • lsp-mode with clojure lsp-mode/clojure-guide.md at master ยท emacs-lsp/lsp-mode ยท GitHub

    Clojure ์˜ˆ์ œ๋ฅผ ๋งˆ์ฃผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„์˜ ํŽ˜์ด์ง€๋ฅผ ์ฃผ๋ชฉํ•ด์•ผ ํ•œ๋‹ค. ์•„๋ž˜ ๊ธฐ๋Šฅ๋“ค์„ ์ญ‰ ์‚ดํŽด ๋ณด๋ฉด์„œ <-> Eglot ๊ณผ 1:1 ๋งคํ•‘์„ ํ•ด๋ณธ๋‹ค. ์•ˆ๋˜๋Š” ๊ฒƒ๋“ค์€ ๋ง๊ณ  ๋˜๋Š” ๊ธฐ๋Šฅ๋“ค์€ ๋ณธ๋‹ค. ๋‹ค ํ•„์š”ํ•œ ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค.

  • lsp-mode features

    1. Syntax check clj-kondo + flycheck ์—ฐ๋™ ๋œ๋‹ค.
    2. Find definition/references lsp-ui ํŒจํ‚ค์ง€์™€ ์—ฐ๋™๋˜๋Š”๊ตฌ๋‚˜.
    3. Completion nil ์„ ํ•˜๋ฉด cider completion ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์•„ ๊ทธ๋ฆฌ๊ณ  lsp-mode ๋Š” ๊ธฐ๋ณธ์œผ๋กœ company-mode ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
    4. Code actions
    5. Hover โ€” conflict with CIDER
    6. Code lens lsp-lens-enable ์„ค์ •ํ•˜๋ฉด 1 references ์ด๋Ÿฐ ์ •๋ณด ๋œฌ๋‹ค.
    7. Call hierarchy lsp-treemacs ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด๊ฑฐ ์ด๊ธ€๋ž์ด ๋˜๊ฒ ๋‚˜?
    8. Formatting cljfmt ๋ฅผ ์ด์šฉํ•œ๋‹ค.
    9. Refactoring โ€” conflict with clj-refactor

[2023-01-27 Fri 05:54]

Eglot features

Diagnostics โ€” Syntax check

์ง„๋‹จ ์ •๋ณด๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์„œ Flymake ๋ฅผ ์ด์šฉํ•ด์„œ annotate / underline ์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค. ์ด ์ •๋ณด๋Š” ElDoc ์‹œ์Šคํ…œ๊ณผ ๊ณต์œ ๋˜์–ด eldoc / eldoc-doc-buffer ์—์„œ ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. C-h . ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ๋˜์–ด ์žˆ๋‹ค.

Eglot ์€ Flymake ๊ณผ ์—ฐ๋™๋˜๊ธฐ์— ์–ต์ง€๋กœ Flycheck ๋ฅผ ๋ฐ€์–ด ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด์— ๋”ํ•ด, flymake-mode ๋ฅผ ๋ฏธ๋ฆฌ ์‹คํ–‰ ํ•  ํ•„์š”๋„ ์—†๋‹ค. ์ž๋™์œผ๋กœ ์ผœ์ค€๋‹ค. ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ์žˆ๋˜ ๋…€์„์„ ๋„๊ณ  ์ž…๋ง›์— ๋งž๊ฒŒ ์„ค์ •ํ•ด์„œ ์ผœ์ค€๋‹ค.

  • eldoc-doc-buffer ;; eglot-mode-map <normal-state> K ;; eglot-mode-map C-h .

eldoc ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™๋˜์–ด ๋™์ž‘ํ•œ๋‹ค๋Š” ๋ง์ด ๋ฌด์—‡์ธ๊ฐ€? CIDER ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?

;; echo ์— ์ •๋ณด๊ฐ€ ๋ณด์ธ๋‹ค. ์ž ์‹œ๋งŒ,
(defn foo [a b]
  (+ a b))

Find definition/references

Rename
Find definition โ€” xref-find-definitions M-.
Find references โ€” xref-find-references M.?

Completion

์ปดํŒจ๋‹ˆ ๋˜๋Š” Corfu ์—์„œ ๋‚˜์—ด ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด๊ธ€๋ž์€ completion-at-point ๋‚ด์žฅ ํ•จ์ˆ˜์™€ ์—ฐ๋™๋˜๋„๋ก ์ด๋ฏธ ๊ฐ–์ถฐ์ ธ ์žˆ๋‹ค. ํ•ด๋‹น ๋ฐ”์ธ๋”ฉ์€ C-M-i ํ™”๋ฉด์— ํ‘œ๊ธฐ ๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋‚˜์—ด ๋˜๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๊ถ๊ธˆํ•˜๋‹ค.

Snippet completion

ํ•ด๋‹น ์„œ๋ฒ„์—์„œ ์Šค๋‹ˆํŽซ ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๋ฉด ์—ฐ๋™์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋‹ค. ์ด๊ฒŒ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์•„๋‹Œ๊ฐ€? ๋”๋ถˆ์–ด yasnippet ๋„ ์ง€์›ํ•œ๋‹ค. ์•ž์„œ ์™„์„ฑ์—์„œ ๋‹ค๋ฃฌ ๋ฐ”์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‚ด์žฅ ๊ธฐ๋Šฅ ๋˜๋Š” ์ž๋™ ์™„์„ฑ ํŒจํ‚ค์ง€์™€ ์—ฐ๋™ํ•˜๋ฉด ๋œ๋‹ค.

Code Actions

์„œ๋ฒ„๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ๋งˆ์šฐ์Šค๊ฐ€ ์ผ๋ถ€ ์‚ฌ์šฉ๋˜๋Š”๋ฐ ์˜ˆ์ œ๊ฐ€ Clojure ์˜€์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. ์–ด๋”” ์žˆ๋‚˜? ์žˆ๋‹ค. ์ผ๋‹จ Clojure-lsp ํ™ˆํŽ˜์ด์ง€์™€ lsp-mode ํ™ˆํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค. ์ฝ”๋“œ ๋ธ”๋ก์ด ์žˆ์œผ๋‹ˆ๊นŒ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ด๊ธ€๋ž์—์„œ ํ•ด๋ณด๋ฉด ๋œ๋‹ค.

Hover on symbol with function signature

ElDoc ์„ ์ด์šฉํ•œ๋‹ค. ๊ด€๋ จ ์„ค์ •์ด ํ•„์š”ํ•œ๊ฐ€?

Code lens (?) โ€” X ๊ฐ„๋‹จํ•˜์ง€ ์•Š์€ ๋“ฏ

Call hierarchy (?)

Formatting (?)

Refactoring (?)

lsp-mode.el โ€” User-visible differences:

Single entry point โ€” ๊ฐ€์žฅ ๋‘๋“œ๋Ÿฌ์ง„ ์ฐจ์ด๋Š” eglot-<language>์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€๊ฐ€ ์—†๋‹ค๋Š” ์ ์ด๋‹ค. ์—”ํŠธ๋ฆฌ

ํฌ์ธํŠธ๋Š” M-x eglot ์ผ ๋ฟ์ด๋‹ค.

project.el โ€” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‚ด์žฅ ๊ธฐ๋Šฅ์ธ project.el ๊ณผ ์—ฐ๋™ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์—

๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๋Š”๋‹ค. ๋ณ„๋„๋กœ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ์„ ๋‘์ง€ ์•Š๋Š”๋‹ค. projectile ๊ณผ ๋Œ€๋น„๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์ž์—ฐ์Šค๋ ˆ ๋‚ด์žฅ ๊ธฐ๋Šฅ์— ์ง‘์ค‘ํ•˜๊ฒŒ ๋œ๋‹ค.

Flymake โ€” Diagnostics work out-of-the-box ๋ผ๊ณ  ์†Œ๊ฐœ๋ฅผ ํ•˜๋Š” ๋ฐ” Flycheck ๊ฐ€

ํ•„์š” ์—†๋‹ค๋Š” ๋ง์ด๋‹ค. ์ด ๋˜ํ•œ ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด๋‹ค.

Only Emacs โ€” Emacs ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค. ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•˜๋ฌผ๋ฉฐ

Company ๋„ ํ•„์š” ์—†๋‹ค. ์œ„์— ๋งํ•œ ๋ฐ”, ๋‚ด์žฅ completion-at-point ํ•จ์ˆ˜์™€ ์—ฐ๋™๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Nothing to configure and minimalist approach โ€” ํŠน์ • ์–ธ์–ด๋ฅผ ์œ„ํ•ด ์„ค์ • ํ•  ๊ฒƒ์ด

์—†๋‹ค. ์„ฑ๋Šฅ์— ์ง‘์ค‘ํ•œ ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ๊ตฌ์กฐ.

โ€œ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 ์ด ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ธ๊ฐ€? ๊ทธ๋ ‡๋‹ค๋ฉด clojure-lsp ์„ค์ •์— ์ผ๋ถ€๋Š” lsp-mode ๋Š” ๋˜๊ณ  eglot ์€ ๋ชปํ•œ๋‹ค๋Š” ๋ง์ธ๊ฐ€? ์˜ˆ๋ฅผ ๋“ค์–ด formatting ์„ค์ •์ด๋ผ๋ฉด ์–ด๋– ํ•œ๊ฐ€?

์•ผ! ๊ทธ๋ƒฅ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋กœ ์ปค๋ฒ„ํ•˜๋ฉด ๋˜์ž–์•„!๋ผ๊ณ  ๋งํ•œ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†๋‹ค. Server -> Eglot -> Packages ์ด๋ ‡๊ฒŒ ๋ผ๋„ ๋™์ž‘์„ ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ์„œ๋ฒ„์— ์„ค์ •ํ•œ ๊ทธ ๋ฌด์—‡์ด๋ผ๋„ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.

How to configuration

More performance we get!

์—ฌ๊ธฐ์— ์› ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์ด ๊ต‰์žฅํžˆ ์ข‹์•„ ๋ณด์ธ๋‹ค. ์ปดํŒจ๋‹ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ „ํ†ต์ ์ธ ํ‚ค ๋ฐ”์ธ๋”ฉ์ธ =C-M-i=๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  eglot-ensure ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด๋ฉด M-x eglot ์„ ์‹คํ–‰ํ•œ๋‹ค. ์ž๋™์œผ๋กœ ํ•  ํ•„์š” ์—†์œผ๋ฉฐ ํ•œ๋ฒˆ ์—ด๋ฉด ๊ณ„์† ์ž‘์—…์„ ํ•˜๋‹ˆ๊นŒ ๋ฒˆ๊ฑฐ๋กญ์ง€๋„ ์•Š๋‹ค. Eglot ์ด ์„œ๋ฒ„์— ๋„ˆ๋ฌด ๋งŽ์€ ์š”์ฒญ์„ ํ•˜์ง€ ์•Š๋„๋ก ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค. LSP + Unsuitable Performance ยท Discussion #993 ยท joaotavora/eglot ยท GitHub

๊ทธ๋ฆฌ๊ณ  (setq eldoc-area-prefer-doc-buffer t)์œผ๋กœ ์„ค์ •ํ•˜๋Š”๋ฐ, eldoc-box ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฒ„ํผ์—์„œ ์ •๋ณด๋ฅผ ๋ณด๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•œ๋‹ค. ๋ฌธ์ œ๋Š” ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ €์ž์˜ ํ‘œํ˜„์— ๋”ฐ๋ฅด๋ฉด sane with the Eldoc dance ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ, flymake-goto-next-error/prev-error ๋ฅผ M-n, M-p ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Š” SLIME ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ถ€ํ„ฐ ์ต์ˆ™ํ•œ ๋ฐ”์ธ๋”ฉ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์œ„ ์ด์•ผ๊ธฐ๋ฅผ ๋ณด๋ฉด์„œ ์ƒ๊ฐ์„ ์ •๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. eldoc-box, eglot, corfu/Cape (manual), flymke ๊ธฐ๋ฐ˜์— ์•„๋ž˜ ์„ค์ •์„ ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

    (setq eldoc-idle-delay 0.75)
    (setq company-idle-delay 0.75)
    (setq flymake-no-changes-timeout 0.5)

Advanced Topics

  • Practically clojure-lsp configuration ์กด์˜ ์„ค์ • ํŒŒ์ผ์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ฐ๋Š” ์ค‘์ด๋‹ค. ์ด ์„ค์ • ํŒŒ์ผ์„ ์ œ๋Œ€๋กœ ์ฝ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋ฌด์Šจ ์„ค์ •์„ ํ–ˆ๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์•Œ๊ณ  ์จ์•ผ ํ•œ๋‹ค.

  • Tree-sitter โ€” Emacs 29 ๋‚ด์žฅ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๋‹ค๋Š” ์˜๊ฒฌ์ด๋‹ค. js2-mode (JavaScript)์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ tree-sitter ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์„ฑ๋น„๊ฐ€ ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.