1 ;;; init-javascript.el --- Support for Javascript and derivatives -*- lexical-binding: t -*-
5 (maybe-require-package 'json-mode
)
6 (maybe-require-package 'js2-mode
)
7 (maybe-require-package 'typescript-mode
)
8 (maybe-require-package 'prettier-js
)
11 ;;; Basic js-mode setup
13 (add-to-list 'auto-mode-alist
'("\\.\\(js\\|es6\\)\\(\\.erb\\)?\\'" . js-mode
))
15 (with-eval-after-load 'js
16 (sanityinc/major-mode-lighter
'js-mode
"JS")
17 (sanityinc/major-mode-lighter
'js-jsx-mode
"JSX"))
19 (setq-default js-indent-level
2)
25 ;; Change some defaults: customize them to override
26 (setq-default js2-bounce-indent-p nil
)
27 (with-eval-after-load 'js2-mode
28 ;; Disable js2 mode's syntax error highlighting by default...
29 (setq-default js2-mode-show-parse-errors nil
30 js2-mode-show-strict-warnings nil
)
31 ;; ... but enable it if flycheck can't handle javascript
32 (autoload 'flycheck-get-checker-for-buffer
"flycheck")
33 (defun sanityinc/enable-js2-checks-if-flycheck-inactive
()
34 (unless (flycheck-get-checker-for-buffer)
35 (setq-local js2-mode-show-parse-errors t
)
36 (setq-local js2-mode-show-strict-warnings t
)
37 (when (derived-mode-p 'js-mode
)
39 (add-hook 'js-mode-hook
'sanityinc
/enable-js2-checks-if-flycheck-inactive
)
40 (add-hook 'js2-mode-hook
'sanityinc
/enable-js2-checks-if-flycheck-inactive
)
42 (js2-imenu-extras-setup))
44 (add-to-list 'interpreter-mode-alist
(cons "node" 'js2-mode
))
46 (with-eval-after-load 'js2-mode
47 (sanityinc/major-mode-lighter
'js2-mode
"JS2")
48 (sanityinc/major-mode-lighter
'js2-jsx-mode
"JSX2"))
52 (when (and (or (executable-find "rg") (executable-find "ag"))
53 (maybe-require-package 'xref-js2
))
54 (when (executable-find "rg")
55 (setq-default xref-js2-search-program
'rg
))
57 (defun sanityinc/enable-xref-js2
()
58 (add-hook 'xref-backend-functions
#'xref-js2-xref-backend nil t
))
60 (let ((base-mode (if (fboundp 'js-base-mode
) 'js-base-mode
'js-mode
)))
61 (with-eval-after-load 'js
62 (add-hook (derived-mode-hook-name base-mode
) 'sanityinc
/enable-xref-js2
)
63 (define-key js-mode-map
(kbd "M-.") nil
)
64 (when (boundp 'js-ts-mode-map
)
65 (define-key js-ts-mode-map
(kbd "M-.") nil
))))
66 (with-eval-after-load 'js2-mode
67 (define-key js2-mode-map
(kbd "M-.") nil
)))
71 ;; Run and interact with an inferior JS via js-comint.el
73 (when (maybe-require-package 'js-comint
)
74 (setq js-comint-program-command
"node")
76 (defvar inferior-js-minor-mode-map
(make-sparse-keymap))
77 (define-key inferior-js-minor-mode-map
"\C-x\C-e" 'js-send-last-sexp
)
78 (define-key inferior-js-minor-mode-map
"\C-cb" 'js-send-buffer
)
80 (define-minor-mode inferior-js-keys-mode
81 "Bindings for communicating with an inferior js interpreter."
82 :init-value nil
:lighter
" InfJS" :keymap inferior-js-minor-mode-map
)
84 (dolist (hook '(js2-mode-hook js-mode-hook
))
85 (add-hook hook
'inferior-js-keys-mode
)))
88 (provide 'init-javascript
)
89 ;;; init-javascript.el ends here