;;; init-lsp.el --- Configuración de eglot (LSP) -*- lexical-binding: t -*- ;; Author: kj ;; 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 :ensure nil :hook ((prog-mode . (lambda () (unless (derived-mode-p 'emacs-lisp-mode 'lisp-mode 'makefile-mode 'snippet-mode 'ron-mode) (eglot-ensure)))) ((markdown-mode yaml-mode yaml-ts-mode) . eglot-ensure)) :init (setq read-process-output-max (* 4 1024 1024)) ; 4MB (setq eglot-autoshutdown t eglot-send-changes-idle-time 0.5) :config (setq eglot-sync-connect 0) (add-to-list 'eglot-server-programs '(php-mode . ("rass" "--" "intelephense" "--stdio"))) (add-to-list 'eglot-server-programs '(web-mode . ("rass" "--" "htmx-lsp" "--" "intelephense" "--stdio"))) (add-to-list 'eglot-server-programs '(html-mode . ("rass" "--" "htmx-lsp" "--" "intelephense" "--stdio"))) (add-to-list 'eglot-server-programs '(nhtml-mode . ("rass" "--" "htmx-lsp" "--" "intelephense" "--stdio"))) (add-to-list 'eglot-server-programs 'makefile-mode . ("make-ls")) ;;(add-to-list 'eglot-server-programs '(markdown-mode . ("marksman"))) (add-to-list 'eglot-ignored-server-capabilities :inlayHintProvider) ) ;; Mejorar la velocidad de eglot (un binario en rust ) (use-package eglot-booster :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 :hook ((html-mode . emmet-mode) (web-mode . emmet-mode)) ) ;; Revisar por errores en el código (use-package flymake :ensure nil ;; :hook (prog-mode . (lambda () ;; (unless (derived-mode-p 'makefile-mode) ;; (flymake-mode)))) :init (remove-hook 'flymake-diagnostic-functions 'flymake-proc-legacy-flymake) :config ;; Workaround de bug#81786 (flymake): la rama no-ratón del `interactive' ;; de `flymake-show-buffer-diagnostics' devolvía la LISTA de diagnósticos ;; solapados en el punto y Emacs la reexpandía como argumentos ;; ("Wrong number of arguments: ..., N"). Arreglado en emacs-31/31.2 y ;; pendiente de fusionar a master; borrar cuando tu flymake incluya el fix. (defun flymake--one-diag-filter (args) "Keep only the first diagnostic of ARGS (bug#81786 workaround)." (if (cdr args) (list (car args)) args)) (advice-add 'flymake-show-buffer-diagnostics :filter-args #'flymake--one-diag-filter)) (use-package flymake-phpcs :ensure (:host github :repo "KJ2ME/flymake-phpcs") :config ;; Al conectar, Eglot hace `setq-local' de `flymake-diagnostic-functions' ;; (= (eglot-flymake-backend)), borrando nuestro backend; el siguiente ;; rechequeo de flymake limpia entonces los overlays de phpcs (aparecen y ;; luego desaparecen). Lo re-añadimos cuando Eglot termine de gestionar el ;; buffer (el hook corre DESPUES del `setq') y forzamos un rechequeo. (defun flymake-phpcs-readd-after-eglot () "Re-register the phpcs backend and re-check once Eglot manages the buffer." (when (derived-mode-p 'php-mode 'php-ts-mode) (add-hook 'flymake-diagnostic-functions #'flymake-phpcs nil t) (flymake-mode 1) (flymake-start))) (add-hook 'eglot-managed-mode-hook #'flymake-phpcs-readd-after-eglot) :hook ((php-mode php-ts-mode) . flymake-phpcs-load)) (provide 'init-lsp) ;;; init-lsp.el ends here