;;; init-eglot.el --- Configuración de eglot (LSP)   -*- lexical-binding: t -*-

;; Author: kj <webmaster@outcontrol.net>
;; URL: https://git.kj2.me/kj/confi-emacs-actual

;;; Commentary:

;; Este archivo tiene todo lo relacionado con eglot.
;; Eglot es un cliente LSP para Emacs que desde la
;; versión 29 viene integrado dentro del mismo.
;;
;; El nombre Eglot es un apócope de "Emacs polyglot"
;; ya que con este cliente podemos añadir soporte para
;; muchísimos lenguajes, puesto que actualente el que
;; un lenguaje tenga su propio LSP es muy normal.
;;
;; Como añadido:
;;
;; Un Languaje Server Provider (LSP), es un protocolo
;; mediante el cual existen servidores para lenguajes
;; en específico, los cuales proveen cosas como el
;; autocompletado, linting, documentación, ir a la
;; definición, etc.
;;
;; Este protocolo viene a solucionar el problema de
;; que cada herramienta de programación tenga que
;; volver a crear su propio soporte para cada uno
;; de los lenguajes (DRY).

;;; Code:

(use-package eglot
  :defer t
  :ensure nil
  :hook ((css-mode    . eglot-ensure)
         (html-mode   . eglot-ensure)
         (php-mode    . eglot-ensure)
         (php-ts-mode . eglot-ensure)
         (js-mode     . eglot-ensure)
         (tsx-ts-mode . eglot-ensure)
         (typescript-ts-mode . eglot-ensure)
         (rust-mode   . eglot-ensure)
         (sh-mode     . eglot-ensure))
  :config
  (setq eglot-sync-connect 0)
  (add-to-list 'eglot-server-programs '(php-mode . ("intelephense" "--stdio")))
)

;; Mejorar la velocidad de eglot (un binario en rust )
(use-package eglot-booster
  :defer t
  :ensure (:host github :repo "jdtsmith/eglot-booster")
  :after eglot
  :config
  ;;
  (if (executable-find "emacs-lsp-booster")
    (eglot-booster-mode)
  (message "No está instalado emacs-lsp-booster. Eglot se usará de modo normal."))
  )

;; Emmet (mientras veo como hacer funcionar emmet-ls)
(use-package emmet-mode
  :defer t
  :hook
  ((html-mode . emmet-mode)
   (web-mode . emmet-mode))
  )

;; Revisar por errores en el código
(use-package flymake
  :defer t
  :ensure nil
  :hook (prog-mode . (lambda ()
                       (unless (derived-mode-p 'makefile-mode)
                         (flymake-mode))))
  :config
  (remove-hook 'flymake-diagnostic-functions 'flymake-proc-legacy-flymake)
  )

;; Mostar los errores de flymake en un popup-tip
(use-package flymake-diagnostic-at-point
  :defer t
  :ensure t
  :after flymake
  :hook (flymake-mode . flymake-diagnostic-at-point-mode))

(provide 'init-eglot)
;;; init-eglot.el ends here