Skip to content

Latest commit

 

History

History
89 lines (78 loc) · 3.25 KB

emacs24.js2.org

File metadata and controls

89 lines (78 loc) · 3.25 KB

Helper functions

(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))

JS2 mode

(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)))