lang/javscript: unify lsp & tide initialization

The goal was to enable lsp (if +lsp is enabled), failing that it would
fall back on tide. This also adds lsp+tide support for tsx files opened
in web-mode.
This commit is contained in:
Henrik Lissner 2019-06-11 08:00:14 +02:00
parent a56ce38903
commit b3c27ebe60
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -126,27 +126,36 @@
;;
;;; Tools
(defun +javascript|init-lsp-or-tide-maybe ()
"Start `lsp' or `tide' in the current buffer.
LSP will be used if the +lsp flag is enabled for :lang javascript AND if the
current buffer represents a file in a project.
If LSP fails to start (e.g. no available server or project), then we fall back
to tide."
(let ((buffer-file-name (buffer-file-name (buffer-base-buffer))))
(when (or (derived-mode-p 'js-mode 'typescript-mode)
(and (eq major-mode 'web-mode)
(string= "tsx" (file-name-extension buffer-file-name))))
(cond ((not buffer-file-name)
;; necessary because `tide-setup' and `lsp' will error if not a
;; file-visiting buffer
(add-hook 'after-save-hook #'+javascript|init-tide-or-lsp-maybe nil 'local))
((executable-find "node")
(when (featurep! +lsp)
(lsp!))
;; fall back to tide
(when (and (not (bound-and-true-p lsp-mode))
(require 'tide nil t))
(tide-setup))
(remove-hook 'after-save-hook #'+javascript|init-tide-or-lsp-maybe 'local))))))
(add-hook! (js-mode typescript-mode web-mode) #'+javascript|init-tide-maybe)
(def-package! tide
:defer t
:init
(defun +javascript|init-tide-maybe ()
"Enable `tide-mode' if node is available, `lsp-mode' isn't enabled and this
buffer represents a real file."
(unless (bound-and-true-p lsp-mode)
(cond ((not buffer-file-name)
;; necessary because `tide-setup' will error if not a file-visiting buffer
(add-hook 'after-save-hook #'+javascript|init-tide-maybe nil 'local))
((executable-find "node")
(tide-setup)
(remove-hook 'after-save-hook #'+javascript|init-tide-maybe 'local))
((message "Couldn't find `node', aborting tide server")))))
(add-hook! (js2-mode typescript-mode) #'+javascript|init-tide-maybe)
(defun +javascript|init-tide-in-web-mode ()
"Enable `tide-mode' if in a *.tsx file (and `lsp-mode' isn't active)."
(when (string= (file-name-extension (or buffer-file-name "")) "tsx")
(+javascript|init-tide-maybe)))
(add-hook 'web-mode-hook #'+javascript|init-tide-in-web-mode)
:config
(setq tide-completion-detailed t
tide-always-show-documentation t)
@ -176,10 +185,6 @@ buffer represents a real file."
"roi" #'tide-organize-imports))
(when (featurep! +lsp)
(add-hook! (js2-mode typescript-mode) #'lsp!))
(def-package! xref-js2
:when (featurep! :tools lookup)
:after (:or js2-mode rjsx-mode)