dots


commit
58b297d
parent
3f034d3
author
chasinglightning
date
2024-12-31 18:58:49 -0500 EST
add micro text editor config
52 files changed,  +10142, -0
A home/.config/micro/colorschemes/catppuccin-frappe.micro
+42, -0
 1@@ -0,0 +1,42 @@
 2+color-link default "#c6d0f5,#303446"
 3+color-link comment "#949cbb"
 4+
 5+color-link identifier "#8caaee"
 6+color-link identifier.class "#8caaee"
 7+color-link identifier.var "#8caaee"
 8+
 9+color-link constant "#ef9f76"
10+color-link constant.number "#ef9f76"
11+color-link constant.string "#a6d189"
12+
13+color-link symbol "#f4b8e4"
14+color-link symbol.brackets "#eebebe"
15+color-link symbol.tag "#8caaee"
16+
17+color-link type "#8caaee"
18+color-link type.keyword "#e5c890"
19+
20+color-link special "#f4b8e4"
21+color-link statement "#ca9ee6"
22+color-link preproc "#f4b8e4"
23+
24+color-link underlined "#99d1db"
25+color-link error "bold #e78284"
26+color-link todo "bold #e5c890"
27+
28+color-link diff-added "#a6d189"
29+color-link diff-modified "#e5c890"
30+color-link diff-deleted "#e78284"
31+
32+color-link gutter-error "#e78284"
33+color-link gutter-warning "#e5c890"
34+
35+color-link statusline "#c6d0f5,#292c3c"
36+color-link tabbar "#c6d0f5,#292c3c"
37+color-link indent-char "#51576d"
38+color-link line-number "#51576d"
39+color-link current-line-number "#babbf1"
40+
41+color-link cursor-line "#414559,#c6d0f5"
42+color-link color-column "#414559"
43+color-link type.extended "default"
A home/.config/micro/plug/cheat/LICENSE
+21, -0
 1@@ -0,0 +1,21 @@
 2+MIT License
 3+
 4+Copyright (c) 2022 Tero Karvinen https://TeroKarvinen.com
 5+
 6+Permission is hereby granted, free of charge, to any person obtaining a copy
 7+of this software and associated documentation files (the "Software"), to deal
 8+in the Software without restriction, including without limitation the rights
 9+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+copies of the Software, and to permit persons to whom the Software is
11+furnished to do so, subject to the following conditions:
12+
13+The above copyright notice and this permission notice shall be included in all
14+copies or substantial portions of the Software.
15+
16+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+SOFTWARE.
A home/.config/micro/plug/cheat/README.md
+62, -0
 1@@ -0,0 +1,62 @@
 2+# micro-cheat - F1 cheatsheet for the language you're editing
 3+
 4+**F1** Show cheatsheet for the language you're editing: Lua, Go, Python...
 5+
 6+A plugin for Micro editor. 
 7+
 8+## Usage
 9+
10+Edit a source code file with micro. Press **F1**. 
11+
12+A cheatsheet for the language opens. If you're editing Python, it's a Python cheatsheet. If Go, then Go cheatsheet.
13+Press Ctrl-Q to close the cheatsheet tab and return to editing. 
14+
15+For your convenience, micro-cheat also provides a command 'cheat' that you can bind to any key or run with ctrl-E. 
16+
17+Tested with 
18+
19+- Python
20+- Go (Golang)
21+- Lua
22+- Javascript
23+- CSS (cascading style sheets)
24+- HTML
25+- HAML (HTML abstraction markup language)
26+- Vagrantfile (by filename)
27+- Dockerfile (by filename)
28+- Makefile
29+- JavaScript (ECMAScript)
30+- TypeScript
31+- YAML (yet another markup language)
32+- org-mode (*.org)
33+- bash (shell)
34+
35+## Installation
36+
37+In the future, you will be able to install micro-cheat by
38+
39+	$ micro --plugin install micro-cheat
40+
41+Currently, there is just development install
42+
43+	$ cd $HOME/.config/micro/plug/
44+	$ git clone https://github.com/terokarvinen/micro-cheat
45+
46+## Tutorial
47+
48+[Installation & tutorial for 4 plugins: Palettero, Cheat, Run and Jump](https://terokarvinen.com/2022/command-palette-cheatsheet-run-and-make-micro/)
49+
50+## Limitations
51+
52+All cheatsheets included in cheatsheets/ directory are not supported yet. Micro-cheat has only been tested on Linux. 
53+
54+## Todo
55+
56+Bibtex references cheatsheet. Should be MIT licensed to be included in this plugin. 
57+
58+## Adminstrivia
59+
60+Cheatsheets are from https://devhints.io project, copyright (c) 2021 Rico Sta. Cruz and contributors, received under MIT license.
61+
62+Micro-cheat plugin is Copyright 2022 Tero Karvinen https://TeroKarvinen.com, MIT license. 
63+
A home/.config/micro/plug/cheat/cheatsheets/ansible.md
+102, -0
  1@@ -0,0 +1,102 @@
  2+---
  3+title: Ansible
  4+category: Ansible
  5+---
  6+
  7+{% raw %}
  8+
  9+## Getting started
 10+
 11+### Hosts
 12+
 13+    $ sudo mkdir /etc/ansible
 14+    $ sudo vim /etc/ansible/hosts
 15+
 16+    [example]
 17+    192.0.2.101
 18+    192.0.2.102
 19+
 20+### Running a playbook
 21+
 22+    $ ansible-playbook playbook.yml
 23+
 24+## Tasks
 25+
 26+    - hosts: all
 27+      user: root
 28+      sudo: no
 29+      vars:
 30+        aaa: bbb
 31+      tasks:
 32+        - ...
 33+      handlers:
 34+        - ...
 35+
 36+### Includes
 37+
 38+    tasks:
 39+      - include: db.yml
 40+    handlers:
 41+      - include: db.yml user=timmy
 42+
 43+## Handlers
 44+
 45+    handlers:
 46+      - name: start apache2
 47+        action: service name=apache2 state=started
 48+
 49+    tasks:
 50+      - name: install apache
 51+        action: apt pkg=apache2 state=latest
 52+        notify:
 53+          - start apache2
 54+
 55+## Vars
 56+
 57+    - host: lol
 58+      vars_files:
 59+        - vars.yml
 60+      vars:
 61+        project_root: /etc/xyz
 62+      tasks:
 63+        - name: Create the SSH directory.
 64+          file: state=directory path=${project_root}/home/.ssh/
 65+          only_if: "$vm == 0"
 66+
 67+## Roles
 68+
 69+    - host: xxx
 70+      roles:
 71+        - db
 72+        - { role:ruby, sudo_user:$user }
 73+        - web
 74+
 75+    # Uses:
 76+    # roles/db/tasks/*.yml
 77+    # roles/db/handlers/*.yml
 78+
 79+### Task: Failures
 80+
 81+    - name: my task
 82+      command: ...
 83+      register: result
 84+      failed_when: "'FAILED' in result.stderr"
 85+
 86+      ignore_errors: yes
 87+
 88+      changed_when: "result.rc != 2"
 89+
 90+### Env vars
 91+
 92+    vars:
 93+      local_home: "{{ lookup('env','HOME') }}"
 94+
 95+## References
 96+
 97+  * [Intro](http://www.ansibleworks.com/docs/intro_configuration.html)
 98+  * [Modules](http://www.ansibleworks.com/docs/modules.html)
 99+
100+{% endraw %}
101+
102+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
103+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/chef.md
+112, -0
  1@@ -0,0 +1,112 @@
  2+---
  3+title: Chef
  4+category: Devops
  5+layout: 2017/sheet
  6+---
  7+
  8+### Install
  9+
 10+In your server:
 11+{: .-setup}
 12+
 13+```bash
 14+$ sudo apt-get install curl
 15+```
 16+
 17+```bash
 18+$ curl -L https://omnitruck.chef.io/install.sh | sudo bash
 19+Thank you for installing Chef!
 20+```
 21+
 22+```bash
 23+$ chef-solo -v
 24+...
 25+Chef: 14.5.33
 26+```
 27+
 28+### Start the cookbook
 29+
 30+```bash
 31+ wget http://github.com/chef-cookbooks/chef-repo/tarball/master -O - | tar xzf - --strip-components=1
 32+```
 33+
 34+### Knife
 35+
 36+```bash
 37+$ knife supermarket download mysql
 38+```
 39+
 40+### Invoking chef-solo
 41+
 42+```bash
 43+$ chef-solo -c solo.rb -j web.json
 44+```
 45+
 46+## Examples
 47+
 48+### Simple compile-from-source
 49+
 50+```ruby
 51+execute "tar --no-same-owner -zxf hi.tar.gz" do
 52+  cwd "/usr/local/src"
 53+  creates "/usr/local/src/node-v#{version}"
 54+end
 55+```
 56+
 57+```ruby
 58+bash "compile" do
 59+  cwd "/usr/local/src/node-v#{version}"
 60+  code %[
 61+    PATH=/usr/local/bin:$PATH
 62+    ./configure
 63+    make
 64+  ]
 65+  creates "/usr/local/src/node-v#{version}/node"
 66+end
 67+```
 68+
 69+### remote file
 70+
 71+```ruby
 72+remote_file "/usr/local/src/hi.tar.gz" do
 73+  source "http://..."
 74+  checksum "ab83be..."
 75+  mode 0644
 76+  action :create_if_missing
 77+end
 78+```
 79+
 80+### ruby_block
 81+
 82+```ruby
 83+ruby_block "name" do
 84+  block { File.read ... }
 85+  not_if { File.exists?(...) }
 86+end
 87+```
 88+
 89+### Execute
 90+
 91+```ruby
 92+execute "name" do
 93+  cwd "..."
 94+  environment({ "PATH" => "..." })
 95+  command "make install"
 96+  creates "..."
 97+end
 98+```
 99+
100+### Conditions
101+
102+```ruby
103+  creates "/usr/local/src/node-v#{version}/node"
104+  not_if { File.exists?('...') }
105+```
106+
107+## Also see
108+
109+* [Learn Chef Rally](https://learn.chef.io) _(learn.chef.io)_
110+* [install_from_source.rb recipe](https://github.com/mdxp/nodejs-cookbook/blob/master/recipes/install_from_source.rb) _(github.com)_
111+
112+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
113+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/cron.md
+73, -0
 1@@ -0,0 +1,73 @@
 2+---
 3+title: Cron
 4+category: CLI
 5+layout: 2017/sheet
 6+updated: 2018-05-03
 7+weight: -3
 8+---
 9+
10+## Format
11+{: .-two-column}
12+
13+### Format
14+
15+```
16+Min  Hour Day  Mon  Weekday
17+```
18+{: .-setup}
19+
20+```
21+*    *    *    *    *  command to be executed
22+```
23+
24+```
25+┬    ┬    ┬    ┬    ┬
26+│    │    │    │    └─  Weekday  (0=Sun .. 6=Sat)
27+│    │    │    └──────  Month    (1..12)
28+│    │    └───────────  Day      (1..31)
29+│    └────────────────  Hour     (0..23)
30+└─────────────────────  Minute   (0..59)
31+```
32+{: .-setup.-box-chars}
33+
34+### Operators
35+
36+| Operator | Description                |
37+| ---      | ---                        |
38+| `*`      | all values                 |
39+| `,`      | separate individual values |
40+| `-`      | a range of values          |
41+| `/`      | divide a value into steps  |
42+
43+### Examples
44+
45+| Example        | Description                 |
46+| ---            | ---                         |
47+| `0 * * * *`    | every hour                  |
48+| `*/15 * * * *` | every 15 mins               |
49+| `0 */2 * * *`  | every 2 hours               |
50+| `0 18 * * 0-6` | every week Mon-Sat at 6pm   |
51+| `10 2 * * 6,7` | every Sat and Sun on 2:10am |
52+| `0 0 * * 0`    | every Sunday midnight       |
53+| ---            | ---                         |
54+| `@reboot`      | every reboot                |
55+
56+### Crontab
57+
58+```bash
59+# Adding tasks easily
60+echo "@reboot echo hi" | crontab
61+```
62+
63+```bash
64+# Open in editor
65+crontab -e
66+```
67+
68+```bash
69+# List tasks
70+crontab -l [-u user]
71+```
72+
73+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
74+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/css.md
+218, -0
  1@@ -0,0 +1,218 @@
  2+---
  3+title: CSS
  4+category: CSS
  5+layout: 2017/sheet
  6+weight: -1
  7+keywords:
  8+  - "margin, padding, border"
  9+  - "div, .class, #id, [attr]"
 10+  - "font, background"
 11+  - "display: block, inline, flex"
 12+  - Selectors
 13+  - Properties
 14+---
 15+
 16+## Basics
 17+{: .-three-column}
 18+
 19+### Selectors
 20+
 21+```css
 22+.class {
 23+  font-weight: bold;
 24+}
 25+```
 26+{: .-setup}
 27+
 28+| Selector          | Description  |
 29+| ----------------- | ------------ |
 30+| `*`               | All elements |
 31+| `div`             | Element      |
 32+| `.class`          | Class        |
 33+| `#id`             | ID           |
 34+| `[disabled]`      | Attribute    |
 35+| `[role="dialog"]` | Attribute    |
 36+
 37+### Combinators
 38+
 39+| Selector            | Description       |
 40+| ------------------- | ----------------- |
 41+| `.parent .child`    | Descendant        |
 42+| `.parent > .child`  | Direct descendant |
 43+| `.child + .sibling` | Adjacent sibling  |
 44+| `.child ~ .sibling` | Far sibling       |
 45+| `.class1.class2`    | Have both classes |
 46+
 47+### Attribute selectors
 48+
 49+| Selector           | Description                         |
 50+| ------------------ | ----------------------------------- |
 51+| `[role="dialog"]`  | `=` Exact                           |
 52+| `[class~="box"]`   | `~=` Has word                       |
 53+| `[class|="box"]`   | `|=` Exact or prefix (eg, `value-`) |
 54+| `[href$=".doc"]`   | `$=` Ends in                        |
 55+| `[href^="/index"]` | `^=` Begins with                    |
 56+| `[class*="-is-"]`  | `*=` Contains                       |
 57+
 58+### Pseudo-classes
 59+
 60+| Selector             | Description                                |
 61+| -------------------- | ------------------------------------------ |
 62+| `:target`            | eg, `h2#foo:target`                        |
 63+| ---                  | ---                                        |
 64+| `:disabled`          |                                            |
 65+| `:focus`             |                                            |
 66+| `:active`            |                                            |
 67+| ---                  | ---                                        |
 68+| `:nth-child(3)`      | 3rd child                                  |
 69+| `:nth-child(3n+2)`   | 2nd child in groups of 3                   |
 70+| `:nth-child(-n+4)`   |                                            |
 71+| ---                  | ---                                        |
 72+| `:nth-last-child(2)` |                                            |
 73+| `:nth-of-type(2)`    |                                            |
 74+| ---                  | ---                                        |
 75+| `:checked`           | Checked inputs                             |
 76+| `:disabled`          | Disabled elements                          |
 77+| `:default`           | Default element in a group                 |
 78+| ---                  | ---                                        |
 79+| `:empty`             | Elements without children                  |
 80+
 81+### Pseudo-class variations
 82+
 83+| Selector          |
 84+| ----------------- |
 85+| `:first-of-type`  |
 86+| `:last-of-type`   |
 87+| `:nth-of-type(2)` |
 88+| `:only-of-type`   |
 89+| ---               |
 90+| `:first-child`    |
 91+| `:last-child`     |
 92+| `:nth-child(2)`   |
 93+| `:only-child`     |
 94+{: .-left-align}
 95+
 96+## Fonts
 97+{: .-left-reference}
 98+
 99+### Properties
100+
101+| Property           | Description                          |
102+| ------------------ | ------------------------------------ |
103+| `font-family:`     | `<font>, <fontN>`                    |
104+| `font-size:`       | `<size>`                             |
105+| `letter-spacing:`  | `<size>`                             |
106+| `line-height:`     | `<number>`                           |
107+| ---                | ---                                  |
108+| `font-weight:`     | `bold` `normal`                      |
109+| `font-style:`      | `italic` `normal`                    |
110+| `text-decoration:` | `underline` `none`                   |
111+| ---                | ---                                  |
112+| `text-align:`      | `left` `right` `center` `justify`    |
113+| `text-transform:`  | `capitalize` `uppercase` `lowercase` |
114+{: .-key-values}
115+
116+### Shorthand
117+{: .-prime}
118+
119+|         | style    | weight | size (required) |     | line-height | family            |
120+| ------- | -------- | ------ | --------------- | --- | ----------- | ----------------- |
121+| `font:` | `italic` | `400`  | `14px`          | `/` | `1.5`       | `sans-serif`      |
122+|         | style    | weight | size (required) |     | line-height | family (required) |
123+{: .-css-breakdown}
124+
125+### Example
126+
127+```css
128+font-family: Arial;
129+font-size: 12pt;
130+line-height: 1.5;
131+letter-spacing: 0.02em;
132+color: #aa3322;
133+```
134+
135+### Case
136+
137+```css
138+text-transform: capitalize; /* Hello */
139+text-transform: uppercase; /* HELLO */
140+text-transform: lowercase; /* hello */
141+```
142+
143+## Background
144+{: .-left-reference}
145+
146+### Properties
147+
148+| Property                 | Description                              |
149+| ------------------------ | ---------------------------------------- |
150+| `background:`            | _(Shorthand)_                            |
151+| ---                      | ---                                      |
152+| `background-color:`      | `<color>`                                |
153+| `background-image:`      | `url(...)`                               |
154+| `background-position:`   | `left/center/right` `top/center/bottom`  |
155+| `background-size:`       | `cover` `X Y`                            |
156+| `background-clip:`       | `border-box` `padding-box` `content-box` |
157+| `background-repeat:`     | `no-repeat` `repeat-x` `repeat-y`        |
158+| `background-attachment:` | `scroll` `fixed` `local`                 |
159+{: .-key-values}
160+
161+### Shorthand
162+
163+|               | color  | image         | positionX | positionY |     | size           | repeat      | attachment |
164+| ------------- | ------ | ------------- | --------- | --------- | --- | -------------- | ----------- | ---------- |
165+| `background:` | `#ff0` | `url(bg.jpg)` | `left`    | `top`     | `/` | `100px` `auto` | `no-repeat` | `fixed;`   |
166+| `background:` | `#abc` | `url(bg.png)` | `center`  | `center`  | `/` | `cover`        | `repeat-x`  | `local;`   |
167+|               | color  | image         | positionX | positionY |     | size           | repeat      | attachment |
168+{: .-css-breakdown}
169+
170+### Multiple backgrounds
171+
172+```css
173+background: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)),
174+  url('background.jpg') center center / cover, #333;
175+```
176+
177+## Animation
178+{: .-left-reference}
179+
180+### Properties
181+
182+| Property                     | Value                                                    |
183+| ---------------------------- | -------------------------------------------------------- |
184+| `animation:`                 | _(shorthand)_                                            |
185+| `animation-name:`            | `<name>`                                                 |
186+| `animation-duration:`        | `<time>ms`                                               |
187+| `animation-timing-function:` | `ease` `linear` `ease-in` `ease-out` `ease-in-out`       |
188+| `animation-delay:`           | `<time>ms`                                               |
189+| `animation-iteration-count:` | `infinite` `<number>`                                    |
190+| `animation-direction:`       | `normal` `reverse` `alternate` `alternate-reverse`       |
191+| `animation-fill-mode:`       | `none` `forwards` `backwards` `both` `initial` `inherit` |
192+| `animation-play-state:`      | `normal` `reverse` `alternate` `alternate-reverse`       |
193+{: .-key-values}
194+
195+### Shorthand
196+
197+|              | name     | duration | timing-function | delay   | count      | direction           | fill-mode | play-state |
198+| ------------ | -------- | -------- | --------------- | ------- | ---------- | ------------------- | --------- | ---------- |
199+| `animation:` | `bounce` | `300ms`  | `linear`        | `100ms` | `infinite` | `alternate-reverse` | `both`    | `reverse`  |
200+|              | name     | duration | timing-function | delay   | count      | direction           | fill-mode | play-state |
201+{: .-css-breakdown}
202+
203+### Example
204+
205+```css
206+animation: bounce 300ms linear 0s infinite normal;
207+animation: bounce 300ms linear infinite;
208+animation: bounce 300ms linear infinite alternate-reverse;
209+animation: bounce 300ms linear 2s infinite alternate-reverse forwards normal;
210+```
211+
212+### Event
213+
214+```js
215+.one('webkitAnimationEnd oanimationend msAnimationEnd animationend')
216+```
217+
218+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
219+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/dockerfile.md
+115, -0
  1@@ -0,0 +1,115 @@
  2+---
  3+title: Dockerfile
  4+category: Devops
  5+layout: 2017/sheet
  6+prism_languages: [docker]
  7+updated: 2019-10-20
  8+---
  9+
 10+## Reference
 11+{: .-three-column}
 12+
 13+### Inheritance
 14+
 15+```docker
 16+FROM ruby:2.2.2
 17+```
 18+
 19+### Variables
 20+
 21+```docker
 22+ENV APP_HOME /myapp
 23+RUN mkdir $APP_HOME
 24+```
 25+
 26+```docker
 27+ARG APP_HOME=""
 28+RUN mkdir $APP_HOME
 29+```
 30+
 31+### Initialization
 32+
 33+```docker
 34+RUN bundle install
 35+```
 36+
 37+```docker
 38+WORKDIR /myapp
 39+```
 40+
 41+```docker
 42+VOLUME ["/data"]
 43+# Specification for mount point
 44+```
 45+
 46+```docker
 47+ADD file.xyz /file.xyz
 48+COPY --chown=user:group host_file.xyz /path/container_file.xyz
 49+```
 50+
 51+### Run commands in strict shell
 52+
 53+```docker
 54+ENV my_var
 55+SHELL ["/bin/bash", "-euo", "pipefail", "-c"]
 56+
 57+# With strict mode:
 58+RUN false # fails build like using &&
 59+RUN echo "$myvar" # will throw error due to typo
 60+RUN true | false # will bail out of pipe
 61+```
 62+
 63+Using `shell` will turn on strict mode for shell commands.
 64+
 65+### Onbuild
 66+
 67+```docker
 68+ONBUILD RUN bundle install
 69+# when used with another file
 70+```
 71+
 72+### Commands
 73+
 74+```docker
 75+EXPOSE 5900
 76+CMD    ["bundle", "exec", "rails", "server"]
 77+```
 78+
 79+### Entrypoint
 80+
 81+```docker
 82+ENTRYPOINT ["executable", "param1", "param2"]
 83+ENTRYPOINT command param1 param2
 84+```
 85+
 86+Configures a container that will run as an executable.
 87+
 88+```docker
 89+ENTRYPOINT exec top -b
 90+```
 91+
 92+This will use shell processing to substitute shell variables, and will ignore any `CMD` or `docker run` command line arguments.
 93+
 94+### Metadata
 95+
 96+```docker
 97+LABEL version="1.0"
 98+```
 99+
100+```docker
101+LABEL "com.example.vendor"="ACME Incorporated"
102+LABEL com.example.label-with-value="foo"
103+```
104+
105+```docker
106+LABEL description="This text illustrates \
107+that label-values can span multiple lines."
108+```
109+
110+## See also
111+{: .-one-column}
112+
113+- <https://docs.docker.com/engine/reference/builder/>
114+
115+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
116+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/editorconfig.md
+78, -0
 1@@ -0,0 +1,78 @@
 2+---
 3+title: editorconfig
 4+layout: 2017/sheet
 5+prism_languages: [ini]
 6+weight: -1
 7+updated: 2019-09-25
 8+category: Apps
 9+---
10+
11+### Short example
12+{: .-prime}
13+
14+```ini
15+# editorconfig.org
16+root = true
17+
18+[*]
19+indent_style = space
20+indent_size = 2
21+tab_width = 2
22+end_of_line = lf
23+charset = utf-8
24+trim_trailing_whitespace = true
25+insert_final_newline = true
26+```
27+
28+This example should be fine for most projects indented by 2 spaces. See: [animate.css editorconfig](https://github.com/daneden/animate.css/blob/master/.editorconfig)
29+
30+### Properties
31+
32+```ini
33+indent_style = {space|tab}
34+indent_size = {4|tab}
35+tab_width = 2
36+end_of_line = {cr|lf|crlf}
37+charset = {utf-8|utf-16be|utf-16le|latin1}
38+trim_trailing_whitespace = false
39+insert_final_newline = true
40+max_line_length = 80
41+```
42+
43+### Full example
44+
45+```ini
46+# top-most EditorConfig file
47+root = true
48+
49+# Unix-style newlines with a newline ending every file
50+[*]
51+end_of_line = lf
52+insert_final_newline = true
53+
54+# 4 space indentation
55+[*.py]
56+indent_style = space
57+indent_size = 4
58+
59+# Tab indentation (no size specified)
60+[*.js]
61+indent_style = tab
62+
63+# Indentation override for all JS under lib directory
64+[lib/**.js]
65+indent_style = space
66+indent_size = 2
67+
68+# Matches the exact files either package.json or .travis.yml
69+[{package.json,.travis.yml}]
70+indent_style = space
71+indent_size = 2
72+```
73+
74+### References
75+
76+- <https://EditorConfig.org>
77+
78+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
79+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/elixir.md
+766, -0
  1@@ -0,0 +1,766 @@
  2+---
  3+title: Elixir
  4+category: Elixir
  5+layout: 2017/sheet
  6+tags: [New]
  7+updated: 2018-07-04
  8+weight: -10
  9+---
 10+
 11+## Getting started
 12+{: .-three-column}
 13+
 14+### Hello world
 15+{: .-prime}
 16+
 17+```elixir
 18+# hello.exs
 19+defmodule Greeter do
 20+  def greet(name) do
 21+    message = "Hello, " <> name <> "!"
 22+    IO.puts message
 23+  end
 24+end
 25+
 26+Greeter.greet("world")
 27+```
 28+
 29+```bash
 30+elixir hello.exs
 31+# Hello, world!
 32+```
 33+{: .-setup}
 34+
 35+### Variables
 36+
 37+```elixir
 38+age = 23
 39+```
 40+
 41+### Maps
 42+
 43+```elixir
 44+user = %{
 45+  name: "John",
 46+  city: "Melbourne"
 47+}
 48+```
 49+
 50+```elixir
 51+IO.puts "Hello, " <> user.name
 52+```
 53+{: .-setup}
 54+
 55+### Lists
 56+
 57+```elixir
 58+users = [ "Tom", "Dick", "Harry" ]
 59+```
 60+{: data-line="1"}
 61+
 62+```elixir
 63+Enum.map(users, fn user ->
 64+  IO.puts "Hello " <> user
 65+end)
 66+```
 67+
 68+### Piping
 69+
 70+```elixir
 71+source
 72+|> transform(:hello)
 73+|> print()
 74+```
 75+{: data-line="2,3"}
 76+
 77+```elixir
 78+# Same as:
 79+print(transform(source, :hello))
 80+```
 81+
 82+These two are equivalent.
 83+
 84+### Pattern matching
 85+
 86+```elixir
 87+user = %{name: "Tom", age: 23}
 88+%{name: username} = user
 89+```
 90+{: data-line="2"}
 91+
 92+This sets `username` to `"Tom"`.
 93+
 94+### Pattern matching in functions
 95+
 96+```elixir
 97+def greet(%{name: username}) do
 98+  IO.puts "Hello, " <> username
 99+end
100+
101+user = %{name: "Tom", age: 23}
102+```
103+{: data-line="1"}
104+
105+Pattern matching works in function parameters too.
106+
107+Control flow
108+------------
109+{: .-three-column}
110+
111+### If
112+
113+```elixir
114+if false do
115+  "This will never be seen"
116+else
117+  "This will"
118+end
119+```
120+### Case
121+
122+```elixir
123+case {1, 2, 3} do
124+  {4, 5, 6} ->
125+    "This clause won't match"
126+  {1, x, 3} ->
127+    "This will match and bind x to 2"
128+  _ ->
129+   "This will match any value"
130+end
131+```
132+
133+### Cond
134+
135+```elixir
136+cond do
137+  1 + 1 == 3 ->
138+    "I will never be seen"
139+  2 * 5 == 12 ->
140+    "Me neither"
141+  true ->
142+    "But I will (this is essentially an else)"
143+end
144+```
145+
146+### With
147+
148+```elixir
149+with {:ok, {int, _asdf}} <- Integer.parse("123asdf"),
150+     {:ok, datetime, _utc_offset} <- DateTime.from_iso8601("2021-10-27T12:00:00Z") do
151+  DateTime.add(datetime, int, :second)
152+  # optional else clause. if not provided and an error occurs, the error is returned
153+else
154+  :error -> "couldn't parse integer string"
155+  {:error, :invalid_format} -> "couldn't parse date string"
156+  _ -> "this will never get hit because all errors are handled"
157+end
158+```
159+
160+### Errors
161+
162+```elixir
163+try do
164+  throw(:hello)
165+catch
166+  message -> "Got #{message}."
167+after
168+  IO.puts("I'm the after clause.")
169+end
170+```
171+
172+## Types
173+
174+### Primitives
175+
176+| Sample                  | Type            |
177+| ---                     | ---             |
178+| `nil`                   | Nil/null        |
179+| `true` _/_ `false`      | Boolean         |
180+| ---                     | ---             |
181+| `?a`                    | Integer (ASCII) |
182+| `23`                    | Integer         |
183+| `3.14`                  | Float           |
184+| ---                     | ---             |
185+| `'hello'`               | Charlist        |
186+| `<<2, 3>>`              | Binary          |
187+| `"hello"`               | Binary string   |
188+| `:hello`                | Atom            |
189+| ---                     | ---             |
190+| `[a, b]`                | List            |
191+| `{a, b}`                | Tuple           |
192+| ---                     | ---             |
193+| `%{a: "hello"}`         | Map             |
194+| `%MyStruct{a: "hello"}` | Struct          |
195+| `fn -> ... end`         | Function        |
196+
197+### Type checks
198+
199+```elixir
200+is_atom/1
201+is_bitstring/1
202+is_boolean/1
203+is_function/1
204+is_function/2
205+is_integer/1
206+is_float/1
207+```
208+
209+```elixir
210+is_binary/1
211+is_list/1
212+is_map/1
213+is_tuple/1
214+```
215+
216+```elixir
217+is_nil/1
218+is_number/1
219+is_pid/1
220+is_port/1
221+is_reference/1
222+```
223+
224+### Operators
225+
226+```elixir
227+left != right   # equal
228+left !== right  # match
229+left ++ right   # concat lists
230+left <> right   # concat string/binary
231+left =~ right   # regexp
232+```
233+
234+Modules
235+-------
236+
237+### Importing
238+
239+```elixir
240+require Redux   # compiles a module
241+import Redux    # compiles, and you can use without the `Redux.` prefix
242+
243+use Redux       # compiles, and runs Redux.__using__/1
244+use Redux, async: true
245+
246+import Redux, only: [duplicate: 2]
247+import Redux, only: :functions
248+import Redux, only: :macros
249+
250+import Foo.{Bar, Baz}
251+```
252+
253+### Aliases
254+
255+```elixir
256+alias Foo.Bar, as: Bar
257+alias Foo.Bar   # same as above
258+
259+alias Foo.{Bar, Baz}
260+```
261+
262+## String
263+
264+### Functions
265+
266+```elixir
267+import String
268+```
269+{: .-setup}
270+
271+```elixir
272+str = "hello"
273+str |> length()        # → 5
274+str |> codepoints()    # → ["h", "e", "l", "l", "o"]
275+str |> slice(2..-1)    # → "llo"
276+str |> split(" ")      # → ["hello"]
277+str |> capitalize()    # → "Hello"
278+str |> match(regex)
279+```
280+
281+### Inspecting objects
282+
283+```elixir
284+inspect(object, opts \\ [])
285+```
286+```elixir
287+value |> IO.inspect()
288+```
289+```elixir
290+value |> IO.inspect(label: "value")
291+```
292+
293+## Numbers
294+
295+### Operations
296+
297+```elixir
298+abs(n)
299+round(n)
300+rem(a, b)   # remainder (modulo)
301+div(a, b)   # integer division
302+```
303+
304+### Float
305+
306+```elixir
307+import Float
308+```
309+{: .-setup}
310+
311+```elixir
312+n = 10.3
313+```
314+{: .-setup}
315+
316+```elixir
317+n |> ceil()            # → 11.0
318+n |> ceil(2)           # → 11.30
319+n |> to_string()       # → "1.030000+e01"
320+n |> to_string([decimals: 2, compact: true])
321+```
322+
323+```elixir
324+Float.parse("34")  # → { 34.0, "" }
325+```
326+
327+### Integer
328+
329+```elixir
330+import Integer
331+```
332+{: .-setup}
333+
334+```elixir
335+n = 12
336+```
337+{: .-setup}
338+
339+```elixir
340+n |> digits()         # → [1, 2]
341+n |> to_charlist()    # → '12'
342+n |> to_string()      # → "12"
343+n |> is_even()
344+n |> is_odd()
345+```
346+
347+```elixir
348+# Different base:
349+n |> digits(2)        # → [1, 1, 0, 0]
350+n |> to_charlist(2)   # → '1100'
351+n |> to_string(2)     # → "1100"
352+```
353+
354+```elixir
355+parse("12")           # → {12, ""}
356+undigits([1, 2])      # → 12
357+```
358+
359+### Type casting
360+
361+```elixir
362+Float.parse("34.1")    # → {34.1, ""}
363+Integer.parse("34")    # → {34, ""}
364+```
365+
366+```elixir
367+Float.to_string(34.1)  # → "3.4100e+01"
368+Float.to_string(34.1, [decimals: 2, compact: true])  # → "34.1"
369+```
370+
371+## Map
372+
373+### Defining
374+
375+```elixir
376+m = %{name: "hi"}       # atom keys (:name)
377+m = %{"name" => "hi"}   # string keys ("name")
378+```
379+
380+### Updating
381+
382+```elixir
383+import Map
384+```
385+{: .-setup}
386+
387+```elixir
388+m = %{m | name: "yo"}  # key must exist
389+```
390+
391+```elixir
392+m |> put(:id, 2)      # → %{id: 2, name: "hi"}
393+m |> put_new(:id, 2)  # only if `id` doesn't exist (`||=`)
394+```
395+
396+```elixir
397+m |> put(:b, "Banana")
398+m |> merge(%{b: "Banana"})
399+m |> update(:a, &(&1 + 1))
400+m |> update(:a, fun a -> a + 1 end)
401+```
402+
403+```elixir
404+m |> get_and_update(:a, &(&1 || "default"))
405+# → {old, new}
406+```
407+
408+### Deleting
409+
410+```elixir
411+m |> delete(:name)  # → %{}
412+m |> pop(:name)     # → {"John", %{}}
413+```
414+
415+### Reading
416+
417+```elixir
418+m |> get(:id)       # → 1
419+m |> keys()         # → [:id, :name]
420+m |> values()       # → [1, "hi"]
421+```
422+
423+```elixir
424+m |> to_list()      # → [id: 1, name: "hi"]
425+                    # → [{:id, 1}, {:name, "hi"}]
426+```
427+
428+### Deep
429+
430+```elixir
431+put_in(map, [:b, :c], "Banana")
432+put_in(map[:b][:c], "Banana")    # via macros
433+```
434+
435+```elixir
436+get_and_update_in(users, ["john", :age], &{&1, &1 + 1})
437+```
438+
439+### Constructing from lists
440+
441+```elixir
442+Map.new([{:b, 1}, {:a, 2}])
443+Map.new([a: 1, b: 2])
444+Map.new([:a, :b], fn x -> {x, x} end)  # → %{a: :a, b: :b}
445+```
446+
447+### Working with structs
448+
449+#### Struct to map
450+
451+```elixir
452+Map.from_struct(%AnyStruct{a: "b"})  # → %{a: "b"}
453+```
454+
455+#### Map to struct
456+
457+```elixir
458+struct(AnyStruct, %{a: "b"})  # → %AnyStruct{a: "b"}
459+```
460+
461+## List
462+
463+```elixir
464+import List
465+```
466+{: .-setup}
467+
468+```elixir
469+l = [ 1, 2, 3, 4 ]
470+```
471+{: .-setup}
472+
473+```elixir
474+l = l ++ [5]         # push (append)
475+l = [ 0 | list ]     # unshift (prepend)
476+```
477+
478+```elixir
479+l |> first()
480+l |> last()
481+```
482+
483+```elixir
484+l |> flatten()
485+l |> flatten(tail)
486+```
487+
488+Also see [Enum](#enum).
489+
490+
491+## Enum
492+
493+### Usage
494+
495+```elixir
496+import Enum
497+```
498+{: .-setup}
499+
500+```elixir
501+list = [:a, :b, :c]
502+```
503+{: .-setup}
504+
505+```elixir
506+list |> at(0)         # → :a
507+list |> count()       # → 3
508+list |> empty?()      # → false
509+list |> any?()        # → true
510+```
511+
512+```elixir
513+list |> concat([:d])  # → [:a, :b, :c, :d]
514+```
515+
516+Also, consider streams instead.
517+
518+### Map/reduce
519+
520+```elixir
521+list |> reduce(fn)
522+list |> reduce(acc, fn)
523+list |> map(fn)
524+list |> reject(fn)
525+list |> any?(fn)
526+list |> empty?(fn)
527+```
528+
529+```elixir
530+[1, 2, 3, 4]
531+|> Enum.reduce(0, fn(x, acc) -> x + acc end)
532+```
533+
534+## Tuple
535+
536+### Tuples
537+
538+```elixir
539+import Tuple
540+```
541+{: .-setup}
542+
543+```elixir
544+t = { :a, :b }
545+```
546+
547+```elixir
548+t |> elem(1)    # like tuple[1]
549+t |> put_elem(index, value)
550+t |> tuple_size()
551+```
552+
553+### Keyword lists
554+
555+```elixir
556+list = [{ :name, "John" }, { :age, 15 }]
557+list[:name]
558+```
559+
560+```elixir
561+# For string-keyed keyword lists
562+list = [{"size", 2}, {"type", "shoe"}]
563+List.keyfind(list, "size", 0)  # → {"size", 2}
564+```
565+
566+## Functions
567+
568+### Lambdas
569+
570+```elixir
571+square = fn n -> n*n end
572+square.(20)
573+```
574+
575+### & syntax
576+
577+```elixir
578+square = &(&1 * &1)
579+square.(20)
580+
581+square = &Math.square/1
582+```
583+
584+### Running
585+
586+```elixir
587+fun.(args)
588+apply(fun, args)
589+apply(module, fun, args)
590+```
591+
592+### Function heads
593+
594+```elixir
595+def join(a, b \\ nil)
596+def join(a, b) when is_nil(b) do: a
597+def join(a, b) do: a <> b
598+```
599+
600+## Structs
601+
602+### Structs
603+
604+```elixir
605+defmodule User do
606+  defstruct name: "", age: nil
607+end
608+
609+%User{name: "John", age: 20}
610+
611+%User{}.struct  # → User
612+```
613+
614+See: [Structs](http://elixir-lang.org/getting-started/structs.html)
615+
616+## Protocols
617+
618+### Defining protocols
619+
620+```elixir
621+defprotocol Blank do
622+  @doc "Returns true if data is considered blank/empty"
623+  def blank?(data)
624+end
625+```
626+
627+```elixir
628+defimpl Blank, for: List do
629+  def blank?([]), do: true
630+  def blank?(_), do: false
631+end
632+
633+Blank.blank?([])  # → true
634+```
635+
636+### Any
637+
638+```elixir
639+defimpl Blank, for: Any do ... end
640+
641+defmodule User do
642+  @derive Blank     # Falls back to Any
643+  defstruct name: ""
644+end
645+```
646+
647+### Examples
648+
649+- `Enumerable` and `Enum.map()`
650+- `Inspect` and `inspect()`
651+
652+## Comprehensions
653+
654+### For
655+
656+```elixir
657+for n <- [1, 2, 3, 4], do: n * n
658+for n <- 1..4, do: n * n
659+```
660+
661+```elixir
662+for {key, val} <- %{a: 10, b: 20}, do: val
663+# → [10, 20]
664+```
665+
666+```elixir
667+for {key, val} <- %{a: 10, b: 20}, into: %{}, do: {key, val*val}
668+```
669+
670+### Conditions
671+
672+```elixir
673+for n <- 1..10, rem(n, 2) == 0, do: n
674+# → [2, 4, 6, 8, 10]
675+```
676+
677+### Complex
678+
679+```elixir
680+for dir <- dirs,
681+    file <- File.ls!(dir),          # nested comprehension
682+    path = Path.join(dir, file),    # invoked
683+    File.regular?(path) do          # condition
684+  IO.puts(file)
685+end
686+```
687+
688+## Misc
689+
690+### Metaprogramming
691+
692+```elixir
693+__MODULE__
694+__MODULE__.__info__
695+
696+@after_compile __MODULE__
697+def __before_compile__(env)
698+def __after_compile__(env, _bytecode)
699+def __using__(opts)    # invoked on `use`
700+
701+@on_definition {__MODULE__, :on_def}
702+def on_def(_env, kind, name, args, guards, body)
703+
704+@on_load :load_check
705+def load_check
706+```
707+
708+### Regexp
709+
710+```elixir
711+exp = ~r/hello/
712+exp = ~r/hello/i
713+"hello world" =~ exp
714+```
715+
716+### Sigils
717+
718+```elixir
719+~r/regexp/
720+~w(list of strings)
721+~s|strings with #{interpolation} and \x20 escape codes|
722+~S|no interpolation and no escapes|
723+~c(charlist)
724+```
725+
726+Allowed chars: `/` `|` `"` `'` `(` `[` `{` `<` `"""`.
727+See: [Sigils](http://elixir-lang.org/getting-started/sigils.html)
728+
729+### Type specs
730+
731+```elixir
732+@spec round(number) :: integer
733+
734+@type number_with_remark :: {number, String.t}
735+@spec add(number, number) :: number_with_remark
736+```
737+
738+Useful for [dialyzer](http://www.erlang.org/doc/man/dialyzer.html).
739+See: [Typespecs](http://elixir-lang.org/getting-started/typespecs-and-behaviours.html)
740+
741+### Behaviours
742+
743+```elixir
744+defmodule Parser do
745+  @callback parse(String.t) :: any
746+  @callback extensions() :: [String.t]
747+end
748+```
749+
750+```elixir
751+defmodule JSONParser do
752+  @behaviour Parser
753+
754+  def parse(str), do: # ... parse JSON
755+  def extensions, do: ["json"]
756+end
757+```
758+
759+See: [Module](http://elixir-lang.org/docs/stable/elixir/Module.html)
760+
761+## References
762+{: .-one-column}
763+
764+- [Learn Elixir in Y minutes](https://learnxinyminutes.com/docs/elixir/)
765+
766+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
767+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/es6.md
+582, -0
  1@@ -0,0 +1,582 @@
  2+---
  3+title: ES2015+
  4+category: JavaScript
  5+layout: 2017/sheet
  6+tags: [Featured]
  7+updated: 2019-11-14
  8+weight: -10
  9+intro: |
 10+  A quick overview of new JavaScript features in ES2015, ES2016, ES2017, ES2018 and beyond.
 11+---
 12+
 13+### Block scoping
 14+
 15+#### Let
 16+
 17+```js
 18+function fn () {
 19+  let x = 0
 20+  if (true) {
 21+    let x = 1 // only inside this `if`
 22+  }
 23+}
 24+```
 25+{: data-line="2,4"}
 26+
 27+#### Const
 28+
 29+```js
 30+const a = 1
 31+```
 32+
 33+`let` is the new `var`. Constants work just like `let`, but can't be reassigned.
 34+See: [Let and const](https://babeljs.io/learn-es2015/#let--const)
 35+
 36+### Backtick strings
 37+
 38+#### Interpolation
 39+
 40+```js
 41+const message = `Hello ${name}`
 42+```
 43+
 44+#### Multiline strings
 45+
 46+```js
 47+const str = `
 48+hello
 49+world
 50+`
 51+```
 52+
 53+Templates and multiline strings.
 54+See: [Template strings](https://babeljs.io/learn-es2015/#template-strings)
 55+
 56+### Binary and octal literals
 57+
 58+```js
 59+let bin = 0b1010010
 60+let oct = 0o755
 61+```
 62+
 63+See: [Binary and octal literals](https://babeljs.io/learn-es2015/#binary-and-octal-literals)
 64+
 65+### New methods
 66+
 67+#### New string methods
 68+
 69+```js
 70+"hello".repeat(3)
 71+"hello".includes("ll")
 72+"hello".startsWith("he")
 73+"hello".padStart(8) // "   hello"
 74+"hello".padEnd(8) // "hello   " 
 75+"hello".padEnd(8, '!') // hello!!!
 76+"\u1E9B\u0323".normalize("NFC")
 77+```
 78+
 79+See: [New methods](https://babeljs.io/learn-es2015/#math--number--string--object-apis)
 80+
 81+### Classes
 82+
 83+```js
 84+class Circle extends Shape {
 85+```
 86+
 87+#### Constructor
 88+
 89+```js
 90+  constructor (radius) {
 91+    this.radius = radius
 92+  }
 93+```
 94+{: data-line="1"}
 95+
 96+#### Methods
 97+
 98+```js
 99+  getArea () {
100+    return Math.PI * 2 * this.radius
101+  }
102+```
103+{: data-line="1"}
104+
105+#### Calling superclass methods
106+
107+```js
108+  expand (n) {
109+    return super.expand(n) * Math.PI
110+  }
111+```
112+{: data-line="2"}
113+
114+#### Static methods
115+
116+```js
117+  static createFromDiameter(diameter) {
118+    return new Circle(diameter / 2)
119+  }
120+}
121+```
122+{: data-line="1"}
123+
124+Syntactic sugar for prototypes.
125+See: [Classes](https://babeljs.io/learn-es2015/#classes)
126+
127+### Exponent operator
128+
129+```js
130+const byte = 2 ** 8
131+// Same as: Math.pow(2, 8)
132+```
133+{: data-line="1"}
134+
135+Promises
136+--------
137+{: .-three-column}
138+
139+### Making promises
140+
141+```js
142+new Promise((resolve, reject) => {
143+  if (ok) { resolve(result) }
144+  else { reject(error) }
145+})
146+```
147+{: data-line="1"}
148+
149+For asynchronous programming.
150+See: [Promises](https://babeljs.io/learn-es2015/#promises)
151+
152+### Using promises
153+
154+```js
155+promise
156+  .then((result) => { ··· })
157+  .catch((error) => { ··· })
158+```
159+{: data-line="2,3"}
160+
161+
162+### Using promises with finally
163+
164+```js
165+promise
166+  .then((result) => { ··· })
167+  .catch((error) => { ··· })
168+  .finally(() => { // logic independent of success/error })
169+```
170+{: data-line="4"}
171+
172+The handler is called when the promise is fulfilled or rejected.
173+
174+
175+### Promise functions
176+
177+```js
178+Promise.all(···)
179+Promise.race(···)
180+Promise.reject(···)
181+Promise.resolve(···)
182+```
183+
184+### Async-await
185+
186+```js
187+async function run () {
188+  const user = await getUser()
189+  const tweets = await getTweets(user)
190+  return [user, tweets]
191+}
192+```
193+{: data-line="2,3"}
194+
195+`async` functions are another way of using functions.
196+
197+See: [async function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function)
198+
199+Destructuring
200+-------------
201+{: .-three-column}
202+
203+### Destructuring assignment
204+
205+#### Arrays
206+
207+```js
208+const [first, last] = ['Nikola', 'Tesla']
209+```
210+{: data-line="1"}
211+
212+#### Objects
213+
214+```js
215+let {title, author} = {
216+  title: 'The Silkworm',
217+  author: 'R. Galbraith'
218+}
219+```
220+{: data-line="1"}
221+
222+Supports for matching arrays and objects.
223+See: [Destructuring](https://babeljs.io/learn-es2015/#destructuring)
224+
225+### Default values
226+
227+```js
228+const scores = [22, 33]
229+const [math = 50, sci = 50, arts = 50] = scores
230+```
231+
232+```js
233+// Result:
234+// math === 22, sci === 33, arts === 50
235+```
236+
237+Default values can be assigned while destructuring arrays or objects.
238+
239+### Function arguments
240+
241+```js
242+function greet({ name, greeting }) {
243+  console.log(`${greeting}, ${name}!`)
244+}
245+```
246+{: data-line="1"}
247+
248+```js
249+greet({ name: 'Larry', greeting: 'Ahoy' })
250+```
251+
252+Destructuring of objects and arrays can also be done in function arguments.
253+
254+### Default values
255+
256+```js
257+function greet({ name = 'Rauno' } = {}) {
258+  console.log(`Hi ${name}!`);
259+}
260+```
261+{: data-line="1"}
262+
263+```js
264+greet() // Hi Rauno!
265+greet({ name: 'Larry' }) // Hi Larry!
266+```
267+
268+### Reassigning keys
269+
270+```js
271+function printCoordinates({ left: x, top: y }) {
272+  console.log(`x: ${x}, y: ${y}`)
273+}
274+```
275+{: data-line="1"}
276+
277+```js
278+printCoordinates({ left: 25, top: 90 })
279+```
280+
281+This example assigns `x` to the value of the `left` key.
282+
283+### Loops
284+
285+```js
286+for (let {title, artist} of songs) {
287+  ···
288+}
289+```
290+{: data-line="1"}
291+
292+The assignment expressions work in loops, too.
293+
294+
295+### Object destructuring
296+
297+```js
298+const { id, ...detail } = song;
299+```
300+{: data-line="1"}
301+
302+Extract some keys individually and remaining keys in the object using rest (...) operator
303+
304+
305+Spread
306+------
307+
308+### Object spread
309+
310+#### with Object spread
311+
312+```js
313+const options = {
314+  ...defaults,
315+  visible: true
316+}
317+```
318+{: data-line="2"}
319+
320+#### without Object spread
321+
322+```js
323+const options = Object.assign(
324+  {}, defaults,
325+  { visible: true })
326+```
327+
328+The Object spread operator lets you build new objects from other objects.
329+
330+See: [Object spread](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)
331+
332+### Array spread
333+
334+#### with Array spread
335+
336+```js
337+const users = [
338+  ...admins,
339+  ...editors,
340+  'rstacruz'
341+]
342+```
343+{: data-line="2,3"}
344+
345+#### without Array spread
346+
347+```js
348+const users = admins
349+  .concat(editors)
350+  .concat([ 'rstacruz' ])
351+```
352+
353+The spread operator lets you build new arrays in the same way.
354+
355+See: [Spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)
356+
357+Functions
358+---------
359+
360+### Function arguments
361+
362+#### Default arguments
363+
364+```js
365+function greet (name = 'Jerry') {
366+  return `Hello ${name}`
367+}
368+```
369+{: data-line="1"}
370+
371+#### Rest arguments
372+
373+```js
374+function fn(x, ...y) {
375+  // y is an Array
376+  return x * y.length
377+}
378+```
379+{: data-line="1"}
380+
381+#### Spread
382+
383+```js
384+fn(...[1, 2, 3])
385+// same as fn(1, 2, 3)
386+```
387+{: data-line="1"}
388+
389+Default, rest, spread.
390+See: [Function arguments](https://babeljs.io/learn-es2015/#default--rest--spread)
391+
392+### Fat arrows
393+
394+#### Fat arrows
395+
396+```js
397+setTimeout(() => {
398+  ···
399+})
400+```
401+{: data-line="1"}
402+
403+#### With arguments
404+
405+```js
406+readFile('text.txt', (err, data) => {
407+  ...
408+})
409+```
410+{: data-line="1"}
411+
412+#### Implicit return
413+```js
414+numbers.map(n => n * 2)
415+// No curly braces = implicit return
416+// Same as: numbers.map(function (n) { return n * 2 })
417+numbers.map(n => ({
418+  result: n * 2
419+}))
420+// Implicitly returning objects requires parentheses around the object
421+```
422+{: data-line="1,4,5,6"}
423+
424+Like functions but with `this` preserved.
425+See: [Fat arrows](https://babeljs.io/learn-es2015/#arrows-and-lexical-this)
426+
427+Objects
428+-------
429+
430+### Shorthand syntax
431+
432+```js
433+module.exports = { hello, bye }
434+// Same as: module.exports = { hello: hello, bye: bye }
435+```
436+
437+See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals)
438+
439+### Methods
440+
441+```js
442+const App = {
443+  start () {
444+    console.log('running')
445+  }
446+}
447+// Same as: App = { start: function () {···} }
448+```
449+{: data-line="2"}
450+
451+See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals)
452+
453+### Getters and setters
454+
455+```js
456+const App = {
457+  get closed () {
458+    return this.status === 'closed'
459+  },
460+  set closed (value) {
461+    this.status = value ? 'closed' : 'open'
462+  }
463+}
464+```
465+{: data-line="2,5"}
466+
467+See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals)
468+
469+### Computed property names
470+
471+```js
472+let event = 'click'
473+let handlers = {
474+  [`on${event}`]: true
475+}
476+// Same as: handlers = { 'onclick': true }
477+```
478+{: data-line="3"}
479+
480+See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals)
481+
482+
483+### Extract values
484+
485+```js
486+const fatherJS = { age: 57, name: "Brendan Eich" }
487+
488+Object.values(fatherJS)
489+// [57, "Brendan Eich"]
490+Object.entries(fatherJS)
491+// [["age", 57], ["name", "Brendan Eich"]]
492+```
493+{: data-line="3,5"}
494+
495+
496+Modules
497+-------
498+
499+### Imports
500+
501+```js
502+import 'helpers'
503+// aka: require('···')
504+```
505+
506+```js
507+import Express from 'express'
508+// aka: const Express = require('···').default || require('···')
509+```
510+
511+```js
512+import { indent } from 'helpers'
513+// aka: const indent = require('···').indent
514+```
515+
516+```js
517+import * as Helpers from 'helpers'
518+// aka: const Helpers = require('···')
519+```
520+
521+```js
522+import { indentSpaces as indent } from 'helpers'
523+// aka: const indent = require('···').indentSpaces
524+```
525+
526+`import` is the new `require()`.
527+See: [Module imports](https://babeljs.io/learn-es2015/#modules)
528+
529+### Exports
530+
531+```js
532+export default function () { ··· }
533+// aka: module.exports.default = ···
534+```
535+
536+```js
537+export function mymethod () { ··· }
538+// aka: module.exports.mymethod = ···
539+```
540+
541+```js
542+export const pi = 3.14159
543+// aka: module.exports.pi = ···
544+```
545+
546+`export` is the new `module.exports`.
547+See: [Module exports](https://babeljs.io/learn-es2015/#modules)
548+
549+Generators
550+----------
551+
552+### Generators
553+
554+```js
555+function* idMaker () {
556+  let id = 0
557+  while (true) { yield id++ }
558+}
559+```
560+
561+```js
562+let gen = idMaker()
563+gen.next().value  // → 0
564+gen.next().value  // → 1
565+gen.next().value  // → 2
566+```
567+
568+It's complicated.
569+See: [Generators](https://babeljs.io/learn-es2015/#generators)
570+
571+### For..of iteration
572+
573+```js
574+for (let i of iterable) {
575+  ···
576+}
577+```
578+
579+For iterating through generators and arrays.
580+See: [For..of iteration](https://babeljs.io/learn-es2015/#iterators--forof)
581+
582+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
583+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/go.md
+658, -0
  1@@ -0,0 +1,658 @@
  2+---
  3+title: Go
  4+layout: 2017/sheet
  5+prism_languages: [go, bash]
  6+weight: -3
  7+tags: [Featured]
  8+category: C-like
  9+updated: 2020-06-21
 10+---
 11+
 12+## Getting started
 13+{: .-three-column}
 14+
 15+### Introduction
 16+{: .-intro}
 17+
 18+- [A tour of Go](https://tour.golang.org/welcome/1) _(tour.golang.org)_
 19+- [Go repl](https://repl.it/languages/go) _(repl.it)_
 20+- [Golang wiki](https://github.com/golang/go/wiki/) _(github.com)_
 21+
 22+### Hello world
 23+{: .-prime}
 24+
 25+#### hello.go
 26+{: .-file}
 27+
 28+```go
 29+package main
 30+
 31+import "fmt"
 32+
 33+func main() {
 34+  message := greetMe("world")
 35+  fmt.Println(message)
 36+}
 37+
 38+func greetMe(name string) string {
 39+  return "Hello, " + name + "!"
 40+}
 41+```
 42+
 43+```bash
 44+$ go build
 45+```
 46+
 47+Or try it out in the [Go repl](https://repl.it/languages/go), or [A Tour of Go](https://tour.golang.org/welcome/1).
 48+
 49+### Variables
 50+
 51+#### Variable declaration
 52+
 53+```go
 54+var msg string
 55+msg = "Hello"
 56+```
 57+
 58+#### Shortcut of above (Infers type)
 59+
 60+```go
 61+msg := "Hello"
 62+```
 63+
 64+### Constants
 65+
 66+```go
 67+const Phi = 1.618
 68+```
 69+
 70+Constants can be character, string, boolean, or numeric values.
 71+
 72+See: [Constants](https://tour.golang.org/basics/15)
 73+
 74+## Basic types
 75+{: .-three-column}
 76+
 77+### Strings
 78+
 79+```go
 80+str := "Hello"
 81+```
 82+
 83+```go
 84+str := `Multiline
 85+string`
 86+```
 87+
 88+Strings are of type `string`.
 89+
 90+### Numbers
 91+
 92+#### Typical types
 93+
 94+```go
 95+num := 3          // int
 96+num := 3.         // float64
 97+num := 3 + 4i     // complex128
 98+num := byte('a')  // byte (alias for uint8)
 99+```
100+
101+#### Other types
102+
103+```go
104+var u uint = 7        // uint (unsigned)
105+var p float32 = 22.7  // 32-bit float
106+```
107+
108+### Arrays
109+
110+```go
111+// var numbers [5]int
112+numbers := [...]int{0, 0, 0, 0, 0}
113+```
114+
115+Arrays have a fixed size.
116+
117+### Slices
118+
119+```go
120+slice := []int{2, 3, 4}
121+```
122+
123+```go
124+slice := []byte("Hello")
125+```
126+
127+Slices have a dynamic size, unlike arrays.
128+
129+### Pointers
130+
131+```go
132+func main () {
133+  b := *getPointer()
134+  fmt.Println("Value is", b)
135+}
136+```
137+{: data-line="2"}
138+
139+```go
140+func getPointer () (myPointer *int) {
141+  a := 234
142+  return &a
143+}
144+```
145+{: data-line="3"}
146+
147+```go
148+a := new(int)
149+*a = 234
150+```
151+{: data-line="2"}
152+
153+Pointers point to a memory location of a variable. Go is fully garbage-collected.
154+
155+See: [Pointers](https://tour.golang.org/moretypes/1)
156+
157+### Type conversions
158+
159+```go
160+i := 2
161+f := float64(i)
162+u := uint(i)
163+```
164+
165+See: [Type conversions](https://tour.golang.org/basics/13)
166+
167+## Flow control
168+{: .-three-column}
169+
170+### Conditional
171+
172+```go
173+if day == "sunday" || day == "saturday" {
174+  rest()
175+} else if day == "monday" && isTired() {
176+  groan()
177+} else {
178+  work()
179+}
180+```
181+{: data-line="1,3,5"}
182+
183+See: [If](https://tour.golang.org/flowcontrol/5)
184+
185+### Statements in if
186+
187+```go
188+if _, err := doThing(); err != nil {
189+  fmt.Println("Uh oh")
190+}
191+```
192+{: data-line="1"}
193+
194+A condition in an `if` statement can be preceded with a statement before a `;`. Variables declared by the statement are only in scope until the end of the `if`.
195+
196+See: [If with a short statement](https://tour.golang.org/flowcontrol/6)
197+
198+### Switch
199+
200+```go
201+switch day {
202+  case "sunday":
203+    // cases don't "fall through" by default!
204+    fallthrough
205+
206+  case "saturday":
207+    rest()
208+
209+  default:
210+    work()
211+}
212+```
213+
214+See: [Switch](https://github.com/golang/go/wiki/Switch)
215+
216+### For loop
217+
218+```go
219+for count := 0; count <= 10; count++ {
220+  fmt.Println("My counter is at", count)
221+}
222+```
223+
224+See: [For loops](https://tour.golang.org/flowcontrol/1)
225+
226+### For-Range loop
227+
228+```go
229+entry := []string{"Jack","John","Jones"}
230+for i, val := range entry {
231+  fmt.Printf("At position %d, the character %s is present\n", i, val)
232+}
233+```
234+
235+See: [For-Range loops](https://gobyexample.com/range)
236+
237+### While loop
238+
239+```go
240+n := 0
241+x := 42
242+for n != x {
243+  n := guess()
244+}
245+```
246+
247+See: [Go's "while"](https://tour.golang.org/flowcontrol/3)
248+
249+## Functions
250+{: .-three-column}
251+
252+### Lambdas
253+
254+```go
255+myfunc := func() bool {
256+  return x > 10000
257+}
258+```
259+{: data-line="1"}
260+
261+Functions are first class objects.
262+
263+### Multiple return types
264+
265+```go
266+a, b := getMessage()
267+```
268+
269+```go
270+func getMessage() (a string, b string) {
271+  return "Hello", "World"
272+}
273+```
274+{: data-line="2"}
275+
276+
277+### Named return values
278+
279+```go
280+func split(sum int) (x, y int) {
281+  x = sum * 4 / 9
282+  y = sum - x
283+  return
284+}
285+```
286+{: data-line="4"}
287+
288+By defining the return value names in the signature, a `return` (no args) will return variables with those names.
289+
290+See: [Named return values](https://tour.golang.org/basics/7)
291+
292+## Packages
293+{: .-three-column}
294+
295+### Importing
296+
297+```go
298+import "fmt"
299+import "math/rand"
300+```
301+
302+```go
303+import (
304+  "fmt"        // gives fmt.Println
305+  "math/rand"  // gives rand.Intn
306+)
307+```
308+
309+Both are the same.
310+
311+See: [Importing](https://tour.golang.org/basics/1)
312+
313+### Aliases
314+
315+```go
316+import r "math/rand"
317+```
318+{: data-line="1"}
319+
320+```go
321+r.Intn()
322+```
323+
324+### Exporting names
325+
326+```go
327+func Hello () {
328+  ···
329+}
330+```
331+
332+Exported names begin with capital letters.
333+
334+See: [Exported names](https://tour.golang.org/basics/3)
335+
336+### Packages
337+
338+```go
339+package hello
340+```
341+
342+Every package file has to start with `package`.
343+
344+## Concurrency
345+{: .-three-column}
346+
347+### Goroutines
348+
349+```go
350+func main() {
351+  // A "channel"
352+  ch := make(chan string)
353+
354+  // Start concurrent routines
355+  go push("Moe", ch)
356+  go push("Larry", ch)
357+  go push("Curly", ch)
358+
359+  // Read 3 results
360+  // (Since our goroutines are concurrent,
361+  // the order isn't guaranteed!)
362+  fmt.Println(<-ch, <-ch, <-ch)
363+}
364+```
365+{: data-line="3,6,7,8,13"}
366+
367+```go
368+func push(name string, ch chan string) {
369+  msg := "Hey, " + name
370+  ch <- msg
371+}
372+```
373+{: data-line="3"}
374+
375+Channels are concurrency-safe communication objects, used in goroutines.
376+
377+See: [Goroutines](https://tour.golang.org/concurrency/1), [Channels](https://tour.golang.org/concurrency/2)
378+
379+### Buffered channels
380+
381+```go
382+ch := make(chan int, 2)
383+ch <- 1
384+ch <- 2
385+ch <- 3
386+// fatal error:
387+// all goroutines are asleep - deadlock!
388+```
389+{: data-line="1"}
390+
391+Buffered channels limit the amount of messages it can keep.
392+
393+See: [Buffered channels](https://tour.golang.org/concurrency/3)
394+
395+### Closing channels
396+
397+#### Closes a channel
398+
399+```go
400+ch <- 1
401+ch <- 2
402+ch <- 3
403+close(ch)
404+```
405+{: data-line="4"}
406+
407+#### Iterates across a channel until its closed
408+
409+```go
410+for i := range ch {
411+  ···
412+}
413+```
414+{: data-line="1"}
415+
416+#### Closed if `ok == false`
417+
418+```go
419+v, ok := <- ch
420+```
421+
422+See: [Range and close](https://tour.golang.org/concurrency/4)
423+
424+### WaitGroup
425+
426+```go
427+import "sync"
428+
429+func main() {
430+  var wg sync.WaitGroup
431+  
432+  for _, item := range itemList {
433+    // Increment WaitGroup Counter
434+    wg.Add(1)
435+    go doOperation(&wg, item)
436+  }
437+  // Wait for goroutines to finish
438+  wg.Wait()
439+  
440+}
441+```
442+{: data-line="1,4,8,12"}
443+
444+```go
445+func doOperation(wg *sync.WaitGroup, item string) {
446+  defer wg.Done()
447+  // do operation on item
448+  // ...
449+}
450+```
451+{: data-line="2"}
452+
453+A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. The goroutine calls `wg.Done()` when it finishes.
454+See: [WaitGroup](https://golang.org/pkg/sync/#WaitGroup)
455+
456+
457+## Error control
458+
459+### Defer
460+
461+```go
462+func main() {
463+  defer fmt.Println("Done")
464+  fmt.Println("Working...")
465+}
466+```
467+{: data-line="2"}
468+
469+Defers running a function until the surrounding function returns.
470+The arguments are evaluated immediately, but the function call is not ran until later.
471+
472+See: [Defer, panic and recover](https://blog.golang.org/defer-panic-and-recover)
473+
474+### Deferring functions
475+
476+```go
477+func main() {
478+  defer func() {
479+    fmt.Println("Done")
480+  }()
481+  fmt.Println("Working...")
482+}
483+```
484+{: data-line="2,3,4"}
485+
486+Lambdas are better suited for defer blocks.
487+
488+```go
489+func main() {
490+  var d = int64(0)
491+  defer func(d *int64) {
492+    fmt.Printf("& %v Unix Sec\n", *d)
493+  }(&d)
494+  fmt.Print("Done ")
495+  d = time.Now().Unix()
496+}
497+```
498+{: data-line="3,4,5"}
499+The defer func uses current value of d, unless we use a pointer to get final value at end of main.
500+
501+## Structs
502+{: .-three-column}
503+
504+### Defining
505+
506+```go
507+type Vertex struct {
508+  X int
509+  Y int
510+}
511+```
512+{: data-line="1,2,3,4"}
513+
514+```go
515+func main() {
516+  v := Vertex{1, 2}
517+  v.X = 4
518+  fmt.Println(v.X, v.Y)
519+}
520+```
521+
522+See: [Structs](https://tour.golang.org/moretypes/2)
523+
524+### Literals
525+
526+```go
527+v := Vertex{X: 1, Y: 2}
528+```
529+
530+```go
531+// Field names can be omitted
532+v := Vertex{1, 2}
533+```
534+
535+```go
536+// Y is implicit
537+v := Vertex{X: 1}
538+```
539+
540+You can also put field names.
541+
542+### Pointers to structs
543+
544+```go
545+v := &Vertex{1, 2}
546+v.X = 2
547+```
548+
549+Doing `v.X` is the same as doing `(*v).X`, when `v` is a pointer.
550+
551+## Methods
552+
553+### Receivers
554+
555+```go
556+type Vertex struct {
557+  X, Y float64
558+}
559+```
560+
561+```go
562+func (v Vertex) Abs() float64 {
563+  return math.Sqrt(v.X * v.X + v.Y * v.Y)
564+}
565+```
566+{: data-line="1"}
567+
568+```go
569+v := Vertex{1, 2}
570+v.Abs()
571+```
572+
573+There are no classes, but you can define functions with _receivers_.
574+
575+See: [Methods](https://tour.golang.org/methods/1)
576+
577+### Mutation
578+
579+```go
580+func (v *Vertex) Scale(f float64) {
581+  v.X = v.X * f
582+  v.Y = v.Y * f
583+}
584+```
585+{: data-line="1"}
586+
587+```go
588+v := Vertex{6, 12}
589+v.Scale(0.5)
590+// `v` is updated
591+```
592+
593+By defining your receiver as a pointer (`*Vertex`), you can do mutations.
594+
595+See: [Pointer receivers](https://tour.golang.org/methods/4)
596+
597+## Interfaces
598+
599+### A basic interface
600+
601+```go
602+type Shape interface {
603+  Area() float64
604+  Perimeter() float64
605+}
606+```
607+
608+### Struct
609+
610+```go
611+type Rectangle struct {
612+  Length, Width float64
613+}
614+```
615+
616+Struct `Rectangle` implicitly implements interface `Shape` by implementing all of its methods.
617+
618+### Methods
619+
620+```go
621+func (r Rectangle) Area() float64 {
622+  return r.Length * r.Width
623+}
624+
625+func (r Rectangle) Perimeter() float64 {
626+  return 2 * (r.Length + r.Width)
627+}
628+```
629+
630+The methods defined in `Shape` are implemented in `Rectangle`.
631+
632+### Interface example
633+
634+```go
635+func main() {
636+  var r Shape = Rectangle{Length: 3, Width: 4}
637+  fmt.Printf("Type of r: %T, Area: %v, Perimeter: %v.", r, r.Area(), r.Perimeter())
638+}
639+```
640+
641+## References
642+
643+### Official resources
644+{: .-intro}
645+
646+- [A tour of Go](https://tour.golang.org/welcome/1) _(tour.golang.org)_
647+- [Golang wiki](https://github.com/golang/go/wiki/) _(github.com)_
648+- [Effective Go](https://golang.org/doc/effective_go.html) _(golang.org)_
649+
650+### Other links
651+{: .-intro}
652+
653+- [Go by Example](https://gobyexample.com/) _(gobyexample.com)_
654+- [Awesome Go](https://awesome-go.com/) _(awesome-go.com)_
655+- [JustForFunc Youtube](https://www.youtube.com/channel/UC_BzFbxG2za3bp5NRRRXJSw) _(youtube.com)_
656+- [Style Guide](https://github.com/golang/go/wiki/CodeReviewComments) _(github.com)_
657+
658+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
659+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/goby.md
+1277, -0
   1@@ -0,0 +1,1277 @@
   2+---
   3+title: Goby
   4+layout: 2017/sheet
   5+prism_languages: [ruby]
   6+weight: -3
   7+updated: 2018-12-06
   8+category: Ruby
   9+intro: |
  10+  Goby's language design is based on Ruby language's, slim and shaped up. Differences in syntax between them is very small.
  11+---
  12+
  13+
  14+## Getting started
  15+
  16+### Hello world
  17+{: .-prime}
  18+
  19+#### hello.gb
  20+{: .-file}
  21+
  22+```ruby
  23+class Greet
  24+  attr_accessor :audience, :head, :tail
  25+  
  26+  def initialize
  27+    @head = "Hello, "
  28+    @tail = "!"
  29+  end
  30+
  31+  def name
  32+    audience.name
  33+  end
  34+
  35+  def say
  36+    puts head + name + tail
  37+  end
  38+end
  39+
  40+module MyName
  41+  attr_reader :name
  42+
  43+  def initialize
  44+    @name = self.class.to_s
  45+  end
  46+end
  47+
  48+class World
  49+  include MyName
  50+end
  51+
  52+greet = Greet.new
  53+greet.audience = World.new
  54+greet.say
  55+```
  56+
  57+Then run:
  58+
  59+```bash
  60+$ goby hello.gb
  61+#=> Hello, World!
  62+```
  63+
  64+### REPL (igb)
  65+
  66+```bash
  67+$ goby -i
  68+```
  69+
  70+* `reset`: reset the VM
  71+* `exit`: exit REPL
  72+* `help`: show help
  73+* ctrl-c: cancel the block entered, or exit (on top level)
  74+
  75+See [igb manual & test script](https://github.com/goby-lang/goby/blob/master/igb/manual_test.md). You can use `readline` features such as command history by arrow keys.
  76+
  77+## Variables
  78+{: .-three-column}
  79+
  80+### Local variable
  81+
  82+```ruby
  83+zip101 = "233-7383"
  84+magic_number = 42
  85+```
  86+
  87+Should be "`[a-z][a-z0-9_]+`"(snake_case).
  88+
  89+### Instance variable
  90+
  91+```ruby
  92+module State
  93+  def initialize(state)
  94+    @state = state      # declaring an instance variable by assignment
  95+  end
  96+  def show
  97+    @state              # accessible from other instance methods
  98+  end
  99+end
 100+
 101+state = State.new "success"
 102+state.show
 103+#=> success
 104+```
 105+
 106+Should be "`@[a-z][a-z0-9_]+`"(snake_case).
 107+
 108+### Multiple assignment
 109+
 110+```ruby
 111+# array literal
 112+a, b, c = [1, 2, 3]
 113+
 114+# array with '*'
 115+a = [1, 2, 3]
 116+x, y, z = *a
 117+
 118+# array literal with '*'
 119+a, b, c = *[1, 2, 3]
 120+
 121+# bare assignment: unsupported
 122+a, b, c = 1, 2, 3  #=> unexpected 3 Line: 0
 123+```
 124+
 125+### Black hole variable
 126+
 127+```ruby
 128+# '_' is write-only
 129+a, _ = [1, 2]
 130+```
 131+
 132+### Class variable
 133+
 134+Unsupported.
 135+
 136+### Global variable
 137+
 138+Unsupported.
 139+
 140+## Method definition
 141+
 142+### Method definition and calling
 143+
 144+```ruby
 145+def foo_bar?(baz)
 146+  if baz == "Hi, Goby!"
 147+    true
 148+  else
 149+    false
 150+  end
 151+end
 152+
 153+foo_bar? "Hi, Goby!" #=> true
 154+```
 155+
 156+Method name should be "`[a-z][a-z0-9_]+\??`" (snake_case). You can omit the trailing "`()`" only if no parameters are taken. Trailing using "`!`" is **unsupported**.
 157+
 158+### Order of method parameter
 159+
 160+```ruby
 161+def foo(normal, default="value", hash={}, ary=[], keyword:, keyword_default:"key", *sprat)
 162+end
 163+```
 164+
 165+If a default value is provided to a parameter, the parameter can be omitted when calling. `()` can be omitted. The order of parameters in method definition is restricted as follows:
 166+
 167+1. **normal parameters** (like `a`)
 168+2. **normal parameters with default value** (like `a=1`)
 169+3. **optional parameters** (array or hash, like `ary=[]` or `hs={}`)
 170+4. **keyword parameters** (like `kwd:`) 
 171+5. **keyword parameters with default value** (like `kwd: 1` or `ary: [1,2,3]` or `hsh: {key: "value"}`)
 172+6. **splat parameters** (like `*sp`)
 173+
 174+Or you will receive an error.
 175+
 176+### Keyword parameter (WIP)
 177+
 178+```ruby
 179+def foo(process:, verb: :GET, opt:{ csp: :enabled }, ary: [1, 2, 3])
 180+end
 181+```
 182+
 183+### Returning value
 184+
 185+```ruby
 186+PI = 3.14
 187+def area(radius)
 188+  radius * PI      # returns the result of evaluation
 189+end
 190+
 191+area 6             #=> 18.84
 192+```
 193+
 194+### Returning multiple value
 195+
 196+```ruby
 197+def my_array
 198+  [1, 2, 3]
 199+end
 200+
 201+my_array   #=> [1, 2, 3]
 202+```
 203+
 204+### Instance method
 205+
 206+```ruby
 207+module Foo
 208+  def bar       # defining instance method
 209+    puts "bar"
 210+  end
 211+  
 212+  def baz(count, email: "goby@example.com")
 213+    count.times do
 214+      puts email
 215+    end
 216+  end
 217+end
 218+
 219+foo = Foo.new
 220+foo.bar     #=> bar
 221+foo.baz(3)  #↓
 222+goby@example.com
 223+goby@example.com
 224+goby@example.com
 225+```
 226+
 227+### Singleton method #1
 228+
 229+```ruby
 230+str = "Goby"
 231+def str.foo     #1 singleton method on the object
 232+  self * 2
 233+end
 234+
 235+str.foo
 236+#=> GobyGoby
 237+```
 238+
 239+### Singleton method #2
 240+
 241+```ruby
 242+module Foo
 243+  def self.bar  #2 singleton method with `self.`
 244+    92
 245+  end
 246+end
 247+```
 248+
 249+### Singleton method #3
 250+
 251+```ruby
 252+module Foo  
 253+  def Foo.bar   #3 singleton method with a class name (unrecommended)
 254+    88
 255+  end
 256+end
 257+```
 258+
 259+### Singleton method #4
 260+
 261+```ruby
 262+module Foo end
 263+
 264+def Foo.bar     #4 singleton methods outside the Foo
 265+  9999
 266+end
 267+
 268+Foo.bar #=> 9999
 269+```
 270+
 271+### Attribute accessor method
 272+
 273+```ruby
 274+class Foo
 275+  attr_accessor :bar, :baz
 276+
 277+  def initialize
 278+    @bar = 42
 279+    @baz = 99
 280+  end
 281+end
 282+
 283+foo = Foo.new
 284+
 285+foo.bar = 77
 286+foo.baz = 88
 287+```
 288+
 289+You can use the following shorthands to declare attribute accessor methods in classes/modules:
 290+
 291+* `attr_accessor`
 292+* `attr_reader`
 293+* `attr_writer`
 294+
 295+### Private method (to be implemented)
 296+
 297+```ruby
 298+class Foo
 299+  def bar
 300+    42
 301+  end
 302+  
 303+  def _baz  # leading '_' means private method
 304+    99
 305+  end
 306+end
 307+```
 308+
 309+## Module/Class definition
 310+{: .-three-column}
 311+
 312+### Module definition and `include`
 313+
 314+```ruby
 315+module Foo
 316+  def foo
 317+    "Foo's instance method"
 318+  end
 319+end
 320+
 321+class Bar
 322+  include Foo   # to include Foo
 323+end
 324+
 325+Bar.new.foo     #=> Foo's instance method
 326+```
 327+
 328+Module names should be "`[A-Z][A-Za-z0-9_]+`" (UpperCamelCase). Modules cannot be inherited.
 329+
 330+### Module definition and `extend`
 331+
 332+```ruby
 333+module Foo
 334+  def foo
 335+    "Foo's instance method will be a singleton method"
 336+  end
 337+end
 338+
 339+class Bar
 340+  extend Foo   # to extend Foo  
 341+end
 342+
 343+Bar.foo        #=> Foo's instance method will be a singleton method
 344+```
 345+
 346+`extend` is to use the instance methods in the specified modules as **singleton methods** in your class or module. 
 347+
 348+### Module instantiation
 349+
 350+```ruby
 351+module Foo   #module definition
 352+  def foo   
 353+    99
 354+  end
 355+end
 356+
 357+Foo.new.foo  #=> 99
 358+```
 359+
 360+Actually, Goby's module can be even **instantiated** via "`new`" like "`Foo.new`".
 361+
 362+### Class definition and inheritance
 363+
 364+```ruby
 365+class Foo       # class definition
 366+  def bar
 367+    99
 368+  end
 369+end
 370+
 371+class Baz < Foo # inheritance
 372+end
 373+
 374+Baz.new.bar  #=> 99
 375+```
 376+
 377+Class names should be "`[A-Z][A-Za-z0-9]+`" (UpperCamelCase). Inheritance with "`<`" is supported.
 378+
 379+### Constants
 380+
 381+```ruby
 382+HTTP_ERROR_404 = 404
 383+HTTP_ERROR_404 = 500    # error
 384+```
 385+
 386+Constants should be "`[A-Z][A-Za-z0-9_]+`" (UPPER_SNAKECASE). Constants are **not reentrant** and the scope is **global**.
 387+
 388+### Redefining class/modules
 389+
 390+```ruby
 391+class Foo
 392+  def bar
 393+    99
 394+  end
 395+end
 396+
 397+class Foo
 398+  def bar  # redefining is possible
 399+    77
 400+  end
 401+end
 402+```
 403+
 404+### Namespaces
 405+
 406+```ruby
 407+class Foo
 408+  module Bar
 409+    MAGIC = 99
 410+    def baz
 411+      99
 412+    end
 413+  end
 414+end
 415+
 416+Foo::Bar.new.baz     # Use '::' for namespacing
 417+Foo::Bar::MAGIC      # Use '::' for namespacing
 418+```
 419+
 420+## Load library
 421+
 422+### `require`
 423+
 424+```ruby
 425+require("uri")   # to activate URL class
 426+
 427+u = URI.parse("http://example.com")
 428+u.scheme   #=> "http"
 429+```	
 430+
 431+### `require_relative`
 432+
 433+```ruby
 434+require_relative("bar")  # loading the local bar.gb
 435+
 436+class Foo
 437+  def self.bar(x)
 438+    Bar.foo do |ten|
 439+      x * ten
 440+    end
 441+  end
 442+
 443+  def self.baz
 444+    yield(100)
 445+  end
 446+end
 447+```
 448+
 449+## Literal
 450+{: .-three-column}
 451+
 452+### Keyword
 453+
 454+`def`, `true`, `false`, `nil`, `if`, `elsif`, `else`, `case`, `when`, `return`, `self`, `end`, `while`, `do`, `yield`, `get_block`, `next`, `class`, `module`, `break`
 455+
 456+### String literal
 457+
 458+```ruby
 459+"double quote"
 460+'single quote'
 461+```
 462+
 463+Double and single quotation can be used.
 464+
 465+### Symbol literal
 466+
 467+```ruby
 468+:symbol           # equivalent to "symbol"
 469+{ symbol: "value" }
 470+```
 471+
 472+Goby's symbol (using `:`) is always `String` class.
 473+
 474+### Numeric literal
 475+
 476+```ruby
 477+year   =  2018   # Integer
 478+offset = -42     # Integer
 479+PI     = 3.14    # Float
 480+G      = -9.8    # Float
 481+```
 482+
 483+### Array literal
 484+
 485+```ruby
 486+[1, 2, 3, "hello", :goby, { key: "value"}]
 487+[1, 2, [3, 4], 5, 6]
 488+```
 489+
 490+### Hash literal
 491+
 492+```ruby
 493+h = { key: "value", key2: "value2" }
 494+h[:key2]   #=> value2
 495+```
 496+
 497+Hash literal's keys should always be **symbol literals**. 
 498+
 499+### Range literal
 500+
 501+```ruby
 502+(1..10).each do |x|    # '..' represents a range
 503+  puts x*x
 504+end
 505+```
 506+
 507+### Boolean and `nil`
 508+
 509+```ruby
 510+true       # Boolean class
 511+false      # Boolean class
 512+nil        # Null class
 513+
 514+!nil  #=> true
 515+```
 516+
 517+Any objects except `nil` and `false` will be treated as `true` on conditionals.
 518+
 519+## Operator
 520+
 521+### Arithmetic/logical/assignment operators
 522+
 523+```ruby
 524++           # unary
 525+**          # power
 526+-           # unary
 527+* / %       # multiplication, division, modulus
 528++ -         # addition, subtraction
 529+!           # logical inversion
 530+> >= < <=   # inequality comparison
 531+== !=       # equality comparison, negative comparison
 532+&&          # logical AND
 533+||          # logical OR
 534++= -=       # shorthand of addition/subtraction
 535+=           # assignment
 536+```
 537+
 538+*Priority of operators are TBD
 539+
 540+### Other operators
 541+
 542+```ruby
 543+()          # chaning priority of interpretation
 544+[]          # array literal
 545+*           # multiple assignment
 546+..          # range
 547+```
 548+
 549+*Priority of operators are TBD
 550+
 551+### Delimiter
 552+
 553+```ruby
 554+class Foo; end   # ';' to delimit
 555+
 556+class Bar end    # recommended
 557+```
 558+
 559+### String interpolation (to be implemented)
 560+
 561+```ruby
 562+puts "Error: #{error_message}"  # double quotation is required
 563+```
 564+
 565+### Comment
 566+
 567+```ruby
 568+puts "Goby"    # comments
 569+```
 570+
 571+Use the annotations to keep the comments concise.
 572+
 573+- `TODO`
 574+- `FIXME`
 575+- `OPTIMIZE`
 576+- `HACK`
 577+- `REVIEW`
 578+
 579+### I/O
 580+
 581+* `#puts`
 582+
 583+* special constants: `ARGV`, `STDIN`, `STDOUT`, `STDERR`, `ENV` 
 584+
 585+## Flow control
 586+{: .-three-column}
 587+
 588+### `if`, `else`, `elsif`
 589+
 590+```ruby
 591+def foo(str)
 592+  if str.size > 10
 593+    puts "too big!"
 594+  elsif str.size < 3
 595+    puts "too short!"
 596+  else
 597+    puts "moderate"
 598+  end
 599+end
 600+```
 601+
 602+`then` is **not** supported.
 603+
 604+### Break
 605+
 606+```ruby
 607+def foo(tail)
 608+  (5..tail).each do |t|
 609+    if t % 2 == 0 && t % 5 == 0
 610+      puts "ouch!"
 611+      break       # finish the block
 612+    else
 613+      puts t
 614+    end
 615+  end
 616+  puts "out of the block"
 617+end
 618+
 619+foo 20
 620+#=> 5 6 7 8 9
 621+#=> ouch!
 622+#=> out of the block
 623+```
 624+
 625+### Case
 626+
 627+```ruby
 628+def foo(str)
 629+  case str
 630+  when "Elf"
 631+    puts "You might be Aragorn II!"
 632+  when "Aragorn"
 633+    puts "Long time no see, Aragorn!"
 634+  when "Frodo", "Sam", "Gandalf"
 635+    puts "One of us!"
 636+  else
 637+    puts "You're not yourself"
 638+  end
 639+end
 640+```
 641+
 642+### While
 643+
 644+```ruby
 645+decr = 10
 646+while decr do
 647+  if decr < 1
 648+    break
 649+  end
 650+  puts decr
 651+  decr -= 1
 652+end
 653+```
 654+
 655+`while`, conditional and a `do`/`end` block can be used for a loop.
 656+
 657+### Rescue
 658+
 659+Under construction. Join [#605](https://github.com/goby-lang/goby/issues/605).
 660+
 661+## Block
 662+{: .-three-column}
 663+
 664+### Block
 665+
 666+```ruby
 667+def foo(ary: [1, 2, 3])
 668+  ary.each do |s|      # start of the block with |block variable|
 669+    puts s
 670+  end                  # end of the block
 671+end
 672+```
 673+
 674+`{ }` cannot be used for forming a block.
 675+
 676+### `yield`
 677+
 678+```ruby
 679+def foo
 680+  yield(10)  # executes the block given
 681+end
 682+
 683+foo do |ten|
 684+  ten + 20
 685+end
 686+```
 687+
 688+### Block object and `call`
 689+
 690+```ruby
 691+b = Block.new do
 692+  100
 693+end
 694+
 695+b.call  #=> 100
 696+```
 697+
 698+`Block.new` can take a block and then `call`.
 699+
 700+### Passing a block
 701+
 702+```ruby
 703+def baz
 704+  1000
 705+end
 706+
 707+class Foo
 708+  def exec_block(block)
 709+	block.call
 710+  end
 711+
 712+  def baz
 713+    100
 714+  end
 715+end
 716+
 717+b = Block.new do
 718+  baz
 719+end
 720+
 721+f = Foo.new
 722+f.exec_block(b)
 723+```
 724+
 725+### Passing a block with block arguments
 726+
 727+```ruby
 728+b = Block.new do |arg, offset|
 729+  arg + 1000 - offset
 730+end
 731+
 732+b.call(49, 500) #=> 549
 733+```
 734+
 735+### Special `get_block` keyword
 736+
 737+```ruby
 738+def bar(block)
 739+  # runs the block object and the block arg simultaneously
 740+  block.call + get_block.call
 741+end
 742+
 743+def foo
 744+  bar(get_block) do # passes two blocks to `bar`
 745+    20
 746+  end
 747+end
 748+
 749+foo do
 750+  10
 751+end
 752+```
 753+
 754+`get_block` is not a method but a **keyword** to retrive a given block argument as a block object. By this, you can pass around or `call` the given block arguments as block objects. 
 755+
 756+### Closure
 757+
 758+```ruby
 759+count = 0          # the declaration is used
 760+b = Block.new do
 761+  count += 1       # the block looks preserving the `count`
 762+end
 763+
 764+class Foo
 765+  def bar(blk)
 766+    count = 9      # (does not affect)
 767+    puts blk.call  # local variable is resolved to the one above
 768+  end
 769+end
 770+
 771+Foo.new.bar b  #=> 1
 772+Foo.new.bar b  #=> 2
 773+Foo.new.bar b  #=> 3
 774+```
 775+
 776+## Native class (Primary)
 777+{: .-three-column}
 778+
 779+Goby's most "native" classes cannot instantiate with `new` in principle. 
 780+
 781+### `Object`
 782+
 783+```ruby
 784+Bar.ancestors
 785+#» [Bar, Foo, Object]
 786+Bar.singleton_class.ancestors
 787+#» [#<Class:Bar>, #<Class:Object>, Class, Object]
 788+```
 789+
 790+`Object` is actually just for creating singleton classes. See `Class`.
 791+
 792+* **`Object.methods`**: `!`, `!=`, `==`, `block_given?`, `class`, `exit`, `instance_eval`, `instance_variable_get`, `instance_variable_set`, `is_a?`, `methods`, `nil?`, `object_id`, `puts`, `raise`, `require`, `require_relative`, `send`, `singleton_class`, `sleep`, `thread`, `to_s`, `<`, `<=`, `>`, `>=`, `ancestors`, `attr_accessor`, `attr_reader`, `attr_writer`, `extend`, `include`, `name`, `new`, `superclass`
 793+
 794+* **`Object.new.methods`**: `!`, `!=`, `==`, `block_given?`, `class`, `exit`, `instance_eval`, `instance_variable_get`, `instance_variable_set`, `is_a?`, `methods`, `nil?`, `object_id`, `puts`, `raise`, `require`, `require_relative`, `send`, `singleton_class`, `sleep`, `thread`, `to_s`
 795+
 796+### `Class`
 797+
 798+```ruby
 799+String.ancestors      #=> [String, Object]
 800+```
 801+
 802+`Class` and `Object`can actually be regarded as the same and you don't need to distinguish them in almost all the cases. 
 803+
 804+* **`Class.methods`**: `<`, `<=`, `>`, `>=`, `ancestors`, `attr_accessor`, `attr_reader`, `attr_writer`, `extend`, `include`, `name`, `new`, `superclass`, `!`, `!=`, `==`, `block_given?`, `class`, `exit`, `instance_eval`, `instance_variable_get`, `instance_variable_set`, `is_a?`, `methods`, `nil?`, `object_id`, `puts`, `raise`, `require`, `require_relative`, `send`, `singleton_class`, `sleep`, `thread`, `to_s`
 805+
 806+### `String`
 807+
 808+```ruby
 809+puts "Hello" + ' ' + 'world'  #=> Hello world
 810+```
 811+
 812+Fixed to **UTF-8** with mb4 support.
 813+
 814+* **`String.methods`**: `fmt`,
 815+    * the rest: `Class.methods`
 816+* **`"a".methods`**:  `!=`, `*`, `+`, `<`, `<=>`, `==`, `=~`, `>`, `[]`, `[]=`, `capitalize`, `chop`, `concat`, `count`, `delete`, `downcase`, `each_byte`, `each_char`, `each_line`, `empty?`, `end_with?`, `eql?`, `fmt`, `include?`, `insert`, `length`, `ljust`, `match`, `new`, `replace`, `replace_once`, `reverse`, `rjust`, `size`, `slice`, `split`, `start_with`, `strip`, `to_a`, `to_bytes`, `to_d`, `to_f`, `to_i`, `to_s`, `upcase`,
 817+    * the rest: `Object.new.methods`
 818+
 819+### `Integer`
 820+
 821+```ruby
 822+37037 * 27      #=> 999999
 823+```
 824+
 825+* **`Integer.methods`**: the same as `Class.methods`
 826+* **`1.methods`**: `!=`, `%`, `*`, `**`, `+`, `-`, `/`, `<`, `<=`, `<=>`, `==`, `>`, `>=`, `even?`, `new`, `next`, `odd?`, `pred`, `ptr`, `times`, `to_f`, `to_float32`, `to_float64`, `to_i`, `to_int`, `to_int16`, `to_int32`, `to_int64`, `to_int8`, `to_s`, `to_uint`, `to_uint16`, `to_uint32`, `to_uint64`, `to_uint8`
 827+    * the rest: `Object.new.methods`
 828+
 829+### `Array`
 830+
 831+```ruby
 832+[1, "2", :card, [4, 5], { john: "doe" }]
 833+```
 834+
 835+* **`Array.methods`**: the same as `Class.methods`
 836+* **`[1].methods`**: `*`, `+`, `[]`, `[]=`, `any?`, `at`, `clear`, `concat`, `count`, `delete_at`, `dig`, `each`, `each_index`, `empty?`, `first`, `flatten`, `include?`, `join`, `last`, `lazy`, `length`, `map`, `new`, `pop`, `push`, `reduce`, `reverse`, `reverse_each`, `rotate`, `select`, `shift`, `to_enum`, `unshift`, `values_at`
 837+    * the rest: `Object.new.methods`
 838+
 839+### `Hash`
 840+
 841+```ruby
 842+h = { key: "value" }
 843+h = { "key": "value" }  #=> error
 844+
 845+h["key"]  #=> value
 846+h[:key]   #=> value
 847+```
 848+
 849+Keys in hash literals should be **symbol literals**, while Hash index can be either string or symbol literals.
 850+
 851+* **`Hash.methods`**: the same as `Class.methods`
 852+* **`{ key: "value" }.methods`**: `[]`, `[]=`, `any?`, `clear`, `default`, `default=`, `delete`, `delete_if`, `dig`, `each`, `each_key`, `each_value`, `empty?`, `eql?`, `fetch`, `fetch_values`, `has_key?`, `has_value?`, `keys`, `length`, `map_values`, `merge`, `new`, `select`, `sorted_keys`, `to_a`, `to_json`, `to_s`, `transform_values`, `values`, `values_at`
 853+    * the rest: `Object.new.methods`
 854+
 855+### `Range`
 856+
 857+```ruby
 858+(1..10).each do |i|
 859+  puts i ** 2
 860+end
 861+```
 862+
 863+* **`Range.methods`**: the same as `Class.methods`
 864+* **`(1..10).methods`**: `!=`, `==`, `bsearch`, `each`, `first`, `include?`, `last`, `lazy`, `map`, `new`, `size`, `step`, `to_a`, `to_enum`
 865+    * the rest: `Object.new.methods`
 866+
 867+### `Block`
 868+
 869+```ruby
 870+b = Block.new do
 871+  100
 872+end
 873+
 874+b.call  #=> 100
 875+```
 876+
 877+* **`Block.methods`**: the same as `Class.methods`
 878+* **`(Block.new do end).methods`**: `call`
 879+    * the rest: `Object.new.methods`
 880+
 881+## Native class (secondary)
 882+{: .-three-column}
 883+
 884+### `Float`
 885+
 886+```ruby
 887+1.1 + 1.1   # => -2.2
 888+2.1 * -2.1  # => -4.41
 889+```
 890+
 891+Float literals like `3.14` or `-273.15`. `Float` class is based on Golang's `float64` type.
 892+
 893+* **`Float.methods`**: the same as `Class.methods`
 894+* **`3.14.methods`**: `!=`, `%`, `*`, `**`, `+`, `-`, `/`, `<`, `<=`, `<=>`, `==`, `>`, `>=`, `new`, `ptr`, `to_d`, `to_i`
 895+    * the rest: `Object.new.methods`
 896+
 897+### `Decimal`
 898+
 899+```ruby
 900+"3.14".to_d            # => 3.14
 901+"-0.7238943".to_d      # => -0.7238943
 902+"355/113".to_d         
 903+# => 3.1415929203539823008849557522123893805309734513274336283185840
 904+
 905+a = "16.1".to_d
 906+b = "1.1".to_d
 907+e = "17.2".to_d
 908+a + b # => 0.1
 909+a + b == e # => true
 910+
 911+('16.1'.to_d  + "1.1".to_d).to_s #=> 17.2
 912+('16.1'.to_f  + "1.1".to_f).to_s #=> 17.200000000000003
 913+```
 914+
 915+Experimental: the size is arbitrary and internally a fraction from Golang's `big.Rat` type. Decimal literal is TBD for now and you can get `Decimal` number via `to_d` method from `Integer`/`Float`/`String`.
 916+
 917+* **`Decimal.methods`**: the same as `Class.methods`
 918+* **`(1.1).to_d.methods`**: `!=`, `*`, `**`, `+`, `-`, `/`, `<`, `<=`, `<=>`, `==`, `>`, `>=`, `denominator`, `fraction`, `inverse`
 919+    * the rest: `Object.new.methods`
 920+
 921+### `Regexp`
 922+
 923+```ruby
 924+a = Regexp.new("orl")
 925+a.match?("Hello World")   #=> true
 926+a.match?("Hello Regexp")  #=> false
 927+
 928+b = Regexp.new("😏")
 929+b.match?("🤡 😏 😐")    #=> true
 930+b.match?("😝 😍 😊")    #=> false
 931+
 932+c = Regexp.new("居(ら(?=れ)|さ(?=せ)|る|ろ|れ(?=[ばる])|よ|(?=な[いかくけそ]|ま[しすせ]|そう|た|て))")
 933+c.match?("居られればいいのに")  #=> true
 934+c.match?("居ずまいを正す")      #=> false
 935+```
 936+
 937+Using `/ /` is to be implemented.
 938+
 939+* **`Regexp.methods`**: the same as `Class.methods`
 940+* **`Regexp.new("^aa$").methods`**: `==`, `match?`
 941+    * the rest: `Object.new.methods`
 942+
 943+### `MatchData`
 944+
 945+```ruby
 946+# numbered capture
 947+'abcd'.match(Regexp.new('(b.)'))
 948+#=> #<MatchData 0:"bc" 1:"bc">
 949+
 950+# named capture
 951+'abcd'.match(Regexp.new('a(?<first>b)(?<second>c)'))
 952+#=> #<MatchData 0:"abc" first:"b" second:"c">
 953+
 954+# converting to hash
 955+» 'abcd'.match(Regexp.new('a(?<first>b)(?<second>c)')).to_h
 956+#» { 0: "abc", first: "b", second: "c" }
 957+```
 958+
 959+The number keys in the captures are actually `String` class.The key `0` is the mached string.
 960+
 961+* **`MatchData.methods`**: the same as `Class.methods`
 962+* **`'abcd'.match(Regexp.new('(b.)')).methods`**: `captures`, `length`, `new`, `to_a`, `to_h`
 963+    * the rest: `Object.new.methods`
 964+
 965+### `File`
 966+
 967+```ruby
 968+f = File.new("../test_fixtures/file_test/size.gb")
 969+f.name  #=> "../test_fixtures/file_test/size.gb"
 970+```
 971+
 972+* **`File.methods`**: `basename`, `chmod`, `delete`, `exist?`, `extname`, `join`
 973+    * the rest: `Class.methods`
 974+* **`File.new.methods`**: `basename`, `chmod`, `close`, `delete`, `exist?`, `extname`, `join`, `name`
 975+    * the rest: `Object.new.methods`
 976+
 977+## Native class (Golang-oriented)
 978+{: .-three-column}
 979+
 980+### `GoMap`
 981+
 982+```ruby
 983+h = { foo: "bar" }
 984+m = GoMap.new(h)    # to pass values to Golang's code
 985+h2 = m.to_hash
 986+h2[:foo]   #=> "bar"
 987+```
 988+
 989+* **`GoMap.methods`**: the same as `Class.methods`
 990+* **`GoMap.new.methods`**: `get`, `set`, `to_hash`
 991+    * the rest: `Object.new.methods`
 992+
 993+### `Channel`
 994+
 995+```ruby
 996+c = Channel.new
 997+
 998+1001.times do |i| # i start from 0 to 1000
 999+  thread do
1000+  	c.deliver(i)
1001+  end
1002+end
1003+
1004+r = 0
1005+1001.times do
1006+  r = r + c.receive
1007+end
1008+
1009+r #=> 500500
1010+```
1011+
1012+`Channel` class is to hold channels to work with `#thread`. See `thread`.
1013+
1014+* **`Channel.methods`**: the same as `Class.methods`
1015+* **`Channel.new.methods`**: `close`, `deliver`, `new`, `receive`
1016+    * the rest: `Object.new.methods`
1017+
1018+## Enumerator & lazy
1019+
1020+Pretty new experimental library.
1021+
1022+### `LazyEnumerator`
1023+
1024+```ruby
1025+# creating a lazy enumerator
1026+enumerator = LazyEnumerator.new(ArrayEnumerator.new([1, 2, 3])) do |value|
1027+	2 * value
1028+end
1029+result = []
1030+
1031+enumerator.each do |value|
1032+	result.push(value)
1033+end
1034+
1035+result   #=> [2, 4, 6]
1036+```
1037+
1038+A shorthand `#lazy` method is also provided in `Array` and `Range` by now. See "Tips & tricks" below. 
1039+
1040+* **`LazyEnumerator.methods`**: the same as `Class.methods`
1041+* **`[1, 2].lazy`**: `each`, `first`, `has_next?`, `initialize`, `map`, `next`
1042+    * the rest: `Object.new.methods`
1043+
1044+### `ArrayEnumerator`
1045+
1046+```ruby
1047+iterated_values = []
1048+
1049+enumerator = ArrayEnumerator.new([1, 2, 4])
1050+
1051+while enumerator.has_next? do
1052+	iterated_values.push(enumerator.next)
1053+end
1054+
1055+iterated_values   #=> [1, 2, 4]
1056+```
1057+
1058+* **`ArrayEnumerator.methods`**: the same as `Class.methods`
1059+* **`ArrayEnumerator.new([1, 2, 3]).methods`**: `has_next?`, `initialize`, `next`
1060+    * the rest: `Object.new.methods`
1061+
1062+### `RangeEnumerator`
1063+
1064+```ruby
1065+iterated_values = []
1066+
1067+enumerator = RangeEnumerator.new((1..4))
1068+
1069+while enumerator.has_next? do
1070+	iterated_values.push(enumerator.next)
1071+end
1072+
1073+iterated_values   #=> [1, 2, 3, 4]
1074+```
1075+
1076+* **`RangeEnumerator.methods`**: the same as `Class.methods`
1077+* **`RangeEnumerator.new(1..2).methods`**: `has_next?`, `initialize`, `next`
1078+    * the rest: `Object.new.methods`
1079+
1080+## Special class
1081+
1082+### `Boolean`
1083+
1084+```ruby
1085+true.class  #=> Boolean
1086+false.class #=> Boolean
1087+```
1088+
1089+A special class that just to hold `true` and `false`. Cannot be instantiate.
1090+
1091+### `Null`
1092+
1093+```ruby
1094+nil.class   #=> Null
1095+```
1096+
1097+A special class that just to hold `nil`. Cannot be instantiate.
1098+
1099+### `Method`
1100+
1101+(A special dummy class that just holds methods defined by Goby code.)
1102+
1103+### `Diggable`
1104+
1105+Provides `#dig` method. Currently. `Array` and `Hash` classes' instance can be `Diggable`.
1106+
1107+```ruby
1108+[1, 2].dig(0, 1)  #=> TypeError: Expect target to be Diggable, got Integer
1109+```
1110+
1111+## Testing framework
1112+
1113+### `Spec`
1114+
1115+```ruby
1116+require "spec"
1117+
1118+Spec.describe Spec do
1119+  it "fails and exit with code 1" do
1120+	expect(1).to eq(2)
1121+  end
1122+end
1123+
1124+Spec.run
1125+```
1126+
1127+* **`Spec.methods`**: `describe`, `describes`, `instance`, `run`
1128+    * the rest: `Object.methods`
1129+* **`Spec.new.methods`**: `describes`, `initialize`, `run`, `session_successful`, `session_successful=`
1130+    * the rest: `Hash.new.methods`
1131+
1132+## Tips & tricks
1133+
1134+### Showing methods
1135+
1136+```ruby
1137+» "string".methods
1138+#» ["!=", "*", "+", "<", "<=>", "==", "=~", ">", "[]", "[]=", "capitalize", "chop", "concat", "count", "delete", "downcase", "each_byte", "each_char", "each_line", "empty?", "end_with?", "eql?", "fmt", "include?", "insert", "length", "ljust", "match", "new", "replace", "replace_once", "reverse", "rjust", "size", "slice", "split", "start_with", "strip", "to_a", "to_bytes", "to_d", "to_f", "to_i", "to_s", "upcase", "!", "block_given?", "class", "exit", "instance_eval", "instance_variable_get", "instance_variable_set", "is_a?", "methods", "nil?", "object_id", "puts", "raise", "require", "require_relative", "send", "singleton_class", "sleep", "thread"]
1139+```
1140+
1141+### Showing class
1142+
1143+```ruby
1144+» "string".class
1145+#» String
1146+```
1147+
1148+### Showing singleton class
1149+
1150+```ruby
1151+» "moji".singleton_class
1152+#» #<Class:#<String:842352325152>>
1153+
1154+» "moji".class.singleton_class
1155+#» #<Class:String>
1156+```
1157+
1158+### Showing ancestors
1159+
1160+```ruby
1161+» Integer.ancestors
1162+#» [Integer, Object]
1163+
1164+» "moji".class.ancestors
1165+#» [String, Object]
1166+```
1167+
1168+### Showing singleton classes' ancestors
1169+
1170+```ruby
1171+» "moji".class.singleton_class.ancestors
1172+#» [#<Class:String>, #<Class:Object>, Class, Object]
1173+```
1174+
1175+### Showing object's id
1176+
1177+```ruby
1178+» "moji".object_id
1179+#» 842352977920
1180+```
1181+
1182+### `#to_json`
1183+
1184+```ruby
1185+h = { a: 1, b: [1, "2", [4, 5, nil]]}
1186+h.to_json         # converts hash to JSON
1187+#=> {"a":1, "b":[1, "2", [4, 5, null]]}
1188+```
1189+
1190+### Customize `#to_json`
1191+
1192+Overwrite the `#to_json` in your class:
1193+
1194+```ruby
1195+class JobTitle
1196+  def initialize(name)
1197+    @name = name
1198+  end
1199+
1200+  def to_json
1201+    { title: @name }.to_json
1202+  end
1203+end
1204+
1205+class Person
1206+  def initialize(name, age)
1207+    @name = name
1208+    @age = age
1209+    @job = JobTitle.new("software engineer")
1210+  end
1211+
1212+  def to_json
1213+    { name: @name, age: @age, job: @job }.to_json
1214+  end
1215+end
1216+
1217+stan = Person.new("Stan", 23)
1218+h = { person: stan }
1219+h.to_json #=> {"person":{"name":"Stan","job":{"title":"software engineer"},"age":23}}
1220+```
1221+
1222+### Lazy enumeration
1223+
1224+To avoid N + 1 query.
1225+
1226+```ruby
1227+enumerator = [1, 2, 3].lazy.map do |value|
1228+	2 * value
1229+end
1230+result = []
1231+
1232+enumerator.each do |value|
1233+	result.push(value)
1234+end
1235+
1236+result  #=> [2, 4, 6]
1237+```	
1238+
1239+You can call `#lazy.map` on `Array`, `Range`, or `JSON` objects. 
1240+
1241+## Styling
1242+
1243+### Quick style guide
1244+
1245+* UTF-8 should be used.
1246+* Only two spaces `  ` should be used for one indentation.
1247+    * Tab cannot be used for indentation.
1248+* For more, follow [RuboCop's style guide](https://github.com/bbatsov/ruby-style-guide) in principle.
1249+
1250+### Document notation
1251+
1252+* `Class#instance_method` -- use `#` to represent instance methods in documents
1253+* `Class.class_method`
1254+* `Module.module_method`
1255+
1256+### Syntax highlighting
1257+
1258+Ready for Vim and Sublime text. You can also use Ruby's syntax highlighting so far.
1259+
1260+## References
1261+
1262+### Official
1263+
1264+* Official site: [https://goby-lang.org/](https://goby-lang.org/)
1265+* Repository: [https://github.com/goby-lang/goby/](https://github.com/goby-lang/goby/)
1266+* DevHints: [https://devhints.io/goby](https://devhints.io/goby) (this page)
1267+
1268+### Readings for Goby developers
1269+
1270+* [Write an Interpreter in Go](https://interpreterbook.com/)
1271+* [Nand2Tetris II](https://www.coursera.org/learn/nand2tetris2/home/welcome)
1272+* [Ruby under a microscope](http://patshaughnessy.net/ruby-under-a-microscope)
1273+* [YARV's instruction table](http://www.atdot.net/yarv/insnstbl.html)
1274+
1275+### JP resource
1276+
1277+* [Goby: Rubyライクな言語(1)Gobyを動かしてみる](https://techracho.bpsinc.jp/hachi8833/2017_11_10/47787)
1278+* [Gobyの組み込みクラスにメソッドを追加する方法](https://qiita.com/hanachin_/items/efc1c976a4f5749514ef)
A home/.config/micro/plug/cheat/cheatsheets/graphql.md
+273, -0
  1@@ -0,0 +1,273 @@
  2+---
  3+title: GraphQL
  4+layout: 2017/sheet
  5+updated: 2019-07-07
  6+category: API
  7+---
  8+
  9+## Intro
 10+
 11+## Queries
 12+{: .-three-column}
 13+
 14+### Basic query
 15+
 16+```js
 17+{ status }
 18+```
 19+
 20+#### ↓
 21+
 22+```js
 23+{ status: 'available' }
 24+```
 25+{: .-setup}
 26+
 27+### Nesting
 28+
 29+```js
 30+{ hero { name height } }
 31+```
 32+
 33+#### ↓
 34+
 35+```js
 36+{ hero:
 37+    { name: "Luke Skywalker",
 38+      height: 1.74 } }
 39+```
 40+{: .-setup}
 41+
 42+### Lists
 43+
 44+```js
 45+{ friends { name } }
 46+```
 47+
 48+#### ↓
 49+
 50+```js
 51+{ friends:
 52+    [ { name: "Luke Skywalker" },
 53+      { name: "Han Solo" },
 54+      { name: "R2D2" } ] }
 55+```
 56+{: .-setup}
 57+
 58+GraphQL queries look the same for both single items or lists of items.
 59+
 60+### Lookups
 61+
 62+```js
 63+{
 64+  hero(id: "1000") { id name }
 65+}
 66+```
 67+
 68+#### ↓
 69+
 70+```js
 71+{ hero:
 72+    { id: "1000",
 73+    { name: "Luke Skywalker" } }
 74+```
 75+{: .-setup}
 76+
 77+### Aliases
 78+
 79+```js
 80+{
 81+  luke: hero(id: "1000") { name }
 82+  han: hero(id: "1001") { name }
 83+}
 84+```
 85+
 86+#### ↓
 87+
 88+```js
 89+{ luke:
 90+    { name: "Luke Skywalker" },
 91+    han:
 92+    { name: "Han Solo" } }
 93+```
 94+{: .-setup}
 95+
 96+### Operation names and variables
 97+
 98+#### Query
 99+```js
100+query FindHero($id: String!) {
101+  hero(id: $id) { name }
102+}
103+```
104+
105+Just to make things less ambiguous. Also, to use variables, you need an operation name.
106+
107+#### Variables
108+
109+```js
110+{ id: '1000' }
111+```
112+
113+### Mutations
114+
115+#### Query
116+
117+```js
118+{ createReview($review) { id } }
119+```
120+
121+#### Variables
122+
123+```js
124+{ review: { stars: 5 } }
125+```
126+
127+#### ↓
128+
129+```js
130+{ createReview: { id: 5291 } }
131+```
132+
133+Mutations are just fields that do something when queried.
134+
135+### Multiple types
136+
137+```js
138+{
139+  search(q: "john") {
140+    id
141+    ... on User { name }
142+    ... on Comment { body author { name } }
143+  }
144+}
145+```
146+
147+Great for searching.
148+
149+
150+Over HTTP
151+---------
152+
153+#### GET
154+
155+```js
156+fetch('http://myapi/graphql?query={ me { name } }')
157+```
158+
159+#### POST
160+
161+```js
162+fetch('http://myapi/graphql', {
163+  body: JSON.stringify({
164+    query: '...',
165+    operationName: '...',
166+    variables: { ... }
167+  })
168+})
169+```
170+
171+Schema
172+------
173+{: .-three-column}
174+
175+### Basic schemas
176+
177+```js
178+type Query {
179+  me: User
180+  users(limit: Int): [User]
181+}
182+
183+type User {
184+  id: ID!
185+  name: String
186+}
187+```
188+
189+See: [sogko/graphql-shorthand-notation-cheat-sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png)
190+
191+### Built in types
192+
193+#### Scalar types
194+
195+| `Int` | Integer |
196+| `Float` | Float |
197+| `String` | String |
198+| `Boolean` | Boolean |
199+| `ID` | ID |
200+
201+#### Type definitions
202+
203+| `scalar` | Scalar type |
204+| `type` | Object type |
205+| `interface` | Interface type |
206+| `union` | Union type |
207+| `enum` | Enumerable type |
208+| `input` | Input object type |
209+
210+#### Type modifiers
211+
212+| `String` | Nullable string |
213+| `String!` | Required string |
214+| `[String]` | List of strings |
215+| `[String]!` | Required list of strings |
216+| `[String!]!` | Required list of required strings |
217+
218+### Mutations
219+
220+```js
221+type Mutation {
222+  users(params: ListUsersInput) [User]!
223+}
224+```
225+
226+### Interfaces
227+
228+```js
229+interface Entity {
230+  id: ID!
231+}
232+
233+type User implements Entity {
234+  id: ID!
235+  name: String
236+}
237+```
238+
239+### Enums
240+
241+```js
242+enum DIRECTION {
243+  LEFT
244+  RIGHT
245+}
246+
247+type Root {
248+  direction: DIRECTION!
249+}
250+```
251+{: data-line="1,2,3,4"}
252+
253+### Unions
254+
255+```js
256+type Artist { ··· }
257+type Album { ··· }
258+
259+union Result = Artist | Album
260+
261+type Query {
262+  search(q: String) [Result]
263+}
264+```
265+{: data-line="4"}
266+
267+References
268+----------
269+
270+- <http://graphql.org/learn/queries/>
271+- <http://graphql.org/learn/serving-over-http/>
272+
273+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
274+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/haml.md
+56, -0
 1@@ -0,0 +1,56 @@
 2+---
 3+title: Haml
 4+category: Markup
 5+layout: 2017/sheet
 6+prism_languages: [haml]
 7+---
 8+
 9+### Doctype
10+
11+```haml
12+!!! 5
13+```
14+
15+### Tags
16+
17+```haml
18+%html
19+  %head
20+    %title
21+  %body
22+    %h1 Hello World
23+    %br/
24+```
25+
26+### Classes and ID's
27+
28+```haml
29+%p.class-example
30+.no-tag-defaults-to-div
31+%div#butItCanBeIncluded
32+```
33+
34+### Inline Attributes
35+
36+Either hash syntax works
37+
38+```haml
39+%meta{ name: "viewport", content: "width=device-width, initial-scale=1.0" }
40+%input{ :type => "text", :required => true }
41+```
42+
43+### Ruby
44+
45+```haml
46+-# This is a comment
47+-# Anything starting with a hyphen signals to Haml that Ruby is coming
48+- @arr = [1, 2, 3]
49+- @str = "test"
50+-# Equal signals output
51+= render partial: "shared/header"
52+= yield
53+= link_to page_url
54+```
55+
56+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
57+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/html.md
+110, -0
  1@@ -0,0 +1,110 @@
  2+---
  3+title: HTML
  4+category: HTML
  5+layout: 2017/sheet
  6+---
  7+
  8+### Head stuff
  9+
 10+    <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
 11+    <link rel="shortcut icon" type="image/png" href="/favicon.png">
 12+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 13+
 14+### iPhone viewport
 15+
 16+    <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0">
 17+    <meta name="viewport" content="width=device-width">
 18+    <meta name="viewport" content="width=320, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/> <!-- full example -->
 19+
 20+### Default OpenGraph meta tags
 21+
 22+    <meta content="..." name="description">
 23+    <meta content="..." property="og:description">
 24+    <meta content="http://.../preview.jpg" property="og:image">
 25+    <meta content="Hello There" property="og:title">
 26+    <meta content="Hello There" property="og:site_name">
 27+    <meta content="hellothere" property="fb:admins">
 28+    <meta content="website" property="og:type">
 29+
 30+### Webfonts
 31+
 32+    <script>WebFontConfig={    },function(a,b){var c=a.createElement(b);c.src="//ajax.googleapis.com/ajax/libs/webfont/1/webfont.js",c.async=1;var d=a.getElementsByTagName(b)[0];d.parentNode.insertBefore(c,d)}(document,"script")</script>
 33+
 34+    // {typekit{id:"..."}}
 35+    // {google:{families:['Exo:400']}}
 36+
 37+### Google Analytics
 38+
 39+    <script>location.hostname.match(/helloworld\.com/)&&(_gaq=[["_setAccount","UA-XXXXX-1"],["_trackPageview"]],function(a,b){var c=a.createElement(b),d=a.getElementsByTagName(b)[0];c.async=1,c.src=("https:"==location.protocol?"//ssl":"//www")+".google-analytics.com/ga.js",d.parentNode.insertBefore(c,d)}(document,"script"))</script>
 40+
 41+### FB/Twitter
 42+
 43+    <div id="fb-root"></div><script>fbAsyncInit=function(){FB.init({"appId":"___APPIDGOESHERE___","status":true,"cookie":true,"xfbml":true})};!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.async=1;js.src='//connect.facebook.net/en_US/all.js';fjs.parentNode.insertBefore(js,fjs);}}(document,'script','facebook-jssdk');</script>
 44+
 45+    <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.async=1;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
 46+
 47+### HTML5 Shiv for IE8
 48+
 49+    <!--[if lte IE 8]><script src='//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6.1/html5shiv.js'></script><![endif]-->
 50+
 51+### H5BP HTML tag (IE8 and IE9 only)
 52+
 53+    <!--[if lte IE 8]><html class="ie8"><![endif]--><!--[if IE 9]><html class="ie9"><![endif]--><!--[if gt IE 9]><!-->
 54+    <html><!--<![endif]-->
 55+
 56+### Touch icons
 57+
 58+ * apple-touch-icon-precomposed.png
 59+ * apple-touch-icon-57x57-precomposed.png
 60+ * apple-touch-icon-72x72-precomposed.png
 61+ * apple-touch-icon-114x114-precomposed.png
 62+ * apple-touch-icon-144x144-precomposed.png
 63+
 64+### Icons
 65+
 66+    <link rel="shortcut icon" type="image/png" href="favicon.png">
 67+    <link href="apple-touch-icon-precomposed.png" rel="apple-touch-icon">
 68+    <link href="apple-touch-icon-57x57-precomposed.png" size="57x57" rel="apple-touch-icon">
 69+    <link href="apple-touch-icon-72x72-precomposed.png" size="72x72" rel="apple-touch-icon">
 70+    <link href="apple-touch-icon-114x114-precomposed.png" size="114x114" rel="apple-touch-icon">
 71+    <link href="apple-touch-icon-144x144-precomposed.png" size="144x144" rel="apple-touch-icon">
 72+
 73+Only do this if you're not placing the site in the root!
 74+
 75+### H5BP HTML tag
 76+
 77+    <!--[if lt IE 7 ]> <html class="ie6"> <![endif]-->
 78+    <!--[if IE 7 ]>    <html class="ie7"> <![endif]-->
 79+    <!--[if IE 8 ]>    <html class="ie8"> <![endif]-->
 80+    <!--[if IE 9 ]>    <html class="ie9"> <![endif]-->
 81+    <!--[if (gt IE 9)|!(IE)]><!--> <html class=""> <!--<![endif]-->
 82+
 83+### Google jQuery
 84+
 85+    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
 86+
 87+### Unsupported message
 88+
 89+    <!--[if lt IE 8]>
 90+    <div class="unsupported-browser">
 91+      <strong>
 92+        You are using an outdated browser.
 93+      </strong>
 94+      <span>
 95+        Please <a class="upgrade-browser"
 96+        href="http://browsehappy.com/">
 97+        upgrade your browser</a> or <a  class="chrome-frame"
 98+        href="http://www.google.com/chromeframe/?redirect=true">activate Google 
 99+        Chrome Frame</a> to improve your experience.
100+      </span>
101+    </div>
102+    <![endif]-->
103+
104+### HTML Compatibility inspector
105+
106+    <script src="http://ie.microsoft.com/testdrive/HTML5/CompatInspector/inspector.js"></script>
107+
108+More info here: [microsoft.com](http://ie.microsoft.com/testdrive/HTML5/CompatInspector/)
109+
110+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
111+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/javascript.md
+582, -0
  1@@ -0,0 +1,582 @@
  2+---
  3+title: ES2015+
  4+category: JavaScript
  5+layout: 2017/sheet
  6+tags: [Featured]
  7+updated: 2019-11-14
  8+weight: -10
  9+intro: |
 10+  A quick overview of new JavaScript features in ES2015, ES2016, ES2017, ES2018 and beyond.
 11+---
 12+
 13+### Block scoping
 14+
 15+#### Let
 16+
 17+```js
 18+function fn () {
 19+  let x = 0
 20+  if (true) {
 21+    let x = 1 // only inside this `if`
 22+  }
 23+}
 24+```
 25+{: data-line="2,4"}
 26+
 27+#### Const
 28+
 29+```js
 30+const a = 1
 31+```
 32+
 33+`let` is the new `var`. Constants work just like `let`, but can't be reassigned.
 34+See: [Let and const](https://babeljs.io/learn-es2015/#let--const)
 35+
 36+### Backtick strings
 37+
 38+#### Interpolation
 39+
 40+```js
 41+const message = `Hello ${name}`
 42+```
 43+
 44+#### Multiline strings
 45+
 46+```js
 47+const str = `
 48+hello
 49+world
 50+`
 51+```
 52+
 53+Templates and multiline strings.
 54+See: [Template strings](https://babeljs.io/learn-es2015/#template-strings)
 55+
 56+### Binary and octal literals
 57+
 58+```js
 59+let bin = 0b1010010
 60+let oct = 0o755
 61+```
 62+
 63+See: [Binary and octal literals](https://babeljs.io/learn-es2015/#binary-and-octal-literals)
 64+
 65+### New methods
 66+
 67+#### New string methods
 68+
 69+```js
 70+"hello".repeat(3)
 71+"hello".includes("ll")
 72+"hello".startsWith("he")
 73+"hello".padStart(8) // "   hello"
 74+"hello".padEnd(8) // "hello   " 
 75+"hello".padEnd(8, '!') // hello!!!
 76+"\u1E9B\u0323".normalize("NFC")
 77+```
 78+
 79+See: [New methods](https://babeljs.io/learn-es2015/#math--number--string--object-apis)
 80+
 81+### Classes
 82+
 83+```js
 84+class Circle extends Shape {
 85+```
 86+
 87+#### Constructor
 88+
 89+```js
 90+  constructor (radius) {
 91+    this.radius = radius
 92+  }
 93+```
 94+{: data-line="1"}
 95+
 96+#### Methods
 97+
 98+```js
 99+  getArea () {
100+    return Math.PI * 2 * this.radius
101+  }
102+```
103+{: data-line="1"}
104+
105+#### Calling superclass methods
106+
107+```js
108+  expand (n) {
109+    return super.expand(n) * Math.PI
110+  }
111+```
112+{: data-line="2"}
113+
114+#### Static methods
115+
116+```js
117+  static createFromDiameter(diameter) {
118+    return new Circle(diameter / 2)
119+  }
120+}
121+```
122+{: data-line="1"}
123+
124+Syntactic sugar for prototypes.
125+See: [Classes](https://babeljs.io/learn-es2015/#classes)
126+
127+### Exponent operator
128+
129+```js
130+const byte = 2 ** 8
131+// Same as: Math.pow(2, 8)
132+```
133+{: data-line="1"}
134+
135+Promises
136+--------
137+{: .-three-column}
138+
139+### Making promises
140+
141+```js
142+new Promise((resolve, reject) => {
143+  if (ok) { resolve(result) }
144+  else { reject(error) }
145+})
146+```
147+{: data-line="1"}
148+
149+For asynchronous programming.
150+See: [Promises](https://babeljs.io/learn-es2015/#promises)
151+
152+### Using promises
153+
154+```js
155+promise
156+  .then((result) => { ··· })
157+  .catch((error) => { ··· })
158+```
159+{: data-line="2,3"}
160+
161+
162+### Using promises with finally
163+
164+```js
165+promise
166+  .then((result) => { ··· })
167+  .catch((error) => { ··· })
168+  .finally(() => { // logic independent of success/error })
169+```
170+{: data-line="4"}
171+
172+The handler is called when the promise is fulfilled or rejected.
173+
174+
175+### Promise functions
176+
177+```js
178+Promise.all(···)
179+Promise.race(···)
180+Promise.reject(···)
181+Promise.resolve(···)
182+```
183+
184+### Async-await
185+
186+```js
187+async function run () {
188+  const user = await getUser()
189+  const tweets = await getTweets(user)
190+  return [user, tweets]
191+}
192+```
193+{: data-line="2,3"}
194+
195+`async` functions are another way of using functions.
196+
197+See: [async function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function)
198+
199+Destructuring
200+-------------
201+{: .-three-column}
202+
203+### Destructuring assignment
204+
205+#### Arrays
206+
207+```js
208+const [first, last] = ['Nikola', 'Tesla']
209+```
210+{: data-line="1"}
211+
212+#### Objects
213+
214+```js
215+let {title, author} = {
216+  title: 'The Silkworm',
217+  author: 'R. Galbraith'
218+}
219+```
220+{: data-line="1"}
221+
222+Supports for matching arrays and objects.
223+See: [Destructuring](https://babeljs.io/learn-es2015/#destructuring)
224+
225+### Default values
226+
227+```js
228+const scores = [22, 33]
229+const [math = 50, sci = 50, arts = 50] = scores
230+```
231+
232+```js
233+// Result:
234+// math === 22, sci === 33, arts === 50
235+```
236+
237+Default values can be assigned while destructuring arrays or objects.
238+
239+### Function arguments
240+
241+```js
242+function greet({ name, greeting }) {
243+  console.log(`${greeting}, ${name}!`)
244+}
245+```
246+{: data-line="1"}
247+
248+```js
249+greet({ name: 'Larry', greeting: 'Ahoy' })
250+```
251+
252+Destructuring of objects and arrays can also be done in function arguments.
253+
254+### Default values
255+
256+```js
257+function greet({ name = 'Rauno' } = {}) {
258+  console.log(`Hi ${name}!`);
259+}
260+```
261+{: data-line="1"}
262+
263+```js
264+greet() // Hi Rauno!
265+greet({ name: 'Larry' }) // Hi Larry!
266+```
267+
268+### Reassigning keys
269+
270+```js
271+function printCoordinates({ left: x, top: y }) {
272+  console.log(`x: ${x}, y: ${y}`)
273+}
274+```
275+{: data-line="1"}
276+
277+```js
278+printCoordinates({ left: 25, top: 90 })
279+```
280+
281+This example assigns `x` to the value of the `left` key.
282+
283+### Loops
284+
285+```js
286+for (let {title, artist} of songs) {
287+  ···
288+}
289+```
290+{: data-line="1"}
291+
292+The assignment expressions work in loops, too.
293+
294+
295+### Object destructuring
296+
297+```js
298+const { id, ...detail } = song;
299+```
300+{: data-line="1"}
301+
302+Extract some keys individually and remaining keys in the object using rest (...) operator
303+
304+
305+Spread
306+------
307+
308+### Object spread
309+
310+#### with Object spread
311+
312+```js
313+const options = {
314+  ...defaults,
315+  visible: true
316+}
317+```
318+{: data-line="2"}
319+
320+#### without Object spread
321+
322+```js
323+const options = Object.assign(
324+  {}, defaults,
325+  { visible: true })
326+```
327+
328+The Object spread operator lets you build new objects from other objects.
329+
330+See: [Object spread](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)
331+
332+### Array spread
333+
334+#### with Array spread
335+
336+```js
337+const users = [
338+  ...admins,
339+  ...editors,
340+  'rstacruz'
341+]
342+```
343+{: data-line="2,3"}
344+
345+#### without Array spread
346+
347+```js
348+const users = admins
349+  .concat(editors)
350+  .concat([ 'rstacruz' ])
351+```
352+
353+The spread operator lets you build new arrays in the same way.
354+
355+See: [Spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)
356+
357+Functions
358+---------
359+
360+### Function arguments
361+
362+#### Default arguments
363+
364+```js
365+function greet (name = 'Jerry') {
366+  return `Hello ${name}`
367+}
368+```
369+{: data-line="1"}
370+
371+#### Rest arguments
372+
373+```js
374+function fn(x, ...y) {
375+  // y is an Array
376+  return x * y.length
377+}
378+```
379+{: data-line="1"}
380+
381+#### Spread
382+
383+```js
384+fn(...[1, 2, 3])
385+// same as fn(1, 2, 3)
386+```
387+{: data-line="1"}
388+
389+Default, rest, spread.
390+See: [Function arguments](https://babeljs.io/learn-es2015/#default--rest--spread)
391+
392+### Fat arrows
393+
394+#### Fat arrows
395+
396+```js
397+setTimeout(() => {
398+  ···
399+})
400+```
401+{: data-line="1"}
402+
403+#### With arguments
404+
405+```js
406+readFile('text.txt', (err, data) => {
407+  ...
408+})
409+```
410+{: data-line="1"}
411+
412+#### Implicit return
413+```js
414+numbers.map(n => n * 2)
415+// No curly braces = implicit return
416+// Same as: numbers.map(function (n) { return n * 2 })
417+numbers.map(n => ({
418+  result: n * 2
419+}))
420+// Implicitly returning objects requires parentheses around the object
421+```
422+{: data-line="1,4,5,6"}
423+
424+Like functions but with `this` preserved.
425+See: [Fat arrows](https://babeljs.io/learn-es2015/#arrows-and-lexical-this)
426+
427+Objects
428+-------
429+
430+### Shorthand syntax
431+
432+```js
433+module.exports = { hello, bye }
434+// Same as: module.exports = { hello: hello, bye: bye }
435+```
436+
437+See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals)
438+
439+### Methods
440+
441+```js
442+const App = {
443+  start () {
444+    console.log('running')
445+  }
446+}
447+// Same as: App = { start: function () {···} }
448+```
449+{: data-line="2"}
450+
451+See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals)
452+
453+### Getters and setters
454+
455+```js
456+const App = {
457+  get closed () {
458+    return this.status === 'closed'
459+  },
460+  set closed (value) {
461+    this.status = value ? 'closed' : 'open'
462+  }
463+}
464+```
465+{: data-line="2,5"}
466+
467+See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals)
468+
469+### Computed property names
470+
471+```js
472+let event = 'click'
473+let handlers = {
474+  [`on${event}`]: true
475+}
476+// Same as: handlers = { 'onclick': true }
477+```
478+{: data-line="3"}
479+
480+See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals)
481+
482+
483+### Extract values
484+
485+```js
486+const fatherJS = { age: 57, name: "Brendan Eich" }
487+
488+Object.values(fatherJS)
489+// [57, "Brendan Eich"]
490+Object.entries(fatherJS)
491+// [["age", 57], ["name", "Brendan Eich"]]
492+```
493+{: data-line="3,5"}
494+
495+
496+Modules
497+-------
498+
499+### Imports
500+
501+```js
502+import 'helpers'
503+// aka: require('···')
504+```
505+
506+```js
507+import Express from 'express'
508+// aka: const Express = require('···').default || require('···')
509+```
510+
511+```js
512+import { indent } from 'helpers'
513+// aka: const indent = require('···').indent
514+```
515+
516+```js
517+import * as Helpers from 'helpers'
518+// aka: const Helpers = require('···')
519+```
520+
521+```js
522+import { indentSpaces as indent } from 'helpers'
523+// aka: const indent = require('···').indentSpaces
524+```
525+
526+`import` is the new `require()`.
527+See: [Module imports](https://babeljs.io/learn-es2015/#modules)
528+
529+### Exports
530+
531+```js
532+export default function () { ··· }
533+// aka: module.exports.default = ···
534+```
535+
536+```js
537+export function mymethod () { ··· }
538+// aka: module.exports.mymethod = ···
539+```
540+
541+```js
542+export const pi = 3.14159
543+// aka: module.exports.pi = ···
544+```
545+
546+`export` is the new `module.exports`.
547+See: [Module exports](https://babeljs.io/learn-es2015/#modules)
548+
549+Generators
550+----------
551+
552+### Generators
553+
554+```js
555+function* idMaker () {
556+  let id = 0
557+  while (true) { yield id++ }
558+}
559+```
560+
561+```js
562+let gen = idMaker()
563+gen.next().value  // → 0
564+gen.next().value  // → 1
565+gen.next().value  // → 2
566+```
567+
568+It's complicated.
569+See: [Generators](https://babeljs.io/learn-es2015/#generators)
570+
571+### For..of iteration
572+
573+```js
574+for (let i of iterable) {
575+  ···
576+}
577+```
578+
579+For iterating through generators and arrays.
580+See: [For..of iteration](https://babeljs.io/learn-es2015/#iterators--forof)
581+
582+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
583+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/jinja.md
+104, -0
  1@@ -0,0 +1,104 @@
  2+---
  3+title: Jinja
  4+category: Python
  5+layout: 2017/sheet
  6+---
  7+
  8+{% raw %}
  9+### Basic usage
 10+
 11+```
 12+- variable x has content: {{ x }}
 13+- expression: {{ x + 1 }}
 14+- escaped for HTML: {{ x | e }}
 15+```
 16+
 17+### Control structures
 18+
 19+```
 20+{% for x in range(5) %}
 21+    {% if x % 2 == 0 %}
 22+        {{ x }} is even!
 23+    {% else %}
 24+        {{ x }} is odd!
 25+    {% endif %}
 26+{% endfor %}
 27+```
 28+
 29+### Whitespace trimming
 30+
 31+```
 32+these are
 33+{{ "three" }}
 34+lines.
 35+
 36+this is conc
 37+{{- "at" -}}
 38+enated.
 39+```
 40+
 41+### Special blocks
 42+
 43+```
 44+{% filter e %}{% endraw %}
 45+{ {%- if 0 -%}{%- endif -%} % raw %}
 46+{%- raw -%}
 47+    This is a raw block where {{nothing is evaluated}}
 48+    {% not even this %}
 49+    and <html is escaped> too with "e" filter
 50+{% endraw %}
 51+{ {%- if 0 -%}{%- endif -%} % endraw %}{% raw %}
 52+{% endfilter %}
 53+
 54+{% macro myfunc(x) %}
 55+    this is a reusable macro, with arguments: {{x}}
 56+{% endmacro %}
 57+
 58+{{ myfunc(42) }}
 59+
 60+{#
 61+this is a comment
 62+#}
 63+```
 64+
 65+
 66+### Inheritance
 67+
 68+#### shared.html
 69+
 70+```
 71+<html>
 72+  <head>
 73+    <title>{%block title %}{% endblock %}</title>
 74+  </head>
 75+  <body>
 76+    <header><h1>{% block title %}{% endblock %}</h1></header>
 77+    <main>{% block content %}{% endblock %}</main>
 78+  </body>
 79+</html>
 80+```
 81+
 82+#### home.html
 83+
 84+```
 85+{% extends "shared.html" %}
 86+{% block title %}Welcome to my site{% endblock %}
 87+{% block content %}
 88+This is the body
 89+{% endblock %}
 90+```
 91+
 92+## Library
 93+
 94+### Basic usage
 95+
 96+```python
 97+from jinja2 import Template
 98+template = Template('Hello {{ name }}!')
 99+template.render(name='John Doe') == u'Hello John Doe!'
100+```
101+
102+{% endraw %}
103+
104+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
105+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/jinja2.md
+8, -0
1@@ -0,0 +1,8 @@
2+---
3+title: jinja
4+category: python
5+redirect_to: /jinja
6+---
7+
8+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
9+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/kotlin.md
+407, -0
  1@@ -0,0 +1,407 @@
  2+---
  3+title: Kotlin
  4+layout: 2017/sheet
  5+updated: 2018-12-06
  6+category: Java & JVM
  7+prism_languages: [kotlin]
  8+intro: |
  9+    [Kotlin](http://kotlinlang.org/) is a statically typed programming language for modern multiplatform applications.
 10+---
 11+
 12+Variables
 13+---------
 14+{: .-three-column}
 15+
 16+### Mutability
 17+
 18+```kotlin
 19+var mutableString: String = "Adam"
 20+val immutableString: String = "Adam"
 21+val inferredString = "Adam"
 22+```
 23+
 24+### Strings
 25+
 26+```kotlin
 27+val name = "Adam"
 28+val greeting = "Hello, " + name
 29+val greetingTemplate = "Hello, $name"
 30+val interpolated = "Hello, ${name.toUpperCase()}"
 31+```
 32+
 33+### Numbers
 34+
 35+```kotlin
 36+val intNum = 10
 37+val doubleNum = 10.0
 38+val longNum = 10L
 39+val floatNum = 10.0F
 40+```
 41+
 42+### Booleans
 43+
 44+```kotlin
 45+val trueBoolean = true
 46+val falseBoolean = false
 47+val andCondition = trueBoolean && falseBoolean
 48+val orCondition = trueBoolean || falseBoolean
 49+```
 50+
 51+### Static Fields
 52+
 53+```kotlin
 54+class Person {
 55+    companion object {
 56+        val NAME_KEY = "name_key"
 57+    }
 58+}
 59+
 60+val key = Person.NAME_KEY
 61+```
 62+
 63+Null Safety
 64+-----------
 65+{: .-two-column}
 66+
 67+### Nullable properties
 68+
 69+```kotlin
 70+val cannotBeNull: String = null // Invalid
 71+val canBeNull: String? = null // Valid
 72+
 73+val cannotBeNull: Int = null // Invalid
 74+val canBeNull: Int? = null // Valid
 75+```
 76+
 77+### Checking for null
 78+
 79+```kotlin
 80+val name: String? = "Adam"
 81+
 82+if (name != null && name.length > 0) {
 83+    print("String length is ${name.length}")
 84+} else {
 85+    print("String is empty.")
 86+}
 87+```
 88+
 89+### Safe Operator
 90+
 91+```kotlin
 92+val nullableStringLength: Int? = nullableString?.length
 93+val nullableDepartmentHead: String? = person?.department?.head?.name
 94+```
 95+
 96+### Elvis Operator
 97+
 98+```kotlin
 99+val nonNullStringLength: Int = nullableString?.length ?: 0
100+val nonNullDepartmentHead: String = person?.department?.head?.name ?: ""
101+val nonNullDepartmentHead: String = person?.department?.head?.name.orEmpty()
102+```
103+
104+### Safe Casts
105+```kotlin
106+// Will not throw ClassCastException
107+val nullableCar: Car? = (input as? Car)
108+```
109+
110+Collections
111+-----------
112+{: .-two-column}
113+
114+### Creation
115+
116+```kotlin
117+val numArray = arrayOf(1, 2, 3)
118+val numList = listOf(1, 2, 3)
119+val mutableNumList = mutableListOf(1, 2, 3)
120+```
121+
122+### Accessing
123+
124+```kotlin
125+val firstItem = numList[0]
126+val firstItem = numList.first()
127+val firstItem = numList.firstOrNull()
128+```
129+
130+### Maps
131+
132+```kotlin
133+val faceCards = mutableMapOf("Jack" to 11, "Queen" to 12, "King" to 13)
134+val jackValue = faceCards["Jack"] // 11
135+faceCards["Ace"] = 1
136+```
137+
138+### Mutability
139+
140+```kotlin
141+val immutableList = listOf(1, 2, 3)
142+val mutableList = immutableList.toMutableList()
143+
144+val immutableMap = mapOf("Jack" to 11, "Queen" to 12, "King" to 13)
145+val mutableMap = immutableMap.toMutableMap()
146+```
147+
148+### Iterating
149+
150+```kotlin
151+for (item in myList) {
152+    print(item)
153+}
154+
155+myList.forEach {
156+    print(it)
157+}
158+
159+myList.forEachIndexed { index, item -> 
160+    print("Item at $index is: $item")
161+}
162+```
163+
164+### Filtering & Searching
165+
166+```kotlin
167+val evenNumbers = numList.filter { it % 2 == 0 }
168+val containsEven = numList.any { it % 2 == 0 }
169+val containsNoEvens = numList.none { it % 2 == 0 }
170+val containsNoEvens = numList.all { it % 2 == 1 }
171+val firstEvenNumber: Int = numList.first { it % 2 == 0 }
172+val firstEvenOrNull: Int? = numList.firstOrNull { it % 2 == 0 }
173+val fullMenu = objList.map { "${it.name} - $${it.detail}" }
174+```
175+
176+Note: `it` is the [implicit name for a single parameter](https://kotlinlang.org/docs/reference/lambdas.html#it-implicit-name-of-a-single-parameter).
177+
178+Functions
179+---------
180+{: .-two-column}
181+
182+### Parameters & Return Types
183+
184+```kotlin
185+fun printName() {
186+    print("Adam")
187+}
188+
189+fun printName(person: Person) {
190+    print(person.name)
191+}
192+
193+fun getGreeting(person: Person): String {
194+    return "Hello, ${person.name}"
195+}
196+
197+fun getGreeting(person: Person): String = "Hello, ${person.name}"
198+fun getGreeting(person: Person) = "Hello, ${person.name}"
199+```
200+
201+### Higher Order Functions
202+
203+```kotlin
204+fun callbackIfTrue(condition: Boolean, callback: () -> Unit) {
205+    if (condition) {
206+        callback()
207+    }
208+}
209+
210+callbackIfTrue(someBoolean) {
211+    print("Condition was true")
212+}
213+```
214+
215+### Extension Functions
216+
217+```kotlin
218+fun Int.timesTwo(): Int {
219+    return this * 2
220+}
221+
222+val four = 2.timesTwo()
223+```
224+
225+### Default Parameters
226+
227+```kotlin
228+fun getGreeting(person: Person, intro: String = "Hello,") {
229+    return "$intro ${person.name}"
230+}
231+
232+// Returns "Hello, Adam"
233+val hello = getGreeting(Person("Adam"))
234+
235+// Returns "Welcome, Adam"
236+val welcome = getGreeting(Person("Adam"), "Welcome,")
237+```
238+
239+### Named Parameters
240+
241+```kotlin
242+class Person(val name: String = "", age: Int = 0)
243+
244+// All valid
245+val person = Person()
246+val person = Person("Adam", 100)
247+val person = Person(name = "Adam", age = 100)
248+val person = Person(age = 100)
249+val person = Person(age = 100, name = "Adam")
250+```
251+
252+### Static Functions
253+
254+```kotlin
255+class Fragment(val args: Bundle) {
256+    companion object {
257+        fun newInstance(args: Bundle): Fragment {
258+            return Fragment(args)
259+        }
260+    }
261+}
262+
263+val fragment = Fragment.newInstance(args)
264+```
265+
266+* [Companion Objects](https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects)
267+
268+Classes
269+-------
270+{: .-two-column}
271+
272+### Primary Constructor
273+
274+```kotlin
275+class Person(val name: String, val age: Int)
276+val adam = Person("Adam", 100)
277+```
278+
279+### Secondary Constructors
280+
281+```kotlin
282+class Person(val name: String) {
283+    private var age: Int? = null
284+
285+    constructor(name: String, age: Int) : this(name) {
286+        this.age = age
287+    }
288+}
289+
290+// Above can be replaced with default params
291+class Person(val name: String, val age: Int? = null)
292+```
293+
294+### Inheritance & Implementation
295+
296+```kotlin
297+open class Vehicle
298+class Car : Vehicle()
299+
300+interface Runner {
301+    fun run()
302+}
303+
304+class Machine : Runner {
305+    override fun run() {
306+        // ...
307+    }
308+}
309+```
310+
311+Control Flow
312+------------
313+{: .-two-column}
314+
315+### If Statements
316+
317+```kotlin
318+if (someBoolean) {
319+    doThing()
320+} else {
321+    doOtherThing()
322+}
323+```
324+
325+### For Loops
326+
327+```kotlin
328+for (i in 0..10) { } // 1 - 10
329+for (i in 0 until 10) // 1 - 9
330+(0..10).forEach { }
331+for (i in 0 until 10 step 2) // 0, 2, 4, 6, 8
332+```
333+
334+### When Statements
335+
336+```kotlin
337+when (direction) {
338+    NORTH -> {
339+        print("North")
340+    }
341+    SOUTH -> print("South")
342+    EAST, WEST -> print("East or West")
343+    "N/A" -> print("Unavailable")
344+    else -> print("Invalid Direction")
345+}
346+```
347+
348+### While Loops
349+
350+```kotlin
351+while (x > 0) {
352+    x--
353+}
354+
355+do {
356+    x--
357+} while (x > 0)
358+```
359+
360+Destructuring Declarations
361+--------------------------
362+{: .-two-column}
363+
364+### Objects & Lists
365+
366+```kotlin
367+val person = Person("Adam", 100)
368+val (name, age) = person
369+
370+val pair = Pair(1, 2)
371+val (first, second) = pair
372+
373+val coordinates = arrayOf(1, 2, 3)
374+val (x, y, z) = coordinates
375+```
376+
377+### ComponentN Functions
378+
379+```kotlin
380+class Person(val name: String, val age: Int) {
381+	operator fun component1(): String {
382+		return name
383+	}
384+
385+	operator fun component2(): Int {
386+		return age
387+	}
388+}
389+```
390+
391+References
392+----------
393+{: .-one-column}
394+
395+* [Defining Variables](https://kotlinlang.org/docs/reference/basic-syntax.html#defining-variables) _(kotlinlang.org)_
396+* [Strings Documentation](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) _(kotlinlang.org)_
397+* [String Templates](https://kotlinlang.org/docs/reference/basic-types.html#string-templates) _(kotlinlang.org)_
398+* [Basic Types](https://kotlinlang.org/docs/reference/basic-types.html) _(kotlinlang.org)_
399+* [Companion Objects](https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects) _(kotlinlang.org)_
400+* [Null Safety](https://kotlinlang.org/docs/reference/null-safety.html) _(kotlinlang.org)_
401+* [Collections Overview](https://kotlinlang.org/docs/reference/collections.html) _(kotlinlang.org)_
402+* [Collections Documentation](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/index.html) _(kotlinlang.org)_
403+* [Functions Documentation](https://kotlinlang.org/docs/reference/functions.html) _(kotlinlang.org)_
404+* [Classes Documentation](https://kotlinlang.org/docs/reference/classes.html) _(kotlinlang.org)_
405+* [Destructuring Declarations](https://kotlinlang.org/docs/reference/multi-declarations.html) _(kotlinlang.org)_
406+
407+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
408+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/ledger.md
+308, -0
  1@@ -0,0 +1,308 @@
  2+---
  3+title: Ledger CLI
  4+category: Ledger
  5+layout: 2017/sheet
  6+updated: 2020-05-23
  7+weight: -5
  8+---
  9+
 10+### Basic usage
 11+
 12+```bash
 13+$ ledger bal
 14+$ ledger reg
 15+```
 16+
 17+```bash
 18+$ ledger reg grocery  # show entries for 'grocery'
 19+$ ledger bal assets   # check if i'm broke
 20+```
 21+
 22+```bash
 23+  -b 01/01   # --begin
 24+  -e 01/31   # --end
 25+  -S date    # --sort
 26+  -S amount
 27+```
 28+
 29+### Examples
 30+
 31+```bash
 32+# any/all matches
 33+  ledger bal Rent Transportation  # any
 34+  ledger bal Income and Job       # all
 35+  ledger bal Expenses and not (Drinks or Food)
 36+```
 37+
 38+```bash
 39+# what did I spend on most? (--sorted)
 40+  ledger reg Expenses -S amount
 41+```
 42+
 43+```bash
 44+# how much did I have at this date? (--end)
 45+  ledger bal -e 01/15 ^Assets ^Liabilities
 46+```
 47+
 48+```bash
 49+# how much did I spend and earn this month?
 50+  ledger bal ^Expenses ^Income --invert
 51+```
 52+
 53+```bash
 54+# how much was spent over the course of 3 days? (totalled)
 55+  ledger reg -b 01/25 -e 01/27 --subtotal
 56+  ledger reg -b 01/25 -e 01/27 --subtotal grocery
 57+```
 58+
 59+Format
 60+------
 61+
 62+### Basic format
 63+
 64+```
 65+2013/01/03 * Rent for January
 66+  Expenses:Rent   $600.00
 67+  Assets:Savings
 68+```
 69+
 70+`*` = cleared, `!` = pending
 71+
 72+### Secondary dates
 73+
 74+```
 75+2008/01/01=2008/01/14 Client invoice
 76+```
 77+
 78+It can mean anything you want, eg, for the estimated date you'll be paid.
 79+
 80+### Balance assertions
 81+
 82+```
 83+2008/01/01 * KFC
 84+  Expenses:Food    $20
 85+  Assets:Cash     $-20  = $500
 86+```
 87+{: data-line="3"}
 88+
 89+`Cash $X = $500` ensures Cash is at $500 after the transaction.
 90+
 91+### Balance assignment
 92+
 93+```bash
 94+2008/01/01 * Cash balance
 95+  Assets:Cash              = $500
 96+  Equity:Adjustments
 97+
 98+2008/01/01 * KFC
 99+  Expenses:Food            $20
100+  Assets:Cash              = $500
101+```
102+{: data-line="2,7"}
103+
104+`ACCOUNT = $500` figures out what's needed to make it $500.
105+
106+### Payables
107+
108+```bash
109+2008/04/25 * Rent
110+  (Assets:Checking)  -$200
111+  Expenses:Rent
112+```
113+{: data-line="2"}
114+
115+### Commodities
116+
117+```bash
118+; cost per item
119+2010/05/31 * Market
120+  Assets:Fridge                35 apples @ $0.42
121+  Assets:Cash
122+```
123+{: data-line="3"}
124+
125+```bash
126+; total cost
127+2010/05/31 * Market
128+  Assets:Fridge                35 apples @@ $14.70
129+  Assets:Cash
130+```
131+{: data-line="3"}
132+
133+```bash
134+; fixed lot prices
135+2010/05/31 * Gas
136+  Expenses:Gasoline             11 GAL {=$2.299}
137+  Assets:Cash
138+```
139+{: data-line="3"}
140+
141+### Commodity definitions
142+
143+```
144+commodity $
145+  note American Dollars
146+  format $1,000.00
147+  nomarket
148+  default
149+```
150+
151+### Budgeting
152+
153+```
154+~ Monthly
155+  Expenses:Rent  $500
156+  Expenses:Food  $100
157+  Expenses        $40 ; everything else
158+  Assets
159+
160+~ Yearly
161+```
162+
163+```bash
164+ledger bal --budget Expenses
165+ledger bal --unbudgeted Expenses
166+```
167+{: .-setup}
168+
169+### Comments
170+
171+    ; line comment
172+    # also line comment
173+    % also line comment
174+    | also line comment
175+    * also line comment
176+
177+Querying
178+--------
179+
180+### Periods
181+
182+```
183+[interval] [begin] [end]
184+```
185+
186+```
187+interval:
188+  every day|week|month|quarter|year
189+  every N days|weeks|...
190+  daily|weekly|...
191+```
192+
193+```
194+begin:
195+  from <spec>
196+end:
197+  to <spec>
198+```
199+
200+```
201+spec:
202+  2004
203+  2004/10/1
204+```
205+
206+```bash
207+$ ledger bal|reg --period "until aug"
208+$ ledger bal|reg --period "last oct"
209+$ ledger bal|reg --period "every week"
210+```
211+{: .-setup}
212+
213+### Register
214+
215+```bash
216+$ ledger reg
217+```
218+{: .-setup}
219+
220+```bash
221+  -D, --daily
222+  -W, --weekly
223+  -M, --monthly
224+      --quarterly
225+  -Y, --yearly
226+  -s, --subtotal
227+  --start-of-week monday
228+```
229+
230+```bash
231+  -S, --sort date
232+  -S, --sort amount
233+```
234+
235+### Filters
236+
237+```bash
238+-b, --begin DATE
239+-e, --end DATE
240+
241+-d payee =~ /pioneer/
242+
243+-C, --cleared    # (with *)
244+-U, --uncleared  # (no *)
245+    --pending    # (with !)
246+
247+-R, --real       # ignore virtual postings (eg: "(Cash)  $-400")
248+-L, --actual     # no automated postings (eg: "= /^Income/")
249+
250+-r, --related   # show the other side
251+                # "reg -r savings" shows where it comes from)
252+```
253+
254+### Queries
255+
256+    ^regex$
257+    @payee
258+    %tag
259+    %tag=value
260+    =note
261+    #code
262+    term and term
263+    term or term
264+    not term
265+    \( term \)
266+
267+Example:
268+
269+    ledger r ^expenses and @Denny's
270+    ledger r food and @Starbucks and not dining
271+
272+### Display
273+
274+```bash
275+-n, --collapse       # [register] collapse entries
276+                     # [balance] no grand total
277+-s, --subtotal       # [balance] show sub-accounts
278+                     # [other] show subtotals
279+--flat
280+```
281+
282+### Effective dates
283+
284+```bash
285+2008/01/01=2008/01/14 Client invoice  ;  estimated date you'll be paid
286+  Assets:Accounts Receivable            $100.00
287+  Income: Client name
288+```
289+{: data-line="1"}
290+
291+Say you're in business. If you bill a customer, you can enter something like above.
292+Then, when you receive the payment, you change it to:
293+
294+```bash
295+2008/01/01=2008/01/15 Client invoice ;  actual date money received
296+  Assets:Accounts Receivable            $100.00
297+  Income: Client name
298+```
299+{: data-line="1"}
300+
301+## References
302+{: .-one-column}
303+
304+* <http://ledger-cli.org/3.0/doc/ledger3.html>
305+* <https://gist.github.com/agaviria/3317397>
306+{: .-also-see}
307+
308+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
309+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/less.md
+45, -0
 1@@ -0,0 +1,45 @@
 2+---
 3+title: Less.js
 4+---
 5+
 6+### Functions
 7+
 8+    unit(30px / 5px)  #=> 6
 9+    unit(5, px)       #=> 5px
10+
11+    e("ms:stuff()")   #=> ms:stuff() (unquote)
12+
13+    %("count: %d", 1+2) #=> "count: 3"
14+
15+    iscolor(@x)
16+    isstring(@x)
17+    isnumber(@x)
18+    iskeyword(@x)
19+    isurl(url(...))
20+    ispixel()
21+    isem()
22+    ispercentage()
23+    isunit()
24+
25+    hue(@color)
26+    saturation(@color)
27+    lightness(@color)
28+    luma(@color)
29+    luminance(@color)
30+
31+    fade(@color, amount)
32+    fadein(@color, amount)
33+    fadeout(@color, amount)
34+    spin(@color, degrees)
35+    mix(@a, @b, amount)
36+
37+### Conditionals
38+
39+    .image when (luma(@color) > 50%) { }
40+    .image when (not(...)) { }
41+    .image when (default()) {}
42+    .image when (e(@shape) = 'circle') { }
43+
44+
45+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
46+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/lua.md
+303, -0
  1@@ -0,0 +1,303 @@
  2+---
  3+title: Lua
  4+---
  5+
  6+## Comments
  7+
  8+    -- comment
  9+    --[[ Multiline
 10+         comment ]]
 11+
 12+## Invoking functions
 13+
 14+    print()
 15+    print("Hi")
 16+
 17+    -- You can omit parentheses if the argument is one string or table literal
 18+    print "Hello World"     <-->     print("Hello World")
 19+    dofile 'a.lua'          <-->     dofile ('a.lua')
 20+    print [[a multi-line    <-->     print([[a multi-line
 21+     message]]                        message]])
 22+    f{x=10, y=20}           <-->     f({x=10, y=20})
 23+    type{}                  <-->     type({})
 24+
 25+## Tables / arrays
 26+
 27+    t = {}
 28+    t = { a = 1, b = 2 }
 29+    t.a = function() ... end
 30+
 31+    t = { ["hello"] = 200 }
 32+    t.hello
 33+
 34+    -- Remember, arrays are also tables
 35+    array = { "a", "b", "c", "d" }
 36+    print(array[2])       -- "b" (one-indexed)
 37+    print(#array)         -- 4 (length)
 38+
 39+## Loops
 40+
 41+    while condition do
 42+    end
 43+
 44+    for i = 1,5 do
 45+    end
 46+
 47+    for i = start,finish,delta do
 48+    end
 49+
 50+    for k,v in pairs(tab) do
 51+    end
 52+
 53+    repeat
 54+    until condition
 55+
 56+    -- Breaking out:
 57+    while x do
 58+      if condition then break end
 59+    end
 60+
 61+## Conditionals
 62+
 63+    if condition then
 64+      print("yes")
 65+    elseif condition then
 66+      print("maybe")
 67+    else
 68+      print("no")
 69+    end
 70+
 71+## Variables
 72+
 73+    local x = 2
 74+    two, four = 2, 4
 75+
 76+## Functions
 77+
 78+    function myFunction()
 79+      return 1
 80+    end
 81+
 82+    function myFunctionWithArgs(a, b)
 83+      -- ...
 84+    end
 85+
 86+    myFunction()
 87+
 88+    anonymousFunctions(function()
 89+      -- ...
 90+    end)
 91+
 92+    -- Not exported in the module
 93+    local function myPrivateFunction()
 94+    end
 95+
 96+    -- Splats
 97+    function doAction(action, ...)
 98+      print("Doing '"..action.."' to", ...)
 99+      --> print("Doing 'write' to", "Shirley", "Abed")
100+    end
101+
102+    doAction('write', "Shirley", "Abed")
103+
104+## Lookups
105+
106+    mytable = { x = 2, y = function() .. end }
107+
108+    -- The same:
109+    mytable.x
110+    mytable['x']
111+
112+    -- Syntactic sugar, these are equivalent:
113+    mytable.y(mytable)
114+    mytable:y()
115+
116+    mytable.y(mytable, a, b)
117+    mytable:y(a, b)
118+
119+    function X:y(z) .. end
120+    function X.y(self, z) .. end
121+
122+## Metatables
123+
124+
125+    mt = {}
126+
127+    -- A metatable is simply a table with functions in it.
128+    mt.__tostring = function() return "lol" end
129+    mt.__add      = function(b) ... end       -- a + b
130+    mt.__mul      = function(b) ... end       -- a * b
131+    mt.__index    = function(k) ... end       -- Lookups (a[k] or a.k)
132+    mt.__newindex = function(k, v) ... end    -- Setters (a[k] = v)
133+
134+    -- Metatables allow you to override behavior of another table.
135+    mytable = {}
136+    setmetatable(mytable, mt)
137+
138+    print(myobject)
139+
140+## Classes
141+
142+    Account = {}
143+
144+    function Account:new(balance)
145+      local t = setmetatable({}, { __index = Account })
146+
147+      -- Your constructor stuff
148+      t.balance = (balance or 0)
149+      return t
150+    end
151+
152+    function Account:withdraw(amount)
153+      print("Withdrawing "..amount.."...")
154+      self.balance = self.balance - amount
155+      self:report()
156+    end
157+
158+    function Account:report()
159+      print("Your current balance is: "..self.balance)
160+    end
161+
162+    a = Account:new(9000)
163+    a:withdraw(200)    -- method call
164+
165+## Constants
166+
167+    nil
168+    false
169+    true
170+
171+## Operators (and their metatable names)
172+
173+    -- Relational (binary)
174+    -- __eq  __lt  __gt  __le  __ge
175+       ==    <     >     <=    >=
176+    ~=   -- Not equal, just like !=
177+
178+    -- Arithmetic (binary)
179+    -- __add  __sub  __muv  __div  __mod  __pow
180+       +      -      *      /      %      ^
181+
182+    -- Arithmetic (unary)
183+    -- __unm (unary minus)
184+       -
185+
186+    -- Logic (and/or)
187+    nil and false  --> nil
188+    false and nil  --> false
189+    0 and 20       --> 20
190+    10 and 20      --> 20
191+
192+
193+    -- Length
194+    -- __len(array)
195+    #array
196+
197+
198+    -- Indexing
199+    -- __index(table, key)
200+    t[key]
201+    t.key
202+
203+    -- __newindex(table, key, value)
204+    t[key]=value
205+
206+    -- String concat
207+    -- __concat(left, right)
208+    "hello, "..name
209+
210+    -- Call
211+    -- __call(func, ...)
212+
213+
214+## API: Global functions  [(ref)](http://lua.gts-stolberg.de/en/Basis.php)
215+
216+    dofile("hello.lua")
217+    loadfile("hello.lua")
218+
219+    assert(x)    -- x or (raise an error)
220+    assert(x, "failed")
221+
222+    type(var)   -- "nil" | "number" | "string" | "boolean" | "table" | "function" | "thread" | "userdata"
223+
224+    -- Does /not/ invoke meta methods (__index and __newindex)
225+    rawset(t, index, value)    -- Like t[index] = value
226+    rawget(t, index)           -- Like t[index]
227+
228+    _G  -- Global context
229+    setfenv(1, {})  -- 1: current function, 2: caller, and so on -- {}: the new _G
230+
231+    pairs(t)     -- iterable list of {key, value}
232+    ipairs(t)    -- iterable list of {index, value}
233+
234+    tonumber("34")
235+    tonumber("8f", 16)
236+
237+## API: Strings
238+
239+    'string'..'concatenation'
240+
241+    s = "Hello"
242+    s:upper()
243+    s:lower()
244+    s:len()    -- Just like #s
245+
246+    s:find()
247+    s:gfind()
248+
249+    s:match()
250+    s:gmatch()
251+
252+    s:sub()
253+    s:gsub()
254+
255+    s:rep()
256+    s:char()
257+    s:dump()
258+    s:reverse()
259+    s:byte()
260+    s:format()
261+
262+## API: Tables
263+
264+    table.foreach(t, function(row) ... end)
265+    table.setn
266+    table.insert(t, 21)          -- append (--> t[#t+1] = 21)
267+    table.insert(t, 4, 99)
268+    table.getn
269+    table.concat
270+    table.sort
271+    table.remove(t, 4)
272+
273+## API: Math [(ref)](http://lua-users.org/wiki/MathLibraryTutorial)
274+
275+    math.abs     math.acos    math.asin       math.atan    math.atan2
276+    math.ceil    math.cos     math.cosh       math.deg     math.exp
277+    math.floor   math.fmod    math.frexp      math.ldexp   math.log
278+    math.log10   math.max     math.min        math.modf    math.pow
279+    math.rad     math.random  math.randomseed math.sin     math.sinh
280+    math.sqrt    math.tan     math.tanh
281+
282+    math.sqrt(144)
283+    math
284+
285+## API: Misc
286+
287+    io.output(io.open("file.txt", "w"))
288+    io.write(x)
289+    io.close()
290+
291+    for line in io.lines("file.txt")
292+
293+    file = assert(io.open("file.txt", "r"))
294+    file:read()
295+    file:lines()
296+    file:close()
297+
298+## Reference
299+
300+  https://www.lua.org/pil/13.html
301+  http://lua-users.org/wiki/ObjectOrientedProgramming
302+
303+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
304+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/makefile.md
+132, -0
  1@@ -0,0 +1,132 @@
  2+---
  3+title: Makefile
  4+prism_languages: [makefile]
  5+layout: 2017/sheet
  6+category: CLI
  7+---
  8+
  9+## Var assignment
 10+
 11+```makefile
 12+foo  = "bar"
 13+bar  = $(foo) foo  # dynamic (renewing) assignment
 14+foo := "boo"       # one time assignment, $(bar) now is "boo foo"
 15+foo ?= /usr/local  # safe assignment, $(foo) and $(bar) still the same
 16+bar += world       # append, "boo foo world"
 17+foo != echo fooo   # exec shell command and assign to foo
 18+# $(bar) now is "fooo foo world"
 19+```
 20+
 21+`=` expressions are only evaluated when they're being used.
 22+
 23+## Magic variables
 24+
 25+```makefile
 26+out.o: src.c src.h
 27+  $@   # "out.o" (target)
 28+  $<   # "src.c" (first prerequisite)
 29+  $^   # "src.c src.h" (all prerequisites)
 30+
 31+%.o: %.c
 32+  $*   # the 'stem' with which an implicit rule matches ("foo" in "foo.c")
 33+
 34+also:
 35+  $+   # prerequisites (all, with duplication)
 36+  $?   # prerequisites (new ones)
 37+  $|   # prerequisites (order-only?)
 38+
 39+  $(@D) # target directory
 40+```
 41+
 42+## Command prefixes
 43+
 44+| Prefix | Description                                 |
 45+| ------ | ------------------------------------------- |
 46+| `-`    | Ignore errors                               |
 47+| `@`    | Don't print command                         |
 48+| `+`    | Run even if Make is in 'don't execute' mode |
 49+
 50+```makefile
 51+build:
 52+    @echo "compiling"
 53+    -gcc $< $@
 54+
 55+-include .depend
 56+```
 57+
 58+## Find files
 59+
 60+```makefile
 61+js_files  := $(wildcard test/*.js)
 62+all_files := $(shell find images -name "*")
 63+```
 64+
 65+## Substitutions
 66+
 67+```makefile
 68+file     = $(SOURCE:.cpp=.o)   # foo.cpp => foo.o
 69+outputs  = $(files:src/%.coffee=lib/%.js)
 70+
 71+outputs  = $(patsubst %.c, %.o, $(wildcard *.c))
 72+assets   = $(patsubst images/%, assets/%, $(wildcard images/*))
 73+```
 74+
 75+## More functions
 76+
 77+```makefile
 78+$(strip $(string_var))
 79+
 80+$(filter %.less, $(files))
 81+$(filter-out %.less, $(files))
 82+```
 83+
 84+## Building files
 85+
 86+```makefile
 87+%.o: %.c
 88+  ffmpeg -i $< > $@   # Input and output
 89+  foo $^
 90+```
 91+
 92+## Includes
 93+
 94+```makefile
 95+-include foo.make
 96+```
 97+
 98+## Options
 99+
100+```sh
101+make
102+  -e, --environment-overrides
103+  -B, --always-make
104+  -s, --silent
105+  -j, --jobs=N   # parallel processing
106+```
107+
108+## Conditionals
109+
110+```makefile
111+foo: $(objects)
112+ifeq ($(CC),gcc)
113+  $(CC) -o foo $(objects) $(libs_for_gcc)
114+else
115+  $(CC) -o foo $(objects) $(normal_libs)
116+endif
117+```
118+
119+## Recursive
120+
121+```makefile
122+deploy:
123+  $(MAKE) deploy2
124+```
125+
126+## Further reading
127+
128+- [isaacs's Makefile](https://gist.github.com/isaacs/62a2d1825d04437c6f08)
129+- [Your Makefiles are wrong](https://tech.davis-hansson.com/p/make/)
130+- [Manual](https://www.gnu.org/software/make/manual/html_node/index.html)
131+
132+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
133+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/man.md
+21, -0
 1@@ -0,0 +1,21 @@
 2+---
 3+title: Man
 4+category: CLI
 5+layout: 2017/sheet
 6+---
 7+
 8+### Man paths
 9+
10+| `1` | General User Commands |
11+| `2` | System Calls |
12+| `3` | Library Routines |
13+| `4` | Special Files and Sockets |
14+| `5` | File formats and Conventions |
15+| `6` | Games and Fun Stuff |
16+| `7` | Miscellaneous Documentation |
17+| `8` | System Administration |
18+| `9` | Kernel and Programming Style |
19+| `n` | Tcl/Tk |
20+
21+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
22+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/markdown.md
+167, -0
  1@@ -0,0 +1,167 @@
  2+---
  3+title: Markdown
  4+category: Markup
  5+layout: 2017/sheet
  6+prism_languages: [markdown]
  7+updated: 2020-07-01
  8+weight: -1
  9+---
 10+
 11+## Reference
 12+{:.-three-column}
 13+
 14+### Headers
 15+
 16+```markdown
 17+# h1
 18+## h2
 19+### h3
 20+#### h4
 21+##### h5
 22+###### h6
 23+```
 24+
 25+```markdown
 26+Header 1
 27+========
 28+```
 29+
 30+```markdown
 31+Header 2
 32+--------
 33+```
 34+
 35+### Emphasis
 36+
 37+```markdown
 38+*italic*
 39+_italic_
 40+```
 41+
 42+```markdown
 43+**bold**
 44+__bold__
 45+```
 46+
 47+```markdown
 48+***bold italic***
 49+___bold italic___
 50+```
 51+
 52+```markdown
 53+~~strikethrough~~
 54+```
 55+
 56+```markdown
 57+`code`
 58+```
 59+
 60+### Lists
 61+
 62+```markdown
 63+* Item 1
 64+* Item 2
 65+```
 66+
 67+```markdown
 68+- Item 1
 69+- Item 2
 70+```
 71+
 72+```markdown
 73+- [ ] Checkbox off
 74+- [x] Checkbox on
 75+```
 76+
 77+```markdown
 78+1. Item 1
 79+2. Item 2
 80+```
 81+
 82+### Links
 83+
 84+```markdown
 85+[link](http://google.com)
 86+```
 87+
 88+```markdown
 89+[link][google]
 90+[google]: http://google.com
 91+```
 92+
 93+```markdown
 94+<http://google.com>
 95+```
 96+
 97+### Images
 98+
 99+```markdown
100+![Image alt text](/path/to/img.jpg)
101+![Image alt text](/path/to/img.jpg "title")
102+![Image alt text][img]
103+```
104+
105+```markdown
106+[img]: http://foo.com/img.jpg
107+```
108+
109+### Code
110+
111+```markdown
112+`inline code`
113+```
114+
115+```
116+    4 space indent
117+    makes a code block
118+```
119+
120+~~~markdown
121+```
122+code fences
123+```
124+~~~
125+
126+
127+~~~markdown
128+```js
129+codeFences.withLanguage()
130+```
131+~~~
132+
133+### Blockquotes
134+
135+```markdown
136+> This is
137+> a blockquote
138+>
139+> > Nested
140+> > Blockquote
141+```
142+
143+### Horizontal line
144+
145+```markdown
146+----
147+```
148+
149+```markdown
150+****
151+```
152+
153+### Tables
154+
155+```markdown
156+| Column 1 Heading | Column 2 Heading |
157+| ---------------- | ---------------- |
158+| Some content     | Other content    |
159+```
160+
161+```markdown
162+Column 1 Heading | Column 2 Heading
163+--- | ---
164+Some content | Other content
165+```
166+
167+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
168+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/mysql.md
+271, -0
  1@@ -0,0 +1,271 @@
  2+---
  3+title: MySQL
  4+updated: 2020-07-05
  5+layout: 2017/sheet
  6+category: Databases
  7+---
  8+
  9+### Browsing
 10+
 11+```sql
 12+SHOW DATABASES;
 13+SHOW TABLES;
 14+SHOW FIELDS FROM table / DESCRIBE table;
 15+SHOW CREATE TABLE table;
 16+SHOW PROCESSLIST;
 17+KILL process_number;
 18+```
 19+
 20+### Select
 21+
 22+```sql
 23+SELECT * FROM table;
 24+SELECT * FROM table1, table2;
 25+SELECT field1, field2 FROM table1, table2;
 26+SELECT ... FROM ... WHERE condition
 27+SELECT ... FROM ... WHERE condition GROUP BY field;
 28+SELECT ... FROM ... WHERE condition GROUP BY field HAVING condition2;
 29+SELECT ... FROM ... WHERE condition ORDER BY field1, field2;
 30+SELECT ... FROM ... WHERE condition ORDER BY field1, field2 DESC;
 31+SELECT ... FROM ... WHERE condition LIMIT 10;
 32+SELECT DISTINCT field1 FROM ...
 33+SELECT DISTINCT field1, field2 FROM ...
 34+```
 35+
 36+### Select - Join
 37+
 38+```sql
 39+SELECT ... FROM t1 JOIN t2 ON t1.id1 = t2.id2 WHERE condition;
 40+SELECT ... FROM t1 LEFT JOIN t2 ON t1.id1 = t2.id2 WHERE condition;
 41+SELECT ... FROM t1 JOIN (t2 JOIN t3 ON ...) ON ...
 42+```
 43+
 44+### Conditions
 45+
 46+```sql
 47+field1 = value1
 48+field1 <> value1
 49+field1 LIKE 'value _ %'
 50+field1 IS NULL
 51+field1 IS NOT NULL
 52+field1 IS IN (value1, value2)
 53+field1 IS NOT IN (value1, value2)
 54+condition1 AND condition2
 55+condition1 OR condition2
 56+```
 57+
 58+### Create / Open / Delete Database
 59+
 60+```sql
 61+CREATE DATABASE DatabaseName;
 62+CREATE DATABASE DatabaseName CHARACTER SET utf8;
 63+USE DatabaseName;
 64+DROP DATABASE DatabaseName;
 65+ALTER DATABASE DatabaseName CHARACTER SET utf8;
 66+```
 67+
 68+### Backup Database to SQL File
 69+
 70+```bash
 71+mysqldump -u Username -p dbNameYouWant > databasename_backup.sql
 72+```
 73+
 74+### Restore from backup SQL File
 75+
 76+```bash
 77+mysql -u Username -p dbNameYouWant < databasename_backup.sql;
 78+```
 79+
 80+### Repair Tables After Unclean Shutdown
 81+
 82+```bash
 83+mysqlcheck --all-databases;
 84+mysqlcheck --all-databases --fast;
 85+```
 86+
 87+### Insert
 88+
 89+```sql
 90+INSERT INTO table1 (field1, field2) VALUES (value1, value2);
 91+```
 92+
 93+### Delete
 94+
 95+```sql
 96+DELETE FROM table1 / TRUNCATE table1
 97+DELETE FROM table1 WHERE condition
 98+DELETE FROM table1, table2 WHERE table1.id1 =
 99+  table2.id2 AND condition
100+```
101+
102+### Update
103+
104+```sql
105+UPDATE table1 SET field1=new_value1 WHERE condition;
106+UPDATE table1, table2 SET field1=new_value1, field2=new_value2, ... WHERE
107+  table1.id1 = table2.id2 AND condition;
108+```
109+
110+### Create / Delete / Modify Table
111+
112+#### Create
113+
114+```sql
115+CREATE TABLE table (field1 type1, field2 type2);
116+CREATE TABLE table (field1 type1, field2 type2, INDEX (field));
117+CREATE TABLE table (field1 type1, field2 type2, PRIMARY KEY (field1));
118+CREATE TABLE table (field1 type1, field2 type2, PRIMARY KEY (field1,field2));
119+```
120+
121+```sql
122+CREATE TABLE table1 (fk_field1 type1, field2 type2, ...,
123+  FOREIGN KEY (fk_field1) REFERENCES table2 (t2_fieldA))
124+    [ON UPDATE|ON DELETE] [CASCADE|SET NULL]
125+```
126+
127+```sql
128+CREATE TABLE table1 (fk_field1 type1, fk_field2 type2, ...,
129+ FOREIGN KEY (fk_field1, fk_field2) REFERENCES table2 (t2_fieldA, t2_fieldB))
130+```
131+
132+```sql
133+CREATE TABLE table IF NOT EXISTS;
134+```
135+
136+```sql
137+CREATE TEMPORARY TABLE table;
138+```
139+
140+#### Drop
141+
142+```sql
143+DROP TABLE table;
144+DROP TABLE IF EXISTS table;
145+DROP TABLE table1, table2, ...
146+```
147+
148+#### Alter
149+
150+```sql
151+ALTER TABLE table MODIFY field1 type1
152+ALTER TABLE table MODIFY field1 type1 NOT NULL ...
153+ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1
154+ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 NOT NULL ...
155+ALTER TABLE table ALTER field1 SET DEFAULT ...
156+ALTER TABLE table ALTER field1 DROP DEFAULT
157+ALTER TABLE table ADD new_name_field1 type1
158+ALTER TABLE table ADD new_name_field1 type1 FIRST
159+ALTER TABLE table ADD new_name_field1 type1 AFTER another_field
160+ALTER TABLE table DROP field1
161+ALTER TABLE table ADD INDEX (field);
162+```
163+
164+#### Change field order
165+
166+```sql
167+ALTER TABLE table MODIFY field1 type1 FIRST
168+ALTER TABLE table MODIFY field1 type1 AFTER another_field
169+ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 FIRST
170+ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 AFTER
171+  another_field
172+```
173+
174+### Keys
175+
176+```sql
177+CREATE TABLE table (..., PRIMARY KEY (field1, field2))
178+CREATE TABLE table (..., FOREIGN KEY (field1, field2) REFERENCES table2
179+(t2_field1, t2_field2))
180+```
181+
182+### Users and Privileges
183+
184+```sql
185+CREATE USER 'user'@'localhost';
186+GRANT ALL PRIVILEGES ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password';
187+GRANT SELECT, INSERT, DELETE ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password';
188+REVOKE ALL PRIVILEGES ON base.* FROM 'user'@'host'; -- one permission only
189+REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'host'; -- all permissions
190+FLUSH PRIVILEGES;
191+```
192+
193+```sql
194+SET PASSWORD = PASSWORD('new_pass');
195+SET PASSWORD FOR 'user'@'host' = PASSWORD('new_pass');
196+SET PASSWORD = OLD_PASSWORD('new_pass');
197+```
198+
199+```sql
200+DROP USER 'user'@'host';
201+```
202+
203+Host ‘%’ indicates any host.
204+
205+### Main Data Types
206+
207+```sql
208+TINYINT (1o: -128 to +127)
209+SMALLINT (2o: +-65 000)
210+MEDIUMINT (3o: +-16 000 000)
211+INT (4o: +- 2 000 000 000)
212+BIGINT (8o: +-9.10^18)
213+```
214+
215+```sql
216+Precise interval: -(2^(8*N-1)) -> (2^8*N)-1
217+```
218+
219+⚠ INT(2) = "2 digits displayed" -- NOT "number with 2 digits max"
220+
221+```sql
222+FLOAT(M,D)
223+DOUBLE(M,D)
224+FLOAT(D=0->53)
225+```
226+
227+⚠ 8,3 -> 12345,678 -- NOT 12345678,123!
228+
229+```sql
230+TIME (HH:MM)
231+YEAR (AAAA)
232+DATE (AAAA-MM-JJ)
233+DATETIME (AAAA-MM-JJ HH:MM; années 1000->9999)
234+TIMESTAMP (like DATETIME, but 1970->2038, compatible with Unix)
235+```
236+
237+```sql
238+VARCHAR (single-line; explicit size)
239+TEXT (multi-lines; max size=65535)
240+BLOB (binary; max size=65535)
241+```
242+
243+Variants for TEXT&BLOB: `TINY` (max=255), `MEDIUM` (max=~16000), and `LONG` (max=4Go). Ex: `VARCHAR(32)`, `TINYTEXT`, `LONGBLOB`, `MEDIUMTEXT`
244+
245+```sql
246+ENUM ('value1', 'value2', ...) -- (default NULL, or '' if NOT NULL)
247+```
248+
249+### Reset Root Password
250+
251+```bash
252+$ /etc/init.d/mysql stop
253+```
254+
255+```bash
256+$ mysqld_safe --skip-grant-tables
257+```
258+
259+```bash
260+$ mysql # on another terminal
261+mysql> UPDATE mysql.user SET password=PASSWORD('new_pass') WHERE user='root';
262+```
263+
264+```bash
265+## Switch back to the mysqld_safe terminal and kill the process using Control + \
266+$ /etc/init.d/mysql start
267+```
268+
269+Your commands may vary depending on your OS.
270+
271+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
272+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/org.md
+116, -0
  1@@ -0,0 +1,116 @@
  2+---
  3+title: Org Mode
  4+layout: 2017/sheet
  5+tags: [WIP]
  6+category: Apps
  7+updated: 2018-02-19
  8+intro: |
  9+  [Org mode](https://orgmode.org/) is for keeping hierarchal notes (and more) in Emacs.
 10+---
 11+
 12+## Syntax
 13+{: .-three-column}
 14+
 15+### Headings
 16+
 17+```org
 18+* Welcome to Org mode
 19+
 20+  Lines starting with * are headings.
 21+  These lines without are notes.
 22+
 23+** Sub-heading
 24+
 25+   Two stars mark a 2nd-level subheading (h2).
 26+```
 27+
 28+### Lists
 29+
 30+```org
 31+* Lists
 32+
 33+To buy:
 34+1. Milk
 35+2. Eggs
 36+   - Organic
 37+3. Cheese
 38+   + Parmesan
 39+   + Mozarella
 40+```
 41+
 42+### Inline styles
 43+
 44+```org
 45+*bold*
 46+/italic/
 47+_underline_
 48+=verbatim=
 49+~code~
 50++strike-through+
 51+```
 52+
 53+### To do
 54+
 55+```org
 56+* TODO buy airplane
 57+```
 58+
 59+Cycle by using `S-LEFT` / `S-RIGHT`. List all TODO's via `C-c C-v`.
 60+
 61+## Shortcuts
 62+{: .-three-column}
 63+
 64+### Basic shortcuts
 65+
 66+| Description    | Shortcut             |
 67+| ---            | ---                  |
 68+| (Un) fold      | `TAB` / `S-TAB`      |
 69+| Move up        | `M-UP` / `M-DOWN`    |
 70+| New headline   | `M-RET`              |
 71+| Cycle workflow | `S-LEFT` / `S-RIGHT` |
 72+| Cycle priority | `S-UP` / `S-DOWN` |
 73+{:.-shortcuts-right}
 74+
 75+### Timer
 76+
 77+| Description     | Shortcut        |
 78+| ---             | ---             |
 79+| Start timer     | `C-c` `C-x` `0` |
 80+| Stop timer      | `C-c` `C-x` `_` |
 81+| Pause timer     | `C-c` `C-x` `,` |
 82+| ---             | ---             |
 83+| Start countdown | `C-c` `C-x` `;` |
 84+{:.-shortcuts-right}
 85+
 86+You can use this for Pomodoro!
 87+
 88+### Agenda
 89+
 90+| Description     | Shortcut        |
 91+| ---             | ---             |
 92+| Agenda menu     | `C-c` `a`       |
 93+| ---             | ---             |
 94+| Add document    | `C-c` `[`       |
 95+| Remove document | `C-c` `]`       |
 96+| ---             | ---             |
 97+| Add date        | `C-c` `.`       |
 98+| Add time & date | `C-u` `C-c` `.` |
 99+{:.-shortcuts-right}
100+
101+Start by adding the current file to the agenda (`C-c [`), then use the agenda menu to navigate.
102+
103+### Export
104+
105+| Description | Shortcut    |
106+| ---         | ---         |
107+| Export menu | `C-c` `C-e` |
108+
109+Lets you export the document as Markdown, HTML, and others.
110+
111+## References
112+
113+- [Org for beginners](https://orgmode.org/worg/org-tutorials/org4beginners.html) _(orgmode.org)_
114+- [Org mode website](https://orgmode.org/) _(orgmode.org)_
115+
116+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
117+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/postgresql.md
+27, -0
 1@@ -0,0 +1,27 @@
 2+---
 3+title: PostgreSQL
 4+category: Databases
 5+---
 6+
 7+Replace anything within `<placeholder>` accordingly
 8+
 9+### Console
10+
11+    $ psql #logs in to default database & default user
12+    $ sudo -u <rolename:postgres> psql #logs in with a particular user
13+
14+### Commands
15+
16+ * Show roles: `\du`
17+ * Show tables: `\dt`
18+ * Show databases: `\l`
19+ * Connect to a database: `\c <database>`
20+ * Show columns of a table: `\d <table>` or `\d+ <table>`
21+ * Quit: `\q`
22+
23+### Creating database
24+
25+     $ createdb databasename
26+
27+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
28+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/python.md
+170, -0
  1@@ -0,0 +1,170 @@
  2+---
  3+title: Python
  4+category: Python
  5+---
  6+
  7+### Tuples (immutable)
  8+
  9+    tuple = ()
 10+
 11+### Lists (mutable)
 12+
 13+    list = []
 14+    list[i:j]  # returns list subset
 15+    list[-1]   # returns last element
 16+    list[:-1]  # returns all but the last element
 17+    *list      # expands all elements in place
 18+    
 19+    list[i] = val
 20+    list[i:j] = otherlist  # replace ith to jth-1 elements with otherlist
 21+    del list[i:j]
 22+
 23+    list.append(item)
 24+    list.extend(another_list)
 25+    list.insert(index, item)
 26+    list.pop()        # returns and removes last element from the list
 27+    list.pop(i)       # returns and removes i-th element from the list
 28+    list.remove(i)    # removes the first item from the list whose value is i
 29+    list1 + list2     # combine two list    
 30+    set(list)         # remove duplicate elements from a list
 31+
 32+    list.reverse()    # reverses the elements of the list in-place
 33+    list.count(item)
 34+    sum(list)
 35+
 36+    zip(list1, list2)  # returns list of tuples with n-th element of both list1 and list2
 37+    list.sort()        # sorts in-place, returns None
 38+    sorted(list)       # returns sorted copy of list
 39+    ",".join(list)     # returns a string with list elements seperated by comma
 40+
 41+### Dict
 42+
 43+    dict = {}
 44+    dict.keys()
 45+    dict.values()
 46+    "key" in dict    # let's say this returns False, then...
 47+    dict["key"]      # ...this raises KeyError
 48+    dict.get("key")  # ...this returns None
 49+    dict.setdefault("key", 1)
 50+    **dict           # expands all k/v pairs in place
 51+
 52+### Iteration
 53+
 54+    for item in ["a", "b", "c"]:
 55+    for i in range(4):        # 0 to 3
 56+    for i in range(4, 8):     # 4 to 7
 57+    for i in range(1, 9, 2):  # 1, 3, 5, 7
 58+    for key, val in dict.items():
 59+    for index, item in enumerate(list):
 60+
 61+### [String](https://docs.python.org/2/library/stdtypes.html#string-methods)
 62+
 63+    str[0:4]
 64+    len(str)
 65+
 66+    string.replace("-", " ")
 67+    ",".join(list)
 68+    "hi {0}".format('j')
 69+    f"hi {name}" # same as "hi {}".format('name')
 70+    str.find(",")
 71+    str.index(",")   # same, but raises IndexError
 72+    str.count(",")
 73+    str.split(",")
 74+
 75+    str.lower()
 76+    str.upper()
 77+    str.title()
 78+
 79+    str.lstrip()
 80+    str.rstrip()
 81+    str.strip()
 82+
 83+    str.islower()
 84+    
 85+    /* escape characters */
 86+    >>> 'doesn\'t'  # use \' to escape the single quote...
 87+        "doesn't"
 88+    >>> "doesn't"  # ...or use double quotes instead
 89+        "doesn't"
 90+    >>> '"Yes," they said.'
 91+        '"Yes," they said.'
 92+    >>> "\"Yes,\" they said."
 93+        '"Yes," they said.'
 94+    >>> '"Isn\'t," they said.'
 95+        '"Isn\'t," they said.'
 96+
 97+### Casting
 98+
 99+    int(str)
100+    float(str)
101+    str(int)
102+    str(float)
103+    'string'.encode()
104+
105+### Comprehensions
106+
107+    [fn(i) for i in list]            # .map
108+    map(fn, list)                    # .map, returns iterator
109+    
110+    filter(fn, list)                 # .filter, returns iterator
111+    [fn(i) for i in list if i > 0]   # .filter.map
112+
113+### Regex
114+
115+    import re
116+
117+    re.match(r'^[aeiou]', str)
118+    re.sub(r'^[aeiou]', '?', str)
119+    re.sub(r'(xyz)', r'\1', str)
120+
121+    expr = re.compile(r'^...$')
122+    expr.match(...)
123+    expr.sub(...)
124+
125+## File manipulation
126+    
127+### Reading
128+
129+```py
130+file = open("hello.txt", "r") # open in read mode 'r'
131+file.close() 
132+```
133+
134+```py
135+print(file.read())  # read the entire file and set the cursor at the end of file
136+print file.readline() # Reading one line
137+file.seek(0, 0) # place the cursor at the beginning of the file
138+```
139+
140+### Writing (overwrite)
141+
142+```py
143+file = open("hello.txt", "w") # open in write mode 'w'
144+file.write("Hello World") 
145+
146+text_lines = ["First line", "Second line", "Last line"] 
147+file.writelines(text_lines)
148+
149+file.close()
150+```
151+
152+### Writing (append)
153+
154+```py
155+file = open("Hello.txt", "a") # open in append mode
156+file.write("Hello World again")  
157+file.close()
158+```
159+
160+### Context manager
161+
162+```py
163+with open("welcome.txt", "r") as file:
164+    # 'file' refers directly to "welcome.txt"
165+   data = file.read()
166+
167+# It closes the file automatically at the end of scope, no need for `file.close()`.
168+```
169+
170+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
171+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/rake.md
+38, -0
 1@@ -0,0 +1,38 @@
 2+---
 3+title: Rake
 4+category: Ruby
 5+layout: 2017/sheet
 6+---
 7+
 8+### Basic syntax
 9+
10+```rb
11+namespace :foo do
12+  desc "Description"
13+  task :bar do
14+    ...
15+  end
16+
17+  task :baz => :dependency do
18+  end
19+
20+  task :baz => [:dep1, :dep2, :dep3] do
21+  end
22+end
23+
24+# rake foo:bar
25+```
26+
27+### Rake task with arguments
28+
29+```rb
30+desc "Do something"
31+task :workit, [:id] => :environment do |_, args|
32+  id = args[:id]
33+end
34+
35+# rake workit[234]
36+```
37+
38+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
39+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/ruby.md
+34, -0
 1@@ -0,0 +1,34 @@
 2+---
 3+title: Ruby
 4+category: Ruby
 5+tags: [WIP]
 6+layout: 2017/sheet
 7+intro: |
 8+  Quick reference to some features of the Ruby programming language.
 9+---
10+
11+### Reference
12+
13+{:.-one-column}
14+
15+| Code                    | Description                                               |
16+| ----------------------- | --------------------------------------------------------- |
17+| `$!`                    | latest error message                                      |
18+| `$@`                    | location of error                                         |
19+| `$_`                    | string last read by gets                                  |
20+| `$.`                    | line number last read by interpreter                      |
21+| `$&`                    | string last matched by regexp                             |
22+| `$~`                    | the last regexp match, as an array of subexpressions      |
23+| `$n`                    | the nth subexpression in the last match (same as `$~[n]`) |
24+| `$=`                    | case-insensitivity flag                                   |
25+| `$/`                    | input record separator                                    |
26+| `$\`                    | output record separator                                   |
27+| `$0`                    | the name of the ruby script file                          |
28+| `$*` (or `ARGV`)        | the command line arguments                                |
29+| `$$`                    | interpreter's process ID                                  |
30+| `$?`                    | exit status of last executed child process                |
31+| `$-i` `$-l` `$-p` `$-v` | Command line switches                                     |
32+| `$-v` (or `$VERBOSE`)   | verbose mode                                              |
33+
34+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
35+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/sed.md
+59, -0
 1@@ -0,0 +1,59 @@
 2+---
 3+title: sed
 4+category: CLI
 5+layout: 2017/sheet
 6+intro: |
 7+  Here's some hints on using sed.
 8+---
 9+
10+## In place replacements
11+
12+### In-place replacement (GNU)
13+
14+```bash
15+sed -i -e 's/foo/bar/' example.md
16+```
17+
18+In GNU sed: use `-i` without arg.
19+
20+#### In-place replacement (BSD)
21+
22+```bash
23+sed -i '' -e 's/foo/bar/' example.md
24+```
25+
26+ In OSX, `-i ''` is required.
27+
28+## File regions
29+{:.-three-column}
30+
31+### Print until a certain line is met
32+
33+```bash
34+sed '/begin api/q'
35+```
36+
37+### Print until a certain line is met, but not that line
38+
39+```bash
40+sed '/^# begin/,$d'
41+```
42+
43+### Print everything after a given line
44+
45+```bash
46+sed -n '/end api/,$p'
47+```
48+
49+Print after a given line is found.
50+
51+### Print everything except matching
52+
53+```bash
54+sed -n '/regex/!p'
55+```
56+
57+Print everything except lines matching regex. Useful for printing files with comments.
58+
59+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
60+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/shell.md
+843, -0
  1@@ -0,0 +1,843 @@
  2+---
  3+title: Bash scripting
  4+category: CLI
  5+layout: 2017/sheet
  6+tags: [Featured]
  7+updated: 2020-07-05
  8+keywords:
  9+  - Variables
 10+  - Functions
 11+  - Interpolation
 12+  - Brace expansions
 13+  - Loops
 14+  - Conditional execution
 15+  - Command substitution
 16+---
 17+
 18+Getting started
 19+---------------
 20+{: .-three-column}
 21+
 22+### Introduction
 23+{: .-intro}
 24+
 25+This is a quick reference to getting started with Bash scripting.
 26+
 27+- [Learn bash in y minutes](https://learnxinyminutes.com/docs/bash/) _(learnxinyminutes.com)_
 28+- [Bash Guide](http://mywiki.wooledge.org/BashGuide) _(mywiki.wooledge.org)_
 29+- [Bash Hackers Wiki](https://wiki.bash-hackers.org) _(wiki.bash-hackers.org)_
 30+
 31+### Example
 32+
 33+```bash
 34+#!/usr/bin/env bash
 35+
 36+name="John"
 37+echo "Hello $name!"
 38+```
 39+
 40+### Variables
 41+
 42+```bash
 43+name="John"
 44+echo $name  # see below
 45+echo "$name"
 46+echo "${name}!"
 47+```
 48+Generally quote your variables unless they contain wildcards to expand or command fragments.
 49+
 50+```bash
 51+wildcard="*.txt"
 52+option="iv"
 53+cp -$options $wildcard /tmp
 54+```
 55+
 56+### String quotes
 57+
 58+```bash
 59+name="John"
 60+echo "Hi $name"  #=> Hi John
 61+echo 'Hi $name'  #=> Hi $name
 62+```
 63+
 64+### Shell execution
 65+
 66+```bash
 67+echo "I'm in $(pwd)"
 68+echo "I'm in `pwd`"  # obsolescent
 69+# Same
 70+```
 71+
 72+See [Command substitution](http://wiki.bash-hackers.org/syntax/expansion/cmdsubst)
 73+
 74+### Conditional execution
 75+
 76+```bash
 77+git commit && git push
 78+git commit || echo "Commit failed"
 79+```
 80+
 81+### Functions
 82+{: id='functions-example'}
 83+
 84+```bash
 85+get_name() {
 86+  echo "John"
 87+}
 88+
 89+echo "You are $(get_name)"
 90+```
 91+
 92+See: [Functions](#functions)
 93+
 94+### Conditionals
 95+{: id='conditionals-example'}
 96+
 97+```bash
 98+if [[ -z "$string" ]]; then
 99+  echo "String is empty"
100+elif [[ -n "$string" ]]; then
101+  echo "String is not empty"
102+fi
103+```
104+
105+See: [Conditionals](#conditionals)
106+
107+### Strict mode
108+
109+```bash
110+set -euo pipefail
111+IFS=$'\n\t'
112+```
113+
114+See: [Unofficial bash strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/)
115+
116+### Brace expansion
117+
118+```bash
119+echo {A,B}.js
120+```
121+
122+| Expression | Description         |
123+| ---------- | ------------------- |
124+| `{A,B}`    | Same as `A B`       |
125+| `{A,B}.js` | Same as `A.js B.js` |
126+| `{1..5}`   | Same as `1 2 3 4 5` |
127+
128+See: [Brace expansion](http://wiki.bash-hackers.org/syntax/expansion/brace)
129+
130+
131+Parameter expansions
132+--------------------
133+{: .-three-column}
134+
135+### Basics
136+
137+```bash
138+name="John"
139+echo "${name}"
140+echo "${name/J/j}"    #=> "john" (substitution)
141+echo "${name:0:2}"    #=> "Jo" (slicing)
142+echo "${name::2}"     #=> "Jo" (slicing)
143+echo "${name::-1}"    #=> "Joh" (slicing)
144+echo "${name:(-1)}"   #=> "n" (slicing from right)
145+echo "${name:(-2):1}" #=> "h" (slicing from right)
146+echo "${food:-Cake}"  #=> $food or "Cake"
147+```
148+
149+```bash
150+length=2
151+echo "${name:0:length}"  #=> "Jo"
152+```
153+
154+See: [Parameter expansion](http://wiki.bash-hackers.org/syntax/pe)
155+
156+```bash
157+str="/path/to/foo.cpp"
158+echo "${str%.cpp}"    # /path/to/foo
159+echo "${str%.cpp}.o"  # /path/to/foo.o
160+echo "${str%/*}"      # /path/to
161+
162+echo "${str##*.}"     # cpp (extension)
163+echo "${str##*/}"     # foo.cpp (basepath)
164+
165+echo "${str#*/}"      # path/to/foo.cpp
166+echo "${str##*/}"     # foo.cpp
167+
168+echo "${str/foo/bar}" # /path/to/bar.cpp
169+```
170+
171+```bash
172+str="Hello world"
173+echo "${str:6:5}"   # "world"
174+echo "${str: -5:5}"  # "world"
175+```
176+
177+```bash
178+src="/path/to/foo.cpp"
179+base=${src##*/}   #=> "foo.cpp" (basepath)
180+dir=${src%$base}  #=> "/path/to/" (dirpath)
181+```
182+
183+### Substitution
184+
185+| Code              | Description         |
186+| ----------------- | ------------------- |
187+| `${foo%suffix}`   | Remove suffix       |
188+| `${foo#prefix}`   | Remove prefix       |
189+| ---               | ---                 |
190+| `${foo%%suffix}`  | Remove long suffix  |
191+| `${foo##prefix}`  | Remove long prefix  |
192+| ---               | ---                 |
193+| `${foo/from/to}`  | Replace first match |
194+| `${foo//from/to}` | Replace all         |
195+| ---               | ---                 |
196+| `${foo/%from/to}` | Replace suffix      |
197+| `${foo/#from/to}` | Replace prefix      |
198+
199+### Comments
200+
201+```bash
202+# Single line comment
203+```
204+
205+```bash
206+: '
207+This is a
208+multi line
209+comment
210+'
211+```
212+
213+### Substrings
214+
215+| Expression      | Description                    |
216+| --------------- | ------------------------------ |
217+| `${foo:0:3}`    | Substring _(position, length)_ |
218+| `${foo:(-3):3}` | Substring from the right       |
219+
220+### Length
221+
222+| Expression | Description      |
223+| ---------- | ---------------- |
224+| `${#foo}`  | Length of `$foo` |
225+
226+### Manipulation
227+
228+```bash
229+str="HELLO WORLD!"
230+echo "${str,}"   #=> "hELLO WORLD!" (lowercase 1st letter)
231+echo "${str,,}"  #=> "hello world!" (all lowercase)
232+
233+str="hello world!"
234+echo "${str^}"   #=> "Hello world!" (uppercase 1st letter)
235+echo "${str^^}"  #=> "HELLO WORLD!" (all uppercase)
236+```
237+
238+### Default values
239+
240+| Expression        | Description                                              |
241+| ----------------- | -------------------------------------------------------- |
242+| `${foo:-val}`     | `$foo`, or `val` if unset (or null)                      |
243+| `${foo:=val}`     | Set `$foo` to `val` if unset (or null)                   |
244+| `${foo:+val}`     | `val` if `$foo` is set (and not null)                    |
245+| `${foo:?message}` | Show error message and exit if `$foo` is unset (or null) |
246+
247+Omitting the `:` removes the (non)nullity checks, e.g. `${foo-val}` expands to `val` if unset otherwise `$foo`.
248+
249+Loops
250+-----
251+{: .-three-column}
252+
253+### Basic for loop
254+
255+```bash
256+for i in /etc/rc.*; do
257+  echo "$i"
258+done
259+```
260+
261+### C-like for loop
262+
263+```bash
264+for ((i = 0 ; i < 100 ; i++)); do
265+  echo "$i"
266+done
267+```
268+
269+### Ranges
270+
271+```bash
272+for i in {1..5}; do
273+    echo "Welcome $i"
274+done
275+```
276+
277+#### With step size
278+
279+```bash
280+for i in {5..50..5}; do
281+    echo "Welcome $i"
282+done
283+```
284+
285+### Reading lines
286+
287+```bash
288+while read -r line; do
289+  echo "$line"
290+done <file.txt
291+```
292+
293+### Forever
294+
295+```bash
296+while true; do
297+  ···
298+done
299+```
300+
301+Functions
302+---------
303+{: .-three-column}
304+
305+### Defining functions
306+
307+```bash
308+myfunc() {
309+    echo "hello $1"
310+}
311+```
312+
313+```bash
314+# Same as above (alternate syntax)
315+function myfunc() {
316+    echo "hello $1"
317+}
318+```
319+
320+```bash
321+myfunc "John"
322+```
323+
324+### Returning values
325+
326+```bash
327+myfunc() {
328+    local myresult='some value'
329+    echo "$myresult"
330+}
331+```
332+
333+```bash
334+result=$(myfunc)
335+```
336+
337+### Raising errors
338+
339+```bash
340+myfunc() {
341+  return 1
342+}
343+```
344+
345+```bash
346+if myfunc; then
347+  echo "success"
348+else
349+  echo "failure"
350+fi
351+```
352+
353+### Arguments
354+
355+| Expression | Description                                      |
356+| ---        | ---                                              |
357+| `$#`       | Number of arguments                              |
358+| `$*`       | All positional arguments  (as a single word)     |
359+| `$@`       | All positional arguments (as separate strings)  |
360+| `$1`       | First argument                                   |
361+| `$_`       | Last argument of the previous command            |
362+
363+**Note**: `$@` and `$*` must be quoted in order to perform as described.
364+Otherwise, they do exactly the same thing (arguments as separate strings).
365+
366+See [Special parameters](http://wiki.bash-hackers.org/syntax/shellvars#special_parameters_and_shell_variables).
367+
368+Conditionals
369+------------
370+{: .-three-column}
371+
372+### Conditions
373+
374+Note that `[[` is actually a command/program that returns either `0` (true) or `1` (false). Any program that obeys the same logic (like all base utils, such as `grep(1)` or `ping(1)`) can be used as condition, see examples.
375+
376+| Condition                | Description           |
377+| ---                      | ---                   |
378+| `[[ -z STRING ]]`        | Empty string          |
379+| `[[ -n STRING ]]`        | Not empty string      |
380+| `[[ STRING == STRING ]]` | Equal                 |
381+| `[[ STRING != STRING ]]` | Not Equal             |
382+| ---                      | ---                   |
383+| `[[ NUM -eq NUM ]]`      | Equal                 |
384+| `[[ NUM -ne NUM ]]`      | Not equal             |
385+| `[[ NUM -lt NUM ]]`      | Less than             |
386+| `[[ NUM -le NUM ]]`      | Less than or equal    |
387+| `[[ NUM -gt NUM ]]`      | Greater than          |
388+| `[[ NUM -ge NUM ]]`      | Greater than or equal |
389+| ---                      | ---                   |
390+| `[[ STRING =~ STRING ]]` | Regexp                |
391+| ---                      | ---                   |
392+| `(( NUM < NUM ))`        | Numeric conditions    |
393+
394+#### More conditions
395+
396+| Condition            | Description              |
397+| -------------------- | ------------------------ |
398+| `[[ -o noclobber ]]` | If OPTIONNAME is enabled |
399+| ---                  | ---                      |
400+| `[[ ! EXPR ]]`       | Not                      |
401+| `[[ X && Y ]]`       | And                      |
402+| `[[ X || Y ]]`       | Or                       |
403+
404+### File conditions
405+
406+| Condition               | Description             |
407+| ---                     | ---                     |
408+| `[[ -e FILE ]]`         | Exists                  |
409+| `[[ -r FILE ]]`         | Readable                |
410+| `[[ -h FILE ]]`         | Symlink                 |
411+| `[[ -d FILE ]]`         | Directory               |
412+| `[[ -w FILE ]]`         | Writable                |
413+| `[[ -s FILE ]]`         | Size is > 0 bytes       |
414+| `[[ -f FILE ]]`         | File                    |
415+| `[[ -x FILE ]]`         | Executable              |
416+| ---                     | ---                     |
417+| `[[ FILE1 -nt FILE2 ]]` | 1 is more recent than 2 |
418+| `[[ FILE1 -ot FILE2 ]]` | 2 is more recent than 1 |
419+| `[[ FILE1 -ef FILE2 ]]` | Same files              |
420+
421+### Example
422+
423+```bash
424+# String
425+if [[ -z "$string" ]]; then
426+  echo "String is empty"
427+elif [[ -n "$string" ]]; then
428+  echo "String is not empty"
429+else
430+  echo "This never happens"
431+fi
432+```
433+
434+```bash
435+# Combinations
436+if [[ X && Y ]]; then
437+  ...
438+fi
439+```
440+
441+```bash
442+# Equal
443+if [[ "$A" == "$B" ]]
444+```
445+
446+```bash
447+# Regex
448+if [[ "A" =~ . ]]
449+```
450+
451+```bash
452+if (( $a < $b )); then
453+   echo "$a is smaller than $b"
454+fi
455+```
456+
457+```bash
458+if [[ -e "file.txt" ]]; then
459+  echo "file exists"
460+fi
461+```
462+
463+Arrays
464+------
465+
466+### Defining arrays
467+
468+```bash
469+Fruits=('Apple' 'Banana' 'Orange')
470+```
471+
472+```bash
473+Fruits[0]="Apple"
474+Fruits[1]="Banana"
475+Fruits[2]="Orange"
476+```
477+
478+### Working with arrays
479+
480+```bash
481+echo "${Fruits[0]}"           # Element #0
482+echo "${Fruits[-1]}"          # Last element
483+echo "${Fruits[@]}"           # All elements, space-separated
484+echo "${#Fruits[@]}"          # Number of elements
485+echo "${#Fruits}"             # String length of the 1st element
486+echo "${#Fruits[3]}"          # String length of the Nth element
487+echo "${Fruits[@]:3:2}"       # Range (from position 3, length 2)
488+echo "${!Fruits[@]}"          # Keys of all elements, space-separated
489+```
490+
491+### Operations
492+
493+```bash
494+Fruits=("${Fruits[@]}" "Watermelon")    # Push
495+Fruits+=('Watermelon')                  # Also Push
496+Fruits=( "${Fruits[@]/Ap*/}" )          # Remove by regex match
497+unset Fruits[2]                         # Remove one item
498+Fruits=("${Fruits[@]}")                 # Duplicate
499+Fruits=("${Fruits[@]}" "${Veggies[@]}") # Concatenate
500+lines=(`cat "logfile"`)                 # Read from file
501+```
502+
503+### Iteration
504+
505+```bash
506+for i in "${arrayName[@]}"; do
507+  echo "$i"
508+done
509+```
510+
511+Dictionaries
512+------------
513+{: .-three-column}
514+
515+### Defining
516+
517+```bash
518+declare -A sounds
519+```
520+
521+```bash
522+sounds[dog]="bark"
523+sounds[cow]="moo"
524+sounds[bird]="tweet"
525+sounds[wolf]="howl"
526+```
527+
528+Declares `sound` as a Dictionary object (aka associative array).
529+
530+### Working with dictionaries
531+
532+```bash
533+echo "${sounds[dog]}" # Dog's sound
534+echo "${sounds[@]}"   # All values
535+echo "${!sounds[@]}"  # All keys
536+echo "${#sounds[@]}"  # Number of elements
537+unset sounds[dog]     # Delete dog
538+```
539+
540+### Iteration
541+
542+#### Iterate over values
543+
544+```bash
545+for val in "${sounds[@]}"; do
546+  echo "$val"
547+done
548+```
549+
550+#### Iterate over keys
551+
552+```bash
553+for key in "${!sounds[@]}"; do
554+  echo "$key"
555+done
556+```
557+
558+Options
559+-------
560+
561+### Options
562+
563+```bash
564+set -o noclobber  # Avoid overlay files (echo "hi" > foo)
565+set -o errexit    # Used to exit upon error, avoiding cascading errors
566+set -o pipefail   # Unveils hidden failures
567+set -o nounset    # Exposes unset variables
568+```
569+
570+### Glob options
571+
572+```bash
573+shopt -s nullglob    # Non-matching globs are removed  ('*.foo' => '')
574+shopt -s failglob    # Non-matching globs throw errors
575+shopt -s nocaseglob  # Case insensitive globs
576+shopt -s dotglob     # Wildcards match dotfiles ("*.sh" => ".foo.sh")
577+shopt -s globstar    # Allow ** for recursive matches ('lib/**/*.rb' => 'lib/a/b/c.rb')
578+```
579+
580+Set `GLOBIGNORE` as a colon-separated list of patterns to be removed from glob
581+matches.
582+
583+History
584+-------
585+
586+### Commands
587+
588+| Command               | Description                               |
589+| --------------------- | ----------------------------------------- |
590+| `history`             | Show history                              |
591+| `shopt -s histverify` | Don't execute expanded result immediately |
592+
593+### Expansions
594+
595+| Expression   | Description                                          |
596+| ------------ | ---------------------------------------------------- |
597+| `!$`         | Expand last parameter of most recent command         |
598+| `!*`         | Expand all parameters of most recent command         |
599+| `!-n`        | Expand `n`th most recent command                     |
600+| `!n`         | Expand `n`th command in history                      |
601+| `!<command>` | Expand most recent invocation of command `<command>` |
602+
603+### Operations
604+
605+| Code                 | Description                                                           |
606+| -------------------- | --------------------------------------------------------------------- |
607+| `!!`                 | Execute last command again                                            |
608+| `!!:s/<FROM>/<TO>/`  | Replace first occurrence of `<FROM>` to `<TO>` in most recent command |
609+| `!!:gs/<FROM>/<TO>/` | Replace all occurrences of `<FROM>` to `<TO>` in most recent command  |
610+| `!$:t`               | Expand only basename from last parameter of most recent command       |
611+| `!$:h`               | Expand only directory from last parameter of most recent command      |
612+
613+`!!` and `!$` can be replaced with any valid expansion.
614+
615+### Slices
616+
617+| Code     | Description                                                                              |
618+| -------- | ---------------------------------------------------------------------------------------- |
619+| `!!:n`   | Expand only `n`th token from most recent command (command is `0`; first argument is `1`) |
620+| `!^`     | Expand first argument from most recent command                                           |
621+| `!$`     | Expand last token from most recent command                                               |
622+| `!!:n-m` | Expand range of tokens from most recent command                                          |
623+| `!!:n-$` | Expand `n`th token to last from most recent command                                      |
624+
625+`!!` can be replaced with any valid expansion i.e. `!cat`, `!-2`, `!42`, etc.
626+
627+
628+Miscellaneous
629+-------------
630+
631+### Numeric calculations
632+
633+```bash
634+$((a + 200))      # Add 200 to $a
635+```
636+
637+```bash
638+$(($RANDOM%200))  # Random number 0..199
639+```
640+
641+### Subshells
642+
643+```bash
644+(cd somedir; echo "I'm now in $PWD")
645+pwd # still in first directory
646+```
647+
648+### Redirection
649+
650+```bash
651+python hello.py > output.txt            # stdout to (file)
652+python hello.py >> output.txt           # stdout to (file), append
653+python hello.py 2> error.log            # stderr to (file)
654+python hello.py 2>&1                    # stderr to stdout
655+python hello.py 2>/dev/null             # stderr to (null)
656+python hello.py >output.txt 2>&1        # stdout and stderr to (file), equivalent to &>
657+python hello.py &>/dev/null             # stdout and stderr to (null)
658+echo "$0: warning: too many users" >&2  # print diagnostic message to stderr
659+```
660+
661+```bash
662+python hello.py < foo.txt      # feed foo.txt to stdin for python
663+diff <(ls -r) <(ls)            # Compare two stdout without files
664+```
665+
666+### Inspecting commands
667+
668+```bash
669+command -V cd
670+#=> "cd is a function/alias/whatever"
671+```
672+
673+### Trap errors
674+
675+```bash
676+trap 'echo Error at about $LINENO' ERR
677+```
678+
679+or
680+
681+```bash
682+traperr() {
683+  echo "ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}"
684+}
685+
686+set -o errtrace
687+trap traperr ERR
688+```
689+
690+### Case/switch
691+
692+```bash
693+case "$1" in
694+  start | up)
695+    vagrant up
696+    ;;
697+
698+  *)
699+    echo "Usage: $0 {start|stop|ssh}"
700+    ;;
701+esac
702+```
703+
704+### Source relative
705+
706+```bash
707+source "${0%/*}/../share/foo.sh"
708+```
709+
710+### printf
711+
712+```bash
713+printf "Hello %s, I'm %s" Sven Olga
714+#=> "Hello Sven, I'm Olga
715+
716+printf "1 + 1 = %d" 2
717+#=> "1 + 1 = 2"
718+
719+printf "This is how you print a float: %f" 2
720+#=> "This is how you print a float: 2.000000"
721+
722+printf '%s\n' '#!/bin/bash' 'echo hello' >file
723+# format string is applied to each group of arguments
724+printf '%i+%i=%i\n' 1 2 3  4 5 9
725+```
726+
727+### Transform strings
728+
729+| Command option     | Description                                         |
730+| ------------------ | --------------------------------------------------- |
731+| `-c`               | Operations apply to characters not in the given set |
732+| `-d`               | Delete characters                                   |
733+| `-s`               | Replaces repeated characters with single occurrence |
734+| `-t`               | Truncates                                           |
735+| `[:upper:]`        | All upper case letters                              |
736+| `[:lower:]`        | All lower case letters                              |
737+| `[:digit:]`        | All digits                                          |
738+| `[:space:]`        | All whitespace                                      |
739+| `[:alpha:]`        | All letters                                         |
740+| `[:alnum:]`        | All letters and digits                              |
741+
742+#### Example
743+
744+```bash
745+echo "Welcome To Devhints" | tr '[:lower:]' '[:upper:]'
746+WELCOME TO DEVHINTS
747+```
748+
749+### Directory of script
750+
751+```bash
752+dir=${0%/*}
753+```
754+
755+### Getting options
756+
757+```bash
758+while [[ "$1" =~ ^- && ! "$1" == "--" ]]; do case $1 in
759+  -V | --version )
760+    echo "$version"
761+    exit
762+    ;;
763+  -s | --string )
764+    shift; string=$1
765+    ;;
766+  -f | --flag )
767+    flag=1
768+    ;;
769+esac; shift; done
770+if [[ "$1" == '--' ]]; then shift; fi
771+```
772+
773+### Heredoc
774+
775+```sh
776+cat <<END
777+hello world
778+END
779+```
780+
781+### Reading input
782+
783+```bash
784+echo -n "Proceed? [y/n]: "
785+read -r ans
786+echo "$ans"
787+```
788+
789+The `-r` option disables a peculiar legacy behavior with backslashes.
790+
791+```bash
792+read -n 1 ans    # Just one character
793+```
794+
795+### Special variables
796+
797+| Expression         | Description                            |
798+| ------------------ | -------------------------------------- |
799+| `$?`               | Exit status of last task               |
800+| `$!`               | PID of last background task            |
801+| `$$`               | PID of shell                           |
802+| `$0`               | Filename of the shell script           |
803+| `$_`               | Last argument of the previous command  |
804+| `${PIPESTATUS[n]}` | return value of piped commands (array) |
805+
806+See [Special parameters](http://wiki.bash-hackers.org/syntax/shellvars#special_parameters_and_shell_variables).
807+
808+### Go to previous directory
809+
810+```bash
811+pwd # /home/user/foo
812+cd bar/
813+pwd # /home/user/foo/bar
814+cd -
815+pwd # /home/user/foo
816+```
817+
818+### Check for command's result
819+
820+```bash
821+if ping -c 1 google.com; then
822+  echo "It appears you have a working internet connection"
823+fi
824+```
825+
826+### Grep check
827+
828+```bash
829+if grep -q 'foo' ~/.bash_history; then
830+  echo "You appear to have typed 'foo' in the past"
831+fi
832+```
833+
834+## Also see
835+{: .-one-column}
836+
837+* [Bash-hackers wiki](http://wiki.bash-hackers.org/) _(bash-hackers.org)_
838+* [Shell vars](http://wiki.bash-hackers.org/syntax/shellvars) _(bash-hackers.org)_
839+* [Learn bash in y minutes](https://learnxinyminutes.com/docs/bash/) _(learnxinyminutes.com)_
840+* [Bash Guide](http://mywiki.wooledge.org/BashGuide) _(mywiki.wooledge.org)_
841+* [ShellCheck](https://www.shellcheck.net/) _(shellcheck.net)_
842+
843+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
844+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/sql.md
+27, -0
 1@@ -0,0 +1,27 @@
 2+---
 3+title: PostgreSQL
 4+category: Databases
 5+---
 6+
 7+Replace anything within `<placeholder>` accordingly
 8+
 9+### Console
10+
11+    $ psql #logs in to default database & default user
12+    $ sudo -u <rolename:postgres> psql #logs in with a particular user
13+
14+### Commands
15+
16+ * Show roles: `\du`
17+ * Show tables: `\dt`
18+ * Show databases: `\l`
19+ * Connect to a database: `\c <database>`
20+ * Show columns of a table: `\d <table>` or `\d+ <table>`
21+ * Quit: `\q`
22+
23+### Creating database
24+
25+     $ createdb databasename
26+
27+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
28+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/typescript.md
+287, -0
  1@@ -0,0 +1,287 @@
  2+---
  3+title: TypeScript
  4+category: JavaScript libraries
  5+---
  6+
  7+TypeScript is just like ES2015 with type-checking. All ES2015 (classes, etc) should work.
  8+
  9+## Basic types
 10+
 11+```ts
 12+any
 13+void
 14+
 15+boolean
 16+number
 17+string
 18+
 19+null
 20+undefined
 21+
 22+bigint
 23+symbol
 24+
 25+string[]          /* or Array<string> */
 26+[string, number]  /* tuple */
 27+
 28+string | null | undefined   /* union */
 29+
 30+never  /* unreachable */
 31+unknown
 32+```
 33+
 34+```ts
 35+enum Color {
 36+  Red,
 37+  Green,
 38+  Blue = 4
 39+};
 40+
 41+let c: Color = Color.Green
 42+```
 43+
 44+## Declarations
 45+
 46+```ts
 47+let isDone: boolean
 48+let isDone: boolean = false
 49+```
 50+
 51+```ts
 52+function add (a: number, b: number): number {
 53+  return a + b
 54+}
 55+
 56+// Return type is optional
 57+function add (a: number, b: number) { ... }
 58+```
 59+
 60+## Type assertions
 61+
 62+#### Variables
 63+```ts
 64+let len: number = (input as string).length
 65+let len: number = (<string> input).length  /* not allowed in JSX */
 66+```
 67+
 68+#### Functions
 69+```ts
 70+function object(this: {a: number, b: number}, a: number, b: number) {
 71+  this.a = a;
 72+  this.b = b;
 73+  return this;
 74+}
 75+
 76+// this is used only for type declaration
 77+let a = object(1,2);
 78+// a has type {a: number, b: number}
 79+```
 80+
 81+
 82+## Interfaces
 83+
 84+### Inline
 85+
 86+```ts
 87+function printLabel (options: { label: string }) {
 88+  console.log(options.label)
 89+}
 90+
 91+// Note the semicolon
 92+function getUser (): { name: string; age?: number } {
 93+}
 94+```
 95+
 96+### Explicit
 97+
 98+```ts
 99+interface LabelOptions {
100+  label: string
101+}
102+
103+function printLabel(options: LabelOptions) { ... }
104+```
105+
106+### Optional properties
107+
108+```ts
109+interface User {
110+  name: string;
111+  age?: number;
112+}
113+```
114+
115+### Read only
116+
117+```ts
118+interface User {
119+  readonly name: string
120+}
121+```
122+
123+### Dynamic keys
124+
125+```ts
126+{
127+  [key: string]: Object[]
128+}
129+```
130+
131+## Type aliases
132+
133+```ts
134+type Name = string | string[]
135+```
136+
137+### Intersection
138+
139+```ts
140+interface Colorful { ... }
141+
142+interface Circle { ... }
143+ 
144+type ColorfulCircle = Colorful & Circle;
145+```
146+
147+## Function types
148+
149+```ts
150+interface User { ... }
151+
152+function getUser(callback: (user: User) => any) { callback({...}) }
153+
154+getUser(function (user: User) { ... })
155+```
156+
157+## Classes
158+
159+```ts
160+class Point {
161+  x: number
162+  y: number
163+  static instances = 0
164+  constructor(x: number, y: number) {
165+    this.x = x
166+    this.y = y
167+  }
168+}
169+```
170+
171+#### Inheritance
172+
173+```ts
174+class Point {...}
175+
176+class Point3D extends Point {...}
177+
178+interface Colored {...}
179+
180+class Pixel extends Point implements Colored {...}
181+```
182+
183+#### Short fields initialisation
184+
185+```ts
186+class Point {
187+  static instances = 0;
188+  constructor(
189+    public x: number,
190+    public y: number,
191+  ){}
192+}
193+```
194+
195+#### Fields which do not require initialisation
196+```ts
197+class Point {
198+  public someUselessValue!: number;
199+  ...
200+}
201+```
202+
203+## Generics
204+
205+```ts
206+class Greeter<T> {
207+  greeting: T
208+  constructor(message: T) {
209+    this.greeting = message
210+  }
211+}
212+
213+let greeter = new Greeter<string>('Hello, world')
214+```
215+
216+## Modules
217+
218+```ts
219+export interface User { ... }
220+```
221+
222+## Type extraction
223+
224+```ts
225+interface Building {
226+  room: {
227+    door: string;
228+    walls: string[];
229+  };
230+}
231+
232+type Walls = Building['room']['walls']; // string[]
233+```
234+
235+## Keyof Type Operator
236+
237+```ts
238+type Point = { x: number; y: number };
239+
240+type P = keyof Point; // x | y
241+```
242+
243+## Conditinal Types
244+
245+```ts
246+// SomeType extends OtherType ? TrueType : FalseType;
247+
248+type ToArray<T> = T extends any ? T[] : never;
249+
250+type StrArrOrNumArr = ToArray<string | number>; // string[] | number[]
251+```
252+
253+### Inferring
254+
255+```ts
256+type GetReturnType<T> = T extends (...args: unknown[]) => infer R
257+  ? R
258+  : never;
259+
260+type Num = GetReturnType<() => number>; // number
261+```
262+
263+```ts
264+type First<T extends Array<any>> = T extends [infer F, ...infer Rest] ? F : never;
265+
266+type Str = First<['hello', 1, false]>; // 'hello'
267+```
268+
269+## Literal Type
270+
271+```ts
272+const point = { x: 4, y: 2 }; // { x: number, y: number }
273+
274+const literalPoint = { x: 4, y: 2 } as const; // { readonly x: 4, readonly y: 2 };
275+```
276+
277+## Template Literal Types
278+
279+```ts
280+type SpaceChar = ' ' | '\n' | '\t';
281+
282+type TrimLeft<S extends string> = S extends `${SpaceChar}${infer Rest}` ? TrimLeft<Rest> : S;
283+
284+type Str = TrimLeft<'    hello'>; // 'hello'
285+```
286+
287+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
288+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/vagrantfile.md
+130, -0
  1@@ -0,0 +1,130 @@
  2+---
  3+title: Vagrantfile
  4+category: Devops
  5+layout: 2017/sheet
  6+---
  7+
  8+## Vagrantfile
  9+{: .-one-column}
 10+
 11+```rb
 12+Vagrant.configure("2") do |config|
 13+  # All Vagrant configuration is done here. The most common configuration
 14+  # options are documented and commented below. For a complete reference,
 15+  # please see the online documentation at vagrantup.com.
 16+
 17+  # Every Vagrant virtual environment requires a box to build off of.
 18+  config.vm.box = "precise64"
 19+
 20+  # The url from where the 'config.vm.box' box will be fetched if it
 21+  # doesn't already exist on the user's system.
 22+  # config.vm.box_url = "http://domain.com/path/to/above.box"
 23+
 24+  # Create a forwarded port mapping which allows access to a specific port
 25+  # within the machine from a port on the host machine. In the example below,
 26+  # accessing "localhost:8080" will access port 80 on the guest machine.
 27+  # config.vm.network :forwarded_port, guest: 80, host: 8080
 28+
 29+  # Create a private network, which allows host-only access to the machine
 30+  # using a specific IP.
 31+  # config.vm.network :private_network, ip: "192.168.33.10"
 32+
 33+  # Create a public network, which generally matched to bridged network.
 34+  # Bridged networks make the machine appear as another physical device on
 35+  # your network.
 36+  # config.vm.network :public_network
 37+
 38+  # If true, then any SSH connections made will enable agent forwarding.
 39+  # Default value: false
 40+  # config.ssh.forward_agent = true
 41+
 42+  # Share an additional folder to the guest VM. The first argument is
 43+  # the path on the host to the actual folder. The second argument is
 44+  # the path on the guest to mount the folder. And the optional third
 45+  # argument is a set of non-required options.
 46+  # config.vm.synced_folder "../data", "/vagrant_data"
 47+
 48+  # Provider-specific configuration so you can fine-tune various
 49+  # backing providers for Vagrant. These expose provider-specific options.
 50+  # Example for VirtualBox:
 51+  #
 52+  # config.vm.provider :virtualbox do |vb|
 53+  #   # Don't boot with headless mode
 54+  #   vb.gui = true
 55+  #
 56+  #   # Use VBoxManage to customize the VM. For example to change memory:
 57+  #   vb.customize ["modifyvm", :id, "--memory", "1024"]
 58+  # end
 59+  #
 60+  # View the documentation for the provider you're using for more
 61+  # information on available options.
 62+
 63+  # Enable provisioning with Puppet stand alone.  Puppet manifests
 64+  # are contained in a directory path relative to this Vagrantfile.
 65+  # You will need to create the manifests directory and a manifest in
 66+  # the file precise64.pp in the manifests_path directory.
 67+  #
 68+  # An example Puppet manifest to provision the message of the day:
 69+  #
 70+  # # group { "puppet":
 71+  # #   ensure => "present",
 72+  # # }
 73+  # #
 74+  # # File { owner => 0, group => 0, mode => 0644 }
 75+  # #
 76+  # # file { '/etc/motd':
 77+  # #   content => "Welcome to your Vagrant-built virtual machine!
 78+  # #               Managed by Puppet.\n"
 79+  # # }
 80+  #
 81+  # config.vm.provision :puppet do |puppet|
 82+  #   puppet.manifests_path = "manifests"
 83+  #   puppet.manifest_file  = "init.pp"
 84+  # end
 85+
 86+  # Enable provisioning with chef solo, specifying a cookbooks path, roles
 87+  # path, and data_bags path (all relative to this Vagrantfile), and adding
 88+  # some recipes and/or roles.
 89+  #
 90+  # config.vm.provision :chef_solo do |chef|
 91+  #   chef.cookbooks_path = "../my-recipes/cookbooks"
 92+  #   chef.roles_path = "../my-recipes/roles"
 93+  #   chef.data_bags_path = "../my-recipes/data_bags"
 94+  #   chef.add_recipe "mysql"
 95+  #   chef.add_role "web"
 96+  #
 97+  #   # You may also specify custom JSON attributes:
 98+  #   chef.json = { :mysql_password => "foo" }
 99+  # end
100+
101+  # Enable provisioning with chef server, specifying the chef server URL,
102+  # and the path to the validation key (relative to this Vagrantfile).
103+  #
104+  # The Opscode Platform uses HTTPS. Substitute your organization for
105+  # ORGNAME in the URL and validation key.
106+  #
107+  # If you have your own Chef Server, use the appropriate URL, which may be
108+  # HTTP instead of HTTPS depending on your configuration. Also change the
109+  # validation key to validation.pem.
110+  #
111+  # config.vm.provision :chef_client do |chef|
112+  #   chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME"
113+  #   chef.validation_key_path = "ORGNAME-validator.pem"
114+  # end
115+  #
116+  # If you're using the Opscode platform, your validator client is
117+  # ORGNAME-validator, replacing ORGNAME with your organization name.
118+  #
119+  # If you have your own Chef Server, the default validation client name is
120+  # chef-validator, unless you changed the configuration.
121+  #
122+  #   chef.validation_client_name = "ORGNAME-validator"
123+end
124+```
125+
126+## Also see
127+
128+* [Vagrant cheatsheet](./vagrant)
129+
130+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
131+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/vainglory.md
+147, -0
  1@@ -0,0 +1,147 @@
  2+---
  3+title: Vainglory
  4+layout: 2017/sheet
  5+---
  6+
  7+## T3 items by use
  8+{: .-one-column}
  9+
 10+| Use                    | CP                                | WP                           | Util                                                                           |
 11+| ---                    | ---                               | ---                          | ---                                                                            |
 12+| __Anti-armor/shield__  | [Myth][BM]                        | [Bonesaw][BS], [Tension][TB] |                                                                                |
 13+| __Stacking damage__    | [Myth][BM]                        | [Break][BP]                  |                                                                                |
 14+| __Lifesteal__          | [Eve][Eve]                        | [Serpent][SM], [Shiv][PS]    |                                                                                |
 15+| __Raw power__          | [Shatterglass][SG]                | [Sorrowblade][SB]            |                                                                                |
 16+| __Burst damage__       | [Aftershock][AS]                  | [Tension][TB]                |                                                                                |
 17+| __Attack speed__       | [AC][AC]                          | [Tornado][TT], [Break][BP]   |                                                                                |
 18+| __Critical__           |                                   | [Monocle][TM]                |                                                                                |
 19+| __Auto-attack damage__ | [AC][AC], [Aftershock][AS]        | _everything_                 | [Stormcrown][SC]                                                               |
 20+| __Cooldown__           | [Clockwork][CW], [Aftershock][AS] | Spellsword                   | [Stormcrown][SC], [Contraption][Con], [Nullwave][Null], [Halcyon Boots][HBoot] |
 21+| __Slow__               | [Frostburn][FB]                   |                              | [Shiversteel][SS]                                                              |
 22+| __Reflex block__       |                                   |                              | [Aegis][Aegis] (self/shield) <br> [Crucible][Cru] (team/HP)                    |
 23+| __Ability repeat__     | [Echo][Echo]                      |                              |                                                                                |
 24+{: .-left-align.-headers}
 25+
 26+## Tier 3 items
 27+{: .-one-column}
 28+
 29+### Crystal power
 30+
 31+| Item                          | Cost  | CP      | Use                                                                                    |
 32+| ----                          | ---   | ---     | ---                                                                                    |
 33+| AS: [Aftershock][AS]          | 2400  | +35 cp  | __Basic dmg, atk speed__ <br> *+basic dmg after ability*, +25% cooldown, +2.5 recharge |
 34+| EoH: [Eve of Harvest][Eve]    | 2600  | +55 cp  | __Lifesteal__            <br> *+10% lifesteal*, +250 energy, +5 recharge               |
 35+| AC: [Alternating Current][AC] | 2800  | +60 cp  | __Basic dmg__            <br> *+basic dmg based on CP*, +65% atk speed                 |
 36+| BM: [Broken Myth][BM]         | 2150  | +70 cp  | __Stack dmg__            <br> +10% shield pierce, stacking dmg                         |
 37+| FB: [Frostburn][FB]           | 2600  | +100 cp | __Slow__                 <br> *slow for 1.5s* at (10% + 1% per 10CP)                   |
 38+| SG: [Shatterglass][SG]        | 3000  | +150 cp | __Raw power__            <br> -                                                        |
 39+| CW: [Clockwork][CW]           | 2500  | +30% cp | __Cooldown__             <br> *+40% cooldown*, +250 energy, +7.5 recharge              |
 40+| [Echo][Echo]                  | 2500? |         | __Ability repeat__       <br> +250 energy, +4 recharge                                 |
 41+{: .-left-align.-headers}
 42+
 43+[AS]: http://www.vaingloryfire.com/vainglory/wiki/items/aftershock
 44+[AC]: http://www.vaingloryfire.com/vainglory/wiki/items/alternating-current
 45+[Eve]: http://www.vaingloryfire.com/vainglory/wiki/items/eve-of-harvest
 46+[SG]: http://www.vaingloryfire.com/vainglory/wiki/items/shatterglass
 47+[BM]: http://www.vaingloryfire.com/vainglory/wiki/items/broken-myth
 48+[CW]: http://www.vaingloryfire.com/vainglory/wiki/items/clockwork
 49+[FB]: http://www.vaingloryfire.com/vainglory/wiki/items/frostburn
 50+[Echo]: http://www.vaingloryfire.com/vainglory/wiki/items/echo
 51+
 52+### Weapon power
 53+
 54+| Item                       | Cost | WP      | Other                                                                         |
 55+| ----                       | ---  | ---     | ---                                                                           |
 56+| TT: [Tornado Trigger][TT]  | 2600 |         | __Atk speed__     <br> *+75% atk speed*, +20% crit change, +20% crit dmg      |
 57+| BS: [Bonesaw][BS]          | 2700 | +15 wp  | __Armor shred__   <br> *stacking armor shred*                                 |
 58+| TB: [Tension Bow][TB]      | 2300 | +45 wp  | __Bonus dmg__     <br> *bonus dmg every 6s*, +8% armor pierce                 |
 59+| TM: [Tyrant's Monocle][TM] | 2750 | +50 wp  | __Crit__          <br> *+40% crit chance*, +20% crit dmg                      |
 60+| BP: [Breaking Point][BP]   | 2600 | +55 wp  | __Stacking dmg__  <br> *stacking weapon dmg*, +35% atk speed                  |
 61+| SM: [Serpent Mask][SM]     | 2800 | +85 wp  | __Lifesteal__     <br> *stacking lifesteal*, +10% lifesteal                   |
 62+| SB: [Sorrowblade][SB]      | 3100 | +150 wp | __Raw power__     <br> -                                                      |
 63+| PS: [Poisoned Shiv][PS]    | 2250 | +30 wp  | __Mortal wounds__ <br> *mortal wounds for 2s*, +10% lifesteal, +30% atk speed |
 64+| SS: Spellsword             | ?    | +90 wp  | __Cooldown__      <br> ?                                                      |
 65+{: .-left-align.-headers}
 66+
 67+[BS]: http://www.vaingloryfire.com/vainglory/wiki/items/bonesaw
 68+[BP]: http://www.vaingloryfire.com/vainglory/wiki/items/breaking-point
 69+[SM]: http://www.vaingloryfire.com/vainglory/wiki/items/serpent-mask
 70+[SB]: http://www.vaingloryfire.com/vainglory/wiki/items/sorrowblade
 71+[TB]: http://www.vaingloryfire.com/vainglory/wiki/items/tension-bow
 72+[TT]: http://www.vaingloryfire.com/vainglory/wiki/items/tornado-trigger
 73+[TM]: http://www.vaingloryfire.com/vainglory/wiki/items/tyrants-monocle
 74+[PS]: http://www.vaingloryfire.com/vainglory/wiki/items/poisoned-shiv
 75+
 76+### Utilities
 77+
 78+| Item                            | Cost | HP      | Use                                                                    |
 79+| ---                             | ---  | ---     | ---                                                                    |
 80+| [Halcyon Chargers][HBoot]       | 2300 | +200 hp | 👟 __Boots__        <br> +15% cooldown, +250 energy, +4 recharge       |
 81+| [Stormcrown][SC]                | 2200 | +200 hp | 🔴 __Bonus dmg__    <br> +30% cooldown, +4 recharge, bonus true damage |
 82+| [Journey Boots][JBoot]          | 1900 | +250 hp | 👟 __Boots__        <br> damaging heroes resets sprint cooldown        |
 83+| [Nullwave Gauntlet][Null] (2.0) | 2250 | +300 hp | 😶 __Item silence__ <br> +25% cooldown                                 |
 84+| [Contraption][Con]              | 2100 | +350 hp | 👀 __Vision__       <br> traps/flares, +40% cooldown, +3 recharge      |
 85+| [Shiversteel][SS]               | 1450 | +500 hp | 🐌 __Slow__         <br> active: slow targets                          |
 86+| [War Treads][WBoot]             | 2500 | +600 hp | 👟 __Boots__        <br> gives sprint to nearby teammates              |
 87+{: .-left-align.-headers}
 88+
 89+### Defense
 90+
 91+| Item                            | Cost | HP      | Armor   | Shield  | Use                                    |
 92+| ---                             | ---  | ---     | ---     | ---     | ---                                    |
 93+| [Aegis][Aegis]                  | 2250 |         | +30 ar  | +125 sh | ✊__Reflex block__ (self)              |
 94+| [Fountain of Renewal][Fountain] | 2300 | +200 hp | +30 ar  | +75 sh  | ❤ __Heal__ allies                      |
 95+| [Atlas Pauldron][Atlas]         | 1900 |         | +85 ar  | +35 sh  | 🐌 __Slow__ target attack speed        |
 96+| [Metal Jacket][Metal]           | 2100 |         | +170 ar | +35 sh  |                                        |
 97+| [Crucible][Cru]                 | 1850 | +600 hp |         |         | ✊ __Reflex block__ (team)             |
 98+| [Slumbering Husk][Husk] (2.0)   | 1600 | +400 hp |         |         | __Fortification__ against burst damage |
 99+{: .-left-align.-headers}
100+
101+[Fountain]: http://www.vaingloryfire.com/vainglory/wiki/items/fountain-of-renewal
102+[Cru]: http://www.vaingloryfire.com/vainglory/wiki/items/aegis
103+[Aegis]: http://www.vaingloryfire.com/vainglory/wiki/items/aegis
104+[Atlas]: http://www.vaingloryfire.com/vainglory/wiki/items/atlas-pauldron
105+[Metal]: http://www.vaingloryfire.com/vainglory/wiki/items/metal-jacket
106+[Husk]: http://www.vaingloryfire.com/vainglory/wiki/items/slumbering-husk
107+[Null]: http://www.vaingloryfire.com/vainglory/wiki/items/nullwave-gauntlet
108+
109+### Boots
110+
111+| Item                      | Movement speed | HP      | Sprint                                          | Use            |
112+| ---                       | ---            | ---     | ---                                             | ---            |
113+| [War Treads][WBoot]       | +0.4           | +600 hp | 2s (60s cooldown) <br> incl. nearby teammates   | __HP, assist__ |
114+| [Halcyon Chargers][HBoot] | +0.5           |         | 3s (50s cooldown)                               | __Energy__     |
115+| [Journey Boots][JBoot]    | +0.6           | +250 hp | 2s (60s cooldown) <br> damaging resets cooldown | __Gap close__  |
116+{: .-left-align.-headers}
117+
118+[Con]: http://www.vaingloryfire.com/vainglory/wiki/items/contraption
119+[HBoot]: http://www.vaingloryfire.com/vainglory/wiki/items/halcyon-chargers
120+[WBoot]: http://www.vaingloryfire.com/vainglory/wiki/items/war-treads
121+[JBoot]: http://www.vaingloryfire.com/vainglory/wiki/items/journey-boots
122+[SC]: http://www.vaingloryfire.com/vainglory/wiki/items/stormcrown
123+[SS]: http://www.vaingloryfire.com/vainglory/wiki/items/shiversteel
124+
125+## Skill tier names
126+
127+| Just Beginning | 1 |
128+| Getting There | 2 |
129+| Rock Solid | 3 |
130+| Worthy Foe |4 |
131+| Got Swagger | 5 |
132+| Credible Threat | 6 |
133+| The Hotness | 7 |
134+| Simply Amazing | 8 |
135+| Pinnacle of Awesome | 9 |
136+| Vainglorious | 10 |
137+
138+See: [Skill tier names](http://www.vaingloryfire.com/vainglory/forum/general-discussion/bronze-silver-gold-rankings-5312)
139+
140+## References
141+
142+- Last updated for Vainglory 1.22 with some 2.0 stuff.
143+- [Vaingloryfire.com](http://www.vaingloryfire.com/)
144+- [Version history](http://forums.vainglorygame.com/index.php?threads/41129/) (forums.vainglorygame.com)
145+- [Skill tier points](http://brokenmyth.net/skill-tier-point-far-next-tier/#more-10043) (brokenmyth.net)
146+
147+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
148+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/vimscript.md
+720, -0
  1@@ -0,0 +1,720 @@
  2+---
  3+title: Vim scripting
  4+category: Vim
  5+prism_languages: [vim]
  6+layout: 2017/sheet
  7+updated: 2020-07-05
  8+weight: -10
  9+tags: [Featurable]
 10+---
 11+
 12+### Start hacking
 13+
 14+```vim
 15+let name = "John"
 16+echo "Hello, " . name
 17+```
 18+
 19+You can either put this in a script (`script.vim`) and run it (`:source script.vim`), or you can type the commands individually in normal mode as `:let` and `:echo`.
 20+
 21+### Learn by example
 22+
 23+```vim
 24+function! SuperTab()
 25+  let l:part = strpart(getline('.'),col('.')-2,1)
 26+  if (l:part =~ '^\W\?$')
 27+      return "\<Tab>"
 28+  else
 29+      return "\<C-n>"
 30+  endif
 31+endfunction
 32+
 33+imap <Tab> <C-R>=SuperTab()<CR>
 34+```
 35+
 36+[Here](http://www.vimbits.com/bits/46)'s another example with [functions](#functions), [variables](#variables) and [mapping](#mapping).
 37+
 38+Variables
 39+---------
 40+
 41+### Defining
 42+{: .-prime}
 43+
 44+```vim
 45+let var = "hello"
 46+```
 47+
 48+### Variable prefixes
 49+
 50+```vim
 51+let g:ack_options = '-s -H'    " g: global
 52+let s:ack_program = 'ack'      " s: local (to script)
 53+let l:foo = 'bar'              " l: local (to function)
 54+```
 55+
 56+The `s:` prefix is also available in function names. See `:help local-variables`
 57+
 58+### Other prefixes
 59+
 60+```vim
 61+let w:foo = 'bar'    " w: window
 62+let b:state = 'on'   " b: buffer
 63+let t:state = 'off'  " t: tab
 64+echo v:var           " v: vim special
 65+```
 66+
 67+```vim
 68+let @/ = ''          " @  register (this clears last search pattern)
 69+echo $PATH           " $  env
 70+```
 71+
 72+### Vim options
 73+
 74+```vim
 75+echo 'tabstop is ' . &tabstop
 76+if &insertmode
 77+echo &g:option
 78+echo &l:option
 79+```
 80+
 81+Prefix Vim options with `&`
 82+
 83+### Operators
 84+
 85+```vim
 86+a + b             " numbers only!
 87+'hello ' . name   " concat
 88+```
 89+
 90+```vim
 91+let var -= 2
 92+let var += 5
 93+let var .= 'string'   " concat
 94+```
 95+
 96+## Strings
 97+
 98+### Strings
 99+
100+```vim
101+let str = "String"
102+let str = "String with \n newline"
103+
104+let literal = 'literal, no \ escaping'
105+let literal = 'that''s enough'  " double '' => '
106+
107+echo "result = " . re   " concatenation
108+```
109+
110+Also see `:help literal-string` and `:help expr-quote`.
111+See: [Strings](http://learnvimscriptthehardway.stevelosh.com/chapters/26.html)
112+
113+### String functions
114+
115+```vim
116+strlen(str)    " length
117+len(str)       " same
118+strchars(str)  " character length
119+
120+split("one two three")       "=> ['one', 'two', 'three']
121+split("one.two.three", '.')  "=> ['one', 'two', 'three']
122+
123+join(['a', 'b'], ',')  "=> 'a,b'
124+
125+tolower('Hello')
126+toupper('Hello')
127+```
128+
129+Also see `:help functions`
130+See: [String functions](http://learnvimscriptthehardway.stevelosh.com/chapters/27.html)
131+
132+Functions
133+---------
134+
135+### Functions
136+{: .-prime}
137+
138+```vim
139+" prefix with s: for local script-only functions
140+function! s:Initialize(cmd, args)
141+  " a: prefix for arguments
142+  echo "Command: " . a:cmd
143+
144+  return 1
145+endfunction
146+```
147+
148+See: [Functions](http://learnvimscriptthehardway.stevelosh.com/chapters/23.html)
149+
150+### Namespacing
151+
152+```vim
153+function! myplugin#hello()
154+```
155+
156+### Calling functions
157+
158+```vim
159+call s:Initialize()
160+call s:Initialize("hello")
161+```
162+
163+### Consuming return values
164+
165+```vim
166+echo "Result: " . s:Initialize()
167+```
168+
169+### Abortable
170+
171+```vim
172+function! myfunction() abort
173+endfunction
174+```
175+
176+Aborts when an error occurs.
177+
178+### Var arguments
179+
180+```vim
181+function! infect(...)
182+  echo a:0    "=> 2
183+  echo a:1    "=> jake
184+  echo a:2    "=> bella
185+
186+  for s in a:000  " a list
187+    echon ' ' . s
188+  endfor
189+endfunction
190+
191+infect('jake', 'bella')
192+```
193+
194+See `:help function-argument`.  See: [Var arguments](http://learnvimscriptthehardway.stevelosh.com/chapters/24.html)
195+
196+Loops
197+-----
198+
199+```vim
200+for s in list
201+  echo s
202+  continue  " jump to start of loop
203+  break     " breaks out of a loop
204+endfor
205+```
206+
207+```vim
208+while x < 5
209+endwhile
210+```
211+
212+Custom commands
213+---------------
214+
215+### Custom commands
216+{: .-prime}
217+
218+```vim
219+command! Save :set fo=want tw=80 nowrap
220+```
221+
222+Custom commands start with uppercase letters. The `!` redefines a command if it already exists.
223+
224+### Commands calling functions
225+
226+```vim
227+command! Save call <SID>foo()
228+```
229+{: .-setup}
230+
231+```vim
232+function! s:foo()
233+  ...
234+endfunction
235+```
236+
237+### Commands with arguments
238+
239+```vim
240+command! -nargs=? Save call script#foo(<args>)
241+```
242+{: .-setup}
243+
244+| What | What |
245+| ---- | ---- |
246+| `-nargs=0` | 0 arguments, default |
247+| `-nargs=1` | 1 argument, includes spaces |
248+| `-nargs=?` | 0 or 1 argument |
249+| `-nargs=*` | 0+ arguments, space separated |
250+| `-nargs=+` | 1+ arguments, space reparated |
251+
252+Flow
253+----
254+
255+### Conditionals
256+
257+```vim
258+let char = getchar()
259+if char == "\<LeftMouse>"
260+  " ...
261+elseif char == "\<RightMouse>"
262+  " ...
263+else
264+  " ...
265+endif
266+```
267+
268+### Truthiness
269+
270+```vim
271+if 1 | echo "true"  | endif
272+if 0 | echo "false" | endif
273+```
274+
275+```vim
276+if 1       "=> 1 (true)
277+if 0       "=> 0 (false)
278+if "1"     "=> 1 (true)
279+if "456"   "=> 1 (true)
280+if "xfz"   "=> 0 (false)
281+```
282+
283+No booleans. `0` is false, `1` is true.
284+See: [Truthiness](http://learnvimscriptthehardway.stevelosh.com/chapters/21.html)
285+
286+### Operators
287+
288+```vim
289+if 3 > 2
290+if a && b
291+if (a && b) || (c && d)
292+if !c
293+```
294+
295+See `:help expression-syntax`.
296+See: [Operators](http://learnvimscriptthehardway.stevelosh.com/chapters/22.html)
297+
298+### Strings
299+
300+```vim
301+if name ==# 'John'     " case-sensitive
302+if name ==? 'John'     " case-insensitive
303+if name == 'John'      " depends on :set ignorecase
304+
305+" also: is#, is?, >=#, >=?, and so on
306+```
307+
308+### Identity operators
309+
310+```vim
311+a is b
312+a isnot b
313+```
314+
315+Checks if it's the same instance object.
316+
317+### Regexp matches
318+
319+```vim
320+"hello" =~ 'xx*'
321+"hello" !~ 'xx*'
322+"hello" =~ '\v<\d+>'
323+```
324+
325+`\v` enables "extended" regex mode which allows word boundary (`<>`), `+`, and more.
326+
327+### Single line
328+
329+```vim
330+if empty(a:path) | return [] | endif
331+a ? b : c
332+```
333+
334+Use `|` to join lines together.
335+
336+### Boolean logic
337+
338+```vim
339+if g:use_dispatch && s:has_dispatch
340+  ···
341+endif
342+```
343+
344+Lists
345+-----
346+
347+### Lists
348+
349+```vim
350+let mylist = [1, two, 3, "four"]
351+
352+let first = mylist[0]
353+let last  = mylist[-1]
354+
355+" Suppresses errors
356+let second = get(mylist, 1)
357+let second = get(mylist, 1, "NONE")
358+```
359+
360+### Functions
361+
362+```vim
363+len(mylist)
364+empty(mylist)
365+
366+sort(list)
367+let sortedlist = sort(copy(list))
368+
369+split('hello there world', ' ')
370+```
371+
372+### Concatenation
373+
374+```vim
375+let longlist = mylist + [5, 6]
376+let mylist += [7, 8]
377+```
378+
379+### Sublists
380+
381+```vim
382+let shortlist = mylist[2:-1]
383+let shortlist = mylist[2:]     " same
384+
385+let shortlist = mylist[2:2]    " one item
386+```
387+
388+### Push
389+
390+```vim
391+let alist = [1, 2, 3]
392+let alist = add(alist, 4)
393+```
394+
395+### Map
396+
397+```vim
398+call map(files, "bufname(v:val)")  " use v:val for value
399+call filter(files, 'v:val != ""')
400+```
401+
402+Dictionaries
403+------------
404+
405+### Dictionaries
406+
407+```vim
408+let colors = {
409+  \ "apple": "red",
410+  \ "banana": "yellow"
411+}
412+
413+echo colors["a"]
414+echo get(colors, "apple")   " suppress error
415+```
416+
417+See `:help dict`
418+
419+### Using dictionaries
420+
421+```vim
422+remove(colors, "apple")
423+```
424+
425+```vim
426+" :help E715
427+if has_key(dict, 'foo')
428+if empty(dict)
429+keys(dict)
430+len(dict)
431+```
432+
433+```vim
434+max(dict)
435+min(dict)
436+```
437+
438+```vim
439+count(dict, 'x')
440+string(dict)
441+```
442+
443+```vim
444+map(dict, '<>> " . v:val')
445+```
446+
447+### Iteration
448+
449+```vim
450+for key in keys(mydict)
451+  echo key . ': ' . mydict(key)
452+endfor
453+```
454+
455+### Prefixes
456+
457+```vim
458+keys(s:)
459+```
460+
461+Prefixes (`s:`, `g:`, `l:`, etc) are actually dictionaries.
462+
463+### Extending
464+
465+```vim
466+" Extending with more
467+let extend(s:fruits, { ... })
468+```
469+
470+Casting
471+-------
472+
473+```vim
474+str2float("2.3")
475+str2nr("3")
476+float2nr("3.14")
477+```
478+
479+Numbers
480+-------
481+
482+### Numbers
483+{: .-prime}
484+
485+```vim
486+let int = 1000
487+let int = 0xff
488+let int = 0755   " octal
489+```
490+
491+See `:help Number`.
492+See: [Numbers](http://learnvimscriptthehardway.stevelosh.com/chapters/25.html)
493+
494+### Floats
495+
496+```vim
497+let fl = 100.1
498+let fl = 5.4e4
499+```
500+
501+See `:help Float`
502+
503+### Arithmetic
504+
505+```vim
506+3 / 2     "=> 1, integer division
507+3 / 2.0   "=> 1.5
508+3 * 2.0   "=> 6.0
509+```
510+
511+### Math functions
512+
513+```vim
514+sqrt(100)
515+floor(3.5)
516+ceil(3.3)
517+abs(-3.4)
518+
519+sin() cos() tan()
520+sinh() cosh() tanh()
521+asin() acos() atan()
522+```
523+
524+Vim-isms
525+--------
526+
527+### Execute a command
528+
529+```vim
530+execute "vsplit"
531+execute "e " . fnameescape(filename)
532+```
533+
534+Runs an ex command you typically run with `:`. Also see `:help execute`.
535+See: [Execute a command](http://learnvimscriptthehardway.stevelosh.com/chapters/28.html)
536+
537+### Running keystrokes
538+
539+```vim
540+normal G
541+normal! G   " skips key mappings
542+
543+execute "normal! gg/foo\<cr>dd"
544+```
545+
546+Use `:normal` to execute keystrokes as if you're typing them in normal mode. Combine with `:execute` for special keystrokes.
547+See: [Running keystrokes](http://learnvimscriptthehardway.stevelosh.com/chapters/29.html)
548+
549+### Getting filenames
550+
551+```vim
552+echo expand("%")      " path/file.txt
553+echo expand("%:t")    " file.txt
554+echo expand("%:p:h")  " /home/you/path/file.txt
555+echo expand("%:r")    " path/file
556+echo expand("%:e")    " txt
557+```
558+
559+See `:help expand`
560+
561+### Silencing
562+
563+```vim
564+silent g/Aap/p
565+```
566+
567+Suppresses output. See `:help silent`
568+
569+### Echo
570+
571+```vim
572+echoerr 'oh it failed'
573+echomsg 'hello there'
574+echo 'hello'
575+
576+echohl WarningMsg | echomsg "=> " . a:msg | echohl None
577+```
578+
579+
580+### Settings
581+
582+```vim
583+set number
584+set nonumber
585+set number!     " toggle
586+set numberwidth=5
587+set guioptions+=e
588+```
589+
590+### Prompts
591+
592+```vim
593+let result = confirm("Sure?")
594+execute "confirm q"
595+```
596+
597+### Built-ins
598+
599+```vim
600+has("feature")  " :h feature-list
601+executable("python")
602+globpath(&rtp, "syntax/c.vim")
603+
604+exists("$ENV")
605+exists(":command")
606+exists("variable")
607+exists("+option")
608+exists("g:...")
609+```
610+
611+Mapping
612+-------
613+{: .-three-column}
614+
615+### Mapping commands
616+
617+```vim
618+nmap
619+vmap
620+imap
621+xmap
622+nnoremap
623+vnoremap
624+inoremap
625+xnoremap
626+...
627+```
628+
629+### Explanation
630+
631+```vim
632+[nvixso](nore)map
633+```
634+
635+```
636+ │       └ don't recurse
637+ │
638+ └ normal, visual, insert,
639+   eX mode, select, operator-pending
640+```
641+{: .-setup}
642+
643+### Arguments
644+
645+| `<buffer>` | only in current buffer |
646+| `<silent>` | no echo |
647+| `<nowait>` | |
648+
649+Syntax
650+------
651+
652+### Highlights
653+
654+```vim
655+hi Comment
656+  term=bold,underline
657+  gui=bold
658+  ctermfg=4
659+  guifg=#80a0ff
660+```
661+
662+### Filetype detection
663+
664+```vim
665+augroup filetypedetect
666+  au! BufNewFile,BufRead *.json setf javascript
667+augroup END
668+
669+au Filetype markdown setlocal spell
670+```
671+
672+### Conceal
673+
674+```vim
675+set conceallevel=2
676+syn match newLine "<br>" conceal cchar=}
677+hi newLine guifg=green
678+```
679+
680+### Region conceal
681+
682+```vim
683+syn region inBold concealends matchgroup=bTag start="<b>" end="</b>"
684+hi inBold gui=bold
685+hi bTag guifg=blue
686+```
687+
688+### Syntax
689+
690+```vim
691+syn match :name ":regex" :flags
692+
693+syn region Comment  start="/\*"  end="\*/"
694+syn region String   start=+"+    end=+"+	 skip=+\\"+
695+
696+syn cluster :name contains=:n1,:n2,:n3...
697+
698+flags:
699+  keepend
700+  oneline
701+  nextgroup=
702+  contains=
703+  contained
704+
705+hi def link markdownH1 htmlH1
706+```
707+
708+### Include guards
709+
710+```vim
711+if exists('g:loaded_myplugin')
712+  finish
713+endif
714+
715+" ...
716+
717+let g:loaded_myplugin = 1
718+```
719+
720+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
721+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/vue.md
+365, -0
  1@@ -0,0 +1,365 @@
  2+---
  3+title: Vue.js
  4+category: JavaScript
  5+layout: 2017/sheet
  6+updated: 2019-12-26
  7+weight: -10
  8+intro: |
  9+  [Vue.js](https://vuejs.org/) is an open-source Model–view–viewmodel JavaScript framework for building user interfaces and single-page applications.
 10+---
 11+
 12+{%raw%}
 13+
 14+Expressions
 15+----------
 16+{: .-three-column}
 17+
 18+### Expressions
 19+
 20+```html
 21+<div id="app">
 22+  <p>I have a {{ product }}</p>
 23+  <p>{{ product + 's' }}</p>
 24+  <p>{{ isWorking ? 'YES' : 'NO' }}</p>
 25+  <p>{{ product.getSalePrice() }}</p>
 26+</div>
 27+```
 28+
 29+See: [Delimiters](https://vuejs.org/v2/api/#delimiters)
 30+
 31+### Binding
 32+
 33+```html
 34+<a v-bind:href="url">...</a>
 35+```
 36+
 37+#### Shorthand syntax
 38+```html
 39+<a :href="url">...</a>
 40+```
 41+{: data-line="1"}
 42+
 43+#### True or false will add or remove attribute
 44+```html
 45+<button :disabled="isButtonDisabled">...
 46+```
 47+
 48+#### If isActive is truthy, the class ‘active’ will appear
 49+```html
 50+<div :class="{ active: isActive }">...
 51+```
 52+
 53+#### Style color set to value of activeColor
 54+```html
 55+<div :style="{ color: activeColor }">
 56+```
 57+
 58+See: [v-bind](https://vuejs.org/v2/api/#v-bind)
 59+
 60+### Directives
 61+
 62+#### Element inserted/removed based on truthiness
 63+```html
 64+<p v-if="inStock">{{ product }}</p>
 65+```
 66+```html
 67+<p v-else-if="onSale">...</p>
 68+<p v-else>...</p>
 69+```
 70+
 71+#### Toggles the display: none CSS property
 72+```html
 73+<p v-show="showProductDetails">...</p>
 74+```
 75+
 76+#### Two-way data binding
 77+```html
 78+<input v-model="firstName" >
 79+```
 80+
 81+| Method | Description |
 82+| --- | --- |
 83+| `v-model.lazy="..."` | Syncs input after change event |
 84+| `v-model.number="..."` | Always returns a number |
 85+| `v-model.trim="..."` | Strips whitespace |
 86+
 87+See: [Directives](https://vuejs.org/v2/api/#Directives)
 88+
 89+### Actions/Events
 90+
 91+#### Calls addToCart method on component
 92+```html
 93+<button v-on:click="addToCart">...
 94+```
 95+
 96+#### Shorthand syntax
 97+```html
 98+<button @click="addToCart">...
 99+```
100+{: data-line="1"}
101+
102+#### Arguments can be passed
103+```html
104+<button @click="addToCart(product)">...
105+```
106+
107+#### To prevent default behavior (e.g. page reload)
108+```html
109+<form @submit.prevent="addProduct">...
110+```
111+
112+#### Only trigger once
113+```html
114+<img @mouseover.once="showImage">...
115+```
116+
117+| Method | Description |
118+| --- | --- |
119+| `.stop` | Stop all event propagation |
120+| `.self ` | Only trigger if event.target is element itself |
121+
122+#### Keyboard entry example
123+```html
124+<input @keyup.enter="submit">
125+```
126+
127+#### Call onCopy when control-c is pressed
128+```html
129+<input @keyup.ctrl.c="onCopy">
130+```
131+
132+See: [Events](https://vuejs.org/v2/guide/events.html)
133+
134+### List rendering
135+
136+#### The `:key` is always recommended
137+```html
138+<li v-for="item in items"
139+    :key="item.id">
140+  {{ item }}
141+</li>
142+```
143+{: data-line="2"}
144+
145+#### To access the position in the array
146+```html
147+<li v-for="(item, index) in items">...
148+```
149+
150+#### To iterate through objects
151+```html
152+<li v-for="(value, key) in object">...
153+```
154+
155+#### Using `v-for` with a component
156+```html
157+<cart-product v-for="item in products"
158+              :product="item"
159+              :key="item.id">
160+```
161+
162+See: [List Rendering](https://vuejs.org/v2/guide/list.html)
163+
164+
165+Component
166+--------
167+
168+### Component anatomy
169+
170+```js
171+Vue.component('my-component', {
172+  components: {
173+    // Components that can be used in the template
174+    ProductComponent,
175+    ReviewComponent
176+  },
177+  props: {
178+    // The parameters the component accepts
179+    message: String,
180+    product: Object,
181+    email: {
182+      type: String,
183+      required: true,
184+      default: "none"
185+      validator: function (value) {
186+        // Should return true if value is valid
187+      }
188+    }
189+  },
190+  data: function() {
191+    // `data` must be a function
192+    return {
193+      firstName: 'Vue',
194+      lastName: 'Mastery'
195+    }
196+  },
197+  computed: {
198+    // Return cached values until dependencies change
199+    fullName: function () {
200+      return this.firstName + ' ' + this.lastName
201+    }
202+  },
203+  watch: {
204+    // Called when firstName changes value
205+    firstName: function (value, oldValue) { ... }
206+  },
207+  methods: { ... },
208+  template: '<span>{{ message }}</span>',
209+  // Can also use backticks in `template` for multi-line
210+})
211+```
212+{: data-line="3, 8, 16, 21, 28, 34, 39"}
213+
214+See: [Components Basics](https://vuejs.org/v2/guide/components.html)
215+
216+### Lifecycle hooks
217+
218+| Method | Description |
219+| --- | --- |
220+| `beforeCreate` | After the instance has been initialized [#](https://vuejs.org/v2/api/#beforeCreate) |
221+| `created` | After the instance is created [#](https://vuejs.org/v2/api/#created) |
222+| `beforeMount` | Before the first render [#](https://vuejs.org/v2/api/#beforeMount) |
223+| `mounted` | After the instance has been mounted [#](https://vuejs.org/v2/api/#mounted) |
224+| `beforeUpdate` | When data changes, before the DOM is patched [#](https://vuejs.org/v2/api/#beforeUpdate) |
225+| `updated` | After a data change [#](https://vuejs.org/v2/api/#updated) |
226+| `beforeDestroy` | Before the instance is destroyed [#](https://vuejs.org/v2/api/#beforeDestroy) |
227+| `destroyed` | After a Vue instance has been destroyed [#](https://vuejs.org/v2/api/#destroyed) |
228+
229+See: [Lifecycle Hooks](https://vuejs.org/v2/api/#Options-Lifecycle-Hooks)
230+
231+### Custom events
232+
233+#### Set listener on component, within its parent
234+```html
235+<button-counter v-on:incrementBy="incWithVal">
236+```
237+
238+#### Inside parent component
239+```js
240+methods: {
241+  incWithVal: function (toAdd) { ... }
242+}
243+```
244+
245+#### Inside button-counter template
246+```js
247+this.$emit(
248+    'incrementBy', // Custom event name
249+    5 // Data sent up to parent
250+  )
251+```
252+
253+Use props to pass data into child components,
254+custom events to pass data to parent elements.
255+
256+See: [Custom Events](https://vuejs.org/v2/guide/components-custom-events.html)
257+
258+Single file components
259+--------
260+
261+### Single file
262+```html
263+<template>
264+  <p>{{ greeting }} World!</p>
265+</template>
266+
267+<script>
268+module.exports = {
269+  data: function () {
270+    return {
271+      greeting: 'Hello'
272+    }
273+  }
274+}
275+</script>
276+
277+<style scoped>
278+p {
279+  font-size: 2em;
280+  text-align: center;
281+}
282+</style>
283+```
284+
285+See: [Single File Components](https://vuejs.org/v2/guide/single-file-components.html)
286+
287+### Separation
288+```html
289+<template>
290+  <div>This will be pre-compiled</div>
291+</template>
292+<script src="./my-component.js"></script>
293+<style src="./my-component.css"></style>
294+```
295+
296+See: [What About Separation of Concerns?](https://vuejs.org/v2/guide/single-file-components.html#What-About-Separation-of-Concerns)
297+
298+Slots
299+--------
300+
301+### Using a single slot
302+
303+#### Component template
304+```html
305+<div>
306+  <h2>I'm a title</h2>
307+  <slot>
308+    Only displayed if no slot content
309+  </slot>
310+</div>
311+```
312+{: data-line="3,4,5"}
313+
314+#### Use of component with data for slot
315+```html
316+<my-component>
317+  <p>This will go in the slot</p>
318+</my-component>
319+```
320+{: data-line="2"}
321+
322+See: [Slots](https://vuejs.org/v2/guide/components-slots.html)
323+
324+### Multiple slots
325+
326+#### Component template
327+```html
328+<div class="container">
329+  <header>
330+    <slot name="header"></slot>
331+  </header>
332+  <main>
333+    <slot>Default content</slot>
334+  </main>
335+  <footer>
336+    <slot name="footer"></slot>
337+  </footer>
338+</div>
339+```
340+{: data-line="3,6,9"}
341+
342+#### Use of component with data for slots
343+```html
344+<app-layout>
345+  <h1 slot="header">Page title</h1>
346+  <p>the main content.</p>
347+  <p slot="footer">Contact info</p>
348+</app-layout>
349+```
350+{: data-line="2,3,4"}
351+
352+See: [Slots](https://vuejs.org/v2/guide/components-slots.html)
353+
354+Also see
355+--------
356+
357+* [Vue CLI](https://cli.vuejs.org/) _(cli.vuejs.org)_
358+* [Vue Router](https://router.vuejs.org/) _(router.vuejs.org)_
359+* [Vue DevTools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=en) _(chrome.google.com)_
360+* [Nuxt.js](https://nuxtjs.org/) _(nuxtjs.org)_
361+* [Vue.js v1.0.28 cheatsheet](vue@1.0.28/) _Legacy version_
362+
363+{%endraw%}
364+
365+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
366+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/yaml.md
+40, -0
 1@@ -0,0 +1,40 @@
 2+---
 3+title: Yaml
 4+category: Markup
 5+layout: 2017/sheet
 6+prism_languages: [yaml]
 7+---
 8+
 9+### Multiline strings
10+
11+```yaml
12+Multiline: |
13+  hello
14+  world
15+```
16+
17+### Inheritance
18+
19+```yaml
20+parent: &defaults
21+  a: 2
22+  b: 3
23+
24+child:
25+  <<: *defaults
26+  b: 4
27+```
28+
29+### Reference content
30+
31+```yaml
32+values: &ref
33+  - These values
34+  - will be reused below
35+  
36+other_values:
37+  <<: *ref
38+```
39+
40+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
41+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/cheatsheets/zsh.md
+45, -0
 1@@ -0,0 +1,45 @@
 2+---
 3+title: zsh
 4+category: CLI
 5+layout: 2017/sheet
 6+---
 7+
 8+### Expressions
 9+
10+| Expression        | Example             | Description
11+| ---               | ---                 | ---
12+| `!!`              | `sudo !!`           | Last command (`sudo !!`)
13+| ---               | ---                 | ---
14+| `!*`              | `vim !*`            | Last command's parameters (`vim !*`)
15+| `!^`              |                     | Last command's first parameter
16+| `!$`              |                     | Last command's last parameter
17+| ---               | ---                 | ---
18+| `!?ls` `<tab>`    | `sudo !?mv` `<tab>` | Command and params of last `ls` command
19+| `!?ls?:*` `<tab>` |                     | Params of last `ls` command
20+| ---               | ---                 | ---
21+| `*(m0)`           | `rm *(m0)`          | Last modified today
22+| `*(m-4)`          |                     | Last modified <4 days ago
23+{: .-headers}
24+
25+### Change default shell
26+
27+```bash
28+chsh -s `which zsh`
29+```
30+
31+### Process Substitution
32+
33+| Expression        | Example                                               | Description
34+| ---               | ---                                                   | ---
35+| `<(COMMAND)`      | `grep "needle" <(curl "https://haystack.io")`         | Replace argument with _named pipe/FIFO_ (read-only) with command output
36+| `=(COMMAND)`      | `vim =(curl "https://haystack.io")`                   | Replace argument with _file_ (writable) containing command output
37+{: .-headers}
38+
39+### Also see
40+
41+- [Bash cheatsheet](./bash)
42+
43+Zsh is mostly compatible with Bash, so most everything in Bash's cheatsheet also applies.
44+
45+https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license
46+micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license
A home/.config/micro/plug/cheat/log.txt
+1, -0
1@@ -0,0 +1 @@
2+2024/12/29 01:44:02 Micro started
A home/.config/micro/plug/cheat/main.lua
+40, -0
 1@@ -0,0 +1,40 @@
 2+-- micro-cheat copyright 2022 Tero Karvinen https://TeroKarvinen.com
 3+
 4+-- Cheatsheets are copyrighted by their original authors
 5+
 6+-- Cheatsheets from Devhints.io are copyright 2021 
 7+-- Rico Sta. Cruz and contributors, received under the MIT license
 8+
 9+local micro = import("micro")
10+local config = import("micro/config")
11+
12+local cheatdir = config.ConfigDir.."/plug/cheat/cheatsheets/"
13+
14+function init()
15+	-- runs once when micro starts
16+	config.MakeCommand("cheat", cheatCommand, config.NoComplete)
17+	config.TryBindKey("F1", "command:cheat", false)
18+end
19+
20+function cheatCommand(bp)
21+	local filename = bp.Buf:GetName()
22+	local filetype = bp.Buf:FileType()
23+
24+	if "Vagrantfile" == filename or "Dockerfile" == filename then
25+		filetype = filename:lower()
26+		micro.InfoBar():Message("Cheatsheet by file name: "..filename)
27+	elseif string.find(filename, "\.org$") then -- not detected by micro
28+		filetype = "org"
29+		micro.InfoBar():Message("Cheatsheet by file suffix: "..filename)
30+	elseif "unknown" ~= filetype then
31+		-- micro hopefully detected the filetype, the typical case
32+		micro.InfoBar():Message("Cheatsheet by file type: "..filetype)
33+	else
34+		micro.InfoBar():Message("Cheatsheet not found for type '"..filetype.."', filename '"..filename.."'")
35+		return
36+	end
37+	
38+	local cmd = "tab " .. cheatdir .. filetype .. ".md"
39+	bp:HandleCommand(cmd)
40+
41+end
A home/.config/micro/plug/cheat/repo.json
+35, -0
 1@@ -0,0 +1,35 @@
 2+[{
 3+  "Name": "cheat",
 4+  "Description": "F1 for cheatsheet related to the type of file you're editing: Lua, Go, Python...",
 5+  "Website": "https://terokarvinen.com/micro",
 6+  "Tags": ["cheatsheet", "help", "docs", "Lua", "Go", "Python", "reference"],
 7+  "Versions": [
 8+    {
 9+      "Version": "0.0.4",
10+      "Url": "https://github.com/terokarvinen/micro-cheat/archive/v0.0.4.zip",
11+      "Require": {
12+        "micro": ">=2.0.0"
13+      }
14+    },
15+    {
16+      "Version": "0.0.3",
17+      "Url": "https://github.com/terokarvinen/micro-cheat/archive/v0.0.3.zip",
18+      "Require": {
19+        "micro": ">=2.0.0"
20+      }
21+    },
22+    {
23+      "Version": "0.0.2",
24+      "Url": "https://github.com/terokarvinen/micro-cheat/archive/v0.0.2.zip",
25+      "Require": {
26+        "micro": ">=2.0.0"
27+      }
28+    },
29+    {
30+      "Version": "0.0.1",
31+      "Require": {
32+        "micro": ">=2.0.0"
33+      }
34+    }
35+  ]
36+}]
A home/.config/micro/plug/wc/CHANGELOG.md
+6, -0
1@@ -0,0 +1,6 @@
2+Version 1.2.1
3+* Fixed utf8 character count
4+
5+Version 1.2.0
6++ Now counts lines
7++ Added Support for counting lines, words and characters in selection
A home/.config/micro/plug/wc/LICENSE
+21, -0
 1@@ -0,0 +1,21 @@
 2+MIT License
 3+
 4+Copyright (c) 2020 bananaapple
 5+
 6+Permission is hereby granted, free of charge, to any person obtaining a copy
 7+of this software and associated documentation files (the "Software"), to deal
 8+in the Software without restriction, including without limitation the rights
 9+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+copies of the Software, and to permit persons to whom the Software is
11+furnished to do so, subject to the following conditions:
12+
13+The above copyright notice and this permission notice shall be included in all
14+copies or substantial portions of the Software.
15+
16+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+SOFTWARE.
A home/.config/micro/plug/wc/README.md
+4, -0
1@@ -0,0 +1,4 @@
2+# Micro Word Count Plugin
3+
4+Word, character and line counter for micro editor.
5+(forked from https://github.com/adamnpeace/micro-wc-plugin)
A home/.config/micro/plug/wc/help/wc.md
+25, -0
 1@@ -0,0 +1,25 @@
 2+# WordCount (wc) Plugin #
 3+
 4+The wc plugin provides the user with the ability to count either
 5+characters or strings in any text being edited with micro. 
 6+
 7+A word is defined as a string of characters delimited by white 
 8+space characters.  White space characters are the set of characters
 9+for which the iswspace(3) function returns true. 
10+
11+A line is defined as a string of characters delimited by \n
12+characters, or by the beginning or end of the file. \r\n line
13+endings will be counted correctly as well, since there is only
14+one \n per \r\n.
15+
16+Character count includes white space and newline characters.
17+
18+To initiate the function, you can either:
19+
20+Press "F5"
21+
22+Or run:
23+
24+```
25+> wc
26+```
A home/.config/micro/plug/wc/info.json
+10, -0
 1@@ -0,0 +1,10 @@
 2+{
 3+    "name": "wc",
 4+    "description": "Word count plugin",
 5+    "website": "",
 6+    "install": "",
 7+    "version": "1.2.1",
 8+    "require": [
 9+        "micro >= 2.0.0"
10+    ]
11+}
A home/.config/micro/plug/wc/repo.json
+22, -0
 1@@ -0,0 +1,22 @@
 2+[{
 3+  "Name": "wc",
 4+  "Description": "Plugin to count words/characters in micro",
 5+  "Tags": ["wc", "word", "character", "count"],
 6+  "Website": "https://github.com/adamnpeace/micro-wc-plugin",
 7+  "Versions": [
 8+    {
 9+      "Version": "1.1.0",
10+      "Url": "https://github.com/adamnpeace/micro-wc-plugin/archive/v1.1.0.zip",
11+      "Require": {
12+        "micro": ">=2.0.0-1"
13+      }
14+    },
15+    {
16+      "Version": "1.0.1",
17+      "Url": "https://github.com/adamnpeace/micro-wc-plugin/archive/v1.0.1.zip",
18+      "Require": {
19+        "micro": ">=1.1.0"
20+      }
21+    }
22+  ]
23+}]
A home/.config/micro/plug/wc/wc.lua
+37, -0
 1@@ -0,0 +1,37 @@
 2+VERSION = "1.2.1"
 3+
 4+local micro = import("micro")
 5+local config = import("micro/config")
 6+local util = import("micro/util")
 7+local utf8 = import("unicode/utf8")
 8+
 9+function init()
10+    config.MakeCommand("wc", wordCount, config.NoComplete)
11+    config.AddRuntimeFile("wc", config.RTHelp, "help/wc.md")
12+    config.TryBindKey("F5", "lua:wc.wordCount", false)
13+end
14+
15+function wordCount(bp)
16+	-- Buffer of selection/whole document
17+	local buffer
18+	--Get active cursor (to get selection)
19+	local cursor = bp.Buf:GetActiveCursor()
20+	--If cursor exists and there is selection, convert selection byte[] to string
21+	if cursor and cursor:HasSelection() then
22+		buffer = util.String(cursor:GetSelection())
23+	else
24+	--no selection, convert whole buffer byte[] to string
25+    	buffer = util.String(bp.Buf:Bytes())
26+    end
27+    --length of the buffer/selection (string), utf8 friendly
28+	charCount = utf8.RuneCountInString(buffer)
29+	--Get word/line count using gsub's number of substitutions
30+	-- number of substitutions, pattern: %S+ (more than one non-whitespace characters)
31+	local _ , wordCount = buffer:gsub("%S+","")
32+	-- number of substitutions, pattern: \n (number of newline characters)
33+	local _, lineCount = buffer:gsub("\n", "")
34+	--add one to line count (since we're counting separators not lines above)
35+	lineCount = lineCount + 1
36+	--display the message
37+	micro.InfoBar():Message("Lines:" .. lineCount .. "  Words:"..wordCount.."  Characters:"..charCount)
38+end