2016-01-06 05:21:55 +00:00
|
|
|
#+TITLE: React layer
|
2015-11-08 18:04:44 +00:00
|
|
|
#+HTML_HEAD_EXTRA: <link rel="stylesheet" type="text/css" href="../../../css/readtheorg.css" />
|
2015-10-30 11:20:58 +00:00
|
|
|
|
|
|
|
[[file:img/react.png]]
|
|
|
|
|
|
|
|
* Table of Contents :TOC_4_org:noexport:
|
|
|
|
- [[Description][Description]]
|
|
|
|
- [[Features][Features]]
|
|
|
|
- [[Install][Install]]
|
|
|
|
- [[Optional Configuration][Optional Configuration]]
|
|
|
|
- [[Key Bindings][Key Bindings]]
|
|
|
|
- [[js2-mode][js2-mode]]
|
|
|
|
- [[Folding (js2-mode)][Folding (js2-mode)]]
|
|
|
|
- [[Refactoring (js2-refactor)][Refactoring (js2-refactor)]]
|
|
|
|
- [[Formatting (web-beautify)][Formatting (web-beautify)]]
|
|
|
|
- [[Documentation (js-doc)][Documentation (js-doc)]]
|
|
|
|
- [[Auto-complete and documentation (tern)][Auto-complete and documentation (tern)]]
|
|
|
|
- [[JSON][JSON]]
|
|
|
|
|
|
|
|
* Description
|
2015-07-24 20:07:03 +00:00
|
|
|
|
|
|
|
ES6 and JSX ready configuration layer for React
|
|
|
|
It will automatically recognize =.jsx= and =.react.js= files
|
|
|
|
|
2016-02-08 14:54:28 +00:00
|
|
|
It will also recognize =/** @jsx React.DOM */= if it is the first line.
|
|
|
|
|
2015-10-30 11:20:58 +00:00
|
|
|
** Features
|
2015-07-24 20:07:03 +00:00
|
|
|
- on-the-fly syntax checking
|
|
|
|
- proper syntax highlight and indentation with jsx
|
|
|
|
- ternjs turbocharged autocompletion as in js2-mode
|
2015-07-27 22:26:47 +00:00
|
|
|
- jsfmt automatic formatting
|
|
|
|
- js2-refactor
|
|
|
|
- js-doc
|
2015-07-24 20:07:03 +00:00
|
|
|
|
2015-10-30 11:20:58 +00:00
|
|
|
* Install
|
2016-01-06 05:21:55 +00:00
|
|
|
To use this configuration layer, add it to your =~/.spacemacs=. You will need to
|
|
|
|
add =react= to the existing =dotspacemacs-configuration-layers= list in this
|
|
|
|
file.
|
2015-07-24 20:07:03 +00:00
|
|
|
|
|
|
|
You will also need to install =tern= to use the auto-completion and
|
|
|
|
documentation features:
|
|
|
|
#+BEGIN_SRC sh
|
|
|
|
$ npm install -g tern
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
To use the on-the-fly syntax checking, install =eslint= with babel and react support:
|
|
|
|
#+BEGIN_SRC sh
|
|
|
|
$ npm install -g eslint babel-eslint eslint-plugin-react
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
If your project do not use a custom =.eslintrc= file I strongly advice you to try out this one by Airbnb:
|
|
|
|
[[https://github.com/airbnb/javascript/blob/master/linters/.eslintrc][.eslintrc]]
|
|
|
|
|
2015-07-28 22:05:16 +00:00
|
|
|
In order to use automatic code formatting you need to install ~js-beautify~ with:
|
2015-07-27 22:26:47 +00:00
|
|
|
#+BEGIN_SRC sh
|
2015-07-28 22:05:16 +00:00
|
|
|
$ npm install -g js-beautify
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
Be sure to have the ~e4x~ option set to ~true~ on your ~.jsbeautifyrc~ here it is my configuration as an example:
|
|
|
|
#+BEGIN_SRC json
|
|
|
|
{
|
|
|
|
"indent_size": 2,
|
|
|
|
"indent_char": " ",
|
|
|
|
"eol": "\n",
|
|
|
|
"indent_level": 0,
|
|
|
|
"indent_with_tabs": false,
|
|
|
|
"preserve_newlines": true,
|
|
|
|
"max_preserve_newlines": 2,
|
|
|
|
"jslint_happy": false,
|
|
|
|
"space_after_anon_function": false,
|
|
|
|
"brace_style": "collapse",
|
|
|
|
"keep_array_indentation": false,
|
|
|
|
"keep_function_indentation": false,
|
|
|
|
"space_before_conditional": true,
|
|
|
|
"break_chained_methods": true,
|
|
|
|
"eval_code": false,
|
|
|
|
"unescape_strings": false,
|
|
|
|
"wrap_line_length": 80,
|
|
|
|
"wrap_attributes": "auto",
|
|
|
|
"wrap_attributes_indent_size": 2,
|
|
|
|
"e4x": true,
|
|
|
|
"end_with_newline": true
|
|
|
|
}
|
2015-07-27 22:26:47 +00:00
|
|
|
#+END_SRC
|
|
|
|
|
2015-10-30 11:20:58 +00:00
|
|
|
* Optional Configuration
|
2015-07-24 20:07:03 +00:00
|
|
|
|
|
|
|
You may refer to the =web-mode= configuration for fine tuning the indenting behaviour.
|
|
|
|
|
|
|
|
For example to have a consistent 2 spaces indenting both on =js= and =jsx= you may use these settings:
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
(setq-default
|
|
|
|
;; js2-mode
|
|
|
|
js2-basic-offset 2
|
|
|
|
;; web-mode
|
|
|
|
css-indent-offset 2
|
|
|
|
web-mode-markup-indent-offset 2
|
|
|
|
web-mode-css-indent-offset 2
|
|
|
|
web-mode-code-indent-offset 2
|
|
|
|
web-mode-attr-indent-offset 2)
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
And if you want to have 2 space indent also for element's attributes, concatenations and contiguous function calls:
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
(with-eval-after-load 'web-mode
|
|
|
|
(add-to-list 'web-mode-indentation-params '("lineup-args" . nil))
|
|
|
|
(add-to-list 'web-mode-indentation-params '("lineup-concats" . nil))
|
|
|
|
(add-to-list 'web-mode-indentation-params '("lineup-calls" . nil)))
|
|
|
|
#+end_src
|
|
|
|
|
2015-07-28 22:05:16 +00:00
|
|
|
|
2015-07-27 22:26:47 +00:00
|
|
|
* Key Bindings
|
|
|
|
|
|
|
|
** js2-mode
|
|
|
|
|
|
|
|
| Key Binding | Description |
|
|
|
|
|-------------+-------------------------------------|
|
|
|
|
| ~SPC m w~ | toggle js2-mode warnings and errors |
|
|
|
|
|
2015-07-28 22:05:16 +00:00
|
|
|
** Folding (js2-mode)
|
|
|
|
|
|
|
|
| Key Binding | Description |
|
|
|
|
|-------------+--------------------------|
|
|
|
|
| ~SPC m z c~ | hide element |
|
|
|
|
| ~SPC m z o~ | show element |
|
|
|
|
| ~SPC m z r~ | show all element |
|
|
|
|
| ~SPC m z e~ | toggle hide/show element |
|
|
|
|
| ~SPC m z F~ | toggle hide functions |
|
|
|
|
| ~SPC m z C~ | toggle hide comments |
|
|
|
|
|
2015-07-27 22:26:47 +00:00
|
|
|
** Refactoring (js2-refactor)
|
|
|
|
|
|
|
|
Bindings should match the plain emacs assignments.
|
|
|
|
|
|
|
|
| Key Binding | Description |
|
|
|
|
|---------------+----------------------------------------------------------------------------------------------------------------|
|
|
|
|
| ~SPC x m j~ | move line down, while keeping commas correctly placed |
|
|
|
|
| ~SPC x m k~ | move line up, while keeping commas correctly placed |
|
|
|
|
| ~SPC m k~ | deletes to the end of the line, but does not cross semantic boundaries |
|
|
|
|
| ~SPC m r 3 i~ | converts ternary operator to if-statement |
|
|
|
|
| ~SPC m r a g~ | creates a =/* global */= annotation if it is missing, and adds var to point to it |
|
|
|
|
| ~SPC m r a o~ | replaces arguments to a function call with an object literal of named arguments |
|
|
|
|
| ~SPC m r b a~ | moves the last child out of current function, if-statement, for-loop or while-loop |
|
2015-07-28 22:05:16 +00:00
|
|
|
| ~SPC m r c a~ | converts a multiline array to one line |
|
|
|
|
| ~SPC m r c o~ | converts a multiline object literal to one line |
|
|
|
|
| ~SPC m r c u~ | converts a multiline function to one line (expecting semicolons as statement delimiters) |
|
2015-07-27 22:26:47 +00:00
|
|
|
| ~SPC m r e a~ | converts a one line array to multiline |
|
|
|
|
| ~SPC m r e f~ | extracts the marked expressions into a new named function |
|
|
|
|
| ~SPC m r e m~ | extracts the marked expressions out into a new method in an object literal |
|
|
|
|
| ~SPC m r e o~ | converts a one line object literal to multiline |
|
|
|
|
| ~SPC m r e u~ | converts a one line function to multiline (expecting semicolons as statement delimiters) |
|
|
|
|
| ~SPC m r e v~ | takes a marked expression and replaces it with a var |
|
|
|
|
| ~SPC m r i g~ | creates a shortcut for a marked global by injecting it in the wrapping immediately invoked function expression |
|
|
|
|
| ~SPC m r i p~ | changes the marked expression to a parameter in a local function |
|
|
|
|
| ~SPC m r i v~ | replaces all instances of a variable with its initial value |
|
|
|
|
| ~SPC m r l p~ | changes a parameter to a local var in a local function |
|
|
|
|
| ~SPC m r l t~ | adds a console.log statement for what is at point (or region) |
|
2015-07-28 22:05:16 +00:00
|
|
|
| ~SPC m r r v~ | renames the variable on point and all occurrences in its lexical scope |
|
2015-07-27 22:26:47 +00:00
|
|
|
| ~SPC m r s l~ | moves the next statement into current function, if-statement, for-loop, while-loop |
|
|
|
|
| ~SPC m r s s~ | splits a =String= |
|
|
|
|
| ~SPC m r s v~ | splits a =var= with multiple vars declared into several =var= statements |
|
|
|
|
| ~SPC m r t f~ | toggle between function declaration and function expression |
|
|
|
|
| ~SPC m r u w~ | replaces the parent statement with the selected region |
|
2015-07-28 22:05:16 +00:00
|
|
|
| ~SPC m r v t~ | changes local =var a= to be =this.a= instead |
|
|
|
|
| ~SPC m r w i~ | wraps the entire buffer in an immediately invoked function expression |
|
|
|
|
| ~SPC m r w l~ | wraps the region in a for-loop |
|
2015-07-27 22:26:47 +00:00
|
|
|
|
2015-07-28 22:05:16 +00:00
|
|
|
** Formatting (web-beautify)
|
|
|
|
|
|
|
|
| Key Binding | Description |
|
|
|
|
|-------------+--------------------------------------------------------------|
|
|
|
|
| ~SPC m =~ | beautify code in js2-mode, json-mode, web-mode, and css-mode |
|
|
|
|
|
|
|
|
*** Documentation (js-doc)
|
2015-07-27 22:26:47 +00:00
|
|
|
|
|
|
|
You can check more [[https://github.com/mooz/js-doc/][here]]
|
|
|
|
|
|
|
|
| Key Binding | Description |
|
|
|
|
|---------------+---------------------------------------|
|
2015-07-28 22:05:16 +00:00
|
|
|
| ~SPC m r d b~ | insert JSDoc comment for current file |
|
|
|
|
| ~SPC m r d f~ | insert JSDoc comment for function |
|
|
|
|
| ~SPC m r d t~ | insert tag to comment |
|
|
|
|
| ~SPC m r d h~ | show list of available jsdoc tags |
|
2015-07-27 22:26:47 +00:00
|
|
|
|
|
|
|
** Auto-complete and documentation (tern)
|
|
|
|
|
|
|
|
| Key Binding | Description |
|
|
|
|
|---------------+------------------------------------------------------------------------------------------|
|
|
|
|
| ~SPC m C-g~ | brings you back to last place you were when you pressed M-.. |
|
|
|
|
| ~SPC m g g~ | jump to the definition of the thing under the cursor |
|
|
|
|
| ~SPC m g G~ | jump to definition for the given name |
|
|
|
|
| ~SPC m h d~ | find docs of the thing under the cursor. Press again to open the associated URL (if any) |
|
|
|
|
| ~SPC m h t~ | find the type of the thing under the cursor |
|
2015-07-28 22:05:16 +00:00
|
|
|
| ~SPC m r r V~ | rename variable under the cursor using tern |
|
2015-07-24 20:07:03 +00:00
|
|
|
|
2015-07-28 22:05:16 +00:00
|
|
|
** JSON
|
2015-07-24 20:07:03 +00:00
|
|
|
|
2015-07-28 22:05:16 +00:00
|
|
|
| Key Binding | Description |
|
|
|
|
|-------------+------------------------------------|
|
|
|
|
| ~SPC m h p~ | Get the path of the value at point |
|