improve erc-sasl
[Emacs.git] / lisp / init-javascript.el
blob53e46b5af05b0175ea0bcfa5fd2e322cd396ca56
1 ;;; init-javascript.el --- Support for Javascript and derivatives -*- lexical-binding: t -*-
2 ;;; Commentary:
3 ;;; Code:
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)
23 ;; js2-mode
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)
38 (js2-minor-mode 1))))
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"))
51 (require 'derived)
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