112 lines
4.4 KiB
EmacsLisp
112 lines
4.4 KiB
EmacsLisp
;;; init-lsp.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
|
|
: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 '(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
|