Skip to content

Commit b7443b2

Browse files
committed
Updated how-to-layer with init-package info.
1 parent f4cca2a commit b7443b2

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

HOW-TO-LAYER.md

+82
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,88 @@ your layer can depend on any number of packages. To specify what the layer needs
8787

8888
Our method declares that it needs no arguments (`[]`) and returns a vector (`[]`).
8989

90+
##### package init hook
91+
92+
You can define __init__ function associated with specific __package__ which will
93+
be executed when package become enabled. You should use `defmethod init-package`
94+
dispatched by __vector__ `[:layer-name :package-name]`. Let see example from
95+
`:lang/javascript` layer.
96+
97+
```clj
98+
(defmethod init-package [:lang/javascript :linter] []
99+
(keymap/set-proton-keys-for-mode :javascript-major-mode
100+
{:L {:category "linters"
101+
:e {:fx (fn [] (toggle-linter :eslint)) :title "use eslint"}
102+
:j {:fx (fn [] (toggle-linter :jshint)) :title "use jshint"}}}))
103+
104+
(defmethod init-package [:lang/javascript :linter-jshint] []
105+
(mode/define-package-mode :linter-jshint
106+
{:mode-keybindings
107+
{:L {:f {:action "FixMyJS" :title "fix jshint errors"}}}})
108+
(mode/link-modes :javascript-major-mode (mode/package-mode-name :linter-jshint)))
109+
110+
(defmethod init-package [:lang/javascript :linter-eslint] []
111+
(mode/define-package-mode :linter-eslint
112+
{:mode-keybindings
113+
{:L {:f {:action "linter-eslint:fix-file" :target actions/get-active-editor :title "fix eslint errors"}}}})
114+
(mode/link-modes :javascript-major-mode (mode/package-mode-name :linter-eslint)))
115+
```
116+
117+
Here we define 3 init methods for __linter__, __linter-eslint__ and __linter-jshint__ packages.
118+
When __linter__ package enabled we define mode key binding <kbd>SPC m L e</kbd> and
119+
<kbd>SPC m L j</kbd> to switch between __jshint__ and __eslint__ linters.
120+
121+
```clj
122+
...
123+
124+
(defmethod init-package [:lang/javascript :linter] []
125+
(keymap/set-proton-keys-for-mode :javascript-major-mode
126+
{:L {:category "linters"
127+
:e {:fx (fn [] (toggle-linter :eslint)) :title "use eslint"}
128+
:j {:fx (fn [] (toggle-linter :jshint)) :title "use jshint"}}}))
129+
...
130+
```
131+
132+
By convention we define separate __package modes__ for __linter-jshint__ and __linter-eslint__
133+
packages since we want to use specific key bindings depends on active package.
134+
135+
```clj
136+
....
137+
138+
(mode/define-package-mode :linter-jshint
139+
{:mode-keybindings
140+
{:L {:f {:action "FixMyJS" :title "fix jshint errors"}}}})
141+
142+
....
143+
144+
(mode/define-package-mode :linter-eslint
145+
{:mode-keybindings
146+
{:L {:f {:action "linter-eslint:fix-file" :target actions/get-active-editor :title "fix eslint errors"}}}})
147+
```
148+
149+
For __linter-jshint__ we define __package mode__ `:linter-jshint` using `proton.lib.mode/define-package-mode`
150+
method and appropriate `mode-keybinding` <kbd>SPC m L f</kbd> bind to __action__ `FixMyJS`.
151+
Also we say that we want to use __linter-jshint__ mode along with __javascript-major-mode__
152+
to use our key bindings when __javascript-major-mode__ is activated. We used
153+
`proton.lib.mode/link-modes` method:
154+
155+
```clj
156+
(mode/link-modes :javascript-major-mode (mode/package-mode-name :linter-jshint)))
157+
; `proton.lib.mode/package-mode-name` used by convention since we auto generate
158+
; mode name for packages.
159+
```
160+
161+
Proton handles package state and execute `init-package` hook on package activation and
162+
also when package disalbed will take care to remove associated __mode__ and __mode keybindings__.
163+
164+
For our example, when we press <kbd>SPC m L j</kbd> __linter-jshint__ will be activated
165+
and __linter-eslint__ will be disabled. `init-package [:lang/javascript :linter-jshint]`
166+
will be executed and __linter-jshint__ mode activated. In the same time __linter-eslint__
167+
mode and associated key bindings will be removed.
168+
169+
__NOTE:__ `(defmethod init-package [:layer-name :package-name])` is recommended
170+
to define settings and key bindings associated with __package__ inside your layer.
171+
90172
#### keybindings
91173

92174
for proton to "see" your keybindings, you'll have to implement the multimethod `get-keybindings`. In the case of the git layer, this could look like this:

0 commit comments

Comments
 (0)