(require-package 'json-mode) (when (>= emacs-major-version 24) (require-package 'js2-mode) (require-package 'ac-js2) (require-package 'coffee-mode)) (require-package 'js-comint) (defcustom preferred-javascript-mode (first (remove-if-not #'fboundp '(js2-mode js-mode))) "Javascript mode to use for .js files." :type 'symbol :group 'programming :options '(js2-mode js-mode)) (defvar preferred-javascript-indent-level 2) ;; Need to first remove from list if present, since elpa adds entries too, which ;; may be in an arbitrary order (eval-when-compile (require 'cl)) (setq auto-mode-alist (cons `("\\.js\\(\\.erb\\)?\\'" . ,preferred-javascript-mode) (loop for entry in auto-mode-alist unless (eq preferred-javascript-mode (cdr entry)) collect entry))) ;; js2-mode (after-load 'js2-mode ;; Disable js2 mode's syntax error highlighting by default... (setq-default js2-mode-show-parse-errors nil js2-mode-show-strict-warnings nil) ;; ... but enable it if flycheck can't handle javascript (autoload 'flycheck-get-checker-for-buffer "flycheck") (defun sanityinc/disable-js2-checks-if-flycheck-active () (unless (flycheck-get-checker-for-buffer) (set (make-local-variable 'js2-mode-show-parse-errors) t) (set (make-local-variable 'js2-mode-show-strict-warnings) t))) (add-hook 'js2-mode-hook 'sanityinc/disable-js2-checks-if-flycheck-active) (add-hook 'js2-mode-hook '(lambda () (setq mode-name "JS2"))) (setq-default js2-basic-offset preferred-javascript-indent-level js2-bounce-indent-p nil) (after-load 'js2-mode (js2-imenu-extras-setup))) ;; js-mode (setq-default js-indent-level preferred-javascript-indent-level) (add-to-list 'interpreter-mode-alist (cons "node" preferred-javascript-mode)) ;; Javascript nests {} and () a lot, so I find this helpful (require-package 'rainbow-delimiters) (dolist (hook '(js2-mode-hook js-mode-hook json-mode-hook)) (add-hook hook 'rainbow-delimiters-mode)) ;;; Coffeescript (after-load 'coffee-mode (setq coffee-js-mode preferred-javascript-mode coffee-tab-width preferred-javascript-indent-level)) (when (fboundp 'coffee-mode) (add-to-list 'auto-mode-alist '("\\.coffee\\.erb\\'" . coffee-mode))) ;; --------------------------------------------------------------------------- ;; Run and interact with an inferior JS via js-comint.el ;; --------------------------------------------------------------------------- (setq inferior-js-program-command "js") (defvar inferior-js-minor-mode-map (make-sparse-keymap)) (define-key inferior-js-minor-mode-map "\C-x\C-e" 'js-send-last-sexp) (define-key inferior-js-minor-mode-map "\C-\M-x" 'js-send-last-sexp-and-go) (define-key inferior-js-minor-mode-map "\C-cb" 'js-send-buffer) (define-key inferior-js-minor-mode-map "\C-c\C-b" 'js-send-buffer-and-go) (define-key inferior-js-minor-mode-map "\C-cl" 'js-load-file-and-go) (define-minor-mode inferior-js-keys-mode "Bindings for communicating with an inferior js interpreter." nil " InfJS" inferior-js-minor-mode-map) (dolist (hook '(js2-mode-hook js-mode-hook)) (add-hook hook 'inferior-js-keys-mode)) ;; --------------------------------------------------------------------------- ;; Alternatively, use skewer-mode ;; --------------------------------------------------------------------------- (when (and (>= emacs-major-version 24) (featurep 'js2-mode)) (require-package 'skewer-mode) (after-load 'skewer-mode (add-hook 'skewer-mode-hook (lambda () (inferior-js-keys-mode -1))))) ;; Tern ;; https://ternjs.net/doc/manual.html#emacs ;;(add-to-list 'load-path "~/workspace/tern/emacs/") ;;(autoload 'tern-mode "tern.el" nil t) ;;(add-hook 'js2-mode-hook (lambda () (tern-mode t))) ;;(eval-after-load 'tern ;; '(progn ;; (require 'tern-auto-complete) ;; (tern-ac-setup))) (provide 'init-javascript)