From 445e0d40ebe190c4dfa80aefc8d73a7f9c801a93 Mon Sep 17 00:00:00 2001 From: Maxi Wolff Date: Thu, 22 Dec 2022 12:13:47 +0100 Subject: [PATCH] [vue] Make vue lsp integration adhere to current standards this includes requiring the lsp layer if not already loaded and not changing settings controlled by auto complete layer. In addition diagnostics from lsp servers will not longer be ignored if not specifically requested, see the layer readme for details. --- layers/+frameworks/vue/README.org | 44 +++++++++++++----------------- layers/+frameworks/vue/config.el | 11 ++++++-- layers/+frameworks/vue/funcs.el | 22 +++++++-------- layers/+frameworks/vue/layers.el | 4 +++ layers/+frameworks/vue/packages.el | 22 ++++++++++----- 5 files changed, 56 insertions(+), 47 deletions(-) diff --git a/layers/+frameworks/vue/README.org b/layers/+frameworks/vue/README.org index d0edacc2e..ce7a83a62 100644 --- a/layers/+frameworks/vue/README.org +++ b/layers/+frameworks/vue/README.org @@ -11,7 +11,7 @@ - [[#backends][Backends]] - [[#dumb][dumb]] - [[#lsp][lsp]] -- [[#optional-configuration][Optional Configuration]] +- [[#indentation][Indentation]] - [[#key-bindings][Key bindings]] - [[#web-mode][web-mode]] - [[#formatting-prettier][Formatting (prettier)]] @@ -64,7 +64,7 @@ To use automatic code formatting you need to install =prettier= with: #+END_SRC If you want to use local =eslint= and =prettier= in your project, turn on node - layer =dotspacemacs-configuration-layers= function: +layer =dotspacemacs-configuration-layers= function: #+BEGIN_SRC elisp (node :variables node-add-modules-path t) @@ -74,42 +74,36 @@ If you want to use local =eslint= and =prettier= in your project, turn on node ** dumb dumb backend is light weight and fast. =dumb-jump= is used to handled go to definition (=gd= vim key binding). Because of the template nature of Vue, it -works very well. +works very well. -Company backend is set to be very eager in suggestions. +Company backend is set to be very eager in suggestions. =eslint= is used for linting. ** lsp -Vue language server needs to be installed +Vue language server needs to be installed which one depends on the version of +Vue you are using. For vue2 use: #+BEGIN_SRC sh $ npm install -g vls #+END_SRC -This backend provides all the fancy features like: jump to definition, -references, type inference... However, =eslint= is explicitly selected for -linting because it works better than =lsp= linter. +for vue3 use: -* Optional Configuration -~web-mode-script-padding~ is set to 0, so indent is zero at root level inside -~script~ tag - -Same as =react= layer, you may refer to the =web-mode= configuration for fine -tuning the indenting behaviour. - -For example, if you wan't two space indentation, put this in your -=dotspacemacs/user-config= - -#+BEGIN_SRC emacs-lisp - (setq-default - ;; web-mode - web-mode-markup-indent-offset 2 - web-mode-css-indent-offset 2 - web-mode-code-indent-offset 2 - web-mode-attr-indent-offset 2) +#+BEGIN_SRC sh + $ npm install -g volar #+END_SRC +These backends provide all the fancy features like: jump to definition, +references, type inference... + +If you are not happy with the linting behaviour of your lsp server you can +fallback to =eslint= by setting =vue-ignore-lsp-diagnostics= to =t=. + +* Indentation +~web-mode-script-padding~ is set to 0, so indent is zero at root level inside +~script~ tag. + * Key bindings ** web-mode Free stuff from `html' layer, with minor change to avoid conflict with =lsp= layer diff --git a/layers/+frameworks/vue/config.el b/layers/+frameworks/vue/config.el index c0d0e499d..c8e601e64 100644 --- a/layers/+frameworks/vue/config.el +++ b/layers/+frameworks/vue/config.el @@ -20,9 +20,14 @@ ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . +(spacemacs|defc vue-backend (if (configuration-layer/layer-used-p 'lsp) 'lsp 'dumb) + "The backend to use for IDE features. +Possible values are `lsp' and `dumb'. +If not set then `dumb' is the default backend unless `lsp' layer is used." + '(choice (const lsp) (const dumb)) nil t) - -(defvar vue-backend 'dumb - "The backend to use for IDE features. Possible values are `dumb' and `lsp'.") +(spacemacs|defc vue-ignore-lsp-diagnostics nil + "If VUE-BACKEND is `lsp' the server will handle the linters, if you prefer to have emacs handle these instead set this to `t'" + 'boolean nil t) (spacemacs|define-jump-handlers vue-mode) diff --git a/layers/+frameworks/vue/funcs.el b/layers/+frameworks/vue/funcs.el index 7af03ae25..70d8398e6 100644 --- a/layers/+frameworks/vue/funcs.el +++ b/layers/+frameworks/vue/funcs.el @@ -20,8 +20,6 @@ ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . - - ;; backend (defun spacemacs//vue-setup-backend () "Conditionally setup vue backend." @@ -31,8 +29,13 @@ (defun spacemacs//vue-setup-company () "Conditionally setup company based on backend." - (when (eq vue-backend 'dumb) - (spacemacs//vue-setup-dumb-company))) + (pcase vue-backend + ('dumb (spacemacs|add-company-backends + :backends (company-web-html company-css company-files company-dabbrev) + :modes vue-mode)) + ('lsp (spacemacs|add-company-backends + :backends company-capf + :modes vue-mode)))) ;; lsp @@ -42,14 +45,14 @@ (progn ;; error checking from lsp langserver sucks, turn it off ;; so eslint won't be overriden - (setq-local lsp-diagnostics-provider :none) + (when vue-ignore-lsp-diagnostics + (setq-local lsp-diagnostics-provider :none)) (lsp-deferred)) (message (concat "`lsp' layer is not installed, " "please add `lsp' layer to your dotfile.")))) ;; dumb - (defun spacemacs//vue-setup-dumb () (setq imenu-generic-expression '(("html" "^