Emacs personal configuration
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

103 lines
3.6KB

  1. (require-package 'json-mode)
  2. (when (>= emacs-major-version 24)
  3. (require-package 'js2-mode)
  4. (require-package 'ac-js2)
  5. (require-package 'coffee-mode))
  6. (require-package 'js-comint)
  7. (defcustom preferred-javascript-mode
  8. (first (remove-if-not #'fboundp '(js2-mode js-mode)))
  9. "Javascript mode to use for .js files."
  10. :type 'symbol
  11. :group 'programming
  12. :options '(js2-mode js-mode))
  13. (defvar preferred-javascript-indent-level 2)
  14. ;; Need to first remove from list if present, since elpa adds entries too, which
  15. ;; may be in an arbitrary order
  16. (eval-when-compile (require 'cl))
  17. (setq auto-mode-alist (cons `("\\.js\\(\\.erb\\)?\\'" . ,preferred-javascript-mode)
  18. (loop for entry in auto-mode-alist
  19. unless (eq preferred-javascript-mode (cdr entry))
  20. collect entry)))
  21. ;; js2-mode
  22. (after-load 'js2-mode
  23. ;; Disable js2 mode's syntax error highlighting by default...
  24. (setq-default js2-mode-show-parse-errors nil
  25. js2-mode-show-strict-warnings nil)
  26. ;; ... but enable it if flycheck can't handle javascript
  27. (autoload 'flycheck-get-checker-for-buffer "flycheck")
  28. (defun sanityinc/disable-js2-checks-if-flycheck-active ()
  29. (unless (flycheck-get-checker-for-buffer)
  30. (set (make-local-variable 'js2-mode-show-parse-errors) t)
  31. (set (make-local-variable 'js2-mode-show-strict-warnings) t)))
  32. (add-hook 'js2-mode-hook 'sanityinc/disable-js2-checks-if-flycheck-active)
  33. (add-hook 'js2-mode-hook '(lambda () (setq mode-name "JS2")))
  34. (setq-default
  35. js2-basic-offset preferred-javascript-indent-level
  36. js2-bounce-indent-p nil)
  37. (after-load 'js2-mode
  38. (js2-imenu-extras-setup)))
  39. ;; js-mode
  40. (setq-default js-indent-level preferred-javascript-indent-level)
  41. (add-to-list 'interpreter-mode-alist (cons "node" preferred-javascript-mode))
  42. ;; Javascript nests {} and () a lot, so I find this helpful
  43. (require-package 'rainbow-delimiters)
  44. (dolist (hook '(js2-mode-hook js-mode-hook json-mode-hook))
  45. (add-hook hook 'rainbow-delimiters-mode))
  46. ;;; Coffeescript
  47. (after-load 'coffee-mode
  48. (setq coffee-js-mode preferred-javascript-mode
  49. coffee-tab-width preferred-javascript-indent-level))
  50. (when (fboundp 'coffee-mode)
  51. (add-to-list 'auto-mode-alist '("\\.coffee\\.erb\\'" . coffee-mode)))
  52. ;; ---------------------------------------------------------------------------
  53. ;; Run and interact with an inferior JS via js-comint.el
  54. ;; ---------------------------------------------------------------------------
  55. (setq inferior-js-program-command "js")
  56. (defvar inferior-js-minor-mode-map (make-sparse-keymap))
  57. (define-key inferior-js-minor-mode-map "\C-x\C-e" 'js-send-last-sexp)
  58. (define-key inferior-js-minor-mode-map "\C-\M-x" 'js-send-last-sexp-and-go)
  59. (define-key inferior-js-minor-mode-map "\C-cb" 'js-send-buffer)
  60. (define-key inferior-js-minor-mode-map "\C-c\C-b" 'js-send-buffer-and-go)
  61. (define-key inferior-js-minor-mode-map "\C-cl" 'js-load-file-and-go)
  62. (define-minor-mode inferior-js-keys-mode
  63. "Bindings for communicating with an inferior js interpreter."
  64. nil " InfJS" inferior-js-minor-mode-map)
  65. (dolist (hook '(js2-mode-hook js-mode-hook))
  66. (add-hook hook 'inferior-js-keys-mode))
  67. ;; ---------------------------------------------------------------------------
  68. ;; Alternatively, use skewer-mode
  69. ;; ---------------------------------------------------------------------------
  70. (when (and (>= emacs-major-version 24) (featurep 'js2-mode))
  71. (require-package 'skewer-mode)
  72. (after-load 'skewer-mode
  73. (add-hook 'skewer-mode-hook
  74. (lambda () (inferior-js-keys-mode -1)))))
  75. (provide 'init-javascript)