spacemacs/layers/+lang/typescript/packages.el
Aaron Jensen d52883fc56 typescript: Fix jump handling with multiple backends
Because the setup functions run after local vars are set, setting jump handlers
needs to happen directly. Otherwise setting them only applies to the next
typescript file that is opened, which may or may not even have the same backend.

Also prevents lsp jump handlers from being installed unless the backend is lsp.
2018-11-20 11:34:24 +00:00

137 lines
6 KiB
EmacsLisp

;;; packages.el --- typescript Layer packages File for Spacemacs
;;
;; Copyright (c) 2012-2018 Sylvain Benner & Contributors
;;
;; Author: Chris Bowdon <c.bowdon@bath.edu>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3
(setq typescript-packages
'(
add-node-modules-path
company
eldoc
flycheck
lsp-javascript-typescript
smartparens
tide
typescript-mode
web-mode
yasnippet
))
(defun typescript/post-init-add-node-modules-path ()
(spacemacs/add-to-hooks #'add-node-modules-path '(typescript-mode-hook
typescript-tsx-mode-hook)))
(defun typescript/post-init-company ()
(spacemacs/add-to-hooks #'spacemacs//typescript-setup-company
'(typescript-mode-local-vars-hook
typescript-tsx-mode-local-vars-hook)))
(defun typescript/post-init-eldoc ()
(spacemacs/add-to-hooks #'spacemacs//typescript-setup-eldoc
'(typescript-mode-local-vars-hook
typescript-tsx-mode-local-vars-hook) t))
(defun typescript/post-init-flycheck ()
(spacemacs/enable-flycheck 'typescript-mode)
(spacemacs/enable-flycheck 'typescript-tsx-mode)
(with-eval-after-load 'tide
(with-eval-after-load 'flycheck
(flycheck-add-mode 'typescript-tide 'typescript-tsx-mode)
(flycheck-add-mode 'typescript-tslint 'typescript-tsx-mode))))
(defun typescript/post-init-lsp-javascript-typescript ()
(when (eq typescript-backend 'lsp)
(spacemacs//setup-lsp-jump-handler 'typescript-mode
'typescript-tsx-mode)))
(defun typescript/post-init-smartparens ()
(if dotspacemacs-smartparens-strict-mode
(spacemacs/add-to-hooks #'smartparens-strict-mode '(typescript-mode-hook
typescript-tsx-mode-hook))
(spacemacs/add-to-hooks #'smartparens-mode '(typescript-mode-hook
typescript-tsx-mode-hook))))
(defun typescript/init-tide ()
(use-package tide
:defer t
:commands (typescript/jump-to-type-def)
:config
(progn
(spacemacs/declare-prefix-for-mode 'typescript-mode "mE" "errors")
(spacemacs/declare-prefix-for-mode 'typescript-tsx-mode "mE" "errors")
(spacemacs/declare-prefix-for-mode 'typescript-mode "mg" "goto")
(spacemacs/declare-prefix-for-mode 'typescript-tsx-mode "mg" "goto")
(spacemacs/declare-prefix-for-mode 'typescript-mode "mh" "help")
(spacemacs/declare-prefix-for-mode 'typescript-tsx-mode "mh" "help")
(spacemacs/declare-prefix-for-mode 'typescript-mode "mn" "name")
(spacemacs/declare-prefix-for-mode 'typescript-tsx-mode "mn" "name")
(spacemacs/declare-prefix-for-mode 'typescript-mode "mr" "refactor")
(spacemacs/declare-prefix-for-mode 'typescript-tsx-mode "mr" "refactor")
(spacemacs/declare-prefix-for-mode 'typescript-mode "mS" "server")
(spacemacs/declare-prefix-for-mode 'typescript-tsx-mode "mS" "server")
(spacemacs/declare-prefix-for-mode 'typescript-mode "ms" "send")
(spacemacs/declare-prefix-for-mode 'typescript-tsx-mode "ms" "send")
(setq keybindingList '("Ee" tide-fix
"Ed" tide-add-tslint-disable-next-line
"gb" tide-jump-back
"gg" tide-jump-to-definition
"gt" spacemacs/typescript-jump-to-type-def
"gu" tide-references
"hh" tide-documentation-at-point
"ri" tide-organize-imports
"rr" tide-rename-symbol
"rf" tide-rename-file
"sr" tide-restart-server)
typescriptList (cons 'typescript-mode keybindingList)
typescriptTsxList (cons 'typescript-tsx-mode
(cons "gg" (cons 'tide-jump-to-definition
keybindingList ))))
(apply 'spacemacs/set-leader-keys-for-major-mode typescriptList)
(apply 'spacemacs/set-leader-keys-for-major-mode typescriptTsxList)))
(add-to-list 'spacemacs-jump-handlers-typescript-tsx-mode
(add-to-list 'spacemacs-jump-handlers '(tide-jump-to-definition :async t))
'(tide-jump-to-definition :async t))
(add-to-list 'spacemacs-jump-handlers-typescript-mode
'(tide-jump-to-definition :async t)))
(defun typescript/post-init-web-mode ()
(define-derived-mode typescript-tsx-mode web-mode "TypeScript-tsx")
(add-to-list 'auto-mode-alist '("\\.tsx\\'" . typescript-tsx-mode)))
(defun typescript/post-init-yasnippet ()
(spacemacs/add-to-hooks #'spacemacs/typescript-yasnippet-setup '(typescript-mode-hook
typescript-tsx-mode-hook)))
(defun typescript/init-typescript-mode ()
(use-package typescript-mode
:defer t
:init
(progn
;; setup typescript backend
(spacemacs/add-to-hooks #'spacemacs//typescript-setup-backend
'(typescript-mode-local-vars-hook
typescript-tsx-mode-local-vars-hook))
;; safe values for backend to be used in directory file variables
(dolist (value '(lsp tide))
(add-to-list 'safe-local-variable-values
(cons 'typescript-backend value))))
:config
(progn
(when typescript-fmt-on-save
(spacemacs/add-to-hooks 'spacemacs/typescript-fmt-before-save-hook
'(typescript-mode-hook typescript-tsx-mode-hook)))
(spacemacs/set-leader-keys-for-major-mode 'typescript-mode
"=" 'spacemacs/typescript-format
"sp" 'spacemacs/typescript-open-region-in-playground)
(spacemacs/set-leader-keys-for-major-mode 'typescript-tsx-mode
"=" 'spacemacs/typescript-format
"sp" 'spacemacs/typescript-open-region-in-playground))))