Created
September 17, 2010 17:23
-
-
Save reedobrien/584585 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(autoload 'js2-mode "js2" nil t) | |
(autoload 'espresso-mode "espresso" "Start espresso-mode" t) | |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
;;;; THe following 3 JS functions borrowed from Mihai Bazon | |
;;http://mihai.bazon.net/projects/editing-javascript-with-emacs-js2-mode | |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
;;;; use espresso mode for indentation | |
(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 (espresso--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 (/ espresso-indent-level 2)))) | |
;; 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))))) | |
;;; Indent innermost block | |
(defun my-indent-sexp () | |
(interactive) | |
(save-restriction | |
(save-excursion | |
(widen) | |
(let* ((inhibit-point-motion-hooks t) | |
(parse-status (syntax-ppss (point))) | |
(beg (nth 1 parse-status)) | |
(end-marker (make-marker)) | |
(end (progn (goto-char beg) (forward-list) (point))) | |
(ovl (make-overlay beg end))) | |
(set-marker end-marker end) | |
(overlay-put ovl 'face 'highlight) | |
(goto-char beg) | |
(while (< (point) (marker-position end-marker)) | |
;; don't reindent blank lines so we don't set the "buffer | |
;; modified" property for nothing | |
(beginning-of-line) | |
(unless (looking-at "\\s-*$") | |
(indent-according-to-mode)) | |
(forward-line)) | |
(run-with-timer 0.5 nil '(lambda(ovl) | |
(delete-overlay ovl)) ovl))))) | |
;;;;;;; Hook above 2 functions into js2-mode | |
(defun my-js2-mode-hook () | |
(require 'espresso) | |
(setq espresso-indent-level 4 | |
indent-tabs-mode nil | |
c-basic-offset 4) | |
(c-toggle-auto-state 0) | |
(c-toggle-hungry-state 1) | |
(set (make-local-variable 'indent-line-function) 'my-js2-indent-function) | |
(define-key js2-mode-map [(meta control |)] 'cperl-lineup) | |
(define-key js2-mode-map [(meta control \;)] | |
'(lambda() | |
(interactive) | |
(insert "/* -----[ ") | |
(save-excursion | |
(insert " ]----- */")) | |
)) | |
(define-key js2-mode-map [(return)] 'newline-and-indent) | |
(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 [(control meta q)] 'my-indent-sexp) | |
(if (featurep 'js2-highlight-vars) | |
(js2-highlight-vars-mode)) | |
(message "My JS2 hook")) | |
(add-hook 'js2-mode-hook 'my-js2-mode-hook) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment