diff --git a/uno/modules/dev/lsp.org b/uno/modules/dev/lsp.org index 1d85687..17cd0a4 100644 --- a/uno/modules/dev/lsp.org +++ b/uno/modules/dev/lsp.org @@ -28,9 +28,11 @@ Define LSP dev package. "a" '(lsp-execute-code-action :which-key "Execute action") "h" '(:ignore t :which-key "Help") "hh" '(lsp-describe-thing-at-point :which-key "Describe") + "R" '(lsp-workspace-restart :which-key "Restart") "r" '(:ignore t :which-key "Refactor") "rr" '(lsp-rename :which-key "Rename")) :config + (uno/add-useless-buffer "\\*lsp-install") (uno/add-useless-buffer "\\*lsp-log\\*") (uno/handle-side-window "\\*lsp-help\\*")) diff --git a/uno/modules/lang/js/lsp.org b/uno/modules/lang/js/lsp.org new file mode 100644 index 0000000..17e9c25 --- /dev/null +++ b/uno/modules/lang/js/lsp.org @@ -0,0 +1,75 @@ +#+TITLE: Language - JavaScript - LSP +#+AUTHOR: Juan Placencia + +* Package + +Define JavaScript language LSP Integration package. + +#+BEGIN_SRC emacs-lisp + (use-package emacs + :after (uno-lang-js uno-dev-lsp projectile) + :config + (provide 'uno-lang-js-lsp)) +#+END_SRC + +* LSP Integration + +#+BEGIN_SRC emacs-lisp + (use-package emacs + :after uno-lang-js-lsp + :init + (require 'seq) + (defun uno/lang/js/lsp/add-to-local (name file) + "Add NAME dependency from FILE to local instance." + (when (uno/lang/js/lsp/local-provider file) + (lsp-dependency name `(:local ,file)) + t)) + (defun uno/lang/js/lsp/check () + "Set up support with local SDK instance." + (when (uno/lang/js/lsp/local-provider) + (require 'lsp-javascript) + (make-local-variable 'lsp-enabled-clients) + (plist-put lsp-deps-providers + :local '(:path uno/lang/js/lsp/local-provider)) + (setq-local lsp-auto-guess-root t) + (run-hooks 'uno-lang-js-lsp-hook))) + (defun uno/lang/js/lsp/local-provider (&optional path) + "Provide path for local SDK instance relative to PATH." + (seq-reduce + (lambda (current sdk) + (if current + current + (let ((-path (concat (projectile-project-root) sdk path))) + (if (file-exists-p -path) -path nil)))) + '(".yarn/sdks/" "node_modules/") + nil)) + (defun uno/lang/js/lsp/local-provider-type (&optional path) + "Check SDK instance type relative to PATH." + (let ((-path (uno/lang/js/lsp/local-provider path))) + (cond + (string-match-p ".yarn/sdks/" -path) "yarn") + (string-match-p "node_modules/" -path) "npm"))) +#+END_SRC + +** ESLint Integration + +#+BEGIN_SRC emacs-lisp + (use-package emacs + :after (uno-lang-js-lsp flycheck) + :hook + (uno-lang-js-lsp . uno/lang/js/eslint/add) + :init + (defun uno/lang/js/eslint/add () + "Add support for ESLint." + (when (uno/lang/js/lsp/local-provider "eslint/bin/eslint.js") + (let ((-eslint-full + (uno/lang/js/lsp/local-provider "eslint/bin/eslint.js")) + (-node-path (uno/lang/js/lsp/local-provider))) + (setq-local + flycheck-javascript-eslint-executable -eslint-full + lsp-eslint-node-path -node-path + lsp-eslint-package-manager (uno/lang/js/lsp/local-provider-type))) + (push 'eslint lsp-enabled-clients))) + (uno/add-useless-buffer "\\*eslint\\*") + (uno/add-useless-buffer "\\*eslint::.*\\*")) +#+END_SRC diff --git a/uno/modules/lang/js/ts.org b/uno/modules/lang/js/ts.org index 0e1ea76..175ad93 100644 --- a/uno/modules/lang/js/ts.org +++ b/uno/modules/lang/js/ts.org @@ -35,18 +35,18 @@ Define TypeScript JavaScript language package. #+BEGIN_SRC emacs-lisp (use-package emacs - :after (uno-lang-js-ts uno-lang-js-yarn typescript-mode) + :after (uno-lang-js-ts uno-lang-js-lsp typescript-mode) :hook - (uno-lang-js-yarn . uno/lang/js/ts/yarn) - ((typescript-mode typescript-tsx-mode) . uno/lang/js/yarn/check) + (uno-lang-js-lsp . uno/lang/js/ts/lsp) + ((typescript-mode typescript-tsx-mode) . uno/lang/js/lsp/check) :init - (defun uno/lang/js/ts/yarn () - "Attempt to load SDKs with Yarn support." + (defun uno/lang/js/ts/lsp () + "Attempt to load local SDKs." (when (and (member major-mode '(typescript-mode typescript-tsx-mode)) - (uno/lang/js/yarn/add-to-local-lsp + (uno/lang/js/lsp/add-to-local 'typescript-language-server "typescript-language-server/lib/cli.js") - (uno/lang/js/yarn/add-to-local-lsp + (uno/lang/js/lsp/add-to-local 'typescript "typescript/bin/tsserver")) (push 'ts-ls lsp-enabled-clients) diff --git a/uno/modules/lang/js/yarn.org b/uno/modules/lang/js/yarn.org deleted file mode 100644 index ef6e13a..0000000 --- a/uno/modules/lang/js/yarn.org +++ /dev/null @@ -1,65 +0,0 @@ -#+TITLE: Language - JavaScript - Yarn -#+AUTHOR: Juan Placencia - -* Package - -Define JavaScript language package. - -#+BEGIN_SRC emacs-lisp - (use-package emacs - :after (uno-lang-js uno-dev-lsp projectile) - :config - (provide 'uno-lang-js-yarn)) -#+END_SRC - -* LSP Integration - -#+BEGIN_SRC emacs-lisp - (use-package emacs - :after uno-lang-js-yarn - :init - (defun uno/lang/js/yarn/add-to-local-lsp (name file) - "Add NAME dependency from FILE to local yarn instance." - (when (uno/lang/js/yarn/local-p file) - (lsp-dependency name `(:yarn-local ,file)) - t)) - (defun uno/lang/js/yarn/check () - "Set up support with local Yarn instance." - (when (uno/lang/js/yarn/local-p) - (require 'lsp-javascript) - (make-local-variable 'lsp-enabled-clients) - (plist-put lsp-deps-providers - :yarn-local '(:path uno/lang/js/yarn/local-provider)) - (setq-local lsp-auto-guess-root t) - (run-hooks 'uno-lang-js-yarn-hook))) - (defun uno/lang/js/yarn/local-p (&optional file) - "Check if Yarn SDK is available locally." - (if file - (file-exists-p (uno/lang/js/yarn/local-provider file)) - (file-directory-p (uno/lang/js/yarn/local-provider)))) - (defun uno/lang/js/yarn/local-provider (&optional path) - "Provide path for local yarn instance relative to PATH." - (concat (projectile-project-root) ".yarn/sdks/" path))) -#+END_SRC - -** ESLint Integration - -#+BEGIN_SRC emacs-lisp - (use-package emacs - :after (uno-lang-js-yarn flycheck) - :hook - (uno-lang-js-yarn . uno/lang/js/eslint/add) - :init - (defun uno/lang/js/eslint/add () - "Add support for ESLint." - (when (uno/lang/js/yarn/local-p "eslint/bin/eslint.js") - (let ((-eslint-full (uno/lang/js/yarn/local-provider "eslint/bin/eslint.js")) - (-node-path (uno/lang/js/yarn/local-provider))) - (setq-local - flycheck-javascript-eslint-executable -eslint-full - lsp-eslint-node-path -node-path - lsp-eslint-package-manager "yarn")) - (push 'eslint lsp-enabled-clients))) - (uno/add-useless-buffer "\\*eslint\\*") - (uno/add-useless-buffer "\\*eslint::.*\\*")) -#+END_SRC