(defun my-js2-indent-function ()
(interactive)
(save-restriction
(widen)
(let* ((inhibit-point-motion-hooks t)
(parse-status (save-excursion (syntax-ppss (point-at-bol))))
(offset (- (current-column) (current-indentation)))
(indentation (js--proper-indentation parse-status))
node)
(save-excursion
;; I like to indent case and labels to half of the tab width
(back-to-indentation)
(if (looking-at "case\\s-")
(setq indentation (+ indentation (/ js-indent-level 4))))
;; consecutive declarations in a var statement are nice if
;; properly aligned, i.e:
;;
;; var foo = "bar",
;; bar = "foo";
(setq node (js2-node-at-point))
(when (and node
(= js2-NAME (js2-node-type node))
(= js2-VAR (js2-node-type (js2-node-parent node))))
(setq indentation (+ 4 indentation))))
(indent-line-to indentation)
(when (> offset 0) (forward-char offset)))))
(defun my-js2-mode-hook ()
(if (not (boundp 'js--proper-indentation))
(progn (js-mode)
(remove-hook 'js2-mode-hook 'my-js2-mode-hook)
(js2-mode)
(require 'js2-refactor)
(add-hook 'js2-mode-hook 'my-js2-mode-hook)))
(set (make-local-variable 'indent-line-function) 'my-js2-indent-function)
(define-key js2-mode-map [(return)] 'newline-and-indent)
(define-key js2-mode-map (kbd "C-M-(") 'javascript-region-2-anonymous-function)
(define-key js2-mode-map (kbd "C-M-d") 'js2-mark-defun)
(define-key js2-mode-map [(backspace)] 'c-electric-backspace)
(define-key js2-mode-map [(control d)] 'c-electric-delete-forward)
(define-key js2-mode-map (kbd "M-<up>") 'move-text-up)
(define-key js2-mode-map (kbd "M-<down>") 'move-text-down)
(define-key js2-mode-map (kbd "s-\]") 'next-error)
(define-key js2-mode-map (kbd "s-\[") 'previous-error)
(js2r-add-keybindings-with-prefix "C-;")
(message "JS2 mode hook ran."))
(defun display-skewer-instance ()
"Display the currently running Skewer instance in another window"
(interactive)
(display-buffer
(first (-filter #'(lambda (x) (s-contains? "*Skewer" x))
(-map 'buffer-name (buffer-list)))) t))
(use-package skewer-mode)
(use-package js2-mode
:mode "\\.js\\'"
:config
(setq js-indent-level 4
js2-basic-offset 4
;; Indentation size for java
c-basic-offset 2
js2-cleanup-whitespace t))
(add-hook 'js2-mode-hook
#'(lambda ()
;; (my-js2-mode-hook 1)
(skewer-mode 1)
(rainbow-mode 1)
(smartparens-mode 1)
(define-key js2-mode-map (kbd "M-<up>") 'move-text-up)
(define-key js2-mode-map (kbd "M-<down>") 'move-text-down)
(define-key js2-mode-map (kbd "M-\\") 'display-skewer-instance)
(define-key js2-mode-map (kbd "C-\\") 'my-skewer-eval-line)
(define-key js2-mode-map (kbd "C-|") 'eval-at-cursor)
(define-key js2-mode-map (kbd "C-c C-r") 'my-skewer-eval-region)))