143 lines
5.1 KiB
EmacsLisp
143 lines
5.1 KiB
EmacsLisp
;;; init-js-two.el --- .Emacs Configuration -*- lexical-binding: t -*-
|
|
;;; Commentary:
|
|
;;; JavaScript configuration - IDE
|
|
|
|
;;; Code:
|
|
|
|
;; js2-mode: enhanced JavaScript editing mode
|
|
;; https://github.com/mooz/js2-mode
|
|
(use-package js2-mode
|
|
:mode (("\\.js$" . js2-mode))
|
|
:hook ((js2-mode . (lambda ()
|
|
(flycheck-mode)
|
|
(company-mode))))
|
|
:config
|
|
;; have 4 space indentation by default
|
|
(setq js-indent-level 2
|
|
js2-basic-offset 2
|
|
js-chain-indent t)
|
|
|
|
;; use eslint_d insetad of eslint for faster linting
|
|
(setq flycheck-javascript-eslint-executable "eslint_d")
|
|
|
|
;; Try to highlight most ECMA built-ins
|
|
(setq js2-highlight-level 3)
|
|
|
|
;; turn off all warnings in js2-mode
|
|
(setq js2-mode-show-parse-errors t)
|
|
(setq js2-mode-show-strict-warnings nil)
|
|
(setq js2-strict-missing-semi-warning nil))
|
|
|
|
;; hydra
|
|
(use-package hydra
|
|
:pin "MELPA"
|
|
:config (hydra-add-font-lock))
|
|
|
|
(use-package ivy-hydra
|
|
:pin "MELPA")
|
|
|
|
;; js2-refactor: refactoring options for emacs
|
|
;; https://github.com/magnars/js2-refactor.el
|
|
(use-package js2-refactor
|
|
:pin "MELPA"
|
|
:after js2-mode
|
|
:bind
|
|
(:map js2-mode-map
|
|
("C-k" . js2r-kill)
|
|
("C-c h r" . js2-refactor-hydra/body))
|
|
:hook ((js2-mode . js2-refactor-mode))
|
|
:config (js2r-add-keybindings-with-prefix "C-c C-r")
|
|
|
|
(defhydra js2-refactor-hydra (:color blue :hint nil)
|
|
"
|
|
^Functions^ ^Variables^ ^Buffer^ ^sexp^ ^Debugging^
|
|
------------------------------------------------------------------------------------------------------------------------------
|
|
[_lp_] Localize Parameter [_ev_] Extract variable [_wi_] Wrap buffer in IIFE [_k_] js2 kill [_lt_] log this
|
|
[_ef_] Extract function [_iv_] Inline variable [_ig_] Inject global in IIFE [_ss_] split string [_dt_] debug this
|
|
[_ip_] Introduce parameter [_rv_] Rename variable [_ee_] Expand node at point [_sl_] forward slurp
|
|
[_em_] Extract method [_vt_] Var to this [_cc_] Contract node at point [_ba_] forward barf
|
|
[_ao_] Arguments to object [_sv_] Split var decl. [_uw_] unwrap
|
|
[_tf_] Toggle fun exp and decl [_ag_] Add var to globals
|
|
[_ta_] Toggle fun expr and => [_ti_] Ternary to if
|
|
[_q_] quit"
|
|
("ee" js2r-expand-node-at-point)
|
|
("cc" js2r-contract-node-at-point)
|
|
("ef" js2r-extract-function)
|
|
("em" js2r-extract-method)
|
|
("tf" js2r-toggle-function-expression-and-declaration)
|
|
("ta" js2r-toggle-arrow-function-and-expression)
|
|
("ip" js2r-introduce-parameter)
|
|
("lp" js2r-localize-parameter)
|
|
("wi" js2r-wrap-buffer-in-iife)
|
|
("ig" js2r-inject-global-in-iife)
|
|
("ag" js2r-add-to-globals-annotation)
|
|
("ev" js2r-extract-var)
|
|
("iv" js2r-inline-var)
|
|
("rv" js2r-rename-var)
|
|
("vt" js2r-var-to-this)
|
|
("ao" js2r-arguments-to-object)
|
|
("ti" js2r-ternary-to-if)
|
|
("sv" js2r-split-var-declaration)
|
|
("ss" js2r-split-string)
|
|
("uw" js2r-unwrap)
|
|
("lt" js2r-log-this)
|
|
("dt" js2r-debug-this)
|
|
("sl" js2r-forward-slurp)
|
|
("ba" js2r-forward-barf)
|
|
("k" js2r-kill)
|
|
("q" nil)))
|
|
|
|
;; json-snatcher: get the path of any JSON element easily
|
|
;; https://github.com/Sterlingg/json-snatcher
|
|
(use-package json-snatcher
|
|
:hook ((json-mode . js-mode-bindings))
|
|
:config
|
|
(defun js-mode-bindings ()
|
|
"Sets a hotkey for using the json-snatcher plugin"
|
|
(when (string-match "\\.json$" (buffer-name))
|
|
(local-set-key (kbd "C-c C-g") 'jsons-print-path))))
|
|
|
|
;; json-mode: Major mode for editing JSON files with emacs
|
|
;; https://github.com/joshwnj/json-mode
|
|
(use-package json-mode
|
|
:mode "\\.js\\(?:on\\|[hl]int\\(rc\\)?\\)\\'"
|
|
:config
|
|
(add-hook 'json-mode-hook #'prettier-js-mode)
|
|
(setq json-reformat:indent-width 2)
|
|
(setq json-reformat:pretty-string? t)
|
|
(setq js-indent-level 2))
|
|
|
|
;; eslintd-fix: Emacs minor-mode to automatically fix javascript with eslint_d.
|
|
;; https://github.com/aaronjensen/eslintd-fix/tree/master
|
|
(use-package eslintd-fix)
|
|
|
|
;; rjsx-mode: A React JSX major mode for Emacs
|
|
;; https://github.com/felipeochoa/rjsx-mode
|
|
(use-package rjsx-mode
|
|
:after js2-mode
|
|
:mode (("\\.jsx$" . rjsx-mode)
|
|
("components/.+\\.js$" . rjsx-mode))
|
|
:hook (rjsx-mode . (lambda ()
|
|
(flycheck-mode)
|
|
(company-mode)
|
|
(js2-refactor-mode -1)))
|
|
:init
|
|
(defun +javascript-jsx-file-p ()
|
|
"Detect React or preact imports early in the file."
|
|
(and buffer-file-name
|
|
(string= (file-name-extension buffer-file-name) "js")
|
|
(re-search-forward "\\(^\\s-*import +React\\|\\( from \\|require(\\)[\"']p?react\\)"
|
|
magic-mode-regexp-match-limit t)
|
|
(progn (goto-char (match-beginning 1))
|
|
(not (when (and (require 'smartparens nil t)
|
|
(fboundp sp-point-in-string-or-comment))
|
|
)))))
|
|
(add-to-list 'magic-mode-alist '(+javascript-jsx-file-p . rjsx-mode))
|
|
:config (unbind-key "C-c C-l" rjsx-mode-map))
|
|
|
|
(provide 'init-js-two)
|
|
;; Local Variables:
|
|
;; byte-compile-warnings: (not free-vars)
|
|
;; End:
|
|
;;; init-js-two.el ends here
|