dotfiles/.emacs.d/modules/sqrt-lsp.el

101 lines
3.5 KiB
EmacsLisp

;;; -*- lexical-binding: t -*-
(use-package lsp-mode
:straight t
:hook (
(typescript-mode . lsp)
(js-mode . lsp)
(vue-mode . lsp)
(go-mode . lsp)
(svelte-mode . lsp)
;; (python-mode . lsp)
(json-mode . lsp)
(haskell-mode . lsp)
(haskell-literate-mode . lsp)
(java-mode . lsp)
;; (csharp-mode . lsp)
)
:commands lsp
:init
(setq lsp-keymap-prefix nil)
:config
(setq lsp-idle-delay 1)
(setq lsp-eslint-server-command '("node" "/home/pavel/.emacs.d/.cache/lsp/eslint/unzipped/extension/server/out/eslintServer.js" "--stdio"))
(setq lsp-eslint-run "onSave")
(setq lsp-signature-render-documentation nil)
;; (lsp-headerline-breadcrumb-mode nil)
(setq lsp-headerline-breadcrumb-enable nil)
(setq lsp-modeline-code-actions-enable nil)
(setq lsp-modeline-diagnostics-enable nil)
(setq lsp-volar-take-over-mode nil)
(add-to-list 'lsp-language-id-configuration '(svelte-mode . "svelte")))
(use-package lsp-ui
:straight t
:commands lsp-ui-mode
:config
(setq lsp-ui-doc-delay 2)
(setq lsp-ui-sideline-show-hover nil))
(use-package all-the-icons
:straight t)
(my-leader-def
:infix "l"
"" '(:which-key "lsp")
"d" 'lsp-ui-peek-find-definitions
"r" 'lsp-rename
"u" 'lsp-ui-peek-find-references
"s" 'lsp-ui-find-workspace-symbol
"l" 'lsp-execute-code-action
"e" 'list-flycheck-errors)
(defun my/lsp--progress-status ()
"Returns the status of the progress for the current workspaces."
(-let ((progress-status
(s-join
"|"
(-keep
(lambda (workspace)
(let ((tokens (lsp--workspace-work-done-tokens workspace)))
(unless (ht-empty? tokens)
(mapconcat
(-lambda ((&WorkDoneProgressBegin :message? :title :percentage?))
(concat (if percentage?
(if (numberp percentage?)
(format "%.0f%%%% " percentage?)
(format "%s%%%% " percentage?))
"")
(let ((msg (url-unhex-string (or message\? title))))
(if (string-match-p "\\`file:///" msg)
(file-name-nondirectory msg)))))
(ht-values tokens)
"|"))))
(lsp-workspaces)))))
(unless (s-blank? progress-status)
(concat lsp-progress-prefix progress-status))))
(with-eval-after-load 'lsp-mode
(advice-add 'lsp--progress-status :override #'my/lsp--progress-status))
(setq my/lsp--vue-diagnostics-last-update (make-hash-table :test #'equal))
(defun my/lsp--on-diagnostics (fn workspace params)
(if (equal (gethash 'vue-semantic-server lsp-clients)
(lsp--workspace-client workspace))
(progn
(let* ((is-empty (seq-empty-p (gethash "diagnostics" params)))
(uri (gethash "uri" params))
(last-update (gethash uri my/lsp--vue-diagnostics-last-update))
(current-update (time-convert nil #'integer)))
(unless is-empty
(puthash uri current-update my/lsp--vue-diagnostics-last-update))
(when (or (not is-empty)
(not last-update)
(> (- current-update (or last-update 0)) 5))
(funcall fn workspace params))))
(funcall fn workspace params)))
(with-eval-after-load 'lsp
(advice-add #'lsp--on-diagnostics :around #'my/lsp--on-diagnostics))
(provide 'sqrt-lsp)