Commit f07cae2
chasinglightning
·
2025-01-28 13:28:30 -0500 EST
parent 5964be9
set up stow
120 files changed,
+21,
-10764
A
stow.sh
+1,
-0
| ... | ... | @@ -0,0 +1 @@ | |
| 1 | + | git/.gitconfig |
+3,
-0
+0,
-8
| ... | ... | @@ -1,8 +0,0 @@ | |
| 1 | - | [Desktop Entry] | |
| 2 | - | Name=ComicTagger | |
| 3 | - | GenericName= | |
| 4 | - | Comment= | |
| 5 | - | Exec=/home/kat/Downloads/Programs/ComicTagger-x86_64.AppImage | |
| 6 | - | Type=Application | |
| 7 | - | Icon=/media/kat/disk/Pictures/Miscellaneous/misc icons/comictagger.png | |
| 8 | - | Terminal=false |
+0,
-8
| ... | ... | @@ -1,8 +0,0 @@ | |
| 1 | - | [Desktop Entry] | |
| 2 | - | Name=ElectronWMD | |
| 3 | - | GenericName= | |
| 4 | - | Comment= | |
| 5 | - | Exec=/home/kat/Downloads/Programs/electronwmd-0.5.0-1.5.0-linux_x86_64.AppImage | |
| 6 | - | Type=Application | |
| 7 | - | Icon=/media/kat/disk/Pictures/Miscellaneous/misc icons/mdlogoiconwmdp.png | |
| 8 | - | Terminal=false |
+0,
-8
| ... | ... | @@ -1,8 +0,0 @@ | |
| 1 | - | [Desktop Entry] | |
| 2 | - | Name=MKVToolNix | |
| 3 | - | GenericName= | |
| 4 | - | Comment= | |
| 5 | - | Exec=/home/kat/Downloads/Programs/MKVToolNix_GUI-82.0-x86_64.AppImage | |
| 6 | - | Type=Application | |
| 7 | - | Icon=/media/kat/disk/Pictures/Miscellaneous/misc icons/c0d03eb7.png | |
| 8 | - | Terminal=false |
+0,
-8
| ... | ... | @@ -1,8 +0,0 @@ | |
| 1 | - | [Desktop Entry] | |
| 2 | - | Name=Obsidian | |
| 3 | - | GenericName= | |
| 4 | - | Comment= | |
| 5 | - | Exec=/home/kat/Downloads/Programs/Obsidian-1.6.7.AppImage | |
| 6 | - | Type=Application | |
| 7 | - | Icon=/media/kat/disk/Pictures/Miscellaneous/misc icons/2023_Obsidian_logo.svg.png | |
| 8 | - | Terminal=false |
+0,
-8
| ... | ... | @@ -1,8 +0,0 @@ | |
| 1 | - | [Desktop Entry] | |
| 2 | - | Name=Shotcut | |
| 3 | - | GenericName= | |
| 4 | - | Comment= | |
| 5 | - | Exec=/home/kat/Downloads/Programs/shotcut-linux-x86_64-240128.AppImage | |
| 6 | - | Type=Application | |
| 7 | - | Icon=/media/kat/disk/Pictures/Miscellaneous/misc icons/shotcut-logo-640x640.png | |
| 8 | - | Terminal=false |
+0,
-8
| ... | ... | @@ -1,8 +0,0 @@ | |
| 1 | - | [Desktop Entry] | |
| 2 | - | Name=Soulseek | |
| 3 | - | GenericName= | |
| 4 | - | Comment= | |
| 5 | - | Exec=/home/kat/Downloads/Programs/SoulseekQt-2018-1-30-64bit.AppImage | |
| 6 | - | Type=Application | |
| 7 | - | Icon=/media/kat/disk/Pictures/Miscellaneous/misc icons/soulseek-online-bigblue.png | |
| 8 | - | Terminal=false |
+0,
-8
| ... | ... | @@ -1,8 +0,0 @@ | |
| 1 | - | [Desktop Entry] | |
| 2 | - | Name=Waterfox | |
| 3 | - | GenericName= | |
| 4 | - | Comment= | |
| 5 | - | Exec=/home/kat/Downloads/Programs/waterfox/waterfox | |
| 6 | - | Type=Application | |
| 7 | - | Icon=/media/kat/disk/Pictures/Miscellaneous/misc icons/waterfox.GgOAxZ-_.svg | |
| 8 | - | Terminal=false |
R home/.config/conky/launch.sh =>
config/.config/conky/launch.sh
+0,
-0
R home/.config/conky/themes/strip-clear/dark-strip-l-clear-1920-1080.conf =>
config/.config/conky/themes/strip-clear/dark-strip-l-clear-1920-1080.conf
+0,
-0
R home/.config/conky/wttr.sh =>
config/.config/conky/wttr.sh
+0,
-0
R home/config/gallery-dl/gallery-dl.conf =>
config/.config/gallery-dl/gallery-dl.conf
+0,
-0
R home/config/mangamanager/settings.ini =>
config/.config/mangamanager/settings.ini
+0,
-0
R home/.config/micro/colorschemes/catppuccin-frappe.micro =>
config/.config/micro/colorschemes/catppuccin-frappe.micro
+0,
-0
R home/.config/starship.toml =>
config/.config/starship.toml
+0,
-0
R home/.local/bin/covid =>
config/.local/bin/covid
+0,
-0
R home/.local/bin/getlyr =>
config/.local/bin/getlyr
+0,
-0
R home/.local/bin/news =>
config/.local/bin/news
+0,
-0
R home/.local/bin/nowplaying =>
config/.local/bin/nowplaying
+0,
-0
R home/.local/bin/weather =>
config/.local/bin/weather
+0,
-0
| ... | ... | @@ -1,41 +0,0 @@ | |
| 1 | - | # config structure | |
| 2 | - | ||
| 3 | - | [OPTIONS] | |
| 4 | - | alignment=left | |
| 5 | - | source=google | |
| 6 | - | interval=1500 | |
| 7 | - | player=mpd | |
| 8 | - | autoswitch=on | |
| 9 | - | mpd_host=127.0.0.1 | |
| 10 | - | mpd_port=6600 | |
| 11 | - | mpd_pass= | |
| 12 | - | #colors | |
| 13 | - | #offset=1 | |
| 14 | - | statusbar=on | |
| 15 | - | ||
| 16 | - | [BINDINGS] | |
| 17 | - | up=arrow_up | |
| 18 | - | down=arrow_down | |
| 19 | - | ||
| 20 | - | step-up=arrow_left | |
| 21 | - | step-down=arrow_right | |
| 22 | - | step-size=5 | |
| 23 | - | ||
| 24 | - | left=j | |
| 25 | - | center=k | |
| 26 | - | right=l | |
| 27 | - | ||
| 28 | - | autoswitchtoggle=a | |
| 29 | - | cycle-source=c | |
| 30 | - | ||
| 31 | - | delete=d | |
| 32 | - | edit=e | |
| 33 | - | find=/ | |
| 34 | - | find-next=n | |
| 35 | - | find-prev=p | |
| 36 | - | ||
| 37 | - | help=h | |
| 38 | - | ||
| 39 | - | quit=q | |
| 40 | - | ||
| 41 | - |
+0,
-21
| ... | ... | @@ -1,21 +0,0 @@ | |
| 1 | - | MIT License | |
| 2 | - | ||
| 3 | - | Copyright (c) 2022 Tero Karvinen https://TeroKarvinen.com | |
| 4 | - | ||
| 5 | - | Permission is hereby granted, free of charge, to any person obtaining a copy | |
| 6 | - | of this software and associated documentation files (the "Software"), to deal | |
| 7 | - | in the Software without restriction, including without limitation the rights | |
| 8 | - | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| 9 | - | copies of the Software, and to permit persons to whom the Software is | |
| 10 | - | furnished to do so, subject to the following conditions: | |
| 11 | - | ||
| 12 | - | The above copyright notice and this permission notice shall be included in all | |
| 13 | - | copies or substantial portions of the Software. | |
| 14 | - | ||
| 15 | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| 16 | - | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| 17 | - | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| 18 | - | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| 19 | - | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| 20 | - | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
| 21 | - | SOFTWARE. |
+0,
-62
| ... | ... | @@ -1,62 +0,0 @@ | |
| 1 | - | # micro-cheat - F1 cheatsheet for the language you're editing | |
| 2 | - | ||
| 3 | - | **F1** Show cheatsheet for the language you're editing: Lua, Go, Python... | |
| 4 | - | ||
| 5 | - | A plugin for Micro editor. | |
| 6 | - | ||
| 7 | - | ## Usage | |
| 8 | - | ||
| 9 | - | Edit a source code file with micro. Press **F1**. | |
| 10 | - | ||
| 11 | - | A cheatsheet for the language opens. If you're editing Python, it's a Python cheatsheet. If Go, then Go cheatsheet. | |
| 12 | - | Press Ctrl-Q to close the cheatsheet tab and return to editing. | |
| 13 | - | ||
| 14 | - | For your convenience, micro-cheat also provides a command 'cheat' that you can bind to any key or run with ctrl-E. | |
| 15 | - | ||
| 16 | - | Tested with | |
| 17 | - | ||
| 18 | - | - Python | |
| 19 | - | - Go (Golang) | |
| 20 | - | - Lua | |
| 21 | - | - Javascript | |
| 22 | - | - CSS (cascading style sheets) | |
| 23 | - | - HTML | |
| 24 | - | - HAML (HTML abstraction markup language) | |
| 25 | - | - Vagrantfile (by filename) | |
| 26 | - | - Dockerfile (by filename) | |
| 27 | - | - Makefile | |
| 28 | - | - JavaScript (ECMAScript) | |
| 29 | - | - TypeScript | |
| 30 | - | - YAML (yet another markup language) | |
| 31 | - | - org-mode (*.org) | |
| 32 | - | - bash (shell) | |
| 33 | - | ||
| 34 | - | ## Installation | |
| 35 | - | ||
| 36 | - | In the future, you will be able to install micro-cheat by | |
| 37 | - | ||
| 38 | - | $ micro --plugin install micro-cheat | |
| 39 | - | ||
| 40 | - | Currently, there is just development install | |
| 41 | - | ||
| 42 | - | $ cd $HOME/.config/micro/plug/ | |
| 43 | - | $ git clone https://github.com/terokarvinen/micro-cheat | |
| 44 | - | ||
| 45 | - | ## Tutorial | |
| 46 | - | ||
| 47 | - | [Installation & tutorial for 4 plugins: Palettero, Cheat, Run and Jump](https://terokarvinen.com/2022/command-palette-cheatsheet-run-and-make-micro/) | |
| 48 | - | ||
| 49 | - | ## Limitations | |
| 50 | - | ||
| 51 | - | All cheatsheets included in cheatsheets/ directory are not supported yet. Micro-cheat has only been tested on Linux. | |
| 52 | - | ||
| 53 | - | ## Todo | |
| 54 | - | ||
| 55 | - | Bibtex references cheatsheet. Should be MIT licensed to be included in this plugin. | |
| 56 | - | ||
| 57 | - | ## Adminstrivia | |
| 58 | - | ||
| 59 | - | Cheatsheets are from https://devhints.io project, copyright (c) 2021 Rico Sta. Cruz and contributors, received under MIT license. | |
| 60 | - | ||
| 61 | - | Micro-cheat plugin is Copyright 2022 Tero Karvinen https://TeroKarvinen.com, MIT license. | |
| 62 | - |
| ... | ... | @@ -1,102 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Ansible | |
| 3 | - | category: Ansible | |
| 4 | - | --- | |
| 5 | - | ||
| 6 | - | {% raw %} | |
| 7 | - | ||
| 8 | - | ## Getting started | |
| 9 | - | ||
| 10 | - | ### Hosts | |
| 11 | - | ||
| 12 | - | $ sudo mkdir /etc/ansible | |
| 13 | - | $ sudo vim /etc/ansible/hosts | |
| 14 | - | ||
| 15 | - | [example] | |
| 16 | - | 192.0.2.101 | |
| 17 | - | 192.0.2.102 | |
| 18 | - | ||
| 19 | - | ### Running a playbook | |
| 20 | - | ||
| 21 | - | $ ansible-playbook playbook.yml | |
| 22 | - | ||
| 23 | - | ## Tasks | |
| 24 | - | ||
| 25 | - | - hosts: all | |
| 26 | - | user: root | |
| 27 | - | sudo: no | |
| 28 | - | vars: | |
| 29 | - | aaa: bbb | |
| 30 | - | tasks: | |
| 31 | - | - ... | |
| 32 | - | handlers: | |
| 33 | - | - ... | |
| 34 | - | ||
| 35 | - | ### Includes | |
| 36 | - | ||
| 37 | - | tasks: | |
| 38 | - | - include: db.yml | |
| 39 | - | handlers: | |
| 40 | - | - include: db.yml user=timmy | |
| 41 | - | ||
| 42 | - | ## Handlers | |
| 43 | - | ||
| 44 | - | handlers: | |
| 45 | - | - name: start apache2 | |
| 46 | - | action: service name=apache2 state=started | |
| 47 | - | ||
| 48 | - | tasks: | |
| 49 | - | - name: install apache | |
| 50 | - | action: apt pkg=apache2 state=latest | |
| 51 | - | notify: | |
| 52 | - | - start apache2 | |
| 53 | - | ||
| 54 | - | ## Vars | |
| 55 | - | ||
| 56 | - | - host: lol | |
| 57 | - | vars_files: | |
| 58 | - | - vars.yml | |
| 59 | - | vars: | |
| 60 | - | project_root: /etc/xyz | |
| 61 | - | tasks: | |
| 62 | - | - name: Create the SSH directory. | |
| 63 | - | file: state=directory path=${project_root}/home/.ssh/ | |
| 64 | - | only_if: "$vm == 0" | |
| 65 | - | ||
| 66 | - | ## Roles | |
| 67 | - | ||
| 68 | - | - host: xxx | |
| 69 | - | roles: | |
| 70 | - | - db | |
| 71 | - | - { role:ruby, sudo_user:$user } | |
| 72 | - | - web | |
| 73 | - | ||
| 74 | - | # Uses: | |
| 75 | - | # roles/db/tasks/*.yml | |
| 76 | - | # roles/db/handlers/*.yml | |
| 77 | - | ||
| 78 | - | ### Task: Failures | |
| 79 | - | ||
| 80 | - | - name: my task | |
| 81 | - | command: ... | |
| 82 | - | register: result | |
| 83 | - | failed_when: "'FAILED' in result.stderr" | |
| 84 | - | ||
| 85 | - | ignore_errors: yes | |
| 86 | - | ||
| 87 | - | changed_when: "result.rc != 2" | |
| 88 | - | ||
| 89 | - | ### Env vars | |
| 90 | - | ||
| 91 | - | vars: | |
| 92 | - | local_home: "{{ lookup('env','HOME') }}" | |
| 93 | - | ||
| 94 | - | ## References | |
| 95 | - | ||
| 96 | - | * [Intro](http://www.ansibleworks.com/docs/intro_configuration.html) | |
| 97 | - | * [Modules](http://www.ansibleworks.com/docs/modules.html) | |
| 98 | - | ||
| 99 | - | {% endraw %} | |
| 100 | - | ||
| 101 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 102 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,112 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Chef | |
| 3 | - | category: Devops | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | --- | |
| 6 | - | ||
| 7 | - | ### Install | |
| 8 | - | ||
| 9 | - | In your server: | |
| 10 | - | {: .-setup} | |
| 11 | - | ||
| 12 | - | ```bash | |
| 13 | - | $ sudo apt-get install curl | |
| 14 | - | ``` | |
| 15 | - | ||
| 16 | - | ```bash | |
| 17 | - | $ curl -L https://omnitruck.chef.io/install.sh | sudo bash | |
| 18 | - | Thank you for installing Chef! | |
| 19 | - | ``` | |
| 20 | - | ||
| 21 | - | ```bash | |
| 22 | - | $ chef-solo -v | |
| 23 | - | ... | |
| 24 | - | Chef: 14.5.33 | |
| 25 | - | ``` | |
| 26 | - | ||
| 27 | - | ### Start the cookbook | |
| 28 | - | ||
| 29 | - | ```bash | |
| 30 | - | wget http://github.com/chef-cookbooks/chef-repo/tarball/master -O - | tar xzf - --strip-components=1 | |
| 31 | - | ``` | |
| 32 | - | ||
| 33 | - | ### Knife | |
| 34 | - | ||
| 35 | - | ```bash | |
| 36 | - | $ knife supermarket download mysql | |
| 37 | - | ``` | |
| 38 | - | ||
| 39 | - | ### Invoking chef-solo | |
| 40 | - | ||
| 41 | - | ```bash | |
| 42 | - | $ chef-solo -c solo.rb -j web.json | |
| 43 | - | ``` | |
| 44 | - | ||
| 45 | - | ## Examples | |
| 46 | - | ||
| 47 | - | ### Simple compile-from-source | |
| 48 | - | ||
| 49 | - | ```ruby | |
| 50 | - | execute "tar --no-same-owner -zxf hi.tar.gz" do | |
| 51 | - | cwd "/usr/local/src" | |
| 52 | - | creates "/usr/local/src/node-v#{version}" | |
| 53 | - | end | |
| 54 | - | ``` | |
| 55 | - | ||
| 56 | - | ```ruby | |
| 57 | - | bash "compile" do | |
| 58 | - | cwd "/usr/local/src/node-v#{version}" | |
| 59 | - | code %[ | |
| 60 | - | PATH=/usr/local/bin:$PATH | |
| 61 | - | ./configure | |
| 62 | - | make | |
| 63 | - | ] | |
| 64 | - | creates "/usr/local/src/node-v#{version}/node" | |
| 65 | - | end | |
| 66 | - | ``` | |
| 67 | - | ||
| 68 | - | ### remote file | |
| 69 | - | ||
| 70 | - | ```ruby | |
| 71 | - | remote_file "/usr/local/src/hi.tar.gz" do | |
| 72 | - | source "http://..." | |
| 73 | - | checksum "ab83be..." | |
| 74 | - | mode 0644 | |
| 75 | - | action :create_if_missing | |
| 76 | - | end | |
| 77 | - | ``` | |
| 78 | - | ||
| 79 | - | ### ruby_block | |
| 80 | - | ||
| 81 | - | ```ruby | |
| 82 | - | ruby_block "name" do | |
| 83 | - | block { File.read ... } | |
| 84 | - | not_if { File.exists?(...) } | |
| 85 | - | end | |
| 86 | - | ``` | |
| 87 | - | ||
| 88 | - | ### Execute | |
| 89 | - | ||
| 90 | - | ```ruby | |
| 91 | - | execute "name" do | |
| 92 | - | cwd "..." | |
| 93 | - | environment({ "PATH" => "..." }) | |
| 94 | - | command "make install" | |
| 95 | - | creates "..." | |
| 96 | - | end | |
| 97 | - | ``` | |
| 98 | - | ||
| 99 | - | ### Conditions | |
| 100 | - | ||
| 101 | - | ```ruby | |
| 102 | - | creates "/usr/local/src/node-v#{version}/node" | |
| 103 | - | not_if { File.exists?('...') } | |
| 104 | - | ``` | |
| 105 | - | ||
| 106 | - | ## Also see | |
| 107 | - | ||
| 108 | - | * [Learn Chef Rally](https://learn.chef.io) _(learn.chef.io)_ | |
| 109 | - | * [install_from_source.rb recipe](https://github.com/mdxp/nodejs-cookbook/blob/master/recipes/install_from_source.rb) _(github.com)_ | |
| 110 | - | ||
| 111 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 112 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,73 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Cron | |
| 3 | - | category: CLI | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | updated: 2018-05-03 | |
| 6 | - | weight: -3 | |
| 7 | - | --- | |
| 8 | - | ||
| 9 | - | ## Format | |
| 10 | - | {: .-two-column} | |
| 11 | - | ||
| 12 | - | ### Format | |
| 13 | - | ||
| 14 | - | ``` | |
| 15 | - | Min Hour Day Mon Weekday | |
| 16 | - | ``` | |
| 17 | - | {: .-setup} | |
| 18 | - | ||
| 19 | - | ``` | |
| 20 | - | * * * * * command to be executed | |
| 21 | - | ``` | |
| 22 | - | ||
| 23 | - | ``` | |
| 24 | - | ┬ ┬ ┬ ┬ ┬ | |
| 25 | - | │ │ │ │ └─ Weekday (0=Sun .. 6=Sat) | |
| 26 | - | │ │ │ └────── Month (1..12) | |
| 27 | - | │ │ └─────────── Day (1..31) | |
| 28 | - | │ └──────────────── Hour (0..23) | |
| 29 | - | └───────────────────── Minute (0..59) | |
| 30 | - | ``` | |
| 31 | - | {: .-setup.-box-chars} | |
| 32 | - | ||
| 33 | - | ### Operators | |
| 34 | - | ||
| 35 | - | | Operator | Description | | |
| 36 | - | | --- | --- | | |
| 37 | - | | `*` | all values | | |
| 38 | - | | `,` | separate individual values | | |
| 39 | - | | `-` | a range of values | | |
| 40 | - | | `/` | divide a value into steps | | |
| 41 | - | ||
| 42 | - | ### Examples | |
| 43 | - | ||
| 44 | - | | Example | Description | | |
| 45 | - | | --- | --- | | |
| 46 | - | | `0 * * * *` | every hour | | |
| 47 | - | | `*/15 * * * *` | every 15 mins | | |
| 48 | - | | `0 */2 * * *` | every 2 hours | | |
| 49 | - | | `0 18 * * 0-6` | every week Mon-Sat at 6pm | | |
| 50 | - | | `10 2 * * 6,7` | every Sat and Sun on 2:10am | | |
| 51 | - | | `0 0 * * 0` | every Sunday midnight | | |
| 52 | - | | --- | --- | | |
| 53 | - | | `@reboot` | every reboot | | |
| 54 | - | ||
| 55 | - | ### Crontab | |
| 56 | - | ||
| 57 | - | ```bash | |
| 58 | - | # Adding tasks easily | |
| 59 | - | echo "@reboot echo hi" | crontab | |
| 60 | - | ``` | |
| 61 | - | ||
| 62 | - | ```bash | |
| 63 | - | # Open in editor | |
| 64 | - | crontab -e | |
| 65 | - | ``` | |
| 66 | - | ||
| 67 | - | ```bash | |
| 68 | - | # List tasks | |
| 69 | - | crontab -l [-u user] | |
| 70 | - | ``` | |
| 71 | - | ||
| 72 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 73 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,218 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: CSS | |
| 3 | - | category: CSS | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | weight: -1 | |
| 6 | - | keywords: | |
| 7 | - | - "margin, padding, border" | |
| 8 | - | - "div, .class, #id, [attr]" | |
| 9 | - | - "font, background" | |
| 10 | - | - "display: block, inline, flex" | |
| 11 | - | - Selectors | |
| 12 | - | - Properties | |
| 13 | - | --- | |
| 14 | - | ||
| 15 | - | ## Basics | |
| 16 | - | {: .-three-column} | |
| 17 | - | ||
| 18 | - | ### Selectors | |
| 19 | - | ||
| 20 | - | ```css | |
| 21 | - | .class { | |
| 22 | - | font-weight: bold; | |
| 23 | - | } | |
| 24 | - | ``` | |
| 25 | - | {: .-setup} | |
| 26 | - | ||
| 27 | - | | Selector | Description | | |
| 28 | - | | ----------------- | ------------ | | |
| 29 | - | | `*` | All elements | | |
| 30 | - | | `div` | Element | | |
| 31 | - | | `.class` | Class | | |
| 32 | - | | `#id` | ID | | |
| 33 | - | | `[disabled]` | Attribute | | |
| 34 | - | | `[role="dialog"]` | Attribute | | |
| 35 | - | ||
| 36 | - | ### Combinators | |
| 37 | - | ||
| 38 | - | | Selector | Description | | |
| 39 | - | | ------------------- | ----------------- | | |
| 40 | - | | `.parent .child` | Descendant | | |
| 41 | - | | `.parent > .child` | Direct descendant | | |
| 42 | - | | `.child + .sibling` | Adjacent sibling | | |
| 43 | - | | `.child ~ .sibling` | Far sibling | | |
| 44 | - | | `.class1.class2` | Have both classes | | |
| 45 | - | ||
| 46 | - | ### Attribute selectors | |
| 47 | - | ||
| 48 | - | | Selector | Description | | |
| 49 | - | | ------------------ | ----------------------------------- | | |
| 50 | - | | `[role="dialog"]` | `=` Exact | | |
| 51 | - | | `[class~="box"]` | `~=` Has word | | |
| 52 | - | | `[class|="box"]` | `|=` Exact or prefix (eg, `value-`) | | |
| 53 | - | | `[href$=".doc"]` | `$=` Ends in | | |
| 54 | - | | `[href^="/index"]` | `^=` Begins with | | |
| 55 | - | | `[class*="-is-"]` | `*=` Contains | | |
| 56 | - | ||
| 57 | - | ### Pseudo-classes | |
| 58 | - | ||
| 59 | - | | Selector | Description | | |
| 60 | - | | -------------------- | ------------------------------------------ | | |
| 61 | - | | `:target` | eg, `h2#foo:target` | | |
| 62 | - | | --- | --- | | |
| 63 | - | | `:disabled` | | | |
| 64 | - | | `:focus` | | | |
| 65 | - | | `:active` | | | |
| 66 | - | | --- | --- | | |
| 67 | - | | `:nth-child(3)` | 3rd child | | |
| 68 | - | | `:nth-child(3n+2)` | 2nd child in groups of 3 | | |
| 69 | - | | `:nth-child(-n+4)` | | | |
| 70 | - | | --- | --- | | |
| 71 | - | | `:nth-last-child(2)` | | | |
| 72 | - | | `:nth-of-type(2)` | | | |
| 73 | - | | --- | --- | | |
| 74 | - | | `:checked` | Checked inputs | | |
| 75 | - | | `:disabled` | Disabled elements | | |
| 76 | - | | `:default` | Default element in a group | | |
| 77 | - | | --- | --- | | |
| 78 | - | | `:empty` | Elements without children | | |
| 79 | - | ||
| 80 | - | ### Pseudo-class variations | |
| 81 | - | ||
| 82 | - | | Selector | | |
| 83 | - | | ----------------- | | |
| 84 | - | | `:first-of-type` | | |
| 85 | - | | `:last-of-type` | | |
| 86 | - | | `:nth-of-type(2)` | | |
| 87 | - | | `:only-of-type` | | |
| 88 | - | | --- | | |
| 89 | - | | `:first-child` | | |
| 90 | - | | `:last-child` | | |
| 91 | - | | `:nth-child(2)` | | |
| 92 | - | | `:only-child` | | |
| 93 | - | {: .-left-align} | |
| 94 | - | ||
| 95 | - | ## Fonts | |
| 96 | - | {: .-left-reference} | |
| 97 | - | ||
| 98 | - | ### Properties | |
| 99 | - | ||
| 100 | - | | Property | Description | | |
| 101 | - | | ------------------ | ------------------------------------ | | |
| 102 | - | | `font-family:` | `<font>, <fontN>` | | |
| 103 | - | | `font-size:` | `<size>` | | |
| 104 | - | | `letter-spacing:` | `<size>` | | |
| 105 | - | | `line-height:` | `<number>` | | |
| 106 | - | | --- | --- | | |
| 107 | - | | `font-weight:` | `bold` `normal` | | |
| 108 | - | | `font-style:` | `italic` `normal` | | |
| 109 | - | | `text-decoration:` | `underline` `none` | | |
| 110 | - | | --- | --- | | |
| 111 | - | | `text-align:` | `left` `right` `center` `justify` | | |
| 112 | - | | `text-transform:` | `capitalize` `uppercase` `lowercase` | | |
| 113 | - | {: .-key-values} | |
| 114 | - | ||
| 115 | - | ### Shorthand | |
| 116 | - | {: .-prime} | |
| 117 | - | ||
| 118 | - | | | style | weight | size (required) | | line-height | family | | |
| 119 | - | | ------- | -------- | ------ | --------------- | --- | ----------- | ----------------- | | |
| 120 | - | | `font:` | `italic` | `400` | `14px` | `/` | `1.5` | `sans-serif` | | |
| 121 | - | | | style | weight | size (required) | | line-height | family (required) | | |
| 122 | - | {: .-css-breakdown} | |
| 123 | - | ||
| 124 | - | ### Example | |
| 125 | - | ||
| 126 | - | ```css | |
| 127 | - | font-family: Arial; | |
| 128 | - | font-size: 12pt; | |
| 129 | - | line-height: 1.5; | |
| 130 | - | letter-spacing: 0.02em; | |
| 131 | - | color: #aa3322; | |
| 132 | - | ``` | |
| 133 | - | ||
| 134 | - | ### Case | |
| 135 | - | ||
| 136 | - | ```css | |
| 137 | - | text-transform: capitalize; /* Hello */ | |
| 138 | - | text-transform: uppercase; /* HELLO */ | |
| 139 | - | text-transform: lowercase; /* hello */ | |
| 140 | - | ``` | |
| 141 | - | ||
| 142 | - | ## Background | |
| 143 | - | {: .-left-reference} | |
| 144 | - | ||
| 145 | - | ### Properties | |
| 146 | - | ||
| 147 | - | | Property | Description | | |
| 148 | - | | ------------------------ | ---------------------------------------- | | |
| 149 | - | | `background:` | _(Shorthand)_ | | |
| 150 | - | | --- | --- | | |
| 151 | - | | `background-color:` | `<color>` | | |
| 152 | - | | `background-image:` | `url(...)` | | |
| 153 | - | | `background-position:` | `left/center/right` `top/center/bottom` | | |
| 154 | - | | `background-size:` | `cover` `X Y` | | |
| 155 | - | | `background-clip:` | `border-box` `padding-box` `content-box` | | |
| 156 | - | | `background-repeat:` | `no-repeat` `repeat-x` `repeat-y` | | |
| 157 | - | | `background-attachment:` | `scroll` `fixed` `local` | | |
| 158 | - | {: .-key-values} | |
| 159 | - | ||
| 160 | - | ### Shorthand | |
| 161 | - | ||
| 162 | - | | | color | image | positionX | positionY | | size | repeat | attachment | | |
| 163 | - | | ------------- | ------ | ------------- | --------- | --------- | --- | -------------- | ----------- | ---------- | | |
| 164 | - | | `background:` | `#ff0` | `url(bg.jpg)` | `left` | `top` | `/` | `100px` `auto` | `no-repeat` | `fixed;` | | |
| 165 | - | | `background:` | `#abc` | `url(bg.png)` | `center` | `center` | `/` | `cover` | `repeat-x` | `local;` | | |
| 166 | - | | | color | image | positionX | positionY | | size | repeat | attachment | | |
| 167 | - | {: .-css-breakdown} | |
| 168 | - | ||
| 169 | - | ### Multiple backgrounds | |
| 170 | - | ||
| 171 | - | ```css | |
| 172 | - | background: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), | |
| 173 | - | url('background.jpg') center center / cover, #333; | |
| 174 | - | ``` | |
| 175 | - | ||
| 176 | - | ## Animation | |
| 177 | - | {: .-left-reference} | |
| 178 | - | ||
| 179 | - | ### Properties | |
| 180 | - | ||
| 181 | - | | Property | Value | | |
| 182 | - | | ---------------------------- | -------------------------------------------------------- | | |
| 183 | - | | `animation:` | _(shorthand)_ | | |
| 184 | - | | `animation-name:` | `<name>` | | |
| 185 | - | | `animation-duration:` | `<time>ms` | | |
| 186 | - | | `animation-timing-function:` | `ease` `linear` `ease-in` `ease-out` `ease-in-out` | | |
| 187 | - | | `animation-delay:` | `<time>ms` | | |
| 188 | - | | `animation-iteration-count:` | `infinite` `<number>` | | |
| 189 | - | | `animation-direction:` | `normal` `reverse` `alternate` `alternate-reverse` | | |
| 190 | - | | `animation-fill-mode:` | `none` `forwards` `backwards` `both` `initial` `inherit` | | |
| 191 | - | | `animation-play-state:` | `normal` `reverse` `alternate` `alternate-reverse` | | |
| 192 | - | {: .-key-values} | |
| 193 | - | ||
| 194 | - | ### Shorthand | |
| 195 | - | ||
| 196 | - | | | name | duration | timing-function | delay | count | direction | fill-mode | play-state | | |
| 197 | - | | ------------ | -------- | -------- | --------------- | ------- | ---------- | ------------------- | --------- | ---------- | | |
| 198 | - | | `animation:` | `bounce` | `300ms` | `linear` | `100ms` | `infinite` | `alternate-reverse` | `both` | `reverse` | | |
| 199 | - | | | name | duration | timing-function | delay | count | direction | fill-mode | play-state | | |
| 200 | - | {: .-css-breakdown} | |
| 201 | - | ||
| 202 | - | ### Example | |
| 203 | - | ||
| 204 | - | ```css | |
| 205 | - | animation: bounce 300ms linear 0s infinite normal; | |
| 206 | - | animation: bounce 300ms linear infinite; | |
| 207 | - | animation: bounce 300ms linear infinite alternate-reverse; | |
| 208 | - | animation: bounce 300ms linear 2s infinite alternate-reverse forwards normal; | |
| 209 | - | ``` | |
| 210 | - | ||
| 211 | - | ### Event | |
| 212 | - | ||
| 213 | - | ```js | |
| 214 | - | .one('webkitAnimationEnd oanimationend msAnimationEnd animationend') | |
| 215 | - | ``` | |
| 216 | - | ||
| 217 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 218 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,115 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Dockerfile | |
| 3 | - | category: Devops | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | prism_languages: [docker] | |
| 6 | - | updated: 2019-10-20 | |
| 7 | - | --- | |
| 8 | - | ||
| 9 | - | ## Reference | |
| 10 | - | {: .-three-column} | |
| 11 | - | ||
| 12 | - | ### Inheritance | |
| 13 | - | ||
| 14 | - | ```docker | |
| 15 | - | FROM ruby:2.2.2 | |
| 16 | - | ``` | |
| 17 | - | ||
| 18 | - | ### Variables | |
| 19 | - | ||
| 20 | - | ```docker | |
| 21 | - | ENV APP_HOME /myapp | |
| 22 | - | RUN mkdir $APP_HOME | |
| 23 | - | ``` | |
| 24 | - | ||
| 25 | - | ```docker | |
| 26 | - | ARG APP_HOME="" | |
| 27 | - | RUN mkdir $APP_HOME | |
| 28 | - | ``` | |
| 29 | - | ||
| 30 | - | ### Initialization | |
| 31 | - | ||
| 32 | - | ```docker | |
| 33 | - | RUN bundle install | |
| 34 | - | ``` | |
| 35 | - | ||
| 36 | - | ```docker | |
| 37 | - | WORKDIR /myapp | |
| 38 | - | ``` | |
| 39 | - | ||
| 40 | - | ```docker | |
| 41 | - | VOLUME ["/data"] | |
| 42 | - | # Specification for mount point | |
| 43 | - | ``` | |
| 44 | - | ||
| 45 | - | ```docker | |
| 46 | - | ADD file.xyz /file.xyz | |
| 47 | - | COPY --chown=user:group host_file.xyz /path/container_file.xyz | |
| 48 | - | ``` | |
| 49 | - | ||
| 50 | - | ### Run commands in strict shell | |
| 51 | - | ||
| 52 | - | ```docker | |
| 53 | - | ENV my_var | |
| 54 | - | SHELL ["/bin/bash", "-euo", "pipefail", "-c"] | |
| 55 | - | ||
| 56 | - | # With strict mode: | |
| 57 | - | RUN false # fails build like using && | |
| 58 | - | RUN echo "$myvar" # will throw error due to typo | |
| 59 | - | RUN true | false # will bail out of pipe | |
| 60 | - | ``` | |
| 61 | - | ||
| 62 | - | Using `shell` will turn on strict mode for shell commands. | |
| 63 | - | ||
| 64 | - | ### Onbuild | |
| 65 | - | ||
| 66 | - | ```docker | |
| 67 | - | ONBUILD RUN bundle install | |
| 68 | - | # when used with another file | |
| 69 | - | ``` | |
| 70 | - | ||
| 71 | - | ### Commands | |
| 72 | - | ||
| 73 | - | ```docker | |
| 74 | - | EXPOSE 5900 | |
| 75 | - | CMD ["bundle", "exec", "rails", "server"] | |
| 76 | - | ``` | |
| 77 | - | ||
| 78 | - | ### Entrypoint | |
| 79 | - | ||
| 80 | - | ```docker | |
| 81 | - | ENTRYPOINT ["executable", "param1", "param2"] | |
| 82 | - | ENTRYPOINT command param1 param2 | |
| 83 | - | ``` | |
| 84 | - | ||
| 85 | - | Configures a container that will run as an executable. | |
| 86 | - | ||
| 87 | - | ```docker | |
| 88 | - | ENTRYPOINT exec top -b | |
| 89 | - | ``` | |
| 90 | - | ||
| 91 | - | This will use shell processing to substitute shell variables, and will ignore any `CMD` or `docker run` command line arguments. | |
| 92 | - | ||
| 93 | - | ### Metadata | |
| 94 | - | ||
| 95 | - | ```docker | |
| 96 | - | LABEL version="1.0" | |
| 97 | - | ``` | |
| 98 | - | ||
| 99 | - | ```docker | |
| 100 | - | LABEL "com.example.vendor"="ACME Incorporated" | |
| 101 | - | LABEL com.example.label-with-value="foo" | |
| 102 | - | ``` | |
| 103 | - | ||
| 104 | - | ```docker | |
| 105 | - | LABEL description="This text illustrates \ | |
| 106 | - | that label-values can span multiple lines." | |
| 107 | - | ``` | |
| 108 | - | ||
| 109 | - | ## See also | |
| 110 | - | {: .-one-column} | |
| 111 | - | ||
| 112 | - | - <https://docs.docker.com/engine/reference/builder/> | |
| 113 | - | ||
| 114 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 115 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,78 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: editorconfig | |
| 3 | - | layout: 2017/sheet | |
| 4 | - | prism_languages: [ini] | |
| 5 | - | weight: -1 | |
| 6 | - | updated: 2019-09-25 | |
| 7 | - | category: Apps | |
| 8 | - | --- | |
| 9 | - | ||
| 10 | - | ### Short example | |
| 11 | - | {: .-prime} | |
| 12 | - | ||
| 13 | - | ```ini | |
| 14 | - | # editorconfig.org | |
| 15 | - | root = true | |
| 16 | - | ||
| 17 | - | [*] | |
| 18 | - | indent_style = space | |
| 19 | - | indent_size = 2 | |
| 20 | - | tab_width = 2 | |
| 21 | - | end_of_line = lf | |
| 22 | - | charset = utf-8 | |
| 23 | - | trim_trailing_whitespace = true | |
| 24 | - | insert_final_newline = true | |
| 25 | - | ``` | |
| 26 | - | ||
| 27 | - | 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) | |
| 28 | - | ||
| 29 | - | ### Properties | |
| 30 | - | ||
| 31 | - | ```ini | |
| 32 | - | indent_style = {space|tab} | |
| 33 | - | indent_size = {4|tab} | |
| 34 | - | tab_width = 2 | |
| 35 | - | end_of_line = {cr|lf|crlf} | |
| 36 | - | charset = {utf-8|utf-16be|utf-16le|latin1} | |
| 37 | - | trim_trailing_whitespace = false | |
| 38 | - | insert_final_newline = true | |
| 39 | - | max_line_length = 80 | |
| 40 | - | ``` | |
| 41 | - | ||
| 42 | - | ### Full example | |
| 43 | - | ||
| 44 | - | ```ini | |
| 45 | - | # top-most EditorConfig file | |
| 46 | - | root = true | |
| 47 | - | ||
| 48 | - | # Unix-style newlines with a newline ending every file | |
| 49 | - | [*] | |
| 50 | - | end_of_line = lf | |
| 51 | - | insert_final_newline = true | |
| 52 | - | ||
| 53 | - | # 4 space indentation | |
| 54 | - | [*.py] | |
| 55 | - | indent_style = space | |
| 56 | - | indent_size = 4 | |
| 57 | - | ||
| 58 | - | # Tab indentation (no size specified) | |
| 59 | - | [*.js] | |
| 60 | - | indent_style = tab | |
| 61 | - | ||
| 62 | - | # Indentation override for all JS under lib directory | |
| 63 | - | [lib/**.js] | |
| 64 | - | indent_style = space | |
| 65 | - | indent_size = 2 | |
| 66 | - | ||
| 67 | - | # Matches the exact files either package.json or .travis.yml | |
| 68 | - | [{package.json,.travis.yml}] | |
| 69 | - | indent_style = space | |
| 70 | - | indent_size = 2 | |
| 71 | - | ``` | |
| 72 | - | ||
| 73 | - | ### References | |
| 74 | - | ||
| 75 | - | - <https://EditorConfig.org> | |
| 76 | - | ||
| 77 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 78 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,766 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Elixir | |
| 3 | - | category: Elixir | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | tags: [New] | |
| 6 | - | updated: 2018-07-04 | |
| 7 | - | weight: -10 | |
| 8 | - | --- | |
| 9 | - | ||
| 10 | - | ## Getting started | |
| 11 | - | {: .-three-column} | |
| 12 | - | ||
| 13 | - | ### Hello world | |
| 14 | - | {: .-prime} | |
| 15 | - | ||
| 16 | - | ```elixir | |
| 17 | - | # hello.exs | |
| 18 | - | defmodule Greeter do | |
| 19 | - | def greet(name) do | |
| 20 | - | message = "Hello, " <> name <> "!" | |
| 21 | - | IO.puts message | |
| 22 | - | end | |
| 23 | - | end | |
| 24 | - | ||
| 25 | - | Greeter.greet("world") | |
| 26 | - | ``` | |
| 27 | - | ||
| 28 | - | ```bash | |
| 29 | - | elixir hello.exs | |
| 30 | - | # Hello, world! | |
| 31 | - | ``` | |
| 32 | - | {: .-setup} | |
| 33 | - | ||
| 34 | - | ### Variables | |
| 35 | - | ||
| 36 | - | ```elixir | |
| 37 | - | age = 23 | |
| 38 | - | ``` | |
| 39 | - | ||
| 40 | - | ### Maps | |
| 41 | - | ||
| 42 | - | ```elixir | |
| 43 | - | user = %{ | |
| 44 | - | name: "John", | |
| 45 | - | city: "Melbourne" | |
| 46 | - | } | |
| 47 | - | ``` | |
| 48 | - | ||
| 49 | - | ```elixir | |
| 50 | - | IO.puts "Hello, " <> user.name | |
| 51 | - | ``` | |
| 52 | - | {: .-setup} | |
| 53 | - | ||
| 54 | - | ### Lists | |
| 55 | - | ||
| 56 | - | ```elixir | |
| 57 | - | users = [ "Tom", "Dick", "Harry" ] | |
| 58 | - | ``` | |
| 59 | - | {: data-line="1"} | |
| 60 | - | ||
| 61 | - | ```elixir | |
| 62 | - | Enum.map(users, fn user -> | |
| 63 | - | IO.puts "Hello " <> user | |
| 64 | - | end) | |
| 65 | - | ``` | |
| 66 | - | ||
| 67 | - | ### Piping | |
| 68 | - | ||
| 69 | - | ```elixir | |
| 70 | - | source | |
| 71 | - | |> transform(:hello) | |
| 72 | - | |> print() | |
| 73 | - | ``` | |
| 74 | - | {: data-line="2,3"} | |
| 75 | - | ||
| 76 | - | ```elixir | |
| 77 | - | # Same as: | |
| 78 | - | print(transform(source, :hello)) | |
| 79 | - | ``` | |
| 80 | - | ||
| 81 | - | These two are equivalent. | |
| 82 | - | ||
| 83 | - | ### Pattern matching | |
| 84 | - | ||
| 85 | - | ```elixir | |
| 86 | - | user = %{name: "Tom", age: 23} | |
| 87 | - | %{name: username} = user | |
| 88 | - | ``` | |
| 89 | - | {: data-line="2"} | |
| 90 | - | ||
| 91 | - | This sets `username` to `"Tom"`. | |
| 92 | - | ||
| 93 | - | ### Pattern matching in functions | |
| 94 | - | ||
| 95 | - | ```elixir | |
| 96 | - | def greet(%{name: username}) do | |
| 97 | - | IO.puts "Hello, " <> username | |
| 98 | - | end | |
| 99 | - | ||
| 100 | - | user = %{name: "Tom", age: 23} | |
| 101 | - | ``` | |
| 102 | - | {: data-line="1"} | |
| 103 | - | ||
| 104 | - | Pattern matching works in function parameters too. | |
| 105 | - | ||
| 106 | - | Control flow | |
| 107 | - | ------------ | |
| 108 | - | {: .-three-column} | |
| 109 | - | ||
| 110 | - | ### If | |
| 111 | - | ||
| 112 | - | ```elixir | |
| 113 | - | if false do | |
| 114 | - | "This will never be seen" | |
| 115 | - | else | |
| 116 | - | "This will" | |
| 117 | - | end | |
| 118 | - | ``` | |
| 119 | - | ### Case | |
| 120 | - | ||
| 121 | - | ```elixir | |
| 122 | - | case {1, 2, 3} do | |
| 123 | - | {4, 5, 6} -> | |
| 124 | - | "This clause won't match" | |
| 125 | - | {1, x, 3} -> | |
| 126 | - | "This will match and bind x to 2" | |
| 127 | - | _ -> | |
| 128 | - | "This will match any value" | |
| 129 | - | end | |
| 130 | - | ``` | |
| 131 | - | ||
| 132 | - | ### Cond | |
| 133 | - | ||
| 134 | - | ```elixir | |
| 135 | - | cond do | |
| 136 | - | 1 + 1 == 3 -> | |
| 137 | - | "I will never be seen" | |
| 138 | - | 2 * 5 == 12 -> | |
| 139 | - | "Me neither" | |
| 140 | - | true -> | |
| 141 | - | "But I will (this is essentially an else)" | |
| 142 | - | end | |
| 143 | - | ``` | |
| 144 | - | ||
| 145 | - | ### With | |
| 146 | - | ||
| 147 | - | ```elixir | |
| 148 | - | with {:ok, {int, _asdf}} <- Integer.parse("123asdf"), | |
| 149 | - | {:ok, datetime, _utc_offset} <- DateTime.from_iso8601("2021-10-27T12:00:00Z") do | |
| 150 | - | DateTime.add(datetime, int, :second) | |
| 151 | - | # optional else clause. if not provided and an error occurs, the error is returned | |
| 152 | - | else | |
| 153 | - | :error -> "couldn't parse integer string" | |
| 154 | - | {:error, :invalid_format} -> "couldn't parse date string" | |
| 155 | - | _ -> "this will never get hit because all errors are handled" | |
| 156 | - | end | |
| 157 | - | ``` | |
| 158 | - | ||
| 159 | - | ### Errors | |
| 160 | - | ||
| 161 | - | ```elixir | |
| 162 | - | try do | |
| 163 | - | throw(:hello) | |
| 164 | - | catch | |
| 165 | - | message -> "Got #{message}." | |
| 166 | - | after | |
| 167 | - | IO.puts("I'm the after clause.") | |
| 168 | - | end | |
| 169 | - | ``` | |
| 170 | - | ||
| 171 | - | ## Types | |
| 172 | - | ||
| 173 | - | ### Primitives | |
| 174 | - | ||
| 175 | - | | Sample | Type | | |
| 176 | - | | --- | --- | | |
| 177 | - | | `nil` | Nil/null | | |
| 178 | - | | `true` _/_ `false` | Boolean | | |
| 179 | - | | --- | --- | | |
| 180 | - | | `?a` | Integer (ASCII) | | |
| 181 | - | | `23` | Integer | | |
| 182 | - | | `3.14` | Float | | |
| 183 | - | | --- | --- | | |
| 184 | - | | `'hello'` | Charlist | | |
| 185 | - | | `<<2, 3>>` | Binary | | |
| 186 | - | | `"hello"` | Binary string | | |
| 187 | - | | `:hello` | Atom | | |
| 188 | - | | --- | --- | | |
| 189 | - | | `[a, b]` | List | | |
| 190 | - | | `{a, b}` | Tuple | | |
| 191 | - | | --- | --- | | |
| 192 | - | | `%{a: "hello"}` | Map | | |
| 193 | - | | `%MyStruct{a: "hello"}` | Struct | | |
| 194 | - | | `fn -> ... end` | Function | | |
| 195 | - | ||
| 196 | - | ### Type checks | |
| 197 | - | ||
| 198 | - | ```elixir | |
| 199 | - | is_atom/1 | |
| 200 | - | is_bitstring/1 | |
| 201 | - | is_boolean/1 | |
| 202 | - | is_function/1 | |
| 203 | - | is_function/2 | |
| 204 | - | is_integer/1 | |
| 205 | - | is_float/1 | |
| 206 | - | ``` | |
| 207 | - | ||
| 208 | - | ```elixir | |
| 209 | - | is_binary/1 | |
| 210 | - | is_list/1 | |
| 211 | - | is_map/1 | |
| 212 | - | is_tuple/1 | |
| 213 | - | ``` | |
| 214 | - | ||
| 215 | - | ```elixir | |
| 216 | - | is_nil/1 | |
| 217 | - | is_number/1 | |
| 218 | - | is_pid/1 | |
| 219 | - | is_port/1 | |
| 220 | - | is_reference/1 | |
| 221 | - | ``` | |
| 222 | - | ||
| 223 | - | ### Operators | |
| 224 | - | ||
| 225 | - | ```elixir | |
| 226 | - | left != right # equal | |
| 227 | - | left !== right # match | |
| 228 | - | left ++ right # concat lists | |
| 229 | - | left <> right # concat string/binary | |
| 230 | - | left =~ right # regexp | |
| 231 | - | ``` | |
| 232 | - | ||
| 233 | - | Modules | |
| 234 | - | ------- | |
| 235 | - | ||
| 236 | - | ### Importing | |
| 237 | - | ||
| 238 | - | ```elixir | |
| 239 | - | require Redux # compiles a module | |
| 240 | - | import Redux # compiles, and you can use without the `Redux.` prefix | |
| 241 | - | ||
| 242 | - | use Redux # compiles, and runs Redux.__using__/1 | |
| 243 | - | use Redux, async: true | |
| 244 | - | ||
| 245 | - | import Redux, only: [duplicate: 2] | |
| 246 | - | import Redux, only: :functions | |
| 247 | - | import Redux, only: :macros | |
| 248 | - | ||
| 249 | - | import Foo.{Bar, Baz} | |
| 250 | - | ``` | |
| 251 | - | ||
| 252 | - | ### Aliases | |
| 253 | - | ||
| 254 | - | ```elixir | |
| 255 | - | alias Foo.Bar, as: Bar | |
| 256 | - | alias Foo.Bar # same as above | |
| 257 | - | ||
| 258 | - | alias Foo.{Bar, Baz} | |
| 259 | - | ``` | |
| 260 | - | ||
| 261 | - | ## String | |
| 262 | - | ||
| 263 | - | ### Functions | |
| 264 | - | ||
| 265 | - | ```elixir | |
| 266 | - | import String | |
| 267 | - | ``` | |
| 268 | - | {: .-setup} | |
| 269 | - | ||
| 270 | - | ```elixir | |
| 271 | - | str = "hello" | |
| 272 | - | str |> length() # → 5 | |
| 273 | - | str |> codepoints() # → ["h", "e", "l", "l", "o"] | |
| 274 | - | str |> slice(2..-1) # → "llo" | |
| 275 | - | str |> split(" ") # → ["hello"] | |
| 276 | - | str |> capitalize() # → "Hello" | |
| 277 | - | str |> match(regex) | |
| 278 | - | ``` | |
| 279 | - | ||
| 280 | - | ### Inspecting objects | |
| 281 | - | ||
| 282 | - | ```elixir | |
| 283 | - | inspect(object, opts \\ []) | |
| 284 | - | ``` | |
| 285 | - | ```elixir | |
| 286 | - | value |> IO.inspect() | |
| 287 | - | ``` | |
| 288 | - | ```elixir | |
| 289 | - | value |> IO.inspect(label: "value") | |
| 290 | - | ``` | |
| 291 | - | ||
| 292 | - | ## Numbers | |
| 293 | - | ||
| 294 | - | ### Operations | |
| 295 | - | ||
| 296 | - | ```elixir | |
| 297 | - | abs(n) | |
| 298 | - | round(n) | |
| 299 | - | rem(a, b) # remainder (modulo) | |
| 300 | - | div(a, b) # integer division | |
| 301 | - | ``` | |
| 302 | - | ||
| 303 | - | ### Float | |
| 304 | - | ||
| 305 | - | ```elixir | |
| 306 | - | import Float | |
| 307 | - | ``` | |
| 308 | - | {: .-setup} | |
| 309 | - | ||
| 310 | - | ```elixir | |
| 311 | - | n = 10.3 | |
| 312 | - | ``` | |
| 313 | - | {: .-setup} | |
| 314 | - | ||
| 315 | - | ```elixir | |
| 316 | - | n |> ceil() # → 11.0 | |
| 317 | - | n |> ceil(2) # → 11.30 | |
| 318 | - | n |> to_string() # → "1.030000+e01" | |
| 319 | - | n |> to_string([decimals: 2, compact: true]) | |
| 320 | - | ``` | |
| 321 | - | ||
| 322 | - | ```elixir | |
| 323 | - | Float.parse("34") # → { 34.0, "" } | |
| 324 | - | ``` | |
| 325 | - | ||
| 326 | - | ### Integer | |
| 327 | - | ||
| 328 | - | ```elixir | |
| 329 | - | import Integer | |
| 330 | - | ``` | |
| 331 | - | {: .-setup} | |
| 332 | - | ||
| 333 | - | ```elixir | |
| 334 | - | n = 12 | |
| 335 | - | ``` | |
| 336 | - | {: .-setup} | |
| 337 | - | ||
| 338 | - | ```elixir | |
| 339 | - | n |> digits() # → [1, 2] | |
| 340 | - | n |> to_charlist() # → '12' | |
| 341 | - | n |> to_string() # → "12" | |
| 342 | - | n |> is_even() | |
| 343 | - | n |> is_odd() | |
| 344 | - | ``` | |
| 345 | - | ||
| 346 | - | ```elixir | |
| 347 | - | # Different base: | |
| 348 | - | n |> digits(2) # → [1, 1, 0, 0] | |
| 349 | - | n |> to_charlist(2) # → '1100' | |
| 350 | - | n |> to_string(2) # → "1100" | |
| 351 | - | ``` | |
| 352 | - | ||
| 353 | - | ```elixir | |
| 354 | - | parse("12") # → {12, ""} | |
| 355 | - | undigits([1, 2]) # → 12 | |
| 356 | - | ``` | |
| 357 | - | ||
| 358 | - | ### Type casting | |
| 359 | - | ||
| 360 | - | ```elixir | |
| 361 | - | Float.parse("34.1") # → {34.1, ""} | |
| 362 | - | Integer.parse("34") # → {34, ""} | |
| 363 | - | ``` | |
| 364 | - | ||
| 365 | - | ```elixir | |
| 366 | - | Float.to_string(34.1) # → "3.4100e+01" | |
| 367 | - | Float.to_string(34.1, [decimals: 2, compact: true]) # → "34.1" | |
| 368 | - | ``` | |
| 369 | - | ||
| 370 | - | ## Map | |
| 371 | - | ||
| 372 | - | ### Defining | |
| 373 | - | ||
| 374 | - | ```elixir | |
| 375 | - | m = %{name: "hi"} # atom keys (:name) | |
| 376 | - | m = %{"name" => "hi"} # string keys ("name") | |
| 377 | - | ``` | |
| 378 | - | ||
| 379 | - | ### Updating | |
| 380 | - | ||
| 381 | - | ```elixir | |
| 382 | - | import Map | |
| 383 | - | ``` | |
| 384 | - | {: .-setup} | |
| 385 | - | ||
| 386 | - | ```elixir | |
| 387 | - | m = %{m | name: "yo"} # key must exist | |
| 388 | - | ``` | |
| 389 | - | ||
| 390 | - | ```elixir | |
| 391 | - | m |> put(:id, 2) # → %{id: 2, name: "hi"} | |
| 392 | - | m |> put_new(:id, 2) # only if `id` doesn't exist (`||=`) | |
| 393 | - | ``` | |
| 394 | - | ||
| 395 | - | ```elixir | |
| 396 | - | m |> put(:b, "Banana") | |
| 397 | - | m |> merge(%{b: "Banana"}) | |
| 398 | - | m |> update(:a, &(&1 + 1)) | |
| 399 | - | m |> update(:a, fun a -> a + 1 end) | |
| 400 | - | ``` | |
| 401 | - | ||
| 402 | - | ```elixir | |
| 403 | - | m |> get_and_update(:a, &(&1 || "default")) | |
| 404 | - | # → {old, new} | |
| 405 | - | ``` | |
| 406 | - | ||
| 407 | - | ### Deleting | |
| 408 | - | ||
| 409 | - | ```elixir | |
| 410 | - | m |> delete(:name) # → %{} | |
| 411 | - | m |> pop(:name) # → {"John", %{}} | |
| 412 | - | ``` | |
| 413 | - | ||
| 414 | - | ### Reading | |
| 415 | - | ||
| 416 | - | ```elixir | |
| 417 | - | m |> get(:id) # → 1 | |
| 418 | - | m |> keys() # → [:id, :name] | |
| 419 | - | m |> values() # → [1, "hi"] | |
| 420 | - | ``` | |
| 421 | - | ||
| 422 | - | ```elixir | |
| 423 | - | m |> to_list() # → [id: 1, name: "hi"] | |
| 424 | - | # → [{:id, 1}, {:name, "hi"}] | |
| 425 | - | ``` | |
| 426 | - | ||
| 427 | - | ### Deep | |
| 428 | - | ||
| 429 | - | ```elixir | |
| 430 | - | put_in(map, [:b, :c], "Banana") | |
| 431 | - | put_in(map[:b][:c], "Banana") # via macros | |
| 432 | - | ``` | |
| 433 | - | ||
| 434 | - | ```elixir | |
| 435 | - | get_and_update_in(users, ["john", :age], &{&1, &1 + 1}) | |
| 436 | - | ``` | |
| 437 | - | ||
| 438 | - | ### Constructing from lists | |
| 439 | - | ||
| 440 | - | ```elixir | |
| 441 | - | Map.new([{:b, 1}, {:a, 2}]) | |
| 442 | - | Map.new([a: 1, b: 2]) | |
| 443 | - | Map.new([:a, :b], fn x -> {x, x} end) # → %{a: :a, b: :b} | |
| 444 | - | ``` | |
| 445 | - | ||
| 446 | - | ### Working with structs | |
| 447 | - | ||
| 448 | - | #### Struct to map | |
| 449 | - | ||
| 450 | - | ```elixir | |
| 451 | - | Map.from_struct(%AnyStruct{a: "b"}) # → %{a: "b"} | |
| 452 | - | ``` | |
| 453 | - | ||
| 454 | - | #### Map to struct | |
| 455 | - | ||
| 456 | - | ```elixir | |
| 457 | - | struct(AnyStruct, %{a: "b"}) # → %AnyStruct{a: "b"} | |
| 458 | - | ``` | |
| 459 | - | ||
| 460 | - | ## List | |
| 461 | - | ||
| 462 | - | ```elixir | |
| 463 | - | import List | |
| 464 | - | ``` | |
| 465 | - | {: .-setup} | |
| 466 | - | ||
| 467 | - | ```elixir | |
| 468 | - | l = [ 1, 2, 3, 4 ] | |
| 469 | - | ``` | |
| 470 | - | {: .-setup} | |
| 471 | - | ||
| 472 | - | ```elixir | |
| 473 | - | l = l ++ [5] # push (append) | |
| 474 | - | l = [ 0 | list ] # unshift (prepend) | |
| 475 | - | ``` | |
| 476 | - | ||
| 477 | - | ```elixir | |
| 478 | - | l |> first() | |
| 479 | - | l |> last() | |
| 480 | - | ``` | |
| 481 | - | ||
| 482 | - | ```elixir | |
| 483 | - | l |> flatten() | |
| 484 | - | l |> flatten(tail) | |
| 485 | - | ``` | |
| 486 | - | ||
| 487 | - | Also see [Enum](#enum). | |
| 488 | - | ||
| 489 | - | ||
| 490 | - | ## Enum | |
| 491 | - | ||
| 492 | - | ### Usage | |
| 493 | - | ||
| 494 | - | ```elixir | |
| 495 | - | import Enum | |
| 496 | - | ``` | |
| 497 | - | {: .-setup} | |
| 498 | - | ||
| 499 | - | ```elixir | |
| 500 | - | list = [:a, :b, :c] | |
| 501 | - | ``` | |
| 502 | - | {: .-setup} | |
| 503 | - | ||
| 504 | - | ```elixir | |
| 505 | - | list |> at(0) # → :a | |
| 506 | - | list |> count() # → 3 | |
| 507 | - | list |> empty?() # → false | |
| 508 | - | list |> any?() # → true | |
| 509 | - | ``` | |
| 510 | - | ||
| 511 | - | ```elixir | |
| 512 | - | list |> concat([:d]) # → [:a, :b, :c, :d] | |
| 513 | - | ``` | |
| 514 | - | ||
| 515 | - | Also, consider streams instead. | |
| 516 | - | ||
| 517 | - | ### Map/reduce | |
| 518 | - | ||
| 519 | - | ```elixir | |
| 520 | - | list |> reduce(fn) | |
| 521 | - | list |> reduce(acc, fn) | |
| 522 | - | list |> map(fn) | |
| 523 | - | list |> reject(fn) | |
| 524 | - | list |> any?(fn) | |
| 525 | - | list |> empty?(fn) | |
| 526 | - | ``` | |
| 527 | - | ||
| 528 | - | ```elixir | |
| 529 | - | [1, 2, 3, 4] | |
| 530 | - | |> Enum.reduce(0, fn(x, acc) -> x + acc end) | |
| 531 | - | ``` | |
| 532 | - | ||
| 533 | - | ## Tuple | |
| 534 | - | ||
| 535 | - | ### Tuples | |
| 536 | - | ||
| 537 | - | ```elixir | |
| 538 | - | import Tuple | |
| 539 | - | ``` | |
| 540 | - | {: .-setup} | |
| 541 | - | ||
| 542 | - | ```elixir | |
| 543 | - | t = { :a, :b } | |
| 544 | - | ``` | |
| 545 | - | ||
| 546 | - | ```elixir | |
| 547 | - | t |> elem(1) # like tuple[1] | |
| 548 | - | t |> put_elem(index, value) | |
| 549 | - | t |> tuple_size() | |
| 550 | - | ``` | |
| 551 | - | ||
| 552 | - | ### Keyword lists | |
| 553 | - | ||
| 554 | - | ```elixir | |
| 555 | - | list = [{ :name, "John" }, { :age, 15 }] | |
| 556 | - | list[:name] | |
| 557 | - | ``` | |
| 558 | - | ||
| 559 | - | ```elixir | |
| 560 | - | # For string-keyed keyword lists | |
| 561 | - | list = [{"size", 2}, {"type", "shoe"}] | |
| 562 | - | List.keyfind(list, "size", 0) # → {"size", 2} | |
| 563 | - | ``` | |
| 564 | - | ||
| 565 | - | ## Functions | |
| 566 | - | ||
| 567 | - | ### Lambdas | |
| 568 | - | ||
| 569 | - | ```elixir | |
| 570 | - | square = fn n -> n*n end | |
| 571 | - | square.(20) | |
| 572 | - | ``` | |
| 573 | - | ||
| 574 | - | ### & syntax | |
| 575 | - | ||
| 576 | - | ```elixir | |
| 577 | - | square = &(&1 * &1) | |
| 578 | - | square.(20) | |
| 579 | - | ||
| 580 | - | square = &Math.square/1 | |
| 581 | - | ``` | |
| 582 | - | ||
| 583 | - | ### Running | |
| 584 | - | ||
| 585 | - | ```elixir | |
| 586 | - | fun.(args) | |
| 587 | - | apply(fun, args) | |
| 588 | - | apply(module, fun, args) | |
| 589 | - | ``` | |
| 590 | - | ||
| 591 | - | ### Function heads | |
| 592 | - | ||
| 593 | - | ```elixir | |
| 594 | - | def join(a, b \\ nil) | |
| 595 | - | def join(a, b) when is_nil(b) do: a | |
| 596 | - | def join(a, b) do: a <> b | |
| 597 | - | ``` | |
| 598 | - | ||
| 599 | - | ## Structs | |
| 600 | - | ||
| 601 | - | ### Structs | |
| 602 | - | ||
| 603 | - | ```elixir | |
| 604 | - | defmodule User do | |
| 605 | - | defstruct name: "", age: nil | |
| 606 | - | end | |
| 607 | - | ||
| 608 | - | %User{name: "John", age: 20} | |
| 609 | - | ||
| 610 | - | %User{}.struct # → User | |
| 611 | - | ``` | |
| 612 | - | ||
| 613 | - | See: [Structs](http://elixir-lang.org/getting-started/structs.html) | |
| 614 | - | ||
| 615 | - | ## Protocols | |
| 616 | - | ||
| 617 | - | ### Defining protocols | |
| 618 | - | ||
| 619 | - | ```elixir | |
| 620 | - | defprotocol Blank do | |
| 621 | - | @doc "Returns true if data is considered blank/empty" | |
| 622 | - | def blank?(data) | |
| 623 | - | end | |
| 624 | - | ``` | |
| 625 | - | ||
| 626 | - | ```elixir | |
| 627 | - | defimpl Blank, for: List do | |
| 628 | - | def blank?([]), do: true | |
| 629 | - | def blank?(_), do: false | |
| 630 | - | end | |
| 631 | - | ||
| 632 | - | Blank.blank?([]) # → true | |
| 633 | - | ``` | |
| 634 | - | ||
| 635 | - | ### Any | |
| 636 | - | ||
| 637 | - | ```elixir | |
| 638 | - | defimpl Blank, for: Any do ... end | |
| 639 | - | ||
| 640 | - | defmodule User do | |
| 641 | - | @derive Blank # Falls back to Any | |
| 642 | - | defstruct name: "" | |
| 643 | - | end | |
| 644 | - | ``` | |
| 645 | - | ||
| 646 | - | ### Examples | |
| 647 | - | ||
| 648 | - | - `Enumerable` and `Enum.map()` | |
| 649 | - | - `Inspect` and `inspect()` | |
| 650 | - | ||
| 651 | - | ## Comprehensions | |
| 652 | - | ||
| 653 | - | ### For | |
| 654 | - | ||
| 655 | - | ```elixir | |
| 656 | - | for n <- [1, 2, 3, 4], do: n * n | |
| 657 | - | for n <- 1..4, do: n * n | |
| 658 | - | ``` | |
| 659 | - | ||
| 660 | - | ```elixir | |
| 661 | - | for {key, val} <- %{a: 10, b: 20}, do: val | |
| 662 | - | # → [10, 20] | |
| 663 | - | ``` | |
| 664 | - | ||
| 665 | - | ```elixir | |
| 666 | - | for {key, val} <- %{a: 10, b: 20}, into: %{}, do: {key, val*val} | |
| 667 | - | ``` | |
| 668 | - | ||
| 669 | - | ### Conditions | |
| 670 | - | ||
| 671 | - | ```elixir | |
| 672 | - | for n <- 1..10, rem(n, 2) == 0, do: n | |
| 673 | - | # → [2, 4, 6, 8, 10] | |
| 674 | - | ``` | |
| 675 | - | ||
| 676 | - | ### Complex | |
| 677 | - | ||
| 678 | - | ```elixir | |
| 679 | - | for dir <- dirs, | |
| 680 | - | file <- File.ls!(dir), # nested comprehension | |
| 681 | - | path = Path.join(dir, file), # invoked | |
| 682 | - | File.regular?(path) do # condition | |
| 683 | - | IO.puts(file) | |
| 684 | - | end | |
| 685 | - | ``` | |
| 686 | - | ||
| 687 | - | ## Misc | |
| 688 | - | ||
| 689 | - | ### Metaprogramming | |
| 690 | - | ||
| 691 | - | ```elixir | |
| 692 | - | __MODULE__ | |
| 693 | - | __MODULE__.__info__ | |
| 694 | - | ||
| 695 | - | @after_compile __MODULE__ | |
| 696 | - | def __before_compile__(env) | |
| 697 | - | def __after_compile__(env, _bytecode) | |
| 698 | - | def __using__(opts) # invoked on `use` | |
| 699 | - | ||
| 700 | - | @on_definition {__MODULE__, :on_def} | |
| 701 | - | def on_def(_env, kind, name, args, guards, body) | |
| 702 | - | ||
| 703 | - | @on_load :load_check | |
| 704 | - | def load_check | |
| 705 | - | ``` | |
| 706 | - | ||
| 707 | - | ### Regexp | |
| 708 | - | ||
| 709 | - | ```elixir | |
| 710 | - | exp = ~r/hello/ | |
| 711 | - | exp = ~r/hello/i | |
| 712 | - | "hello world" =~ exp | |
| 713 | - | ``` | |
| 714 | - | ||
| 715 | - | ### Sigils | |
| 716 | - | ||
| 717 | - | ```elixir | |
| 718 | - | ~r/regexp/ | |
| 719 | - | ~w(list of strings) | |
| 720 | - | ~s|strings with #{interpolation} and \x20 escape codes| | |
| 721 | - | ~S|no interpolation and no escapes| | |
| 722 | - | ~c(charlist) | |
| 723 | - | ``` | |
| 724 | - | ||
| 725 | - | Allowed chars: `/` `|` `"` `'` `(` `[` `{` `<` `"""`. | |
| 726 | - | See: [Sigils](http://elixir-lang.org/getting-started/sigils.html) | |
| 727 | - | ||
| 728 | - | ### Type specs | |
| 729 | - | ||
| 730 | - | ```elixir | |
| 731 | - | @spec round(number) :: integer | |
| 732 | - | ||
| 733 | - | @type number_with_remark :: {number, String.t} | |
| 734 | - | @spec add(number, number) :: number_with_remark | |
| 735 | - | ``` | |
| 736 | - | ||
| 737 | - | Useful for [dialyzer](http://www.erlang.org/doc/man/dialyzer.html). | |
| 738 | - | See: [Typespecs](http://elixir-lang.org/getting-started/typespecs-and-behaviours.html) | |
| 739 | - | ||
| 740 | - | ### Behaviours | |
| 741 | - | ||
| 742 | - | ```elixir | |
| 743 | - | defmodule Parser do | |
| 744 | - | @callback parse(String.t) :: any | |
| 745 | - | @callback extensions() :: [String.t] | |
| 746 | - | end | |
| 747 | - | ``` | |
| 748 | - | ||
| 749 | - | ```elixir | |
| 750 | - | defmodule JSONParser do | |
| 751 | - | @behaviour Parser | |
| 752 | - | ||
| 753 | - | def parse(str), do: # ... parse JSON | |
| 754 | - | def extensions, do: ["json"] | |
| 755 | - | end | |
| 756 | - | ``` | |
| 757 | - | ||
| 758 | - | See: [Module](http://elixir-lang.org/docs/stable/elixir/Module.html) | |
| 759 | - | ||
| 760 | - | ## References | |
| 761 | - | {: .-one-column} | |
| 762 | - | ||
| 763 | - | - [Learn Elixir in Y minutes](https://learnxinyminutes.com/docs/elixir/) | |
| 764 | - | ||
| 765 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 766 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,582 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: ES2015+ | |
| 3 | - | category: JavaScript | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | tags: [Featured] | |
| 6 | - | updated: 2019-11-14 | |
| 7 | - | weight: -10 | |
| 8 | - | intro: | | |
| 9 | - | A quick overview of new JavaScript features in ES2015, ES2016, ES2017, ES2018 and beyond. | |
| 10 | - | --- | |
| 11 | - | ||
| 12 | - | ### Block scoping | |
| 13 | - | ||
| 14 | - | #### Let | |
| 15 | - | ||
| 16 | - | ```js | |
| 17 | - | function fn () { | |
| 18 | - | let x = 0 | |
| 19 | - | if (true) { | |
| 20 | - | let x = 1 // only inside this `if` | |
| 21 | - | } | |
| 22 | - | } | |
| 23 | - | ``` | |
| 24 | - | {: data-line="2,4"} | |
| 25 | - | ||
| 26 | - | #### Const | |
| 27 | - | ||
| 28 | - | ```js | |
| 29 | - | const a = 1 | |
| 30 | - | ``` | |
| 31 | - | ||
| 32 | - | `let` is the new `var`. Constants work just like `let`, but can't be reassigned. | |
| 33 | - | See: [Let and const](https://babeljs.io/learn-es2015/#let--const) | |
| 34 | - | ||
| 35 | - | ### Backtick strings | |
| 36 | - | ||
| 37 | - | #### Interpolation | |
| 38 | - | ||
| 39 | - | ```js | |
| 40 | - | const message = `Hello ${name}` | |
| 41 | - | ``` | |
| 42 | - | ||
| 43 | - | #### Multiline strings | |
| 44 | - | ||
| 45 | - | ```js | |
| 46 | - | const str = ` | |
| 47 | - | hello | |
| 48 | - | world | |
| 49 | - | ` | |
| 50 | - | ``` | |
| 51 | - | ||
| 52 | - | Templates and multiline strings. | |
| 53 | - | See: [Template strings](https://babeljs.io/learn-es2015/#template-strings) | |
| 54 | - | ||
| 55 | - | ### Binary and octal literals | |
| 56 | - | ||
| 57 | - | ```js | |
| 58 | - | let bin = 0b1010010 | |
| 59 | - | let oct = 0o755 | |
| 60 | - | ``` | |
| 61 | - | ||
| 62 | - | See: [Binary and octal literals](https://babeljs.io/learn-es2015/#binary-and-octal-literals) | |
| 63 | - | ||
| 64 | - | ### New methods | |
| 65 | - | ||
| 66 | - | #### New string methods | |
| 67 | - | ||
| 68 | - | ```js | |
| 69 | - | "hello".repeat(3) | |
| 70 | - | "hello".includes("ll") | |
| 71 | - | "hello".startsWith("he") | |
| 72 | - | "hello".padStart(8) // " hello" | |
| 73 | - | "hello".padEnd(8) // "hello " | |
| 74 | - | "hello".padEnd(8, '!') // hello!!! | |
| 75 | - | "\u1E9B\u0323".normalize("NFC") | |
| 76 | - | ``` | |
| 77 | - | ||
| 78 | - | See: [New methods](https://babeljs.io/learn-es2015/#math--number--string--object-apis) | |
| 79 | - | ||
| 80 | - | ### Classes | |
| 81 | - | ||
| 82 | - | ```js | |
| 83 | - | class Circle extends Shape { | |
| 84 | - | ``` | |
| 85 | - | ||
| 86 | - | #### Constructor | |
| 87 | - | ||
| 88 | - | ```js | |
| 89 | - | constructor (radius) { | |
| 90 | - | this.radius = radius | |
| 91 | - | } | |
| 92 | - | ``` | |
| 93 | - | {: data-line="1"} | |
| 94 | - | ||
| 95 | - | #### Methods | |
| 96 | - | ||
| 97 | - | ```js | |
| 98 | - | getArea () { | |
| 99 | - | return Math.PI * 2 * this.radius | |
| 100 | - | } | |
| 101 | - | ``` | |
| 102 | - | {: data-line="1"} | |
| 103 | - | ||
| 104 | - | #### Calling superclass methods | |
| 105 | - | ||
| 106 | - | ```js | |
| 107 | - | expand (n) { | |
| 108 | - | return super.expand(n) * Math.PI | |
| 109 | - | } | |
| 110 | - | ``` | |
| 111 | - | {: data-line="2"} | |
| 112 | - | ||
| 113 | - | #### Static methods | |
| 114 | - | ||
| 115 | - | ```js | |
| 116 | - | static createFromDiameter(diameter) { | |
| 117 | - | return new Circle(diameter / 2) | |
| 118 | - | } | |
| 119 | - | } | |
| 120 | - | ``` | |
| 121 | - | {: data-line="1"} | |
| 122 | - | ||
| 123 | - | Syntactic sugar for prototypes. | |
| 124 | - | See: [Classes](https://babeljs.io/learn-es2015/#classes) | |
| 125 | - | ||
| 126 | - | ### Exponent operator | |
| 127 | - | ||
| 128 | - | ```js | |
| 129 | - | const byte = 2 ** 8 | |
| 130 | - | // Same as: Math.pow(2, 8) | |
| 131 | - | ``` | |
| 132 | - | {: data-line="1"} | |
| 133 | - | ||
| 134 | - | Promises | |
| 135 | - | -------- | |
| 136 | - | {: .-three-column} | |
| 137 | - | ||
| 138 | - | ### Making promises | |
| 139 | - | ||
| 140 | - | ```js | |
| 141 | - | new Promise((resolve, reject) => { | |
| 142 | - | if (ok) { resolve(result) } | |
| 143 | - | else { reject(error) } | |
| 144 | - | }) | |
| 145 | - | ``` | |
| 146 | - | {: data-line="1"} | |
| 147 | - | ||
| 148 | - | For asynchronous programming. | |
| 149 | - | See: [Promises](https://babeljs.io/learn-es2015/#promises) | |
| 150 | - | ||
| 151 | - | ### Using promises | |
| 152 | - | ||
| 153 | - | ```js | |
| 154 | - | promise | |
| 155 | - | .then((result) => { ··· }) | |
| 156 | - | .catch((error) => { ··· }) | |
| 157 | - | ``` | |
| 158 | - | {: data-line="2,3"} | |
| 159 | - | ||
| 160 | - | ||
| 161 | - | ### Using promises with finally | |
| 162 | - | ||
| 163 | - | ```js | |
| 164 | - | promise | |
| 165 | - | .then((result) => { ··· }) | |
| 166 | - | .catch((error) => { ··· }) | |
| 167 | - | .finally(() => { // logic independent of success/error }) | |
| 168 | - | ``` | |
| 169 | - | {: data-line="4"} | |
| 170 | - | ||
| 171 | - | The handler is called when the promise is fulfilled or rejected. | |
| 172 | - | ||
| 173 | - | ||
| 174 | - | ### Promise functions | |
| 175 | - | ||
| 176 | - | ```js | |
| 177 | - | Promise.all(···) | |
| 178 | - | Promise.race(···) | |
| 179 | - | Promise.reject(···) | |
| 180 | - | Promise.resolve(···) | |
| 181 | - | ``` | |
| 182 | - | ||
| 183 | - | ### Async-await | |
| 184 | - | ||
| 185 | - | ```js | |
| 186 | - | async function run () { | |
| 187 | - | const user = await getUser() | |
| 188 | - | const tweets = await getTweets(user) | |
| 189 | - | return [user, tweets] | |
| 190 | - | } | |
| 191 | - | ``` | |
| 192 | - | {: data-line="2,3"} | |
| 193 | - | ||
| 194 | - | `async` functions are another way of using functions. | |
| 195 | - | ||
| 196 | - | See: [async function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) | |
| 197 | - | ||
| 198 | - | Destructuring | |
| 199 | - | ------------- | |
| 200 | - | {: .-three-column} | |
| 201 | - | ||
| 202 | - | ### Destructuring assignment | |
| 203 | - | ||
| 204 | - | #### Arrays | |
| 205 | - | ||
| 206 | - | ```js | |
| 207 | - | const [first, last] = ['Nikola', 'Tesla'] | |
| 208 | - | ``` | |
| 209 | - | {: data-line="1"} | |
| 210 | - | ||
| 211 | - | #### Objects | |
| 212 | - | ||
| 213 | - | ```js | |
| 214 | - | let {title, author} = { | |
| 215 | - | title: 'The Silkworm', | |
| 216 | - | author: 'R. Galbraith' | |
| 217 | - | } | |
| 218 | - | ``` | |
| 219 | - | {: data-line="1"} | |
| 220 | - | ||
| 221 | - | Supports for matching arrays and objects. | |
| 222 | - | See: [Destructuring](https://babeljs.io/learn-es2015/#destructuring) | |
| 223 | - | ||
| 224 | - | ### Default values | |
| 225 | - | ||
| 226 | - | ```js | |
| 227 | - | const scores = [22, 33] | |
| 228 | - | const [math = 50, sci = 50, arts = 50] = scores | |
| 229 | - | ``` | |
| 230 | - | ||
| 231 | - | ```js | |
| 232 | - | // Result: | |
| 233 | - | // math === 22, sci === 33, arts === 50 | |
| 234 | - | ``` | |
| 235 | - | ||
| 236 | - | Default values can be assigned while destructuring arrays or objects. | |
| 237 | - | ||
| 238 | - | ### Function arguments | |
| 239 | - | ||
| 240 | - | ```js | |
| 241 | - | function greet({ name, greeting }) { | |
| 242 | - | console.log(`${greeting}, ${name}!`) | |
| 243 | - | } | |
| 244 | - | ``` | |
| 245 | - | {: data-line="1"} | |
| 246 | - | ||
| 247 | - | ```js | |
| 248 | - | greet({ name: 'Larry', greeting: 'Ahoy' }) | |
| 249 | - | ``` | |
| 250 | - | ||
| 251 | - | Destructuring of objects and arrays can also be done in function arguments. | |
| 252 | - | ||
| 253 | - | ### Default values | |
| 254 | - | ||
| 255 | - | ```js | |
| 256 | - | function greet({ name = 'Rauno' } = {}) { | |
| 257 | - | console.log(`Hi ${name}!`); | |
| 258 | - | } | |
| 259 | - | ``` | |
| 260 | - | {: data-line="1"} | |
| 261 | - | ||
| 262 | - | ```js | |
| 263 | - | greet() // Hi Rauno! | |
| 264 | - | greet({ name: 'Larry' }) // Hi Larry! | |
| 265 | - | ``` | |
| 266 | - | ||
| 267 | - | ### Reassigning keys | |
| 268 | - | ||
| 269 | - | ```js | |
| 270 | - | function printCoordinates({ left: x, top: y }) { | |
| 271 | - | console.log(`x: ${x}, y: ${y}`) | |
| 272 | - | } | |
| 273 | - | ``` | |
| 274 | - | {: data-line="1"} | |
| 275 | - | ||
| 276 | - | ```js | |
| 277 | - | printCoordinates({ left: 25, top: 90 }) | |
| 278 | - | ``` | |
| 279 | - | ||
| 280 | - | This example assigns `x` to the value of the `left` key. | |
| 281 | - | ||
| 282 | - | ### Loops | |
| 283 | - | ||
| 284 | - | ```js | |
| 285 | - | for (let {title, artist} of songs) { | |
| 286 | - | ··· | |
| 287 | - | } | |
| 288 | - | ``` | |
| 289 | - | {: data-line="1"} | |
| 290 | - | ||
| 291 | - | The assignment expressions work in loops, too. | |
| 292 | - | ||
| 293 | - | ||
| 294 | - | ### Object destructuring | |
| 295 | - | ||
| 296 | - | ```js | |
| 297 | - | const { id, ...detail } = song; | |
| 298 | - | ``` | |
| 299 | - | {: data-line="1"} | |
| 300 | - | ||
| 301 | - | Extract some keys individually and remaining keys in the object using rest (...) operator | |
| 302 | - | ||
| 303 | - | ||
| 304 | - | Spread | |
| 305 | - | ------ | |
| 306 | - | ||
| 307 | - | ### Object spread | |
| 308 | - | ||
| 309 | - | #### with Object spread | |
| 310 | - | ||
| 311 | - | ```js | |
| 312 | - | const options = { | |
| 313 | - | ...defaults, | |
| 314 | - | visible: true | |
| 315 | - | } | |
| 316 | - | ``` | |
| 317 | - | {: data-line="2"} | |
| 318 | - | ||
| 319 | - | #### without Object spread | |
| 320 | - | ||
| 321 | - | ```js | |
| 322 | - | const options = Object.assign( | |
| 323 | - | {}, defaults, | |
| 324 | - | { visible: true }) | |
| 325 | - | ``` | |
| 326 | - | ||
| 327 | - | The Object spread operator lets you build new objects from other objects. | |
| 328 | - | ||
| 329 | - | See: [Object spread](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator) | |
| 330 | - | ||
| 331 | - | ### Array spread | |
| 332 | - | ||
| 333 | - | #### with Array spread | |
| 334 | - | ||
| 335 | - | ```js | |
| 336 | - | const users = [ | |
| 337 | - | ...admins, | |
| 338 | - | ...editors, | |
| 339 | - | 'rstacruz' | |
| 340 | - | ] | |
| 341 | - | ``` | |
| 342 | - | {: data-line="2,3"} | |
| 343 | - | ||
| 344 | - | #### without Array spread | |
| 345 | - | ||
| 346 | - | ```js | |
| 347 | - | const users = admins | |
| 348 | - | .concat(editors) | |
| 349 | - | .concat([ 'rstacruz' ]) | |
| 350 | - | ``` | |
| 351 | - | ||
| 352 | - | The spread operator lets you build new arrays in the same way. | |
| 353 | - | ||
| 354 | - | See: [Spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator) | |
| 355 | - | ||
| 356 | - | Functions | |
| 357 | - | --------- | |
| 358 | - | ||
| 359 | - | ### Function arguments | |
| 360 | - | ||
| 361 | - | #### Default arguments | |
| 362 | - | ||
| 363 | - | ```js | |
| 364 | - | function greet (name = 'Jerry') { | |
| 365 | - | return `Hello ${name}` | |
| 366 | - | } | |
| 367 | - | ``` | |
| 368 | - | {: data-line="1"} | |
| 369 | - | ||
| 370 | - | #### Rest arguments | |
| 371 | - | ||
| 372 | - | ```js | |
| 373 | - | function fn(x, ...y) { | |
| 374 | - | // y is an Array | |
| 375 | - | return x * y.length | |
| 376 | - | } | |
| 377 | - | ``` | |
| 378 | - | {: data-line="1"} | |
| 379 | - | ||
| 380 | - | #### Spread | |
| 381 | - | ||
| 382 | - | ```js | |
| 383 | - | fn(...[1, 2, 3]) | |
| 384 | - | // same as fn(1, 2, 3) | |
| 385 | - | ``` | |
| 386 | - | {: data-line="1"} | |
| 387 | - | ||
| 388 | - | Default, rest, spread. | |
| 389 | - | See: [Function arguments](https://babeljs.io/learn-es2015/#default--rest--spread) | |
| 390 | - | ||
| 391 | - | ### Fat arrows | |
| 392 | - | ||
| 393 | - | #### Fat arrows | |
| 394 | - | ||
| 395 | - | ```js | |
| 396 | - | setTimeout(() => { | |
| 397 | - | ··· | |
| 398 | - | }) | |
| 399 | - | ``` | |
| 400 | - | {: data-line="1"} | |
| 401 | - | ||
| 402 | - | #### With arguments | |
| 403 | - | ||
| 404 | - | ```js | |
| 405 | - | readFile('text.txt', (err, data) => { | |
| 406 | - | ... | |
| 407 | - | }) | |
| 408 | - | ``` | |
| 409 | - | {: data-line="1"} | |
| 410 | - | ||
| 411 | - | #### Implicit return | |
| 412 | - | ```js | |
| 413 | - | numbers.map(n => n * 2) | |
| 414 | - | // No curly braces = implicit return | |
| 415 | - | // Same as: numbers.map(function (n) { return n * 2 }) | |
| 416 | - | numbers.map(n => ({ | |
| 417 | - | result: n * 2 | |
| 418 | - | })) | |
| 419 | - | // Implicitly returning objects requires parentheses around the object | |
| 420 | - | ``` | |
| 421 | - | {: data-line="1,4,5,6"} | |
| 422 | - | ||
| 423 | - | Like functions but with `this` preserved. | |
| 424 | - | See: [Fat arrows](https://babeljs.io/learn-es2015/#arrows-and-lexical-this) | |
| 425 | - | ||
| 426 | - | Objects | |
| 427 | - | ------- | |
| 428 | - | ||
| 429 | - | ### Shorthand syntax | |
| 430 | - | ||
| 431 | - | ```js | |
| 432 | - | module.exports = { hello, bye } | |
| 433 | - | // Same as: module.exports = { hello: hello, bye: bye } | |
| 434 | - | ``` | |
| 435 | - | ||
| 436 | - | See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals) | |
| 437 | - | ||
| 438 | - | ### Methods | |
| 439 | - | ||
| 440 | - | ```js | |
| 441 | - | const App = { | |
| 442 | - | start () { | |
| 443 | - | console.log('running') | |
| 444 | - | } | |
| 445 | - | } | |
| 446 | - | // Same as: App = { start: function () {···} } | |
| 447 | - | ``` | |
| 448 | - | {: data-line="2"} | |
| 449 | - | ||
| 450 | - | See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals) | |
| 451 | - | ||
| 452 | - | ### Getters and setters | |
| 453 | - | ||
| 454 | - | ```js | |
| 455 | - | const App = { | |
| 456 | - | get closed () { | |
| 457 | - | return this.status === 'closed' | |
| 458 | - | }, | |
| 459 | - | set closed (value) { | |
| 460 | - | this.status = value ? 'closed' : 'open' | |
| 461 | - | } | |
| 462 | - | } | |
| 463 | - | ``` | |
| 464 | - | {: data-line="2,5"} | |
| 465 | - | ||
| 466 | - | See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals) | |
| 467 | - | ||
| 468 | - | ### Computed property names | |
| 469 | - | ||
| 470 | - | ```js | |
| 471 | - | let event = 'click' | |
| 472 | - | let handlers = { | |
| 473 | - | [`on${event}`]: true | |
| 474 | - | } | |
| 475 | - | // Same as: handlers = { 'onclick': true } | |
| 476 | - | ``` | |
| 477 | - | {: data-line="3"} | |
| 478 | - | ||
| 479 | - | See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals) | |
| 480 | - | ||
| 481 | - | ||
| 482 | - | ### Extract values | |
| 483 | - | ||
| 484 | - | ```js | |
| 485 | - | const fatherJS = { age: 57, name: "Brendan Eich" } | |
| 486 | - | ||
| 487 | - | Object.values(fatherJS) | |
| 488 | - | // [57, "Brendan Eich"] | |
| 489 | - | Object.entries(fatherJS) | |
| 490 | - | // [["age", 57], ["name", "Brendan Eich"]] | |
| 491 | - | ``` | |
| 492 | - | {: data-line="3,5"} | |
| 493 | - | ||
| 494 | - | ||
| 495 | - | Modules | |
| 496 | - | ------- | |
| 497 | - | ||
| 498 | - | ### Imports | |
| 499 | - | ||
| 500 | - | ```js | |
| 501 | - | import 'helpers' | |
| 502 | - | // aka: require('···') | |
| 503 | - | ``` | |
| 504 | - | ||
| 505 | - | ```js | |
| 506 | - | import Express from 'express' | |
| 507 | - | // aka: const Express = require('···').default || require('···') | |
| 508 | - | ``` | |
| 509 | - | ||
| 510 | - | ```js | |
| 511 | - | import { indent } from 'helpers' | |
| 512 | - | // aka: const indent = require('···').indent | |
| 513 | - | ``` | |
| 514 | - | ||
| 515 | - | ```js | |
| 516 | - | import * as Helpers from 'helpers' | |
| 517 | - | // aka: const Helpers = require('···') | |
| 518 | - | ``` | |
| 519 | - | ||
| 520 | - | ```js | |
| 521 | - | import { indentSpaces as indent } from 'helpers' | |
| 522 | - | // aka: const indent = require('···').indentSpaces | |
| 523 | - | ``` | |
| 524 | - | ||
| 525 | - | `import` is the new `require()`. | |
| 526 | - | See: [Module imports](https://babeljs.io/learn-es2015/#modules) | |
| 527 | - | ||
| 528 | - | ### Exports | |
| 529 | - | ||
| 530 | - | ```js | |
| 531 | - | export default function () { ··· } | |
| 532 | - | // aka: module.exports.default = ··· | |
| 533 | - | ``` | |
| 534 | - | ||
| 535 | - | ```js | |
| 536 | - | export function mymethod () { ··· } | |
| 537 | - | // aka: module.exports.mymethod = ··· | |
| 538 | - | ``` | |
| 539 | - | ||
| 540 | - | ```js | |
| 541 | - | export const pi = 3.14159 | |
| 542 | - | // aka: module.exports.pi = ··· | |
| 543 | - | ``` | |
| 544 | - | ||
| 545 | - | `export` is the new `module.exports`. | |
| 546 | - | See: [Module exports](https://babeljs.io/learn-es2015/#modules) | |
| 547 | - | ||
| 548 | - | Generators | |
| 549 | - | ---------- | |
| 550 | - | ||
| 551 | - | ### Generators | |
| 552 | - | ||
| 553 | - | ```js | |
| 554 | - | function* idMaker () { | |
| 555 | - | let id = 0 | |
| 556 | - | while (true) { yield id++ } | |
| 557 | - | } | |
| 558 | - | ``` | |
| 559 | - | ||
| 560 | - | ```js | |
| 561 | - | let gen = idMaker() | |
| 562 | - | gen.next().value // → 0 | |
| 563 | - | gen.next().value // → 1 | |
| 564 | - | gen.next().value // → 2 | |
| 565 | - | ``` | |
| 566 | - | ||
| 567 | - | It's complicated. | |
| 568 | - | See: [Generators](https://babeljs.io/learn-es2015/#generators) | |
| 569 | - | ||
| 570 | - | ### For..of iteration | |
| 571 | - | ||
| 572 | - | ```js | |
| 573 | - | for (let i of iterable) { | |
| 574 | - | ··· | |
| 575 | - | } | |
| 576 | - | ``` | |
| 577 | - | ||
| 578 | - | For iterating through generators and arrays. | |
| 579 | - | See: [For..of iteration](https://babeljs.io/learn-es2015/#iterators--forof) | |
| 580 | - | ||
| 581 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 582 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,658 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Go | |
| 3 | - | layout: 2017/sheet | |
| 4 | - | prism_languages: [go, bash] | |
| 5 | - | weight: -3 | |
| 6 | - | tags: [Featured] | |
| 7 | - | category: C-like | |
| 8 | - | updated: 2020-06-21 | |
| 9 | - | --- | |
| 10 | - | ||
| 11 | - | ## Getting started | |
| 12 | - | {: .-three-column} | |
| 13 | - | ||
| 14 | - | ### Introduction | |
| 15 | - | {: .-intro} | |
| 16 | - | ||
| 17 | - | - [A tour of Go](https://tour.golang.org/welcome/1) _(tour.golang.org)_ | |
| 18 | - | - [Go repl](https://repl.it/languages/go) _(repl.it)_ | |
| 19 | - | - [Golang wiki](https://github.com/golang/go/wiki/) _(github.com)_ | |
| 20 | - | ||
| 21 | - | ### Hello world | |
| 22 | - | {: .-prime} | |
| 23 | - | ||
| 24 | - | #### hello.go | |
| 25 | - | {: .-file} | |
| 26 | - | ||
| 27 | - | ```go | |
| 28 | - | package main | |
| 29 | - | ||
| 30 | - | import "fmt" | |
| 31 | - | ||
| 32 | - | func main() { | |
| 33 | - | message := greetMe("world") | |
| 34 | - | fmt.Println(message) | |
| 35 | - | } | |
| 36 | - | ||
| 37 | - | func greetMe(name string) string { | |
| 38 | - | return "Hello, " + name + "!" | |
| 39 | - | } | |
| 40 | - | ``` | |
| 41 | - | ||
| 42 | - | ```bash | |
| 43 | - | $ go build | |
| 44 | - | ``` | |
| 45 | - | ||
| 46 | - | Or try it out in the [Go repl](https://repl.it/languages/go), or [A Tour of Go](https://tour.golang.org/welcome/1). | |
| 47 | - | ||
| 48 | - | ### Variables | |
| 49 | - | ||
| 50 | - | #### Variable declaration | |
| 51 | - | ||
| 52 | - | ```go | |
| 53 | - | var msg string | |
| 54 | - | msg = "Hello" | |
| 55 | - | ``` | |
| 56 | - | ||
| 57 | - | #### Shortcut of above (Infers type) | |
| 58 | - | ||
| 59 | - | ```go | |
| 60 | - | msg := "Hello" | |
| 61 | - | ``` | |
| 62 | - | ||
| 63 | - | ### Constants | |
| 64 | - | ||
| 65 | - | ```go | |
| 66 | - | const Phi = 1.618 | |
| 67 | - | ``` | |
| 68 | - | ||
| 69 | - | Constants can be character, string, boolean, or numeric values. | |
| 70 | - | ||
| 71 | - | See: [Constants](https://tour.golang.org/basics/15) | |
| 72 | - | ||
| 73 | - | ## Basic types | |
| 74 | - | {: .-three-column} | |
| 75 | - | ||
| 76 | - | ### Strings | |
| 77 | - | ||
| 78 | - | ```go | |
| 79 | - | str := "Hello" | |
| 80 | - | ``` | |
| 81 | - | ||
| 82 | - | ```go | |
| 83 | - | str := `Multiline | |
| 84 | - | string` | |
| 85 | - | ``` | |
| 86 | - | ||
| 87 | - | Strings are of type `string`. | |
| 88 | - | ||
| 89 | - | ### Numbers | |
| 90 | - | ||
| 91 | - | #### Typical types | |
| 92 | - | ||
| 93 | - | ```go | |
| 94 | - | num := 3 // int | |
| 95 | - | num := 3. // float64 | |
| 96 | - | num := 3 + 4i // complex128 | |
| 97 | - | num := byte('a') // byte (alias for uint8) | |
| 98 | - | ``` | |
| 99 | - | ||
| 100 | - | #### Other types | |
| 101 | - | ||
| 102 | - | ```go | |
| 103 | - | var u uint = 7 // uint (unsigned) | |
| 104 | - | var p float32 = 22.7 // 32-bit float | |
| 105 | - | ``` | |
| 106 | - | ||
| 107 | - | ### Arrays | |
| 108 | - | ||
| 109 | - | ```go | |
| 110 | - | // var numbers [5]int | |
| 111 | - | numbers := [...]int{0, 0, 0, 0, 0} | |
| 112 | - | ``` | |
| 113 | - | ||
| 114 | - | Arrays have a fixed size. | |
| 115 | - | ||
| 116 | - | ### Slices | |
| 117 | - | ||
| 118 | - | ```go | |
| 119 | - | slice := []int{2, 3, 4} | |
| 120 | - | ``` | |
| 121 | - | ||
| 122 | - | ```go | |
| 123 | - | slice := []byte("Hello") | |
| 124 | - | ``` | |
| 125 | - | ||
| 126 | - | Slices have a dynamic size, unlike arrays. | |
| 127 | - | ||
| 128 | - | ### Pointers | |
| 129 | - | ||
| 130 | - | ```go | |
| 131 | - | func main () { | |
| 132 | - | b := *getPointer() | |
| 133 | - | fmt.Println("Value is", b) | |
| 134 | - | } | |
| 135 | - | ``` | |
| 136 | - | {: data-line="2"} | |
| 137 | - | ||
| 138 | - | ```go | |
| 139 | - | func getPointer () (myPointer *int) { | |
| 140 | - | a := 234 | |
| 141 | - | return &a | |
| 142 | - | } | |
| 143 | - | ``` | |
| 144 | - | {: data-line="3"} | |
| 145 | - | ||
| 146 | - | ```go | |
| 147 | - | a := new(int) | |
| 148 | - | *a = 234 | |
| 149 | - | ``` | |
| 150 | - | {: data-line="2"} | |
| 151 | - | ||
| 152 | - | Pointers point to a memory location of a variable. Go is fully garbage-collected. | |
| 153 | - | ||
| 154 | - | See: [Pointers](https://tour.golang.org/moretypes/1) | |
| 155 | - | ||
| 156 | - | ### Type conversions | |
| 157 | - | ||
| 158 | - | ```go | |
| 159 | - | i := 2 | |
| 160 | - | f := float64(i) | |
| 161 | - | u := uint(i) | |
| 162 | - | ``` | |
| 163 | - | ||
| 164 | - | See: [Type conversions](https://tour.golang.org/basics/13) | |
| 165 | - | ||
| 166 | - | ## Flow control | |
| 167 | - | {: .-three-column} | |
| 168 | - | ||
| 169 | - | ### Conditional | |
| 170 | - | ||
| 171 | - | ```go | |
| 172 | - | if day == "sunday" || day == "saturday" { | |
| 173 | - | rest() | |
| 174 | - | } else if day == "monday" && isTired() { | |
| 175 | - | groan() | |
| 176 | - | } else { | |
| 177 | - | work() | |
| 178 | - | } | |
| 179 | - | ``` | |
| 180 | - | {: data-line="1,3,5"} | |
| 181 | - | ||
| 182 | - | See: [If](https://tour.golang.org/flowcontrol/5) | |
| 183 | - | ||
| 184 | - | ### Statements in if | |
| 185 | - | ||
| 186 | - | ```go | |
| 187 | - | if _, err := doThing(); err != nil { | |
| 188 | - | fmt.Println("Uh oh") | |
| 189 | - | } | |
| 190 | - | ``` | |
| 191 | - | {: data-line="1"} | |
| 192 | - | ||
| 193 | - | 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`. | |
| 194 | - | ||
| 195 | - | See: [If with a short statement](https://tour.golang.org/flowcontrol/6) | |
| 196 | - | ||
| 197 | - | ### Switch | |
| 198 | - | ||
| 199 | - | ```go | |
| 200 | - | switch day { | |
| 201 | - | case "sunday": | |
| 202 | - | // cases don't "fall through" by default! | |
| 203 | - | fallthrough | |
| 204 | - | ||
| 205 | - | case "saturday": | |
| 206 | - | rest() | |
| 207 | - | ||
| 208 | - | default: | |
| 209 | - | work() | |
| 210 | - | } | |
| 211 | - | ``` | |
| 212 | - | ||
| 213 | - | See: [Switch](https://github.com/golang/go/wiki/Switch) | |
| 214 | - | ||
| 215 | - | ### For loop | |
| 216 | - | ||
| 217 | - | ```go | |
| 218 | - | for count := 0; count <= 10; count++ { | |
| 219 | - | fmt.Println("My counter is at", count) | |
| 220 | - | } | |
| 221 | - | ``` | |
| 222 | - | ||
| 223 | - | See: [For loops](https://tour.golang.org/flowcontrol/1) | |
| 224 | - | ||
| 225 | - | ### For-Range loop | |
| 226 | - | ||
| 227 | - | ```go | |
| 228 | - | entry := []string{"Jack","John","Jones"} | |
| 229 | - | for i, val := range entry { | |
| 230 | - | fmt.Printf("At position %d, the character %s is present\n", i, val) | |
| 231 | - | } | |
| 232 | - | ``` | |
| 233 | - | ||
| 234 | - | See: [For-Range loops](https://gobyexample.com/range) | |
| 235 | - | ||
| 236 | - | ### While loop | |
| 237 | - | ||
| 238 | - | ```go | |
| 239 | - | n := 0 | |
| 240 | - | x := 42 | |
| 241 | - | for n != x { | |
| 242 | - | n := guess() | |
| 243 | - | } | |
| 244 | - | ``` | |
| 245 | - | ||
| 246 | - | See: [Go's "while"](https://tour.golang.org/flowcontrol/3) | |
| 247 | - | ||
| 248 | - | ## Functions | |
| 249 | - | {: .-three-column} | |
| 250 | - | ||
| 251 | - | ### Lambdas | |
| 252 | - | ||
| 253 | - | ```go | |
| 254 | - | myfunc := func() bool { | |
| 255 | - | return x > 10000 | |
| 256 | - | } | |
| 257 | - | ``` | |
| 258 | - | {: data-line="1"} | |
| 259 | - | ||
| 260 | - | Functions are first class objects. | |
| 261 | - | ||
| 262 | - | ### Multiple return types | |
| 263 | - | ||
| 264 | - | ```go | |
| 265 | - | a, b := getMessage() | |
| 266 | - | ``` | |
| 267 | - | ||
| 268 | - | ```go | |
| 269 | - | func getMessage() (a string, b string) { | |
| 270 | - | return "Hello", "World" | |
| 271 | - | } | |
| 272 | - | ``` | |
| 273 | - | {: data-line="2"} | |
| 274 | - | ||
| 275 | - | ||
| 276 | - | ### Named return values | |
| 277 | - | ||
| 278 | - | ```go | |
| 279 | - | func split(sum int) (x, y int) { | |
| 280 | - | x = sum * 4 / 9 | |
| 281 | - | y = sum - x | |
| 282 | - | return | |
| 283 | - | } | |
| 284 | - | ``` | |
| 285 | - | {: data-line="4"} | |
| 286 | - | ||
| 287 | - | By defining the return value names in the signature, a `return` (no args) will return variables with those names. | |
| 288 | - | ||
| 289 | - | See: [Named return values](https://tour.golang.org/basics/7) | |
| 290 | - | ||
| 291 | - | ## Packages | |
| 292 | - | {: .-three-column} | |
| 293 | - | ||
| 294 | - | ### Importing | |
| 295 | - | ||
| 296 | - | ```go | |
| 297 | - | import "fmt" | |
| 298 | - | import "math/rand" | |
| 299 | - | ``` | |
| 300 | - | ||
| 301 | - | ```go | |
| 302 | - | import ( | |
| 303 | - | "fmt" // gives fmt.Println | |
| 304 | - | "math/rand" // gives rand.Intn | |
| 305 | - | ) | |
| 306 | - | ``` | |
| 307 | - | ||
| 308 | - | Both are the same. | |
| 309 | - | ||
| 310 | - | See: [Importing](https://tour.golang.org/basics/1) | |
| 311 | - | ||
| 312 | - | ### Aliases | |
| 313 | - | ||
| 314 | - | ```go | |
| 315 | - | import r "math/rand" | |
| 316 | - | ``` | |
| 317 | - | {: data-line="1"} | |
| 318 | - | ||
| 319 | - | ```go | |
| 320 | - | r.Intn() | |
| 321 | - | ``` | |
| 322 | - | ||
| 323 | - | ### Exporting names | |
| 324 | - | ||
| 325 | - | ```go | |
| 326 | - | func Hello () { | |
| 327 | - | ··· | |
| 328 | - | } | |
| 329 | - | ``` | |
| 330 | - | ||
| 331 | - | Exported names begin with capital letters. | |
| 332 | - | ||
| 333 | - | See: [Exported names](https://tour.golang.org/basics/3) | |
| 334 | - | ||
| 335 | - | ### Packages | |
| 336 | - | ||
| 337 | - | ```go | |
| 338 | - | package hello | |
| 339 | - | ``` | |
| 340 | - | ||
| 341 | - | Every package file has to start with `package`. | |
| 342 | - | ||
| 343 | - | ## Concurrency | |
| 344 | - | {: .-three-column} | |
| 345 | - | ||
| 346 | - | ### Goroutines | |
| 347 | - | ||
| 348 | - | ```go | |
| 349 | - | func main() { | |
| 350 | - | // A "channel" | |
| 351 | - | ch := make(chan string) | |
| 352 | - | ||
| 353 | - | // Start concurrent routines | |
| 354 | - | go push("Moe", ch) | |
| 355 | - | go push("Larry", ch) | |
| 356 | - | go push("Curly", ch) | |
| 357 | - | ||
| 358 | - | // Read 3 results | |
| 359 | - | // (Since our goroutines are concurrent, | |
| 360 | - | // the order isn't guaranteed!) | |
| 361 | - | fmt.Println(<-ch, <-ch, <-ch) | |
| 362 | - | } | |
| 363 | - | ``` | |
| 364 | - | {: data-line="3,6,7,8,13"} | |
| 365 | - | ||
| 366 | - | ```go | |
| 367 | - | func push(name string, ch chan string) { | |
| 368 | - | msg := "Hey, " + name | |
| 369 | - | ch <- msg | |
| 370 | - | } | |
| 371 | - | ``` | |
| 372 | - | {: data-line="3"} | |
| 373 | - | ||
| 374 | - | Channels are concurrency-safe communication objects, used in goroutines. | |
| 375 | - | ||
| 376 | - | See: [Goroutines](https://tour.golang.org/concurrency/1), [Channels](https://tour.golang.org/concurrency/2) | |
| 377 | - | ||
| 378 | - | ### Buffered channels | |
| 379 | - | ||
| 380 | - | ```go | |
| 381 | - | ch := make(chan int, 2) | |
| 382 | - | ch <- 1 | |
| 383 | - | ch <- 2 | |
| 384 | - | ch <- 3 | |
| 385 | - | // fatal error: | |
| 386 | - | // all goroutines are asleep - deadlock! | |
| 387 | - | ``` | |
| 388 | - | {: data-line="1"} | |
| 389 | - | ||
| 390 | - | Buffered channels limit the amount of messages it can keep. | |
| 391 | - | ||
| 392 | - | See: [Buffered channels](https://tour.golang.org/concurrency/3) | |
| 393 | - | ||
| 394 | - | ### Closing channels | |
| 395 | - | ||
| 396 | - | #### Closes a channel | |
| 397 | - | ||
| 398 | - | ```go | |
| 399 | - | ch <- 1 | |
| 400 | - | ch <- 2 | |
| 401 | - | ch <- 3 | |
| 402 | - | close(ch) | |
| 403 | - | ``` | |
| 404 | - | {: data-line="4"} | |
| 405 | - | ||
| 406 | - | #### Iterates across a channel until its closed | |
| 407 | - | ||
| 408 | - | ```go | |
| 409 | - | for i := range ch { | |
| 410 | - | ··· | |
| 411 | - | } | |
| 412 | - | ``` | |
| 413 | - | {: data-line="1"} | |
| 414 | - | ||
| 415 | - | #### Closed if `ok == false` | |
| 416 | - | ||
| 417 | - | ```go | |
| 418 | - | v, ok := <- ch | |
| 419 | - | ``` | |
| 420 | - | ||
| 421 | - | See: [Range and close](https://tour.golang.org/concurrency/4) | |
| 422 | - | ||
| 423 | - | ### WaitGroup | |
| 424 | - | ||
| 425 | - | ```go | |
| 426 | - | import "sync" | |
| 427 | - | ||
| 428 | - | func main() { | |
| 429 | - | var wg sync.WaitGroup | |
| 430 | - | ||
| 431 | - | for _, item := range itemList { | |
| 432 | - | // Increment WaitGroup Counter | |
| 433 | - | wg.Add(1) | |
| 434 | - | go doOperation(&wg, item) | |
| 435 | - | } | |
| 436 | - | // Wait for goroutines to finish | |
| 437 | - | wg.Wait() | |
| 438 | - | ||
| 439 | - | } | |
| 440 | - | ``` | |
| 441 | - | {: data-line="1,4,8,12"} | |
| 442 | - | ||
| 443 | - | ```go | |
| 444 | - | func doOperation(wg *sync.WaitGroup, item string) { | |
| 445 | - | defer wg.Done() | |
| 446 | - | // do operation on item | |
| 447 | - | // ... | |
| 448 | - | } | |
| 449 | - | ``` | |
| 450 | - | {: data-line="2"} | |
| 451 | - | ||
| 452 | - | 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. | |
| 453 | - | See: [WaitGroup](https://golang.org/pkg/sync/#WaitGroup) | |
| 454 | - | ||
| 455 | - | ||
| 456 | - | ## Error control | |
| 457 | - | ||
| 458 | - | ### Defer | |
| 459 | - | ||
| 460 | - | ```go | |
| 461 | - | func main() { | |
| 462 | - | defer fmt.Println("Done") | |
| 463 | - | fmt.Println("Working...") | |
| 464 | - | } | |
| 465 | - | ``` | |
| 466 | - | {: data-line="2"} | |
| 467 | - | ||
| 468 | - | Defers running a function until the surrounding function returns. | |
| 469 | - | The arguments are evaluated immediately, but the function call is not ran until later. | |
| 470 | - | ||
| 471 | - | See: [Defer, panic and recover](https://blog.golang.org/defer-panic-and-recover) | |
| 472 | - | ||
| 473 | - | ### Deferring functions | |
| 474 | - | ||
| 475 | - | ```go | |
| 476 | - | func main() { | |
| 477 | - | defer func() { | |
| 478 | - | fmt.Println("Done") | |
| 479 | - | }() | |
| 480 | - | fmt.Println("Working...") | |
| 481 | - | } | |
| 482 | - | ``` | |
| 483 | - | {: data-line="2,3,4"} | |
| 484 | - | ||
| 485 | - | Lambdas are better suited for defer blocks. | |
| 486 | - | ||
| 487 | - | ```go | |
| 488 | - | func main() { | |
| 489 | - | var d = int64(0) | |
| 490 | - | defer func(d *int64) { | |
| 491 | - | fmt.Printf("& %v Unix Sec\n", *d) | |
| 492 | - | }(&d) | |
| 493 | - | fmt.Print("Done ") | |
| 494 | - | d = time.Now().Unix() | |
| 495 | - | } | |
| 496 | - | ``` | |
| 497 | - | {: data-line="3,4,5"} | |
| 498 | - | The defer func uses current value of d, unless we use a pointer to get final value at end of main. | |
| 499 | - | ||
| 500 | - | ## Structs | |
| 501 | - | {: .-three-column} | |
| 502 | - | ||
| 503 | - | ### Defining | |
| 504 | - | ||
| 505 | - | ```go | |
| 506 | - | type Vertex struct { | |
| 507 | - | X int | |
| 508 | - | Y int | |
| 509 | - | } | |
| 510 | - | ``` | |
| 511 | - | {: data-line="1,2,3,4"} | |
| 512 | - | ||
| 513 | - | ```go | |
| 514 | - | func main() { | |
| 515 | - | v := Vertex{1, 2} | |
| 516 | - | v.X = 4 | |
| 517 | - | fmt.Println(v.X, v.Y) | |
| 518 | - | } | |
| 519 | - | ``` | |
| 520 | - | ||
| 521 | - | See: [Structs](https://tour.golang.org/moretypes/2) | |
| 522 | - | ||
| 523 | - | ### Literals | |
| 524 | - | ||
| 525 | - | ```go | |
| 526 | - | v := Vertex{X: 1, Y: 2} | |
| 527 | - | ``` | |
| 528 | - | ||
| 529 | - | ```go | |
| 530 | - | // Field names can be omitted | |
| 531 | - | v := Vertex{1, 2} | |
| 532 | - | ``` | |
| 533 | - | ||
| 534 | - | ```go | |
| 535 | - | // Y is implicit | |
| 536 | - | v := Vertex{X: 1} | |
| 537 | - | ``` | |
| 538 | - | ||
| 539 | - | You can also put field names. | |
| 540 | - | ||
| 541 | - | ### Pointers to structs | |
| 542 | - | ||
| 543 | - | ```go | |
| 544 | - | v := &Vertex{1, 2} | |
| 545 | - | v.X = 2 | |
| 546 | - | ``` | |
| 547 | - | ||
| 548 | - | Doing `v.X` is the same as doing `(*v).X`, when `v` is a pointer. | |
| 549 | - | ||
| 550 | - | ## Methods | |
| 551 | - | ||
| 552 | - | ### Receivers | |
| 553 | - | ||
| 554 | - | ```go | |
| 555 | - | type Vertex struct { | |
| 556 | - | X, Y float64 | |
| 557 | - | } | |
| 558 | - | ``` | |
| 559 | - | ||
| 560 | - | ```go | |
| 561 | - | func (v Vertex) Abs() float64 { | |
| 562 | - | return math.Sqrt(v.X * v.X + v.Y * v.Y) | |
| 563 | - | } | |
| 564 | - | ``` | |
| 565 | - | {: data-line="1"} | |
| 566 | - | ||
| 567 | - | ```go | |
| 568 | - | v := Vertex{1, 2} | |
| 569 | - | v.Abs() | |
| 570 | - | ``` | |
| 571 | - | ||
| 572 | - | There are no classes, but you can define functions with _receivers_. | |
| 573 | - | ||
| 574 | - | See: [Methods](https://tour.golang.org/methods/1) | |
| 575 | - | ||
| 576 | - | ### Mutation | |
| 577 | - | ||
| 578 | - | ```go | |
| 579 | - | func (v *Vertex) Scale(f float64) { | |
| 580 | - | v.X = v.X * f | |
| 581 | - | v.Y = v.Y * f | |
| 582 | - | } | |
| 583 | - | ``` | |
| 584 | - | {: data-line="1"} | |
| 585 | - | ||
| 586 | - | ```go | |
| 587 | - | v := Vertex{6, 12} | |
| 588 | - | v.Scale(0.5) | |
| 589 | - | // `v` is updated | |
| 590 | - | ``` | |
| 591 | - | ||
| 592 | - | By defining your receiver as a pointer (`*Vertex`), you can do mutations. | |
| 593 | - | ||
| 594 | - | See: [Pointer receivers](https://tour.golang.org/methods/4) | |
| 595 | - | ||
| 596 | - | ## Interfaces | |
| 597 | - | ||
| 598 | - | ### A basic interface | |
| 599 | - | ||
| 600 | - | ```go | |
| 601 | - | type Shape interface { | |
| 602 | - | Area() float64 | |
| 603 | - | Perimeter() float64 | |
| 604 | - | } | |
| 605 | - | ``` | |
| 606 | - | ||
| 607 | - | ### Struct | |
| 608 | - | ||
| 609 | - | ```go | |
| 610 | - | type Rectangle struct { | |
| 611 | - | Length, Width float64 | |
| 612 | - | } | |
| 613 | - | ``` | |
| 614 | - | ||
| 615 | - | Struct `Rectangle` implicitly implements interface `Shape` by implementing all of its methods. | |
| 616 | - | ||
| 617 | - | ### Methods | |
| 618 | - | ||
| 619 | - | ```go | |
| 620 | - | func (r Rectangle) Area() float64 { | |
| 621 | - | return r.Length * r.Width | |
| 622 | - | } | |
| 623 | - | ||
| 624 | - | func (r Rectangle) Perimeter() float64 { | |
| 625 | - | return 2 * (r.Length + r.Width) | |
| 626 | - | } | |
| 627 | - | ``` | |
| 628 | - | ||
| 629 | - | The methods defined in `Shape` are implemented in `Rectangle`. | |
| 630 | - | ||
| 631 | - | ### Interface example | |
| 632 | - | ||
| 633 | - | ```go | |
| 634 | - | func main() { | |
| 635 | - | var r Shape = Rectangle{Length: 3, Width: 4} | |
| 636 | - | fmt.Printf("Type of r: %T, Area: %v, Perimeter: %v.", r, r.Area(), r.Perimeter()) | |
| 637 | - | } | |
| 638 | - | ``` | |
| 639 | - | ||
| 640 | - | ## References | |
| 641 | - | ||
| 642 | - | ### Official resources | |
| 643 | - | {: .-intro} | |
| 644 | - | ||
| 645 | - | - [A tour of Go](https://tour.golang.org/welcome/1) _(tour.golang.org)_ | |
| 646 | - | - [Golang wiki](https://github.com/golang/go/wiki/) _(github.com)_ | |
| 647 | - | - [Effective Go](https://golang.org/doc/effective_go.html) _(golang.org)_ | |
| 648 | - | ||
| 649 | - | ### Other links | |
| 650 | - | {: .-intro} | |
| 651 | - | ||
| 652 | - | - [Go by Example](https://gobyexample.com/) _(gobyexample.com)_ | |
| 653 | - | - [Awesome Go](https://awesome-go.com/) _(awesome-go.com)_ | |
| 654 | - | - [JustForFunc Youtube](https://www.youtube.com/channel/UC_BzFbxG2za3bp5NRRRXJSw) _(youtube.com)_ | |
| 655 | - | - [Style Guide](https://github.com/golang/go/wiki/CodeReviewComments) _(github.com)_ | |
| 656 | - | ||
| 657 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 658 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,1277 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Goby | |
| 3 | - | layout: 2017/sheet | |
| 4 | - | prism_languages: [ruby] | |
| 5 | - | weight: -3 | |
| 6 | - | updated: 2018-12-06 | |
| 7 | - | category: Ruby | |
| 8 | - | intro: | | |
| 9 | - | Goby's language design is based on Ruby language's, slim and shaped up. Differences in syntax between them is very small. | |
| 10 | - | --- | |
| 11 | - | ||
| 12 | - | ||
| 13 | - | ## Getting started | |
| 14 | - | ||
| 15 | - | ### Hello world | |
| 16 | - | {: .-prime} | |
| 17 | - | ||
| 18 | - | #### hello.gb | |
| 19 | - | {: .-file} | |
| 20 | - | ||
| 21 | - | ```ruby | |
| 22 | - | class Greet | |
| 23 | - | attr_accessor :audience, :head, :tail | |
| 24 | - | ||
| 25 | - | def initialize | |
| 26 | - | @head = "Hello, " | |
| 27 | - | @tail = "!" | |
| 28 | - | end | |
| 29 | - | ||
| 30 | - | def name | |
| 31 | - | audience.name | |
| 32 | - | end | |
| 33 | - | ||
| 34 | - | def say | |
| 35 | - | puts head + name + tail | |
| 36 | - | end | |
| 37 | - | end | |
| 38 | - | ||
| 39 | - | module MyName | |
| 40 | - | attr_reader :name | |
| 41 | - | ||
| 42 | - | def initialize | |
| 43 | - | @name = self.class.to_s | |
| 44 | - | end | |
| 45 | - | end | |
| 46 | - | ||
| 47 | - | class World | |
| 48 | - | include MyName | |
| 49 | - | end | |
| 50 | - | ||
| 51 | - | greet = Greet.new | |
| 52 | - | greet.audience = World.new | |
| 53 | - | greet.say | |
| 54 | - | ``` | |
| 55 | - | ||
| 56 | - | Then run: | |
| 57 | - | ||
| 58 | - | ```bash | |
| 59 | - | $ goby hello.gb | |
| 60 | - | #=> Hello, World! | |
| 61 | - | ``` | |
| 62 | - | ||
| 63 | - | ### REPL (igb) | |
| 64 | - | ||
| 65 | - | ```bash | |
| 66 | - | $ goby -i | |
| 67 | - | ``` | |
| 68 | - | ||
| 69 | - | * `reset`: reset the VM | |
| 70 | - | * `exit`: exit REPL | |
| 71 | - | * `help`: show help | |
| 72 | - | * ctrl-c: cancel the block entered, or exit (on top level) | |
| 73 | - | ||
| 74 | - | 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. | |
| 75 | - | ||
| 76 | - | ## Variables | |
| 77 | - | {: .-three-column} | |
| 78 | - | ||
| 79 | - | ### Local variable | |
| 80 | - | ||
| 81 | - | ```ruby | |
| 82 | - | zip101 = "233-7383" | |
| 83 | - | magic_number = 42 | |
| 84 | - | ``` | |
| 85 | - | ||
| 86 | - | Should be "`[a-z][a-z0-9_]+`"(snake_case). | |
| 87 | - | ||
| 88 | - | ### Instance variable | |
| 89 | - | ||
| 90 | - | ```ruby | |
| 91 | - | module State | |
| 92 | - | def initialize(state) | |
| 93 | - | @state = state # declaring an instance variable by assignment | |
| 94 | - | end | |
| 95 | - | def show | |
| 96 | - | @state # accessible from other instance methods | |
| 97 | - | end | |
| 98 | - | end | |
| 99 | - | ||
| 100 | - | state = State.new "success" | |
| 101 | - | state.show | |
| 102 | - | #=> success | |
| 103 | - | ``` | |
| 104 | - | ||
| 105 | - | Should be "`@[a-z][a-z0-9_]+`"(snake_case). | |
| 106 | - | ||
| 107 | - | ### Multiple assignment | |
| 108 | - | ||
| 109 | - | ```ruby | |
| 110 | - | # array literal | |
| 111 | - | a, b, c = [1, 2, 3] | |
| 112 | - | ||
| 113 | - | # array with '*' | |
| 114 | - | a = [1, 2, 3] | |
| 115 | - | x, y, z = *a | |
| 116 | - | ||
| 117 | - | # array literal with '*' | |
| 118 | - | a, b, c = *[1, 2, 3] | |
| 119 | - | ||
| 120 | - | # bare assignment: unsupported | |
| 121 | - | a, b, c = 1, 2, 3 #=> unexpected 3 Line: 0 | |
| 122 | - | ``` | |
| 123 | - | ||
| 124 | - | ### Black hole variable | |
| 125 | - | ||
| 126 | - | ```ruby | |
| 127 | - | # '_' is write-only | |
| 128 | - | a, _ = [1, 2] | |
| 129 | - | ``` | |
| 130 | - | ||
| 131 | - | ### Class variable | |
| 132 | - | ||
| 133 | - | Unsupported. | |
| 134 | - | ||
| 135 | - | ### Global variable | |
| 136 | - | ||
| 137 | - | Unsupported. | |
| 138 | - | ||
| 139 | - | ## Method definition | |
| 140 | - | ||
| 141 | - | ### Method definition and calling | |
| 142 | - | ||
| 143 | - | ```ruby | |
| 144 | - | def foo_bar?(baz) | |
| 145 | - | if baz == "Hi, Goby!" | |
| 146 | - | true | |
| 147 | - | else | |
| 148 | - | false | |
| 149 | - | end | |
| 150 | - | end | |
| 151 | - | ||
| 152 | - | foo_bar? "Hi, Goby!" #=> true | |
| 153 | - | ``` | |
| 154 | - | ||
| 155 | - | 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**. | |
| 156 | - | ||
| 157 | - | ### Order of method parameter | |
| 158 | - | ||
| 159 | - | ```ruby | |
| 160 | - | def foo(normal, default="value", hash={}, ary=[], keyword:, keyword_default:"key", *sprat) | |
| 161 | - | end | |
| 162 | - | ``` | |
| 163 | - | ||
| 164 | - | 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: | |
| 165 | - | ||
| 166 | - | 1. **normal parameters** (like `a`) | |
| 167 | - | 2. **normal parameters with default value** (like `a=1`) | |
| 168 | - | 3. **optional parameters** (array or hash, like `ary=[]` or `hs={}`) | |
| 169 | - | 4. **keyword parameters** (like `kwd:`) | |
| 170 | - | 5. **keyword parameters with default value** (like `kwd: 1` or `ary: [1,2,3]` or `hsh: {key: "value"}`) | |
| 171 | - | 6. **splat parameters** (like `*sp`) | |
| 172 | - | ||
| 173 | - | Or you will receive an error. | |
| 174 | - | ||
| 175 | - | ### Keyword parameter (WIP) | |
| 176 | - | ||
| 177 | - | ```ruby | |
| 178 | - | def foo(process:, verb: :GET, opt:{ csp: :enabled }, ary: [1, 2, 3]) | |
| 179 | - | end | |
| 180 | - | ``` | |
| 181 | - | ||
| 182 | - | ### Returning value | |
| 183 | - | ||
| 184 | - | ```ruby | |
| 185 | - | PI = 3.14 | |
| 186 | - | def area(radius) | |
| 187 | - | radius * PI # returns the result of evaluation | |
| 188 | - | end | |
| 189 | - | ||
| 190 | - | area 6 #=> 18.84 | |
| 191 | - | ``` | |
| 192 | - | ||
| 193 | - | ### Returning multiple value | |
| 194 | - | ||
| 195 | - | ```ruby | |
| 196 | - | def my_array | |
| 197 | - | [1, 2, 3] | |
| 198 | - | end | |
| 199 | - | ||
| 200 | - | my_array #=> [1, 2, 3] | |
| 201 | - | ``` | |
| 202 | - | ||
| 203 | - | ### Instance method | |
| 204 | - | ||
| 205 | - | ```ruby | |
| 206 | - | module Foo | |
| 207 | - | def bar # defining instance method | |
| 208 | - | puts "bar" | |
| 209 | - | end | |
| 210 | - | ||
| 211 | - | def baz(count, email: "goby@example.com") | |
| 212 | - | count.times do | |
| 213 | - | puts email | |
| 214 | - | end | |
| 215 | - | end | |
| 216 | - | end | |
| 217 | - | ||
| 218 | - | foo = Foo.new | |
| 219 | - | foo.bar #=> bar | |
| 220 | - | foo.baz(3) #↓ | |
| 221 | - | goby@example.com | |
| 222 | - | goby@example.com | |
| 223 | - | goby@example.com | |
| 224 | - | ``` | |
| 225 | - | ||
| 226 | - | ### Singleton method #1 | |
| 227 | - | ||
| 228 | - | ```ruby | |
| 229 | - | str = "Goby" | |
| 230 | - | def str.foo #1 singleton method on the object | |
| 231 | - | self * 2 | |
| 232 | - | end | |
| 233 | - | ||
| 234 | - | str.foo | |
| 235 | - | #=> GobyGoby | |
| 236 | - | ``` | |
| 237 | - | ||
| 238 | - | ### Singleton method #2 | |
| 239 | - | ||
| 240 | - | ```ruby | |
| 241 | - | module Foo | |
| 242 | - | def self.bar #2 singleton method with `self.` | |
| 243 | - | 92 | |
| 244 | - | end | |
| 245 | - | end | |
| 246 | - | ``` | |
| 247 | - | ||
| 248 | - | ### Singleton method #3 | |
| 249 | - | ||
| 250 | - | ```ruby | |
| 251 | - | module Foo | |
| 252 | - | def Foo.bar #3 singleton method with a class name (unrecommended) | |
| 253 | - | 88 | |
| 254 | - | end | |
| 255 | - | end | |
| 256 | - | ``` | |
| 257 | - | ||
| 258 | - | ### Singleton method #4 | |
| 259 | - | ||
| 260 | - | ```ruby | |
| 261 | - | module Foo end | |
| 262 | - | ||
| 263 | - | def Foo.bar #4 singleton methods outside the Foo | |
| 264 | - | 9999 | |
| 265 | - | end | |
| 266 | - | ||
| 267 | - | Foo.bar #=> 9999 | |
| 268 | - | ``` | |
| 269 | - | ||
| 270 | - | ### Attribute accessor method | |
| 271 | - | ||
| 272 | - | ```ruby | |
| 273 | - | class Foo | |
| 274 | - | attr_accessor :bar, :baz | |
| 275 | - | ||
| 276 | - | def initialize | |
| 277 | - | @bar = 42 | |
| 278 | - | @baz = 99 | |
| 279 | - | end | |
| 280 | - | end | |
| 281 | - | ||
| 282 | - | foo = Foo.new | |
| 283 | - | ||
| 284 | - | foo.bar = 77 | |
| 285 | - | foo.baz = 88 | |
| 286 | - | ``` | |
| 287 | - | ||
| 288 | - | You can use the following shorthands to declare attribute accessor methods in classes/modules: | |
| 289 | - | ||
| 290 | - | * `attr_accessor` | |
| 291 | - | * `attr_reader` | |
| 292 | - | * `attr_writer` | |
| 293 | - | ||
| 294 | - | ### Private method (to be implemented) | |
| 295 | - | ||
| 296 | - | ```ruby | |
| 297 | - | class Foo | |
| 298 | - | def bar | |
| 299 | - | 42 | |
| 300 | - | end | |
| 301 | - | ||
| 302 | - | def _baz # leading '_' means private method | |
| 303 | - | 99 | |
| 304 | - | end | |
| 305 | - | end | |
| 306 | - | ``` | |
| 307 | - | ||
| 308 | - | ## Module/Class definition | |
| 309 | - | {: .-three-column} | |
| 310 | - | ||
| 311 | - | ### Module definition and `include` | |
| 312 | - | ||
| 313 | - | ```ruby | |
| 314 | - | module Foo | |
| 315 | - | def foo | |
| 316 | - | "Foo's instance method" | |
| 317 | - | end | |
| 318 | - | end | |
| 319 | - | ||
| 320 | - | class Bar | |
| 321 | - | include Foo # to include Foo | |
| 322 | - | end | |
| 323 | - | ||
| 324 | - | Bar.new.foo #=> Foo's instance method | |
| 325 | - | ``` | |
| 326 | - | ||
| 327 | - | Module names should be "`[A-Z][A-Za-z0-9_]+`" (UpperCamelCase). Modules cannot be inherited. | |
| 328 | - | ||
| 329 | - | ### Module definition and `extend` | |
| 330 | - | ||
| 331 | - | ```ruby | |
| 332 | - | module Foo | |
| 333 | - | def foo | |
| 334 | - | "Foo's instance method will be a singleton method" | |
| 335 | - | end | |
| 336 | - | end | |
| 337 | - | ||
| 338 | - | class Bar | |
| 339 | - | extend Foo # to extend Foo | |
| 340 | - | end | |
| 341 | - | ||
| 342 | - | Bar.foo #=> Foo's instance method will be a singleton method | |
| 343 | - | ``` | |
| 344 | - | ||
| 345 | - | `extend` is to use the instance methods in the specified modules as **singleton methods** in your class or module. | |
| 346 | - | ||
| 347 | - | ### Module instantiation | |
| 348 | - | ||
| 349 | - | ```ruby | |
| 350 | - | module Foo #module definition | |
| 351 | - | def foo | |
| 352 | - | 99 | |
| 353 | - | end | |
| 354 | - | end | |
| 355 | - | ||
| 356 | - | Foo.new.foo #=> 99 | |
| 357 | - | ``` | |
| 358 | - | ||
| 359 | - | Actually, Goby's module can be even **instantiated** via "`new`" like "`Foo.new`". | |
| 360 | - | ||
| 361 | - | ### Class definition and inheritance | |
| 362 | - | ||
| 363 | - | ```ruby | |
| 364 | - | class Foo # class definition | |
| 365 | - | def bar | |
| 366 | - | 99 | |
| 367 | - | end | |
| 368 | - | end | |
| 369 | - | ||
| 370 | - | class Baz < Foo # inheritance | |
| 371 | - | end | |
| 372 | - | ||
| 373 | - | Baz.new.bar #=> 99 | |
| 374 | - | ``` | |
| 375 | - | ||
| 376 | - | Class names should be "`[A-Z][A-Za-z0-9]+`" (UpperCamelCase). Inheritance with "`<`" is supported. | |
| 377 | - | ||
| 378 | - | ### Constants | |
| 379 | - | ||
| 380 | - | ```ruby | |
| 381 | - | HTTP_ERROR_404 = 404 | |
| 382 | - | HTTP_ERROR_404 = 500 # error | |
| 383 | - | ``` | |
| 384 | - | ||
| 385 | - | Constants should be "`[A-Z][A-Za-z0-9_]+`" (UPPER_SNAKECASE). Constants are **not reentrant** and the scope is **global**. | |
| 386 | - | ||
| 387 | - | ### Redefining class/modules | |
| 388 | - | ||
| 389 | - | ```ruby | |
| 390 | - | class Foo | |
| 391 | - | def bar | |
| 392 | - | 99 | |
| 393 | - | end | |
| 394 | - | end | |
| 395 | - | ||
| 396 | - | class Foo | |
| 397 | - | def bar # redefining is possible | |
| 398 | - | 77 | |
| 399 | - | end | |
| 400 | - | end | |
| 401 | - | ``` | |
| 402 | - | ||
| 403 | - | ### Namespaces | |
| 404 | - | ||
| 405 | - | ```ruby | |
| 406 | - | class Foo | |
| 407 | - | module Bar | |
| 408 | - | MAGIC = 99 | |
| 409 | - | def baz | |
| 410 | - | 99 | |
| 411 | - | end | |
| 412 | - | end | |
| 413 | - | end | |
| 414 | - | ||
| 415 | - | Foo::Bar.new.baz # Use '::' for namespacing | |
| 416 | - | Foo::Bar::MAGIC # Use '::' for namespacing | |
| 417 | - | ``` | |
| 418 | - | ||
| 419 | - | ## Load library | |
| 420 | - | ||
| 421 | - | ### `require` | |
| 422 | - | ||
| 423 | - | ```ruby | |
| 424 | - | require("uri") # to activate URL class | |
| 425 | - | ||
| 426 | - | u = URI.parse("http://example.com") | |
| 427 | - | u.scheme #=> "http" | |
| 428 | - | ``` | |
| 429 | - | ||
| 430 | - | ### `require_relative` | |
| 431 | - | ||
| 432 | - | ```ruby | |
| 433 | - | require_relative("bar") # loading the local bar.gb | |
| 434 | - | ||
| 435 | - | class Foo | |
| 436 | - | def self.bar(x) | |
| 437 | - | Bar.foo do |ten| | |
| 438 | - | x * ten | |
| 439 | - | end | |
| 440 | - | end | |
| 441 | - | ||
| 442 | - | def self.baz | |
| 443 | - | yield(100) | |
| 444 | - | end | |
| 445 | - | end | |
| 446 | - | ``` | |
| 447 | - | ||
| 448 | - | ## Literal | |
| 449 | - | {: .-three-column} | |
| 450 | - | ||
| 451 | - | ### Keyword | |
| 452 | - | ||
| 453 | - | `def`, `true`, `false`, `nil`, `if`, `elsif`, `else`, `case`, `when`, `return`, `self`, `end`, `while`, `do`, `yield`, `get_block`, `next`, `class`, `module`, `break` | |
| 454 | - | ||
| 455 | - | ### String literal | |
| 456 | - | ||
| 457 | - | ```ruby | |
| 458 | - | "double quote" | |
| 459 | - | 'single quote' | |
| 460 | - | ``` | |
| 461 | - | ||
| 462 | - | Double and single quotation can be used. | |
| 463 | - | ||
| 464 | - | ### Symbol literal | |
| 465 | - | ||
| 466 | - | ```ruby | |
| 467 | - | :symbol # equivalent to "symbol" | |
| 468 | - | { symbol: "value" } | |
| 469 | - | ``` | |
| 470 | - | ||
| 471 | - | Goby's symbol (using `:`) is always `String` class. | |
| 472 | - | ||
| 473 | - | ### Numeric literal | |
| 474 | - | ||
| 475 | - | ```ruby | |
| 476 | - | year = 2018 # Integer | |
| 477 | - | offset = -42 # Integer | |
| 478 | - | PI = 3.14 # Float | |
| 479 | - | G = -9.8 # Float | |
| 480 | - | ``` | |
| 481 | - | ||
| 482 | - | ### Array literal | |
| 483 | - | ||
| 484 | - | ```ruby | |
| 485 | - | [1, 2, 3, "hello", :goby, { key: "value"}] | |
| 486 | - | [1, 2, [3, 4], 5, 6] | |
| 487 | - | ``` | |
| 488 | - | ||
| 489 | - | ### Hash literal | |
| 490 | - | ||
| 491 | - | ```ruby | |
| 492 | - | h = { key: "value", key2: "value2" } | |
| 493 | - | h[:key2] #=> value2 | |
| 494 | - | ``` | |
| 495 | - | ||
| 496 | - | Hash literal's keys should always be **symbol literals**. | |
| 497 | - | ||
| 498 | - | ### Range literal | |
| 499 | - | ||
| 500 | - | ```ruby | |
| 501 | - | (1..10).each do |x| # '..' represents a range | |
| 502 | - | puts x*x | |
| 503 | - | end | |
| 504 | - | ``` | |
| 505 | - | ||
| 506 | - | ### Boolean and `nil` | |
| 507 | - | ||
| 508 | - | ```ruby | |
| 509 | - | true # Boolean class | |
| 510 | - | false # Boolean class | |
| 511 | - | nil # Null class | |
| 512 | - | ||
| 513 | - | !nil #=> true | |
| 514 | - | ``` | |
| 515 | - | ||
| 516 | - | Any objects except `nil` and `false` will be treated as `true` on conditionals. | |
| 517 | - | ||
| 518 | - | ## Operator | |
| 519 | - | ||
| 520 | - | ### Arithmetic/logical/assignment operators | |
| 521 | - | ||
| 522 | - | ```ruby | |
| 523 | - | + # unary | |
| 524 | - | ** # power | |
| 525 | - | - # unary | |
| 526 | - | * / % # multiplication, division, modulus | |
| 527 | - | + - # addition, subtraction | |
| 528 | - | ! # logical inversion | |
| 529 | - | > >= < <= # inequality comparison | |
| 530 | - | == != # equality comparison, negative comparison | |
| 531 | - | && # logical AND | |
| 532 | - | || # logical OR | |
| 533 | - | += -= # shorthand of addition/subtraction | |
| 534 | - | = # assignment | |
| 535 | - | ``` | |
| 536 | - | ||
| 537 | - | *Priority of operators are TBD | |
| 538 | - | ||
| 539 | - | ### Other operators | |
| 540 | - | ||
| 541 | - | ```ruby | |
| 542 | - | () # chaning priority of interpretation | |
| 543 | - | [] # array literal | |
| 544 | - | * # multiple assignment | |
| 545 | - | .. # range | |
| 546 | - | ``` | |
| 547 | - | ||
| 548 | - | *Priority of operators are TBD | |
| 549 | - | ||
| 550 | - | ### Delimiter | |
| 551 | - | ||
| 552 | - | ```ruby | |
| 553 | - | class Foo; end # ';' to delimit | |
| 554 | - | ||
| 555 | - | class Bar end # recommended | |
| 556 | - | ``` | |
| 557 | - | ||
| 558 | - | ### String interpolation (to be implemented) | |
| 559 | - | ||
| 560 | - | ```ruby | |
| 561 | - | puts "Error: #{error_message}" # double quotation is required | |
| 562 | - | ``` | |
| 563 | - | ||
| 564 | - | ### Comment | |
| 565 | - | ||
| 566 | - | ```ruby | |
| 567 | - | puts "Goby" # comments | |
| 568 | - | ``` | |
| 569 | - | ||
| 570 | - | Use the annotations to keep the comments concise. | |
| 571 | - | ||
| 572 | - | - `TODO` | |
| 573 | - | - `FIXME` | |
| 574 | - | - `OPTIMIZE` | |
| 575 | - | - `HACK` | |
| 576 | - | - `REVIEW` | |
| 577 | - | ||
| 578 | - | ### I/O | |
| 579 | - | ||
| 580 | - | * `#puts` | |
| 581 | - | ||
| 582 | - | * special constants: `ARGV`, `STDIN`, `STDOUT`, `STDERR`, `ENV` | |
| 583 | - | ||
| 584 | - | ## Flow control | |
| 585 | - | {: .-three-column} | |
| 586 | - | ||
| 587 | - | ### `if`, `else`, `elsif` | |
| 588 | - | ||
| 589 | - | ```ruby | |
| 590 | - | def foo(str) | |
| 591 | - | if str.size > 10 | |
| 592 | - | puts "too big!" | |
| 593 | - | elsif str.size < 3 | |
| 594 | - | puts "too short!" | |
| 595 | - | else | |
| 596 | - | puts "moderate" | |
| 597 | - | end | |
| 598 | - | end | |
| 599 | - | ``` | |
| 600 | - | ||
| 601 | - | `then` is **not** supported. | |
| 602 | - | ||
| 603 | - | ### Break | |
| 604 | - | ||
| 605 | - | ```ruby | |
| 606 | - | def foo(tail) | |
| 607 | - | (5..tail).each do |t| | |
| 608 | - | if t % 2 == 0 && t % 5 == 0 | |
| 609 | - | puts "ouch!" | |
| 610 | - | break # finish the block | |
| 611 | - | else | |
| 612 | - | puts t | |
| 613 | - | end | |
| 614 | - | end | |
| 615 | - | puts "out of the block" | |
| 616 | - | end | |
| 617 | - | ||
| 618 | - | foo 20 | |
| 619 | - | #=> 5 6 7 8 9 | |
| 620 | - | #=> ouch! | |
| 621 | - | #=> out of the block | |
| 622 | - | ``` | |
| 623 | - | ||
| 624 | - | ### Case | |
| 625 | - | ||
| 626 | - | ```ruby | |
| 627 | - | def foo(str) | |
| 628 | - | case str | |
| 629 | - | when "Elf" | |
| 630 | - | puts "You might be Aragorn II!" | |
| 631 | - | when "Aragorn" | |
| 632 | - | puts "Long time no see, Aragorn!" | |
| 633 | - | when "Frodo", "Sam", "Gandalf" | |
| 634 | - | puts "One of us!" | |
| 635 | - | else | |
| 636 | - | puts "You're not yourself" | |
| 637 | - | end | |
| 638 | - | end | |
| 639 | - | ``` | |
| 640 | - | ||
| 641 | - | ### While | |
| 642 | - | ||
| 643 | - | ```ruby | |
| 644 | - | decr = 10 | |
| 645 | - | while decr do | |
| 646 | - | if decr < 1 | |
| 647 | - | break | |
| 648 | - | end | |
| 649 | - | puts decr | |
| 650 | - | decr -= 1 | |
| 651 | - | end | |
| 652 | - | ``` | |
| 653 | - | ||
| 654 | - | `while`, conditional and a `do`/`end` block can be used for a loop. | |
| 655 | - | ||
| 656 | - | ### Rescue | |
| 657 | - | ||
| 658 | - | Under construction. Join [#605](https://github.com/goby-lang/goby/issues/605). | |
| 659 | - | ||
| 660 | - | ## Block | |
| 661 | - | {: .-three-column} | |
| 662 | - | ||
| 663 | - | ### Block | |
| 664 | - | ||
| 665 | - | ```ruby | |
| 666 | - | def foo(ary: [1, 2, 3]) | |
| 667 | - | ary.each do |s| # start of the block with |block variable| | |
| 668 | - | puts s | |
| 669 | - | end # end of the block | |
| 670 | - | end | |
| 671 | - | ``` | |
| 672 | - | ||
| 673 | - | `{ }` cannot be used for forming a block. | |
| 674 | - | ||
| 675 | - | ### `yield` | |
| 676 | - | ||
| 677 | - | ```ruby | |
| 678 | - | def foo | |
| 679 | - | yield(10) # executes the block given | |
| 680 | - | end | |
| 681 | - | ||
| 682 | - | foo do |ten| | |
| 683 | - | ten + 20 | |
| 684 | - | end | |
| 685 | - | ``` | |
| 686 | - | ||
| 687 | - | ### Block object and `call` | |
| 688 | - | ||
| 689 | - | ```ruby | |
| 690 | - | b = Block.new do | |
| 691 | - | 100 | |
| 692 | - | end | |
| 693 | - | ||
| 694 | - | b.call #=> 100 | |
| 695 | - | ``` | |
| 696 | - | ||
| 697 | - | `Block.new` can take a block and then `call`. | |
| 698 | - | ||
| 699 | - | ### Passing a block | |
| 700 | - | ||
| 701 | - | ```ruby | |
| 702 | - | def baz | |
| 703 | - | 1000 | |
| 704 | - | end | |
| 705 | - | ||
| 706 | - | class Foo | |
| 707 | - | def exec_block(block) | |
| 708 | - | block.call | |
| 709 | - | end | |
| 710 | - | ||
| 711 | - | def baz | |
| 712 | - | 100 | |
| 713 | - | end | |
| 714 | - | end | |
| 715 | - | ||
| 716 | - | b = Block.new do | |
| 717 | - | baz | |
| 718 | - | end | |
| 719 | - | ||
| 720 | - | f = Foo.new | |
| 721 | - | f.exec_block(b) | |
| 722 | - | ``` | |
| 723 | - | ||
| 724 | - | ### Passing a block with block arguments | |
| 725 | - | ||
| 726 | - | ```ruby | |
| 727 | - | b = Block.new do |arg, offset| | |
| 728 | - | arg + 1000 - offset | |
| 729 | - | end | |
| 730 | - | ||
| 731 | - | b.call(49, 500) #=> 549 | |
| 732 | - | ``` | |
| 733 | - | ||
| 734 | - | ### Special `get_block` keyword | |
| 735 | - | ||
| 736 | - | ```ruby | |
| 737 | - | def bar(block) | |
| 738 | - | # runs the block object and the block arg simultaneously | |
| 739 | - | block.call + get_block.call | |
| 740 | - | end | |
| 741 | - | ||
| 742 | - | def foo | |
| 743 | - | bar(get_block) do # passes two blocks to `bar` | |
| 744 | - | 20 | |
| 745 | - | end | |
| 746 | - | end | |
| 747 | - | ||
| 748 | - | foo do | |
| 749 | - | 10 | |
| 750 | - | end | |
| 751 | - | ``` | |
| 752 | - | ||
| 753 | - | `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. | |
| 754 | - | ||
| 755 | - | ### Closure | |
| 756 | - | ||
| 757 | - | ```ruby | |
| 758 | - | count = 0 # the declaration is used | |
| 759 | - | b = Block.new do | |
| 760 | - | count += 1 # the block looks preserving the `count` | |
| 761 | - | end | |
| 762 | - | ||
| 763 | - | class Foo | |
| 764 | - | def bar(blk) | |
| 765 | - | count = 9 # (does not affect) | |
| 766 | - | puts blk.call # local variable is resolved to the one above | |
| 767 | - | end | |
| 768 | - | end | |
| 769 | - | ||
| 770 | - | Foo.new.bar b #=> 1 | |
| 771 | - | Foo.new.bar b #=> 2 | |
| 772 | - | Foo.new.bar b #=> 3 | |
| 773 | - | ``` | |
| 774 | - | ||
| 775 | - | ## Native class (Primary) | |
| 776 | - | {: .-three-column} | |
| 777 | - | ||
| 778 | - | Goby's most "native" classes cannot instantiate with `new` in principle. | |
| 779 | - | ||
| 780 | - | ### `Object` | |
| 781 | - | ||
| 782 | - | ```ruby | |
| 783 | - | Bar.ancestors | |
| 784 | - | #» [Bar, Foo, Object] | |
| 785 | - | Bar.singleton_class.ancestors | |
| 786 | - | #» [#<Class:Bar>, #<Class:Object>, Class, Object] | |
| 787 | - | ``` | |
| 788 | - | ||
| 789 | - | `Object` is actually just for creating singleton classes. See `Class`. | |
| 790 | - | ||
| 791 | - | * **`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` | |
| 792 | - | ||
| 793 | - | * **`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` | |
| 794 | - | ||
| 795 | - | ### `Class` | |
| 796 | - | ||
| 797 | - | ```ruby | |
| 798 | - | String.ancestors #=> [String, Object] | |
| 799 | - | ``` | |
| 800 | - | ||
| 801 | - | `Class` and `Object`can actually be regarded as the same and you don't need to distinguish them in almost all the cases. | |
| 802 | - | ||
| 803 | - | * **`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` | |
| 804 | - | ||
| 805 | - | ### `String` | |
| 806 | - | ||
| 807 | - | ```ruby | |
| 808 | - | puts "Hello" + ' ' + 'world' #=> Hello world | |
| 809 | - | ``` | |
| 810 | - | ||
| 811 | - | Fixed to **UTF-8** with mb4 support. | |
| 812 | - | ||
| 813 | - | * **`String.methods`**: `fmt`, | |
| 814 | - | * the rest: `Class.methods` | |
| 815 | - | * **`"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`, | |
| 816 | - | * the rest: `Object.new.methods` | |
| 817 | - | ||
| 818 | - | ### `Integer` | |
| 819 | - | ||
| 820 | - | ```ruby | |
| 821 | - | 37037 * 27 #=> 999999 | |
| 822 | - | ``` | |
| 823 | - | ||
| 824 | - | * **`Integer.methods`**: the same as `Class.methods` | |
| 825 | - | * **`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` | |
| 826 | - | * the rest: `Object.new.methods` | |
| 827 | - | ||
| 828 | - | ### `Array` | |
| 829 | - | ||
| 830 | - | ```ruby | |
| 831 | - | [1, "2", :card, [4, 5], { john: "doe" }] | |
| 832 | - | ``` | |
| 833 | - | ||
| 834 | - | * **`Array.methods`**: the same as `Class.methods` | |
| 835 | - | * **`[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` | |
| 836 | - | * the rest: `Object.new.methods` | |
| 837 | - | ||
| 838 | - | ### `Hash` | |
| 839 | - | ||
| 840 | - | ```ruby | |
| 841 | - | h = { key: "value" } | |
| 842 | - | h = { "key": "value" } #=> error | |
| 843 | - | ||
| 844 | - | h["key"] #=> value | |
| 845 | - | h[:key] #=> value | |
| 846 | - | ``` | |
| 847 | - | ||
| 848 | - | Keys in hash literals should be **symbol literals**, while Hash index can be either string or symbol literals. | |
| 849 | - | ||
| 850 | - | * **`Hash.methods`**: the same as `Class.methods` | |
| 851 | - | * **`{ 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` | |
| 852 | - | * the rest: `Object.new.methods` | |
| 853 | - | ||
| 854 | - | ### `Range` | |
| 855 | - | ||
| 856 | - | ```ruby | |
| 857 | - | (1..10).each do |i| | |
| 858 | - | puts i ** 2 | |
| 859 | - | end | |
| 860 | - | ``` | |
| 861 | - | ||
| 862 | - | * **`Range.methods`**: the same as `Class.methods` | |
| 863 | - | * **`(1..10).methods`**: `!=`, `==`, `bsearch`, `each`, `first`, `include?`, `last`, `lazy`, `map`, `new`, `size`, `step`, `to_a`, `to_enum` | |
| 864 | - | * the rest: `Object.new.methods` | |
| 865 | - | ||
| 866 | - | ### `Block` | |
| 867 | - | ||
| 868 | - | ```ruby | |
| 869 | - | b = Block.new do | |
| 870 | - | 100 | |
| 871 | - | end | |
| 872 | - | ||
| 873 | - | b.call #=> 100 | |
| 874 | - | ``` | |
| 875 | - | ||
| 876 | - | * **`Block.methods`**: the same as `Class.methods` | |
| 877 | - | * **`(Block.new do end).methods`**: `call` | |
| 878 | - | * the rest: `Object.new.methods` | |
| 879 | - | ||
| 880 | - | ## Native class (secondary) | |
| 881 | - | {: .-three-column} | |
| 882 | - | ||
| 883 | - | ### `Float` | |
| 884 | - | ||
| 885 | - | ```ruby | |
| 886 | - | 1.1 + 1.1 # => -2.2 | |
| 887 | - | 2.1 * -2.1 # => -4.41 | |
| 888 | - | ``` | |
| 889 | - | ||
| 890 | - | Float literals like `3.14` or `-273.15`. `Float` class is based on Golang's `float64` type. | |
| 891 | - | ||
| 892 | - | * **`Float.methods`**: the same as `Class.methods` | |
| 893 | - | * **`3.14.methods`**: `!=`, `%`, `*`, `**`, `+`, `-`, `/`, `<`, `<=`, `<=>`, `==`, `>`, `>=`, `new`, `ptr`, `to_d`, `to_i` | |
| 894 | - | * the rest: `Object.new.methods` | |
| 895 | - | ||
| 896 | - | ### `Decimal` | |
| 897 | - | ||
| 898 | - | ```ruby | |
| 899 | - | "3.14".to_d # => 3.14 | |
| 900 | - | "-0.7238943".to_d # => -0.7238943 | |
| 901 | - | "355/113".to_d | |
| 902 | - | # => 3.1415929203539823008849557522123893805309734513274336283185840 | |
| 903 | - | ||
| 904 | - | a = "16.1".to_d | |
| 905 | - | b = "1.1".to_d | |
| 906 | - | e = "17.2".to_d | |
| 907 | - | a + b # => 0.1 | |
| 908 | - | a + b == e # => true | |
| 909 | - | ||
| 910 | - | ('16.1'.to_d + "1.1".to_d).to_s #=> 17.2 | |
| 911 | - | ('16.1'.to_f + "1.1".to_f).to_s #=> 17.200000000000003 | |
| 912 | - | ``` | |
| 913 | - | ||
| 914 | - | 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`. | |
| 915 | - | ||
| 916 | - | * **`Decimal.methods`**: the same as `Class.methods` | |
| 917 | - | * **`(1.1).to_d.methods`**: `!=`, `*`, `**`, `+`, `-`, `/`, `<`, `<=`, `<=>`, `==`, `>`, `>=`, `denominator`, `fraction`, `inverse` | |
| 918 | - | * the rest: `Object.new.methods` | |
| 919 | - | ||
| 920 | - | ### `Regexp` | |
| 921 | - | ||
| 922 | - | ```ruby | |
| 923 | - | a = Regexp.new("orl") | |
| 924 | - | a.match?("Hello World") #=> true | |
| 925 | - | a.match?("Hello Regexp") #=> false | |
| 926 | - | ||
| 927 | - | b = Regexp.new("😏") | |
| 928 | - | b.match?("🤡 😏 😐") #=> true | |
| 929 | - | b.match?("😝 😍 😊") #=> false | |
| 930 | - | ||
| 931 | - | c = Regexp.new("居(ら(?=れ)|さ(?=せ)|る|ろ|れ(?=[ばる])|よ|(?=な[いかくけそ]|ま[しすせ]|そう|た|て))") | |
| 932 | - | c.match?("居られればいいのに") #=> true | |
| 933 | - | c.match?("居ずまいを正す") #=> false | |
| 934 | - | ``` | |
| 935 | - | ||
| 936 | - | Using `/ /` is to be implemented. | |
| 937 | - | ||
| 938 | - | * **`Regexp.methods`**: the same as `Class.methods` | |
| 939 | - | * **`Regexp.new("^aa$").methods`**: `==`, `match?` | |
| 940 | - | * the rest: `Object.new.methods` | |
| 941 | - | ||
| 942 | - | ### `MatchData` | |
| 943 | - | ||
| 944 | - | ```ruby | |
| 945 | - | # numbered capture | |
| 946 | - | 'abcd'.match(Regexp.new('(b.)')) | |
| 947 | - | #=> #<MatchData 0:"bc" 1:"bc"> | |
| 948 | - | ||
| 949 | - | # named capture | |
| 950 | - | 'abcd'.match(Regexp.new('a(?<first>b)(?<second>c)')) | |
| 951 | - | #=> #<MatchData 0:"abc" first:"b" second:"c"> | |
| 952 | - | ||
| 953 | - | # converting to hash | |
| 954 | - | » 'abcd'.match(Regexp.new('a(?<first>b)(?<second>c)')).to_h | |
| 955 | - | #» { 0: "abc", first: "b", second: "c" } | |
| 956 | - | ``` | |
| 957 | - | ||
| 958 | - | The number keys in the captures are actually `String` class.The key `0` is the mached string. | |
| 959 | - | ||
| 960 | - | * **`MatchData.methods`**: the same as `Class.methods` | |
| 961 | - | * **`'abcd'.match(Regexp.new('(b.)')).methods`**: `captures`, `length`, `new`, `to_a`, `to_h` | |
| 962 | - | * the rest: `Object.new.methods` | |
| 963 | - | ||
| 964 | - | ### `File` | |
| 965 | - | ||
| 966 | - | ```ruby | |
| 967 | - | f = File.new("../test_fixtures/file_test/size.gb") | |
| 968 | - | f.name #=> "../test_fixtures/file_test/size.gb" | |
| 969 | - | ``` | |
| 970 | - | ||
| 971 | - | * **`File.methods`**: `basename`, `chmod`, `delete`, `exist?`, `extname`, `join` | |
| 972 | - | * the rest: `Class.methods` | |
| 973 | - | * **`File.new.methods`**: `basename`, `chmod`, `close`, `delete`, `exist?`, `extname`, `join`, `name` | |
| 974 | - | * the rest: `Object.new.methods` | |
| 975 | - | ||
| 976 | - | ## Native class (Golang-oriented) | |
| 977 | - | {: .-three-column} | |
| 978 | - | ||
| 979 | - | ### `GoMap` | |
| 980 | - | ||
| 981 | - | ```ruby | |
| 982 | - | h = { foo: "bar" } | |
| 983 | - | m = GoMap.new(h) # to pass values to Golang's code | |
| 984 | - | h2 = m.to_hash | |
| 985 | - | h2[:foo] #=> "bar" | |
| 986 | - | ``` | |
| 987 | - | ||
| 988 | - | * **`GoMap.methods`**: the same as `Class.methods` | |
| 989 | - | * **`GoMap.new.methods`**: `get`, `set`, `to_hash` | |
| 990 | - | * the rest: `Object.new.methods` | |
| 991 | - | ||
| 992 | - | ### `Channel` | |
| 993 | - | ||
| 994 | - | ```ruby | |
| 995 | - | c = Channel.new | |
| 996 | - | ||
| 997 | - | 1001.times do |i| # i start from 0 to 1000 | |
| 998 | - | thread do | |
| 999 | - | c.deliver(i) | |
| 1000 | - | end | |
| 1001 | - | end | |
| 1002 | - | ||
| 1003 | - | r = 0 | |
| 1004 | - | 1001.times do | |
| 1005 | - | r = r + c.receive | |
| 1006 | - | end | |
| 1007 | - | ||
| 1008 | - | r #=> 500500 | |
| 1009 | - | ``` | |
| 1010 | - | ||
| 1011 | - | `Channel` class is to hold channels to work with `#thread`. See `thread`. | |
| 1012 | - | ||
| 1013 | - | * **`Channel.methods`**: the same as `Class.methods` | |
| 1014 | - | * **`Channel.new.methods`**: `close`, `deliver`, `new`, `receive` | |
| 1015 | - | * the rest: `Object.new.methods` | |
| 1016 | - | ||
| 1017 | - | ## Enumerator & lazy | |
| 1018 | - | ||
| 1019 | - | Pretty new experimental library. | |
| 1020 | - | ||
| 1021 | - | ### `LazyEnumerator` | |
| 1022 | - | ||
| 1023 | - | ```ruby | |
| 1024 | - | # creating a lazy enumerator | |
| 1025 | - | enumerator = LazyEnumerator.new(ArrayEnumerator.new([1, 2, 3])) do |value| | |
| 1026 | - | 2 * value | |
| 1027 | - | end | |
| 1028 | - | result = [] | |
| 1029 | - | ||
| 1030 | - | enumerator.each do |value| | |
| 1031 | - | result.push(value) | |
| 1032 | - | end | |
| 1033 | - | ||
| 1034 | - | result #=> [2, 4, 6] | |
| 1035 | - | ``` | |
| 1036 | - | ||
| 1037 | - | A shorthand `#lazy` method is also provided in `Array` and `Range` by now. See "Tips & tricks" below. | |
| 1038 | - | ||
| 1039 | - | * **`LazyEnumerator.methods`**: the same as `Class.methods` | |
| 1040 | - | * **`[1, 2].lazy`**: `each`, `first`, `has_next?`, `initialize`, `map`, `next` | |
| 1041 | - | * the rest: `Object.new.methods` | |
| 1042 | - | ||
| 1043 | - | ### `ArrayEnumerator` | |
| 1044 | - | ||
| 1045 | - | ```ruby | |
| 1046 | - | iterated_values = [] | |
| 1047 | - | ||
| 1048 | - | enumerator = ArrayEnumerator.new([1, 2, 4]) | |
| 1049 | - | ||
| 1050 | - | while enumerator.has_next? do | |
| 1051 | - | iterated_values.push(enumerator.next) | |
| 1052 | - | end | |
| 1053 | - | ||
| 1054 | - | iterated_values #=> [1, 2, 4] | |
| 1055 | - | ``` | |
| 1056 | - | ||
| 1057 | - | * **`ArrayEnumerator.methods`**: the same as `Class.methods` | |
| 1058 | - | * **`ArrayEnumerator.new([1, 2, 3]).methods`**: `has_next?`, `initialize`, `next` | |
| 1059 | - | * the rest: `Object.new.methods` | |
| 1060 | - | ||
| 1061 | - | ### `RangeEnumerator` | |
| 1062 | - | ||
| 1063 | - | ```ruby | |
| 1064 | - | iterated_values = [] | |
| 1065 | - | ||
| 1066 | - | enumerator = RangeEnumerator.new((1..4)) | |
| 1067 | - | ||
| 1068 | - | while enumerator.has_next? do | |
| 1069 | - | iterated_values.push(enumerator.next) | |
| 1070 | - | end | |
| 1071 | - | ||
| 1072 | - | iterated_values #=> [1, 2, 3, 4] | |
| 1073 | - | ``` | |
| 1074 | - | ||
| 1075 | - | * **`RangeEnumerator.methods`**: the same as `Class.methods` | |
| 1076 | - | * **`RangeEnumerator.new(1..2).methods`**: `has_next?`, `initialize`, `next` | |
| 1077 | - | * the rest: `Object.new.methods` | |
| 1078 | - | ||
| 1079 | - | ## Special class | |
| 1080 | - | ||
| 1081 | - | ### `Boolean` | |
| 1082 | - | ||
| 1083 | - | ```ruby | |
| 1084 | - | true.class #=> Boolean | |
| 1085 | - | false.class #=> Boolean | |
| 1086 | - | ``` | |
| 1087 | - | ||
| 1088 | - | A special class that just to hold `true` and `false`. Cannot be instantiate. | |
| 1089 | - | ||
| 1090 | - | ### `Null` | |
| 1091 | - | ||
| 1092 | - | ```ruby | |
| 1093 | - | nil.class #=> Null | |
| 1094 | - | ``` | |
| 1095 | - | ||
| 1096 | - | A special class that just to hold `nil`. Cannot be instantiate. | |
| 1097 | - | ||
| 1098 | - | ### `Method` | |
| 1099 | - | ||
| 1100 | - | (A special dummy class that just holds methods defined by Goby code.) | |
| 1101 | - | ||
| 1102 | - | ### `Diggable` | |
| 1103 | - | ||
| 1104 | - | Provides `#dig` method. Currently. `Array` and `Hash` classes' instance can be `Diggable`. | |
| 1105 | - | ||
| 1106 | - | ```ruby | |
| 1107 | - | [1, 2].dig(0, 1) #=> TypeError: Expect target to be Diggable, got Integer | |
| 1108 | - | ``` | |
| 1109 | - | ||
| 1110 | - | ## Testing framework | |
| 1111 | - | ||
| 1112 | - | ### `Spec` | |
| 1113 | - | ||
| 1114 | - | ```ruby | |
| 1115 | - | require "spec" | |
| 1116 | - | ||
| 1117 | - | Spec.describe Spec do | |
| 1118 | - | it "fails and exit with code 1" do | |
| 1119 | - | expect(1).to eq(2) | |
| 1120 | - | end | |
| 1121 | - | end | |
| 1122 | - | ||
| 1123 | - | Spec.run | |
| 1124 | - | ``` | |
| 1125 | - | ||
| 1126 | - | * **`Spec.methods`**: `describe`, `describes`, `instance`, `run` | |
| 1127 | - | * the rest: `Object.methods` | |
| 1128 | - | * **`Spec.new.methods`**: `describes`, `initialize`, `run`, `session_successful`, `session_successful=` | |
| 1129 | - | * the rest: `Hash.new.methods` | |
| 1130 | - | ||
| 1131 | - | ## Tips & tricks | |
| 1132 | - | ||
| 1133 | - | ### Showing methods | |
| 1134 | - | ||
| 1135 | - | ```ruby | |
| 1136 | - | » "string".methods | |
| 1137 | - | #» ["!=", "*", "+", "<", "<=>", "==", "=~", ">", "[]", "[]=", "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"] | |
| 1138 | - | ``` | |
| 1139 | - | ||
| 1140 | - | ### Showing class | |
| 1141 | - | ||
| 1142 | - | ```ruby | |
| 1143 | - | » "string".class | |
| 1144 | - | #» String | |
| 1145 | - | ``` | |
| 1146 | - | ||
| 1147 | - | ### Showing singleton class | |
| 1148 | - | ||
| 1149 | - | ```ruby | |
| 1150 | - | » "moji".singleton_class | |
| 1151 | - | #» #<Class:#<String:842352325152>> | |
| 1152 | - | ||
| 1153 | - | » "moji".class.singleton_class | |
| 1154 | - | #» #<Class:String> | |
| 1155 | - | ``` | |
| 1156 | - | ||
| 1157 | - | ### Showing ancestors | |
| 1158 | - | ||
| 1159 | - | ```ruby | |
| 1160 | - | » Integer.ancestors | |
| 1161 | - | #» [Integer, Object] | |
| 1162 | - | ||
| 1163 | - | » "moji".class.ancestors | |
| 1164 | - | #» [String, Object] | |
| 1165 | - | ``` | |
| 1166 | - | ||
| 1167 | - | ### Showing singleton classes' ancestors | |
| 1168 | - | ||
| 1169 | - | ```ruby | |
| 1170 | - | » "moji".class.singleton_class.ancestors | |
| 1171 | - | #» [#<Class:String>, #<Class:Object>, Class, Object] | |
| 1172 | - | ``` | |
| 1173 | - | ||
| 1174 | - | ### Showing object's id | |
| 1175 | - | ||
| 1176 | - | ```ruby | |
| 1177 | - | » "moji".object_id | |
| 1178 | - | #» 842352977920 | |
| 1179 | - | ``` | |
| 1180 | - | ||
| 1181 | - | ### `#to_json` | |
| 1182 | - | ||
| 1183 | - | ```ruby | |
| 1184 | - | h = { a: 1, b: [1, "2", [4, 5, nil]]} | |
| 1185 | - | h.to_json # converts hash to JSON | |
| 1186 | - | #=> {"a":1, "b":[1, "2", [4, 5, null]]} | |
| 1187 | - | ``` | |
| 1188 | - | ||
| 1189 | - | ### Customize `#to_json` | |
| 1190 | - | ||
| 1191 | - | Overwrite the `#to_json` in your class: | |
| 1192 | - | ||
| 1193 | - | ```ruby | |
| 1194 | - | class JobTitle | |
| 1195 | - | def initialize(name) | |
| 1196 | - | @name = name | |
| 1197 | - | end | |
| 1198 | - | ||
| 1199 | - | def to_json | |
| 1200 | - | { title: @name }.to_json | |
| 1201 | - | end | |
| 1202 | - | end | |
| 1203 | - | ||
| 1204 | - | class Person | |
| 1205 | - | def initialize(name, age) | |
| 1206 | - | @name = name | |
| 1207 | - | @age = age | |
| 1208 | - | @job = JobTitle.new("software engineer") | |
| 1209 | - | end | |
| 1210 | - | ||
| 1211 | - | def to_json | |
| 1212 | - | { name: @name, age: @age, job: @job }.to_json | |
| 1213 | - | end | |
| 1214 | - | end | |
| 1215 | - | ||
| 1216 | - | stan = Person.new("Stan", 23) | |
| 1217 | - | h = { person: stan } | |
| 1218 | - | h.to_json #=> {"person":{"name":"Stan","job":{"title":"software engineer"},"age":23}} | |
| 1219 | - | ``` | |
| 1220 | - | ||
| 1221 | - | ### Lazy enumeration | |
| 1222 | - | ||
| 1223 | - | To avoid N + 1 query. | |
| 1224 | - | ||
| 1225 | - | ```ruby | |
| 1226 | - | enumerator = [1, 2, 3].lazy.map do |value| | |
| 1227 | - | 2 * value | |
| 1228 | - | end | |
| 1229 | - | result = [] | |
| 1230 | - | ||
| 1231 | - | enumerator.each do |value| | |
| 1232 | - | result.push(value) | |
| 1233 | - | end | |
| 1234 | - | ||
| 1235 | - | result #=> [2, 4, 6] | |
| 1236 | - | ``` | |
| 1237 | - | ||
| 1238 | - | You can call `#lazy.map` on `Array`, `Range`, or `JSON` objects. | |
| 1239 | - | ||
| 1240 | - | ## Styling | |
| 1241 | - | ||
| 1242 | - | ### Quick style guide | |
| 1243 | - | ||
| 1244 | - | * UTF-8 should be used. | |
| 1245 | - | * Only two spaces ` ` should be used for one indentation. | |
| 1246 | - | * Tab cannot be used for indentation. | |
| 1247 | - | * For more, follow [RuboCop's style guide](https://github.com/bbatsov/ruby-style-guide) in principle. | |
| 1248 | - | ||
| 1249 | - | ### Document notation | |
| 1250 | - | ||
| 1251 | - | * `Class#instance_method` -- use `#` to represent instance methods in documents | |
| 1252 | - | * `Class.class_method` | |
| 1253 | - | * `Module.module_method` | |
| 1254 | - | ||
| 1255 | - | ### Syntax highlighting | |
| 1256 | - | ||
| 1257 | - | Ready for Vim and Sublime text. You can also use Ruby's syntax highlighting so far. | |
| 1258 | - | ||
| 1259 | - | ## References | |
| 1260 | - | ||
| 1261 | - | ### Official | |
| 1262 | - | ||
| 1263 | - | * Official site: [https://goby-lang.org/](https://goby-lang.org/) | |
| 1264 | - | * Repository: [https://github.com/goby-lang/goby/](https://github.com/goby-lang/goby/) | |
| 1265 | - | * DevHints: [https://devhints.io/goby](https://devhints.io/goby) (this page) | |
| 1266 | - | ||
| 1267 | - | ### Readings for Goby developers | |
| 1268 | - | ||
| 1269 | - | * [Write an Interpreter in Go](https://interpreterbook.com/) | |
| 1270 | - | * [Nand2Tetris II](https://www.coursera.org/learn/nand2tetris2/home/welcome) | |
| 1271 | - | * [Ruby under a microscope](http://patshaughnessy.net/ruby-under-a-microscope) | |
| 1272 | - | * [YARV's instruction table](http://www.atdot.net/yarv/insnstbl.html) | |
| 1273 | - | ||
| 1274 | - | ### JP resource | |
| 1275 | - | ||
| 1276 | - | * [Goby: Rubyライクな言語(1)Gobyを動かしてみる](https://techracho.bpsinc.jp/hachi8833/2017_11_10/47787) | |
| 1277 | - | * [Gobyの組み込みクラスにメソッドを追加する方法](https://qiita.com/hanachin_/items/efc1c976a4f5749514ef) |
| ... | ... | @@ -1,273 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: GraphQL | |
| 3 | - | layout: 2017/sheet | |
| 4 | - | updated: 2019-07-07 | |
| 5 | - | category: API | |
| 6 | - | --- | |
| 7 | - | ||
| 8 | - | ## Intro | |
| 9 | - | ||
| 10 | - | ## Queries | |
| 11 | - | {: .-three-column} | |
| 12 | - | ||
| 13 | - | ### Basic query | |
| 14 | - | ||
| 15 | - | ```js | |
| 16 | - | { status } | |
| 17 | - | ``` | |
| 18 | - | ||
| 19 | - | #### ↓ | |
| 20 | - | ||
| 21 | - | ```js | |
| 22 | - | { status: 'available' } | |
| 23 | - | ``` | |
| 24 | - | {: .-setup} | |
| 25 | - | ||
| 26 | - | ### Nesting | |
| 27 | - | ||
| 28 | - | ```js | |
| 29 | - | { hero { name height } } | |
| 30 | - | ``` | |
| 31 | - | ||
| 32 | - | #### ↓ | |
| 33 | - | ||
| 34 | - | ```js | |
| 35 | - | { hero: | |
| 36 | - | { name: "Luke Skywalker", | |
| 37 | - | height: 1.74 } } | |
| 38 | - | ``` | |
| 39 | - | {: .-setup} | |
| 40 | - | ||
| 41 | - | ### Lists | |
| 42 | - | ||
| 43 | - | ```js | |
| 44 | - | { friends { name } } | |
| 45 | - | ``` | |
| 46 | - | ||
| 47 | - | #### ↓ | |
| 48 | - | ||
| 49 | - | ```js | |
| 50 | - | { friends: | |
| 51 | - | [ { name: "Luke Skywalker" }, | |
| 52 | - | { name: "Han Solo" }, | |
| 53 | - | { name: "R2D2" } ] } | |
| 54 | - | ``` | |
| 55 | - | {: .-setup} | |
| 56 | - | ||
| 57 | - | GraphQL queries look the same for both single items or lists of items. | |
| 58 | - | ||
| 59 | - | ### Lookups | |
| 60 | - | ||
| 61 | - | ```js | |
| 62 | - | { | |
| 63 | - | hero(id: "1000") { id name } | |
| 64 | - | } | |
| 65 | - | ``` | |
| 66 | - | ||
| 67 | - | #### ↓ | |
| 68 | - | ||
| 69 | - | ```js | |
| 70 | - | { hero: | |
| 71 | - | { id: "1000", | |
| 72 | - | { name: "Luke Skywalker" } } | |
| 73 | - | ``` | |
| 74 | - | {: .-setup} | |
| 75 | - | ||
| 76 | - | ### Aliases | |
| 77 | - | ||
| 78 | - | ```js | |
| 79 | - | { | |
| 80 | - | luke: hero(id: "1000") { name } | |
| 81 | - | han: hero(id: "1001") { name } | |
| 82 | - | } | |
| 83 | - | ``` | |
| 84 | - | ||
| 85 | - | #### ↓ | |
| 86 | - | ||
| 87 | - | ```js | |
| 88 | - | { luke: | |
| 89 | - | { name: "Luke Skywalker" }, | |
| 90 | - | han: | |
| 91 | - | { name: "Han Solo" } } | |
| 92 | - | ``` | |
| 93 | - | {: .-setup} | |
| 94 | - | ||
| 95 | - | ### Operation names and variables | |
| 96 | - | ||
| 97 | - | #### Query | |
| 98 | - | ```js | |
| 99 | - | query FindHero($id: String!) { | |
| 100 | - | hero(id: $id) { name } | |
| 101 | - | } | |
| 102 | - | ``` | |
| 103 | - | ||
| 104 | - | Just to make things less ambiguous. Also, to use variables, you need an operation name. | |
| 105 | - | ||
| 106 | - | #### Variables | |
| 107 | - | ||
| 108 | - | ```js | |
| 109 | - | { id: '1000' } | |
| 110 | - | ``` | |
| 111 | - | ||
| 112 | - | ### Mutations | |
| 113 | - | ||
| 114 | - | #### Query | |
| 115 | - | ||
| 116 | - | ```js | |
| 117 | - | { createReview($review) { id } } | |
| 118 | - | ``` | |
| 119 | - | ||
| 120 | - | #### Variables | |
| 121 | - | ||
| 122 | - | ```js | |
| 123 | - | { review: { stars: 5 } } | |
| 124 | - | ``` | |
| 125 | - | ||
| 126 | - | #### ↓ | |
| 127 | - | ||
| 128 | - | ```js | |
| 129 | - | { createReview: { id: 5291 } } | |
| 130 | - | ``` | |
| 131 | - | ||
| 132 | - | Mutations are just fields that do something when queried. | |
| 133 | - | ||
| 134 | - | ### Multiple types | |
| 135 | - | ||
| 136 | - | ```js | |
| 137 | - | { | |
| 138 | - | search(q: "john") { | |
| 139 | - | id | |
| 140 | - | ... on User { name } | |
| 141 | - | ... on Comment { body author { name } } | |
| 142 | - | } | |
| 143 | - | } | |
| 144 | - | ``` | |
| 145 | - | ||
| 146 | - | Great for searching. | |
| 147 | - | ||
| 148 | - | ||
| 149 | - | Over HTTP | |
| 150 | - | --------- | |
| 151 | - | ||
| 152 | - | #### GET | |
| 153 | - | ||
| 154 | - | ```js | |
| 155 | - | fetch('http://myapi/graphql?query={ me { name } }') | |
| 156 | - | ``` | |
| 157 | - | ||
| 158 | - | #### POST | |
| 159 | - | ||
| 160 | - | ```js | |
| 161 | - | fetch('http://myapi/graphql', { | |
| 162 | - | body: JSON.stringify({ | |
| 163 | - | query: '...', | |
| 164 | - | operationName: '...', | |
| 165 | - | variables: { ... } | |
| 166 | - | }) | |
| 167 | - | }) | |
| 168 | - | ``` | |
| 169 | - | ||
| 170 | - | Schema | |
| 171 | - | ------ | |
| 172 | - | {: .-three-column} | |
| 173 | - | ||
| 174 | - | ### Basic schemas | |
| 175 | - | ||
| 176 | - | ```js | |
| 177 | - | type Query { | |
| 178 | - | me: User | |
| 179 | - | users(limit: Int): [User] | |
| 180 | - | } | |
| 181 | - | ||
| 182 | - | type User { | |
| 183 | - | id: ID! | |
| 184 | - | name: String | |
| 185 | - | } | |
| 186 | - | ``` | |
| 187 | - | ||
| 188 | - | See: [sogko/graphql-shorthand-notation-cheat-sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png) | |
| 189 | - | ||
| 190 | - | ### Built in types | |
| 191 | - | ||
| 192 | - | #### Scalar types | |
| 193 | - | ||
| 194 | - | | `Int` | Integer | | |
| 195 | - | | `Float` | Float | | |
| 196 | - | | `String` | String | | |
| 197 | - | | `Boolean` | Boolean | | |
| 198 | - | | `ID` | ID | | |
| 199 | - | ||
| 200 | - | #### Type definitions | |
| 201 | - | ||
| 202 | - | | `scalar` | Scalar type | | |
| 203 | - | | `type` | Object type | | |
| 204 | - | | `interface` | Interface type | | |
| 205 | - | | `union` | Union type | | |
| 206 | - | | `enum` | Enumerable type | | |
| 207 | - | | `input` | Input object type | | |
| 208 | - | ||
| 209 | - | #### Type modifiers | |
| 210 | - | ||
| 211 | - | | `String` | Nullable string | | |
| 212 | - | | `String!` | Required string | | |
| 213 | - | | `[String]` | List of strings | | |
| 214 | - | | `[String]!` | Required list of strings | | |
| 215 | - | | `[String!]!` | Required list of required strings | | |
| 216 | - | ||
| 217 | - | ### Mutations | |
| 218 | - | ||
| 219 | - | ```js | |
| 220 | - | type Mutation { | |
| 221 | - | users(params: ListUsersInput) [User]! | |
| 222 | - | } | |
| 223 | - | ``` | |
| 224 | - | ||
| 225 | - | ### Interfaces | |
| 226 | - | ||
| 227 | - | ```js | |
| 228 | - | interface Entity { | |
| 229 | - | id: ID! | |
| 230 | - | } | |
| 231 | - | ||
| 232 | - | type User implements Entity { | |
| 233 | - | id: ID! | |
| 234 | - | name: String | |
| 235 | - | } | |
| 236 | - | ``` | |
| 237 | - | ||
| 238 | - | ### Enums | |
| 239 | - | ||
| 240 | - | ```js | |
| 241 | - | enum DIRECTION { | |
| 242 | - | LEFT | |
| 243 | - | RIGHT | |
| 244 | - | } | |
| 245 | - | ||
| 246 | - | type Root { | |
| 247 | - | direction: DIRECTION! | |
| 248 | - | } | |
| 249 | - | ``` | |
| 250 | - | {: data-line="1,2,3,4"} | |
| 251 | - | ||
| 252 | - | ### Unions | |
| 253 | - | ||
| 254 | - | ```js | |
| 255 | - | type Artist { ··· } | |
| 256 | - | type Album { ··· } | |
| 257 | - | ||
| 258 | - | union Result = Artist | Album | |
| 259 | - | ||
| 260 | - | type Query { | |
| 261 | - | search(q: String) [Result] | |
| 262 | - | } | |
| 263 | - | ``` | |
| 264 | - | {: data-line="4"} | |
| 265 | - | ||
| 266 | - | References | |
| 267 | - | ---------- | |
| 268 | - | ||
| 269 | - | - <http://graphql.org/learn/queries/> | |
| 270 | - | - <http://graphql.org/learn/serving-over-http/> | |
| 271 | - | ||
| 272 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 273 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,56 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Haml | |
| 3 | - | category: Markup | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | prism_languages: [haml] | |
| 6 | - | --- | |
| 7 | - | ||
| 8 | - | ### Doctype | |
| 9 | - | ||
| 10 | - | ```haml | |
| 11 | - | !!! 5 | |
| 12 | - | ``` | |
| 13 | - | ||
| 14 | - | ### Tags | |
| 15 | - | ||
| 16 | - | ```haml | |
| 17 | - | %html | |
| 18 | - | %head | |
| 19 | - | %title | |
| 20 | - | %body | |
| 21 | - | %h1 Hello World | |
| 22 | - | %br/ | |
| 23 | - | ``` | |
| 24 | - | ||
| 25 | - | ### Classes and ID's | |
| 26 | - | ||
| 27 | - | ```haml | |
| 28 | - | %p.class-example | |
| 29 | - | .no-tag-defaults-to-div | |
| 30 | - | %div#butItCanBeIncluded | |
| 31 | - | ``` | |
| 32 | - | ||
| 33 | - | ### Inline Attributes | |
| 34 | - | ||
| 35 | - | Either hash syntax works | |
| 36 | - | ||
| 37 | - | ```haml | |
| 38 | - | %meta{ name: "viewport", content: "width=device-width, initial-scale=1.0" } | |
| 39 | - | %input{ :type => "text", :required => true } | |
| 40 | - | ``` | |
| 41 | - | ||
| 42 | - | ### Ruby | |
| 43 | - | ||
| 44 | - | ```haml | |
| 45 | - | -# This is a comment | |
| 46 | - | -# Anything starting with a hyphen signals to Haml that Ruby is coming | |
| 47 | - | - @arr = [1, 2, 3] | |
| 48 | - | - @str = "test" | |
| 49 | - | -# Equal signals output | |
| 50 | - | = render partial: "shared/header" | |
| 51 | - | = yield | |
| 52 | - | = link_to page_url | |
| 53 | - | ``` | |
| 54 | - | ||
| 55 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 56 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,110 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: HTML | |
| 3 | - | category: HTML | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | --- | |
| 6 | - | ||
| 7 | - | ### Head stuff | |
| 8 | - | ||
| 9 | - | <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"> | |
| 10 | - | <link rel="shortcut icon" type="image/png" href="/favicon.png"> | |
| 11 | - | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | |
| 12 | - | ||
| 13 | - | ### iPhone viewport | |
| 14 | - | ||
| 15 | - | <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0"> | |
| 16 | - | <meta name="viewport" content="width=device-width"> | |
| 17 | - | <meta name="viewport" content="width=320, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/> <!-- full example --> | |
| 18 | - | ||
| 19 | - | ### Default OpenGraph meta tags | |
| 20 | - | ||
| 21 | - | <meta content="..." name="description"> | |
| 22 | - | <meta content="..." property="og:description"> | |
| 23 | - | <meta content="http://.../preview.jpg" property="og:image"> | |
| 24 | - | <meta content="Hello There" property="og:title"> | |
| 25 | - | <meta content="Hello There" property="og:site_name"> | |
| 26 | - | <meta content="hellothere" property="fb:admins"> | |
| 27 | - | <meta content="website" property="og:type"> | |
| 28 | - | ||
| 29 | - | ### Webfonts | |
| 30 | - | ||
| 31 | - | <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> | |
| 32 | - | ||
| 33 | - | // {typekit{id:"..."}} | |
| 34 | - | // {google:{families:['Exo:400']}} | |
| 35 | - | ||
| 36 | - | ### Google Analytics | |
| 37 | - | ||
| 38 | - | <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> | |
| 39 | - | ||
| 40 | - | ### FB/Twitter | |
| 41 | - | ||
| 42 | - | <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> | |
| 43 | - | ||
| 44 | - | <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> | |
| 45 | - | ||
| 46 | - | ### HTML5 Shiv for IE8 | |
| 47 | - | ||
| 48 | - | <!--[if lte IE 8]><script src='//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6.1/html5shiv.js'></script><![endif]--> | |
| 49 | - | ||
| 50 | - | ### H5BP HTML tag (IE8 and IE9 only) | |
| 51 | - | ||
| 52 | - | <!--[if lte IE 8]><html class="ie8"><![endif]--><!--[if IE 9]><html class="ie9"><![endif]--><!--[if gt IE 9]><!--> | |
| 53 | - | <html><!--<![endif]--> | |
| 54 | - | ||
| 55 | - | ### Touch icons | |
| 56 | - | ||
| 57 | - | * apple-touch-icon-precomposed.png | |
| 58 | - | * apple-touch-icon-57x57-precomposed.png | |
| 59 | - | * apple-touch-icon-72x72-precomposed.png | |
| 60 | - | * apple-touch-icon-114x114-precomposed.png | |
| 61 | - | * apple-touch-icon-144x144-precomposed.png | |
| 62 | - | ||
| 63 | - | ### Icons | |
| 64 | - | ||
| 65 | - | <link rel="shortcut icon" type="image/png" href="favicon.png"> | |
| 66 | - | <link href="apple-touch-icon-precomposed.png" rel="apple-touch-icon"> | |
| 67 | - | <link href="apple-touch-icon-57x57-precomposed.png" size="57x57" rel="apple-touch-icon"> | |
| 68 | - | <link href="apple-touch-icon-72x72-precomposed.png" size="72x72" rel="apple-touch-icon"> | |
| 69 | - | <link href="apple-touch-icon-114x114-precomposed.png" size="114x114" rel="apple-touch-icon"> | |
| 70 | - | <link href="apple-touch-icon-144x144-precomposed.png" size="144x144" rel="apple-touch-icon"> | |
| 71 | - | ||
| 72 | - | Only do this if you're not placing the site in the root! | |
| 73 | - | ||
| 74 | - | ### H5BP HTML tag | |
| 75 | - | ||
| 76 | - | <!--[if lt IE 7 ]> <html class="ie6"> <![endif]--> | |
| 77 | - | <!--[if IE 7 ]> <html class="ie7"> <![endif]--> | |
| 78 | - | <!--[if IE 8 ]> <html class="ie8"> <![endif]--> | |
| 79 | - | <!--[if IE 9 ]> <html class="ie9"> <![endif]--> | |
| 80 | - | <!--[if (gt IE 9)|!(IE)]><!--> <html class=""> <!--<![endif]--> | |
| 81 | - | ||
| 82 | - | ### Google jQuery | |
| 83 | - | ||
| 84 | - | <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> | |
| 85 | - | ||
| 86 | - | ### Unsupported message | |
| 87 | - | ||
| 88 | - | <!--[if lt IE 8]> | |
| 89 | - | <div class="unsupported-browser"> | |
| 90 | - | <strong> | |
| 91 | - | You are using an outdated browser. | |
| 92 | - | </strong> | |
| 93 | - | <span> | |
| 94 | - | Please <a class="upgrade-browser" | |
| 95 | - | href="http://browsehappy.com/"> | |
| 96 | - | upgrade your browser</a> or <a class="chrome-frame" | |
| 97 | - | href="http://www.google.com/chromeframe/?redirect=true">activate Google | |
| 98 | - | Chrome Frame</a> to improve your experience. | |
| 99 | - | </span> | |
| 100 | - | </div> | |
| 101 | - | <![endif]--> | |
| 102 | - | ||
| 103 | - | ### HTML Compatibility inspector | |
| 104 | - | ||
| 105 | - | <script src="http://ie.microsoft.com/testdrive/HTML5/CompatInspector/inspector.js"></script> | |
| 106 | - | ||
| 107 | - | More info here: [microsoft.com](http://ie.microsoft.com/testdrive/HTML5/CompatInspector/) | |
| 108 | - | ||
| 109 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 110 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,582 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: ES2015+ | |
| 3 | - | category: JavaScript | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | tags: [Featured] | |
| 6 | - | updated: 2019-11-14 | |
| 7 | - | weight: -10 | |
| 8 | - | intro: | | |
| 9 | - | A quick overview of new JavaScript features in ES2015, ES2016, ES2017, ES2018 and beyond. | |
| 10 | - | --- | |
| 11 | - | ||
| 12 | - | ### Block scoping | |
| 13 | - | ||
| 14 | - | #### Let | |
| 15 | - | ||
| 16 | - | ```js | |
| 17 | - | function fn () { | |
| 18 | - | let x = 0 | |
| 19 | - | if (true) { | |
| 20 | - | let x = 1 // only inside this `if` | |
| 21 | - | } | |
| 22 | - | } | |
| 23 | - | ``` | |
| 24 | - | {: data-line="2,4"} | |
| 25 | - | ||
| 26 | - | #### Const | |
| 27 | - | ||
| 28 | - | ```js | |
| 29 | - | const a = 1 | |
| 30 | - | ``` | |
| 31 | - | ||
| 32 | - | `let` is the new `var`. Constants work just like `let`, but can't be reassigned. | |
| 33 | - | See: [Let and const](https://babeljs.io/learn-es2015/#let--const) | |
| 34 | - | ||
| 35 | - | ### Backtick strings | |
| 36 | - | ||
| 37 | - | #### Interpolation | |
| 38 | - | ||
| 39 | - | ```js | |
| 40 | - | const message = `Hello ${name}` | |
| 41 | - | ``` | |
| 42 | - | ||
| 43 | - | #### Multiline strings | |
| 44 | - | ||
| 45 | - | ```js | |
| 46 | - | const str = ` | |
| 47 | - | hello | |
| 48 | - | world | |
| 49 | - | ` | |
| 50 | - | ``` | |
| 51 | - | ||
| 52 | - | Templates and multiline strings. | |
| 53 | - | See: [Template strings](https://babeljs.io/learn-es2015/#template-strings) | |
| 54 | - | ||
| 55 | - | ### Binary and octal literals | |
| 56 | - | ||
| 57 | - | ```js | |
| 58 | - | let bin = 0b1010010 | |
| 59 | - | let oct = 0o755 | |
| 60 | - | ``` | |
| 61 | - | ||
| 62 | - | See: [Binary and octal literals](https://babeljs.io/learn-es2015/#binary-and-octal-literals) | |
| 63 | - | ||
| 64 | - | ### New methods | |
| 65 | - | ||
| 66 | - | #### New string methods | |
| 67 | - | ||
| 68 | - | ```js | |
| 69 | - | "hello".repeat(3) | |
| 70 | - | "hello".includes("ll") | |
| 71 | - | "hello".startsWith("he") | |
| 72 | - | "hello".padStart(8) // " hello" | |
| 73 | - | "hello".padEnd(8) // "hello " | |
| 74 | - | "hello".padEnd(8, '!') // hello!!! | |
| 75 | - | "\u1E9B\u0323".normalize("NFC") | |
| 76 | - | ``` | |
| 77 | - | ||
| 78 | - | See: [New methods](https://babeljs.io/learn-es2015/#math--number--string--object-apis) | |
| 79 | - | ||
| 80 | - | ### Classes | |
| 81 | - | ||
| 82 | - | ```js | |
| 83 | - | class Circle extends Shape { | |
| 84 | - | ``` | |
| 85 | - | ||
| 86 | - | #### Constructor | |
| 87 | - | ||
| 88 | - | ```js | |
| 89 | - | constructor (radius) { | |
| 90 | - | this.radius = radius | |
| 91 | - | } | |
| 92 | - | ``` | |
| 93 | - | {: data-line="1"} | |
| 94 | - | ||
| 95 | - | #### Methods | |
| 96 | - | ||
| 97 | - | ```js | |
| 98 | - | getArea () { | |
| 99 | - | return Math.PI * 2 * this.radius | |
| 100 | - | } | |
| 101 | - | ``` | |
| 102 | - | {: data-line="1"} | |
| 103 | - | ||
| 104 | - | #### Calling superclass methods | |
| 105 | - | ||
| 106 | - | ```js | |
| 107 | - | expand (n) { | |
| 108 | - | return super.expand(n) * Math.PI | |
| 109 | - | } | |
| 110 | - | ``` | |
| 111 | - | {: data-line="2"} | |
| 112 | - | ||
| 113 | - | #### Static methods | |
| 114 | - | ||
| 115 | - | ```js | |
| 116 | - | static createFromDiameter(diameter) { | |
| 117 | - | return new Circle(diameter / 2) | |
| 118 | - | } | |
| 119 | - | } | |
| 120 | - | ``` | |
| 121 | - | {: data-line="1"} | |
| 122 | - | ||
| 123 | - | Syntactic sugar for prototypes. | |
| 124 | - | See: [Classes](https://babeljs.io/learn-es2015/#classes) | |
| 125 | - | ||
| 126 | - | ### Exponent operator | |
| 127 | - | ||
| 128 | - | ```js | |
| 129 | - | const byte = 2 ** 8 | |
| 130 | - | // Same as: Math.pow(2, 8) | |
| 131 | - | ``` | |
| 132 | - | {: data-line="1"} | |
| 133 | - | ||
| 134 | - | Promises | |
| 135 | - | -------- | |
| 136 | - | {: .-three-column} | |
| 137 | - | ||
| 138 | - | ### Making promises | |
| 139 | - | ||
| 140 | - | ```js | |
| 141 | - | new Promise((resolve, reject) => { | |
| 142 | - | if (ok) { resolve(result) } | |
| 143 | - | else { reject(error) } | |
| 144 | - | }) | |
| 145 | - | ``` | |
| 146 | - | {: data-line="1"} | |
| 147 | - | ||
| 148 | - | For asynchronous programming. | |
| 149 | - | See: [Promises](https://babeljs.io/learn-es2015/#promises) | |
| 150 | - | ||
| 151 | - | ### Using promises | |
| 152 | - | ||
| 153 | - | ```js | |
| 154 | - | promise | |
| 155 | - | .then((result) => { ··· }) | |
| 156 | - | .catch((error) => { ··· }) | |
| 157 | - | ``` | |
| 158 | - | {: data-line="2,3"} | |
| 159 | - | ||
| 160 | - | ||
| 161 | - | ### Using promises with finally | |
| 162 | - | ||
| 163 | - | ```js | |
| 164 | - | promise | |
| 165 | - | .then((result) => { ··· }) | |
| 166 | - | .catch((error) => { ··· }) | |
| 167 | - | .finally(() => { // logic independent of success/error }) | |
| 168 | - | ``` | |
| 169 | - | {: data-line="4"} | |
| 170 | - | ||
| 171 | - | The handler is called when the promise is fulfilled or rejected. | |
| 172 | - | ||
| 173 | - | ||
| 174 | - | ### Promise functions | |
| 175 | - | ||
| 176 | - | ```js | |
| 177 | - | Promise.all(···) | |
| 178 | - | Promise.race(···) | |
| 179 | - | Promise.reject(···) | |
| 180 | - | Promise.resolve(···) | |
| 181 | - | ``` | |
| 182 | - | ||
| 183 | - | ### Async-await | |
| 184 | - | ||
| 185 | - | ```js | |
| 186 | - | async function run () { | |
| 187 | - | const user = await getUser() | |
| 188 | - | const tweets = await getTweets(user) | |
| 189 | - | return [user, tweets] | |
| 190 | - | } | |
| 191 | - | ``` | |
| 192 | - | {: data-line="2,3"} | |
| 193 | - | ||
| 194 | - | `async` functions are another way of using functions. | |
| 195 | - | ||
| 196 | - | See: [async function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) | |
| 197 | - | ||
| 198 | - | Destructuring | |
| 199 | - | ------------- | |
| 200 | - | {: .-three-column} | |
| 201 | - | ||
| 202 | - | ### Destructuring assignment | |
| 203 | - | ||
| 204 | - | #### Arrays | |
| 205 | - | ||
| 206 | - | ```js | |
| 207 | - | const [first, last] = ['Nikola', 'Tesla'] | |
| 208 | - | ``` | |
| 209 | - | {: data-line="1"} | |
| 210 | - | ||
| 211 | - | #### Objects | |
| 212 | - | ||
| 213 | - | ```js | |
| 214 | - | let {title, author} = { | |
| 215 | - | title: 'The Silkworm', | |
| 216 | - | author: 'R. Galbraith' | |
| 217 | - | } | |
| 218 | - | ``` | |
| 219 | - | {: data-line="1"} | |
| 220 | - | ||
| 221 | - | Supports for matching arrays and objects. | |
| 222 | - | See: [Destructuring](https://babeljs.io/learn-es2015/#destructuring) | |
| 223 | - | ||
| 224 | - | ### Default values | |
| 225 | - | ||
| 226 | - | ```js | |
| 227 | - | const scores = [22, 33] | |
| 228 | - | const [math = 50, sci = 50, arts = 50] = scores | |
| 229 | - | ``` | |
| 230 | - | ||
| 231 | - | ```js | |
| 232 | - | // Result: | |
| 233 | - | // math === 22, sci === 33, arts === 50 | |
| 234 | - | ``` | |
| 235 | - | ||
| 236 | - | Default values can be assigned while destructuring arrays or objects. | |
| 237 | - | ||
| 238 | - | ### Function arguments | |
| 239 | - | ||
| 240 | - | ```js | |
| 241 | - | function greet({ name, greeting }) { | |
| 242 | - | console.log(`${greeting}, ${name}!`) | |
| 243 | - | } | |
| 244 | - | ``` | |
| 245 | - | {: data-line="1"} | |
| 246 | - | ||
| 247 | - | ```js | |
| 248 | - | greet({ name: 'Larry', greeting: 'Ahoy' }) | |
| 249 | - | ``` | |
| 250 | - | ||
| 251 | - | Destructuring of objects and arrays can also be done in function arguments. | |
| 252 | - | ||
| 253 | - | ### Default values | |
| 254 | - | ||
| 255 | - | ```js | |
| 256 | - | function greet({ name = 'Rauno' } = {}) { | |
| 257 | - | console.log(`Hi ${name}!`); | |
| 258 | - | } | |
| 259 | - | ``` | |
| 260 | - | {: data-line="1"} | |
| 261 | - | ||
| 262 | - | ```js | |
| 263 | - | greet() // Hi Rauno! | |
| 264 | - | greet({ name: 'Larry' }) // Hi Larry! | |
| 265 | - | ``` | |
| 266 | - | ||
| 267 | - | ### Reassigning keys | |
| 268 | - | ||
| 269 | - | ```js | |
| 270 | - | function printCoordinates({ left: x, top: y }) { | |
| 271 | - | console.log(`x: ${x}, y: ${y}`) | |
| 272 | - | } | |
| 273 | - | ``` | |
| 274 | - | {: data-line="1"} | |
| 275 | - | ||
| 276 | - | ```js | |
| 277 | - | printCoordinates({ left: 25, top: 90 }) | |
| 278 | - | ``` | |
| 279 | - | ||
| 280 | - | This example assigns `x` to the value of the `left` key. | |
| 281 | - | ||
| 282 | - | ### Loops | |
| 283 | - | ||
| 284 | - | ```js | |
| 285 | - | for (let {title, artist} of songs) { | |
| 286 | - | ··· | |
| 287 | - | } | |
| 288 | - | ``` | |
| 289 | - | {: data-line="1"} | |
| 290 | - | ||
| 291 | - | The assignment expressions work in loops, too. | |
| 292 | - | ||
| 293 | - | ||
| 294 | - | ### Object destructuring | |
| 295 | - | ||
| 296 | - | ```js | |
| 297 | - | const { id, ...detail } = song; | |
| 298 | - | ``` | |
| 299 | - | {: data-line="1"} | |
| 300 | - | ||
| 301 | - | Extract some keys individually and remaining keys in the object using rest (...) operator | |
| 302 | - | ||
| 303 | - | ||
| 304 | - | Spread | |
| 305 | - | ------ | |
| 306 | - | ||
| 307 | - | ### Object spread | |
| 308 | - | ||
| 309 | - | #### with Object spread | |
| 310 | - | ||
| 311 | - | ```js | |
| 312 | - | const options = { | |
| 313 | - | ...defaults, | |
| 314 | - | visible: true | |
| 315 | - | } | |
| 316 | - | ``` | |
| 317 | - | {: data-line="2"} | |
| 318 | - | ||
| 319 | - | #### without Object spread | |
| 320 | - | ||
| 321 | - | ```js | |
| 322 | - | const options = Object.assign( | |
| 323 | - | {}, defaults, | |
| 324 | - | { visible: true }) | |
| 325 | - | ``` | |
| 326 | - | ||
| 327 | - | The Object spread operator lets you build new objects from other objects. | |
| 328 | - | ||
| 329 | - | See: [Object spread](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator) | |
| 330 | - | ||
| 331 | - | ### Array spread | |
| 332 | - | ||
| 333 | - | #### with Array spread | |
| 334 | - | ||
| 335 | - | ```js | |
| 336 | - | const users = [ | |
| 337 | - | ...admins, | |
| 338 | - | ...editors, | |
| 339 | - | 'rstacruz' | |
| 340 | - | ] | |
| 341 | - | ``` | |
| 342 | - | {: data-line="2,3"} | |
| 343 | - | ||
| 344 | - | #### without Array spread | |
| 345 | - | ||
| 346 | - | ```js | |
| 347 | - | const users = admins | |
| 348 | - | .concat(editors) | |
| 349 | - | .concat([ 'rstacruz' ]) | |
| 350 | - | ``` | |
| 351 | - | ||
| 352 | - | The spread operator lets you build new arrays in the same way. | |
| 353 | - | ||
| 354 | - | See: [Spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator) | |
| 355 | - | ||
| 356 | - | Functions | |
| 357 | - | --------- | |
| 358 | - | ||
| 359 | - | ### Function arguments | |
| 360 | - | ||
| 361 | - | #### Default arguments | |
| 362 | - | ||
| 363 | - | ```js | |
| 364 | - | function greet (name = 'Jerry') { | |
| 365 | - | return `Hello ${name}` | |
| 366 | - | } | |
| 367 | - | ``` | |
| 368 | - | {: data-line="1"} | |
| 369 | - | ||
| 370 | - | #### Rest arguments | |
| 371 | - | ||
| 372 | - | ```js | |
| 373 | - | function fn(x, ...y) { | |
| 374 | - | // y is an Array | |
| 375 | - | return x * y.length | |
| 376 | - | } | |
| 377 | - | ``` | |
| 378 | - | {: data-line="1"} | |
| 379 | - | ||
| 380 | - | #### Spread | |
| 381 | - | ||
| 382 | - | ```js | |
| 383 | - | fn(...[1, 2, 3]) | |
| 384 | - | // same as fn(1, 2, 3) | |
| 385 | - | ``` | |
| 386 | - | {: data-line="1"} | |
| 387 | - | ||
| 388 | - | Default, rest, spread. | |
| 389 | - | See: [Function arguments](https://babeljs.io/learn-es2015/#default--rest--spread) | |
| 390 | - | ||
| 391 | - | ### Fat arrows | |
| 392 | - | ||
| 393 | - | #### Fat arrows | |
| 394 | - | ||
| 395 | - | ```js | |
| 396 | - | setTimeout(() => { | |
| 397 | - | ··· | |
| 398 | - | }) | |
| 399 | - | ``` | |
| 400 | - | {: data-line="1"} | |
| 401 | - | ||
| 402 | - | #### With arguments | |
| 403 | - | ||
| 404 | - | ```js | |
| 405 | - | readFile('text.txt', (err, data) => { | |
| 406 | - | ... | |
| 407 | - | }) | |
| 408 | - | ``` | |
| 409 | - | {: data-line="1"} | |
| 410 | - | ||
| 411 | - | #### Implicit return | |
| 412 | - | ```js | |
| 413 | - | numbers.map(n => n * 2) | |
| 414 | - | // No curly braces = implicit return | |
| 415 | - | // Same as: numbers.map(function (n) { return n * 2 }) | |
| 416 | - | numbers.map(n => ({ | |
| 417 | - | result: n * 2 | |
| 418 | - | })) | |
| 419 | - | // Implicitly returning objects requires parentheses around the object | |
| 420 | - | ``` | |
| 421 | - | {: data-line="1,4,5,6"} | |
| 422 | - | ||
| 423 | - | Like functions but with `this` preserved. | |
| 424 | - | See: [Fat arrows](https://babeljs.io/learn-es2015/#arrows-and-lexical-this) | |
| 425 | - | ||
| 426 | - | Objects | |
| 427 | - | ------- | |
| 428 | - | ||
| 429 | - | ### Shorthand syntax | |
| 430 | - | ||
| 431 | - | ```js | |
| 432 | - | module.exports = { hello, bye } | |
| 433 | - | // Same as: module.exports = { hello: hello, bye: bye } | |
| 434 | - | ``` | |
| 435 | - | ||
| 436 | - | See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals) | |
| 437 | - | ||
| 438 | - | ### Methods | |
| 439 | - | ||
| 440 | - | ```js | |
| 441 | - | const App = { | |
| 442 | - | start () { | |
| 443 | - | console.log('running') | |
| 444 | - | } | |
| 445 | - | } | |
| 446 | - | // Same as: App = { start: function () {···} } | |
| 447 | - | ``` | |
| 448 | - | {: data-line="2"} | |
| 449 | - | ||
| 450 | - | See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals) | |
| 451 | - | ||
| 452 | - | ### Getters and setters | |
| 453 | - | ||
| 454 | - | ```js | |
| 455 | - | const App = { | |
| 456 | - | get closed () { | |
| 457 | - | return this.status === 'closed' | |
| 458 | - | }, | |
| 459 | - | set closed (value) { | |
| 460 | - | this.status = value ? 'closed' : 'open' | |
| 461 | - | } | |
| 462 | - | } | |
| 463 | - | ``` | |
| 464 | - | {: data-line="2,5"} | |
| 465 | - | ||
| 466 | - | See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals) | |
| 467 | - | ||
| 468 | - | ### Computed property names | |
| 469 | - | ||
| 470 | - | ```js | |
| 471 | - | let event = 'click' | |
| 472 | - | let handlers = { | |
| 473 | - | [`on${event}`]: true | |
| 474 | - | } | |
| 475 | - | // Same as: handlers = { 'onclick': true } | |
| 476 | - | ``` | |
| 477 | - | {: data-line="3"} | |
| 478 | - | ||
| 479 | - | See: [Object literal enhancements](https://babeljs.io/learn-es2015/#enhanced-object-literals) | |
| 480 | - | ||
| 481 | - | ||
| 482 | - | ### Extract values | |
| 483 | - | ||
| 484 | - | ```js | |
| 485 | - | const fatherJS = { age: 57, name: "Brendan Eich" } | |
| 486 | - | ||
| 487 | - | Object.values(fatherJS) | |
| 488 | - | // [57, "Brendan Eich"] | |
| 489 | - | Object.entries(fatherJS) | |
| 490 | - | // [["age", 57], ["name", "Brendan Eich"]] | |
| 491 | - | ``` | |
| 492 | - | {: data-line="3,5"} | |
| 493 | - | ||
| 494 | - | ||
| 495 | - | Modules | |
| 496 | - | ------- | |
| 497 | - | ||
| 498 | - | ### Imports | |
| 499 | - | ||
| 500 | - | ```js | |
| 501 | - | import 'helpers' | |
| 502 | - | // aka: require('···') | |
| 503 | - | ``` | |
| 504 | - | ||
| 505 | - | ```js | |
| 506 | - | import Express from 'express' | |
| 507 | - | // aka: const Express = require('···').default || require('···') | |
| 508 | - | ``` | |
| 509 | - | ||
| 510 | - | ```js | |
| 511 | - | import { indent } from 'helpers' | |
| 512 | - | // aka: const indent = require('···').indent | |
| 513 | - | ``` | |
| 514 | - | ||
| 515 | - | ```js | |
| 516 | - | import * as Helpers from 'helpers' | |
| 517 | - | // aka: const Helpers = require('···') | |
| 518 | - | ``` | |
| 519 | - | ||
| 520 | - | ```js | |
| 521 | - | import { indentSpaces as indent } from 'helpers' | |
| 522 | - | // aka: const indent = require('···').indentSpaces | |
| 523 | - | ``` | |
| 524 | - | ||
| 525 | - | `import` is the new `require()`. | |
| 526 | - | See: [Module imports](https://babeljs.io/learn-es2015/#modules) | |
| 527 | - | ||
| 528 | - | ### Exports | |
| 529 | - | ||
| 530 | - | ```js | |
| 531 | - | export default function () { ··· } | |
| 532 | - | // aka: module.exports.default = ··· | |
| 533 | - | ``` | |
| 534 | - | ||
| 535 | - | ```js | |
| 536 | - | export function mymethod () { ··· } | |
| 537 | - | // aka: module.exports.mymethod = ··· | |
| 538 | - | ``` | |
| 539 | - | ||
| 540 | - | ```js | |
| 541 | - | export const pi = 3.14159 | |
| 542 | - | // aka: module.exports.pi = ··· | |
| 543 | - | ``` | |
| 544 | - | ||
| 545 | - | `export` is the new `module.exports`. | |
| 546 | - | See: [Module exports](https://babeljs.io/learn-es2015/#modules) | |
| 547 | - | ||
| 548 | - | Generators | |
| 549 | - | ---------- | |
| 550 | - | ||
| 551 | - | ### Generators | |
| 552 | - | ||
| 553 | - | ```js | |
| 554 | - | function* idMaker () { | |
| 555 | - | let id = 0 | |
| 556 | - | while (true) { yield id++ } | |
| 557 | - | } | |
| 558 | - | ``` | |
| 559 | - | ||
| 560 | - | ```js | |
| 561 | - | let gen = idMaker() | |
| 562 | - | gen.next().value // → 0 | |
| 563 | - | gen.next().value // → 1 | |
| 564 | - | gen.next().value // → 2 | |
| 565 | - | ``` | |
| 566 | - | ||
| 567 | - | It's complicated. | |
| 568 | - | See: [Generators](https://babeljs.io/learn-es2015/#generators) | |
| 569 | - | ||
| 570 | - | ### For..of iteration | |
| 571 | - | ||
| 572 | - | ```js | |
| 573 | - | for (let i of iterable) { | |
| 574 | - | ··· | |
| 575 | - | } | |
| 576 | - | ``` | |
| 577 | - | ||
| 578 | - | For iterating through generators and arrays. | |
| 579 | - | See: [For..of iteration](https://babeljs.io/learn-es2015/#iterators--forof) | |
| 580 | - | ||
| 581 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 582 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,104 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Jinja | |
| 3 | - | category: Python | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | --- | |
| 6 | - | ||
| 7 | - | {% raw %} | |
| 8 | - | ### Basic usage | |
| 9 | - | ||
| 10 | - | ``` | |
| 11 | - | - variable x has content: {{ x }} | |
| 12 | - | - expression: {{ x + 1 }} | |
| 13 | - | - escaped for HTML: {{ x | e }} | |
| 14 | - | ``` | |
| 15 | - | ||
| 16 | - | ### Control structures | |
| 17 | - | ||
| 18 | - | ``` | |
| 19 | - | {% for x in range(5) %} | |
| 20 | - | {% if x % 2 == 0 %} | |
| 21 | - | {{ x }} is even! | |
| 22 | - | {% else %} | |
| 23 | - | {{ x }} is odd! | |
| 24 | - | {% endif %} | |
| 25 | - | {% endfor %} | |
| 26 | - | ``` | |
| 27 | - | ||
| 28 | - | ### Whitespace trimming | |
| 29 | - | ||
| 30 | - | ``` | |
| 31 | - | these are | |
| 32 | - | {{ "three" }} | |
| 33 | - | lines. | |
| 34 | - | ||
| 35 | - | this is conc | |
| 36 | - | {{- "at" -}} | |
| 37 | - | enated. | |
| 38 | - | ``` | |
| 39 | - | ||
| 40 | - | ### Special blocks | |
| 41 | - | ||
| 42 | - | ``` | |
| 43 | - | {% filter e %}{% endraw %} | |
| 44 | - | { {%- if 0 -%}{%- endif -%} % raw %} | |
| 45 | - | {%- raw -%} | |
| 46 | - | This is a raw block where {{nothing is evaluated}} | |
| 47 | - | {% not even this %} | |
| 48 | - | and <html is escaped> too with "e" filter | |
| 49 | - | {% endraw %} | |
| 50 | - | { {%- if 0 -%}{%- endif -%} % endraw %}{% raw %} | |
| 51 | - | {% endfilter %} | |
| 52 | - | ||
| 53 | - | {% macro myfunc(x) %} | |
| 54 | - | this is a reusable macro, with arguments: {{x}} | |
| 55 | - | {% endmacro %} | |
| 56 | - | ||
| 57 | - | {{ myfunc(42) }} | |
| 58 | - | ||
| 59 | - | {# | |
| 60 | - | this is a comment | |
| 61 | - | #} | |
| 62 | - | ``` | |
| 63 | - | ||
| 64 | - | ||
| 65 | - | ### Inheritance | |
| 66 | - | ||
| 67 | - | #### shared.html | |
| 68 | - | ||
| 69 | - | ``` | |
| 70 | - | <html> | |
| 71 | - | <head> | |
| 72 | - | <title>{%block title %}{% endblock %}</title> | |
| 73 | - | </head> | |
| 74 | - | <body> | |
| 75 | - | <header><h1>{% block title %}{% endblock %}</h1></header> | |
| 76 | - | <main>{% block content %}{% endblock %}</main> | |
| 77 | - | </body> | |
| 78 | - | </html> | |
| 79 | - | ``` | |
| 80 | - | ||
| 81 | - | #### home.html | |
| 82 | - | ||
| 83 | - | ``` | |
| 84 | - | {% extends "shared.html" %} | |
| 85 | - | {% block title %}Welcome to my site{% endblock %} | |
| 86 | - | {% block content %} | |
| 87 | - | This is the body | |
| 88 | - | {% endblock %} | |
| 89 | - | ``` | |
| 90 | - | ||
| 91 | - | ## Library | |
| 92 | - | ||
| 93 | - | ### Basic usage | |
| 94 | - | ||
| 95 | - | ```python | |
| 96 | - | from jinja2 import Template | |
| 97 | - | template = Template('Hello {{ name }}!') | |
| 98 | - | template.render(name='John Doe') == u'Hello John Doe!' | |
| 99 | - | ``` | |
| 100 | - | ||
| 101 | - | {% endraw %} | |
| 102 | - | ||
| 103 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 104 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,8 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: jinja | |
| 3 | - | category: python | |
| 4 | - | redirect_to: /jinja | |
| 5 | - | --- | |
| 6 | - | ||
| 7 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 8 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,407 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Kotlin | |
| 3 | - | layout: 2017/sheet | |
| 4 | - | updated: 2018-12-06 | |
| 5 | - | category: Java & JVM | |
| 6 | - | prism_languages: [kotlin] | |
| 7 | - | intro: | | |
| 8 | - | [Kotlin](http://kotlinlang.org/) is a statically typed programming language for modern multiplatform applications. | |
| 9 | - | --- | |
| 10 | - | ||
| 11 | - | Variables | |
| 12 | - | --------- | |
| 13 | - | {: .-three-column} | |
| 14 | - | ||
| 15 | - | ### Mutability | |
| 16 | - | ||
| 17 | - | ```kotlin | |
| 18 | - | var mutableString: String = "Adam" | |
| 19 | - | val immutableString: String = "Adam" | |
| 20 | - | val inferredString = "Adam" | |
| 21 | - | ``` | |
| 22 | - | ||
| 23 | - | ### Strings | |
| 24 | - | ||
| 25 | - | ```kotlin | |
| 26 | - | val name = "Adam" | |
| 27 | - | val greeting = "Hello, " + name | |
| 28 | - | val greetingTemplate = "Hello, $name" | |
| 29 | - | val interpolated = "Hello, ${name.toUpperCase()}" | |
| 30 | - | ``` | |
| 31 | - | ||
| 32 | - | ### Numbers | |
| 33 | - | ||
| 34 | - | ```kotlin | |
| 35 | - | val intNum = 10 | |
| 36 | - | val doubleNum = 10.0 | |
| 37 | - | val longNum = 10L | |
| 38 | - | val floatNum = 10.0F | |
| 39 | - | ``` | |
| 40 | - | ||
| 41 | - | ### Booleans | |
| 42 | - | ||
| 43 | - | ```kotlin | |
| 44 | - | val trueBoolean = true | |
| 45 | - | val falseBoolean = false | |
| 46 | - | val andCondition = trueBoolean && falseBoolean | |
| 47 | - | val orCondition = trueBoolean || falseBoolean | |
| 48 | - | ``` | |
| 49 | - | ||
| 50 | - | ### Static Fields | |
| 51 | - | ||
| 52 | - | ```kotlin | |
| 53 | - | class Person { | |
| 54 | - | companion object { | |
| 55 | - | val NAME_KEY = "name_key" | |
| 56 | - | } | |
| 57 | - | } | |
| 58 | - | ||
| 59 | - | val key = Person.NAME_KEY | |
| 60 | - | ``` | |
| 61 | - | ||
| 62 | - | Null Safety | |
| 63 | - | ----------- | |
| 64 | - | {: .-two-column} | |
| 65 | - | ||
| 66 | - | ### Nullable properties | |
| 67 | - | ||
| 68 | - | ```kotlin | |
| 69 | - | val cannotBeNull: String = null // Invalid | |
| 70 | - | val canBeNull: String? = null // Valid | |
| 71 | - | ||
| 72 | - | val cannotBeNull: Int = null // Invalid | |
| 73 | - | val canBeNull: Int? = null // Valid | |
| 74 | - | ``` | |
| 75 | - | ||
| 76 | - | ### Checking for null | |
| 77 | - | ||
| 78 | - | ```kotlin | |
| 79 | - | val name: String? = "Adam" | |
| 80 | - | ||
| 81 | - | if (name != null && name.length > 0) { | |
| 82 | - | print("String length is ${name.length}") | |
| 83 | - | } else { | |
| 84 | - | print("String is empty.") | |
| 85 | - | } | |
| 86 | - | ``` | |
| 87 | - | ||
| 88 | - | ### Safe Operator | |
| 89 | - | ||
| 90 | - | ```kotlin | |
| 91 | - | val nullableStringLength: Int? = nullableString?.length | |
| 92 | - | val nullableDepartmentHead: String? = person?.department?.head?.name | |
| 93 | - | ``` | |
| 94 | - | ||
| 95 | - | ### Elvis Operator | |
| 96 | - | ||
| 97 | - | ```kotlin | |
| 98 | - | val nonNullStringLength: Int = nullableString?.length ?: 0 | |
| 99 | - | val nonNullDepartmentHead: String = person?.department?.head?.name ?: "" | |
| 100 | - | val nonNullDepartmentHead: String = person?.department?.head?.name.orEmpty() | |
| 101 | - | ``` | |
| 102 | - | ||
| 103 | - | ### Safe Casts | |
| 104 | - | ```kotlin | |
| 105 | - | // Will not throw ClassCastException | |
| 106 | - | val nullableCar: Car? = (input as? Car) | |
| 107 | - | ``` | |
| 108 | - | ||
| 109 | - | Collections | |
| 110 | - | ----------- | |
| 111 | - | {: .-two-column} | |
| 112 | - | ||
| 113 | - | ### Creation | |
| 114 | - | ||
| 115 | - | ```kotlin | |
| 116 | - | val numArray = arrayOf(1, 2, 3) | |
| 117 | - | val numList = listOf(1, 2, 3) | |
| 118 | - | val mutableNumList = mutableListOf(1, 2, 3) | |
| 119 | - | ``` | |
| 120 | - | ||
| 121 | - | ### Accessing | |
| 122 | - | ||
| 123 | - | ```kotlin | |
| 124 | - | val firstItem = numList[0] | |
| 125 | - | val firstItem = numList.first() | |
| 126 | - | val firstItem = numList.firstOrNull() | |
| 127 | - | ``` | |
| 128 | - | ||
| 129 | - | ### Maps | |
| 130 | - | ||
| 131 | - | ```kotlin | |
| 132 | - | val faceCards = mutableMapOf("Jack" to 11, "Queen" to 12, "King" to 13) | |
| 133 | - | val jackValue = faceCards["Jack"] // 11 | |
| 134 | - | faceCards["Ace"] = 1 | |
| 135 | - | ``` | |
| 136 | - | ||
| 137 | - | ### Mutability | |
| 138 | - | ||
| 139 | - | ```kotlin | |
| 140 | - | val immutableList = listOf(1, 2, 3) | |
| 141 | - | val mutableList = immutableList.toMutableList() | |
| 142 | - | ||
| 143 | - | val immutableMap = mapOf("Jack" to 11, "Queen" to 12, "King" to 13) | |
| 144 | - | val mutableMap = immutableMap.toMutableMap() | |
| 145 | - | ``` | |
| 146 | - | ||
| 147 | - | ### Iterating | |
| 148 | - | ||
| 149 | - | ```kotlin | |
| 150 | - | for (item in myList) { | |
| 151 | - | print(item) | |
| 152 | - | } | |
| 153 | - | ||
| 154 | - | myList.forEach { | |
| 155 | - | print(it) | |
| 156 | - | } | |
| 157 | - | ||
| 158 | - | myList.forEachIndexed { index, item -> | |
| 159 | - | print("Item at $index is: $item") | |
| 160 | - | } | |
| 161 | - | ``` | |
| 162 | - | ||
| 163 | - | ### Filtering & Searching | |
| 164 | - | ||
| 165 | - | ```kotlin | |
| 166 | - | val evenNumbers = numList.filter { it % 2 == 0 } | |
| 167 | - | val containsEven = numList.any { it % 2 == 0 } | |
| 168 | - | val containsNoEvens = numList.none { it % 2 == 0 } | |
| 169 | - | val containsNoEvens = numList.all { it % 2 == 1 } | |
| 170 | - | val firstEvenNumber: Int = numList.first { it % 2 == 0 } | |
| 171 | - | val firstEvenOrNull: Int? = numList.firstOrNull { it % 2 == 0 } | |
| 172 | - | val fullMenu = objList.map { "${it.name} - $${it.detail}" } | |
| 173 | - | ``` | |
| 174 | - | ||
| 175 | - | Note: `it` is the [implicit name for a single parameter](https://kotlinlang.org/docs/reference/lambdas.html#it-implicit-name-of-a-single-parameter). | |
| 176 | - | ||
| 177 | - | Functions | |
| 178 | - | --------- | |
| 179 | - | {: .-two-column} | |
| 180 | - | ||
| 181 | - | ### Parameters & Return Types | |
| 182 | - | ||
| 183 | - | ```kotlin | |
| 184 | - | fun printName() { | |
| 185 | - | print("Adam") | |
| 186 | - | } | |
| 187 | - | ||
| 188 | - | fun printName(person: Person) { | |
| 189 | - | print(person.name) | |
| 190 | - | } | |
| 191 | - | ||
| 192 | - | fun getGreeting(person: Person): String { | |
| 193 | - | return "Hello, ${person.name}" | |
| 194 | - | } | |
| 195 | - | ||
| 196 | - | fun getGreeting(person: Person): String = "Hello, ${person.name}" | |
| 197 | - | fun getGreeting(person: Person) = "Hello, ${person.name}" | |
| 198 | - | ``` | |
| 199 | - | ||
| 200 | - | ### Higher Order Functions | |
| 201 | - | ||
| 202 | - | ```kotlin | |
| 203 | - | fun callbackIfTrue(condition: Boolean, callback: () -> Unit) { | |
| 204 | - | if (condition) { | |
| 205 | - | callback() | |
| 206 | - | } | |
| 207 | - | } | |
| 208 | - | ||
| 209 | - | callbackIfTrue(someBoolean) { | |
| 210 | - | print("Condition was true") | |
| 211 | - | } | |
| 212 | - | ``` | |
| 213 | - | ||
| 214 | - | ### Extension Functions | |
| 215 | - | ||
| 216 | - | ```kotlin | |
| 217 | - | fun Int.timesTwo(): Int { | |
| 218 | - | return this * 2 | |
| 219 | - | } | |
| 220 | - | ||
| 221 | - | val four = 2.timesTwo() | |
| 222 | - | ``` | |
| 223 | - | ||
| 224 | - | ### Default Parameters | |
| 225 | - | ||
| 226 | - | ```kotlin | |
| 227 | - | fun getGreeting(person: Person, intro: String = "Hello,") { | |
| 228 | - | return "$intro ${person.name}" | |
| 229 | - | } | |
| 230 | - | ||
| 231 | - | // Returns "Hello, Adam" | |
| 232 | - | val hello = getGreeting(Person("Adam")) | |
| 233 | - | ||
| 234 | - | // Returns "Welcome, Adam" | |
| 235 | - | val welcome = getGreeting(Person("Adam"), "Welcome,") | |
| 236 | - | ``` | |
| 237 | - | ||
| 238 | - | ### Named Parameters | |
| 239 | - | ||
| 240 | - | ```kotlin | |
| 241 | - | class Person(val name: String = "", age: Int = 0) | |
| 242 | - | ||
| 243 | - | // All valid | |
| 244 | - | val person = Person() | |
| 245 | - | val person = Person("Adam", 100) | |
| 246 | - | val person = Person(name = "Adam", age = 100) | |
| 247 | - | val person = Person(age = 100) | |
| 248 | - | val person = Person(age = 100, name = "Adam") | |
| 249 | - | ``` | |
| 250 | - | ||
| 251 | - | ### Static Functions | |
| 252 | - | ||
| 253 | - | ```kotlin | |
| 254 | - | class Fragment(val args: Bundle) { | |
| 255 | - | companion object { | |
| 256 | - | fun newInstance(args: Bundle): Fragment { | |
| 257 | - | return Fragment(args) | |
| 258 | - | } | |
| 259 | - | } | |
| 260 | - | } | |
| 261 | - | ||
| 262 | - | val fragment = Fragment.newInstance(args) | |
| 263 | - | ``` | |
| 264 | - | ||
| 265 | - | * [Companion Objects](https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects) | |
| 266 | - | ||
| 267 | - | Classes | |
| 268 | - | ------- | |
| 269 | - | {: .-two-column} | |
| 270 | - | ||
| 271 | - | ### Primary Constructor | |
| 272 | - | ||
| 273 | - | ```kotlin | |
| 274 | - | class Person(val name: String, val age: Int) | |
| 275 | - | val adam = Person("Adam", 100) | |
| 276 | - | ``` | |
| 277 | - | ||
| 278 | - | ### Secondary Constructors | |
| 279 | - | ||
| 280 | - | ```kotlin | |
| 281 | - | class Person(val name: String) { | |
| 282 | - | private var age: Int? = null | |
| 283 | - | ||
| 284 | - | constructor(name: String, age: Int) : this(name) { | |
| 285 | - | this.age = age | |
| 286 | - | } | |
| 287 | - | } | |
| 288 | - | ||
| 289 | - | // Above can be replaced with default params | |
| 290 | - | class Person(val name: String, val age: Int? = null) | |
| 291 | - | ``` | |
| 292 | - | ||
| 293 | - | ### Inheritance & Implementation | |
| 294 | - | ||
| 295 | - | ```kotlin | |
| 296 | - | open class Vehicle | |
| 297 | - | class Car : Vehicle() | |
| 298 | - | ||
| 299 | - | interface Runner { | |
| 300 | - | fun run() | |
| 301 | - | } | |
| 302 | - | ||
| 303 | - | class Machine : Runner { | |
| 304 | - | override fun run() { | |
| 305 | - | // ... | |
| 306 | - | } | |
| 307 | - | } | |
| 308 | - | ``` | |
| 309 | - | ||
| 310 | - | Control Flow | |
| 311 | - | ------------ | |
| 312 | - | {: .-two-column} | |
| 313 | - | ||
| 314 | - | ### If Statements | |
| 315 | - | ||
| 316 | - | ```kotlin | |
| 317 | - | if (someBoolean) { | |
| 318 | - | doThing() | |
| 319 | - | } else { | |
| 320 | - | doOtherThing() | |
| 321 | - | } | |
| 322 | - | ``` | |
| 323 | - | ||
| 324 | - | ### For Loops | |
| 325 | - | ||
| 326 | - | ```kotlin | |
| 327 | - | for (i in 0..10) { } // 1 - 10 | |
| 328 | - | for (i in 0 until 10) // 1 - 9 | |
| 329 | - | (0..10).forEach { } | |
| 330 | - | for (i in 0 until 10 step 2) // 0, 2, 4, 6, 8 | |
| 331 | - | ``` | |
| 332 | - | ||
| 333 | - | ### When Statements | |
| 334 | - | ||
| 335 | - | ```kotlin | |
| 336 | - | when (direction) { | |
| 337 | - | NORTH -> { | |
| 338 | - | print("North") | |
| 339 | - | } | |
| 340 | - | SOUTH -> print("South") | |
| 341 | - | EAST, WEST -> print("East or West") | |
| 342 | - | "N/A" -> print("Unavailable") | |
| 343 | - | else -> print("Invalid Direction") | |
| 344 | - | } | |
| 345 | - | ``` | |
| 346 | - | ||
| 347 | - | ### While Loops | |
| 348 | - | ||
| 349 | - | ```kotlin | |
| 350 | - | while (x > 0) { | |
| 351 | - | x-- | |
| 352 | - | } | |
| 353 | - | ||
| 354 | - | do { | |
| 355 | - | x-- | |
| 356 | - | } while (x > 0) | |
| 357 | - | ``` | |
| 358 | - | ||
| 359 | - | Destructuring Declarations | |
| 360 | - | -------------------------- | |
| 361 | - | {: .-two-column} | |
| 362 | - | ||
| 363 | - | ### Objects & Lists | |
| 364 | - | ||
| 365 | - | ```kotlin | |
| 366 | - | val person = Person("Adam", 100) | |
| 367 | - | val (name, age) = person | |
| 368 | - | ||
| 369 | - | val pair = Pair(1, 2) | |
| 370 | - | val (first, second) = pair | |
| 371 | - | ||
| 372 | - | val coordinates = arrayOf(1, 2, 3) | |
| 373 | - | val (x, y, z) = coordinates | |
| 374 | - | ``` | |
| 375 | - | ||
| 376 | - | ### ComponentN Functions | |
| 377 | - | ||
| 378 | - | ```kotlin | |
| 379 | - | class Person(val name: String, val age: Int) { | |
| 380 | - | operator fun component1(): String { | |
| 381 | - | return name | |
| 382 | - | } | |
| 383 | - | ||
| 384 | - | operator fun component2(): Int { | |
| 385 | - | return age | |
| 386 | - | } | |
| 387 | - | } | |
| 388 | - | ``` | |
| 389 | - | ||
| 390 | - | References | |
| 391 | - | ---------- | |
| 392 | - | {: .-one-column} | |
| 393 | - | ||
| 394 | - | * [Defining Variables](https://kotlinlang.org/docs/reference/basic-syntax.html#defining-variables) _(kotlinlang.org)_ | |
| 395 | - | * [Strings Documentation](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) _(kotlinlang.org)_ | |
| 396 | - | * [String Templates](https://kotlinlang.org/docs/reference/basic-types.html#string-templates) _(kotlinlang.org)_ | |
| 397 | - | * [Basic Types](https://kotlinlang.org/docs/reference/basic-types.html) _(kotlinlang.org)_ | |
| 398 | - | * [Companion Objects](https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects) _(kotlinlang.org)_ | |
| 399 | - | * [Null Safety](https://kotlinlang.org/docs/reference/null-safety.html) _(kotlinlang.org)_ | |
| 400 | - | * [Collections Overview](https://kotlinlang.org/docs/reference/collections.html) _(kotlinlang.org)_ | |
| 401 | - | * [Collections Documentation](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/index.html) _(kotlinlang.org)_ | |
| 402 | - | * [Functions Documentation](https://kotlinlang.org/docs/reference/functions.html) _(kotlinlang.org)_ | |
| 403 | - | * [Classes Documentation](https://kotlinlang.org/docs/reference/classes.html) _(kotlinlang.org)_ | |
| 404 | - | * [Destructuring Declarations](https://kotlinlang.org/docs/reference/multi-declarations.html) _(kotlinlang.org)_ | |
| 405 | - | ||
| 406 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 407 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,308 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Ledger CLI | |
| 3 | - | category: Ledger | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | updated: 2020-05-23 | |
| 6 | - | weight: -5 | |
| 7 | - | --- | |
| 8 | - | ||
| 9 | - | ### Basic usage | |
| 10 | - | ||
| 11 | - | ```bash | |
| 12 | - | $ ledger bal | |
| 13 | - | $ ledger reg | |
| 14 | - | ``` | |
| 15 | - | ||
| 16 | - | ```bash | |
| 17 | - | $ ledger reg grocery # show entries for 'grocery' | |
| 18 | - | $ ledger bal assets # check if i'm broke | |
| 19 | - | ``` | |
| 20 | - | ||
| 21 | - | ```bash | |
| 22 | - | -b 01/01 # --begin | |
| 23 | - | -e 01/31 # --end | |
| 24 | - | -S date # --sort | |
| 25 | - | -S amount | |
| 26 | - | ``` | |
| 27 | - | ||
| 28 | - | ### Examples | |
| 29 | - | ||
| 30 | - | ```bash | |
| 31 | - | # any/all matches | |
| 32 | - | ledger bal Rent Transportation # any | |
| 33 | - | ledger bal Income and Job # all | |
| 34 | - | ledger bal Expenses and not (Drinks or Food) | |
| 35 | - | ``` | |
| 36 | - | ||
| 37 | - | ```bash | |
| 38 | - | # what did I spend on most? (--sorted) | |
| 39 | - | ledger reg Expenses -S amount | |
| 40 | - | ``` | |
| 41 | - | ||
| 42 | - | ```bash | |
| 43 | - | # how much did I have at this date? (--end) | |
| 44 | - | ledger bal -e 01/15 ^Assets ^Liabilities | |
| 45 | - | ``` | |
| 46 | - | ||
| 47 | - | ```bash | |
| 48 | - | # how much did I spend and earn this month? | |
| 49 | - | ledger bal ^Expenses ^Income --invert | |
| 50 | - | ``` | |
| 51 | - | ||
| 52 | - | ```bash | |
| 53 | - | # how much was spent over the course of 3 days? (totalled) | |
| 54 | - | ledger reg -b 01/25 -e 01/27 --subtotal | |
| 55 | - | ledger reg -b 01/25 -e 01/27 --subtotal grocery | |
| 56 | - | ``` | |
| 57 | - | ||
| 58 | - | Format | |
| 59 | - | ------ | |
| 60 | - | ||
| 61 | - | ### Basic format | |
| 62 | - | ||
| 63 | - | ``` | |
| 64 | - | 2013/01/03 * Rent for January | |
| 65 | - | Expenses:Rent $600.00 | |
| 66 | - | Assets:Savings | |
| 67 | - | ``` | |
| 68 | - | ||
| 69 | - | `*` = cleared, `!` = pending | |
| 70 | - | ||
| 71 | - | ### Secondary dates | |
| 72 | - | ||
| 73 | - | ``` | |
| 74 | - | 2008/01/01=2008/01/14 Client invoice | |
| 75 | - | ``` | |
| 76 | - | ||
| 77 | - | It can mean anything you want, eg, for the estimated date you'll be paid. | |
| 78 | - | ||
| 79 | - | ### Balance assertions | |
| 80 | - | ||
| 81 | - | ``` | |
| 82 | - | 2008/01/01 * KFC | |
| 83 | - | Expenses:Food $20 | |
| 84 | - | Assets:Cash $-20 = $500 | |
| 85 | - | ``` | |
| 86 | - | {: data-line="3"} | |
| 87 | - | ||
| 88 | - | `Cash $X = $500` ensures Cash is at $500 after the transaction. | |
| 89 | - | ||
| 90 | - | ### Balance assignment | |
| 91 | - | ||
| 92 | - | ```bash | |
| 93 | - | 2008/01/01 * Cash balance | |
| 94 | - | Assets:Cash = $500 | |
| 95 | - | Equity:Adjustments | |
| 96 | - | ||
| 97 | - | 2008/01/01 * KFC | |
| 98 | - | Expenses:Food $20 | |
| 99 | - | Assets:Cash = $500 | |
| 100 | - | ``` | |
| 101 | - | {: data-line="2,7"} | |
| 102 | - | ||
| 103 | - | `ACCOUNT = $500` figures out what's needed to make it $500. | |
| 104 | - | ||
| 105 | - | ### Payables | |
| 106 | - | ||
| 107 | - | ```bash | |
| 108 | - | 2008/04/25 * Rent | |
| 109 | - | (Assets:Checking) -$200 | |
| 110 | - | Expenses:Rent | |
| 111 | - | ``` | |
| 112 | - | {: data-line="2"} | |
| 113 | - | ||
| 114 | - | ### Commodities | |
| 115 | - | ||
| 116 | - | ```bash | |
| 117 | - | ; cost per item | |
| 118 | - | 2010/05/31 * Market | |
| 119 | - | Assets:Fridge 35 apples @ $0.42 | |
| 120 | - | Assets:Cash | |
| 121 | - | ``` | |
| 122 | - | {: data-line="3"} | |
| 123 | - | ||
| 124 | - | ```bash | |
| 125 | - | ; total cost | |
| 126 | - | 2010/05/31 * Market | |
| 127 | - | Assets:Fridge 35 apples @@ $14.70 | |
| 128 | - | Assets:Cash | |
| 129 | - | ``` | |
| 130 | - | {: data-line="3"} | |
| 131 | - | ||
| 132 | - | ```bash | |
| 133 | - | ; fixed lot prices | |
| 134 | - | 2010/05/31 * Gas | |
| 135 | - | Expenses:Gasoline 11 GAL {=$2.299} | |
| 136 | - | Assets:Cash | |
| 137 | - | ``` | |
| 138 | - | {: data-line="3"} | |
| 139 | - | ||
| 140 | - | ### Commodity definitions | |
| 141 | - | ||
| 142 | - | ``` | |
| 143 | - | commodity $ | |
| 144 | - | note American Dollars | |
| 145 | - | format $1,000.00 | |
| 146 | - | nomarket | |
| 147 | - | default | |
| 148 | - | ``` | |
| 149 | - | ||
| 150 | - | ### Budgeting | |
| 151 | - | ||
| 152 | - | ``` | |
| 153 | - | ~ Monthly | |
| 154 | - | Expenses:Rent $500 | |
| 155 | - | Expenses:Food $100 | |
| 156 | - | Expenses $40 ; everything else | |
| 157 | - | Assets | |
| 158 | - | ||
| 159 | - | ~ Yearly | |
| 160 | - | ``` | |
| 161 | - | ||
| 162 | - | ```bash | |
| 163 | - | ledger bal --budget Expenses | |
| 164 | - | ledger bal --unbudgeted Expenses | |
| 165 | - | ``` | |
| 166 | - | {: .-setup} | |
| 167 | - | ||
| 168 | - | ### Comments | |
| 169 | - | ||
| 170 | - | ; line comment | |
| 171 | - | # also line comment | |
| 172 | - | % also line comment | |
| 173 | - | | also line comment | |
| 174 | - | * also line comment | |
| 175 | - | ||
| 176 | - | Querying | |
| 177 | - | -------- | |
| 178 | - | ||
| 179 | - | ### Periods | |
| 180 | - | ||
| 181 | - | ``` | |
| 182 | - | [interval] [begin] [end] | |
| 183 | - | ``` | |
| 184 | - | ||
| 185 | - | ``` | |
| 186 | - | interval: | |
| 187 | - | every day|week|month|quarter|year | |
| 188 | - | every N days|weeks|... | |
| 189 | - | daily|weekly|... | |
| 190 | - | ``` | |
| 191 | - | ||
| 192 | - | ``` | |
| 193 | - | begin: | |
| 194 | - | from <spec> | |
| 195 | - | end: | |
| 196 | - | to <spec> | |
| 197 | - | ``` | |
| 198 | - | ||
| 199 | - | ``` | |
| 200 | - | spec: | |
| 201 | - | 2004 | |
| 202 | - | 2004/10/1 | |
| 203 | - | ``` | |
| 204 | - | ||
| 205 | - | ```bash | |
| 206 | - | $ ledger bal|reg --period "until aug" | |
| 207 | - | $ ledger bal|reg --period "last oct" | |
| 208 | - | $ ledger bal|reg --period "every week" | |
| 209 | - | ``` | |
| 210 | - | {: .-setup} | |
| 211 | - | ||
| 212 | - | ### Register | |
| 213 | - | ||
| 214 | - | ```bash | |
| 215 | - | $ ledger reg | |
| 216 | - | ``` | |
| 217 | - | {: .-setup} | |
| 218 | - | ||
| 219 | - | ```bash | |
| 220 | - | -D, --daily | |
| 221 | - | -W, --weekly | |
| 222 | - | -M, --monthly | |
| 223 | - | --quarterly | |
| 224 | - | -Y, --yearly | |
| 225 | - | -s, --subtotal | |
| 226 | - | --start-of-week monday | |
| 227 | - | ``` | |
| 228 | - | ||
| 229 | - | ```bash | |
| 230 | - | -S, --sort date | |
| 231 | - | -S, --sort amount | |
| 232 | - | ``` | |
| 233 | - | ||
| 234 | - | ### Filters | |
| 235 | - | ||
| 236 | - | ```bash | |
| 237 | - | -b, --begin DATE | |
| 238 | - | -e, --end DATE | |
| 239 | - | ||
| 240 | - | -d payee =~ /pioneer/ | |
| 241 | - | ||
| 242 | - | -C, --cleared # (with *) | |
| 243 | - | -U, --uncleared # (no *) | |
| 244 | - | --pending # (with !) | |
| 245 | - | ||
| 246 | - | -R, --real # ignore virtual postings (eg: "(Cash) $-400") | |
| 247 | - | -L, --actual # no automated postings (eg: "= /^Income/") | |
| 248 | - | ||
| 249 | - | -r, --related # show the other side | |
| 250 | - | # "reg -r savings" shows where it comes from) | |
| 251 | - | ``` | |
| 252 | - | ||
| 253 | - | ### Queries | |
| 254 | - | ||
| 255 | - | ^regex$ | |
| 256 | - | @payee | |
| 257 | - | %tag | |
| 258 | - | %tag=value | |
| 259 | - | =note | |
| 260 | - | #code | |
| 261 | - | term and term | |
| 262 | - | term or term | |
| 263 | - | not term | |
| 264 | - | \( term \) | |
| 265 | - | ||
| 266 | - | Example: | |
| 267 | - | ||
| 268 | - | ledger r ^expenses and @Denny's | |
| 269 | - | ledger r food and @Starbucks and not dining | |
| 270 | - | ||
| 271 | - | ### Display | |
| 272 | - | ||
| 273 | - | ```bash | |
| 274 | - | -n, --collapse # [register] collapse entries | |
| 275 | - | # [balance] no grand total | |
| 276 | - | -s, --subtotal # [balance] show sub-accounts | |
| 277 | - | # [other] show subtotals | |
| 278 | - | --flat | |
| 279 | - | ``` | |
| 280 | - | ||
| 281 | - | ### Effective dates | |
| 282 | - | ||
| 283 | - | ```bash | |
| 284 | - | 2008/01/01=2008/01/14 Client invoice ; estimated date you'll be paid | |
| 285 | - | Assets:Accounts Receivable $100.00 | |
| 286 | - | Income: Client name | |
| 287 | - | ``` | |
| 288 | - | {: data-line="1"} | |
| 289 | - | ||
| 290 | - | Say you're in business. If you bill a customer, you can enter something like above. | |
| 291 | - | Then, when you receive the payment, you change it to: | |
| 292 | - | ||
| 293 | - | ```bash | |
| 294 | - | 2008/01/01=2008/01/15 Client invoice ; actual date money received | |
| 295 | - | Assets:Accounts Receivable $100.00 | |
| 296 | - | Income: Client name | |
| 297 | - | ``` | |
| 298 | - | {: data-line="1"} | |
| 299 | - | ||
| 300 | - | ## References | |
| 301 | - | {: .-one-column} | |
| 302 | - | ||
| 303 | - | * <http://ledger-cli.org/3.0/doc/ledger3.html> | |
| 304 | - | * <https://gist.github.com/agaviria/3317397> | |
| 305 | - | {: .-also-see} | |
| 306 | - | ||
| 307 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 308 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,45 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Less.js | |
| 3 | - | --- | |
| 4 | - | ||
| 5 | - | ### Functions | |
| 6 | - | ||
| 7 | - | unit(30px / 5px) #=> 6 | |
| 8 | - | unit(5, px) #=> 5px | |
| 9 | - | ||
| 10 | - | e("ms:stuff()") #=> ms:stuff() (unquote) | |
| 11 | - | ||
| 12 | - | %("count: %d", 1+2) #=> "count: 3" | |
| 13 | - | ||
| 14 | - | iscolor(@x) | |
| 15 | - | isstring(@x) | |
| 16 | - | isnumber(@x) | |
| 17 | - | iskeyword(@x) | |
| 18 | - | isurl(url(...)) | |
| 19 | - | ispixel() | |
| 20 | - | isem() | |
| 21 | - | ispercentage() | |
| 22 | - | isunit() | |
| 23 | - | ||
| 24 | - | hue(@color) | |
| 25 | - | saturation(@color) | |
| 26 | - | lightness(@color) | |
| 27 | - | luma(@color) | |
| 28 | - | luminance(@color) | |
| 29 | - | ||
| 30 | - | fade(@color, amount) | |
| 31 | - | fadein(@color, amount) | |
| 32 | - | fadeout(@color, amount) | |
| 33 | - | spin(@color, degrees) | |
| 34 | - | mix(@a, @b, amount) | |
| 35 | - | ||
| 36 | - | ### Conditionals | |
| 37 | - | ||
| 38 | - | .image when (luma(@color) > 50%) { } | |
| 39 | - | .image when (not(...)) { } | |
| 40 | - | .image when (default()) {} | |
| 41 | - | .image when (e(@shape) = 'circle') { } | |
| 42 | - | ||
| 43 | - | ||
| 44 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 45 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,303 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Lua | |
| 3 | - | --- | |
| 4 | - | ||
| 5 | - | ## Comments | |
| 6 | - | ||
| 7 | - | -- comment | |
| 8 | - | --[[ Multiline | |
| 9 | - | comment ]] | |
| 10 | - | ||
| 11 | - | ## Invoking functions | |
| 12 | - | ||
| 13 | - | print() | |
| 14 | - | print("Hi") | |
| 15 | - | ||
| 16 | - | -- You can omit parentheses if the argument is one string or table literal | |
| 17 | - | print "Hello World" <--> print("Hello World") | |
| 18 | - | dofile 'a.lua' <--> dofile ('a.lua') | |
| 19 | - | print [[a multi-line <--> print([[a multi-line | |
| 20 | - | message]] message]]) | |
| 21 | - | f{x=10, y=20} <--> f({x=10, y=20}) | |
| 22 | - | type{} <--> type({}) | |
| 23 | - | ||
| 24 | - | ## Tables / arrays | |
| 25 | - | ||
| 26 | - | t = {} | |
| 27 | - | t = { a = 1, b = 2 } | |
| 28 | - | t.a = function() ... end | |
| 29 | - | ||
| 30 | - | t = { ["hello"] = 200 } | |
| 31 | - | t.hello | |
| 32 | - | ||
| 33 | - | -- Remember, arrays are also tables | |
| 34 | - | array = { "a", "b", "c", "d" } | |
| 35 | - | print(array[2]) -- "b" (one-indexed) | |
| 36 | - | print(#array) -- 4 (length) | |
| 37 | - | ||
| 38 | - | ## Loops | |
| 39 | - | ||
| 40 | - | while condition do | |
| 41 | - | end | |
| 42 | - | ||
| 43 | - | for i = 1,5 do | |
| 44 | - | end | |
| 45 | - | ||
| 46 | - | for i = start,finish,delta do | |
| 47 | - | end | |
| 48 | - | ||
| 49 | - | for k,v in pairs(tab) do | |
| 50 | - | end | |
| 51 | - | ||
| 52 | - | repeat | |
| 53 | - | until condition | |
| 54 | - | ||
| 55 | - | -- Breaking out: | |
| 56 | - | while x do | |
| 57 | - | if condition then break end | |
| 58 | - | end | |
| 59 | - | ||
| 60 | - | ## Conditionals | |
| 61 | - | ||
| 62 | - | if condition then | |
| 63 | - | print("yes") | |
| 64 | - | elseif condition then | |
| 65 | - | print("maybe") | |
| 66 | - | else | |
| 67 | - | print("no") | |
| 68 | - | end | |
| 69 | - | ||
| 70 | - | ## Variables | |
| 71 | - | ||
| 72 | - | local x = 2 | |
| 73 | - | two, four = 2, 4 | |
| 74 | - | ||
| 75 | - | ## Functions | |
| 76 | - | ||
| 77 | - | function myFunction() | |
| 78 | - | return 1 | |
| 79 | - | end | |
| 80 | - | ||
| 81 | - | function myFunctionWithArgs(a, b) | |
| 82 | - | -- ... | |
| 83 | - | end | |
| 84 | - | ||
| 85 | - | myFunction() | |
| 86 | - | ||
| 87 | - | anonymousFunctions(function() | |
| 88 | - | -- ... | |
| 89 | - | end) | |
| 90 | - | ||
| 91 | - | -- Not exported in the module | |
| 92 | - | local function myPrivateFunction() | |
| 93 | - | end | |
| 94 | - | ||
| 95 | - | -- Splats | |
| 96 | - | function doAction(action, ...) | |
| 97 | - | print("Doing '"..action.."' to", ...) | |
| 98 | - | --> print("Doing 'write' to", "Shirley", "Abed") | |
| 99 | - | end | |
| 100 | - | ||
| 101 | - | doAction('write', "Shirley", "Abed") | |
| 102 | - | ||
| 103 | - | ## Lookups | |
| 104 | - | ||
| 105 | - | mytable = { x = 2, y = function() .. end } | |
| 106 | - | ||
| 107 | - | -- The same: | |
| 108 | - | mytable.x | |
| 109 | - | mytable['x'] | |
| 110 | - | ||
| 111 | - | -- Syntactic sugar, these are equivalent: | |
| 112 | - | mytable.y(mytable) | |
| 113 | - | mytable:y() | |
| 114 | - | ||
| 115 | - | mytable.y(mytable, a, b) | |
| 116 | - | mytable:y(a, b) | |
| 117 | - | ||
| 118 | - | function X:y(z) .. end | |
| 119 | - | function X.y(self, z) .. end | |
| 120 | - | ||
| 121 | - | ## Metatables | |
| 122 | - | ||
| 123 | - | ||
| 124 | - | mt = {} | |
| 125 | - | ||
| 126 | - | -- A metatable is simply a table with functions in it. | |
| 127 | - | mt.__tostring = function() return "lol" end | |
| 128 | - | mt.__add = function(b) ... end -- a + b | |
| 129 | - | mt.__mul = function(b) ... end -- a * b | |
| 130 | - | mt.__index = function(k) ... end -- Lookups (a[k] or a.k) | |
| 131 | - | mt.__newindex = function(k, v) ... end -- Setters (a[k] = v) | |
| 132 | - | ||
| 133 | - | -- Metatables allow you to override behavior of another table. | |
| 134 | - | mytable = {} | |
| 135 | - | setmetatable(mytable, mt) | |
| 136 | - | ||
| 137 | - | print(myobject) | |
| 138 | - | ||
| 139 | - | ## Classes | |
| 140 | - | ||
| 141 | - | Account = {} | |
| 142 | - | ||
| 143 | - | function Account:new(balance) | |
| 144 | - | local t = setmetatable({}, { __index = Account }) | |
| 145 | - | ||
| 146 | - | -- Your constructor stuff | |
| 147 | - | t.balance = (balance or 0) | |
| 148 | - | return t | |
| 149 | - | end | |
| 150 | - | ||
| 151 | - | function Account:withdraw(amount) | |
| 152 | - | print("Withdrawing "..amount.."...") | |
| 153 | - | self.balance = self.balance - amount | |
| 154 | - | self:report() | |
| 155 | - | end | |
| 156 | - | ||
| 157 | - | function Account:report() | |
| 158 | - | print("Your current balance is: "..self.balance) | |
| 159 | - | end | |
| 160 | - | ||
| 161 | - | a = Account:new(9000) | |
| 162 | - | a:withdraw(200) -- method call | |
| 163 | - | ||
| 164 | - | ## Constants | |
| 165 | - | ||
| 166 | - | nil | |
| 167 | - | false | |
| 168 | - | true | |
| 169 | - | ||
| 170 | - | ## Operators (and their metatable names) | |
| 171 | - | ||
| 172 | - | -- Relational (binary) | |
| 173 | - | -- __eq __lt __gt __le __ge | |
| 174 | - | == < > <= >= | |
| 175 | - | ~= -- Not equal, just like != | |
| 176 | - | ||
| 177 | - | -- Arithmetic (binary) | |
| 178 | - | -- __add __sub __muv __div __mod __pow | |
| 179 | - | + - * / % ^ | |
| 180 | - | ||
| 181 | - | -- Arithmetic (unary) | |
| 182 | - | -- __unm (unary minus) | |
| 183 | - | - | |
| 184 | - | ||
| 185 | - | -- Logic (and/or) | |
| 186 | - | nil and false --> nil | |
| 187 | - | false and nil --> false | |
| 188 | - | 0 and 20 --> 20 | |
| 189 | - | 10 and 20 --> 20 | |
| 190 | - | ||
| 191 | - | ||
| 192 | - | -- Length | |
| 193 | - | -- __len(array) | |
| 194 | - | #array | |
| 195 | - | ||
| 196 | - | ||
| 197 | - | -- Indexing | |
| 198 | - | -- __index(table, key) | |
| 199 | - | t[key] | |
| 200 | - | t.key | |
| 201 | - | ||
| 202 | - | -- __newindex(table, key, value) | |
| 203 | - | t[key]=value | |
| 204 | - | ||
| 205 | - | -- String concat | |
| 206 | - | -- __concat(left, right) | |
| 207 | - | "hello, "..name | |
| 208 | - | ||
| 209 | - | -- Call | |
| 210 | - | -- __call(func, ...) | |
| 211 | - | ||
| 212 | - | ||
| 213 | - | ## API: Global functions [(ref)](http://lua.gts-stolberg.de/en/Basis.php) | |
| 214 | - | ||
| 215 | - | dofile("hello.lua") | |
| 216 | - | loadfile("hello.lua") | |
| 217 | - | ||
| 218 | - | assert(x) -- x or (raise an error) | |
| 219 | - | assert(x, "failed") | |
| 220 | - | ||
| 221 | - | type(var) -- "nil" | "number" | "string" | "boolean" | "table" | "function" | "thread" | "userdata" | |
| 222 | - | ||
| 223 | - | -- Does /not/ invoke meta methods (__index and __newindex) | |
| 224 | - | rawset(t, index, value) -- Like t[index] = value | |
| 225 | - | rawget(t, index) -- Like t[index] | |
| 226 | - | ||
| 227 | - | _G -- Global context | |
| 228 | - | setfenv(1, {}) -- 1: current function, 2: caller, and so on -- {}: the new _G | |
| 229 | - | ||
| 230 | - | pairs(t) -- iterable list of {key, value} | |
| 231 | - | ipairs(t) -- iterable list of {index, value} | |
| 232 | - | ||
| 233 | - | tonumber("34") | |
| 234 | - | tonumber("8f", 16) | |
| 235 | - | ||
| 236 | - | ## API: Strings | |
| 237 | - | ||
| 238 | - | 'string'..'concatenation' | |
| 239 | - | ||
| 240 | - | s = "Hello" | |
| 241 | - | s:upper() | |
| 242 | - | s:lower() | |
| 243 | - | s:len() -- Just like #s | |
| 244 | - | ||
| 245 | - | s:find() | |
| 246 | - | s:gfind() | |
| 247 | - | ||
| 248 | - | s:match() | |
| 249 | - | s:gmatch() | |
| 250 | - | ||
| 251 | - | s:sub() | |
| 252 | - | s:gsub() | |
| 253 | - | ||
| 254 | - | s:rep() | |
| 255 | - | s:char() | |
| 256 | - | s:dump() | |
| 257 | - | s:reverse() | |
| 258 | - | s:byte() | |
| 259 | - | s:format() | |
| 260 | - | ||
| 261 | - | ## API: Tables | |
| 262 | - | ||
| 263 | - | table.foreach(t, function(row) ... end) | |
| 264 | - | table.setn | |
| 265 | - | table.insert(t, 21) -- append (--> t[#t+1] = 21) | |
| 266 | - | table.insert(t, 4, 99) | |
| 267 | - | table.getn | |
| 268 | - | table.concat | |
| 269 | - | table.sort | |
| 270 | - | table.remove(t, 4) | |
| 271 | - | ||
| 272 | - | ## API: Math [(ref)](http://lua-users.org/wiki/MathLibraryTutorial) | |
| 273 | - | ||
| 274 | - | math.abs math.acos math.asin math.atan math.atan2 | |
| 275 | - | math.ceil math.cos math.cosh math.deg math.exp | |
| 276 | - | math.floor math.fmod math.frexp math.ldexp math.log | |
| 277 | - | math.log10 math.max math.min math.modf math.pow | |
| 278 | - | math.rad math.random math.randomseed math.sin math.sinh | |
| 279 | - | math.sqrt math.tan math.tanh | |
| 280 | - | ||
| 281 | - | math.sqrt(144) | |
| 282 | - | math | |
| 283 | - | ||
| 284 | - | ## API: Misc | |
| 285 | - | ||
| 286 | - | io.output(io.open("file.txt", "w")) | |
| 287 | - | io.write(x) | |
| 288 | - | io.close() | |
| 289 | - | ||
| 290 | - | for line in io.lines("file.txt") | |
| 291 | - | ||
| 292 | - | file = assert(io.open("file.txt", "r")) | |
| 293 | - | file:read() | |
| 294 | - | file:lines() | |
| 295 | - | file:close() | |
| 296 | - | ||
| 297 | - | ## Reference | |
| 298 | - | ||
| 299 | - | https://www.lua.org/pil/13.html | |
| 300 | - | http://lua-users.org/wiki/ObjectOrientedProgramming | |
| 301 | - | ||
| 302 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 303 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,132 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Makefile | |
| 3 | - | prism_languages: [makefile] | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | category: CLI | |
| 6 | - | --- | |
| 7 | - | ||
| 8 | - | ## Var assignment | |
| 9 | - | ||
| 10 | - | ```makefile | |
| 11 | - | foo = "bar" | |
| 12 | - | bar = $(foo) foo # dynamic (renewing) assignment | |
| 13 | - | foo := "boo" # one time assignment, $(bar) now is "boo foo" | |
| 14 | - | foo ?= /usr/local # safe assignment, $(foo) and $(bar) still the same | |
| 15 | - | bar += world # append, "boo foo world" | |
| 16 | - | foo != echo fooo # exec shell command and assign to foo | |
| 17 | - | # $(bar) now is "fooo foo world" | |
| 18 | - | ``` | |
| 19 | - | ||
| 20 | - | `=` expressions are only evaluated when they're being used. | |
| 21 | - | ||
| 22 | - | ## Magic variables | |
| 23 | - | ||
| 24 | - | ```makefile | |
| 25 | - | out.o: src.c src.h | |
| 26 | - | $@ # "out.o" (target) | |
| 27 | - | $< # "src.c" (first prerequisite) | |
| 28 | - | $^ # "src.c src.h" (all prerequisites) | |
| 29 | - | ||
| 30 | - | %.o: %.c | |
| 31 | - | $* # the 'stem' with which an implicit rule matches ("foo" in "foo.c") | |
| 32 | - | ||
| 33 | - | also: | |
| 34 | - | $+ # prerequisites (all, with duplication) | |
| 35 | - | $? # prerequisites (new ones) | |
| 36 | - | $| # prerequisites (order-only?) | |
| 37 | - | ||
| 38 | - | $(@D) # target directory | |
| 39 | - | ``` | |
| 40 | - | ||
| 41 | - | ## Command prefixes | |
| 42 | - | ||
| 43 | - | | Prefix | Description | | |
| 44 | - | | ------ | ------------------------------------------- | | |
| 45 | - | | `-` | Ignore errors | | |
| 46 | - | | `@` | Don't print command | | |
| 47 | - | | `+` | Run even if Make is in 'don't execute' mode | | |
| 48 | - | ||
| 49 | - | ```makefile | |
| 50 | - | build: | |
| 51 | - | @echo "compiling" | |
| 52 | - | -gcc $< $@ | |
| 53 | - | ||
| 54 | - | -include .depend | |
| 55 | - | ``` | |
| 56 | - | ||
| 57 | - | ## Find files | |
| 58 | - | ||
| 59 | - | ```makefile | |
| 60 | - | js_files := $(wildcard test/*.js) | |
| 61 | - | all_files := $(shell find images -name "*") | |
| 62 | - | ``` | |
| 63 | - | ||
| 64 | - | ## Substitutions | |
| 65 | - | ||
| 66 | - | ```makefile | |
| 67 | - | file = $(SOURCE:.cpp=.o) # foo.cpp => foo.o | |
| 68 | - | outputs = $(files:src/%.coffee=lib/%.js) | |
| 69 | - | ||
| 70 | - | outputs = $(patsubst %.c, %.o, $(wildcard *.c)) | |
| 71 | - | assets = $(patsubst images/%, assets/%, $(wildcard images/*)) | |
| 72 | - | ``` | |
| 73 | - | ||
| 74 | - | ## More functions | |
| 75 | - | ||
| 76 | - | ```makefile | |
| 77 | - | $(strip $(string_var)) | |
| 78 | - | ||
| 79 | - | $(filter %.less, $(files)) | |
| 80 | - | $(filter-out %.less, $(files)) | |
| 81 | - | ``` | |
| 82 | - | ||
| 83 | - | ## Building files | |
| 84 | - | ||
| 85 | - | ```makefile | |
| 86 | - | %.o: %.c | |
| 87 | - | ffmpeg -i $< > $@ # Input and output | |
| 88 | - | foo $^ | |
| 89 | - | ``` | |
| 90 | - | ||
| 91 | - | ## Includes | |
| 92 | - | ||
| 93 | - | ```makefile | |
| 94 | - | -include foo.make | |
| 95 | - | ``` | |
| 96 | - | ||
| 97 | - | ## Options | |
| 98 | - | ||
| 99 | - | ```sh | |
| 100 | - | make | |
| 101 | - | -e, --environment-overrides | |
| 102 | - | -B, --always-make | |
| 103 | - | -s, --silent | |
| 104 | - | -j, --jobs=N # parallel processing | |
| 105 | - | ``` | |
| 106 | - | ||
| 107 | - | ## Conditionals | |
| 108 | - | ||
| 109 | - | ```makefile | |
| 110 | - | foo: $(objects) | |
| 111 | - | ifeq ($(CC),gcc) | |
| 112 | - | $(CC) -o foo $(objects) $(libs_for_gcc) | |
| 113 | - | else | |
| 114 | - | $(CC) -o foo $(objects) $(normal_libs) | |
| 115 | - | endif | |
| 116 | - | ``` | |
| 117 | - | ||
| 118 | - | ## Recursive | |
| 119 | - | ||
| 120 | - | ```makefile | |
| 121 | - | deploy: | |
| 122 | - | $(MAKE) deploy2 | |
| 123 | - | ``` | |
| 124 | - | ||
| 125 | - | ## Further reading | |
| 126 | - | ||
| 127 | - | - [isaacs's Makefile](https://gist.github.com/isaacs/62a2d1825d04437c6f08) | |
| 128 | - | - [Your Makefiles are wrong](https://tech.davis-hansson.com/p/make/) | |
| 129 | - | - [Manual](https://www.gnu.org/software/make/manual/html_node/index.html) | |
| 130 | - | ||
| 131 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 132 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,21 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Man | |
| 3 | - | category: CLI | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | --- | |
| 6 | - | ||
| 7 | - | ### Man paths | |
| 8 | - | ||
| 9 | - | | `1` | General User Commands | | |
| 10 | - | | `2` | System Calls | | |
| 11 | - | | `3` | Library Routines | | |
| 12 | - | | `4` | Special Files and Sockets | | |
| 13 | - | | `5` | File formats and Conventions | | |
| 14 | - | | `6` | Games and Fun Stuff | | |
| 15 | - | | `7` | Miscellaneous Documentation | | |
| 16 | - | | `8` | System Administration | | |
| 17 | - | | `9` | Kernel and Programming Style | | |
| 18 | - | | `n` | Tcl/Tk | | |
| 19 | - | ||
| 20 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 21 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,167 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Markdown | |
| 3 | - | category: Markup | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | prism_languages: [markdown] | |
| 6 | - | updated: 2020-07-01 | |
| 7 | - | weight: -1 | |
| 8 | - | --- | |
| 9 | - | ||
| 10 | - | ## Reference | |
| 11 | - | {:.-three-column} | |
| 12 | - | ||
| 13 | - | ### Headers | |
| 14 | - | ||
| 15 | - | ```markdown | |
| 16 | - | # h1 | |
| 17 | - | ## h2 | |
| 18 | - | ### h3 | |
| 19 | - | #### h4 | |
| 20 | - | ##### h5 | |
| 21 | - | ###### h6 | |
| 22 | - | ``` | |
| 23 | - | ||
| 24 | - | ```markdown | |
| 25 | - | Header 1 | |
| 26 | - | ======== | |
| 27 | - | ``` | |
| 28 | - | ||
| 29 | - | ```markdown | |
| 30 | - | Header 2 | |
| 31 | - | -------- | |
| 32 | - | ``` | |
| 33 | - | ||
| 34 | - | ### Emphasis | |
| 35 | - | ||
| 36 | - | ```markdown | |
| 37 | - | *italic* | |
| 38 | - | _italic_ | |
| 39 | - | ``` | |
| 40 | - | ||
| 41 | - | ```markdown | |
| 42 | - | **bold** | |
| 43 | - | __bold__ | |
| 44 | - | ``` | |
| 45 | - | ||
| 46 | - | ```markdown | |
| 47 | - | ***bold italic*** | |
| 48 | - | ___bold italic___ | |
| 49 | - | ``` | |
| 50 | - | ||
| 51 | - | ```markdown | |
| 52 | - | ~~strikethrough~~ | |
| 53 | - | ``` | |
| 54 | - | ||
| 55 | - | ```markdown | |
| 56 | - | `code` | |
| 57 | - | ``` | |
| 58 | - | ||
| 59 | - | ### Lists | |
| 60 | - | ||
| 61 | - | ```markdown | |
| 62 | - | * Item 1 | |
| 63 | - | * Item 2 | |
| 64 | - | ``` | |
| 65 | - | ||
| 66 | - | ```markdown | |
| 67 | - | - Item 1 | |
| 68 | - | - Item 2 | |
| 69 | - | ``` | |
| 70 | - | ||
| 71 | - | ```markdown | |
| 72 | - | - [ ] Checkbox off | |
| 73 | - | - [x] Checkbox on | |
| 74 | - | ``` | |
| 75 | - | ||
| 76 | - | ```markdown | |
| 77 | - | 1. Item 1 | |
| 78 | - | 2. Item 2 | |
| 79 | - | ``` | |
| 80 | - | ||
| 81 | - | ### Links | |
| 82 | - | ||
| 83 | - | ```markdown | |
| 84 | - | [link](http://google.com) | |
| 85 | - | ``` | |
| 86 | - | ||
| 87 | - | ```markdown | |
| 88 | - | [link][google] | |
| 89 | - | [google]: http://google.com | |
| 90 | - | ``` | |
| 91 | - | ||
| 92 | - | ```markdown | |
| 93 | - | <http://google.com> | |
| 94 | - | ``` | |
| 95 | - | ||
| 96 | - | ### Images | |
| 97 | - | ||
| 98 | - | ```markdown | |
| 99 | - |  | |
| 100 | - |  | |
| 101 | - | ![Image alt text][img] | |
| 102 | - | ``` | |
| 103 | - | ||
| 104 | - | ```markdown | |
| 105 | - | [img]: http://foo.com/img.jpg | |
| 106 | - | ``` | |
| 107 | - | ||
| 108 | - | ### Code | |
| 109 | - | ||
| 110 | - | ```markdown | |
| 111 | - | `inline code` | |
| 112 | - | ``` | |
| 113 | - | ||
| 114 | - | ``` | |
| 115 | - | 4 space indent | |
| 116 | - | makes a code block | |
| 117 | - | ``` | |
| 118 | - | ||
| 119 | - | ~~~markdown | |
| 120 | - | ``` | |
| 121 | - | code fences | |
| 122 | - | ``` | |
| 123 | - | ~~~ | |
| 124 | - | ||
| 125 | - | ||
| 126 | - | ~~~markdown | |
| 127 | - | ```js | |
| 128 | - | codeFences.withLanguage() | |
| 129 | - | ``` | |
| 130 | - | ~~~ | |
| 131 | - | ||
| 132 | - | ### Blockquotes | |
| 133 | - | ||
| 134 | - | ```markdown | |
| 135 | - | > This is | |
| 136 | - | > a blockquote | |
| 137 | - | > | |
| 138 | - | > > Nested | |
| 139 | - | > > Blockquote | |
| 140 | - | ``` | |
| 141 | - | ||
| 142 | - | ### Horizontal line | |
| 143 | - | ||
| 144 | - | ```markdown | |
| 145 | - | ---- | |
| 146 | - | ``` | |
| 147 | - | ||
| 148 | - | ```markdown | |
| 149 | - | **** | |
| 150 | - | ``` | |
| 151 | - | ||
| 152 | - | ### Tables | |
| 153 | - | ||
| 154 | - | ```markdown | |
| 155 | - | | Column 1 Heading | Column 2 Heading | | |
| 156 | - | | ---------------- | ---------------- | | |
| 157 | - | | Some content | Other content | | |
| 158 | - | ``` | |
| 159 | - | ||
| 160 | - | ```markdown | |
| 161 | - | Column 1 Heading | Column 2 Heading | |
| 162 | - | --- | --- | |
| 163 | - | Some content | Other content | |
| 164 | - | ``` | |
| 165 | - | ||
| 166 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 167 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,271 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: MySQL | |
| 3 | - | updated: 2020-07-05 | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | category: Databases | |
| 6 | - | --- | |
| 7 | - | ||
| 8 | - | ### Browsing | |
| 9 | - | ||
| 10 | - | ```sql | |
| 11 | - | SHOW DATABASES; | |
| 12 | - | SHOW TABLES; | |
| 13 | - | SHOW FIELDS FROM table / DESCRIBE table; | |
| 14 | - | SHOW CREATE TABLE table; | |
| 15 | - | SHOW PROCESSLIST; | |
| 16 | - | KILL process_number; | |
| 17 | - | ``` | |
| 18 | - | ||
| 19 | - | ### Select | |
| 20 | - | ||
| 21 | - | ```sql | |
| 22 | - | SELECT * FROM table; | |
| 23 | - | SELECT * FROM table1, table2; | |
| 24 | - | SELECT field1, field2 FROM table1, table2; | |
| 25 | - | SELECT ... FROM ... WHERE condition | |
| 26 | - | SELECT ... FROM ... WHERE condition GROUP BY field; | |
| 27 | - | SELECT ... FROM ... WHERE condition GROUP BY field HAVING condition2; | |
| 28 | - | SELECT ... FROM ... WHERE condition ORDER BY field1, field2; | |
| 29 | - | SELECT ... FROM ... WHERE condition ORDER BY field1, field2 DESC; | |
| 30 | - | SELECT ... FROM ... WHERE condition LIMIT 10; | |
| 31 | - | SELECT DISTINCT field1 FROM ... | |
| 32 | - | SELECT DISTINCT field1, field2 FROM ... | |
| 33 | - | ``` | |
| 34 | - | ||
| 35 | - | ### Select - Join | |
| 36 | - | ||
| 37 | - | ```sql | |
| 38 | - | SELECT ... FROM t1 JOIN t2 ON t1.id1 = t2.id2 WHERE condition; | |
| 39 | - | SELECT ... FROM t1 LEFT JOIN t2 ON t1.id1 = t2.id2 WHERE condition; | |
| 40 | - | SELECT ... FROM t1 JOIN (t2 JOIN t3 ON ...) ON ... | |
| 41 | - | ``` | |
| 42 | - | ||
| 43 | - | ### Conditions | |
| 44 | - | ||
| 45 | - | ```sql | |
| 46 | - | field1 = value1 | |
| 47 | - | field1 <> value1 | |
| 48 | - | field1 LIKE 'value _ %' | |
| 49 | - | field1 IS NULL | |
| 50 | - | field1 IS NOT NULL | |
| 51 | - | field1 IS IN (value1, value2) | |
| 52 | - | field1 IS NOT IN (value1, value2) | |
| 53 | - | condition1 AND condition2 | |
| 54 | - | condition1 OR condition2 | |
| 55 | - | ``` | |
| 56 | - | ||
| 57 | - | ### Create / Open / Delete Database | |
| 58 | - | ||
| 59 | - | ```sql | |
| 60 | - | CREATE DATABASE DatabaseName; | |
| 61 | - | CREATE DATABASE DatabaseName CHARACTER SET utf8; | |
| 62 | - | USE DatabaseName; | |
| 63 | - | DROP DATABASE DatabaseName; | |
| 64 | - | ALTER DATABASE DatabaseName CHARACTER SET utf8; | |
| 65 | - | ``` | |
| 66 | - | ||
| 67 | - | ### Backup Database to SQL File | |
| 68 | - | ||
| 69 | - | ```bash | |
| 70 | - | mysqldump -u Username -p dbNameYouWant > databasename_backup.sql | |
| 71 | - | ``` | |
| 72 | - | ||
| 73 | - | ### Restore from backup SQL File | |
| 74 | - | ||
| 75 | - | ```bash | |
| 76 | - | mysql -u Username -p dbNameYouWant < databasename_backup.sql; | |
| 77 | - | ``` | |
| 78 | - | ||
| 79 | - | ### Repair Tables After Unclean Shutdown | |
| 80 | - | ||
| 81 | - | ```bash | |
| 82 | - | mysqlcheck --all-databases; | |
| 83 | - | mysqlcheck --all-databases --fast; | |
| 84 | - | ``` | |
| 85 | - | ||
| 86 | - | ### Insert | |
| 87 | - | ||
| 88 | - | ```sql | |
| 89 | - | INSERT INTO table1 (field1, field2) VALUES (value1, value2); | |
| 90 | - | ``` | |
| 91 | - | ||
| 92 | - | ### Delete | |
| 93 | - | ||
| 94 | - | ```sql | |
| 95 | - | DELETE FROM table1 / TRUNCATE table1 | |
| 96 | - | DELETE FROM table1 WHERE condition | |
| 97 | - | DELETE FROM table1, table2 WHERE table1.id1 = | |
| 98 | - | table2.id2 AND condition | |
| 99 | - | ``` | |
| 100 | - | ||
| 101 | - | ### Update | |
| 102 | - | ||
| 103 | - | ```sql | |
| 104 | - | UPDATE table1 SET field1=new_value1 WHERE condition; | |
| 105 | - | UPDATE table1, table2 SET field1=new_value1, field2=new_value2, ... WHERE | |
| 106 | - | table1.id1 = table2.id2 AND condition; | |
| 107 | - | ``` | |
| 108 | - | ||
| 109 | - | ### Create / Delete / Modify Table | |
| 110 | - | ||
| 111 | - | #### Create | |
| 112 | - | ||
| 113 | - | ```sql | |
| 114 | - | CREATE TABLE table (field1 type1, field2 type2); | |
| 115 | - | CREATE TABLE table (field1 type1, field2 type2, INDEX (field)); | |
| 116 | - | CREATE TABLE table (field1 type1, field2 type2, PRIMARY KEY (field1)); | |
| 117 | - | CREATE TABLE table (field1 type1, field2 type2, PRIMARY KEY (field1,field2)); | |
| 118 | - | ``` | |
| 119 | - | ||
| 120 | - | ```sql | |
| 121 | - | CREATE TABLE table1 (fk_field1 type1, field2 type2, ..., | |
| 122 | - | FOREIGN KEY (fk_field1) REFERENCES table2 (t2_fieldA)) | |
| 123 | - | [ON UPDATE|ON DELETE] [CASCADE|SET NULL] | |
| 124 | - | ``` | |
| 125 | - | ||
| 126 | - | ```sql | |
| 127 | - | CREATE TABLE table1 (fk_field1 type1, fk_field2 type2, ..., | |
| 128 | - | FOREIGN KEY (fk_field1, fk_field2) REFERENCES table2 (t2_fieldA, t2_fieldB)) | |
| 129 | - | ``` | |
| 130 | - | ||
| 131 | - | ```sql | |
| 132 | - | CREATE TABLE table IF NOT EXISTS; | |
| 133 | - | ``` | |
| 134 | - | ||
| 135 | - | ```sql | |
| 136 | - | CREATE TEMPORARY TABLE table; | |
| 137 | - | ``` | |
| 138 | - | ||
| 139 | - | #### Drop | |
| 140 | - | ||
| 141 | - | ```sql | |
| 142 | - | DROP TABLE table; | |
| 143 | - | DROP TABLE IF EXISTS table; | |
| 144 | - | DROP TABLE table1, table2, ... | |
| 145 | - | ``` | |
| 146 | - | ||
| 147 | - | #### Alter | |
| 148 | - | ||
| 149 | - | ```sql | |
| 150 | - | ALTER TABLE table MODIFY field1 type1 | |
| 151 | - | ALTER TABLE table MODIFY field1 type1 NOT NULL ... | |
| 152 | - | ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 | |
| 153 | - | ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 NOT NULL ... | |
| 154 | - | ALTER TABLE table ALTER field1 SET DEFAULT ... | |
| 155 | - | ALTER TABLE table ALTER field1 DROP DEFAULT | |
| 156 | - | ALTER TABLE table ADD new_name_field1 type1 | |
| 157 | - | ALTER TABLE table ADD new_name_field1 type1 FIRST | |
| 158 | - | ALTER TABLE table ADD new_name_field1 type1 AFTER another_field | |
| 159 | - | ALTER TABLE table DROP field1 | |
| 160 | - | ALTER TABLE table ADD INDEX (field); | |
| 161 | - | ``` | |
| 162 | - | ||
| 163 | - | #### Change field order | |
| 164 | - | ||
| 165 | - | ```sql | |
| 166 | - | ALTER TABLE table MODIFY field1 type1 FIRST | |
| 167 | - | ALTER TABLE table MODIFY field1 type1 AFTER another_field | |
| 168 | - | ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 FIRST | |
| 169 | - | ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 AFTER | |
| 170 | - | another_field | |
| 171 | - | ``` | |
| 172 | - | ||
| 173 | - | ### Keys | |
| 174 | - | ||
| 175 | - | ```sql | |
| 176 | - | CREATE TABLE table (..., PRIMARY KEY (field1, field2)) | |
| 177 | - | CREATE TABLE table (..., FOREIGN KEY (field1, field2) REFERENCES table2 | |
| 178 | - | (t2_field1, t2_field2)) | |
| 179 | - | ``` | |
| 180 | - | ||
| 181 | - | ### Users and Privileges | |
| 182 | - | ||
| 183 | - | ```sql | |
| 184 | - | CREATE USER 'user'@'localhost'; | |
| 185 | - | GRANT ALL PRIVILEGES ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password'; | |
| 186 | - | GRANT SELECT, INSERT, DELETE ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password'; | |
| 187 | - | REVOKE ALL PRIVILEGES ON base.* FROM 'user'@'host'; -- one permission only | |
| 188 | - | REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'host'; -- all permissions | |
| 189 | - | FLUSH PRIVILEGES; | |
| 190 | - | ``` | |
| 191 | - | ||
| 192 | - | ```sql | |
| 193 | - | SET PASSWORD = PASSWORD('new_pass'); | |
| 194 | - | SET PASSWORD FOR 'user'@'host' = PASSWORD('new_pass'); | |
| 195 | - | SET PASSWORD = OLD_PASSWORD('new_pass'); | |
| 196 | - | ``` | |
| 197 | - | ||
| 198 | - | ```sql | |
| 199 | - | DROP USER 'user'@'host'; | |
| 200 | - | ``` | |
| 201 | - | ||
| 202 | - | Host ‘%’ indicates any host. | |
| 203 | - | ||
| 204 | - | ### Main Data Types | |
| 205 | - | ||
| 206 | - | ```sql | |
| 207 | - | TINYINT (1o: -128 to +127) | |
| 208 | - | SMALLINT (2o: +-65 000) | |
| 209 | - | MEDIUMINT (3o: +-16 000 000) | |
| 210 | - | INT (4o: +- 2 000 000 000) | |
| 211 | - | BIGINT (8o: +-9.10^18) | |
| 212 | - | ``` | |
| 213 | - | ||
| 214 | - | ```sql | |
| 215 | - | Precise interval: -(2^(8*N-1)) -> (2^8*N)-1 | |
| 216 | - | ``` | |
| 217 | - | ||
| 218 | - | ⚠ INT(2) = "2 digits displayed" -- NOT "number with 2 digits max" | |
| 219 | - | ||
| 220 | - | ```sql | |
| 221 | - | FLOAT(M,D) | |
| 222 | - | DOUBLE(M,D) | |
| 223 | - | FLOAT(D=0->53) | |
| 224 | - | ``` | |
| 225 | - | ||
| 226 | - | ⚠ 8,3 -> 12345,678 -- NOT 12345678,123! | |
| 227 | - | ||
| 228 | - | ```sql | |
| 229 | - | TIME (HH:MM) | |
| 230 | - | YEAR (AAAA) | |
| 231 | - | DATE (AAAA-MM-JJ) | |
| 232 | - | DATETIME (AAAA-MM-JJ HH:MM; années 1000->9999) | |
| 233 | - | TIMESTAMP (like DATETIME, but 1970->2038, compatible with Unix) | |
| 234 | - | ``` | |
| 235 | - | ||
| 236 | - | ```sql | |
| 237 | - | VARCHAR (single-line; explicit size) | |
| 238 | - | TEXT (multi-lines; max size=65535) | |
| 239 | - | BLOB (binary; max size=65535) | |
| 240 | - | ``` | |
| 241 | - | ||
| 242 | - | Variants for TEXT&BLOB: `TINY` (max=255), `MEDIUM` (max=~16000), and `LONG` (max=4Go). Ex: `VARCHAR(32)`, `TINYTEXT`, `LONGBLOB`, `MEDIUMTEXT` | |
| 243 | - | ||
| 244 | - | ```sql | |
| 245 | - | ENUM ('value1', 'value2', ...) -- (default NULL, or '' if NOT NULL) | |
| 246 | - | ``` | |
| 247 | - | ||
| 248 | - | ### Reset Root Password | |
| 249 | - | ||
| 250 | - | ```bash | |
| 251 | - | $ /etc/init.d/mysql stop | |
| 252 | - | ``` | |
| 253 | - | ||
| 254 | - | ```bash | |
| 255 | - | $ mysqld_safe --skip-grant-tables | |
| 256 | - | ``` | |
| 257 | - | ||
| 258 | - | ```bash | |
| 259 | - | $ mysql # on another terminal | |
| 260 | - | mysql> UPDATE mysql.user SET password=PASSWORD('new_pass') WHERE user='root'; | |
| 261 | - | ``` | |
| 262 | - | ||
| 263 | - | ```bash | |
| 264 | - | ## Switch back to the mysqld_safe terminal and kill the process using Control + \ | |
| 265 | - | $ /etc/init.d/mysql start | |
| 266 | - | ``` | |
| 267 | - | ||
| 268 | - | Your commands may vary depending on your OS. | |
| 269 | - | ||
| 270 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 271 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,116 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Org Mode | |
| 3 | - | layout: 2017/sheet | |
| 4 | - | tags: [WIP] | |
| 5 | - | category: Apps | |
| 6 | - | updated: 2018-02-19 | |
| 7 | - | intro: | | |
| 8 | - | [Org mode](https://orgmode.org/) is for keeping hierarchal notes (and more) in Emacs. | |
| 9 | - | --- | |
| 10 | - | ||
| 11 | - | ## Syntax | |
| 12 | - | {: .-three-column} | |
| 13 | - | ||
| 14 | - | ### Headings | |
| 15 | - | ||
| 16 | - | ```org | |
| 17 | - | * Welcome to Org mode | |
| 18 | - | ||
| 19 | - | Lines starting with * are headings. | |
| 20 | - | These lines without are notes. | |
| 21 | - | ||
| 22 | - | ** Sub-heading | |
| 23 | - | ||
| 24 | - | Two stars mark a 2nd-level subheading (h2). | |
| 25 | - | ``` | |
| 26 | - | ||
| 27 | - | ### Lists | |
| 28 | - | ||
| 29 | - | ```org | |
| 30 | - | * Lists | |
| 31 | - | ||
| 32 | - | To buy: | |
| 33 | - | 1. Milk | |
| 34 | - | 2. Eggs | |
| 35 | - | - Organic | |
| 36 | - | 3. Cheese | |
| 37 | - | + Parmesan | |
| 38 | - | + Mozarella | |
| 39 | - | ``` | |
| 40 | - | ||
| 41 | - | ### Inline styles | |
| 42 | - | ||
| 43 | - | ```org | |
| 44 | - | *bold* | |
| 45 | - | /italic/ | |
| 46 | - | _underline_ | |
| 47 | - | =verbatim= | |
| 48 | - | ~code~ | |
| 49 | - | +strike-through+ | |
| 50 | - | ``` | |
| 51 | - | ||
| 52 | - | ### To do | |
| 53 | - | ||
| 54 | - | ```org | |
| 55 | - | * TODO buy airplane | |
| 56 | - | ``` | |
| 57 | - | ||
| 58 | - | Cycle by using `S-LEFT` / `S-RIGHT`. List all TODO's via `C-c C-v`. | |
| 59 | - | ||
| 60 | - | ## Shortcuts | |
| 61 | - | {: .-three-column} | |
| 62 | - | ||
| 63 | - | ### Basic shortcuts | |
| 64 | - | ||
| 65 | - | | Description | Shortcut | | |
| 66 | - | | --- | --- | | |
| 67 | - | | (Un) fold | `TAB` / `S-TAB` | | |
| 68 | - | | Move up | `M-UP` / `M-DOWN` | | |
| 69 | - | | New headline | `M-RET` | | |
| 70 | - | | Cycle workflow | `S-LEFT` / `S-RIGHT` | | |
| 71 | - | | Cycle priority | `S-UP` / `S-DOWN` | | |
| 72 | - | {:.-shortcuts-right} | |
| 73 | - | ||
| 74 | - | ### Timer | |
| 75 | - | ||
| 76 | - | | Description | Shortcut | | |
| 77 | - | | --- | --- | | |
| 78 | - | | Start timer | `C-c` `C-x` `0` | | |
| 79 | - | | Stop timer | `C-c` `C-x` `_` | | |
| 80 | - | | Pause timer | `C-c` `C-x` `,` | | |
| 81 | - | | --- | --- | | |
| 82 | - | | Start countdown | `C-c` `C-x` `;` | | |
| 83 | - | {:.-shortcuts-right} | |
| 84 | - | ||
| 85 | - | You can use this for Pomodoro! | |
| 86 | - | ||
| 87 | - | ### Agenda | |
| 88 | - | ||
| 89 | - | | Description | Shortcut | | |
| 90 | - | | --- | --- | | |
| 91 | - | | Agenda menu | `C-c` `a` | | |
| 92 | - | | --- | --- | | |
| 93 | - | | Add document | `C-c` `[` | | |
| 94 | - | | Remove document | `C-c` `]` | | |
| 95 | - | | --- | --- | | |
| 96 | - | | Add date | `C-c` `.` | | |
| 97 | - | | Add time & date | `C-u` `C-c` `.` | | |
| 98 | - | {:.-shortcuts-right} | |
| 99 | - | ||
| 100 | - | Start by adding the current file to the agenda (`C-c [`), then use the agenda menu to navigate. | |
| 101 | - | ||
| 102 | - | ### Export | |
| 103 | - | ||
| 104 | - | | Description | Shortcut | | |
| 105 | - | | --- | --- | | |
| 106 | - | | Export menu | `C-c` `C-e` | | |
| 107 | - | ||
| 108 | - | Lets you export the document as Markdown, HTML, and others. | |
| 109 | - | ||
| 110 | - | ## References | |
| 111 | - | ||
| 112 | - | - [Org for beginners](https://orgmode.org/worg/org-tutorials/org4beginners.html) _(orgmode.org)_ | |
| 113 | - | - [Org mode website](https://orgmode.org/) _(orgmode.org)_ | |
| 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 |
| ... | ... | @@ -1,27 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: PostgreSQL | |
| 3 | - | category: Databases | |
| 4 | - | --- | |
| 5 | - | ||
| 6 | - | Replace anything within `<placeholder>` accordingly | |
| 7 | - | ||
| 8 | - | ### Console | |
| 9 | - | ||
| 10 | - | $ psql #logs in to default database & default user | |
| 11 | - | $ sudo -u <rolename:postgres> psql #logs in with a particular user | |
| 12 | - | ||
| 13 | - | ### Commands | |
| 14 | - | ||
| 15 | - | * Show roles: `\du` | |
| 16 | - | * Show tables: `\dt` | |
| 17 | - | * Show databases: `\l` | |
| 18 | - | * Connect to a database: `\c <database>` | |
| 19 | - | * Show columns of a table: `\d <table>` or `\d+ <table>` | |
| 20 | - | * Quit: `\q` | |
| 21 | - | ||
| 22 | - | ### Creating database | |
| 23 | - | ||
| 24 | - | $ createdb databasename | |
| 25 | - | ||
| 26 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 27 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,170 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Python | |
| 3 | - | category: Python | |
| 4 | - | --- | |
| 5 | - | ||
| 6 | - | ### Tuples (immutable) | |
| 7 | - | ||
| 8 | - | tuple = () | |
| 9 | - | ||
| 10 | - | ### Lists (mutable) | |
| 11 | - | ||
| 12 | - | list = [] | |
| 13 | - | list[i:j] # returns list subset | |
| 14 | - | list[-1] # returns last element | |
| 15 | - | list[:-1] # returns all but the last element | |
| 16 | - | *list # expands all elements in place | |
| 17 | - | ||
| 18 | - | list[i] = val | |
| 19 | - | list[i:j] = otherlist # replace ith to jth-1 elements with otherlist | |
| 20 | - | del list[i:j] | |
| 21 | - | ||
| 22 | - | list.append(item) | |
| 23 | - | list.extend(another_list) | |
| 24 | - | list.insert(index, item) | |
| 25 | - | list.pop() # returns and removes last element from the list | |
| 26 | - | list.pop(i) # returns and removes i-th element from the list | |
| 27 | - | list.remove(i) # removes the first item from the list whose value is i | |
| 28 | - | list1 + list2 # combine two list | |
| 29 | - | set(list) # remove duplicate elements from a list | |
| 30 | - | ||
| 31 | - | list.reverse() # reverses the elements of the list in-place | |
| 32 | - | list.count(item) | |
| 33 | - | sum(list) | |
| 34 | - | ||
| 35 | - | zip(list1, list2) # returns list of tuples with n-th element of both list1 and list2 | |
| 36 | - | list.sort() # sorts in-place, returns None | |
| 37 | - | sorted(list) # returns sorted copy of list | |
| 38 | - | ",".join(list) # returns a string with list elements seperated by comma | |
| 39 | - | ||
| 40 | - | ### Dict | |
| 41 | - | ||
| 42 | - | dict = {} | |
| 43 | - | dict.keys() | |
| 44 | - | dict.values() | |
| 45 | - | "key" in dict # let's say this returns False, then... | |
| 46 | - | dict["key"] # ...this raises KeyError | |
| 47 | - | dict.get("key") # ...this returns None | |
| 48 | - | dict.setdefault("key", 1) | |
| 49 | - | **dict # expands all k/v pairs in place | |
| 50 | - | ||
| 51 | - | ### Iteration | |
| 52 | - | ||
| 53 | - | for item in ["a", "b", "c"]: | |
| 54 | - | for i in range(4): # 0 to 3 | |
| 55 | - | for i in range(4, 8): # 4 to 7 | |
| 56 | - | for i in range(1, 9, 2): # 1, 3, 5, 7 | |
| 57 | - | for key, val in dict.items(): | |
| 58 | - | for index, item in enumerate(list): | |
| 59 | - | ||
| 60 | - | ### [String](https://docs.python.org/2/library/stdtypes.html#string-methods) | |
| 61 | - | ||
| 62 | - | str[0:4] | |
| 63 | - | len(str) | |
| 64 | - | ||
| 65 | - | string.replace("-", " ") | |
| 66 | - | ",".join(list) | |
| 67 | - | "hi {0}".format('j') | |
| 68 | - | f"hi {name}" # same as "hi {}".format('name') | |
| 69 | - | str.find(",") | |
| 70 | - | str.index(",") # same, but raises IndexError | |
| 71 | - | str.count(",") | |
| 72 | - | str.split(",") | |
| 73 | - | ||
| 74 | - | str.lower() | |
| 75 | - | str.upper() | |
| 76 | - | str.title() | |
| 77 | - | ||
| 78 | - | str.lstrip() | |
| 79 | - | str.rstrip() | |
| 80 | - | str.strip() | |
| 81 | - | ||
| 82 | - | str.islower() | |
| 83 | - | ||
| 84 | - | /* escape characters */ | |
| 85 | - | >>> 'doesn\'t' # use \' to escape the single quote... | |
| 86 | - | "doesn't" | |
| 87 | - | >>> "doesn't" # ...or use double quotes instead | |
| 88 | - | "doesn't" | |
| 89 | - | >>> '"Yes," they said.' | |
| 90 | - | '"Yes," they said.' | |
| 91 | - | >>> "\"Yes,\" they said." | |
| 92 | - | '"Yes," they said.' | |
| 93 | - | >>> '"Isn\'t," they said.' | |
| 94 | - | '"Isn\'t," they said.' | |
| 95 | - | ||
| 96 | - | ### Casting | |
| 97 | - | ||
| 98 | - | int(str) | |
| 99 | - | float(str) | |
| 100 | - | str(int) | |
| 101 | - | str(float) | |
| 102 | - | 'string'.encode() | |
| 103 | - | ||
| 104 | - | ### Comprehensions | |
| 105 | - | ||
| 106 | - | [fn(i) for i in list] # .map | |
| 107 | - | map(fn, list) # .map, returns iterator | |
| 108 | - | ||
| 109 | - | filter(fn, list) # .filter, returns iterator | |
| 110 | - | [fn(i) for i in list if i > 0] # .filter.map | |
| 111 | - | ||
| 112 | - | ### Regex | |
| 113 | - | ||
| 114 | - | import re | |
| 115 | - | ||
| 116 | - | re.match(r'^[aeiou]', str) | |
| 117 | - | re.sub(r'^[aeiou]', '?', str) | |
| 118 | - | re.sub(r'(xyz)', r'\1', str) | |
| 119 | - | ||
| 120 | - | expr = re.compile(r'^...$') | |
| 121 | - | expr.match(...) | |
| 122 | - | expr.sub(...) | |
| 123 | - | ||
| 124 | - | ## File manipulation | |
| 125 | - | ||
| 126 | - | ### Reading | |
| 127 | - | ||
| 128 | - | ```py | |
| 129 | - | file = open("hello.txt", "r") # open in read mode 'r' | |
| 130 | - | file.close() | |
| 131 | - | ``` | |
| 132 | - | ||
| 133 | - | ```py | |
| 134 | - | print(file.read()) # read the entire file and set the cursor at the end of file | |
| 135 | - | print file.readline() # Reading one line | |
| 136 | - | file.seek(0, 0) # place the cursor at the beginning of the file | |
| 137 | - | ``` | |
| 138 | - | ||
| 139 | - | ### Writing (overwrite) | |
| 140 | - | ||
| 141 | - | ```py | |
| 142 | - | file = open("hello.txt", "w") # open in write mode 'w' | |
| 143 | - | file.write("Hello World") | |
| 144 | - | ||
| 145 | - | text_lines = ["First line", "Second line", "Last line"] | |
| 146 | - | file.writelines(text_lines) | |
| 147 | - | ||
| 148 | - | file.close() | |
| 149 | - | ``` | |
| 150 | - | ||
| 151 | - | ### Writing (append) | |
| 152 | - | ||
| 153 | - | ```py | |
| 154 | - | file = open("Hello.txt", "a") # open in append mode | |
| 155 | - | file.write("Hello World again") | |
| 156 | - | file.close() | |
| 157 | - | ``` | |
| 158 | - | ||
| 159 | - | ### Context manager | |
| 160 | - | ||
| 161 | - | ```py | |
| 162 | - | with open("welcome.txt", "r") as file: | |
| 163 | - | # 'file' refers directly to "welcome.txt" | |
| 164 | - | data = file.read() | |
| 165 | - | ||
| 166 | - | # It closes the file automatically at the end of scope, no need for `file.close()`. | |
| 167 | - | ``` | |
| 168 | - | ||
| 169 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 170 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,38 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Rake | |
| 3 | - | category: Ruby | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | --- | |
| 6 | - | ||
| 7 | - | ### Basic syntax | |
| 8 | - | ||
| 9 | - | ```rb | |
| 10 | - | namespace :foo do | |
| 11 | - | desc "Description" | |
| 12 | - | task :bar do | |
| 13 | - | ... | |
| 14 | - | end | |
| 15 | - | ||
| 16 | - | task :baz => :dependency do | |
| 17 | - | end | |
| 18 | - | ||
| 19 | - | task :baz => [:dep1, :dep2, :dep3] do | |
| 20 | - | end | |
| 21 | - | end | |
| 22 | - | ||
| 23 | - | # rake foo:bar | |
| 24 | - | ``` | |
| 25 | - | ||
| 26 | - | ### Rake task with arguments | |
| 27 | - | ||
| 28 | - | ```rb | |
| 29 | - | desc "Do something" | |
| 30 | - | task :workit, [:id] => :environment do |_, args| | |
| 31 | - | id = args[:id] | |
| 32 | - | end | |
| 33 | - | ||
| 34 | - | # rake workit[234] | |
| 35 | - | ``` | |
| 36 | - | ||
| 37 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 38 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,34 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Ruby | |
| 3 | - | category: Ruby | |
| 4 | - | tags: [WIP] | |
| 5 | - | layout: 2017/sheet | |
| 6 | - | intro: | | |
| 7 | - | Quick reference to some features of the Ruby programming language. | |
| 8 | - | --- | |
| 9 | - | ||
| 10 | - | ### Reference | |
| 11 | - | ||
| 12 | - | {:.-one-column} | |
| 13 | - | ||
| 14 | - | | Code | Description | | |
| 15 | - | | ----------------------- | --------------------------------------------------------- | | |
| 16 | - | | `$!` | latest error message | | |
| 17 | - | | `$@` | location of error | | |
| 18 | - | | `$_` | string last read by gets | | |
| 19 | - | | `$.` | line number last read by interpreter | | |
| 20 | - | | `$&` | string last matched by regexp | | |
| 21 | - | | `$~` | the last regexp match, as an array of subexpressions | | |
| 22 | - | | `$n` | the nth subexpression in the last match (same as `$~[n]`) | | |
| 23 | - | | `$=` | case-insensitivity flag | | |
| 24 | - | | `$/` | input record separator | | |
| 25 | - | | `$\` | output record separator | | |
| 26 | - | | `$0` | the name of the ruby script file | | |
| 27 | - | | `$*` (or `ARGV`) | the command line arguments | | |
| 28 | - | | `$$` | interpreter's process ID | | |
| 29 | - | | `$?` | exit status of last executed child process | | |
| 30 | - | | `$-i` `$-l` `$-p` `$-v` | Command line switches | | |
| 31 | - | | `$-v` (or `$VERBOSE`) | verbose mode | | |
| 32 | - | ||
| 33 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 34 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,59 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: sed | |
| 3 | - | category: CLI | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | intro: | | |
| 6 | - | Here's some hints on using sed. | |
| 7 | - | --- | |
| 8 | - | ||
| 9 | - | ## In place replacements | |
| 10 | - | ||
| 11 | - | ### In-place replacement (GNU) | |
| 12 | - | ||
| 13 | - | ```bash | |
| 14 | - | sed -i -e 's/foo/bar/' example.md | |
| 15 | - | ``` | |
| 16 | - | ||
| 17 | - | In GNU sed: use `-i` without arg. | |
| 18 | - | ||
| 19 | - | #### In-place replacement (BSD) | |
| 20 | - | ||
| 21 | - | ```bash | |
| 22 | - | sed -i '' -e 's/foo/bar/' example.md | |
| 23 | - | ``` | |
| 24 | - | ||
| 25 | - | In OSX, `-i ''` is required. | |
| 26 | - | ||
| 27 | - | ## File regions | |
| 28 | - | {:.-three-column} | |
| 29 | - | ||
| 30 | - | ### Print until a certain line is met | |
| 31 | - | ||
| 32 | - | ```bash | |
| 33 | - | sed '/begin api/q' | |
| 34 | - | ``` | |
| 35 | - | ||
| 36 | - | ### Print until a certain line is met, but not that line | |
| 37 | - | ||
| 38 | - | ```bash | |
| 39 | - | sed '/^# begin/,$d' | |
| 40 | - | ``` | |
| 41 | - | ||
| 42 | - | ### Print everything after a given line | |
| 43 | - | ||
| 44 | - | ```bash | |
| 45 | - | sed -n '/end api/,$p' | |
| 46 | - | ``` | |
| 47 | - | ||
| 48 | - | Print after a given line is found. | |
| 49 | - | ||
| 50 | - | ### Print everything except matching | |
| 51 | - | ||
| 52 | - | ```bash | |
| 53 | - | sed -n '/regex/!p' | |
| 54 | - | ``` | |
| 55 | - | ||
| 56 | - | Print everything except lines matching regex. Useful for printing files with comments. | |
| 57 | - | ||
| 58 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 59 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,843 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Bash scripting | |
| 3 | - | category: CLI | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | tags: [Featured] | |
| 6 | - | updated: 2020-07-05 | |
| 7 | - | keywords: | |
| 8 | - | - Variables | |
| 9 | - | - Functions | |
| 10 | - | - Interpolation | |
| 11 | - | - Brace expansions | |
| 12 | - | - Loops | |
| 13 | - | - Conditional execution | |
| 14 | - | - Command substitution | |
| 15 | - | --- | |
| 16 | - | ||
| 17 | - | Getting started | |
| 18 | - | --------------- | |
| 19 | - | {: .-three-column} | |
| 20 | - | ||
| 21 | - | ### Introduction | |
| 22 | - | {: .-intro} | |
| 23 | - | ||
| 24 | - | This is a quick reference to getting started with Bash scripting. | |
| 25 | - | ||
| 26 | - | - [Learn bash in y minutes](https://learnxinyminutes.com/docs/bash/) _(learnxinyminutes.com)_ | |
| 27 | - | - [Bash Guide](http://mywiki.wooledge.org/BashGuide) _(mywiki.wooledge.org)_ | |
| 28 | - | - [Bash Hackers Wiki](https://wiki.bash-hackers.org) _(wiki.bash-hackers.org)_ | |
| 29 | - | ||
| 30 | - | ### Example | |
| 31 | - | ||
| 32 | - | ```bash | |
| 33 | - | #!/usr/bin/env bash | |
| 34 | - | ||
| 35 | - | name="John" | |
| 36 | - | echo "Hello $name!" | |
| 37 | - | ``` | |
| 38 | - | ||
| 39 | - | ### Variables | |
| 40 | - | ||
| 41 | - | ```bash | |
| 42 | - | name="John" | |
| 43 | - | echo $name # see below | |
| 44 | - | echo "$name" | |
| 45 | - | echo "${name}!" | |
| 46 | - | ``` | |
| 47 | - | Generally quote your variables unless they contain wildcards to expand or command fragments. | |
| 48 | - | ||
| 49 | - | ```bash | |
| 50 | - | wildcard="*.txt" | |
| 51 | - | option="iv" | |
| 52 | - | cp -$options $wildcard /tmp | |
| 53 | - | ``` | |
| 54 | - | ||
| 55 | - | ### String quotes | |
| 56 | - | ||
| 57 | - | ```bash | |
| 58 | - | name="John" | |
| 59 | - | echo "Hi $name" #=> Hi John | |
| 60 | - | echo 'Hi $name' #=> Hi $name | |
| 61 | - | ``` | |
| 62 | - | ||
| 63 | - | ### Shell execution | |
| 64 | - | ||
| 65 | - | ```bash | |
| 66 | - | echo "I'm in $(pwd)" | |
| 67 | - | echo "I'm in `pwd`" # obsolescent | |
| 68 | - | # Same | |
| 69 | - | ``` | |
| 70 | - | ||
| 71 | - | See [Command substitution](http://wiki.bash-hackers.org/syntax/expansion/cmdsubst) | |
| 72 | - | ||
| 73 | - | ### Conditional execution | |
| 74 | - | ||
| 75 | - | ```bash | |
| 76 | - | git commit && git push | |
| 77 | - | git commit || echo "Commit failed" | |
| 78 | - | ``` | |
| 79 | - | ||
| 80 | - | ### Functions | |
| 81 | - | {: id='functions-example'} | |
| 82 | - | ||
| 83 | - | ```bash | |
| 84 | - | get_name() { | |
| 85 | - | echo "John" | |
| 86 | - | } | |
| 87 | - | ||
| 88 | - | echo "You are $(get_name)" | |
| 89 | - | ``` | |
| 90 | - | ||
| 91 | - | See: [Functions](#functions) | |
| 92 | - | ||
| 93 | - | ### Conditionals | |
| 94 | - | {: id='conditionals-example'} | |
| 95 | - | ||
| 96 | - | ```bash | |
| 97 | - | if [[ -z "$string" ]]; then | |
| 98 | - | echo "String is empty" | |
| 99 | - | elif [[ -n "$string" ]]; then | |
| 100 | - | echo "String is not empty" | |
| 101 | - | fi | |
| 102 | - | ``` | |
| 103 | - | ||
| 104 | - | See: [Conditionals](#conditionals) | |
| 105 | - | ||
| 106 | - | ### Strict mode | |
| 107 | - | ||
| 108 | - | ```bash | |
| 109 | - | set -euo pipefail | |
| 110 | - | IFS=$'\n\t' | |
| 111 | - | ``` | |
| 112 | - | ||
| 113 | - | See: [Unofficial bash strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/) | |
| 114 | - | ||
| 115 | - | ### Brace expansion | |
| 116 | - | ||
| 117 | - | ```bash | |
| 118 | - | echo {A,B}.js | |
| 119 | - | ``` | |
| 120 | - | ||
| 121 | - | | Expression | Description | | |
| 122 | - | | ---------- | ------------------- | | |
| 123 | - | | `{A,B}` | Same as `A B` | | |
| 124 | - | | `{A,B}.js` | Same as `A.js B.js` | | |
| 125 | - | | `{1..5}` | Same as `1 2 3 4 5` | | |
| 126 | - | ||
| 127 | - | See: [Brace expansion](http://wiki.bash-hackers.org/syntax/expansion/brace) | |
| 128 | - | ||
| 129 | - | ||
| 130 | - | Parameter expansions | |
| 131 | - | -------------------- | |
| 132 | - | {: .-three-column} | |
| 133 | - | ||
| 134 | - | ### Basics | |
| 135 | - | ||
| 136 | - | ```bash | |
| 137 | - | name="John" | |
| 138 | - | echo "${name}" | |
| 139 | - | echo "${name/J/j}" #=> "john" (substitution) | |
| 140 | - | echo "${name:0:2}" #=> "Jo" (slicing) | |
| 141 | - | echo "${name::2}" #=> "Jo" (slicing) | |
| 142 | - | echo "${name::-1}" #=> "Joh" (slicing) | |
| 143 | - | echo "${name:(-1)}" #=> "n" (slicing from right) | |
| 144 | - | echo "${name:(-2):1}" #=> "h" (slicing from right) | |
| 145 | - | echo "${food:-Cake}" #=> $food or "Cake" | |
| 146 | - | ``` | |
| 147 | - | ||
| 148 | - | ```bash | |
| 149 | - | length=2 | |
| 150 | - | echo "${name:0:length}" #=> "Jo" | |
| 151 | - | ``` | |
| 152 | - | ||
| 153 | - | See: [Parameter expansion](http://wiki.bash-hackers.org/syntax/pe) | |
| 154 | - | ||
| 155 | - | ```bash | |
| 156 | - | str="/path/to/foo.cpp" | |
| 157 | - | echo "${str%.cpp}" # /path/to/foo | |
| 158 | - | echo "${str%.cpp}.o" # /path/to/foo.o | |
| 159 | - | echo "${str%/*}" # /path/to | |
| 160 | - | ||
| 161 | - | echo "${str##*.}" # cpp (extension) | |
| 162 | - | echo "${str##*/}" # foo.cpp (basepath) | |
| 163 | - | ||
| 164 | - | echo "${str#*/}" # path/to/foo.cpp | |
| 165 | - | echo "${str##*/}" # foo.cpp | |
| 166 | - | ||
| 167 | - | echo "${str/foo/bar}" # /path/to/bar.cpp | |
| 168 | - | ``` | |
| 169 | - | ||
| 170 | - | ```bash | |
| 171 | - | str="Hello world" | |
| 172 | - | echo "${str:6:5}" # "world" | |
| 173 | - | echo "${str: -5:5}" # "world" | |
| 174 | - | ``` | |
| 175 | - | ||
| 176 | - | ```bash | |
| 177 | - | src="/path/to/foo.cpp" | |
| 178 | - | base=${src##*/} #=> "foo.cpp" (basepath) | |
| 179 | - | dir=${src%$base} #=> "/path/to/" (dirpath) | |
| 180 | - | ``` | |
| 181 | - | ||
| 182 | - | ### Substitution | |
| 183 | - | ||
| 184 | - | | Code | Description | | |
| 185 | - | | ----------------- | ------------------- | | |
| 186 | - | | `${foo%suffix}` | Remove suffix | | |
| 187 | - | | `${foo#prefix}` | Remove prefix | | |
| 188 | - | | --- | --- | | |
| 189 | - | | `${foo%%suffix}` | Remove long suffix | | |
| 190 | - | | `${foo##prefix}` | Remove long prefix | | |
| 191 | - | | --- | --- | | |
| 192 | - | | `${foo/from/to}` | Replace first match | | |
| 193 | - | | `${foo//from/to}` | Replace all | | |
| 194 | - | | --- | --- | | |
| 195 | - | | `${foo/%from/to}` | Replace suffix | | |
| 196 | - | | `${foo/#from/to}` | Replace prefix | | |
| 197 | - | ||
| 198 | - | ### Comments | |
| 199 | - | ||
| 200 | - | ```bash | |
| 201 | - | # Single line comment | |
| 202 | - | ``` | |
| 203 | - | ||
| 204 | - | ```bash | |
| 205 | - | : ' | |
| 206 | - | This is a | |
| 207 | - | multi line | |
| 208 | - | comment | |
| 209 | - | ' | |
| 210 | - | ``` | |
| 211 | - | ||
| 212 | - | ### Substrings | |
| 213 | - | ||
| 214 | - | | Expression | Description | | |
| 215 | - | | --------------- | ------------------------------ | | |
| 216 | - | | `${foo:0:3}` | Substring _(position, length)_ | | |
| 217 | - | | `${foo:(-3):3}` | Substring from the right | | |
| 218 | - | ||
| 219 | - | ### Length | |
| 220 | - | ||
| 221 | - | | Expression | Description | | |
| 222 | - | | ---------- | ---------------- | | |
| 223 | - | | `${#foo}` | Length of `$foo` | | |
| 224 | - | ||
| 225 | - | ### Manipulation | |
| 226 | - | ||
| 227 | - | ```bash | |
| 228 | - | str="HELLO WORLD!" | |
| 229 | - | echo "${str,}" #=> "hELLO WORLD!" (lowercase 1st letter) | |
| 230 | - | echo "${str,,}" #=> "hello world!" (all lowercase) | |
| 231 | - | ||
| 232 | - | str="hello world!" | |
| 233 | - | echo "${str^}" #=> "Hello world!" (uppercase 1st letter) | |
| 234 | - | echo "${str^^}" #=> "HELLO WORLD!" (all uppercase) | |
| 235 | - | ``` | |
| 236 | - | ||
| 237 | - | ### Default values | |
| 238 | - | ||
| 239 | - | | Expression | Description | | |
| 240 | - | | ----------------- | -------------------------------------------------------- | | |
| 241 | - | | `${foo:-val}` | `$foo`, or `val` if unset (or null) | | |
| 242 | - | | `${foo:=val}` | Set `$foo` to `val` if unset (or null) | | |
| 243 | - | | `${foo:+val}` | `val` if `$foo` is set (and not null) | | |
| 244 | - | | `${foo:?message}` | Show error message and exit if `$foo` is unset (or null) | | |
| 245 | - | ||
| 246 | - | Omitting the `:` removes the (non)nullity checks, e.g. `${foo-val}` expands to `val` if unset otherwise `$foo`. | |
| 247 | - | ||
| 248 | - | Loops | |
| 249 | - | ----- | |
| 250 | - | {: .-three-column} | |
| 251 | - | ||
| 252 | - | ### Basic for loop | |
| 253 | - | ||
| 254 | - | ```bash | |
| 255 | - | for i in /etc/rc.*; do | |
| 256 | - | echo "$i" | |
| 257 | - | done | |
| 258 | - | ``` | |
| 259 | - | ||
| 260 | - | ### C-like for loop | |
| 261 | - | ||
| 262 | - | ```bash | |
| 263 | - | for ((i = 0 ; i < 100 ; i++)); do | |
| 264 | - | echo "$i" | |
| 265 | - | done | |
| 266 | - | ``` | |
| 267 | - | ||
| 268 | - | ### Ranges | |
| 269 | - | ||
| 270 | - | ```bash | |
| 271 | - | for i in {1..5}; do | |
| 272 | - | echo "Welcome $i" | |
| 273 | - | done | |
| 274 | - | ``` | |
| 275 | - | ||
| 276 | - | #### With step size | |
| 277 | - | ||
| 278 | - | ```bash | |
| 279 | - | for i in {5..50..5}; do | |
| 280 | - | echo "Welcome $i" | |
| 281 | - | done | |
| 282 | - | ``` | |
| 283 | - | ||
| 284 | - | ### Reading lines | |
| 285 | - | ||
| 286 | - | ```bash | |
| 287 | - | while read -r line; do | |
| 288 | - | echo "$line" | |
| 289 | - | done <file.txt | |
| 290 | - | ``` | |
| 291 | - | ||
| 292 | - | ### Forever | |
| 293 | - | ||
| 294 | - | ```bash | |
| 295 | - | while true; do | |
| 296 | - | ··· | |
| 297 | - | done | |
| 298 | - | ``` | |
| 299 | - | ||
| 300 | - | Functions | |
| 301 | - | --------- | |
| 302 | - | {: .-three-column} | |
| 303 | - | ||
| 304 | - | ### Defining functions | |
| 305 | - | ||
| 306 | - | ```bash | |
| 307 | - | myfunc() { | |
| 308 | - | echo "hello $1" | |
| 309 | - | } | |
| 310 | - | ``` | |
| 311 | - | ||
| 312 | - | ```bash | |
| 313 | - | # Same as above (alternate syntax) | |
| 314 | - | function myfunc() { | |
| 315 | - | echo "hello $1" | |
| 316 | - | } | |
| 317 | - | ``` | |
| 318 | - | ||
| 319 | - | ```bash | |
| 320 | - | myfunc "John" | |
| 321 | - | ``` | |
| 322 | - | ||
| 323 | - | ### Returning values | |
| 324 | - | ||
| 325 | - | ```bash | |
| 326 | - | myfunc() { | |
| 327 | - | local myresult='some value' | |
| 328 | - | echo "$myresult" | |
| 329 | - | } | |
| 330 | - | ``` | |
| 331 | - | ||
| 332 | - | ```bash | |
| 333 | - | result=$(myfunc) | |
| 334 | - | ``` | |
| 335 | - | ||
| 336 | - | ### Raising errors | |
| 337 | - | ||
| 338 | - | ```bash | |
| 339 | - | myfunc() { | |
| 340 | - | return 1 | |
| 341 | - | } | |
| 342 | - | ``` | |
| 343 | - | ||
| 344 | - | ```bash | |
| 345 | - | if myfunc; then | |
| 346 | - | echo "success" | |
| 347 | - | else | |
| 348 | - | echo "failure" | |
| 349 | - | fi | |
| 350 | - | ``` | |
| 351 | - | ||
| 352 | - | ### Arguments | |
| 353 | - | ||
| 354 | - | | Expression | Description | | |
| 355 | - | | --- | --- | | |
| 356 | - | | `$#` | Number of arguments | | |
| 357 | - | | `$*` | All positional arguments (as a single word) | | |
| 358 | - | | `$@` | All positional arguments (as separate strings) | | |
| 359 | - | | `$1` | First argument | | |
| 360 | - | | `$_` | Last argument of the previous command | | |
| 361 | - | ||
| 362 | - | **Note**: `$@` and `$*` must be quoted in order to perform as described. | |
| 363 | - | Otherwise, they do exactly the same thing (arguments as separate strings). | |
| 364 | - | ||
| 365 | - | See [Special parameters](http://wiki.bash-hackers.org/syntax/shellvars#special_parameters_and_shell_variables). | |
| 366 | - | ||
| 367 | - | Conditionals | |
| 368 | - | ------------ | |
| 369 | - | {: .-three-column} | |
| 370 | - | ||
| 371 | - | ### Conditions | |
| 372 | - | ||
| 373 | - | 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. | |
| 374 | - | ||
| 375 | - | | Condition | Description | | |
| 376 | - | | --- | --- | | |
| 377 | - | | `[[ -z STRING ]]` | Empty string | | |
| 378 | - | | `[[ -n STRING ]]` | Not empty string | | |
| 379 | - | | `[[ STRING == STRING ]]` | Equal | | |
| 380 | - | | `[[ STRING != STRING ]]` | Not Equal | | |
| 381 | - | | --- | --- | | |
| 382 | - | | `[[ NUM -eq NUM ]]` | Equal | | |
| 383 | - | | `[[ NUM -ne NUM ]]` | Not equal | | |
| 384 | - | | `[[ NUM -lt NUM ]]` | Less than | | |
| 385 | - | | `[[ NUM -le NUM ]]` | Less than or equal | | |
| 386 | - | | `[[ NUM -gt NUM ]]` | Greater than | | |
| 387 | - | | `[[ NUM -ge NUM ]]` | Greater than or equal | | |
| 388 | - | | --- | --- | | |
| 389 | - | | `[[ STRING =~ STRING ]]` | Regexp | | |
| 390 | - | | --- | --- | | |
| 391 | - | | `(( NUM < NUM ))` | Numeric conditions | | |
| 392 | - | ||
| 393 | - | #### More conditions | |
| 394 | - | ||
| 395 | - | | Condition | Description | | |
| 396 | - | | -------------------- | ------------------------ | | |
| 397 | - | | `[[ -o noclobber ]]` | If OPTIONNAME is enabled | | |
| 398 | - | | --- | --- | | |
| 399 | - | | `[[ ! EXPR ]]` | Not | | |
| 400 | - | | `[[ X && Y ]]` | And | | |
| 401 | - | | `[[ X || Y ]]` | Or | | |
| 402 | - | ||
| 403 | - | ### File conditions | |
| 404 | - | ||
| 405 | - | | Condition | Description | | |
| 406 | - | | --- | --- | | |
| 407 | - | | `[[ -e FILE ]]` | Exists | | |
| 408 | - | | `[[ -r FILE ]]` | Readable | | |
| 409 | - | | `[[ -h FILE ]]` | Symlink | | |
| 410 | - | | `[[ -d FILE ]]` | Directory | | |
| 411 | - | | `[[ -w FILE ]]` | Writable | | |
| 412 | - | | `[[ -s FILE ]]` | Size is > 0 bytes | | |
| 413 | - | | `[[ -f FILE ]]` | File | | |
| 414 | - | | `[[ -x FILE ]]` | Executable | | |
| 415 | - | | --- | --- | | |
| 416 | - | | `[[ FILE1 -nt FILE2 ]]` | 1 is more recent than 2 | | |
| 417 | - | | `[[ FILE1 -ot FILE2 ]]` | 2 is more recent than 1 | | |
| 418 | - | | `[[ FILE1 -ef FILE2 ]]` | Same files | | |
| 419 | - | ||
| 420 | - | ### Example | |
| 421 | - | ||
| 422 | - | ```bash | |
| 423 | - | # String | |
| 424 | - | if [[ -z "$string" ]]; then | |
| 425 | - | echo "String is empty" | |
| 426 | - | elif [[ -n "$string" ]]; then | |
| 427 | - | echo "String is not empty" | |
| 428 | - | else | |
| 429 | - | echo "This never happens" | |
| 430 | - | fi | |
| 431 | - | ``` | |
| 432 | - | ||
| 433 | - | ```bash | |
| 434 | - | # Combinations | |
| 435 | - | if [[ X && Y ]]; then | |
| 436 | - | ... | |
| 437 | - | fi | |
| 438 | - | ``` | |
| 439 | - | ||
| 440 | - | ```bash | |
| 441 | - | # Equal | |
| 442 | - | if [[ "$A" == "$B" ]] | |
| 443 | - | ``` | |
| 444 | - | ||
| 445 | - | ```bash | |
| 446 | - | # Regex | |
| 447 | - | if [[ "A" =~ . ]] | |
| 448 | - | ``` | |
| 449 | - | ||
| 450 | - | ```bash | |
| 451 | - | if (( $a < $b )); then | |
| 452 | - | echo "$a is smaller than $b" | |
| 453 | - | fi | |
| 454 | - | ``` | |
| 455 | - | ||
| 456 | - | ```bash | |
| 457 | - | if [[ -e "file.txt" ]]; then | |
| 458 | - | echo "file exists" | |
| 459 | - | fi | |
| 460 | - | ``` | |
| 461 | - | ||
| 462 | - | Arrays | |
| 463 | - | ------ | |
| 464 | - | ||
| 465 | - | ### Defining arrays | |
| 466 | - | ||
| 467 | - | ```bash | |
| 468 | - | Fruits=('Apple' 'Banana' 'Orange') | |
| 469 | - | ``` | |
| 470 | - | ||
| 471 | - | ```bash | |
| 472 | - | Fruits[0]="Apple" | |
| 473 | - | Fruits[1]="Banana" | |
| 474 | - | Fruits[2]="Orange" | |
| 475 | - | ``` | |
| 476 | - | ||
| 477 | - | ### Working with arrays | |
| 478 | - | ||
| 479 | - | ```bash | |
| 480 | - | echo "${Fruits[0]}" # Element #0 | |
| 481 | - | echo "${Fruits[-1]}" # Last element | |
| 482 | - | echo "${Fruits[@]}" # All elements, space-separated | |
| 483 | - | echo "${#Fruits[@]}" # Number of elements | |
| 484 | - | echo "${#Fruits}" # String length of the 1st element | |
| 485 | - | echo "${#Fruits[3]}" # String length of the Nth element | |
| 486 | - | echo "${Fruits[@]:3:2}" # Range (from position 3, length 2) | |
| 487 | - | echo "${!Fruits[@]}" # Keys of all elements, space-separated | |
| 488 | - | ``` | |
| 489 | - | ||
| 490 | - | ### Operations | |
| 491 | - | ||
| 492 | - | ```bash | |
| 493 | - | Fruits=("${Fruits[@]}" "Watermelon") # Push | |
| 494 | - | Fruits+=('Watermelon') # Also Push | |
| 495 | - | Fruits=( "${Fruits[@]/Ap*/}" ) # Remove by regex match | |
| 496 | - | unset Fruits[2] # Remove one item | |
| 497 | - | Fruits=("${Fruits[@]}") # Duplicate | |
| 498 | - | Fruits=("${Fruits[@]}" "${Veggies[@]}") # Concatenate | |
| 499 | - | lines=(`cat "logfile"`) # Read from file | |
| 500 | - | ``` | |
| 501 | - | ||
| 502 | - | ### Iteration | |
| 503 | - | ||
| 504 | - | ```bash | |
| 505 | - | for i in "${arrayName[@]}"; do | |
| 506 | - | echo "$i" | |
| 507 | - | done | |
| 508 | - | ``` | |
| 509 | - | ||
| 510 | - | Dictionaries | |
| 511 | - | ------------ | |
| 512 | - | {: .-three-column} | |
| 513 | - | ||
| 514 | - | ### Defining | |
| 515 | - | ||
| 516 | - | ```bash | |
| 517 | - | declare -A sounds | |
| 518 | - | ``` | |
| 519 | - | ||
| 520 | - | ```bash | |
| 521 | - | sounds[dog]="bark" | |
| 522 | - | sounds[cow]="moo" | |
| 523 | - | sounds[bird]="tweet" | |
| 524 | - | sounds[wolf]="howl" | |
| 525 | - | ``` | |
| 526 | - | ||
| 527 | - | Declares `sound` as a Dictionary object (aka associative array). | |
| 528 | - | ||
| 529 | - | ### Working with dictionaries | |
| 530 | - | ||
| 531 | - | ```bash | |
| 532 | - | echo "${sounds[dog]}" # Dog's sound | |
| 533 | - | echo "${sounds[@]}" # All values | |
| 534 | - | echo "${!sounds[@]}" # All keys | |
| 535 | - | echo "${#sounds[@]}" # Number of elements | |
| 536 | - | unset sounds[dog] # Delete dog | |
| 537 | - | ``` | |
| 538 | - | ||
| 539 | - | ### Iteration | |
| 540 | - | ||
| 541 | - | #### Iterate over values | |
| 542 | - | ||
| 543 | - | ```bash | |
| 544 | - | for val in "${sounds[@]}"; do | |
| 545 | - | echo "$val" | |
| 546 | - | done | |
| 547 | - | ``` | |
| 548 | - | ||
| 549 | - | #### Iterate over keys | |
| 550 | - | ||
| 551 | - | ```bash | |
| 552 | - | for key in "${!sounds[@]}"; do | |
| 553 | - | echo "$key" | |
| 554 | - | done | |
| 555 | - | ``` | |
| 556 | - | ||
| 557 | - | Options | |
| 558 | - | ------- | |
| 559 | - | ||
| 560 | - | ### Options | |
| 561 | - | ||
| 562 | - | ```bash | |
| 563 | - | set -o noclobber # Avoid overlay files (echo "hi" > foo) | |
| 564 | - | set -o errexit # Used to exit upon error, avoiding cascading errors | |
| 565 | - | set -o pipefail # Unveils hidden failures | |
| 566 | - | set -o nounset # Exposes unset variables | |
| 567 | - | ``` | |
| 568 | - | ||
| 569 | - | ### Glob options | |
| 570 | - | ||
| 571 | - | ```bash | |
| 572 | - | shopt -s nullglob # Non-matching globs are removed ('*.foo' => '') | |
| 573 | - | shopt -s failglob # Non-matching globs throw errors | |
| 574 | - | shopt -s nocaseglob # Case insensitive globs | |
| 575 | - | shopt -s dotglob # Wildcards match dotfiles ("*.sh" => ".foo.sh") | |
| 576 | - | shopt -s globstar # Allow ** for recursive matches ('lib/**/*.rb' => 'lib/a/b/c.rb') | |
| 577 | - | ``` | |
| 578 | - | ||
| 579 | - | Set `GLOBIGNORE` as a colon-separated list of patterns to be removed from glob | |
| 580 | - | matches. | |
| 581 | - | ||
| 582 | - | History | |
| 583 | - | ------- | |
| 584 | - | ||
| 585 | - | ### Commands | |
| 586 | - | ||
| 587 | - | | Command | Description | | |
| 588 | - | | --------------------- | ----------------------------------------- | | |
| 589 | - | | `history` | Show history | | |
| 590 | - | | `shopt -s histverify` | Don't execute expanded result immediately | | |
| 591 | - | ||
| 592 | - | ### Expansions | |
| 593 | - | ||
| 594 | - | | Expression | Description | | |
| 595 | - | | ------------ | ---------------------------------------------------- | | |
| 596 | - | | `!$` | Expand last parameter of most recent command | | |
| 597 | - | | `!*` | Expand all parameters of most recent command | | |
| 598 | - | | `!-n` | Expand `n`th most recent command | | |
| 599 | - | | `!n` | Expand `n`th command in history | | |
| 600 | - | | `!<command>` | Expand most recent invocation of command `<command>` | | |
| 601 | - | ||
| 602 | - | ### Operations | |
| 603 | - | ||
| 604 | - | | Code | Description | | |
| 605 | - | | -------------------- | --------------------------------------------------------------------- | | |
| 606 | - | | `!!` | Execute last command again | | |
| 607 | - | | `!!:s/<FROM>/<TO>/` | Replace first occurrence of `<FROM>` to `<TO>` in most recent command | | |
| 608 | - | | `!!:gs/<FROM>/<TO>/` | Replace all occurrences of `<FROM>` to `<TO>` in most recent command | | |
| 609 | - | | `!$:t` | Expand only basename from last parameter of most recent command | | |
| 610 | - | | `!$:h` | Expand only directory from last parameter of most recent command | | |
| 611 | - | ||
| 612 | - | `!!` and `!$` can be replaced with any valid expansion. | |
| 613 | - | ||
| 614 | - | ### Slices | |
| 615 | - | ||
| 616 | - | | Code | Description | | |
| 617 | - | | -------- | ---------------------------------------------------------------------------------------- | | |
| 618 | - | | `!!:n` | Expand only `n`th token from most recent command (command is `0`; first argument is `1`) | | |
| 619 | - | | `!^` | Expand first argument from most recent command | | |
| 620 | - | | `!$` | Expand last token from most recent command | | |
| 621 | - | | `!!:n-m` | Expand range of tokens from most recent command | | |
| 622 | - | | `!!:n-$` | Expand `n`th token to last from most recent command | | |
| 623 | - | ||
| 624 | - | `!!` can be replaced with any valid expansion i.e. `!cat`, `!-2`, `!42`, etc. | |
| 625 | - | ||
| 626 | - | ||
| 627 | - | Miscellaneous | |
| 628 | - | ------------- | |
| 629 | - | ||
| 630 | - | ### Numeric calculations | |
| 631 | - | ||
| 632 | - | ```bash | |
| 633 | - | $((a + 200)) # Add 200 to $a | |
| 634 | - | ``` | |
| 635 | - | ||
| 636 | - | ```bash | |
| 637 | - | $(($RANDOM%200)) # Random number 0..199 | |
| 638 | - | ``` | |
| 639 | - | ||
| 640 | - | ### Subshells | |
| 641 | - | ||
| 642 | - | ```bash | |
| 643 | - | (cd somedir; echo "I'm now in $PWD") | |
| 644 | - | pwd # still in first directory | |
| 645 | - | ``` | |
| 646 | - | ||
| 647 | - | ### Redirection | |
| 648 | - | ||
| 649 | - | ```bash | |
| 650 | - | python hello.py > output.txt # stdout to (file) | |
| 651 | - | python hello.py >> output.txt # stdout to (file), append | |
| 652 | - | python hello.py 2> error.log # stderr to (file) | |
| 653 | - | python hello.py 2>&1 # stderr to stdout | |
| 654 | - | python hello.py 2>/dev/null # stderr to (null) | |
| 655 | - | python hello.py >output.txt 2>&1 # stdout and stderr to (file), equivalent to &> | |
| 656 | - | python hello.py &>/dev/null # stdout and stderr to (null) | |
| 657 | - | echo "$0: warning: too many users" >&2 # print diagnostic message to stderr | |
| 658 | - | ``` | |
| 659 | - | ||
| 660 | - | ```bash | |
| 661 | - | python hello.py < foo.txt # feed foo.txt to stdin for python | |
| 662 | - | diff <(ls -r) <(ls) # Compare two stdout without files | |
| 663 | - | ``` | |
| 664 | - | ||
| 665 | - | ### Inspecting commands | |
| 666 | - | ||
| 667 | - | ```bash | |
| 668 | - | command -V cd | |
| 669 | - | #=> "cd is a function/alias/whatever" | |
| 670 | - | ``` | |
| 671 | - | ||
| 672 | - | ### Trap errors | |
| 673 | - | ||
| 674 | - | ```bash | |
| 675 | - | trap 'echo Error at about $LINENO' ERR | |
| 676 | - | ``` | |
| 677 | - | ||
| 678 | - | or | |
| 679 | - | ||
| 680 | - | ```bash | |
| 681 | - | traperr() { | |
| 682 | - | echo "ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}" | |
| 683 | - | } | |
| 684 | - | ||
| 685 | - | set -o errtrace | |
| 686 | - | trap traperr ERR | |
| 687 | - | ``` | |
| 688 | - | ||
| 689 | - | ### Case/switch | |
| 690 | - | ||
| 691 | - | ```bash | |
| 692 | - | case "$1" in | |
| 693 | - | start | up) | |
| 694 | - | vagrant up | |
| 695 | - | ;; | |
| 696 | - | ||
| 697 | - | *) | |
| 698 | - | echo "Usage: $0 {start|stop|ssh}" | |
| 699 | - | ;; | |
| 700 | - | esac | |
| 701 | - | ``` | |
| 702 | - | ||
| 703 | - | ### Source relative | |
| 704 | - | ||
| 705 | - | ```bash | |
| 706 | - | source "${0%/*}/../share/foo.sh" | |
| 707 | - | ``` | |
| 708 | - | ||
| 709 | - | ### printf | |
| 710 | - | ||
| 711 | - | ```bash | |
| 712 | - | printf "Hello %s, I'm %s" Sven Olga | |
| 713 | - | #=> "Hello Sven, I'm Olga | |
| 714 | - | ||
| 715 | - | printf "1 + 1 = %d" 2 | |
| 716 | - | #=> "1 + 1 = 2" | |
| 717 | - | ||
| 718 | - | printf "This is how you print a float: %f" 2 | |
| 719 | - | #=> "This is how you print a float: 2.000000" | |
| 720 | - | ||
| 721 | - | printf '%s\n' '#!/bin/bash' 'echo hello' >file | |
| 722 | - | # format string is applied to each group of arguments | |
| 723 | - | printf '%i+%i=%i\n' 1 2 3 4 5 9 | |
| 724 | - | ``` | |
| 725 | - | ||
| 726 | - | ### Transform strings | |
| 727 | - | ||
| 728 | - | | Command option | Description | | |
| 729 | - | | ------------------ | --------------------------------------------------- | | |
| 730 | - | | `-c` | Operations apply to characters not in the given set | | |
| 731 | - | | `-d` | Delete characters | | |
| 732 | - | | `-s` | Replaces repeated characters with single occurrence | | |
| 733 | - | | `-t` | Truncates | | |
| 734 | - | | `[:upper:]` | All upper case letters | | |
| 735 | - | | `[:lower:]` | All lower case letters | | |
| 736 | - | | `[:digit:]` | All digits | | |
| 737 | - | | `[:space:]` | All whitespace | | |
| 738 | - | | `[:alpha:]` | All letters | | |
| 739 | - | | `[:alnum:]` | All letters and digits | | |
| 740 | - | ||
| 741 | - | #### Example | |
| 742 | - | ||
| 743 | - | ```bash | |
| 744 | - | echo "Welcome To Devhints" | tr '[:lower:]' '[:upper:]' | |
| 745 | - | WELCOME TO DEVHINTS | |
| 746 | - | ``` | |
| 747 | - | ||
| 748 | - | ### Directory of script | |
| 749 | - | ||
| 750 | - | ```bash | |
| 751 | - | dir=${0%/*} | |
| 752 | - | ``` | |
| 753 | - | ||
| 754 | - | ### Getting options | |
| 755 | - | ||
| 756 | - | ```bash | |
| 757 | - | while [[ "$1" =~ ^- && ! "$1" == "--" ]]; do case $1 in | |
| 758 | - | -V | --version ) | |
| 759 | - | echo "$version" | |
| 760 | - | exit | |
| 761 | - | ;; | |
| 762 | - | -s | --string ) | |
| 763 | - | shift; string=$1 | |
| 764 | - | ;; | |
| 765 | - | -f | --flag ) | |
| 766 | - | flag=1 | |
| 767 | - | ;; | |
| 768 | - | esac; shift; done | |
| 769 | - | if [[ "$1" == '--' ]]; then shift; fi | |
| 770 | - | ``` | |
| 771 | - | ||
| 772 | - | ### Heredoc | |
| 773 | - | ||
| 774 | - | ```sh | |
| 775 | - | cat <<END | |
| 776 | - | hello world | |
| 777 | - | END | |
| 778 | - | ``` | |
| 779 | - | ||
| 780 | - | ### Reading input | |
| 781 | - | ||
| 782 | - | ```bash | |
| 783 | - | echo -n "Proceed? [y/n]: " | |
| 784 | - | read -r ans | |
| 785 | - | echo "$ans" | |
| 786 | - | ``` | |
| 787 | - | ||
| 788 | - | The `-r` option disables a peculiar legacy behavior with backslashes. | |
| 789 | - | ||
| 790 | - | ```bash | |
| 791 | - | read -n 1 ans # Just one character | |
| 792 | - | ``` | |
| 793 | - | ||
| 794 | - | ### Special variables | |
| 795 | - | ||
| 796 | - | | Expression | Description | | |
| 797 | - | | ------------------ | -------------------------------------- | | |
| 798 | - | | `$?` | Exit status of last task | | |
| 799 | - | | `$!` | PID of last background task | | |
| 800 | - | | `$$` | PID of shell | | |
| 801 | - | | `$0` | Filename of the shell script | | |
| 802 | - | | `$_` | Last argument of the previous command | | |
| 803 | - | | `${PIPESTATUS[n]}` | return value of piped commands (array) | | |
| 804 | - | ||
| 805 | - | See [Special parameters](http://wiki.bash-hackers.org/syntax/shellvars#special_parameters_and_shell_variables). | |
| 806 | - | ||
| 807 | - | ### Go to previous directory | |
| 808 | - | ||
| 809 | - | ```bash | |
| 810 | - | pwd # /home/user/foo | |
| 811 | - | cd bar/ | |
| 812 | - | pwd # /home/user/foo/bar | |
| 813 | - | cd - | |
| 814 | - | pwd # /home/user/foo | |
| 815 | - | ``` | |
| 816 | - | ||
| 817 | - | ### Check for command's result | |
| 818 | - | ||
| 819 | - | ```bash | |
| 820 | - | if ping -c 1 google.com; then | |
| 821 | - | echo "It appears you have a working internet connection" | |
| 822 | - | fi | |
| 823 | - | ``` | |
| 824 | - | ||
| 825 | - | ### Grep check | |
| 826 | - | ||
| 827 | - | ```bash | |
| 828 | - | if grep -q 'foo' ~/.bash_history; then | |
| 829 | - | echo "You appear to have typed 'foo' in the past" | |
| 830 | - | fi | |
| 831 | - | ``` | |
| 832 | - | ||
| 833 | - | ## Also see | |
| 834 | - | {: .-one-column} | |
| 835 | - | ||
| 836 | - | * [Bash-hackers wiki](http://wiki.bash-hackers.org/) _(bash-hackers.org)_ | |
| 837 | - | * [Shell vars](http://wiki.bash-hackers.org/syntax/shellvars) _(bash-hackers.org)_ | |
| 838 | - | * [Learn bash in y minutes](https://learnxinyminutes.com/docs/bash/) _(learnxinyminutes.com)_ | |
| 839 | - | * [Bash Guide](http://mywiki.wooledge.org/BashGuide) _(mywiki.wooledge.org)_ | |
| 840 | - | * [ShellCheck](https://www.shellcheck.net/) _(shellcheck.net)_ | |
| 841 | - | ||
| 842 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 843 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,27 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: PostgreSQL | |
| 3 | - | category: Databases | |
| 4 | - | --- | |
| 5 | - | ||
| 6 | - | Replace anything within `<placeholder>` accordingly | |
| 7 | - | ||
| 8 | - | ### Console | |
| 9 | - | ||
| 10 | - | $ psql #logs in to default database & default user | |
| 11 | - | $ sudo -u <rolename:postgres> psql #logs in with a particular user | |
| 12 | - | ||
| 13 | - | ### Commands | |
| 14 | - | ||
| 15 | - | * Show roles: `\du` | |
| 16 | - | * Show tables: `\dt` | |
| 17 | - | * Show databases: `\l` | |
| 18 | - | * Connect to a database: `\c <database>` | |
| 19 | - | * Show columns of a table: `\d <table>` or `\d+ <table>` | |
| 20 | - | * Quit: `\q` | |
| 21 | - | ||
| 22 | - | ### Creating database | |
| 23 | - | ||
| 24 | - | $ createdb databasename | |
| 25 | - | ||
| 26 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 27 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,287 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: TypeScript | |
| 3 | - | category: JavaScript libraries | |
| 4 | - | --- | |
| 5 | - | ||
| 6 | - | TypeScript is just like ES2015 with type-checking. All ES2015 (classes, etc) should work. | |
| 7 | - | ||
| 8 | - | ## Basic types | |
| 9 | - | ||
| 10 | - | ```ts | |
| 11 | - | any | |
| 12 | - | void | |
| 13 | - | ||
| 14 | - | boolean | |
| 15 | - | number | |
| 16 | - | string | |
| 17 | - | ||
| 18 | - | null | |
| 19 | - | undefined | |
| 20 | - | ||
| 21 | - | bigint | |
| 22 | - | symbol | |
| 23 | - | ||
| 24 | - | string[] /* or Array<string> */ | |
| 25 | - | [string, number] /* tuple */ | |
| 26 | - | ||
| 27 | - | string | null | undefined /* union */ | |
| 28 | - | ||
| 29 | - | never /* unreachable */ | |
| 30 | - | unknown | |
| 31 | - | ``` | |
| 32 | - | ||
| 33 | - | ```ts | |
| 34 | - | enum Color { | |
| 35 | - | Red, | |
| 36 | - | Green, | |
| 37 | - | Blue = 4 | |
| 38 | - | }; | |
| 39 | - | ||
| 40 | - | let c: Color = Color.Green | |
| 41 | - | ``` | |
| 42 | - | ||
| 43 | - | ## Declarations | |
| 44 | - | ||
| 45 | - | ```ts | |
| 46 | - | let isDone: boolean | |
| 47 | - | let isDone: boolean = false | |
| 48 | - | ``` | |
| 49 | - | ||
| 50 | - | ```ts | |
| 51 | - | function add (a: number, b: number): number { | |
| 52 | - | return a + b | |
| 53 | - | } | |
| 54 | - | ||
| 55 | - | // Return type is optional | |
| 56 | - | function add (a: number, b: number) { ... } | |
| 57 | - | ``` | |
| 58 | - | ||
| 59 | - | ## Type assertions | |
| 60 | - | ||
| 61 | - | #### Variables | |
| 62 | - | ```ts | |
| 63 | - | let len: number = (input as string).length | |
| 64 | - | let len: number = (<string> input).length /* not allowed in JSX */ | |
| 65 | - | ``` | |
| 66 | - | ||
| 67 | - | #### Functions | |
| 68 | - | ```ts | |
| 69 | - | function object(this: {a: number, b: number}, a: number, b: number) { | |
| 70 | - | this.a = a; | |
| 71 | - | this.b = b; | |
| 72 | - | return this; | |
| 73 | - | } | |
| 74 | - | ||
| 75 | - | // this is used only for type declaration | |
| 76 | - | let a = object(1,2); | |
| 77 | - | // a has type {a: number, b: number} | |
| 78 | - | ``` | |
| 79 | - | ||
| 80 | - | ||
| 81 | - | ## Interfaces | |
| 82 | - | ||
| 83 | - | ### Inline | |
| 84 | - | ||
| 85 | - | ```ts | |
| 86 | - | function printLabel (options: { label: string }) { | |
| 87 | - | console.log(options.label) | |
| 88 | - | } | |
| 89 | - | ||
| 90 | - | // Note the semicolon | |
| 91 | - | function getUser (): { name: string; age?: number } { | |
| 92 | - | } | |
| 93 | - | ``` | |
| 94 | - | ||
| 95 | - | ### Explicit | |
| 96 | - | ||
| 97 | - | ```ts | |
| 98 | - | interface LabelOptions { | |
| 99 | - | label: string | |
| 100 | - | } | |
| 101 | - | ||
| 102 | - | function printLabel(options: LabelOptions) { ... } | |
| 103 | - | ``` | |
| 104 | - | ||
| 105 | - | ### Optional properties | |
| 106 | - | ||
| 107 | - | ```ts | |
| 108 | - | interface User { | |
| 109 | - | name: string; | |
| 110 | - | age?: number; | |
| 111 | - | } | |
| 112 | - | ``` | |
| 113 | - | ||
| 114 | - | ### Read only | |
| 115 | - | ||
| 116 | - | ```ts | |
| 117 | - | interface User { | |
| 118 | - | readonly name: string | |
| 119 | - | } | |
| 120 | - | ``` | |
| 121 | - | ||
| 122 | - | ### Dynamic keys | |
| 123 | - | ||
| 124 | - | ```ts | |
| 125 | - | { | |
| 126 | - | [key: string]: Object[] | |
| 127 | - | } | |
| 128 | - | ``` | |
| 129 | - | ||
| 130 | - | ## Type aliases | |
| 131 | - | ||
| 132 | - | ```ts | |
| 133 | - | type Name = string | string[] | |
| 134 | - | ``` | |
| 135 | - | ||
| 136 | - | ### Intersection | |
| 137 | - | ||
| 138 | - | ```ts | |
| 139 | - | interface Colorful { ... } | |
| 140 | - | ||
| 141 | - | interface Circle { ... } | |
| 142 | - | ||
| 143 | - | type ColorfulCircle = Colorful & Circle; | |
| 144 | - | ``` | |
| 145 | - | ||
| 146 | - | ## Function types | |
| 147 | - | ||
| 148 | - | ```ts | |
| 149 | - | interface User { ... } | |
| 150 | - | ||
| 151 | - | function getUser(callback: (user: User) => any) { callback({...}) } | |
| 152 | - | ||
| 153 | - | getUser(function (user: User) { ... }) | |
| 154 | - | ``` | |
| 155 | - | ||
| 156 | - | ## Classes | |
| 157 | - | ||
| 158 | - | ```ts | |
| 159 | - | class Point { | |
| 160 | - | x: number | |
| 161 | - | y: number | |
| 162 | - | static instances = 0 | |
| 163 | - | constructor(x: number, y: number) { | |
| 164 | - | this.x = x | |
| 165 | - | this.y = y | |
| 166 | - | } | |
| 167 | - | } | |
| 168 | - | ``` | |
| 169 | - | ||
| 170 | - | #### Inheritance | |
| 171 | - | ||
| 172 | - | ```ts | |
| 173 | - | class Point {...} | |
| 174 | - | ||
| 175 | - | class Point3D extends Point {...} | |
| 176 | - | ||
| 177 | - | interface Colored {...} | |
| 178 | - | ||
| 179 | - | class Pixel extends Point implements Colored {...} | |
| 180 | - | ``` | |
| 181 | - | ||
| 182 | - | #### Short fields initialisation | |
| 183 | - | ||
| 184 | - | ```ts | |
| 185 | - | class Point { | |
| 186 | - | static instances = 0; | |
| 187 | - | constructor( | |
| 188 | - | public x: number, | |
| 189 | - | public y: number, | |
| 190 | - | ){} | |
| 191 | - | } | |
| 192 | - | ``` | |
| 193 | - | ||
| 194 | - | #### Fields which do not require initialisation | |
| 195 | - | ```ts | |
| 196 | - | class Point { | |
| 197 | - | public someUselessValue!: number; | |
| 198 | - | ... | |
| 199 | - | } | |
| 200 | - | ``` | |
| 201 | - | ||
| 202 | - | ## Generics | |
| 203 | - | ||
| 204 | - | ```ts | |
| 205 | - | class Greeter<T> { | |
| 206 | - | greeting: T | |
| 207 | - | constructor(message: T) { | |
| 208 | - | this.greeting = message | |
| 209 | - | } | |
| 210 | - | } | |
| 211 | - | ||
| 212 | - | let greeter = new Greeter<string>('Hello, world') | |
| 213 | - | ``` | |
| 214 | - | ||
| 215 | - | ## Modules | |
| 216 | - | ||
| 217 | - | ```ts | |
| 218 | - | export interface User { ... } | |
| 219 | - | ``` | |
| 220 | - | ||
| 221 | - | ## Type extraction | |
| 222 | - | ||
| 223 | - | ```ts | |
| 224 | - | interface Building { | |
| 225 | - | room: { | |
| 226 | - | door: string; | |
| 227 | - | walls: string[]; | |
| 228 | - | }; | |
| 229 | - | } | |
| 230 | - | ||
| 231 | - | type Walls = Building['room']['walls']; // string[] | |
| 232 | - | ``` | |
| 233 | - | ||
| 234 | - | ## Keyof Type Operator | |
| 235 | - | ||
| 236 | - | ```ts | |
| 237 | - | type Point = { x: number; y: number }; | |
| 238 | - | ||
| 239 | - | type P = keyof Point; // x | y | |
| 240 | - | ``` | |
| 241 | - | ||
| 242 | - | ## Conditinal Types | |
| 243 | - | ||
| 244 | - | ```ts | |
| 245 | - | // SomeType extends OtherType ? TrueType : FalseType; | |
| 246 | - | ||
| 247 | - | type ToArray<T> = T extends any ? T[] : never; | |
| 248 | - | ||
| 249 | - | type StrArrOrNumArr = ToArray<string | number>; // string[] | number[] | |
| 250 | - | ``` | |
| 251 | - | ||
| 252 | - | ### Inferring | |
| 253 | - | ||
| 254 | - | ```ts | |
| 255 | - | type GetReturnType<T> = T extends (...args: unknown[]) => infer R | |
| 256 | - | ? R | |
| 257 | - | : never; | |
| 258 | - | ||
| 259 | - | type Num = GetReturnType<() => number>; // number | |
| 260 | - | ``` | |
| 261 | - | ||
| 262 | - | ```ts | |
| 263 | - | type First<T extends Array<any>> = T extends [infer F, ...infer Rest] ? F : never; | |
| 264 | - | ||
| 265 | - | type Str = First<['hello', 1, false]>; // 'hello' | |
| 266 | - | ``` | |
| 267 | - | ||
| 268 | - | ## Literal Type | |
| 269 | - | ||
| 270 | - | ```ts | |
| 271 | - | const point = { x: 4, y: 2 }; // { x: number, y: number } | |
| 272 | - | ||
| 273 | - | const literalPoint = { x: 4, y: 2 } as const; // { readonly x: 4, readonly y: 2 }; | |
| 274 | - | ``` | |
| 275 | - | ||
| 276 | - | ## Template Literal Types | |
| 277 | - | ||
| 278 | - | ```ts | |
| 279 | - | type SpaceChar = ' ' | '\n' | '\t'; | |
| 280 | - | ||
| 281 | - | type TrimLeft<S extends string> = S extends `${SpaceChar}${infer Rest}` ? TrimLeft<Rest> : S; | |
| 282 | - | ||
| 283 | - | type Str = TrimLeft<' hello'>; // 'hello' | |
| 284 | - | ``` | |
| 285 | - | ||
| 286 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 287 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,130 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Vagrantfile | |
| 3 | - | category: Devops | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | --- | |
| 6 | - | ||
| 7 | - | ## Vagrantfile | |
| 8 | - | {: .-one-column} | |
| 9 | - | ||
| 10 | - | ```rb | |
| 11 | - | Vagrant.configure("2") do |config| | |
| 12 | - | # All Vagrant configuration is done here. The most common configuration | |
| 13 | - | # options are documented and commented below. For a complete reference, | |
| 14 | - | # please see the online documentation at vagrantup.com. | |
| 15 | - | ||
| 16 | - | # Every Vagrant virtual environment requires a box to build off of. | |
| 17 | - | config.vm.box = "precise64" | |
| 18 | - | ||
| 19 | - | # The url from where the 'config.vm.box' box will be fetched if it | |
| 20 | - | # doesn't already exist on the user's system. | |
| 21 | - | # config.vm.box_url = "http://domain.com/path/to/above.box" | |
| 22 | - | ||
| 23 | - | # Create a forwarded port mapping which allows access to a specific port | |
| 24 | - | # within the machine from a port on the host machine. In the example below, | |
| 25 | - | # accessing "localhost:8080" will access port 80 on the guest machine. | |
| 26 | - | # config.vm.network :forwarded_port, guest: 80, host: 8080 | |
| 27 | - | ||
| 28 | - | # Create a private network, which allows host-only access to the machine | |
| 29 | - | # using a specific IP. | |
| 30 | - | # config.vm.network :private_network, ip: "192.168.33.10" | |
| 31 | - | ||
| 32 | - | # Create a public network, which generally matched to bridged network. | |
| 33 | - | # Bridged networks make the machine appear as another physical device on | |
| 34 | - | # your network. | |
| 35 | - | # config.vm.network :public_network | |
| 36 | - | ||
| 37 | - | # If true, then any SSH connections made will enable agent forwarding. | |
| 38 | - | # Default value: false | |
| 39 | - | # config.ssh.forward_agent = true | |
| 40 | - | ||
| 41 | - | # Share an additional folder to the guest VM. The first argument is | |
| 42 | - | # the path on the host to the actual folder. The second argument is | |
| 43 | - | # the path on the guest to mount the folder. And the optional third | |
| 44 | - | # argument is a set of non-required options. | |
| 45 | - | # config.vm.synced_folder "../data", "/vagrant_data" | |
| 46 | - | ||
| 47 | - | # Provider-specific configuration so you can fine-tune various | |
| 48 | - | # backing providers for Vagrant. These expose provider-specific options. | |
| 49 | - | # Example for VirtualBox: | |
| 50 | - | # | |
| 51 | - | # config.vm.provider :virtualbox do |vb| | |
| 52 | - | # # Don't boot with headless mode | |
| 53 | - | # vb.gui = true | |
| 54 | - | # | |
| 55 | - | # # Use VBoxManage to customize the VM. For example to change memory: | |
| 56 | - | # vb.customize ["modifyvm", :id, "--memory", "1024"] | |
| 57 | - | # end | |
| 58 | - | # | |
| 59 | - | # View the documentation for the provider you're using for more | |
| 60 | - | # information on available options. | |
| 61 | - | ||
| 62 | - | # Enable provisioning with Puppet stand alone. Puppet manifests | |
| 63 | - | # are contained in a directory path relative to this Vagrantfile. | |
| 64 | - | # You will need to create the manifests directory and a manifest in | |
| 65 | - | # the file precise64.pp in the manifests_path directory. | |
| 66 | - | # | |
| 67 | - | # An example Puppet manifest to provision the message of the day: | |
| 68 | - | # | |
| 69 | - | # # group { "puppet": | |
| 70 | - | # # ensure => "present", | |
| 71 | - | # # } | |
| 72 | - | # # | |
| 73 | - | # # File { owner => 0, group => 0, mode => 0644 } | |
| 74 | - | # # | |
| 75 | - | # # file { '/etc/motd': | |
| 76 | - | # # content => "Welcome to your Vagrant-built virtual machine! | |
| 77 | - | # # Managed by Puppet.\n" | |
| 78 | - | # # } | |
| 79 | - | # | |
| 80 | - | # config.vm.provision :puppet do |puppet| | |
| 81 | - | # puppet.manifests_path = "manifests" | |
| 82 | - | # puppet.manifest_file = "init.pp" | |
| 83 | - | # end | |
| 84 | - | ||
| 85 | - | # Enable provisioning with chef solo, specifying a cookbooks path, roles | |
| 86 | - | # path, and data_bags path (all relative to this Vagrantfile), and adding | |
| 87 | - | # some recipes and/or roles. | |
| 88 | - | # | |
| 89 | - | # config.vm.provision :chef_solo do |chef| | |
| 90 | - | # chef.cookbooks_path = "../my-recipes/cookbooks" | |
| 91 | - | # chef.roles_path = "../my-recipes/roles" | |
| 92 | - | # chef.data_bags_path = "../my-recipes/data_bags" | |
| 93 | - | # chef.add_recipe "mysql" | |
| 94 | - | # chef.add_role "web" | |
| 95 | - | # | |
| 96 | - | # # You may also specify custom JSON attributes: | |
| 97 | - | # chef.json = { :mysql_password => "foo" } | |
| 98 | - | # end | |
| 99 | - | ||
| 100 | - | # Enable provisioning with chef server, specifying the chef server URL, | |
| 101 | - | # and the path to the validation key (relative to this Vagrantfile). | |
| 102 | - | # | |
| 103 | - | # The Opscode Platform uses HTTPS. Substitute your organization for | |
| 104 | - | # ORGNAME in the URL and validation key. | |
| 105 | - | # | |
| 106 | - | # If you have your own Chef Server, use the appropriate URL, which may be | |
| 107 | - | # HTTP instead of HTTPS depending on your configuration. Also change the | |
| 108 | - | # validation key to validation.pem. | |
| 109 | - | # | |
| 110 | - | # config.vm.provision :chef_client do |chef| | |
| 111 | - | # chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME" | |
| 112 | - | # chef.validation_key_path = "ORGNAME-validator.pem" | |
| 113 | - | # end | |
| 114 | - | # | |
| 115 | - | # If you're using the Opscode platform, your validator client is | |
| 116 | - | # ORGNAME-validator, replacing ORGNAME with your organization name. | |
| 117 | - | # | |
| 118 | - | # If you have your own Chef Server, the default validation client name is | |
| 119 | - | # chef-validator, unless you changed the configuration. | |
| 120 | - | # | |
| 121 | - | # chef.validation_client_name = "ORGNAME-validator" | |
| 122 | - | end | |
| 123 | - | ``` | |
| 124 | - | ||
| 125 | - | ## Also see | |
| 126 | - | ||
| 127 | - | * [Vagrant cheatsheet](./vagrant) | |
| 128 | - | ||
| 129 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 130 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,147 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Vainglory | |
| 3 | - | layout: 2017/sheet | |
| 4 | - | --- | |
| 5 | - | ||
| 6 | - | ## T3 items by use | |
| 7 | - | {: .-one-column} | |
| 8 | - | ||
| 9 | - | | Use | CP | WP | Util | | |
| 10 | - | | --- | --- | --- | --- | | |
| 11 | - | | __Anti-armor/shield__ | [Myth][BM] | [Bonesaw][BS], [Tension][TB] | | | |
| 12 | - | | __Stacking damage__ | [Myth][BM] | [Break][BP] | | | |
| 13 | - | | __Lifesteal__ | [Eve][Eve] | [Serpent][SM], [Shiv][PS] | | | |
| 14 | - | | __Raw power__ | [Shatterglass][SG] | [Sorrowblade][SB] | | | |
| 15 | - | | __Burst damage__ | [Aftershock][AS] | [Tension][TB] | | | |
| 16 | - | | __Attack speed__ | [AC][AC] | [Tornado][TT], [Break][BP] | | | |
| 17 | - | | __Critical__ | | [Monocle][TM] | | | |
| 18 | - | | __Auto-attack damage__ | [AC][AC], [Aftershock][AS] | _everything_ | [Stormcrown][SC] | | |
| 19 | - | | __Cooldown__ | [Clockwork][CW], [Aftershock][AS] | Spellsword | [Stormcrown][SC], [Contraption][Con], [Nullwave][Null], [Halcyon Boots][HBoot] | | |
| 20 | - | | __Slow__ | [Frostburn][FB] | | [Shiversteel][SS] | | |
| 21 | - | | __Reflex block__ | | | [Aegis][Aegis] (self/shield) <br> [Crucible][Cru] (team/HP) | | |
| 22 | - | | __Ability repeat__ | [Echo][Echo] | | | | |
| 23 | - | {: .-left-align.-headers} | |
| 24 | - | ||
| 25 | - | ## Tier 3 items | |
| 26 | - | {: .-one-column} | |
| 27 | - | ||
| 28 | - | ### Crystal power | |
| 29 | - | ||
| 30 | - | | Item | Cost | CP | Use | | |
| 31 | - | | ---- | --- | --- | --- | | |
| 32 | - | | AS: [Aftershock][AS] | 2400 | +35 cp | __Basic dmg, atk speed__ <br> *+basic dmg after ability*, +25% cooldown, +2.5 recharge | | |
| 33 | - | | EoH: [Eve of Harvest][Eve] | 2600 | +55 cp | __Lifesteal__ <br> *+10% lifesteal*, +250 energy, +5 recharge | | |
| 34 | - | | AC: [Alternating Current][AC] | 2800 | +60 cp | __Basic dmg__ <br> *+basic dmg based on CP*, +65% atk speed | | |
| 35 | - | | BM: [Broken Myth][BM] | 2150 | +70 cp | __Stack dmg__ <br> +10% shield pierce, stacking dmg | | |
| 36 | - | | FB: [Frostburn][FB] | 2600 | +100 cp | __Slow__ <br> *slow for 1.5s* at (10% + 1% per 10CP) | | |
| 37 | - | | SG: [Shatterglass][SG] | 3000 | +150 cp | __Raw power__ <br> - | | |
| 38 | - | | CW: [Clockwork][CW] | 2500 | +30% cp | __Cooldown__ <br> *+40% cooldown*, +250 energy, +7.5 recharge | | |
| 39 | - | | [Echo][Echo] | 2500? | | __Ability repeat__ <br> +250 energy, +4 recharge | | |
| 40 | - | {: .-left-align.-headers} | |
| 41 | - | ||
| 42 | - | [AS]: http://www.vaingloryfire.com/vainglory/wiki/items/aftershock | |
| 43 | - | [AC]: http://www.vaingloryfire.com/vainglory/wiki/items/alternating-current | |
| 44 | - | [Eve]: http://www.vaingloryfire.com/vainglory/wiki/items/eve-of-harvest | |
| 45 | - | [SG]: http://www.vaingloryfire.com/vainglory/wiki/items/shatterglass | |
| 46 | - | [BM]: http://www.vaingloryfire.com/vainglory/wiki/items/broken-myth | |
| 47 | - | [CW]: http://www.vaingloryfire.com/vainglory/wiki/items/clockwork | |
| 48 | - | [FB]: http://www.vaingloryfire.com/vainglory/wiki/items/frostburn | |
| 49 | - | [Echo]: http://www.vaingloryfire.com/vainglory/wiki/items/echo | |
| 50 | - | ||
| 51 | - | ### Weapon power | |
| 52 | - | ||
| 53 | - | | Item | Cost | WP | Other | | |
| 54 | - | | ---- | --- | --- | --- | | |
| 55 | - | | TT: [Tornado Trigger][TT] | 2600 | | __Atk speed__ <br> *+75% atk speed*, +20% crit change, +20% crit dmg | | |
| 56 | - | | BS: [Bonesaw][BS] | 2700 | +15 wp | __Armor shred__ <br> *stacking armor shred* | | |
| 57 | - | | TB: [Tension Bow][TB] | 2300 | +45 wp | __Bonus dmg__ <br> *bonus dmg every 6s*, +8% armor pierce | | |
| 58 | - | | TM: [Tyrant's Monocle][TM] | 2750 | +50 wp | __Crit__ <br> *+40% crit chance*, +20% crit dmg | | |
| 59 | - | | BP: [Breaking Point][BP] | 2600 | +55 wp | __Stacking dmg__ <br> *stacking weapon dmg*, +35% atk speed | | |
| 60 | - | | SM: [Serpent Mask][SM] | 2800 | +85 wp | __Lifesteal__ <br> *stacking lifesteal*, +10% lifesteal | | |
| 61 | - | | SB: [Sorrowblade][SB] | 3100 | +150 wp | __Raw power__ <br> - | | |
| 62 | - | | PS: [Poisoned Shiv][PS] | 2250 | +30 wp | __Mortal wounds__ <br> *mortal wounds for 2s*, +10% lifesteal, +30% atk speed | | |
| 63 | - | | SS: Spellsword | ? | +90 wp | __Cooldown__ <br> ? | | |
| 64 | - | {: .-left-align.-headers} | |
| 65 | - | ||
| 66 | - | [BS]: http://www.vaingloryfire.com/vainglory/wiki/items/bonesaw | |
| 67 | - | [BP]: http://www.vaingloryfire.com/vainglory/wiki/items/breaking-point | |
| 68 | - | [SM]: http://www.vaingloryfire.com/vainglory/wiki/items/serpent-mask | |
| 69 | - | [SB]: http://www.vaingloryfire.com/vainglory/wiki/items/sorrowblade | |
| 70 | - | [TB]: http://www.vaingloryfire.com/vainglory/wiki/items/tension-bow | |
| 71 | - | [TT]: http://www.vaingloryfire.com/vainglory/wiki/items/tornado-trigger | |
| 72 | - | [TM]: http://www.vaingloryfire.com/vainglory/wiki/items/tyrants-monocle | |
| 73 | - | [PS]: http://www.vaingloryfire.com/vainglory/wiki/items/poisoned-shiv | |
| 74 | - | ||
| 75 | - | ### Utilities | |
| 76 | - | ||
| 77 | - | | Item | Cost | HP | Use | | |
| 78 | - | | --- | --- | --- | --- | | |
| 79 | - | | [Halcyon Chargers][HBoot] | 2300 | +200 hp | 👟 __Boots__ <br> +15% cooldown, +250 energy, +4 recharge | | |
| 80 | - | | [Stormcrown][SC] | 2200 | +200 hp | 🔴 __Bonus dmg__ <br> +30% cooldown, +4 recharge, bonus true damage | | |
| 81 | - | | [Journey Boots][JBoot] | 1900 | +250 hp | 👟 __Boots__ <br> damaging heroes resets sprint cooldown | | |
| 82 | - | | [Nullwave Gauntlet][Null] (2.0) | 2250 | +300 hp | 😶 __Item silence__ <br> +25% cooldown | | |
| 83 | - | | [Contraption][Con] | 2100 | +350 hp | 👀 __Vision__ <br> traps/flares, +40% cooldown, +3 recharge | | |
| 84 | - | | [Shiversteel][SS] | 1450 | +500 hp | 🐌 __Slow__ <br> active: slow targets | | |
| 85 | - | | [War Treads][WBoot] | 2500 | +600 hp | 👟 __Boots__ <br> gives sprint to nearby teammates | | |
| 86 | - | {: .-left-align.-headers} | |
| 87 | - | ||
| 88 | - | ### Defense | |
| 89 | - | ||
| 90 | - | | Item | Cost | HP | Armor | Shield | Use | | |
| 91 | - | | --- | --- | --- | --- | --- | --- | | |
| 92 | - | | [Aegis][Aegis] | 2250 | | +30 ar | +125 sh | ✊__Reflex block__ (self) | | |
| 93 | - | | [Fountain of Renewal][Fountain] | 2300 | +200 hp | +30 ar | +75 sh | ❤ __Heal__ allies | | |
| 94 | - | | [Atlas Pauldron][Atlas] | 1900 | | +85 ar | +35 sh | 🐌 __Slow__ target attack speed | | |
| 95 | - | | [Metal Jacket][Metal] | 2100 | | +170 ar | +35 sh | | | |
| 96 | - | | [Crucible][Cru] | 1850 | +600 hp | | | ✊ __Reflex block__ (team) | | |
| 97 | - | | [Slumbering Husk][Husk] (2.0) | 1600 | +400 hp | | | __Fortification__ against burst damage | | |
| 98 | - | {: .-left-align.-headers} | |
| 99 | - | ||
| 100 | - | [Fountain]: http://www.vaingloryfire.com/vainglory/wiki/items/fountain-of-renewal | |
| 101 | - | [Cru]: http://www.vaingloryfire.com/vainglory/wiki/items/aegis | |
| 102 | - | [Aegis]: http://www.vaingloryfire.com/vainglory/wiki/items/aegis | |
| 103 | - | [Atlas]: http://www.vaingloryfire.com/vainglory/wiki/items/atlas-pauldron | |
| 104 | - | [Metal]: http://www.vaingloryfire.com/vainglory/wiki/items/metal-jacket | |
| 105 | - | [Husk]: http://www.vaingloryfire.com/vainglory/wiki/items/slumbering-husk | |
| 106 | - | [Null]: http://www.vaingloryfire.com/vainglory/wiki/items/nullwave-gauntlet | |
| 107 | - | ||
| 108 | - | ### Boots | |
| 109 | - | ||
| 110 | - | | Item | Movement speed | HP | Sprint | Use | | |
| 111 | - | | --- | --- | --- | --- | --- | | |
| 112 | - | | [War Treads][WBoot] | +0.4 | +600 hp | 2s (60s cooldown) <br> incl. nearby teammates | __HP, assist__ | | |
| 113 | - | | [Halcyon Chargers][HBoot] | +0.5 | | 3s (50s cooldown) | __Energy__ | | |
| 114 | - | | [Journey Boots][JBoot] | +0.6 | +250 hp | 2s (60s cooldown) <br> damaging resets cooldown | __Gap close__ | | |
| 115 | - | {: .-left-align.-headers} | |
| 116 | - | ||
| 117 | - | [Con]: http://www.vaingloryfire.com/vainglory/wiki/items/contraption | |
| 118 | - | [HBoot]: http://www.vaingloryfire.com/vainglory/wiki/items/halcyon-chargers | |
| 119 | - | [WBoot]: http://www.vaingloryfire.com/vainglory/wiki/items/war-treads | |
| 120 | - | [JBoot]: http://www.vaingloryfire.com/vainglory/wiki/items/journey-boots | |
| 121 | - | [SC]: http://www.vaingloryfire.com/vainglory/wiki/items/stormcrown | |
| 122 | - | [SS]: http://www.vaingloryfire.com/vainglory/wiki/items/shiversteel | |
| 123 | - | ||
| 124 | - | ## Skill tier names | |
| 125 | - | ||
| 126 | - | | Just Beginning | 1 | | |
| 127 | - | | Getting There | 2 | | |
| 128 | - | | Rock Solid | 3 | | |
| 129 | - | | Worthy Foe |4 | | |
| 130 | - | | Got Swagger | 5 | | |
| 131 | - | | Credible Threat | 6 | | |
| 132 | - | | The Hotness | 7 | | |
| 133 | - | | Simply Amazing | 8 | | |
| 134 | - | | Pinnacle of Awesome | 9 | | |
| 135 | - | | Vainglorious | 10 | | |
| 136 | - | ||
| 137 | - | See: [Skill tier names](http://www.vaingloryfire.com/vainglory/forum/general-discussion/bronze-silver-gold-rankings-5312) | |
| 138 | - | ||
| 139 | - | ## References | |
| 140 | - | ||
| 141 | - | - Last updated for Vainglory 1.22 with some 2.0 stuff. | |
| 142 | - | - [Vaingloryfire.com](http://www.vaingloryfire.com/) | |
| 143 | - | - [Version history](http://forums.vainglorygame.com/index.php?threads/41129/) (forums.vainglorygame.com) | |
| 144 | - | - [Skill tier points](http://brokenmyth.net/skill-tier-point-far-next-tier/#more-10043) (brokenmyth.net) | |
| 145 | - | ||
| 146 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 147 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,720 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Vim scripting | |
| 3 | - | category: Vim | |
| 4 | - | prism_languages: [vim] | |
| 5 | - | layout: 2017/sheet | |
| 6 | - | updated: 2020-07-05 | |
| 7 | - | weight: -10 | |
| 8 | - | tags: [Featurable] | |
| 9 | - | --- | |
| 10 | - | ||
| 11 | - | ### Start hacking | |
| 12 | - | ||
| 13 | - | ```vim | |
| 14 | - | let name = "John" | |
| 15 | - | echo "Hello, " . name | |
| 16 | - | ``` | |
| 17 | - | ||
| 18 | - | 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`. | |
| 19 | - | ||
| 20 | - | ### Learn by example | |
| 21 | - | ||
| 22 | - | ```vim | |
| 23 | - | function! SuperTab() | |
| 24 | - | let l:part = strpart(getline('.'),col('.')-2,1) | |
| 25 | - | if (l:part =~ '^\W\?$') | |
| 26 | - | return "\<Tab>" | |
| 27 | - | else | |
| 28 | - | return "\<C-n>" | |
| 29 | - | endif | |
| 30 | - | endfunction | |
| 31 | - | ||
| 32 | - | imap <Tab> <C-R>=SuperTab()<CR> | |
| 33 | - | ``` | |
| 34 | - | ||
| 35 | - | [Here](http://www.vimbits.com/bits/46)'s another example with [functions](#functions), [variables](#variables) and [mapping](#mapping). | |
| 36 | - | ||
| 37 | - | Variables | |
| 38 | - | --------- | |
| 39 | - | ||
| 40 | - | ### Defining | |
| 41 | - | {: .-prime} | |
| 42 | - | ||
| 43 | - | ```vim | |
| 44 | - | let var = "hello" | |
| 45 | - | ``` | |
| 46 | - | ||
| 47 | - | ### Variable prefixes | |
| 48 | - | ||
| 49 | - | ```vim | |
| 50 | - | let g:ack_options = '-s -H' " g: global | |
| 51 | - | let s:ack_program = 'ack' " s: local (to script) | |
| 52 | - | let l:foo = 'bar' " l: local (to function) | |
| 53 | - | ``` | |
| 54 | - | ||
| 55 | - | The `s:` prefix is also available in function names. See `:help local-variables` | |
| 56 | - | ||
| 57 | - | ### Other prefixes | |
| 58 | - | ||
| 59 | - | ```vim | |
| 60 | - | let w:foo = 'bar' " w: window | |
| 61 | - | let b:state = 'on' " b: buffer | |
| 62 | - | let t:state = 'off' " t: tab | |
| 63 | - | echo v:var " v: vim special | |
| 64 | - | ``` | |
| 65 | - | ||
| 66 | - | ```vim | |
| 67 | - | let @/ = '' " @ register (this clears last search pattern) | |
| 68 | - | echo $PATH " $ env | |
| 69 | - | ``` | |
| 70 | - | ||
| 71 | - | ### Vim options | |
| 72 | - | ||
| 73 | - | ```vim | |
| 74 | - | echo 'tabstop is ' . &tabstop | |
| 75 | - | if &insertmode | |
| 76 | - | echo &g:option | |
| 77 | - | echo &l:option | |
| 78 | - | ``` | |
| 79 | - | ||
| 80 | - | Prefix Vim options with `&` | |
| 81 | - | ||
| 82 | - | ### Operators | |
| 83 | - | ||
| 84 | - | ```vim | |
| 85 | - | a + b " numbers only! | |
| 86 | - | 'hello ' . name " concat | |
| 87 | - | ``` | |
| 88 | - | ||
| 89 | - | ```vim | |
| 90 | - | let var -= 2 | |
| 91 | - | let var += 5 | |
| 92 | - | let var .= 'string' " concat | |
| 93 | - | ``` | |
| 94 | - | ||
| 95 | - | ## Strings | |
| 96 | - | ||
| 97 | - | ### Strings | |
| 98 | - | ||
| 99 | - | ```vim | |
| 100 | - | let str = "String" | |
| 101 | - | let str = "String with \n newline" | |
| 102 | - | ||
| 103 | - | let literal = 'literal, no \ escaping' | |
| 104 | - | let literal = 'that''s enough' " double '' => ' | |
| 105 | - | ||
| 106 | - | echo "result = " . re " concatenation | |
| 107 | - | ``` | |
| 108 | - | ||
| 109 | - | Also see `:help literal-string` and `:help expr-quote`. | |
| 110 | - | See: [Strings](http://learnvimscriptthehardway.stevelosh.com/chapters/26.html) | |
| 111 | - | ||
| 112 | - | ### String functions | |
| 113 | - | ||
| 114 | - | ```vim | |
| 115 | - | strlen(str) " length | |
| 116 | - | len(str) " same | |
| 117 | - | strchars(str) " character length | |
| 118 | - | ||
| 119 | - | split("one two three") "=> ['one', 'two', 'three'] | |
| 120 | - | split("one.two.three", '.') "=> ['one', 'two', 'three'] | |
| 121 | - | ||
| 122 | - | join(['a', 'b'], ',') "=> 'a,b' | |
| 123 | - | ||
| 124 | - | tolower('Hello') | |
| 125 | - | toupper('Hello') | |
| 126 | - | ``` | |
| 127 | - | ||
| 128 | - | Also see `:help functions` | |
| 129 | - | See: [String functions](http://learnvimscriptthehardway.stevelosh.com/chapters/27.html) | |
| 130 | - | ||
| 131 | - | Functions | |
| 132 | - | --------- | |
| 133 | - | ||
| 134 | - | ### Functions | |
| 135 | - | {: .-prime} | |
| 136 | - | ||
| 137 | - | ```vim | |
| 138 | - | " prefix with s: for local script-only functions | |
| 139 | - | function! s:Initialize(cmd, args) | |
| 140 | - | " a: prefix for arguments | |
| 141 | - | echo "Command: " . a:cmd | |
| 142 | - | ||
| 143 | - | return 1 | |
| 144 | - | endfunction | |
| 145 | - | ``` | |
| 146 | - | ||
| 147 | - | See: [Functions](http://learnvimscriptthehardway.stevelosh.com/chapters/23.html) | |
| 148 | - | ||
| 149 | - | ### Namespacing | |
| 150 | - | ||
| 151 | - | ```vim | |
| 152 | - | function! myplugin#hello() | |
| 153 | - | ``` | |
| 154 | - | ||
| 155 | - | ### Calling functions | |
| 156 | - | ||
| 157 | - | ```vim | |
| 158 | - | call s:Initialize() | |
| 159 | - | call s:Initialize("hello") | |
| 160 | - | ``` | |
| 161 | - | ||
| 162 | - | ### Consuming return values | |
| 163 | - | ||
| 164 | - | ```vim | |
| 165 | - | echo "Result: " . s:Initialize() | |
| 166 | - | ``` | |
| 167 | - | ||
| 168 | - | ### Abortable | |
| 169 | - | ||
| 170 | - | ```vim | |
| 171 | - | function! myfunction() abort | |
| 172 | - | endfunction | |
| 173 | - | ``` | |
| 174 | - | ||
| 175 | - | Aborts when an error occurs. | |
| 176 | - | ||
| 177 | - | ### Var arguments | |
| 178 | - | ||
| 179 | - | ```vim | |
| 180 | - | function! infect(...) | |
| 181 | - | echo a:0 "=> 2 | |
| 182 | - | echo a:1 "=> jake | |
| 183 | - | echo a:2 "=> bella | |
| 184 | - | ||
| 185 | - | for s in a:000 " a list | |
| 186 | - | echon ' ' . s | |
| 187 | - | endfor | |
| 188 | - | endfunction | |
| 189 | - | ||
| 190 | - | infect('jake', 'bella') | |
| 191 | - | ``` | |
| 192 | - | ||
| 193 | - | See `:help function-argument`. See: [Var arguments](http://learnvimscriptthehardway.stevelosh.com/chapters/24.html) | |
| 194 | - | ||
| 195 | - | Loops | |
| 196 | - | ----- | |
| 197 | - | ||
| 198 | - | ```vim | |
| 199 | - | for s in list | |
| 200 | - | echo s | |
| 201 | - | continue " jump to start of loop | |
| 202 | - | break " breaks out of a loop | |
| 203 | - | endfor | |
| 204 | - | ``` | |
| 205 | - | ||
| 206 | - | ```vim | |
| 207 | - | while x < 5 | |
| 208 | - | endwhile | |
| 209 | - | ``` | |
| 210 | - | ||
| 211 | - | Custom commands | |
| 212 | - | --------------- | |
| 213 | - | ||
| 214 | - | ### Custom commands | |
| 215 | - | {: .-prime} | |
| 216 | - | ||
| 217 | - | ```vim | |
| 218 | - | command! Save :set fo=want tw=80 nowrap | |
| 219 | - | ``` | |
| 220 | - | ||
| 221 | - | Custom commands start with uppercase letters. The `!` redefines a command if it already exists. | |
| 222 | - | ||
| 223 | - | ### Commands calling functions | |
| 224 | - | ||
| 225 | - | ```vim | |
| 226 | - | command! Save call <SID>foo() | |
| 227 | - | ``` | |
| 228 | - | {: .-setup} | |
| 229 | - | ||
| 230 | - | ```vim | |
| 231 | - | function! s:foo() | |
| 232 | - | ... | |
| 233 | - | endfunction | |
| 234 | - | ``` | |
| 235 | - | ||
| 236 | - | ### Commands with arguments | |
| 237 | - | ||
| 238 | - | ```vim | |
| 239 | - | command! -nargs=? Save call script#foo(<args>) | |
| 240 | - | ``` | |
| 241 | - | {: .-setup} | |
| 242 | - | ||
| 243 | - | | What | What | | |
| 244 | - | | ---- | ---- | | |
| 245 | - | | `-nargs=0` | 0 arguments, default | | |
| 246 | - | | `-nargs=1` | 1 argument, includes spaces | | |
| 247 | - | | `-nargs=?` | 0 or 1 argument | | |
| 248 | - | | `-nargs=*` | 0+ arguments, space separated | | |
| 249 | - | | `-nargs=+` | 1+ arguments, space reparated | | |
| 250 | - | ||
| 251 | - | Flow | |
| 252 | - | ---- | |
| 253 | - | ||
| 254 | - | ### Conditionals | |
| 255 | - | ||
| 256 | - | ```vim | |
| 257 | - | let char = getchar() | |
| 258 | - | if char == "\<LeftMouse>" | |
| 259 | - | " ... | |
| 260 | - | elseif char == "\<RightMouse>" | |
| 261 | - | " ... | |
| 262 | - | else | |
| 263 | - | " ... | |
| 264 | - | endif | |
| 265 | - | ``` | |
| 266 | - | ||
| 267 | - | ### Truthiness | |
| 268 | - | ||
| 269 | - | ```vim | |
| 270 | - | if 1 | echo "true" | endif | |
| 271 | - | if 0 | echo "false" | endif | |
| 272 | - | ``` | |
| 273 | - | ||
| 274 | - | ```vim | |
| 275 | - | if 1 "=> 1 (true) | |
| 276 | - | if 0 "=> 0 (false) | |
| 277 | - | if "1" "=> 1 (true) | |
| 278 | - | if "456" "=> 1 (true) | |
| 279 | - | if "xfz" "=> 0 (false) | |
| 280 | - | ``` | |
| 281 | - | ||
| 282 | - | No booleans. `0` is false, `1` is true. | |
| 283 | - | See: [Truthiness](http://learnvimscriptthehardway.stevelosh.com/chapters/21.html) | |
| 284 | - | ||
| 285 | - | ### Operators | |
| 286 | - | ||
| 287 | - | ```vim | |
| 288 | - | if 3 > 2 | |
| 289 | - | if a && b | |
| 290 | - | if (a && b) || (c && d) | |
| 291 | - | if !c | |
| 292 | - | ``` | |
| 293 | - | ||
| 294 | - | See `:help expression-syntax`. | |
| 295 | - | See: [Operators](http://learnvimscriptthehardway.stevelosh.com/chapters/22.html) | |
| 296 | - | ||
| 297 | - | ### Strings | |
| 298 | - | ||
| 299 | - | ```vim | |
| 300 | - | if name ==# 'John' " case-sensitive | |
| 301 | - | if name ==? 'John' " case-insensitive | |
| 302 | - | if name == 'John' " depends on :set ignorecase | |
| 303 | - | ||
| 304 | - | " also: is#, is?, >=#, >=?, and so on | |
| 305 | - | ``` | |
| 306 | - | ||
| 307 | - | ### Identity operators | |
| 308 | - | ||
| 309 | - | ```vim | |
| 310 | - | a is b | |
| 311 | - | a isnot b | |
| 312 | - | ``` | |
| 313 | - | ||
| 314 | - | Checks if it's the same instance object. | |
| 315 | - | ||
| 316 | - | ### Regexp matches | |
| 317 | - | ||
| 318 | - | ```vim | |
| 319 | - | "hello" =~ 'xx*' | |
| 320 | - | "hello" !~ 'xx*' | |
| 321 | - | "hello" =~ '\v<\d+>' | |
| 322 | - | ``` | |
| 323 | - | ||
| 324 | - | `\v` enables "extended" regex mode which allows word boundary (`<>`), `+`, and more. | |
| 325 | - | ||
| 326 | - | ### Single line | |
| 327 | - | ||
| 328 | - | ```vim | |
| 329 | - | if empty(a:path) | return [] | endif | |
| 330 | - | a ? b : c | |
| 331 | - | ``` | |
| 332 | - | ||
| 333 | - | Use `|` to join lines together. | |
| 334 | - | ||
| 335 | - | ### Boolean logic | |
| 336 | - | ||
| 337 | - | ```vim | |
| 338 | - | if g:use_dispatch && s:has_dispatch | |
| 339 | - | ··· | |
| 340 | - | endif | |
| 341 | - | ``` | |
| 342 | - | ||
| 343 | - | Lists | |
| 344 | - | ----- | |
| 345 | - | ||
| 346 | - | ### Lists | |
| 347 | - | ||
| 348 | - | ```vim | |
| 349 | - | let mylist = [1, two, 3, "four"] | |
| 350 | - | ||
| 351 | - | let first = mylist[0] | |
| 352 | - | let last = mylist[-1] | |
| 353 | - | ||
| 354 | - | " Suppresses errors | |
| 355 | - | let second = get(mylist, 1) | |
| 356 | - | let second = get(mylist, 1, "NONE") | |
| 357 | - | ``` | |
| 358 | - | ||
| 359 | - | ### Functions | |
| 360 | - | ||
| 361 | - | ```vim | |
| 362 | - | len(mylist) | |
| 363 | - | empty(mylist) | |
| 364 | - | ||
| 365 | - | sort(list) | |
| 366 | - | let sortedlist = sort(copy(list)) | |
| 367 | - | ||
| 368 | - | split('hello there world', ' ') | |
| 369 | - | ``` | |
| 370 | - | ||
| 371 | - | ### Concatenation | |
| 372 | - | ||
| 373 | - | ```vim | |
| 374 | - | let longlist = mylist + [5, 6] | |
| 375 | - | let mylist += [7, 8] | |
| 376 | - | ``` | |
| 377 | - | ||
| 378 | - | ### Sublists | |
| 379 | - | ||
| 380 | - | ```vim | |
| 381 | - | let shortlist = mylist[2:-1] | |
| 382 | - | let shortlist = mylist[2:] " same | |
| 383 | - | ||
| 384 | - | let shortlist = mylist[2:2] " one item | |
| 385 | - | ``` | |
| 386 | - | ||
| 387 | - | ### Push | |
| 388 | - | ||
| 389 | - | ```vim | |
| 390 | - | let alist = [1, 2, 3] | |
| 391 | - | let alist = add(alist, 4) | |
| 392 | - | ``` | |
| 393 | - | ||
| 394 | - | ### Map | |
| 395 | - | ||
| 396 | - | ```vim | |
| 397 | - | call map(files, "bufname(v:val)") " use v:val for value | |
| 398 | - | call filter(files, 'v:val != ""') | |
| 399 | - | ``` | |
| 400 | - | ||
| 401 | - | Dictionaries | |
| 402 | - | ------------ | |
| 403 | - | ||
| 404 | - | ### Dictionaries | |
| 405 | - | ||
| 406 | - | ```vim | |
| 407 | - | let colors = { | |
| 408 | - | \ "apple": "red", | |
| 409 | - | \ "banana": "yellow" | |
| 410 | - | } | |
| 411 | - | ||
| 412 | - | echo colors["a"] | |
| 413 | - | echo get(colors, "apple") " suppress error | |
| 414 | - | ``` | |
| 415 | - | ||
| 416 | - | See `:help dict` | |
| 417 | - | ||
| 418 | - | ### Using dictionaries | |
| 419 | - | ||
| 420 | - | ```vim | |
| 421 | - | remove(colors, "apple") | |
| 422 | - | ``` | |
| 423 | - | ||
| 424 | - | ```vim | |
| 425 | - | " :help E715 | |
| 426 | - | if has_key(dict, 'foo') | |
| 427 | - | if empty(dict) | |
| 428 | - | keys(dict) | |
| 429 | - | len(dict) | |
| 430 | - | ``` | |
| 431 | - | ||
| 432 | - | ```vim | |
| 433 | - | max(dict) | |
| 434 | - | min(dict) | |
| 435 | - | ``` | |
| 436 | - | ||
| 437 | - | ```vim | |
| 438 | - | count(dict, 'x') | |
| 439 | - | string(dict) | |
| 440 | - | ``` | |
| 441 | - | ||
| 442 | - | ```vim | |
| 443 | - | map(dict, '<>> " . v:val') | |
| 444 | - | ``` | |
| 445 | - | ||
| 446 | - | ### Iteration | |
| 447 | - | ||
| 448 | - | ```vim | |
| 449 | - | for key in keys(mydict) | |
| 450 | - | echo key . ': ' . mydict(key) | |
| 451 | - | endfor | |
| 452 | - | ``` | |
| 453 | - | ||
| 454 | - | ### Prefixes | |
| 455 | - | ||
| 456 | - | ```vim | |
| 457 | - | keys(s:) | |
| 458 | - | ``` | |
| 459 | - | ||
| 460 | - | Prefixes (`s:`, `g:`, `l:`, etc) are actually dictionaries. | |
| 461 | - | ||
| 462 | - | ### Extending | |
| 463 | - | ||
| 464 | - | ```vim | |
| 465 | - | " Extending with more | |
| 466 | - | let extend(s:fruits, { ... }) | |
| 467 | - | ``` | |
| 468 | - | ||
| 469 | - | Casting | |
| 470 | - | ------- | |
| 471 | - | ||
| 472 | - | ```vim | |
| 473 | - | str2float("2.3") | |
| 474 | - | str2nr("3") | |
| 475 | - | float2nr("3.14") | |
| 476 | - | ``` | |
| 477 | - | ||
| 478 | - | Numbers | |
| 479 | - | ------- | |
| 480 | - | ||
| 481 | - | ### Numbers | |
| 482 | - | {: .-prime} | |
| 483 | - | ||
| 484 | - | ```vim | |
| 485 | - | let int = 1000 | |
| 486 | - | let int = 0xff | |
| 487 | - | let int = 0755 " octal | |
| 488 | - | ``` | |
| 489 | - | ||
| 490 | - | See `:help Number`. | |
| 491 | - | See: [Numbers](http://learnvimscriptthehardway.stevelosh.com/chapters/25.html) | |
| 492 | - | ||
| 493 | - | ### Floats | |
| 494 | - | ||
| 495 | - | ```vim | |
| 496 | - | let fl = 100.1 | |
| 497 | - | let fl = 5.4e4 | |
| 498 | - | ``` | |
| 499 | - | ||
| 500 | - | See `:help Float` | |
| 501 | - | ||
| 502 | - | ### Arithmetic | |
| 503 | - | ||
| 504 | - | ```vim | |
| 505 | - | 3 / 2 "=> 1, integer division | |
| 506 | - | 3 / 2.0 "=> 1.5 | |
| 507 | - | 3 * 2.0 "=> 6.0 | |
| 508 | - | ``` | |
| 509 | - | ||
| 510 | - | ### Math functions | |
| 511 | - | ||
| 512 | - | ```vim | |
| 513 | - | sqrt(100) | |
| 514 | - | floor(3.5) | |
| 515 | - | ceil(3.3) | |
| 516 | - | abs(-3.4) | |
| 517 | - | ||
| 518 | - | sin() cos() tan() | |
| 519 | - | sinh() cosh() tanh() | |
| 520 | - | asin() acos() atan() | |
| 521 | - | ``` | |
| 522 | - | ||
| 523 | - | Vim-isms | |
| 524 | - | -------- | |
| 525 | - | ||
| 526 | - | ### Execute a command | |
| 527 | - | ||
| 528 | - | ```vim | |
| 529 | - | execute "vsplit" | |
| 530 | - | execute "e " . fnameescape(filename) | |
| 531 | - | ``` | |
| 532 | - | ||
| 533 | - | Runs an ex command you typically run with `:`. Also see `:help execute`. | |
| 534 | - | See: [Execute a command](http://learnvimscriptthehardway.stevelosh.com/chapters/28.html) | |
| 535 | - | ||
| 536 | - | ### Running keystrokes | |
| 537 | - | ||
| 538 | - | ```vim | |
| 539 | - | normal G | |
| 540 | - | normal! G " skips key mappings | |
| 541 | - | ||
| 542 | - | execute "normal! gg/foo\<cr>dd" | |
| 543 | - | ``` | |
| 544 | - | ||
| 545 | - | Use `:normal` to execute keystrokes as if you're typing them in normal mode. Combine with `:execute` for special keystrokes. | |
| 546 | - | See: [Running keystrokes](http://learnvimscriptthehardway.stevelosh.com/chapters/29.html) | |
| 547 | - | ||
| 548 | - | ### Getting filenames | |
| 549 | - | ||
| 550 | - | ```vim | |
| 551 | - | echo expand("%") " path/file.txt | |
| 552 | - | echo expand("%:t") " file.txt | |
| 553 | - | echo expand("%:p:h") " /home/you/path/file.txt | |
| 554 | - | echo expand("%:r") " path/file | |
| 555 | - | echo expand("%:e") " txt | |
| 556 | - | ``` | |
| 557 | - | ||
| 558 | - | See `:help expand` | |
| 559 | - | ||
| 560 | - | ### Silencing | |
| 561 | - | ||
| 562 | - | ```vim | |
| 563 | - | silent g/Aap/p | |
| 564 | - | ``` | |
| 565 | - | ||
| 566 | - | Suppresses output. See `:help silent` | |
| 567 | - | ||
| 568 | - | ### Echo | |
| 569 | - | ||
| 570 | - | ```vim | |
| 571 | - | echoerr 'oh it failed' | |
| 572 | - | echomsg 'hello there' | |
| 573 | - | echo 'hello' | |
| 574 | - | ||
| 575 | - | echohl WarningMsg | echomsg "=> " . a:msg | echohl None | |
| 576 | - | ``` | |
| 577 | - | ||
| 578 | - | ||
| 579 | - | ### Settings | |
| 580 | - | ||
| 581 | - | ```vim | |
| 582 | - | set number | |
| 583 | - | set nonumber | |
| 584 | - | set number! " toggle | |
| 585 | - | set numberwidth=5 | |
| 586 | - | set guioptions+=e | |
| 587 | - | ``` | |
| 588 | - | ||
| 589 | - | ### Prompts | |
| 590 | - | ||
| 591 | - | ```vim | |
| 592 | - | let result = confirm("Sure?") | |
| 593 | - | execute "confirm q" | |
| 594 | - | ``` | |
| 595 | - | ||
| 596 | - | ### Built-ins | |
| 597 | - | ||
| 598 | - | ```vim | |
| 599 | - | has("feature") " :h feature-list | |
| 600 | - | executable("python") | |
| 601 | - | globpath(&rtp, "syntax/c.vim") | |
| 602 | - | ||
| 603 | - | exists("$ENV") | |
| 604 | - | exists(":command") | |
| 605 | - | exists("variable") | |
| 606 | - | exists("+option") | |
| 607 | - | exists("g:...") | |
| 608 | - | ``` | |
| 609 | - | ||
| 610 | - | Mapping | |
| 611 | - | ------- | |
| 612 | - | {: .-three-column} | |
| 613 | - | ||
| 614 | - | ### Mapping commands | |
| 615 | - | ||
| 616 | - | ```vim | |
| 617 | - | nmap | |
| 618 | - | vmap | |
| 619 | - | imap | |
| 620 | - | xmap | |
| 621 | - | nnoremap | |
| 622 | - | vnoremap | |
| 623 | - | inoremap | |
| 624 | - | xnoremap | |
| 625 | - | ... | |
| 626 | - | ``` | |
| 627 | - | ||
| 628 | - | ### Explanation | |
| 629 | - | ||
| 630 | - | ```vim | |
| 631 | - | [nvixso](nore)map | |
| 632 | - | ``` | |
| 633 | - | ||
| 634 | - | ``` | |
| 635 | - | │ └ don't recurse | |
| 636 | - | │ | |
| 637 | - | └ normal, visual, insert, | |
| 638 | - | eX mode, select, operator-pending | |
| 639 | - | ``` | |
| 640 | - | {: .-setup} | |
| 641 | - | ||
| 642 | - | ### Arguments | |
| 643 | - | ||
| 644 | - | | `<buffer>` | only in current buffer | | |
| 645 | - | | `<silent>` | no echo | | |
| 646 | - | | `<nowait>` | | | |
| 647 | - | ||
| 648 | - | Syntax | |
| 649 | - | ------ | |
| 650 | - | ||
| 651 | - | ### Highlights | |
| 652 | - | ||
| 653 | - | ```vim | |
| 654 | - | hi Comment | |
| 655 | - | term=bold,underline | |
| 656 | - | gui=bold | |
| 657 | - | ctermfg=4 | |
| 658 | - | guifg=#80a0ff | |
| 659 | - | ``` | |
| 660 | - | ||
| 661 | - | ### Filetype detection | |
| 662 | - | ||
| 663 | - | ```vim | |
| 664 | - | augroup filetypedetect | |
| 665 | - | au! BufNewFile,BufRead *.json setf javascript | |
| 666 | - | augroup END | |
| 667 | - | ||
| 668 | - | au Filetype markdown setlocal spell | |
| 669 | - | ``` | |
| 670 | - | ||
| 671 | - | ### Conceal | |
| 672 | - | ||
| 673 | - | ```vim | |
| 674 | - | set conceallevel=2 | |
| 675 | - | syn match newLine "<br>" conceal cchar=} | |
| 676 | - | hi newLine guifg=green | |
| 677 | - | ``` | |
| 678 | - | ||
| 679 | - | ### Region conceal | |
| 680 | - | ||
| 681 | - | ```vim | |
| 682 | - | syn region inBold concealends matchgroup=bTag start="<b>" end="</b>" | |
| 683 | - | hi inBold gui=bold | |
| 684 | - | hi bTag guifg=blue | |
| 685 | - | ``` | |
| 686 | - | ||
| 687 | - | ### Syntax | |
| 688 | - | ||
| 689 | - | ```vim | |
| 690 | - | syn match :name ":regex" :flags | |
| 691 | - | ||
| 692 | - | syn region Comment start="/\*" end="\*/" | |
| 693 | - | syn region String start=+"+ end=+"+ skip=+\\"+ | |
| 694 | - | ||
| 695 | - | syn cluster :name contains=:n1,:n2,:n3... | |
| 696 | - | ||
| 697 | - | flags: | |
| 698 | - | keepend | |
| 699 | - | oneline | |
| 700 | - | nextgroup= | |
| 701 | - | contains= | |
| 702 | - | contained | |
| 703 | - | ||
| 704 | - | hi def link markdownH1 htmlH1 | |
| 705 | - | ``` | |
| 706 | - | ||
| 707 | - | ### Include guards | |
| 708 | - | ||
| 709 | - | ```vim | |
| 710 | - | if exists('g:loaded_myplugin') | |
| 711 | - | finish | |
| 712 | - | endif | |
| 713 | - | ||
| 714 | - | " ... | |
| 715 | - | ||
| 716 | - | let g:loaded_myplugin = 1 | |
| 717 | - | ``` | |
| 718 | - | ||
| 719 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 720 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,365 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Vue.js | |
| 3 | - | category: JavaScript | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | updated: 2019-12-26 | |
| 6 | - | weight: -10 | |
| 7 | - | intro: | | |
| 8 | - | [Vue.js](https://vuejs.org/) is an open-source Model–view–viewmodel JavaScript framework for building user interfaces and single-page applications. | |
| 9 | - | --- | |
| 10 | - | ||
| 11 | - | {%raw%} | |
| 12 | - | ||
| 13 | - | Expressions | |
| 14 | - | ---------- | |
| 15 | - | {: .-three-column} | |
| 16 | - | ||
| 17 | - | ### Expressions | |
| 18 | - | ||
| 19 | - | ```html | |
| 20 | - | <div id="app"> | |
| 21 | - | <p>I have a {{ product }}</p> | |
| 22 | - | <p>{{ product + 's' }}</p> | |
| 23 | - | <p>{{ isWorking ? 'YES' : 'NO' }}</p> | |
| 24 | - | <p>{{ product.getSalePrice() }}</p> | |
| 25 | - | </div> | |
| 26 | - | ``` | |
| 27 | - | ||
| 28 | - | See: [Delimiters](https://vuejs.org/v2/api/#delimiters) | |
| 29 | - | ||
| 30 | - | ### Binding | |
| 31 | - | ||
| 32 | - | ```html | |
| 33 | - | <a v-bind:href="url">...</a> | |
| 34 | - | ``` | |
| 35 | - | ||
| 36 | - | #### Shorthand syntax | |
| 37 | - | ```html | |
| 38 | - | <a :href="url">...</a> | |
| 39 | - | ``` | |
| 40 | - | {: data-line="1"} | |
| 41 | - | ||
| 42 | - | #### True or false will add or remove attribute | |
| 43 | - | ```html | |
| 44 | - | <button :disabled="isButtonDisabled">... | |
| 45 | - | ``` | |
| 46 | - | ||
| 47 | - | #### If isActive is truthy, the class ‘active’ will appear | |
| 48 | - | ```html | |
| 49 | - | <div :class="{ active: isActive }">... | |
| 50 | - | ``` | |
| 51 | - | ||
| 52 | - | #### Style color set to value of activeColor | |
| 53 | - | ```html | |
| 54 | - | <div :style="{ color: activeColor }"> | |
| 55 | - | ``` | |
| 56 | - | ||
| 57 | - | See: [v-bind](https://vuejs.org/v2/api/#v-bind) | |
| 58 | - | ||
| 59 | - | ### Directives | |
| 60 | - | ||
| 61 | - | #### Element inserted/removed based on truthiness | |
| 62 | - | ```html | |
| 63 | - | <p v-if="inStock">{{ product }}</p> | |
| 64 | - | ``` | |
| 65 | - | ```html | |
| 66 | - | <p v-else-if="onSale">...</p> | |
| 67 | - | <p v-else>...</p> | |
| 68 | - | ``` | |
| 69 | - | ||
| 70 | - | #### Toggles the display: none CSS property | |
| 71 | - | ```html | |
| 72 | - | <p v-show="showProductDetails">...</p> | |
| 73 | - | ``` | |
| 74 | - | ||
| 75 | - | #### Two-way data binding | |
| 76 | - | ```html | |
| 77 | - | <input v-model="firstName" > | |
| 78 | - | ``` | |
| 79 | - | ||
| 80 | - | | Method | Description | | |
| 81 | - | | --- | --- | | |
| 82 | - | | `v-model.lazy="..."` | Syncs input after change event | | |
| 83 | - | | `v-model.number="..."` | Always returns a number | | |
| 84 | - | | `v-model.trim="..."` | Strips whitespace | | |
| 85 | - | ||
| 86 | - | See: [Directives](https://vuejs.org/v2/api/#Directives) | |
| 87 | - | ||
| 88 | - | ### Actions/Events | |
| 89 | - | ||
| 90 | - | #### Calls addToCart method on component | |
| 91 | - | ```html | |
| 92 | - | <button v-on:click="addToCart">... | |
| 93 | - | ``` | |
| 94 | - | ||
| 95 | - | #### Shorthand syntax | |
| 96 | - | ```html | |
| 97 | - | <button @click="addToCart">... | |
| 98 | - | ``` | |
| 99 | - | {: data-line="1"} | |
| 100 | - | ||
| 101 | - | #### Arguments can be passed | |
| 102 | - | ```html | |
| 103 | - | <button @click="addToCart(product)">... | |
| 104 | - | ``` | |
| 105 | - | ||
| 106 | - | #### To prevent default behavior (e.g. page reload) | |
| 107 | - | ```html | |
| 108 | - | <form @submit.prevent="addProduct">... | |
| 109 | - | ``` | |
| 110 | - | ||
| 111 | - | #### Only trigger once | |
| 112 | - | ```html | |
| 113 | - | <img @mouseover.once="showImage">... | |
| 114 | - | ``` | |
| 115 | - | ||
| 116 | - | | Method | Description | | |
| 117 | - | | --- | --- | | |
| 118 | - | | `.stop` | Stop all event propagation | | |
| 119 | - | | `.self ` | Only trigger if event.target is element itself | | |
| 120 | - | ||
| 121 | - | #### Keyboard entry example | |
| 122 | - | ```html | |
| 123 | - | <input @keyup.enter="submit"> | |
| 124 | - | ``` | |
| 125 | - | ||
| 126 | - | #### Call onCopy when control-c is pressed | |
| 127 | - | ```html | |
| 128 | - | <input @keyup.ctrl.c="onCopy"> | |
| 129 | - | ``` | |
| 130 | - | ||
| 131 | - | See: [Events](https://vuejs.org/v2/guide/events.html) | |
| 132 | - | ||
| 133 | - | ### List rendering | |
| 134 | - | ||
| 135 | - | #### The `:key` is always recommended | |
| 136 | - | ```html | |
| 137 | - | <li v-for="item in items" | |
| 138 | - | :key="item.id"> | |
| 139 | - | {{ item }} | |
| 140 | - | </li> | |
| 141 | - | ``` | |
| 142 | - | {: data-line="2"} | |
| 143 | - | ||
| 144 | - | #### To access the position in the array | |
| 145 | - | ```html | |
| 146 | - | <li v-for="(item, index) in items">... | |
| 147 | - | ``` | |
| 148 | - | ||
| 149 | - | #### To iterate through objects | |
| 150 | - | ```html | |
| 151 | - | <li v-for="(value, key) in object">... | |
| 152 | - | ``` | |
| 153 | - | ||
| 154 | - | #### Using `v-for` with a component | |
| 155 | - | ```html | |
| 156 | - | <cart-product v-for="item in products" | |
| 157 | - | :product="item" | |
| 158 | - | :key="item.id"> | |
| 159 | - | ``` | |
| 160 | - | ||
| 161 | - | See: [List Rendering](https://vuejs.org/v2/guide/list.html) | |
| 162 | - | ||
| 163 | - | ||
| 164 | - | Component | |
| 165 | - | -------- | |
| 166 | - | ||
| 167 | - | ### Component anatomy | |
| 168 | - | ||
| 169 | - | ```js | |
| 170 | - | Vue.component('my-component', { | |
| 171 | - | components: { | |
| 172 | - | // Components that can be used in the template | |
| 173 | - | ProductComponent, | |
| 174 | - | ReviewComponent | |
| 175 | - | }, | |
| 176 | - | props: { | |
| 177 | - | // The parameters the component accepts | |
| 178 | - | message: String, | |
| 179 | - | product: Object, | |
| 180 | - | email: { | |
| 181 | - | type: String, | |
| 182 | - | required: true, | |
| 183 | - | default: "none" | |
| 184 | - | validator: function (value) { | |
| 185 | - | // Should return true if value is valid | |
| 186 | - | } | |
| 187 | - | } | |
| 188 | - | }, | |
| 189 | - | data: function() { | |
| 190 | - | // `data` must be a function | |
| 191 | - | return { | |
| 192 | - | firstName: 'Vue', | |
| 193 | - | lastName: 'Mastery' | |
| 194 | - | } | |
| 195 | - | }, | |
| 196 | - | computed: { | |
| 197 | - | // Return cached values until dependencies change | |
| 198 | - | fullName: function () { | |
| 199 | - | return this.firstName + ' ' + this.lastName | |
| 200 | - | } | |
| 201 | - | }, | |
| 202 | - | watch: { | |
| 203 | - | // Called when firstName changes value | |
| 204 | - | firstName: function (value, oldValue) { ... } | |
| 205 | - | }, | |
| 206 | - | methods: { ... }, | |
| 207 | - | template: '<span>{{ message }}</span>', | |
| 208 | - | // Can also use backticks in `template` for multi-line | |
| 209 | - | }) | |
| 210 | - | ``` | |
| 211 | - | {: data-line="3, 8, 16, 21, 28, 34, 39"} | |
| 212 | - | ||
| 213 | - | See: [Components Basics](https://vuejs.org/v2/guide/components.html) | |
| 214 | - | ||
| 215 | - | ### Lifecycle hooks | |
| 216 | - | ||
| 217 | - | | Method | Description | | |
| 218 | - | | --- | --- | | |
| 219 | - | | `beforeCreate` | After the instance has been initialized [#](https://vuejs.org/v2/api/#beforeCreate) | | |
| 220 | - | | `created` | After the instance is created [#](https://vuejs.org/v2/api/#created) | | |
| 221 | - | | `beforeMount` | Before the first render [#](https://vuejs.org/v2/api/#beforeMount) | | |
| 222 | - | | `mounted` | After the instance has been mounted [#](https://vuejs.org/v2/api/#mounted) | | |
| 223 | - | | `beforeUpdate` | When data changes, before the DOM is patched [#](https://vuejs.org/v2/api/#beforeUpdate) | | |
| 224 | - | | `updated` | After a data change [#](https://vuejs.org/v2/api/#updated) | | |
| 225 | - | | `beforeDestroy` | Before the instance is destroyed [#](https://vuejs.org/v2/api/#beforeDestroy) | | |
| 226 | - | | `destroyed` | After a Vue instance has been destroyed [#](https://vuejs.org/v2/api/#destroyed) | | |
| 227 | - | ||
| 228 | - | See: [Lifecycle Hooks](https://vuejs.org/v2/api/#Options-Lifecycle-Hooks) | |
| 229 | - | ||
| 230 | - | ### Custom events | |
| 231 | - | ||
| 232 | - | #### Set listener on component, within its parent | |
| 233 | - | ```html | |
| 234 | - | <button-counter v-on:incrementBy="incWithVal"> | |
| 235 | - | ``` | |
| 236 | - | ||
| 237 | - | #### Inside parent component | |
| 238 | - | ```js | |
| 239 | - | methods: { | |
| 240 | - | incWithVal: function (toAdd) { ... } | |
| 241 | - | } | |
| 242 | - | ``` | |
| 243 | - | ||
| 244 | - | #### Inside button-counter template | |
| 245 | - | ```js | |
| 246 | - | this.$emit( | |
| 247 | - | 'incrementBy', // Custom event name | |
| 248 | - | 5 // Data sent up to parent | |
| 249 | - | ) | |
| 250 | - | ``` | |
| 251 | - | ||
| 252 | - | Use props to pass data into child components, | |
| 253 | - | custom events to pass data to parent elements. | |
| 254 | - | ||
| 255 | - | See: [Custom Events](https://vuejs.org/v2/guide/components-custom-events.html) | |
| 256 | - | ||
| 257 | - | Single file components | |
| 258 | - | -------- | |
| 259 | - | ||
| 260 | - | ### Single file | |
| 261 | - | ```html | |
| 262 | - | <template> | |
| 263 | - | <p>{{ greeting }} World!</p> | |
| 264 | - | </template> | |
| 265 | - | ||
| 266 | - | <script> | |
| 267 | - | module.exports = { | |
| 268 | - | data: function () { | |
| 269 | - | return { | |
| 270 | - | greeting: 'Hello' | |
| 271 | - | } | |
| 272 | - | } | |
| 273 | - | } | |
| 274 | - | </script> | |
| 275 | - | ||
| 276 | - | <style scoped> | |
| 277 | - | p { | |
| 278 | - | font-size: 2em; | |
| 279 | - | text-align: center; | |
| 280 | - | } | |
| 281 | - | </style> | |
| 282 | - | ``` | |
| 283 | - | ||
| 284 | - | See: [Single File Components](https://vuejs.org/v2/guide/single-file-components.html) | |
| 285 | - | ||
| 286 | - | ### Separation | |
| 287 | - | ```html | |
| 288 | - | <template> | |
| 289 | - | <div>This will be pre-compiled</div> | |
| 290 | - | </template> | |
| 291 | - | <script src="./my-component.js"></script> | |
| 292 | - | <style src="./my-component.css"></style> | |
| 293 | - | ``` | |
| 294 | - | ||
| 295 | - | See: [What About Separation of Concerns?](https://vuejs.org/v2/guide/single-file-components.html#What-About-Separation-of-Concerns) | |
| 296 | - | ||
| 297 | - | Slots | |
| 298 | - | -------- | |
| 299 | - | ||
| 300 | - | ### Using a single slot | |
| 301 | - | ||
| 302 | - | #### Component template | |
| 303 | - | ```html | |
| 304 | - | <div> | |
| 305 | - | <h2>I'm a title</h2> | |
| 306 | - | <slot> | |
| 307 | - | Only displayed if no slot content | |
| 308 | - | </slot> | |
| 309 | - | </div> | |
| 310 | - | ``` | |
| 311 | - | {: data-line="3,4,5"} | |
| 312 | - | ||
| 313 | - | #### Use of component with data for slot | |
| 314 | - | ```html | |
| 315 | - | <my-component> | |
| 316 | - | <p>This will go in the slot</p> | |
| 317 | - | </my-component> | |
| 318 | - | ``` | |
| 319 | - | {: data-line="2"} | |
| 320 | - | ||
| 321 | - | See: [Slots](https://vuejs.org/v2/guide/components-slots.html) | |
| 322 | - | ||
| 323 | - | ### Multiple slots | |
| 324 | - | ||
| 325 | - | #### Component template | |
| 326 | - | ```html | |
| 327 | - | <div class="container"> | |
| 328 | - | <header> | |
| 329 | - | <slot name="header"></slot> | |
| 330 | - | </header> | |
| 331 | - | <main> | |
| 332 | - | <slot>Default content</slot> | |
| 333 | - | </main> | |
| 334 | - | <footer> | |
| 335 | - | <slot name="footer"></slot> | |
| 336 | - | </footer> | |
| 337 | - | </div> | |
| 338 | - | ``` | |
| 339 | - | {: data-line="3,6,9"} | |
| 340 | - | ||
| 341 | - | #### Use of component with data for slots | |
| 342 | - | ```html | |
| 343 | - | <app-layout> | |
| 344 | - | <h1 slot="header">Page title</h1> | |
| 345 | - | <p>the main content.</p> | |
| 346 | - | <p slot="footer">Contact info</p> | |
| 347 | - | </app-layout> | |
| 348 | - | ``` | |
| 349 | - | {: data-line="2,3,4"} | |
| 350 | - | ||
| 351 | - | See: [Slots](https://vuejs.org/v2/guide/components-slots.html) | |
| 352 | - | ||
| 353 | - | Also see | |
| 354 | - | -------- | |
| 355 | - | ||
| 356 | - | * [Vue CLI](https://cli.vuejs.org/) _(cli.vuejs.org)_ | |
| 357 | - | * [Vue Router](https://router.vuejs.org/) _(router.vuejs.org)_ | |
| 358 | - | * [Vue DevTools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=en) _(chrome.google.com)_ | |
| 359 | - | * [Nuxt.js](https://nuxtjs.org/) _(nuxtjs.org)_ | |
| 360 | - | * [Vue.js v1.0.28 cheatsheet](vue@1.0.28/) _Legacy version_ | |
| 361 | - | ||
| 362 | - | {%endraw%} | |
| 363 | - | ||
| 364 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 365 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,40 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: Yaml | |
| 3 | - | category: Markup | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | prism_languages: [yaml] | |
| 6 | - | --- | |
| 7 | - | ||
| 8 | - | ### Multiline strings | |
| 9 | - | ||
| 10 | - | ```yaml | |
| 11 | - | Multiline: | | |
| 12 | - | hello | |
| 13 | - | world | |
| 14 | - | ``` | |
| 15 | - | ||
| 16 | - | ### Inheritance | |
| 17 | - | ||
| 18 | - | ```yaml | |
| 19 | - | parent: &defaults | |
| 20 | - | a: 2 | |
| 21 | - | b: 3 | |
| 22 | - | ||
| 23 | - | child: | |
| 24 | - | <<: *defaults | |
| 25 | - | b: 4 | |
| 26 | - | ``` | |
| 27 | - | ||
| 28 | - | ### Reference content | |
| 29 | - | ||
| 30 | - | ```yaml | |
| 31 | - | values: &ref | |
| 32 | - | - These values | |
| 33 | - | - will be reused below | |
| 34 | - | ||
| 35 | - | other_values: | |
| 36 | - | <<: *ref | |
| 37 | - | ``` | |
| 38 | - | ||
| 39 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 40 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1,45 +0,0 @@ | |
| 1 | - | --- | |
| 2 | - | title: zsh | |
| 3 | - | category: CLI | |
| 4 | - | layout: 2017/sheet | |
| 5 | - | --- | |
| 6 | - | ||
| 7 | - | ### Expressions | |
| 8 | - | ||
| 9 | - | | Expression | Example | Description | |
| 10 | - | | --- | --- | --- | |
| 11 | - | | `!!` | `sudo !!` | Last command (`sudo !!`) | |
| 12 | - | | --- | --- | --- | |
| 13 | - | | `!*` | `vim !*` | Last command's parameters (`vim !*`) | |
| 14 | - | | `!^` | | Last command's first parameter | |
| 15 | - | | `!$` | | Last command's last parameter | |
| 16 | - | | --- | --- | --- | |
| 17 | - | | `!?ls` `<tab>` | `sudo !?mv` `<tab>` | Command and params of last `ls` command | |
| 18 | - | | `!?ls?:*` `<tab>` | | Params of last `ls` command | |
| 19 | - | | --- | --- | --- | |
| 20 | - | | `*(m0)` | `rm *(m0)` | Last modified today | |
| 21 | - | | `*(m-4)` | | Last modified <4 days ago | |
| 22 | - | {: .-headers} | |
| 23 | - | ||
| 24 | - | ### Change default shell | |
| 25 | - | ||
| 26 | - | ```bash | |
| 27 | - | chsh -s `which zsh` | |
| 28 | - | ``` | |
| 29 | - | ||
| 30 | - | ### Process Substitution | |
| 31 | - | ||
| 32 | - | | Expression | Example | Description | |
| 33 | - | | --- | --- | --- | |
| 34 | - | | `<(COMMAND)` | `grep "needle" <(curl "https://haystack.io")` | Replace argument with _named pipe/FIFO_ (read-only) with command output | |
| 35 | - | | `=(COMMAND)` | `vim =(curl "https://haystack.io")` | Replace argument with _file_ (writable) containing command output | |
| 36 | - | {: .-headers} | |
| 37 | - | ||
| 38 | - | ### Also see | |
| 39 | - | ||
| 40 | - | - [Bash cheatsheet](./bash) | |
| 41 | - | ||
| 42 | - | Zsh is mostly compatible with Bash, so most everything in Bash's cheatsheet also applies. | |
| 43 | - | ||
| 44 | - | https://devhints.io/ cheatsheets - Copyright (c) 2021 Rico Sta. Cruz and contributors - MIT license | |
| 45 | - | micro-cheat plugin Copyright 2022 Tero Karvinen https://TeroKarvinen.com/micro - MIT license |
| ... | ... | @@ -1 +0,0 @@ | |
| 1 | - | 2024/12/29 01:44:02 Micro started |
+0,
-40
| ... | ... | @@ -1,40 +0,0 @@ | |
| 1 | - | -- micro-cheat copyright 2022 Tero Karvinen https://TeroKarvinen.com | |
| 2 | - | ||
| 3 | - | -- Cheatsheets are copyrighted by their original authors | |
| 4 | - | ||
| 5 | - | -- Cheatsheets from Devhints.io are copyright 2021 | |
| 6 | - | -- Rico Sta. Cruz and contributors, received under the MIT license | |
| 7 | - | ||
| 8 | - | local micro = import("micro") | |
| 9 | - | local config = import("micro/config") | |
| 10 | - | ||
| 11 | - | local cheatdir = config.ConfigDir.."/plug/cheat/cheatsheets/" | |
| 12 | - | ||
| 13 | - | function init() | |
| 14 | - | -- runs once when micro starts | |
| 15 | - | config.MakeCommand("cheat", cheatCommand, config.NoComplete) | |
| 16 | - | config.TryBindKey("F1", "command:cheat", false) | |
| 17 | - | end | |
| 18 | - | ||
| 19 | - | function cheatCommand(bp) | |
| 20 | - | local filename = bp.Buf:GetName() | |
| 21 | - | local filetype = bp.Buf:FileType() | |
| 22 | - | ||
| 23 | - | if "Vagrantfile" == filename or "Dockerfile" == filename then | |
| 24 | - | filetype = filename:lower() | |
| 25 | - | micro.InfoBar():Message("Cheatsheet by file name: "..filename) | |
| 26 | - | elseif string.find(filename, "\.org$") then -- not detected by micro | |
| 27 | - | filetype = "org" | |
| 28 | - | micro.InfoBar():Message("Cheatsheet by file suffix: "..filename) | |
| 29 | - | elseif "unknown" ~= filetype then | |
| 30 | - | -- micro hopefully detected the filetype, the typical case | |
| 31 | - | micro.InfoBar():Message("Cheatsheet by file type: "..filetype) | |
| 32 | - | else | |
| 33 | - | micro.InfoBar():Message("Cheatsheet not found for type '"..filetype.."', filename '"..filename.."'") | |
| 34 | - | return | |
| 35 | - | end | |
| 36 | - | ||
| 37 | - | local cmd = "tab " .. cheatdir .. filetype .. ".md" | |
| 38 | - | bp:HandleCommand(cmd) | |
| 39 | - | ||
| 40 | - | end |
+0,
-35
| ... | ... | @@ -1,35 +0,0 @@ | |
| 1 | - | [{ | |
| 2 | - | "Name": "cheat", | |
| 3 | - | "Description": "F1 for cheatsheet related to the type of file you're editing: Lua, Go, Python...", | |
| 4 | - | "Website": "https://terokarvinen.com/micro", | |
| 5 | - | "Tags": ["cheatsheet", "help", "docs", "Lua", "Go", "Python", "reference"], | |
| 6 | - | "Versions": [ | |
| 7 | - | { | |
| 8 | - | "Version": "0.0.4", | |
| 9 | - | "Url": "https://github.com/terokarvinen/micro-cheat/archive/v0.0.4.zip", | |
| 10 | - | "Require": { | |
| 11 | - | "micro": ">=2.0.0" | |
| 12 | - | } | |
| 13 | - | }, | |
| 14 | - | { | |
| 15 | - | "Version": "0.0.3", | |
| 16 | - | "Url": "https://github.com/terokarvinen/micro-cheat/archive/v0.0.3.zip", | |
| 17 | - | "Require": { | |
| 18 | - | "micro": ">=2.0.0" | |
| 19 | - | } | |
| 20 | - | }, | |
| 21 | - | { | |
| 22 | - | "Version": "0.0.2", | |
| 23 | - | "Url": "https://github.com/terokarvinen/micro-cheat/archive/v0.0.2.zip", | |
| 24 | - | "Require": { | |
| 25 | - | "micro": ">=2.0.0" | |
| 26 | - | } | |
| 27 | - | }, | |
| 28 | - | { | |
| 29 | - | "Version": "0.0.1", | |
| 30 | - | "Require": { | |
| 31 | - | "micro": ">=2.0.0" | |
| 32 | - | } | |
| 33 | - | } | |
| 34 | - | ] | |
| 35 | - | }] |
| ... | ... | @@ -1,6 +0,0 @@ | |
| 1 | - | Version 1.2.1 | |
| 2 | - | * Fixed utf8 character count | |
| 3 | - | ||
| 4 | - | Version 1.2.0 | |
| 5 | - | + Now counts lines | |
| 6 | - | + Added Support for counting lines, words and characters in selection |
+0,
-21
| ... | ... | @@ -1,21 +0,0 @@ | |
| 1 | - | MIT License | |
| 2 | - | ||
| 3 | - | Copyright (c) 2020 bananaapple | |
| 4 | - | ||
| 5 | - | Permission is hereby granted, free of charge, to any person obtaining a copy | |
| 6 | - | of this software and associated documentation files (the "Software"), to deal | |
| 7 | - | in the Software without restriction, including without limitation the rights | |
| 8 | - | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| 9 | - | copies of the Software, and to permit persons to whom the Software is | |
| 10 | - | furnished to do so, subject to the following conditions: | |
| 11 | - | ||
| 12 | - | The above copyright notice and this permission notice shall be included in all | |
| 13 | - | copies or substantial portions of the Software. | |
| 14 | - | ||
| 15 | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| 16 | - | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| 17 | - | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| 18 | - | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| 19 | - | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| 20 | - | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
| 21 | - | SOFTWARE. |
+0,
-4
| ... | ... | @@ -1,4 +0,0 @@ | |
| 1 | - | # Micro Word Count Plugin | |
| 2 | - | ||
| 3 | - | Word, character and line counter for micro editor. | |
| 4 | - | (forked from https://github.com/adamnpeace/micro-wc-plugin) |
+0,
-25
| ... | ... | @@ -1,25 +0,0 @@ | |
| 1 | - | # WordCount (wc) Plugin # | |
| 2 | - | ||
| 3 | - | The wc plugin provides the user with the ability to count either | |
| 4 | - | characters or strings in any text being edited with micro. | |
| 5 | - | ||
| 6 | - | A word is defined as a string of characters delimited by white | |
| 7 | - | space characters. White space characters are the set of characters | |
| 8 | - | for which the iswspace(3) function returns true. | |
| 9 | - | ||
| 10 | - | A line is defined as a string of characters delimited by \n | |
| 11 | - | characters, or by the beginning or end of the file. \r\n line | |
| 12 | - | endings will be counted correctly as well, since there is only | |
| 13 | - | one \n per \r\n. | |
| 14 | - | ||
| 15 | - | Character count includes white space and newline characters. | |
| 16 | - | ||
| 17 | - | To initiate the function, you can either: | |
| 18 | - | ||
| 19 | - | Press "F5" | |
| 20 | - | ||
| 21 | - | Or run: | |
| 22 | - | ||
| 23 | - | ``` | |
| 24 | - | > wc | |
| 25 | - | ``` |
+0,
-10
| ... | ... | @@ -1,10 +0,0 @@ | |
| 1 | - | { | |
| 2 | - | "name": "wc", | |
| 3 | - | "description": "Word count plugin", | |
| 4 | - | "website": "", | |
| 5 | - | "install": "", | |
| 6 | - | "version": "1.2.1", | |
| 7 | - | "require": [ | |
| 8 | - | "micro >= 2.0.0" | |
| 9 | - | ] | |
| 10 | - | } |
+0,
-22
| ... | ... | @@ -1,22 +0,0 @@ | |
| 1 | - | [{ | |
| 2 | - | "Name": "wc", | |
| 3 | - | "Description": "Plugin to count words/characters in micro", | |
| 4 | - | "Tags": ["wc", "word", "character", "count"], | |
| 5 | - | "Website": "https://github.com/adamnpeace/micro-wc-plugin", | |
| 6 | - | "Versions": [ | |
| 7 | - | { | |
| 8 | - | "Version": "1.1.0", | |
| 9 | - | "Url": "https://github.com/adamnpeace/micro-wc-plugin/archive/v1.1.0.zip", | |
| 10 | - | "Require": { | |
| 11 | - | "micro": ">=2.0.0-1" | |
| 12 | - | } | |
| 13 | - | }, | |
| 14 | - | { | |
| 15 | - | "Version": "1.0.1", | |
| 16 | - | "Url": "https://github.com/adamnpeace/micro-wc-plugin/archive/v1.0.1.zip", | |
| 17 | - | "Require": { | |
| 18 | - | "micro": ">=1.1.0" | |
| 19 | - | } | |
| 20 | - | } | |
| 21 | - | ] | |
| 22 | - | }] |
+0,
-37
| ... | ... | @@ -1,37 +0,0 @@ | |
| 1 | - | VERSION = "1.2.1" | |
| 2 | - | ||
| 3 | - | local micro = import("micro") | |
| 4 | - | local config = import("micro/config") | |
| 5 | - | local util = import("micro/util") | |
| 6 | - | local utf8 = import("unicode/utf8") | |
| 7 | - | ||
| 8 | - | function init() | |
| 9 | - | config.MakeCommand("wc", wordCount, config.NoComplete) | |
| 10 | - | config.AddRuntimeFile("wc", config.RTHelp, "help/wc.md") | |
| 11 | - | config.TryBindKey("F5", "lua:wc.wordCount", false) | |
| 12 | - | end | |
| 13 | - | ||
| 14 | - | function wordCount(bp) | |
| 15 | - | -- Buffer of selection/whole document | |
| 16 | - | local buffer | |
| 17 | - | --Get active cursor (to get selection) | |
| 18 | - | local cursor = bp.Buf:GetActiveCursor() | |
| 19 | - | --If cursor exists and there is selection, convert selection byte[] to string | |
| 20 | - | if cursor and cursor:HasSelection() then | |
| 21 | - | buffer = util.String(cursor:GetSelection()) | |
| 22 | - | else | |
| 23 | - | --no selection, convert whole buffer byte[] to string | |
| 24 | - | buffer = util.String(bp.Buf:Bytes()) | |
| 25 | - | end | |
| 26 | - | --length of the buffer/selection (string), utf8 friendly | |
| 27 | - | charCount = utf8.RuneCountInString(buffer) | |
| 28 | - | --Get word/line count using gsub's number of substitutions | |
| 29 | - | -- number of substitutions, pattern: %S+ (more than one non-whitespace characters) | |
| 30 | - | local _ , wordCount = buffer:gsub("%S+","") | |
| 31 | - | -- number of substitutions, pattern: \n (number of newline characters) | |
| 32 | - | local _, lineCount = buffer:gsub("\n", "") | |
| 33 | - | --add one to line count (since we're counting separators not lines above) | |
| 34 | - | lineCount = lineCount + 1 | |
| 35 | - | --display the message | |
| 36 | - | micro.InfoBar():Message("Lines:" .. lineCount .. " Words:"..wordCount.." Characters:"..charCount) | |
| 37 | - | end |
+0,
-111
| ... | ... | @@ -1,111 +0,0 @@ | |
| 1 | - | [General] | |
| 2 | - | AskOnExit=false | |
| 3 | - | BoldIntense=true | |
| 4 | - | BookmarksFile=/home/kat/.config/qterminal.org/qterminal_bookmarks.xml | |
| 5 | - | BookmarksVisible=true | |
| 6 | - | Borderless=false | |
| 7 | - | ChangeWindowIcon=true | |
| 8 | - | ChangeWindowTitle=true | |
| 9 | - | CloseTabOnMiddleClick=true | |
| 10 | - | ConfirmMultilinePaste=true | |
| 11 | - | DisableBracketedPasteMode=false | |
| 12 | - | FixedTabWidth=true | |
| 13 | - | FixedTabWidthValue=500 | |
| 14 | - | HandleHistory= | |
| 15 | - | HideTabBarWithOneTab=false | |
| 16 | - | HistoryLimited=true | |
| 17 | - | HistoryLimitedTo=1000 | |
| 18 | - | KeyboardCursorShape=0 | |
| 19 | - | LastWindowMaximized=true | |
| 20 | - | MenuVisible=true | |
| 21 | - | MotionAfterPaste=2 | |
| 22 | - | NoMenubarAccel=true | |
| 23 | - | OpenNewTabRightToActiveTab=false | |
| 24 | - | PrefDialogSize=@Size(700 700) | |
| 25 | - | SavePosOnExit=true | |
| 26 | - | SaveSizeOnExit=true | |
| 27 | - | ScrollbarPosition=2 | |
| 28 | - | ShowCloseTabButton=true | |
| 29 | - | TabBarless=false | |
| 30 | - | TabsPosition=0 | |
| 31 | - | Term=xterm-256color | |
| 32 | - | TerminalBackgroundImage= | |
| 33 | - | TerminalBackgroundMode=0 | |
| 34 | - | TerminalMargin=0 | |
| 35 | - | TerminalTransparency=0 | |
| 36 | - | TerminalsPreset=0 | |
| 37 | - | TrimPastedTrailingNewlines=false | |
| 38 | - | UseBookmarks=false | |
| 39 | - | UseCWD=false | |
| 40 | - | UseFontBoxDrawingChars=false | |
| 41 | - | colorScheme=DarkPastels | |
| 42 | - | emulation=default | |
| 43 | - | enabledBidiSupport=true | |
| 44 | - | fontFamily=Ubuntu Mono | |
| 45 | - | fontSize=14 | |
| 46 | - | guiStyle= | |
| 47 | - | highlightCurrentTerminal=false | |
| 48 | - | showTerminalSizeHint=true | |
| 49 | - | version=0.17.0 | |
| 50 | - | ||
| 51 | - | [DropMode] | |
| 52 | - | Height=45 | |
| 53 | - | KeepOpen=false | |
| 54 | - | ShortCut=F12 | |
| 55 | - | ShowOnStart=true | |
| 56 | - | Width=70 | |
| 57 | - | ||
| 58 | - | [MainWindow] | |
| 59 | - | ApplicationTransparency=15 | |
| 60 | - | fixedSize=@Size(600 400) | |
| 61 | - | pos=@Point(0 32) | |
| 62 | - | size=@Size(1920 1020) | |
| 63 | - | state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0&\0\x42\0o\0o\0k\0m\0\x61\0r\0k\0s\0\x44\0o\0\x63\0k\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x9b\x1\0\0\x3\0\0\a\x80\0\0\x3\xdf\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) | |
| 64 | - | ||
| 65 | - | [Sessions] | |
| 66 | - | size=0 | |
| 67 | - | ||
| 68 | - | [Shortcuts] | |
| 69 | - | Add%20Tab=Ctrl+Shift+T | |
| 70 | - | Bottom%20Subterminal=Alt+Down | |
| 71 | - | Clear%20Active%20Terminal=Ctrl+Shift+X | |
| 72 | - | Close%20Tab=Ctrl+Shift+W | |
| 73 | - | Collapse%20Subterminal= | |
| 74 | - | Copy%20Selection=Ctrl+Shift+C | |
| 75 | - | Find=Ctrl+Shift+F | |
| 76 | - | Fullscreen=F11 | |
| 77 | - | Handle%20history= | |
| 78 | - | Hide%20Window%20Borders= | |
| 79 | - | Left%20Subterminal=Alt+Left | |
| 80 | - | Move%20Tab%20Left=Alt+Shift+Left|Ctrl+Shift+PgUp | |
| 81 | - | Move%20Tab%20Right=Alt+Shift+Right|Ctrl+Shift+PgDown | |
| 82 | - | New%20Window=Ctrl+Shift+N | |
| 83 | - | Next%20Tab=Ctrl+PgDown | |
| 84 | - | Next%20Tab%20in%20History=Ctrl+Shift+Tab | |
| 85 | - | Paste%20Clipboard=Ctrl+Shift+V | |
| 86 | - | Paste%20Selection=Shift+Ins | |
| 87 | - | Preferences...= | |
| 88 | - | Previous%20Tab=Ctrl+PgUp | |
| 89 | - | Previous%20Tab%20in%20History=Ctrl+Tab | |
| 90 | - | Quit= | |
| 91 | - | Rename%20Session=Alt+Shift+S | |
| 92 | - | Right%20Subterminal=Alt+Right | |
| 93 | - | Show%20Tab%20Bar= | |
| 94 | - | Split%20Terminal%20Horizontally= | |
| 95 | - | Split%20Terminal%20Vertically= | |
| 96 | - | Tab%201= | |
| 97 | - | Tab%2010= | |
| 98 | - | Tab%202= | |
| 99 | - | Tab%203= | |
| 100 | - | Tab%204= | |
| 101 | - | Tab%205= | |
| 102 | - | Tab%206= | |
| 103 | - | Tab%207= | |
| 104 | - | Tab%208= | |
| 105 | - | Tab%209= | |
| 106 | - | Toggle%20Bookmarks=Ctrl+Shift+B | |
| 107 | - | Toggle%20Menu=Ctrl+Shift+M | |
| 108 | - | Top%20Subterminal=Alt+Up | |
| 109 | - | Zoom%20in=Ctrl++ | |
| 110 | - | Zoom%20out=Ctrl+- | |
| 111 | - | Zoom%20reset=Ctrl+0 |
+0,
-25
| ... | ... | @@ -1,25 +0,0 @@ | |
| 1 | - | [Base] | |
| 2 | - | defDir=/media/kat/disk/Pictures/Screenshots | |
| 3 | - | defImgFormat=png | |
| 4 | - | defScreenshotType=Area | |
| 5 | - | includeCursor=false | |
| 6 | - | insDateTimeInFilename=false | |
| 7 | - | noDecorations=false | |
| 8 | - | templateDateTime=yyyy-MM-dd-hh-mm-ss | |
| 9 | - | ||
| 10 | - | [Display] | |
| 11 | - | lastSelection=@Rect(392 178 1096 588) | |
| 12 | - | zoomAroundMouse=false | |
| 13 | - | ||
| 14 | - | [GlobalShortcuts] | |
| 15 | - | ActiveWindow= | |
| 16 | - | AreaSelection= | |
| 17 | - | FullScreen= | |
| 18 | - | ||
| 19 | - | [LocalShortcuts] | |
| 20 | - | Close=Esc | |
| 21 | - | CopyScreen=Ctrl+C | |
| 22 | - | Help=F1 | |
| 23 | - | NewScreen=Ctrl+N | |
| 24 | - | Options=Ctrl+P | |
| 25 | - | SaveScreen=Ctrl+S |
+0,
-431
| ... | ... | @@ -1,431 +0,0 @@ | |
| 1 | - | [Analyzer] | |
| 2 | - | framerate=25 | |
| 3 | - | type=NyanCatAnalyzer | |
| 4 | - | ||
| 5 | - | [Appearance] | |
| 6 | - | background_image_do_not_cut=true | |
| 7 | - | background_image_keep_aspect_ratio=true | |
| 8 | - | background_image_max_size=0 | |
| 9 | - | background_image_position=5 | |
| 10 | - | background_image_stretch=false | |
| 11 | - | background_image_type=1 | |
| 12 | - | blur_radius=0 | |
| 13 | - | icon_size_configure_buttons=16 | |
| 14 | - | icon_size_left_panel_buttons=22 | |
| 15 | - | icon_size_play_control_buttons=32 | |
| 16 | - | icon_size_playlist_buttons=20 | |
| 17 | - | icon_size_tabbar_large_mode=40 | |
| 18 | - | icon_size_tabbar_small_mode=32 | |
| 19 | - | opacity_level=40 | |
| 20 | - | playlist_playing_song_color=@Variant(\0\0\0\x43\0\xff\xff\0\0\0\0\0\0\0\0) | |
| 21 | - | style=default | |
| 22 | - | system_icons=false | |
| 23 | - | tab_color=@Variant(\0\0\0\x43\x2\xff\xffOL\x87\x87\x92+\0\0) | |
| 24 | - | tab_gradient=true | |
| 25 | - | tab_system_color=true | |
| 26 | - | ||
| 27 | - | [Backend] | |
| 28 | - | AutoCrossfadeEnabled=false | |
| 29 | - | CrossfadeEnabled=false | |
| 30 | - | FadeoutDuration=2000 | |
| 31 | - | FadeoutEnabled=false | |
| 32 | - | FadeoutPauseDuration=250 | |
| 33 | - | FadeoutPauseEnabled=false | |
| 34 | - | NoCrossfadeSameAlbum=true | |
| 35 | - | alsaplugin=3 | |
| 36 | - | bs2b=false | |
| 37 | - | bufferduration=4000 | |
| 38 | - | bufferhighwatermark=0.99 | |
| 39 | - | bufferlowwatermark=0.33 | |
| 40 | - | channels=2 | |
| 41 | - | channels_enabled=false | |
| 42 | - | device=@Invalid() | |
| 43 | - | ebur128_loudness_normalization=false | |
| 44 | - | ebur128_target_level_lufs=-23 | |
| 45 | - | engine=gstreamer | |
| 46 | - | http2=false | |
| 47 | - | output=autoaudiosink | |
| 48 | - | rgcompression=true | |
| 49 | - | rgenabled=false | |
| 50 | - | rgfallbackgain=0 | |
| 51 | - | rgmode=0 | |
| 52 | - | rgpreamp=0 | |
| 53 | - | strict_ssl=false | |
| 54 | - | volume_control=true | |
| 55 | - | ||
| 56 | - | [Behaviour] | |
| 57 | - | doubleclick_addmode=1 | |
| 58 | - | doubleclick_playlist_addmode=1 | |
| 59 | - | doubleclick_playmode=1 | |
| 60 | - | keeprunning=false | |
| 61 | - | language= | |
| 62 | - | menu_playmode=1 | |
| 63 | - | menu_previousmode=1 | |
| 64 | - | playing_widget=true | |
| 65 | - | resumeplayback=false | |
| 66 | - | seek_step_sec=10 | |
| 67 | - | showtrayicon=true | |
| 68 | - | startupbehaviour=1 | |
| 69 | - | taskbar_progress=true | |
| 70 | - | trayicon_progress=false | |
| 71 | - | volume_increment=5 | |
| 72 | - | ||
| 73 | - | [Collection] | |
| 74 | - | auto_open=true | |
| 75 | - | cache_size=160 | |
| 76 | - | cache_size_unit=1 | |
| 77 | - | cover_art_patterns=front, cover | |
| 78 | - | delete_files=false | |
| 79 | - | disk_cache_enable=false | |
| 80 | - | disk_cache_size=360 | |
| 81 | - | disk_cache_size_unit=1 | |
| 82 | - | expire_unavailable_songs=60 | |
| 83 | - | group_by1=12 | |
| 84 | - | group_by2=3 | |
| 85 | - | group_by3=0 | |
| 86 | - | group_by_version=1 | |
| 87 | - | last_path=/media/kat/disk/Music/Not Mine | |
| 88 | - | mark_songs_unavailable=true | |
| 89 | - | monitor=true | |
| 90 | - | overwrite_playcount=false | |
| 91 | - | overwrite_rating=false | |
| 92 | - | pretty_covers=true | |
| 93 | - | save_playcounts=false | |
| 94 | - | save_ratings=false | |
| 95 | - | separate_albums_by_grouping=false | |
| 96 | - | show_dividers=true | |
| 97 | - | song_ebur128_loudness_analysis=false | |
| 98 | - | song_tracking=false | |
| 99 | - | sort_skips_articles=true | |
| 100 | - | startup_scan=true | |
| 101 | - | various_artists=true | |
| 102 | - | ||
| 103 | - | [Context] | |
| 104 | - | AlbumEnable=true | |
| 105 | - | SearchCoverEnable=true | |
| 106 | - | SearchLyricsEnable=true | |
| 107 | - | SongLyricsEnable=true | |
| 108 | - | SummaryFmt=%album% | |
| 109 | - | TechnicalDataEnable=false | |
| 110 | - | TitleFmt=%title% - %artist% | |
| 111 | - | font_headline=Sans Serif | |
| 112 | - | font_normal=Sans Serif | |
| 113 | - | font_size_headline=11 | |
| 114 | - | font_size_normal=9 | |
| 115 | - | ||
| 116 | - | [Covers] | |
| 117 | - | providers=Last.fm, MusicBrainz, Deezer, Musixmatch, OpenTidal, Tidal, Spotify, Qobuz | |
| 118 | - | save_filename=2 | |
| 119 | - | save_lowercase=true | |
| 120 | - | save_overwrite=false | |
| 121 | - | save_pattern=%albumartist-%album | |
| 122 | - | save_replace_spaces=true | |
| 123 | - | save_type=1 | |
| 124 | - | types=art_unset, art_manual, art_automatic, art_embedded | |
| 125 | - | ||
| 126 | - | [EditTagDialog] | |
| 127 | - | current_tab=1 | |
| 128 | - | geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x2\x1e\0\0\0i\0\0\x5N\0\0\x3\x8e\0\0\x2 \0\0\0\x87\0\0\x5L\0\0\x3\x8c\0\0\0\0\0\0\0\0\a\x80\0\0\x2 \0\0\0\x87\0\0\x5L\0\0\x3\x8c) | |
| 129 | - | ||
| 130 | - | [Equalizer] | |
| 131 | - | enable_stereo_balancer=false | |
| 132 | - | enabled=false | |
| 133 | - | presets\1\name=Classical | |
| 134 | - | presets\1\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xff\xff\xff\xd8\xff\xff\xff\xd8\xff\xff\xff\xd8\xff\xff\xff\xce) | |
| 135 | - | presets\10\name=Live | |
| 136 | - | presets\10\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\xff\xff\xff\xe7\0\0\0\0\0\0\0\x14\0\0\0\x19\0\0\0\x1e\0\0\0\x1e\0\0\0\x14\0\0\0\xf\0\0\0\xf\0\0\0\n) | |
| 137 | - | presets\11\name=Party | |
| 138 | - | presets\11\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0#\0\0\0#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0#\0\0\0#) | |
| 139 | - | presets\12\name=Pop | |
| 140 | - | presets\12\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\xff\xff\xff\xf6\0\0\0\x19\0\0\0#\0\0\0(\0\0\0\x19\xff\xff\xff\xfb\xff\xff\xff\xf1\xff\xff\xff\xf1\xff\xff\xff\xf6\xff\xff\xff\xf6) | |
| 141 | - | presets\13\name=Reggae | |
| 142 | - | presets\13\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\0\0\0\0\0\xff\xff\xff\xfb\xff\xff\xff\xe2\0\0\0\0\xff\xff\xff\xdd\xff\xff\xff\xdd\0\0\0\0\0\0\0\0\0\0\0\0) | |
| 143 | - | presets\14\name=Rock | |
| 144 | - | presets\14\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0(\0\0\0\x19\xff\xff\xff\xe2\xff\xff\xff\xd8\xff\xff\xff\xec\0\0\0\x14\0\0\0-\0\0\0\x37\0\0\0\x37\0\0\0\x37) | |
| 145 | - | presets\15\name=Ska | |
| 146 | - | presets\15\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\xff\xff\xff\xf1\xff\xff\xff\xe7\xff\xff\xff\xe7\xff\xff\xff\xfb\0\0\0\x14\0\0\0\x1e\0\0\0-\0\0\0\x32\0\0\0\x37\0\0\0\x32) | |
| 147 | - | presets\16\name=Soft | |
| 148 | - | presets\16\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x19\0\0\0\n\xff\xff\xff\xfb\xff\xff\xff\xf1\xff\xff\xff\xfb\0\0\0\x14\0\0\0-\0\0\0\x32\0\0\0\x37\0\0\0<) | |
| 149 | - | presets\17\name=Soft Rock | |
| 150 | - | presets\17\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x14\0\0\0\x14\0\0\0\n\xff\xff\xff\xfb\xff\xff\xff\xe7\xff\xff\xff\xe2\xff\xff\xff\xec\xff\xff\xff\xfb\0\0\0\xf\0\0\0-) | |
| 151 | - | presets\18\name=Techno | |
| 152 | - | presets\18\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0(\0\0\0\x1e\0\0\0\0\xff\xff\xff\xe2\xff\xff\xff\xe7\0\0\0\0\0\0\0(\0\0\0\x32\0\0\0\x32\0\0\0-) | |
| 153 | - | presets\19\name=Zero | |
| 154 | - | presets\19\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0) | |
| 155 | - | presets\2\name=Club | |
| 156 | - | presets\2\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x14\0\0\0\x1e\0\0\0\x1e\0\0\0\x1e\0\0\0\x14\0\0\0\0\0\0\0\0\0\0\0\0) | |
| 157 | - | presets\3\name=Custom | |
| 158 | - | presets\3\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0) | |
| 159 | - | presets\4\name=Dance | |
| 160 | - | presets\4\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x32\0\0\0#\0\0\0\n\0\0\0\0\0\0\0\0\xff\xff\xff\xe2\xff\xff\xff\xd8\xff\xff\xff\xd8\0\0\0\0\0\0\0\0) | |
| 161 | - | presets\5\name=Full Bass | |
| 162 | - | presets\5\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x46\0\0\0\x46\0\0\0\x46\0\0\0(\0\0\0\x14\xff\xff\xff\xd3\xff\xff\xff\xce\xff\xff\xff\xc9\xff\xff\xff\xc9\xff\xff\xff\xc9) | |
| 163 | - | presets\6\name=Full Bass + Treble | |
| 164 | - | presets\6\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0#\0\0\0\x1e\0\0\0\0\xff\xff\xff\xd8\xff\xff\xff\xe7\0\0\0\n\0\0\0-\0\0\0\x37\0\0\0<\0\0\0<) | |
| 165 | - | presets\7\name=Full Treble | |
| 166 | - | presets\7\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\xff\xff\xff\xce\xff\xff\xff\xce\xff\xff\xff\xce\xff\xff\xff\xe7\0\0\0\xf\0\0\0\x37\0\0\0P\0\0\0P\0\0\0P\0\0\0U) | |
| 167 | - | presets\8\name=Laptop/Headphones | |
| 168 | - | presets\8\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x19\0\0\0\x32\0\0\0\x19\xff\xff\xff\xec\0\0\0\0\xff\xff\xff\xe2\xff\xff\xff\xd8\xff\xff\xff\xd8\0\0\0\0\0\0\0\0) | |
| 169 | - | presets\9\name=Large Hall | |
| 170 | - | presets\9\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x32\0\0\0\x32\0\0\0\x1e\0\0\0\x1e\0\0\0\0\xff\xff\xff\xe7\xff\xff\xff\xe7\xff\xff\xff\xe7\0\0\0\0\0\0\0\0) | |
| 171 | - | presets\size=19 | |
| 172 | - | selected_preset=Custom | |
| 173 | - | stereo_balance=0 | |
| 174 | - | ||
| 175 | - | [GlobalShortcuts] | |
| 176 | - | dec_volume= | |
| 177 | - | inc_volume= | |
| 178 | - | love= | |
| 179 | - | mute= | |
| 180 | - | next_track=Media Next | |
| 181 | - | pause= | |
| 182 | - | play= | |
| 183 | - | play_pause=Media Play | |
| 184 | - | prev_track=Media Previous | |
| 185 | - | repeat_mode= | |
| 186 | - | seek_backward= | |
| 187 | - | seek_forward= | |
| 188 | - | show_hide= | |
| 189 | - | show_osd= | |
| 190 | - | shuffle_mode= | |
| 191 | - | stop=Media Stop | |
| 192 | - | stop_after= | |
| 193 | - | toggle_pretty_osd= | |
| 194 | - | toggle_scrobbling= | |
| 195 | - | use_gnome=false | |
| 196 | - | use_kde=false | |
| 197 | - | use_mate=false | |
| 198 | - | use_x11=false | |
| 199 | - | ||
| 200 | - | [LastFM] | |
| 201 | - | enabled=true | |
| 202 | - | session_key=py5Cpj5PVXmR3mPxkaliet9HdIq4ufq0 | |
| 203 | - | subscriber=false | |
| 204 | - | username=springpool | |
| 205 | - | ||
| 206 | - | [LibreFM] | |
| 207 | - | enabled=false | |
| 208 | - | ||
| 209 | - | [ListenBrainz] | |
| 210 | - | enabled=false | |
| 211 | - | user_token= | |
| 212 | - | ||
| 213 | - | [Lyrics] | |
| 214 | - | providers=Genius, Lyrics.ovh, LoloLyrics, Musixmatch, songlyrics.com, azlyrics.com, elyrics.net, letras.mus.br | |
| 215 | - | ||
| 216 | - | [MainWindow] | |
| 217 | - | current_tab=2 | |
| 218 | - | do_not_show_sponsor_message=true | |
| 219 | - | file_path=/home/kat | |
| 220 | - | geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0 \0\0\a\x7f\0\0\x4\x37\0\0\0\0\0\0\0\x34\0\0\x4j\0\0\x2\xe0\0\0\0\0\x2\0\0\0\a\x80\0\0\0\0\0\0\0<\0\0\a\x7f\0\0\x4\x37) | |
| 221 | - | hidden=false | |
| 222 | - | maximized=true | |
| 223 | - | minimized=false | |
| 224 | - | search_for_cover_auto=true | |
| 225 | - | show_sidebar=true | |
| 226 | - | splitter_state=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\x1Y\0\0\x6#\0\xff\xff\xff\xff\x1\0\0\0\x1\0) | |
| 227 | - | tab_collection=1 | |
| 228 | - | tab_context=0 | |
| 229 | - | tab_devices=7 | |
| 230 | - | tab_files=5 | |
| 231 | - | tab_mode=1 | |
| 232 | - | tab_playlists=3 | |
| 233 | - | tab_queue=2 | |
| 234 | - | tab_radios=6 | |
| 235 | - | tab_smartplaylists=4 | |
| 236 | - | ||
| 237 | - | [Moodbar] | |
| 238 | - | enabled=false | |
| 239 | - | save=false | |
| 240 | - | show=false | |
| 241 | - | style=0 | |
| 242 | - | ||
| 243 | - | [NetworkProxy] | |
| 244 | - | engine=true | |
| 245 | - | hostname= | |
| 246 | - | mode=0 | |
| 247 | - | password= | |
| 248 | - | port=0 | |
| 249 | - | type=3 | |
| 250 | - | use_authentication=false | |
| 251 | - | username= | |
| 252 | - | ||
| 253 | - | [OSD] | |
| 254 | - | Behaviour=1 | |
| 255 | - | CustomText1= | |
| 256 | - | CustomText2= | |
| 257 | - | CustomTextEnabled=false | |
| 258 | - | ShowArt=true | |
| 259 | - | ShowOnPausePlayback=true | |
| 260 | - | ShowOnPlayModeChange=true | |
| 261 | - | ShowOnResumePlayback=false | |
| 262 | - | ShowOnVolumeChange=false | |
| 263 | - | Timeout=5000 | |
| 264 | - | ||
| 265 | - | [OSDPretty] | |
| 266 | - | background_color=4284913379 | |
| 267 | - | background_opacity=0.85 | |
| 268 | - | disable_duration=false | |
| 269 | - | fading=false | |
| 270 | - | font="Verdana,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1" | |
| 271 | - | foreground_color=4278190080 | |
| 272 | - | popup_pos=@Point(1524 0) | |
| 273 | - | popup_screen=HDMI-0 | |
| 274 | - | ||
| 275 | - | [OpenTidal] | |
| 276 | - | access_token=eyJraWQiOiJ2OU1GbFhqWSIsImFsZyI6IkVTMjU2In0.eyJ0eXBlIjoibzJfYWNjZXNzIiwic2NvcGUiOiIiLCJnVmVyIjowLCJzVmVyIjowLCJjaWQiOjk3MDYsImV4cCI6MTczNDM4NDI2MCwiaXNzIjoiaHR0cHM6Ly9hdXRoLnRpZGFsLmNvbS92MSJ9.8_vc5o1C0UhXeB6t4v5GYgXqfiY3X0Fg59D_UKJGfbXxKRluQ2Muf-aEjhINFHhZAvgtVRWRlgsHlxS_x0ZjrA | |
| 277 | - | expires_in=86400 | |
| 278 | - | login_time=1734297860 | |
| 279 | - | token_type=Bearer | |
| 280 | - | ||
| 281 | - | [OrganizeDialog] | |
| 282 | - | geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x2\x9d\0\0\0\x7f\0\0\x4\xe6\0\0\x3\xf8\0\0\x2\x9f\0\0\0\x9d\0\0\x4\xe4\0\0\x3\xf6\0\0\0\0\0\0\0\0\a\x80\0\0\x2\x9f\0\0\0\x9d\0\0\x4\xe4\0\0\x3\xf6) | |
| 283 | - | ||
| 284 | - | [Player] | |
| 285 | - | playback_playlist=1 | |
| 286 | - | playback_position=299 | |
| 287 | - | playback_state=3 | |
| 288 | - | volume=100 | |
| 289 | - | ||
| 290 | - | [Playlist] | |
| 291 | - | alternating_row_colors=true | |
| 292 | - | auto_sort=false | |
| 293 | - | column_alignments=@Variant(\0\0\0\x7f\0\0\0\x13\x43olumnAlignmentMap\0\0\0\0\v\0\0\0\x6\0\0\0\x82\0\0\0\a\0\0\0\x82\0\0\0\b\0\0\0\x82\0\0\0\t\0\0\0\x82\0\0\0\n\0\0\0\x82\0\0\0\f\0\0\0\x82\0\0\0\r\0\0\0\x82\0\0\0\xe\0\0\0\x82\0\0\0\x11\0\0\0\x82\0\0\0\x15\0\0\0\x82\0\0\0\x16\0\0\0\x82) | |
| 294 | - | continue_on_error=false | |
| 295 | - | current_playlist=1 | |
| 296 | - | delete_files=false | |
| 297 | - | editmetadatainline=true | |
| 298 | - | glow_effect=true | |
| 299 | - | greyout_songs_play=true | |
| 300 | - | greyout_songs_startup=true | |
| 301 | - | path_type=0 | |
| 302 | - | playlist_clear=true | |
| 303 | - | rating_locked=false | |
| 304 | - | select_track=false | |
| 305 | - | show_bars=true | |
| 306 | - | show_toolbar=true | |
| 307 | - | state="@ByteArray(P,\x95\x10\0\0\0\0 \0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\b\0\0\0\x3\0\0\0\x4\0\0\0\x5\0\0\0\x6\0\0\0\a\0\0\0\t\0\0\0\n\0\0\0\v\0\0\0\f\0\0\0\r\0\0\0\xe\0\0\0\xf\0\0\0\x10\0\0\0\x11\0\0\0\x12\0\0\0\x13\0\0\0\x14\0\0\0\x15\0\0\0\x16\0\0\0\x17\0\0\0\x18\0\0\0\x19\0\0\0\x1a\0\0\0\x1b\0\0\0\x1c\0\0\0\x1d\0\0\0\x1e\0\0\0\x1f\0\0\0 \0\0\x1\xe5\0\0\x1\xbb\0\0\x1\x81\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0,\0\0\0\0\0\0\0\x31\0\0\0\0\0\0\0\x41\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\a\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\x6\0\0\0\b\0\0\0\n\0\0\0\xe\0\0\0 ?\xd0\x36v.hH\f?\xd3*):\xbe \x5?\xd5\x8c\xa3RO\x11\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\x93\xd8\x39\x63:\xdf\x83\0\0\0\0\0\0\0\0?\xb7T\xe6\xb9[a\xdd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1)" | |
| 308 | - | state_version=1 | |
| 309 | - | warn_close_playlist=true | |
| 310 | - | write_metadata=false | |
| 311 | - | ||
| 312 | - | [Qobuz] | |
| 313 | - | albums_group_by1=1 | |
| 314 | - | albums_group_by2=4 | |
| 315 | - | albums_group_by3=0 | |
| 316 | - | albums_group_by_version=1 | |
| 317 | - | albums_separate_albums_by_grouping=false | |
| 318 | - | artists_group_by1=1 | |
| 319 | - | artists_group_by2=4 | |
| 320 | - | artists_group_by3=0 | |
| 321 | - | artists_group_by_version=1 | |
| 322 | - | artists_separate_albums_by_grouping=false | |
| 323 | - | search_group_by1=1 | |
| 324 | - | search_group_by2=4 | |
| 325 | - | search_group_by3=0 | |
| 326 | - | search_group_by_version=1 | |
| 327 | - | songs_group_by1=1 | |
| 328 | - | songs_group_by2=4 | |
| 329 | - | songs_group_by3=0 | |
| 330 | - | songs_group_by_version=1 | |
| 331 | - | songs_separate_albums_by_grouping=false | |
| 332 | - | tab=artists | |
| 333 | - | ||
| 334 | - | [Scrobbler] | |
| 335 | - | albumartist=false | |
| 336 | - | enabled=true | |
| 337 | - | love_button=true | |
| 338 | - | offline=false | |
| 339 | - | scrobble_button=true | |
| 340 | - | show_error_dialog=true | |
| 341 | - | sources=collection, file, cd, device, subsonic, tidal, qobuz, stream, somafm, radioparadise, unknown | |
| 342 | - | strip_remastered=true | |
| 343 | - | submit=0 | |
| 344 | - | ||
| 345 | - | [SerializedSmartPlaylists] | |
| 346 | - | songs\1\data=@ByteArray(\0\0\0\0\x2\x11\0\0\0\x14\x2\0) | |
| 347 | - | songs\1\name=Newest tracks | |
| 348 | - | songs\1\type=1 | |
| 349 | - | songs\10\data=@ByteArray(\0\0\0\0\0\x3\0\0\0\x14\x2\x1) | |
| 350 | - | songs\10\name=Dynamic random mix | |
| 351 | - | songs\10\type=1 | |
| 352 | - | songs\2\data=@ByteArray(\0\0\0\0\0\x3\0\0\0\x32\x2\0) | |
| 353 | - | songs\2\name=50 random tracks | |
| 354 | - | songs\2\type=1 | |
| 355 | - | songs\3\data=@ByteArray(\0\0\0\x1\x13\x4\0\0\0\x2\0\0\0\0\0\0\0\0\0\x1\0\0\x3\0\0\0\x14\0\0) | |
| 356 | - | songs\3\name=Ever played | |
| 357 | - | songs\3\type=1 | |
| 358 | - | songs\4\data=@ByteArray(\0\0\0\x1\x13\x6\0\0\0\x2\0\0\0\0\0\0\0\0\0\x1\0\0\x3\0\0\0\x14\0\0) | |
| 359 | - | songs\4\name=Never played | |
| 360 | - | songs\4\type=1 | |
| 361 | - | songs\5\data=@ByteArray(\0\0\0\0\x2\x15\0\0\0\x14\x2\0) | |
| 362 | - | songs\5\name=Last played | |
| 363 | - | songs\5\type=1 | |
| 364 | - | songs\6\data=@ByteArray(\0\0\0\0\x2\x13\0\0\0\x14\x2\0) | |
| 365 | - | songs\6\name=Most played | |
| 366 | - | songs\6\type=1 | |
| 367 | - | songs\7\data=@ByteArray(\0\0\0\0\x2\x16\0\0\0\x14\x2\0) | |
| 368 | - | songs\7\name=Favourite tracks | |
| 369 | - | songs\7\type=1 | |
| 370 | - | songs\8\data=@ByteArray(\0\0\0\x2\x16\x5\0\0\0\x6\0?\xe0\0\0\0\0\0\0\0\0\0\0\x1\0\x14\x4\0\0\0\x2\0\0\0\0\x4\0\0\0\0\x1\0\x2\x14\0\0\0\x14\x1\0) | |
| 371 | - | songs\8\name=Least favourite tracks | |
| 372 | - | songs\8\type=1 | |
| 373 | - | songs\9\data=@ByteArray(\0\0\0\0\x1\x1\xff\xff\xff\xff\x2\0) | |
| 374 | - | songs\9\name=All tracks | |
| 375 | - | songs\9\type=1 | |
| 376 | - | songs\size=10 | |
| 377 | - | songs_version=3 | |
| 378 | - | ||
| 379 | - | [SettingsDialog] | |
| 380 | - | geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x2 \0\0\0\x8e\0\0\x5^\0\0\x3\xad\0\0\x2\"\0\0\0\xac\0\0\x5\\\0\0\x3\xab\0\0\0\0\0\0\0\0\a\x80\0\0\x2\"\0\0\0\xac\0\0\x5\\\0\0\x3\xab) | |
| 381 | - | ||
| 382 | - | [Spotify] | |
| 383 | - | albums_group_by1=1 | |
| 384 | - | albums_group_by2=4 | |
| 385 | - | albums_group_by3=0 | |
| 386 | - | albums_group_by_version=1 | |
| 387 | - | albums_separate_albums_by_grouping=false | |
| 388 | - | artists_group_by1=1 | |
| 389 | - | artists_group_by2=4 | |
| 390 | - | artists_group_by3=0 | |
| 391 | - | artists_group_by_version=1 | |
| 392 | - | artists_separate_albums_by_grouping=false | |
| 393 | - | search_group_by1=1 | |
| 394 | - | search_group_by2=4 | |
| 395 | - | search_group_by3=0 | |
| 396 | - | search_group_by_version=1 | |
| 397 | - | songs_group_by1=1 | |
| 398 | - | songs_group_by2=4 | |
| 399 | - | songs_group_by3=0 | |
| 400 | - | songs_group_by_version=1 | |
| 401 | - | songs_separate_albums_by_grouping=false | |
| 402 | - | tab=artists | |
| 403 | - | ||
| 404 | - | [Subsonic] | |
| 405 | - | group_by1=1 | |
| 406 | - | group_by2=4 | |
| 407 | - | group_by3=0 | |
| 408 | - | group_by_version=1 | |
| 409 | - | separate_albums_by_grouping=false | |
| 410 | - | ||
| 411 | - | [Tidal] | |
| 412 | - | albums_group_by1=1 | |
| 413 | - | albums_group_by2=4 | |
| 414 | - | albums_group_by3=0 | |
| 415 | - | albums_group_by_version=1 | |
| 416 | - | albums_separate_albums_by_grouping=false | |
| 417 | - | artists_group_by1=1 | |
| 418 | - | artists_group_by2=4 | |
| 419 | - | artists_group_by3=0 | |
| 420 | - | artists_group_by_version=1 | |
| 421 | - | artists_separate_albums_by_grouping=false | |
| 422 | - | search_group_by1=1 | |
| 423 | - | search_group_by2=4 | |
| 424 | - | search_group_by3=0 | |
| 425 | - | search_group_by_version=1 | |
| 426 | - | songs_group_by1=1 | |
| 427 | - | songs_group_by2=4 | |
| 428 | - | songs_group_by3=0 | |
| 429 | - | songs_group_by_version=1 | |
| 430 | - | songs_separate_albums_by_grouping=false | |
| 431 | - | tab=artists |
R home/scripts/charmbracelet_vhs/nyancat.tape =>
scripts/Scripts/charmbracelet_vhs/nyancat.tape
+0,
-0
R home/scripts/charmbracelet_vhs/parrot.tape =>
scripts/Scripts/charmbracelet_vhs/parrot.tape
+0,
-0
R home/scripts/charmbracelet_vhs/pbtape2.tape =>
scripts/Scripts/charmbracelet_vhs/pbtape2.tape
+0,
-0
R home/scripts/charmbracelet_vhs/train.tape =>
scripts/Scripts/charmbracelet_vhs/train.tape
+0,
-0
R home/scripts/lastfm.py =>
scripts/Scripts/lastfm.py
+0,
-0
R home/scripts/phantomjs-wttr/Dockerfile =>
scripts/Scripts/phantomjs-wttr/Dockerfile
+0,
-0
R home/scripts/phantomjs-wttr/README.md =>
scripts/Scripts/phantomjs-wttr/README.md
+2,
-0
| ... | ... | @@ -1,3 +1,5 @@ | |
| 1 | + | ### i don't use this anymore (i replaced it with a curl command piped to imagemagick. felt like a god doing that.) but keeping here just in case... | |
| 2 | + | ||
| 1 | 3 | ## for optiplex 9020 server | |
| 2 | 4 | ||
| 3 | 5 | run with following cron job on the server: |
R home/scripts/phantomjs-wttr/docker-compose.yml =>
scripts/Scripts/phantomjs-wttr/docker-compose.yml
+0,
-0
R home/scripts/phantomjs-wttr/entrypoint.sh =>
scripts/Scripts/phantomjs-wttr/entrypoint.sh
+0,
-0
R home/scripts/phantomjs-wttr/rasterize.js =>
scripts/Scripts/phantomjs-wttr/rasterize.js
+0,
-0
R home/scripts/phantomjs-wttr/rsync.sh =>
scripts/Scripts/phantomjs-wttr/rsync.sh
+0,
-0
A
stow.sh
+15,
-0
| ... | ... | @@ -0,0 +1,15 @@ | |
| 1 | + | #!/bin/bash | |
| 2 | + | ||
| 3 | + | echo "pulling from git..." | gum style --foreground "#f4b8e4" --border none | |
| 4 | + | ||
| 5 | + | git pull | |
| 6 | + | ||
| 7 | + | echo "stowing your shit..." | gum style --foreground "#f4b8e4" --border none | |
| 8 | + | ||
| 9 | + | stow --adopt -v -R -t ~ "config" | |
| 10 | + | ||
| 11 | + | stow --adopt -v -R -t ~ "git" | |
| 12 | + | ||
| 13 | + | stow --adopt -v -R -t ~ "scripts" | |
| 14 | + | ||
| 15 | + | echo "done ^_^" | gum style --foreground "#f4b8e4" --border none |
R home/config/calibre/themes/frappe/catppuccin-frappe-lavender.calibre-palette =>
themes/calibre/themes/frappe/catppuccin-frappe-lavender.calibre-palette
+0,
-0
R home/config/lxqt/catppuccin-frappe/LICENSE =>
themes/lxqt/catppuccin-frappe/LICENSE
+0,
-0
R home/config/lxqt/catppuccin-frappe/arrow-left.svg =>
themes/lxqt/catppuccin-frappe/arrow-left.svg
+0,
-0
R home/config/lxqt/catppuccin-frappe/arrow-right.svg =>
themes/lxqt/catppuccin-frappe/arrow-right.svg
+0,
-0
R home/config/lxqt/catppuccin-frappe/ic_back.png =>
themes/lxqt/catppuccin-frappe/ic_back.png
+0,
-0
R home/config/lxqt/catppuccin-frappe/ic_next.png =>
themes/lxqt/catppuccin-frappe/ic_next.png
+0,
-0
R home/config/lxqt/catppuccin-frappe/lxqt-notificationd.qss =>
themes/lxqt/catppuccin-frappe/lxqt-notificationd.qss
+0,
-0
R home/config/lxqt/catppuccin-frappe/lxqt-notificationd/cancel.svg =>
themes/lxqt/catppuccin-frappe/lxqt-notificationd/cancel.svg
+0,
-0
R home/config/lxqt/catppuccin-frappe/lxqt-panel.qss =>
themes/lxqt/catppuccin-frappe/lxqt-panel.qss
+0,
-0
R home/config/lxqt/catppuccin-frappe/lxqt-runner.qss =>
themes/lxqt/catppuccin-frappe/lxqt-runner.qss
+0,
-0
R home/config/lxqt/catppuccin-frappe/lxqt-runner/clear.svg =>
themes/lxqt/catppuccin-frappe/lxqt-runner/clear.svg
+0,
-0
R home/config/lxqt/catppuccin-frappe/penguin.png =>
themes/lxqt/catppuccin-frappe/penguin.png
+0,
-0
R home/config/lxqt/catppuccin-frappe/preview.png =>
themes/lxqt/catppuccin-frappe/preview.png
+0,
-0
R home/config/lxqt/catppuccin-frappe/preview.png~ =>
themes/lxqt/catppuccin-frappe/preview.png~
+0,
-0
R home/config/lxqt/catppuccin-frappe/spacer-plugin/spacer-dots.png =>
themes/lxqt/catppuccin-frappe/spacer-plugin/spacer-dots.png
+0,
-0
R home/config/lxqt/catppuccin-frappe/spacer-plugin/spacer-line.png =>
themes/lxqt/catppuccin-frappe/spacer-plugin/spacer-line.png
+0,
-0
R home/config/lxqt/catppuccin-frappe/unknown.png =>
themes/lxqt/catppuccin-frappe/unknown.png
+0,
-0
R home/config/lxqt/catppuccin-frappe/wallpaper.cfg =>
themes/lxqt/catppuccin-frappe/wallpaper.cfg
+0,
-0
R home/config/lxqt/catppuccin-frappe/wallpaper.png =>
themes/lxqt/catppuccin-frappe/wallpaper.png
+0,
-0
R home/config/qbittorrent/legacy-4.3.8-qBittorrent-bluewave2-v1.18.qbtheme =>
themes/qbittorrent/legacy-4.3.8-qBittorrent-bluewave2-v1.18.qbtheme
+0,
-0
R home/config/qbittorrent/legacy-qBittorrent.qbtheme =>
themes/qbittorrent/legacy-qBittorrent.qbtheme
+0,
-0
R home/config/qtermwidget5/color-schemes/Catppuccin-Frappe.colorscheme =>
themes/qtermwidget5/color-schemes/Catppuccin-Frappe.colorscheme
+0,
-0
R home/config/thunderbird/themes/latte/frappe-lavender.xpi =>
themes/thunderbird/themes/latte/frappe-lavender.xpi
+0,
-0
R home/config/thunderbird/themes/latte/latte-lavender.xpi =>
themes/thunderbird/themes/latte/latte-lavender.xpi
+0,
-0