Not for normies
move everything to .dotfiles, prefix u uploads dotfiles
1498 files changed, +143218 -0
This diff is large and was cut short. Clone the repository to see all of it.
+20-0.oh-my-zsh/.devcontainer/devcontainer.json
| @@ -0,0 +1,20 @@ | ||
| 1 | +{ | |
| 2 | + "image": "mcr.microsoft.com/devcontainers/base:noble", | |
| 3 | + "features": { | |
| 4 | + "ghcr.io/devcontainers/features/common-utils": { | |
| 5 | + "installZsh": true, | |
| 6 | + "configureZshAsDefaultShell": true, | |
| 7 | + "username": "vscode", | |
| 8 | + "userUid": 1000, | |
| 9 | + "userGid": 1000 | |
| 10 | + } | |
| 11 | + }, | |
| 12 | + "postCreateCommand": "dir=/workspaces/ohmyzsh; rm -rf $HOME/.oh-my-zsh && ln -s $dir $HOME/.oh-my-zsh && cp $dir/templates/minimal.zshrc $HOME/.zshrc && chgrp -R 1000 $dir && chmod g-w,o-w $dir", | |
| 13 | + "customizations": { | |
| 14 | + "codespaces": { | |
| 15 | + "openFiles": [ | |
| 16 | + "README.md" | |
| 17 | + ] | |
| 18 | + } | |
| 19 | + } | |
| 20 | +} |
+15-0.oh-my-zsh/.editorconfig
| @@ -0,0 +1,15 @@ | ||
| 1 | +root = true | |
| 2 | + | |
| 3 | +[*] | |
| 4 | +end_of_line = lf | |
| 5 | +insert_final_newline = true | |
| 6 | +charset = utf-8 | |
| 7 | +indent_size = 2 | |
| 8 | +indent_style = space | |
| 9 | + | |
| 10 | +[*.py] | |
| 11 | +indent_size = 4 | |
| 12 | + | |
| 13 | +[devcontainer.json] | |
| 14 | +indent_size = 4 | |
| 15 | +indent_style = tab |
+19-0.oh-my-zsh/.github/CODEOWNERS
| @@ -0,0 +1,19 @@ | ||
| 1 | +# Plugin owners | |
| 2 | +plugins/archlinux/ @ratijas | |
| 3 | +plugins/dbt/ @msempere | |
| 4 | +plugins/eza/ @pepoluan | |
| 5 | +plugins/genpass/ @atoponce | |
| 6 | +plugins/git-lfs/ @hellovietduc | |
| 7 | +plugins/gitfast/ @felipec | |
| 8 | +plugins/kube-ps1/ @mcornella | |
| 9 | +plugins/kubectl/ @mcornella | |
| 10 | +plugins/kubectx/ @mcornella | |
| 11 | +plugins/opentofu/ @mcornella | |
| 12 | +plugins/react-native @esthor | |
| 13 | +plugins/sdk/ @rgoldberg | |
| 14 | +plugins/shell-proxy/ @septs | |
| 15 | +plugins/starship/ @axieax | |
| 16 | +plugins/terraform/ @mcornella | |
| 17 | +plugins/universalarchive/ @Konfekt | |
| 18 | +plugins/wp-cli/ @joshmedeski | |
| 19 | +plugins/zoxide/ @ajeetdsouza |
+2-0.oh-my-zsh/.github/FUNDING.yml
| @@ -0,0 +1,2 @@ | ||
| 1 | +github: [ohmyzsh, robbyrussell, mcornella, larson-carter, carlosala] | |
| 2 | +open_collective: ohmyzsh |
+68-0.oh-my-zsh/.github/ISSUE_TEMPLATE/bug_report.yml
| @@ -0,0 +1,68 @@ | ||
| 1 | +name: Report a bug | |
| 2 | +description: Report a bug that isn't caused by Oh My Zsh. If unsure, use this form | |
| 3 | +body: | |
| 4 | + - type: markdown | |
| 5 | + attributes: | |
| 6 | + value: | | |
| 7 | + ## Self Check | |
| 8 | + - Look for similar errors in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed). | |
| 9 | + - Try reaching out on the [Discord server](https://discord.gg/ohmyzsh) for help. | |
| 10 | + - type: textarea | |
| 11 | + validations: | |
| 12 | + required: true | |
| 13 | + attributes: | |
| 14 | + label: Describe the bug | |
| 15 | + description: A clear description of what the bug is. | |
| 16 | + - type: textarea | |
| 17 | + validations: | |
| 18 | + required: true | |
| 19 | + attributes: | |
| 20 | + label: Steps to reproduce | |
| 21 | + description: | | |
| 22 | + Steps to reproduce the problem. | |
| 23 | + placeholder: | | |
| 24 | + For example: | |
| 25 | + 1. Enable plugin '...' | |
| 26 | + 2. Run command '...' or try to complete command '...' | |
| 27 | + 3. See error | |
| 28 | + - type: textarea | |
| 29 | + validations: | |
| 30 | + required: true | |
| 31 | + attributes: | |
| 32 | + label: Expected behavior | |
| 33 | + description: A brief description of what should happen. | |
| 34 | + - type: textarea | |
| 35 | + attributes: | |
| 36 | + label: Screenshots and recordings | |
| 37 | + description: | | |
| 38 | + If applicable, add screenshots to help explain your problem. You can also record an asciinema session: https://asciinema.org/ | |
| 39 | + - type: input | |
| 40 | + validations: | |
| 41 | + required: true | |
| 42 | + attributes: | |
| 43 | + label: OS / Linux distribution | |
| 44 | + placeholder: Windows 10, Ubuntu 20.04, Arch Linux, macOS 10.15... | |
| 45 | + - type: input | |
| 46 | + validations: | |
| 47 | + required: true | |
| 48 | + attributes: | |
| 49 | + label: Zsh version | |
| 50 | + description: Run `echo $ZSH_VERSION` to check. | |
| 51 | + placeholder: "5.6" | |
| 52 | + - type: input | |
| 53 | + validations: | |
| 54 | + required: true | |
| 55 | + attributes: | |
| 56 | + label: Terminal emulator | |
| 57 | + placeholder: iTerm2, GNOME Terminal, Terminal.app... | |
| 58 | + - type: dropdown | |
| 59 | + attributes: | |
| 60 | + label: If using WSL on Windows, which version of WSL | |
| 61 | + description: Run `wsl -l -v` to check. | |
| 62 | + options: | |
| 63 | + - WSL1 | |
| 64 | + - WSL2 | |
| 65 | + - type: textarea | |
| 66 | + attributes: | |
| 67 | + label: Additional context | |
| 68 | + description: Add any other context about the problem here. This can be themes, plugins, custom settings... |
+77-0.oh-my-zsh/.github/ISSUE_TEMPLATE/bug_report_omz.yml
| @@ -0,0 +1,77 @@ | ||
| 1 | +name: Report a bug in Oh My Zsh | |
| 2 | +description: Create a report to help us improve Oh My Zsh | |
| 3 | +labels: ['Bug'] | |
| 4 | +body: | |
| 5 | + - type: markdown | |
| 6 | + attributes: | |
| 7 | + value: | | |
| 8 | + ## Self Check | |
| 9 | + - **Make sure this bug only happens with Oh My Zsh enabled**. | |
| 10 | + - Look for similar errors in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed). | |
| 11 | + - Try reaching out on the [Discord server](https://discord.gg/ohmyzsh) for help. | |
| 12 | + - type: textarea | |
| 13 | + validations: | |
| 14 | + required: true | |
| 15 | + attributes: | |
| 16 | + label: Describe the bug | |
| 17 | + description: A clear description of what the bug is. | |
| 18 | + - type: textarea | |
| 19 | + validations: | |
| 20 | + required: true | |
| 21 | + attributes: | |
| 22 | + label: Steps to reproduce | |
| 23 | + description: | | |
| 24 | + Steps to reproduce the problem. | |
| 25 | + placeholder: | | |
| 26 | + For example: | |
| 27 | + 1. Enable plugin '...' | |
| 28 | + 2. Run command '...' or try to complete command '...' | |
| 29 | + 3. See error | |
| 30 | + - type: textarea | |
| 31 | + validations: | |
| 32 | + required: true | |
| 33 | + attributes: | |
| 34 | + label: Expected behavior | |
| 35 | + description: A brief description of what should happen. | |
| 36 | + - type: textarea | |
| 37 | + attributes: | |
| 38 | + label: Screenshots and recordings | |
| 39 | + description: | | |
| 40 | + If applicable, add screenshots to help explain your problem. You can also record an asciinema session: https://asciinema.org/ | |
| 41 | + - type: input | |
| 42 | + validations: | |
| 43 | + required: true | |
| 44 | + attributes: | |
| 45 | + label: OS / Linux distribution | |
| 46 | + placeholder: Windows 10, Ubuntu 20.04, Arch Linux, macOS 10.15... | |
| 47 | + - type: input | |
| 48 | + validations: | |
| 49 | + required: true | |
| 50 | + attributes: | |
| 51 | + label: Zsh version | |
| 52 | + description: Run `echo $ZSH_VERSION` to check. | |
| 53 | + placeholder: "5.6" | |
| 54 | + - type: input | |
| 55 | + validations: | |
| 56 | + required: true | |
| 57 | + attributes: | |
| 58 | + label: Oh My Zsh version | |
| 59 | + description: Run `omz version` to check. | |
| 60 | + placeholder: master (bf303965) | |
| 61 | + - type: input | |
| 62 | + validations: | |
| 63 | + required: true | |
| 64 | + attributes: | |
| 65 | + label: Terminal emulator | |
| 66 | + placeholder: iTerm2, GNOME Terminal, Terminal.app... | |
| 67 | + - type: dropdown | |
| 68 | + attributes: | |
| 69 | + label: If using WSL on Windows, which version of WSL | |
| 70 | + description: Run `wsl -l -v` to check. | |
| 71 | + options: | |
| 72 | + - WSL1 | |
| 73 | + - WSL2 | |
| 74 | + - type: textarea | |
| 75 | + attributes: | |
| 76 | + label: Additional context | |
| 77 | + description: Add any other context about the problem here. This can be themes, plugins, custom settings... |
+8-0.oh-my-zsh/.github/ISSUE_TEMPLATE/config.yml
| @@ -0,0 +1,8 @@ | ||
| 1 | +blank_issues_enabled: true | |
| 2 | +contact_links: | |
| 3 | + - name: Support | |
| 4 | + url: https://github.com/ohmyzsh/ohmyzsh/discussions | |
| 5 | + about: Ask the community for support | |
| 6 | + - name: Get help on Discord | |
| 7 | + url: https://discord.gg/ohmyzsh | |
| 8 | + about: Have a quick question? Join the Discord server and ask on the appropriate channel. |
+37-0.oh-my-zsh/.github/ISSUE_TEMPLATE/feature_request.yml
| @@ -0,0 +1,37 @@ | ||
| 1 | +name: Feature request | |
| 2 | +description: Suggest a feature for Oh My Zsh | |
| 3 | +labels: ["Feature"] | |
| 4 | +body: | |
| 5 | + - type: markdown | |
| 6 | + attributes: | |
| 7 | + value: | | |
| 8 | + ## Self Check | |
| 9 | + - Look for similar features in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed). | |
| 10 | + - type: input | |
| 11 | + attributes: | |
| 12 | + label: If the feature request is for a plugin or theme, specify it here. | |
| 13 | + description: The name of the plugin or theme that you would like us to improve. | |
| 14 | + placeholder: e.g. Git plugin, Agnoster theme | |
| 15 | + - type: textarea | |
| 16 | + attributes: | |
| 17 | + label: If the feature solves a problem you have, specify it here. | |
| 18 | + description: A description of what the problem is. | |
| 19 | + placeholder: Ex. I'm always frustrated when... | |
| 20 | + - type: textarea | |
| 21 | + attributes: | |
| 22 | + label: Describe the proposed feature. | |
| 23 | + description: A description of what you want to happen. Be as specific as possible. | |
| 24 | + validations: | |
| 25 | + required: true | |
| 26 | + - type: textarea | |
| 27 | + attributes: | |
| 28 | + label: Describe alternatives you've considered | |
| 29 | + description: A description of any alternative solutions or features you've considered. This can also include other plugins or themes. | |
| 30 | + - type: textarea | |
| 31 | + attributes: | |
| 32 | + label: Additional context | |
| 33 | + description: Add any other context, screenshots or Discord conversations about the feature request here. Also if you have any PRs related to this issue that are already open that you would like us to look at. | |
| 34 | + - type: textarea | |
| 35 | + attributes: | |
| 36 | + label: Related Issues | |
| 37 | + description: Is there any open or closed issues that is related to this feature request? If so please link them below! |
+20-0.oh-my-zsh/.github/PULL_REQUEST_TEMPLATE.md
| @@ -0,0 +1,20 @@ | ||
| 1 | +## Standards checklist: | |
| 2 | + | |
| 3 | +<!-- Fill with an x the ones that apply. Example: [x] --> | |
| 4 | + | |
| 5 | +- [ ] The PR title is descriptive. | |
| 6 | +- [ ] The PR doesn't replicate another PR which is already open. | |
| 7 | +- [ ] I have read the contribution guide and followed all the instructions. | |
| 8 | +- [ ] The code follows the code style guide detailed in the wiki. | |
| 9 | +- [ ] The code is mine or it's from somewhere with an MIT-compatible license. | |
| 10 | +- [ ] The code is efficient, to the best of my ability, and does not waste computer resources. | |
| 11 | +- [ ] The code is stable and I have tested it myself, to the best of my abilities. | |
| 12 | +- [ ] If the code introduces new aliases, I provide a valid use case for all plugin users down below. | |
| 13 | + | |
| 14 | +## Changes: | |
| 15 | + | |
| 16 | +- [...] | |
| 17 | + | |
| 18 | +## Other comments: | |
| 19 | + | |
| 20 | +... |
+14-0.oh-my-zsh/.github/dependabot.yml
| @@ -0,0 +1,14 @@ | ||
| 1 | +version: 2 | |
| 2 | +updates: | |
| 3 | + - package-ecosystem: github-actions | |
| 4 | + directory: / | |
| 5 | + schedule: | |
| 6 | + interval: "weekly" | |
| 7 | + day: "sunday" | |
| 8 | + labels: [] | |
| 9 | + - package-ecosystem: "pip" | |
| 10 | + directory: "/.github/workflows/dependencies" | |
| 11 | + schedule: | |
| 12 | + interval: "weekly" | |
| 13 | + day: "sunday" | |
| 14 | + labels: [] |
+48-0.oh-my-zsh/.github/dependencies.yml
| @@ -0,0 +1,48 @@ | ||
| 1 | +dependencies: | |
| 2 | + plugins/gitfast: | |
| 3 | + repo: felipec/git-completion | |
| 4 | + branch: master | |
| 5 | + version: tag:v2.2 | |
| 6 | + postcopy: | | |
| 7 | + set -e | |
| 8 | + rm -rf git-completion.plugin.zsh Makefile t tools | |
| 9 | + mv README.adoc MANUAL.adoc | |
| 10 | + mv -f src/* . | |
| 11 | + rmdir src | |
| 12 | + plugins/gradle: | |
| 13 | + repo: gradle/gradle-completion | |
| 14 | + branch: master | |
| 15 | + version: 25da917cf5a88f3e58f05be3868a7b2748c8afe6 | |
| 16 | + precopy: | | |
| 17 | + set -e | |
| 18 | + find . ! -name _gradle ! -name LICENSE -delete | |
| 19 | + plugins/history-substring-search: | |
| 20 | + repo: zsh-users/zsh-history-substring-search | |
| 21 | + branch: master | |
| 22 | + version: 87ce96b1862928d84b1afe7c173316614b30e301 | |
| 23 | + precopy: | | |
| 24 | + set -e | |
| 25 | + rm -f zsh-history-substring-search.plugin.zsh | |
| 26 | + test -e zsh-history-substring-search.zsh && mv zsh-history-substring-search.zsh history-substring-search.zsh | |
| 27 | + postcopy: | | |
| 28 | + set -e | |
| 29 | + test -e dependencies/OMZ-README.md && cat dependencies/OMZ-README.md >> README.md | |
| 30 | + plugins/wd: | |
| 31 | + repo: mfaerevaag/wd | |
| 32 | + branch: master | |
| 33 | + version: tag:v0.10.0 | |
| 34 | + precopy: | | |
| 35 | + set -e | |
| 36 | + rm -r test | |
| 37 | + rm install.sh tty.gif wd.1 | |
| 38 | + plugins/z: | |
| 39 | + branch: master | |
| 40 | + repo: agkozak/zsh-z | |
| 41 | + version: dd94ef04acc41748ba171eb219971cb455e0040b | |
| 42 | + precopy: | | |
| 43 | + set -e | |
| 44 | + test -e README.md && mv -f README.md MANUAL.md | |
| 45 | + postcopy: | | |
| 46 | + set -e | |
| 47 | + test -e _zshz && mv -f _zshz _z | |
| 48 | + test -e zsh-z.plugin.zsh && mv -f zsh-z.plugin.zsh z.plugin.zsh |
+36-0.oh-my-zsh/.github/workflows/dependencies.yml
| @@ -0,0 +1,36 @@ | ||
| 1 | +name: Update dependencies | |
| 2 | +on: | |
| 3 | + workflow_dispatch: {} | |
| 4 | + schedule: | |
| 5 | + - cron: "0 6 * * 0" | |
| 6 | + | |
| 7 | +jobs: | |
| 8 | + check: | |
| 9 | + name: Check for updates | |
| 10 | + runs-on: ubuntu-latest | |
| 11 | + if: github.repository == 'ohmyzsh/ohmyzsh' | |
| 12 | + steps: | |
| 13 | + - name: Checkout | |
| 14 | + uses: actions/checkout@v4 | |
| 15 | + with: | |
| 16 | + fetch-depth: 0 | |
| 17 | + - name: Authenticate as @ohmyzsh | |
| 18 | + id: generate_token | |
| 19 | + uses: ohmyzsh/github-app-token@v2 | |
| 20 | + with: | |
| 21 | + app_id: ${{ secrets.OHMYZSH_APP_ID }} | |
| 22 | + private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }} | |
| 23 | + - name: Setup Python | |
| 24 | + uses: actions/setup-python@v5 | |
| 25 | + with: | |
| 26 | + python-version: "3.12" | |
| 27 | + cache: "pip" | |
| 28 | + - name: Process dependencies | |
| 29 | + env: | |
| 30 | + GH_TOKEN: ${{ steps.generate_token.outputs.token }} | |
| 31 | + GIT_APP_NAME: ohmyzsh[bot] | |
| 32 | + GIT_APP_EMAIL: 54982679+ohmyzsh[bot]@users.noreply.github.com | |
| 33 | + TMP_DIR: ${{ runner.temp }} | |
| 34 | + run: | | |
| 35 | + pip install -r .github/workflows/dependencies/requirements.txt | |
| 36 | + python3 .github/workflows/dependencies/updater.py |
+1-0.oh-my-zsh/.github/workflows/dependencies/.gitignore
| @@ -0,0 +1 @@ | ||
| 1 | +.venv |
+7-0.oh-my-zsh/.github/workflows/dependencies/requirements.txt
| @@ -0,0 +1,7 @@ | ||
| 1 | +certifi==2025.4.26 | |
| 2 | +charset-normalizer==3.4.1 | |
| 3 | +idna==3.10 | |
| 4 | +PyYAML==6.0.2 | |
| 5 | +requests==2.32.3 | |
| 6 | +semver==3.0.4 | |
| 7 | +urllib3==2.4.0 |
+598-0.oh-my-zsh/.github/workflows/dependencies/updater.py
| @@ -0,0 +1,598 @@ | ||
| 1 | +import json | |
| 2 | +import os | |
| 3 | +import re | |
| 4 | +import shutil | |
| 5 | +import subprocess | |
| 6 | +import sys | |
| 7 | +import timeit | |
| 8 | +from copy import deepcopy | |
| 9 | +from typing import Literal, NotRequired, Optional, TypedDict | |
| 10 | + | |
| 11 | +import requests | |
| 12 | +import yaml | |
| 13 | +from semver import Version | |
| 14 | + | |
| 15 | +# Get TMP_DIR variable from environment | |
| 16 | +TMP_DIR = os.path.join(os.environ.get("TMP_DIR", "/tmp"), "ohmyzsh") | |
| 17 | +# Relative path to dependencies.yml file | |
| 18 | +DEPS_YAML_FILE = ".github/dependencies.yml" | |
| 19 | +# Dry run flag | |
| 20 | +DRY_RUN = os.environ.get("DRY_RUN", "0") == "1" | |
| 21 | + | |
| 22 | +# utils for tag comparison | |
| 23 | +BASEVERSION = re.compile( | |
| 24 | + r"""[vV]? | |
| 25 | + (?P<major>(0|[1-9])\d*) | |
| 26 | + (\. | |
| 27 | + (?P<minor>(0|[1-9])\d*) | |
| 28 | + (\. | |
| 29 | + (?P<patch>(0|[1-9])\d*) | |
| 30 | + )? | |
| 31 | + )? | |
| 32 | + """, | |
| 33 | + re.VERBOSE, | |
| 34 | +) | |
| 35 | + | |
| 36 | + | |
| 37 | +def coerce(version: str) -> Optional[Version]: | |
| 38 | + match = BASEVERSION.search(version) | |
| 39 | + if not match: | |
| 40 | + return None | |
| 41 | + | |
| 42 | + # BASEVERSION looks for `MAJOR.minor.patch` in the string given | |
| 43 | + # it fills with None if any of them is missing (for example `2.1`) | |
| 44 | + ver = { | |
| 45 | + key: 0 if value is None else value for key, value in match.groupdict().items() | |
| 46 | + } | |
| 47 | + # Version takes `major`, `minor`, `patch` arguments | |
| 48 | + ver = Version(**ver) # pyright: ignore[reportArgumentType] | |
| 49 | + return ver | |
| 50 | + | |
| 51 | + | |
| 52 | +class CodeTimer: | |
| 53 | + def __init__(self, name=None): | |
| 54 | + self.name = " '" + name + "'" if name else "" | |
| 55 | + | |
| 56 | + def __enter__(self): | |
| 57 | + self.start = timeit.default_timer() | |
| 58 | + | |
| 59 | + def __exit__(self, exc_type, exc_value, traceback): | |
| 60 | + self.took = (timeit.default_timer() - self.start) * 1000.0 | |
| 61 | + print("Code block" + self.name + " took: " + str(self.took) + " ms") | |
| 62 | + | |
| 63 | + | |
| 64 | +### YAML representation | |
| 65 | +def str_presenter(dumper, data): | |
| 66 | + """ | |
| 67 | + Configures yaml for dumping multiline strings | |
| 68 | + Ref: https://stackoverflow.com/a/33300001 | |
| 69 | + """ | |
| 70 | + if len(data.splitlines()) > 1: # check for multiline string | |
| 71 | + return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|") | |
| 72 | + return dumper.represent_scalar("tag:yaml.org,2002:str", data) | |
| 73 | + | |
| 74 | + | |
| 75 | +yaml.add_representer(str, str_presenter) | |
| 76 | +yaml.representer.SafeRepresenter.add_representer(str, str_presenter) | |
| 77 | + | |
| 78 | + | |
| 79 | +# Types | |
| 80 | +class DependencyDict(TypedDict): | |
| 81 | + repo: str | |
| 82 | + branch: str | |
| 83 | + version: str | |
| 84 | + precopy: NotRequired[str] | |
| 85 | + postcopy: NotRequired[str] | |
| 86 | + | |
| 87 | + | |
| 88 | +class DependencyYAML(TypedDict): | |
| 89 | + dependencies: dict[str, DependencyDict] | |
| 90 | + | |
| 91 | + | |
| 92 | +class UpdateStatusFalse(TypedDict): | |
| 93 | + has_updates: Literal[False] | |
| 94 | + | |
| 95 | + | |
| 96 | +class UpdateStatusTrue(TypedDict): | |
| 97 | + has_updates: Literal[True] | |
| 98 | + version: str | |
| 99 | + compare_url: str | |
| 100 | + head_ref: str | |
| 101 | + head_url: str | |
| 102 | + | |
| 103 | + | |
| 104 | +class CommandRunner: | |
| 105 | + class Exception(Exception): | |
| 106 | + def __init__(self, message, returncode, stage, stdout, stderr): | |
| 107 | + super().__init__(message) | |
| 108 | + self.returncode = returncode | |
| 109 | + self.stage = stage | |
| 110 | + self.stdout = stdout | |
| 111 | + self.stderr = stderr | |
| 112 | + | |
| 113 | + @staticmethod | |
| 114 | + def run_or_fail(command: list[str], stage: str, *args, **kwargs): | |
| 115 | + if DRY_RUN and command[0] == "gh": | |
| 116 | + command.insert(0, "echo") | |
| 117 | + | |
| 118 | + result = subprocess.run(command, *args, capture_output=True, **kwargs) | |
| 119 | + | |
| 120 | + if result.returncode != 0: | |
| 121 | + raise CommandRunner.Exception( | |
| 122 | + f"{stage} command failed with exit code {result.returncode}", | |
| 123 | + returncode=result.returncode, | |
| 124 | + stage=stage, | |
| 125 | + stdout=result.stdout.decode("utf-8"), | |
| 126 | + stderr=result.stderr.decode("utf-8"), | |
| 127 | + ) | |
| 128 | + | |
| 129 | + return result | |
| 130 | + | |
| 131 | + | |
| 132 | +class DependencyStore: | |
| 133 | + store: DependencyYAML = {"dependencies": {}} | |
| 134 | + | |
| 135 | + @staticmethod | |
| 136 | + def set(data: DependencyYAML): | |
| 137 | + DependencyStore.store = data | |
| 138 | + | |
| 139 | + @staticmethod | |
| 140 | + def update_dependency_version(path: str, version: str) -> DependencyYAML: | |
| 141 | + with CodeTimer(f"store deepcopy: {path}"): | |
| 142 | + store_copy = deepcopy(DependencyStore.store) | |
| 143 | + | |
| 144 | + dependency = store_copy["dependencies"].get(path) | |
| 145 | + if dependency is None: | |
| 146 | + raise ValueError(f"Dependency {path} {version} not found") | |
| 147 | + dependency["version"] = version | |
| 148 | + store_copy["dependencies"][path] = dependency | |
| 149 | + | |
| 150 | + return store_copy | |
| 151 | + | |
| 152 | + @staticmethod | |
| 153 | + def write_store(file: str, data: DependencyYAML): | |
| 154 | + with open(file, "w") as yaml_file: | |
| 155 | + yaml.safe_dump(data, yaml_file, sort_keys=False) | |
| 156 | + | |
| 157 | + | |
| 158 | +class Dependency: | |
| 159 | + def __init__(self, path: str, values: DependencyDict): | |
| 160 | + self.path = path | |
| 161 | + self.values = values | |
| 162 | + | |
| 163 | + self.name: str = "" | |
| 164 | + self.desc: str = "" | |
| 165 | + self.kind: str = "" | |
| 166 | + | |
| 167 | + match path.split("/"): | |
| 168 | + case ["plugins", name]: | |
| 169 | + self.name = name | |
| 170 | + self.kind = "plugin" | |
| 171 | + self.desc = f"{name} plugin" | |
| 172 | + case ["themes", name]: | |
| 173 | + self.name = name.replace(".zsh-theme", "") | |
| 174 | + self.kind = "theme" | |
| 175 | + self.desc = f"{self.name} theme" | |
| 176 | + case _: | |
| 177 | + self.name = self.desc = path | |
| 178 | + | |
| 179 | + def __str__(self): | |
| 180 | + output: str = "" | |
| 181 | + for key in DependencyDict.__dict__["__annotations__"].keys(): | |
| 182 | + if key not in self.values: | |
| 183 | + output += f"{key}: None\n" | |
| 184 | + continue | |
| 185 | + | |
| 186 | + value = self.values[key] | |
| 187 | + if "\n" not in value: | |
| 188 | + output += f"{key}: {value}\n" | |
| 189 | + else: | |
| 190 | + output += f"{key}:\n " | |
| 191 | + output += value.replace("\n", "\n ", value.count("\n") - 1) | |
| 192 | + return output | |
| 193 | + | |
| 194 | + def update_or_notify(self): | |
| 195 | + # Print dependency settings | |
| 196 | + print(f"Processing {self.desc}...", file=sys.stderr) | |
| 197 | + print(self, file=sys.stderr) | |
| 198 | + | |
| 199 | + # Check for updates | |
| 200 | + repo = self.values["repo"] | |
| 201 | + remote_branch = self.values["branch"] | |
| 202 | + version = self.values["version"] | |
| 203 | + is_tag = version.startswith("tag:") | |
| 204 | + | |
| 205 | + try: | |
| 206 | + with CodeTimer(f"update check: {repo}"): | |
| 207 | + if is_tag: | |
| 208 | + status = GitHub.check_newer_tag(repo, version.replace("tag:", "")) | |
| 209 | + else: | |
| 210 | + status = GitHub.check_updates(repo, remote_branch, version) | |
| 211 | + | |
| 212 | + if status["has_updates"] is True: | |
| 213 | + short_sha = status["head_ref"][:8] | |
| 214 | + new_version = status["version"] if is_tag else short_sha | |
| 215 | + | |
| 216 | + try: | |
| 217 | + branch_name = f"update/{self.path}/{new_version}" | |
| 218 | + | |
| 219 | + # Create new branch | |
| 220 | + branch = Git.checkout_or_create_branch(branch_name) | |
| 221 | + | |
| 222 | + # Update dependencies.yml file | |
| 223 | + self.__update_yaml( | |
| 224 | + f"tag:{new_version}" if is_tag else status["version"] | |
| 225 | + ) | |
| 226 | + | |
| 227 | + # Update dependency files | |
| 228 | + self.__apply_upstream_changes() | |
| 229 | + | |
| 230 | + # Add all changes and commit | |
| 231 | + has_new_commit = Git.add_and_commit(self.name, new_version) | |
| 232 | + | |
| 233 | + if has_new_commit: | |
| 234 | + # Push changes to remote | |
| 235 | + Git.push(branch) | |
| 236 | + | |
| 237 | + # Create GitHub PR | |
| 238 | + GitHub.create_pr( | |
| 239 | + branch, | |
| 240 | + f"feat({self.name}): update to version {new_version}", | |
| 241 | + f"""## Description | |
| 242 | + | |
| 243 | +Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}). | |
| 244 | +Check out the [list of changes]({status['compare_url']}). | |
| 245 | +""", | |
| 246 | + ) | |
| 247 | + | |
| 248 | + # Clean up repository | |
| 249 | + Git.clean_repo() | |
| 250 | + except (CommandRunner.Exception, shutil.Error) as e: | |
| 251 | + # Handle exception on automatic update | |
| 252 | + match type(e): | |
| 253 | + case CommandRunner.Exception: | |
| 254 | + # Print error message | |
| 255 | + print( | |
| 256 | + f"Error running {e.stage} command: {e.returncode}", # pyright: ignore[reportAttributeAccessIssue] | |
| 257 | + file=sys.stderr, | |
| 258 | + ) | |
| 259 | + print(e.stderr, file=sys.stderr) # pyright: ignore[reportAttributeAccessIssue] | |
| 260 | + case shutil.Error: | |
| 261 | + print(f"Error copying files: {e}", file=sys.stderr) | |
| 262 | + | |
| 263 | + try: | |
| 264 | + Git.clean_repo() | |
| 265 | + except CommandRunner.Exception as e: | |
| 266 | + print( | |
| 267 | + f"Error reverting repository to clean state: {e}", | |
| 268 | + file=sys.stderr, | |
| 269 | + ) | |
| 270 | + sys.exit(1) | |
| 271 | + | |
| 272 | + # Create a GitHub issue to notify maintainer | |
| 273 | + title = f"{self.path}: update to {new_version}" | |
| 274 | + body = f"""## Description | |
| 275 | + | |
| 276 | +There is a new version of `{self.name}` {self.kind} available. | |
| 277 | + | |
| 278 | +New version: [{new_version}]({status['head_url']}) | |
| 279 | +Check out the [list of changes]({status['compare_url']}). | |
| 280 | +""" | |
| 281 | + | |
| 282 | + print("Creating GitHub issue", file=sys.stderr) | |
| 283 | + print(f"{title}\n\n{body}", file=sys.stderr) | |
| 284 | + GitHub.create_issue(title, body) | |
| 285 | + except Exception as e: | |
| 286 | + print(e, file=sys.stderr) | |
| 287 | + | |
| 288 | + def __update_yaml(self, new_version: str) -> None: | |
| 289 | + dep_yaml = DependencyStore.update_dependency_version(self.path, new_version) | |
| 290 | + DependencyStore.write_store(DEPS_YAML_FILE, dep_yaml) | |
| 291 | + | |
| 292 | + def __apply_upstream_changes(self) -> None: | |
| 293 | + # Patterns to ignore in copying files from upstream repo | |
| 294 | + GLOBAL_IGNORE = [".git", ".github", ".gitignore"] | |
| 295 | + | |
| 296 | + path = os.path.abspath(self.path) | |
| 297 | + precopy = self.values.get("precopy") | |
| 298 | + postcopy = self.values.get("postcopy") | |
| 299 | + | |
| 300 | + repo = self.values["repo"] | |
| 301 | + branch = self.values["branch"] | |
| 302 | + remote_url = f"https://github.com/{repo}.git" | |
| 303 | + repo_dir = os.path.join(TMP_DIR, repo) | |
| 304 | + | |
| 305 | + # Clone repository | |
| 306 | + Git.clone(remote_url, branch, repo_dir, reclone=True) | |
| 307 | + | |
| 308 | + # Run precopy on tmp repo | |
| 309 | + if precopy is not None: | |
| 310 | + print("Running precopy script:", end="\n ", file=sys.stderr) | |
| 311 | + print( | |
| 312 | + precopy.replace("\n", "\n ", precopy.count("\n") - 1), file=sys.stderr | |
| 313 | + ) | |
| 314 | + CommandRunner.run_or_fail( | |
| 315 | + ["bash", "-c", precopy], cwd=repo_dir, stage="Precopy" | |
| 316 | + ) | |
| 317 | + | |
| 318 | + # Copy files from upstream repo | |
| 319 | + print(f"Copying files from {repo_dir} to {path}", file=sys.stderr) | |
| 320 | + shutil.copytree( | |
| 321 | + repo_dir, | |
| 322 | + path, | |
| 323 | + dirs_exist_ok=True, | |
| 324 | + ignore=shutil.ignore_patterns(*GLOBAL_IGNORE), | |
| 325 | + ) | |
| 326 | + | |
| 327 | + # Run postcopy on our repository | |
| 328 | + if postcopy is not None: | |
| 329 | + print("Running postcopy script:", end="\n ", file=sys.stderr) | |
| 330 | + print( | |
| 331 | + postcopy.replace("\n", "\n ", postcopy.count("\n") - 1), | |
| 332 | + file=sys.stderr, | |
| 333 | + ) | |
| 334 | + CommandRunner.run_or_fail( | |
| 335 | + ["bash", "-c", postcopy], cwd=path, stage="Postcopy" | |
| 336 | + ) | |
| 337 | + | |
| 338 | + | |
| 339 | +class Git: | |
| 340 | + default_branch = "master" | |
| 341 | + | |
| 342 | + @staticmethod | |
| 343 | + def clone(remote_url: str, branch: str, repo_dir: str, reclone=False): | |
| 344 | + # If repo needs to be fresh | |
| 345 | + if reclone and os.path.exists(repo_dir): | |
| 346 | + shutil.rmtree(repo_dir) | |
| 347 | + | |
| 348 | + # Clone repo in tmp directory and checkout branch | |
| 349 | + if not os.path.exists(repo_dir): | |
| 350 | + print( | |
| 351 | + f"Cloning {remote_url} to {repo_dir} and checking out {branch}", | |
| 352 | + file=sys.stderr, | |
| 353 | + ) | |
| 354 | + CommandRunner.run_or_fail( | |
| 355 | + ["git", "clone", "--depth=1", "-b", branch, remote_url, repo_dir], | |
| 356 | + stage="Clone", | |
| 357 | + ) | |
| 358 | + | |
| 359 | + @staticmethod | |
| 360 | + def checkout_or_create_branch(branch_name: str): | |
| 361 | + # Get current branch name | |
| 362 | + result = CommandRunner.run_or_fail( | |
| 363 | + ["git", "rev-parse", "--abbrev-ref", "HEAD"], stage="GetDefaultBranch" | |
| 364 | + ) | |
| 365 | + Git.default_branch = result.stdout.decode("utf-8").strip() | |
| 366 | + | |
| 367 | + # Create new branch and return created branch name | |
| 368 | + try: | |
| 369 | + # try to checkout already existing branch | |
| 370 | + CommandRunner.run_or_fail( | |
| 371 | + ["git", "checkout", branch_name], stage="CreateBranch" | |
| 372 | + ) | |
| 373 | + except CommandRunner.Exception: | |
| 374 | + # otherwise create new branch | |
| 375 | + CommandRunner.run_or_fail( | |
| 376 | + ["git", "checkout", "-b", branch_name], stage="CreateBranch" | |
| 377 | + ) | |
| 378 | + return branch_name | |
| 379 | + | |
| 380 | + @staticmethod | |
| 381 | + def add_and_commit(scope: str, version: str) -> bool: | |
| 382 | + """ | |
| 383 | + Returns `True` if there were changes and were indeed commited. | |
| 384 | + Returns `False` if the repo was clean and no changes were commited. | |
| 385 | + """ | |
| 386 | + # check if repo is clean (clean => no error, no commit) | |
| 387 | + try: | |
| 388 | + CommandRunner.run_or_fail( | |
| 389 | + ["git", "diff", "--exit-code"], stage="CheckRepoClean" | |
| 390 | + ) | |
| 391 | + return False | |
| 392 | + except CommandRunner.Exception: | |
| 393 | + # if it's other kind of error just throw! | |
| 394 | + pass | |
| 395 | + | |
| 396 | + user_name = os.environ.get("GIT_APP_NAME") | |
| 397 | + user_email = os.environ.get("GIT_APP_EMAIL") | |
| 398 | + | |
| 399 | + # Add all files to git staging | |
| 400 | + CommandRunner.run_or_fail(["git", "add", "-A", "-v"], stage="AddFiles") | |
| 401 | + | |
| 402 | + # Reset environment and git config | |
| 403 | + clean_env = os.environ.copy() | |
| 404 | + clean_env["LANG"] = "C.UTF-8" | |
| 405 | + clean_env["GIT_CONFIG_GLOBAL"] = "/dev/null" | |
| 406 | + clean_env["GIT_CONFIG_NOSYSTEM"] = "1" | |
| 407 | + | |
| 408 | + # Commit with settings above | |
| 409 | + CommandRunner.run_or_fail( | |
| 410 | + [ | |
| 411 | + "git", | |
| 412 | + "-c", | |
| 413 | + f"user.name={user_name}", | |
| 414 | + "-c", | |
| 415 | + f"user.email={user_email}", | |
| 416 | + "commit", | |
| 417 | + "-m", | |
| 418 | + f"feat({scope}): update to {version}", | |
| 419 | + ], | |
| 420 | + stage="CreateCommit", | |
| 421 | + env=clean_env, | |
| 422 | + ) | |
| 423 | + return True | |
| 424 | + | |
| 425 | + @staticmethod | |
| 426 | + def push(branch: str): | |
| 427 | + CommandRunner.run_or_fail( | |
| 428 | + ["git", "push", "-u", "origin", branch], stage="PushBranch" | |
| 429 | + ) | |
| 430 | + | |
| 431 | + @staticmethod | |
| 432 | + def clean_repo(): | |
| 433 | + CommandRunner.run_or_fail( | |
| 434 | + ["git", "reset", "--hard", "HEAD"], stage="ResetRepository" | |
| 435 | + ) | |
| 436 | + CommandRunner.run_or_fail( | |
| 437 | + ["git", "checkout", Git.default_branch], stage="CheckoutDefaultBranch" | |
| 438 | + ) | |
| 439 | + | |
| 440 | + | |
| 441 | +class GitHub: | |
| 442 | + @staticmethod | |
| 443 | + def check_newer_tag(repo, current_tag) -> UpdateStatusFalse | UpdateStatusTrue: | |
| 444 | + # GET /repos/:owner/:repo/git/refs/tags | |
| 445 | + url = f"https://api.github.com/repos/{repo}/git/refs/tags" | |
| 446 | + | |
| 447 | + # Send a GET request to the GitHub API | |
| 448 | + response = requests.get(url) | |
| 449 | + current_version = coerce(current_tag) | |
| 450 | + if current_version is None: | |
| 451 | + raise ValueError( | |
| 452 | + f"Stored {current_version} from {repo} does not follow semver" | |
| 453 | + ) | |
| 454 | + | |
| 455 | + # If the request was successful | |
| 456 | + if response.status_code == 200: | |
| 457 | + # Parse the JSON response | |
| 458 | + data = response.json() | |
| 459 | + | |
| 460 | + if len(data) == 0: | |
| 461 | + return { | |
| 462 | + "has_updates": False, | |
| 463 | + } | |
| 464 | + | |
| 465 | + latest_ref = None | |
| 466 | + latest_version: Optional[Version] = None | |
| 467 | + for ref in data: | |
| 468 | + # we find the tag since GitHub returns it as plain git ref | |
| 469 | + tag_version = coerce(ref["ref"].replace("refs/tags/", "")) | |
| 470 | + if tag_version is None: | |
| 471 | + # we skip every tag that is not semver-complaint | |
| 472 | + continue | |
| 473 | + if latest_version is None or tag_version.compare(latest_version) > 0: | |
| 474 | + # if we have a "greater" semver version, set it as latest | |
| 475 | + latest_version = tag_version | |
| 476 | + latest_ref = ref | |
| 477 | + | |
| 478 | + # raise if no valid semver tag is found | |
| 479 | + if latest_ref is None or latest_version is None: | |
| 480 | + raise ValueError(f"No tags following semver found in {repo}") | |
| 481 | + | |
| 482 | + # we get the tag since GitHub returns it as plain git ref | |
| 483 | + latest_tag = latest_ref["ref"].replace("refs/tags/", "") | |
| 484 | + | |
| 485 | + if latest_version.compare(current_version) <= 0: | |
| 486 | + return { | |
| 487 | + "has_updates": False, | |
| 488 | + } | |
| 489 | + | |
| 490 | + return { | |
| 491 | + "has_updates": True, | |
| 492 | + "version": latest_tag, | |
| 493 | + "compare_url": f"https://github.com/{repo}/compare/{current_tag}...{latest_tag}", | |
| 494 | + "head_ref": latest_ref["object"]["sha"], | |
| 495 | + "head_url": f"https://github.com/{repo}/releases/tag/{latest_tag}", | |
| 496 | + } | |
| 497 | + else: | |
| 498 | + # If the request was not successful, raise an exception | |
| 499 | + raise Exception( | |
| 500 | + f"GitHub API request failed with status code {response.status_code}: {response.json()}" | |
| 501 | + ) | |
| 502 | + | |
| 503 | + @staticmethod | |
| 504 | + def check_updates(repo, branch, version) -> UpdateStatusFalse | UpdateStatusTrue: | |
| 505 | + url = f"https://api.github.com/repos/{repo}/compare/{version}...{branch}" | |
| 506 | + | |
| 507 | + # Send a GET request to the GitHub API | |
| 508 | + response = requests.get(url) | |
| 509 | + | |
| 510 | + # If the request was successful | |
| 511 | + if response.status_code == 200: | |
| 512 | + # Parse the JSON response | |
| 513 | + data = response.json() | |
| 514 | + | |
| 515 | + # If the base is behind the head, there is a newer version | |
| 516 | + has_updates = data["status"] != "identical" | |
| 517 | + | |
| 518 | + if not has_updates: | |
| 519 | + return { | |
| 520 | + "has_updates": False, | |
| 521 | + } | |
| 522 | + | |
| 523 | + return { | |
| 524 | + "has_updates": data["status"] != "identical", | |
| 525 | + "version": data["commits"][-1]["sha"], | |
| 526 | + "compare_url": data["permalink_url"], | |
| 527 | + "head_ref": data["commits"][-1]["sha"], | |
| 528 | + "head_url": data["commits"][-1]["html_url"], | |
| 529 | + } | |
| 530 | + else: | |
| 531 | + # If the request was not successful, raise an exception | |
| 532 | + raise Exception( | |
| 533 | + f"GitHub API request failed with status code {response.status_code}: {response.json()}" | |
| 534 | + ) | |
| 535 | + | |
| 536 | + @staticmethod | |
| 537 | + def create_issue(title: str, body: str) -> None: | |
| 538 | + cmd = ["gh", "issue", "create", "-t", title, "-b", body] | |
| 539 | + CommandRunner.run_or_fail(cmd, stage="CreateIssue") | |
| 540 | + | |
| 541 | + @staticmethod | |
| 542 | + def create_pr(branch: str, title: str, body: str) -> None: | |
| 543 | + # first of all let's check if PR is already open | |
| 544 | + check_cmd = [ | |
| 545 | + "gh", | |
| 546 | + "pr", | |
| 547 | + "list", | |
| 548 | + "--state", | |
| 549 | + "open", | |
| 550 | + "--head", | |
| 551 | + branch, | |
| 552 | + "--json", | |
| 553 | + "title", | |
| 554 | + ] | |
| 555 | + # returncode is 0 also if no PRs are found | |
| 556 | + output = json.loads( | |
| 557 | + CommandRunner.run_or_fail(check_cmd, stage="CheckPullRequestOpen") | |
| 558 | + .stdout.decode("utf-8") | |
| 559 | + .strip() | |
| 560 | + ) | |
| 561 | + # we have PR in this case! | |
| 562 | + if len(output) > 0: | |
| 563 | + return | |
| 564 | + cmd = [ | |
| 565 | + "gh", | |
| 566 | + "pr", | |
| 567 | + "create", | |
| 568 | + "-B", | |
| 569 | + Git.default_branch, | |
| 570 | + "-H", | |
| 571 | + branch, | |
| 572 | + "-t", | |
| 573 | + title, | |
| 574 | + "-b", | |
| 575 | + body, | |
| 576 | + ] | |
| 577 | + CommandRunner.run_or_fail(cmd, stage="CreatePullRequest") | |
| 578 | + | |
| 579 | + | |
| 580 | +def main(): | |
| 581 | + # Load the YAML file | |
| 582 | + with open(DEPS_YAML_FILE, "r") as yaml_file: | |
| 583 | + data: DependencyYAML = yaml.safe_load(yaml_file) | |
| 584 | + | |
| 585 | + if "dependencies" not in data: | |
| 586 | + raise Exception("dependencies.yml not properly formatted") | |
| 587 | + | |
| 588 | + # Cache YAML version | |
| 589 | + DependencyStore.set(data) | |
| 590 | + | |
| 591 | + dependencies = data["dependencies"] | |
| 592 | + for path in dependencies: | |
| 593 | + dependency = Dependency(path, dependencies[path]) | |
| 594 | + dependency.update_or_notify() | |
| 595 | + | |
| 596 | + | |
| 597 | +if __name__ == "__main__": | |
| 598 | + main() |
+56-0.oh-my-zsh/.github/workflows/installer.yml
| @@ -0,0 +1,56 @@ | ||
| 1 | +name: Test and Deploy installer | |
| 2 | +on: | |
| 3 | + workflow_dispatch: {} | |
| 4 | + push: | |
| 5 | + paths: | |
| 6 | + - 'tools/install.sh' | |
| 7 | + - '.github/workflows/installer/**' | |
| 8 | + - '.github/workflows/installer.yml' | |
| 9 | + | |
| 10 | +concurrency: | |
| 11 | + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
| 12 | + cancel-in-progress: false | |
| 13 | + | |
| 14 | +permissions: | |
| 15 | + contents: read # to checkout | |
| 16 | + | |
| 17 | +jobs: | |
| 18 | + test: | |
| 19 | + name: Test installer | |
| 20 | + if: github.repository == 'ohmyzsh/ohmyzsh' | |
| 21 | + runs-on: ${{ matrix.os }} | |
| 22 | + strategy: | |
| 23 | + matrix: | |
| 24 | + os: | |
| 25 | + - ubuntu-latest | |
| 26 | + - macos-latest | |
| 27 | + steps: | |
| 28 | + - name: Set up git repository | |
| 29 | + uses: actions/checkout@v4 | |
| 30 | + - name: Install zsh | |
| 31 | + if: runner.os == 'Linux' | |
| 32 | + run: sudo apt-get update; sudo apt-get install zsh | |
| 33 | + - name: Test installer | |
| 34 | + run: sh ./tools/install.sh | |
| 35 | + | |
| 36 | + deploy: | |
| 37 | + name: Deploy installer in install.ohmyz.sh | |
| 38 | + if: github.ref == 'refs/heads/master' | |
| 39 | + runs-on: ubuntu-latest | |
| 40 | + environment: vercel | |
| 41 | + needs: | |
| 42 | + - test | |
| 43 | + steps: | |
| 44 | + - name: Checkout | |
| 45 | + uses: actions/checkout@v4 | |
| 46 | + - name: Install Vercel CLI | |
| 47 | + run: npm install -g vercel | |
| 48 | + - name: Setup project and deploy | |
| 49 | + env: | |
| 50 | + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} | |
| 51 | + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} | |
| 52 | + VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} | |
| 53 | + run: | | |
| 54 | + cp tools/install.sh .github/workflows/installer/install.sh | |
| 55 | + cd .github/workflows/installer | |
| 56 | + vc deploy --prod -t "$VERCEL_TOKEN" |
+1-0.oh-my-zsh/.github/workflows/installer/.gitignore
| @@ -0,0 +1 @@ | ||
| 1 | +install.sh |
+2-0.oh-my-zsh/.github/workflows/installer/.vercelignore
| @@ -0,0 +1,2 @@ | ||
| 1 | +/* | |
| 2 | +!/install.sh |
+23-0.oh-my-zsh/.github/workflows/installer/vercel.json
| @@ -0,0 +1,23 @@ | ||
| 1 | +{ | |
| 2 | + "headers": [ | |
| 3 | + { | |
| 4 | + "source": "/(|install.sh)", | |
| 5 | + "headers": [ | |
| 6 | + { | |
| 7 | + "key": "Content-Type", | |
| 8 | + "value": "text/plain" | |
| 9 | + }, | |
| 10 | + { | |
| 11 | + "key": "Content-Disposition", | |
| 12 | + "value": "inline; filename=\"install.sh\"" | |
| 13 | + } | |
| 14 | + ] | |
| 15 | + } | |
| 16 | + ], | |
| 17 | + "rewrites": [ | |
| 18 | + { | |
| 19 | + "source": "/", | |
| 20 | + "destination": "/install.sh" | |
| 21 | + } | |
| 22 | + ] | |
| 23 | +} |
+38-0.oh-my-zsh/.github/workflows/main.yml
| @@ -0,0 +1,38 @@ | ||
| 1 | +name: CI | |
| 2 | +on: | |
| 3 | + pull_request: | |
| 4 | + types: | |
| 5 | + - opened | |
| 6 | + - synchronize | |
| 7 | + branches: | |
| 8 | + - master | |
| 9 | + push: | |
| 10 | + branches: | |
| 11 | + - master | |
| 12 | + | |
| 13 | +concurrency: | |
| 14 | + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
| 15 | + cancel-in-progress: true | |
| 16 | + | |
| 17 | +permissions: | |
| 18 | + contents: read # to fetch code (actions/checkout) | |
| 19 | + | |
| 20 | +jobs: | |
| 21 | + tests: | |
| 22 | + name: Run tests | |
| 23 | + runs-on: ubuntu-latest | |
| 24 | + if: github.repository == 'ohmyzsh/ohmyzsh' | |
| 25 | + steps: | |
| 26 | + - name: Set up git repository | |
| 27 | + uses: actions/checkout@v4 | |
| 28 | + - name: Install zsh | |
| 29 | + run: sudo apt-get update; sudo apt-get install zsh | |
| 30 | + - name: Check syntax | |
| 31 | + run: | | |
| 32 | + for file in ./oh-my-zsh.sh \ | |
| 33 | + ./lib/*.zsh \ | |
| 34 | + ./plugins/*/*.plugin.zsh \ | |
| 35 | + ./plugins/*/_* \ | |
| 36 | + ./themes/*.zsh-theme; do | |
| 37 | + zsh -n "$file" || return 1 | |
| 38 | + done |
+146-0.oh-my-zsh/.github/workflows/project.yml
| @@ -0,0 +1,146 @@ | ||
| 1 | +name: Project tracking | |
| 2 | +on: | |
| 3 | + issues: | |
| 4 | + types: [opened, reopened] | |
| 5 | + pull_request_target: | |
| 6 | + types: [opened, reopened, synchronize] | |
| 7 | + | |
| 8 | +concurrency: | |
| 9 | + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
| 10 | + cancel-in-progress: true | |
| 11 | + | |
| 12 | +permissions: {} | |
| 13 | +jobs: | |
| 14 | + add-to-project: | |
| 15 | + name: Add to project | |
| 16 | + runs-on: ubuntu-latest | |
| 17 | + if: github.repository == 'ohmyzsh/ohmyzsh' | |
| 18 | + steps: | |
| 19 | + - name: Authenticate as @ohmyzsh | |
| 20 | + id: generate_token | |
| 21 | + uses: ohmyzsh/github-app-token@v2 | |
| 22 | + with: | |
| 23 | + app_id: ${{ secrets.OHMYZSH_APP_ID }} | |
| 24 | + private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }} | |
| 25 | + - name: Store app token | |
| 26 | + run: echo "GH_TOKEN=${{ steps.generate_token.outputs.token }}" >> "$GITHUB_ENV" | |
| 27 | + - name: Read project data | |
| 28 | + env: | |
| 29 | + ORGANIZATION: ohmyzsh | |
| 30 | + PROJECT_NUMBER: "1" | |
| 31 | + run: | | |
| 32 | + # Get Project data | |
| 33 | + gh api graphql -f query=' | |
| 34 | + query($org: String!, $number: Int!) { | |
| 35 | + organization(login: $org){ | |
| 36 | + projectV2(number: $number) { | |
| 37 | + id | |
| 38 | + fields(first:20) { | |
| 39 | + nodes { | |
| 40 | + ... on ProjectV2Field { | |
| 41 | + id | |
| 42 | + name | |
| 43 | + } | |
| 44 | + } | |
| 45 | + } | |
| 46 | + } | |
| 47 | + } | |
| 48 | + }' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json | |
| 49 | + | |
| 50 | + # Parse project data | |
| 51 | + cat >> $GITHUB_ENV <<EOF | |
| 52 | + PROJECT_ID=$(jq '.data.organization.projectV2.id' project_data.json) | |
| 53 | + PLUGIN_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Plugin") | .id' project_data.json) | |
| 54 | + THEME_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Theme") | .id' project_data.json) | |
| 55 | + EOF | |
| 56 | + | |
| 57 | + - name: Add to project | |
| 58 | + env: | |
| 59 | + ISSUE_OR_PR_ID: ${{ github.event.issue.node_id || github.event.pull_request.node_id }} | |
| 60 | + run: | | |
| 61 | + item_id="$(gh api graphql -f query=' | |
| 62 | + mutation($project: ID!, $content: ID!) { | |
| 63 | + addProjectV2ItemById(input: {projectId: $project, contentId: $content}) { | |
| 64 | + item { | |
| 65 | + id | |
| 66 | + } | |
| 67 | + } | |
| 68 | + } | |
| 69 | + ' -f project=$PROJECT_ID -f content=$ISSUE_OR_PR_ID --jq '.data.addProjectV2ItemById.item.id')" | |
| 70 | + | |
| 71 | + echo "ITEM_ID=$item_id" >> $GITHUB_ENV | |
| 72 | + | |
| 73 | + - name: Classify Pull Request | |
| 74 | + if: github.event_name == 'pull_request_target' | |
| 75 | + run: | | |
| 76 | + touch plugins.list themes.list | |
| 77 | + | |
| 78 | + gh pr view ${{ github.event.pull_request.number }} \ | |
| 79 | + --repo ${{ github.repository }} \ | |
| 80 | + --json files --jq '.files.[].path' | awk -F/ ' | |
| 81 | + /^plugins\// { | |
| 82 | + plugins[$2] = 1 | |
| 83 | + } | |
| 84 | + /^themes\// { | |
| 85 | + gsub(/\.zsh-theme$/, "", $2) | |
| 86 | + themes[$2] = 1 | |
| 87 | + } | |
| 88 | + END { | |
| 89 | + for (plugin in plugins) { | |
| 90 | + print plugin >> "plugins.list" | |
| 91 | + } | |
| 92 | + for (theme in themes) { | |
| 93 | + print theme >> "themes.list" | |
| 94 | + } | |
| 95 | + } | |
| 96 | + ' | |
| 97 | + # If only one plugin is modified, add it to the plugin field | |
| 98 | + if [[ $(wc -l < plugins.list) = 1 ]]; then | |
| 99 | + echo "PLUGIN=$(cat plugins.list)" >> $GITHUB_ENV | |
| 100 | + fi | |
| 101 | + # If only one theme is modified, add it to the theme field | |
| 102 | + if [[ $(wc -l < themes.list) = 1 ]]; then | |
| 103 | + echo "THEME=$(cat themes.list)" >> $GITHUB_ENV | |
| 104 | + fi | |
| 105 | + | |
| 106 | + - name: Fill Pull Request fields in project | |
| 107 | + if: github.event_name == 'pull_request_target' | |
| 108 | + run: | | |
| 109 | + gh api graphql -f query=' | |
| 110 | + mutation ( | |
| 111 | + $project: ID! | |
| 112 | + $item: ID! | |
| 113 | + $plugin_field: ID! | |
| 114 | + $plugin_value: String! | |
| 115 | + $theme_field: ID! | |
| 116 | + $theme_value: String! | |
| 117 | + ) { | |
| 118 | + set_plugin: updateProjectV2ItemFieldValue(input: { | |
| 119 | + projectId: $project | |
| 120 | + itemId: $item | |
| 121 | + fieldId: $plugin_field | |
| 122 | + value: { | |
| 123 | + text: $plugin_value | |
| 124 | + } | |
| 125 | + }) { | |
| 126 | + projectV2Item { | |
| 127 | + id | |
| 128 | + } | |
| 129 | + } | |
| 130 | + set_theme: updateProjectV2ItemFieldValue(input: { | |
| 131 | + projectId: $project | |
| 132 | + itemId: $item | |
| 133 | + fieldId: $theme_field | |
| 134 | + value: { | |
| 135 | + text: $theme_value | |
| 136 | + } | |
| 137 | + }) { | |
| 138 | + projectV2Item { | |
| 139 | + id | |
| 140 | + } | |
| 141 | + } | |
| 142 | + } | |
| 143 | + ' -f project=$PROJECT_ID -f item=$ITEM_ID \ | |
| 144 | + -f plugin_field=$PLUGIN_FIELD_ID -f plugin_value=$PLUGIN \ | |
| 145 | + -f theme_field=$THEME_FIELD_ID -f theme_value=$THEME \ | |
| 146 | + --silent |
+15-0.oh-my-zsh/.gitignore
| @@ -0,0 +1,15 @@ | ||
| 1 | +# custom files | |
| 2 | +custom/ | |
| 3 | + | |
| 4 | +# temp files directories | |
| 5 | +cache/ | |
| 6 | +log/ | |
| 7 | +*.swp | |
| 8 | +.DS_Store | |
| 9 | + | |
| 10 | +# editor configs | |
| 11 | +.vscode | |
| 12 | +.idea | |
| 13 | + | |
| 14 | +# zcompile cached files | |
| 15 | +*.zwc |
+5-0.oh-my-zsh/.gitpod.Dockerfile
| @@ -0,0 +1,5 @@ | ||
| 1 | +FROM gitpod/workspace-full | |
| 2 | + | |
| 3 | +RUN sudo apt-get update && \ | |
| 4 | + sudo apt-get install -y zsh && \ | |
| 5 | + sudo rm -rf /var/lib/apt/lists/* |
+9-0.oh-my-zsh/.gitpod.yml
| @@ -0,0 +1,9 @@ | ||
| 1 | +image: | |
| 2 | + file: .gitpod.Dockerfile | |
| 3 | + | |
| 4 | +tasks: | |
| 5 | + - init: | | |
| 6 | + export EDITOR="command gp open -w" VISUAL="command gp open -w" | |
| 7 | + cp -f /workspace/ohmyzsh/templates/zshrc.zsh-template ~/.zshrc | |
| 8 | + ln -sf /workspace/ohmyzsh ~/.oh-my-zsh | |
| 9 | + command: exec zsh |
+4-0.oh-my-zsh/.prettierrc
| @@ -0,0 +1,4 @@ | ||
| 1 | +{ | |
| 2 | + "printWidth": 110, | |
| 3 | + "proseWrap": "always" | |
| 4 | +} |
+76-0.oh-my-zsh/CODE_OF_CONDUCT.md
| @@ -0,0 +1,76 @@ | ||
| 1 | +# Contributor Covenant Code of Conduct | |
| 2 | + | |
| 3 | +## Our Pledge | |
| 4 | + | |
| 5 | +In the interest of fostering an open and welcoming environment, we as | |
| 6 | +contributors and maintainers pledge to making participation in our project and | |
| 7 | +our community a harassment-free experience for everyone, regardless of age, body | |
| 8 | +size, disability, ethnicity, sex characteristics, gender identity and expression, | |
| 9 | +level of experience, education, socio-economic status, nationality, personal | |
| 10 | +appearance, race, religion, or sexual identity and orientation. | |
| 11 | + | |
| 12 | +## Our Standards | |
| 13 | + | |
| 14 | +Examples of behavior that contributes to creating a positive environment | |
| 15 | +include: | |
| 16 | + | |
| 17 | +* Using welcoming and inclusive language | |
| 18 | +* Being respectful of differing viewpoints and experiences | |
| 19 | +* Gracefully accepting constructive criticism | |
| 20 | +* Focusing on what is best for the community | |
| 21 | +* Showing empathy towards other community members | |
| 22 | + | |
| 23 | +Examples of unacceptable behavior by participants include: | |
| 24 | + | |
| 25 | +* The use of sexualized language or imagery and unwelcome sexual attention or | |
| 26 | + advances | |
| 27 | +* Trolling, insulting/derogatory comments, and personal or political attacks | |
| 28 | +* Public or private harassment | |
| 29 | +* Publishing others' private information, such as a physical or electronic | |
| 30 | + address, without explicit permission | |
| 31 | +* Other conduct which could reasonably be considered inappropriate in a | |
| 32 | + professional setting | |
| 33 | + | |
| 34 | +## Our Responsibilities | |
| 35 | + | |
| 36 | +Project maintainers are responsible for clarifying the standards of acceptable | |
| 37 | +behavior and are expected to take appropriate and fair corrective action in | |
| 38 | +response to any instances of unacceptable behavior. | |
| 39 | + | |
| 40 | +Project maintainers have the right and responsibility to remove, edit, or | |
| 41 | +reject comments, commits, code, wiki edits, issues, and other contributions | |
| 42 | +that are not aligned to this Code of Conduct, or to ban temporarily or | |
| 43 | +permanently any contributor for other behaviors that they deem inappropriate, | |
| 44 | +threatening, offensive, or harmful. | |
| 45 | + | |
| 46 | +## Scope | |
| 47 | + | |
| 48 | +This Code of Conduct applies within all project spaces, and it also applies when | |
| 49 | +an individual is representing the project or its community in public spaces. | |
| 50 | +Examples of representing a project or community include using an official | |
| 51 | +project e-mail address, posting via an official social media account, or acting | |
| 52 | +as an appointed representative at an online or offline event. Representation of | |
| 53 | +a project may be further defined and clarified by project maintainers. | |
| 54 | + | |
| 55 | +## Enforcement | |
| 56 | + | |
| 57 | +Instances of abusive, harassing, or otherwise unacceptable behavior may be | |
| 58 | +reported by contacting the project team at ohmyzsh@planetargon.com. All | |
| 59 | +complaints will be reviewed and investigated and will result in a response that | |
| 60 | +is deemed necessary and appropriate to the circumstances. The project team is | |
| 61 | +obligated to maintain confidentiality with regard to the reporter of an incident. | |
| 62 | +Further details of specific enforcement policies may be posted separately. | |
| 63 | + | |
| 64 | +Project maintainers who do not follow or enforce the Code of Conduct in good | |
| 65 | +faith may face temporary or permanent repercussions as determined by other | |
| 66 | +members of the project's leadership. | |
| 67 | + | |
| 68 | +## Attribution | |
| 69 | + | |
| 70 | +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, | |
| 71 | +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html | |
| 72 | + | |
| 73 | +[homepage]: https://www.contributor-covenant.org | |
| 74 | + | |
| 75 | +For answers to common questions about this code of conduct, see | |
| 76 | +https://www.contributor-covenant.org/faq |
+245-0.oh-my-zsh/CONTRIBUTING.md
| @@ -0,0 +1,245 @@ | ||
| 1 | +# CONTRIBUTING GUIDELINES | |
| 2 | + | |
| 3 | +Oh-My-Zsh is a community-driven project. Contribution is welcome, encouraged, and appreciated. | |
| 4 | +It is also essential for the development of the project. | |
| 5 | + | |
| 6 | +First, please take a moment to review our [code of conduct](CODE_OF_CONDUCT.md). | |
| 7 | + | |
| 8 | +These guidelines are an attempt at better addressing the huge amount of pending | |
| 9 | +issues and pull requests. Please read them closely. | |
| 10 | + | |
| 11 | +Foremost, be so kind as to [search](#use-the-search-luke). This ensures any contribution | |
| 12 | +you would make is not already covered. | |
| 13 | + | |
| 14 | +<!-- TOC updateonsave:true depthfrom:2 --> | |
| 15 | + | |
| 16 | +- [Reporting Issues](#reporting-issues) | |
| 17 | + - [You have a problem](#you-have-a-problem) | |
| 18 | + - [You have a suggestion](#you-have-a-suggestion) | |
| 19 | +- [Submitting Pull Requests](#submitting-pull-requests) | |
| 20 | + - [Getting started](#getting-started) | |
| 21 | + - [You have a solution](#you-have-a-solution) | |
| 22 | + - [You have an addition](#you-have-an-addition) | |
| 23 | +- [Use the Search, Luke](#use-the-search-luke) | |
| 24 | +- [Commit Guidelines](#commit-guidelines) | |
| 25 | + - [Format](#format) | |
| 26 | + - [Style](#style) | |
| 27 | +- [Volunteer](#volunteer) | |
| 28 | + | |
| 29 | +<!-- /TOC --> | |
| 30 | + | |
| 31 | +## Reporting Issues | |
| 32 | + | |
| 33 | +### You have a problem | |
| 34 | + | |
| 35 | +Please be so kind as to [search](#use-the-search-luke) for any open issue already covering | |
| 36 | +your problem. | |
| 37 | + | |
| 38 | +If you find one, comment on it, so we know more people are experiencing it. | |
| 39 | + | |
| 40 | +If not, look at the [Troubleshooting](https://github.com/ohmyzsh/ohmyzsh/wiki/Troubleshooting) | |
| 41 | +page for instructions on how to gather data to better debug your problem. | |
| 42 | + | |
| 43 | +Then, you can go ahead and create an issue with as much detail as you can provide. | |
| 44 | +It should include the data gathered as indicated above, along with the following: | |
| 45 | + | |
| 46 | +1. How to reproduce the problem | |
| 47 | +2. What the correct behavior should be | |
| 48 | +3. What the actual behavior is | |
| 49 | + | |
| 50 | +Please copy to anyone relevant (e.g. plugin maintainers) by mentioning their GitHub handle | |
| 51 | +(starting with `@`) in your message. | |
| 52 | + | |
| 53 | +We will do our very best to help you. | |
| 54 | + | |
| 55 | +### You have a suggestion | |
| 56 | + | |
| 57 | +Please be so kind as to [search](#use-the-search-luke) for any open issue already covering | |
| 58 | +your suggestion. | |
| 59 | + | |
| 60 | +If you find one, comment on it, so we know more people are supporting it. | |
| 61 | + | |
| 62 | +If not, you can go ahead and create an issue. Please copy to anyone relevant (e.g. plugin | |
| 63 | +maintainers) by mentioning their GitHub handle (starting with `@`) in your message. | |
| 64 | + | |
| 65 | +## Submitting Pull Requests | |
| 66 | + | |
| 67 | +### Getting started | |
| 68 | + | |
| 69 | +You should be familiar with the basics of | |
| 70 | +[contributing on GitHub](https://help.github.com/articles/using-pull-requests) and have a fork | |
| 71 | +[properly set up](https://github.com/ohmyzsh/ohmyzsh/wiki/Contribution-Technical-Practices). | |
| 72 | + | |
| 73 | +You MUST always create PRs with _a dedicated branch_ based on the latest upstream tree. | |
| 74 | + | |
| 75 | +If you create your own PR, please make sure you do it right. Also be so kind as to reference | |
| 76 | +any issue that would be solved in the PR description body, | |
| 77 | +[for instance](https://help.github.com/articles/closing-issues-via-commit-messages/) | |
| 78 | +_"Fixes #XXXX"_ for issue number XXXX. | |
| 79 | + | |
| 80 | +### You have a solution | |
| 81 | + | |
| 82 | +Please be so kind as to [search](#use-the-search-luke) for any open issue already covering | |
| 83 | +your [problem](#you-have-a-problem), and any pending/merged/rejected PR covering your solution. | |
| 84 | + | |
| 85 | +If the solution is already reported, try it out and +1 the pull request if the | |
| 86 | +solution works ok. On the other hand, if you think your solution is better, post | |
| 87 | +it with reference to the other one so we can have both solutions to compare. | |
| 88 | + | |
| 89 | +If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin | |
| 90 | +maintainers) by mentioning their GitHub handle (starting with `@`) in your message. | |
| 91 | + | |
| 92 | +### You have an addition | |
| 93 | + | |
| 94 | +Please [do not](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#dont-send-us-your-theme-for-now) | |
| 95 | +send themes for now. | |
| 96 | + | |
| 97 | +Please be so kind as to [search](#use-the-search-luke) for any pending, merged or rejected Pull Requests | |
| 98 | +covering or related to what you want to add. | |
| 99 | + | |
| 100 | +If you find one, try it out and work with the author on a common solution. | |
| 101 | + | |
| 102 | +If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin | |
| 103 | +maintainers) by mentioning their GitHub handle (starting with `@`) in your message. | |
| 104 | + | |
| 105 | +For any extensive change, such as a new plugin, you will have to find testers to +1 your PR. | |
| 106 | + | |
| 107 | +### New plugin aliases | |
| 108 | + | |
| 109 | +We acknowledge that aliases are a core part of Oh My Zsh. There are plugins that have +100 aliases! | |
| 110 | + | |
| 111 | +This has become an issue for two opposing reasons: | |
| 112 | + | |
| 113 | +- Some users want to have their personal aliases in Oh My Zsh. | |
| 114 | +- Some users don't want any aliases at all and feel that there are too many. | |
| 115 | + | |
| 116 | +Because of this, from now on, we require that new aliases follow these conditions: | |
| 117 | + | |
| 118 | +1. They will be used by many people, not just a few. | |
| 119 | +2. The aliases will be used many times and for common tasks. | |
| 120 | +3. Prefer one generic alias over many specific ones. | |
| 121 | +4. When justifying the need for an alias, talk about workflows where you'll use it, | |
| 122 | + preferably in combination with other aliases. | |
| 123 | +5. If a command with the same name exists, look for a different alias name. | |
| 124 | + | |
| 125 | +This list is not exhaustive! Please remember that your alias will be in the machines of many people, | |
| 126 | +so it should be justified why they should have it. | |
| 127 | + | |
| 128 | +---- | |
| 129 | + | |
| 130 | +## Use the Search, Luke | |
| 131 | + | |
| 132 | +_May the Force (of past experiences) be with you_ | |
| 133 | + | |
| 134 | +GitHub offers [many search features](https://help.github.com/articles/searching-github/) | |
| 135 | +to help you check whether a similar contribution to yours already exists. Please search | |
| 136 | +before making any contribution, it avoids duplicates and eases maintenance. Trust me, | |
| 137 | +that works 90% of the time. | |
| 138 | + | |
| 139 | +You can also take a look at the [FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ) | |
| 140 | +to be sure your contribution has not already come up. | |
| 141 | + | |
| 142 | +If all fails, your thing has probably not been reported yet, so you can go ahead | |
| 143 | +and [create an issue](#reporting-issues) or [submit a PR](#submitting-pull-requests). | |
| 144 | + | |
| 145 | +---- | |
| 146 | + | |
| 147 | +## Commit Guidelines | |
| 148 | + | |
| 149 | +Oh My Zsh uses the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) | |
| 150 | +specification. The automatic changelog tool uses these to automatically generate | |
| 151 | +a changelog based on the commit messages. Here's a guide to writing a commit message | |
| 152 | +to allow this: | |
| 153 | + | |
| 154 | +### Format | |
| 155 | + | |
| 156 | +``` | |
| 157 | +type(scope)!: subject | |
| 158 | +``` | |
| 159 | + | |
| 160 | +- `type`: the type of the commit is one of the following: | |
| 161 | + | |
| 162 | + - `feat`: new features. | |
| 163 | + - `fix`: bug fixes. | |
| 164 | + - `docs`: documentation changes. | |
| 165 | + - `refactor`: refactor of a particular code section without introducing | |
| 166 | + new features or bug fixes. | |
| 167 | + - `style`: code style improvements. | |
| 168 | + - `perf`: performance improvements. | |
| 169 | + - `test`: changes to the test suite. | |
| 170 | + - `ci`: changes to the CI system. | |
| 171 | + - `build`: changes to the build system (we don't yet have one so this shouldn't apply). | |
| 172 | + - `chore`: for other changes that don't match previous types. This doesn't appear | |
| 173 | + in the changelog. | |
| 174 | + | |
| 175 | +- `scope`: section of the codebase that the commit makes changes to. If it makes changes to | |
| 176 | + many sections, or if no section in particular is modified, leave blank without the parentheses. | |
| 177 | + Examples: | |
| 178 | + | |
| 179 | + - Commit that changes the `git` plugin: | |
| 180 | + ``` | |
| 181 | + feat(git): add alias for `git commit` | |
| 182 | + ``` | |
| 183 | + | |
| 184 | + - Commit that changes many plugins: | |
| 185 | + ``` | |
| 186 | + style: fix inline declaration of arrays | |
| 187 | + ``` | |
| 188 | + | |
| 189 | + For changes to plugins or themes, the scope should be the plugin or theme name: | |
| 190 | + | |
| 191 | + - โ `fix(agnoster): commit subject` | |
| 192 | + - โ `fix(theme/agnoster): commit subject` | |
| 193 | + | |
| 194 | +- `!`: this goes after the `scope` (or the `type` if scope is empty), to indicate that the commit | |
| 195 | + introduces breaking changes. | |
| 196 | + | |
| 197 | + Optionally, you can specify a message that the changelog tool will display to the user to indicate | |
| 198 | + what's changed and what they can do to deal with it. You can use multiple lines to type this message; | |
| 199 | + the changelog parser will keep reading until the end of the commit message or until it finds an empty | |
| 200 | + line. | |
| 201 | + | |
| 202 | + Example (made up): | |
| 203 | + | |
| 204 | + ``` | |
| 205 | + style(agnoster)!: change dirty git repo glyph | |
| 206 | + | |
| 207 | + BREAKING CHANGE: the glyph to indicate when a git repository is dirty has | |
| 208 | + changed from a Powerline character to a standard UTF-8 emoji. You can | |
| 209 | + change it back by setting `ZSH_THEME_DIRTY_GLYPH`. | |
| 210 | + | |
| 211 | + Fixes #420 | |
| 212 | + | |
| 213 | + Co-authored-by: Username <email> | |
| 214 | + ``` | |
| 215 | + | |
| 216 | +- `subject`: a brief description of the changes. This will be displayed in the changelog. If you need | |
| 217 | + to specify other details, you can use the commit body, but it won't be visible. | |
| 218 | + | |
| 219 | + Formatting tricks: the commit subject may contain: | |
| 220 | + | |
| 221 | + - Links to related issues or PRs by writing `#issue`. This will be highlighted by the changelog tool: | |
| 222 | + ``` | |
| 223 | + feat(archlinux): add support for aura AUR helper (#9467) | |
| 224 | + ``` | |
| 225 | + | |
| 226 | + - Formatted inline code by using backticks: the text between backticks will also be highlighted by | |
| 227 | + the changelog tool: | |
| 228 | + ``` | |
| 229 | + feat(shell-proxy): enable unexported `DEFAULT_PROXY` setting (#9774) | |
| 230 | + ``` | |
| 231 | + | |
| 232 | +### Style | |
| 233 | + | |
| 234 | +Try to keep the first commit line short. It's harder to do using this commit style but try to be | |
| 235 | +concise, and if you need more space, you can use the commit body. Try to make sure that the commit | |
| 236 | +subject is clear and precise enough that users will know what changed by just looking at the changelog. | |
| 237 | + | |
| 238 | +---- | |
| 239 | + | |
| 240 | +## Volunteer | |
| 241 | + | |
| 242 | +Very nice!! :) | |
| 243 | + | |
| 244 | +Please have a look at the [Volunteer](https://github.com/ohmyzsh/ohmyzsh/wiki/Volunteers) | |
| 245 | +page for instructions on where to start and more. |
+21-0.oh-my-zsh/LICENSE.txt
| @@ -0,0 +1,21 @@ | ||
| 1 | +MIT License | |
| 2 | + | |
| 3 | +Copyright (c) 2009-2022 Robby Russell and contributors (https://github.com/ohmyzsh/ohmyzsh/contributors) | |
| 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. |
+564-0.oh-my-zsh/README.md
| @@ -0,0 +1,564 @@ | ||
| 1 | +<p align="center"><img src="https://ohmyzsh.s3.amazonaws.com/omz-ansi-github.png" alt="Oh My Zsh"></p> | |
| 2 | + | |
| 3 | +Oh My Zsh is an open source, community-driven framework for managing your [zsh](https://www.zsh.org/) | |
| 4 | +configuration. | |
| 5 | + | |
| 6 | +Sounds boring. Let's try again. | |
| 7 | + | |
| 8 | +**Oh My Zsh will not make you a 10x developer...but you may feel like one.** | |
| 9 | + | |
| 10 | +Once installed, your terminal shell will become the talk of the town _or your money back!_ With each keystroke | |
| 11 | +in your command prompt, you'll take advantage of the hundreds of powerful plugins and beautiful themes. | |
| 12 | +Strangers will come up to you in cafรฉs and ask you, _"that is amazing! are you some sort of genius?"_ | |
| 13 | + | |
| 14 | +Finally, you'll begin to get the sort of attention that you have always felt you deserved. ...or maybe you'll | |
| 15 | +use the time that you're saving to start flossing more often. ๐ฌ | |
| 16 | + | |
| 17 | +To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://x.com/ohmyzsh) on X (formerly | |
| 18 | +Twitter), and join us on [Discord](https://discord.gg/ohmyzsh). | |
| 19 | + | |
| 20 | +[](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI) | |
| 21 | +[](https://twitter.com/intent/follow?screen_name=ohmyzsh) | |
| 22 | +[](https://mstdn.social/@ohmyzsh) | |
| 23 | +[](https://discord.gg/ohmyzsh) | |
| 24 | +[](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh) | |
| 25 | + | |
| 26 | +<details> | |
| 27 | +<summary>Table of Contents</summary> | |
| 28 | + | |
| 29 | +- [Getting Started](#getting-started) | |
| 30 | + - [Operating System Compatibility](#operating-system-compatibility) | |
| 31 | + - [Prerequisites](#prerequisites) | |
| 32 | + - [Basic Installation](#basic-installation) | |
| 33 | + - [Manual Inspection](#manual-inspection) | |
| 34 | +- [Using Oh My Zsh](#using-oh-my-zsh) | |
| 35 | + - [Plugins](#plugins) | |
| 36 | + - [Enabling Plugins](#enabling-plugins) | |
| 37 | + - [Using Plugins](#using-plugins) | |
| 38 | + - [Themes](#themes) | |
| 39 | + - [Selecting A Theme](#selecting-a-theme) | |
| 40 | + - [FAQ](#faq) | |
| 41 | +- [Advanced Topics](#advanced-topics) | |
| 42 | + - [Advanced Installation](#advanced-installation) | |
| 43 | + - [Custom Directory](#custom-directory) | |
| 44 | + - [Unattended Install](#unattended-install) | |
| 45 | + - [Installing From A Forked Repository](#installing-from-a-forked-repository) | |
| 46 | + - [Manual Installation](#manual-installation) | |
| 47 | + - [Installation Problems](#installation-problems) | |
| 48 | + - [Custom Plugins And Themes](#custom-plugins-and-themes) | |
| 49 | + - [Enable GNU ls In macOS And freeBSD Systems](#enable-gnu-ls-in-macos-and-freebsd-systems) | |
| 50 | + - [Skip Aliases](#skip-aliases) | |
| 51 | + - [Async git prompt](#async-git-prompt) | |
| 52 | +- [Getting Updates](#getting-updates) | |
| 53 | + - [Updates Verbosity](#updates-verbosity) | |
| 54 | + - [Manual Updates](#manual-updates) | |
| 55 | +- [Uninstalling Oh My Zsh](#uninstalling-oh-my-zsh) | |
| 56 | +- [How Do I Contribute To Oh My Zsh?](#how-do-i-contribute-to-oh-my-zsh) | |
| 57 | + - [Do Not Send Us Themes](#do-not-send-us-themes) | |
| 58 | +- [Contributors](#contributors) | |
| 59 | +- [Follow Us](#follow-us) | |
| 60 | +- [Merchandise](#merchandise) | |
| 61 | +- [License](#license) | |
| 62 | +- [About Planet Argon](#about-planet-argon) | |
| 63 | + | |
| 64 | +</details> | |
| 65 | + | |
| 66 | +## Getting Started | |
| 67 | + | |
| 68 | +### Operating System Compatibility | |
| 69 | + | |
| 70 | +| O/S | Status | | |
| 71 | +| :------------- | :----: | | |
| 72 | +| Android | โ | | |
| 73 | +| freeBSD | โ | | |
| 74 | +| LCARS | ๐ธ | | |
| 75 | +| Linux | โ | | |
| 76 | +| macOS | โ | | |
| 77 | +| OS/2 Warp | โ | | |
| 78 | +| Windows (WSL2) | โ | | |
| 79 | + | |
| 80 | +### Prerequisites | |
| 81 | + | |
| 82 | +- [Zsh](https://www.zsh.org) should be installed (v4.3.9 or more recent is fine but we prefer 5.0.8 and | |
| 83 | + newer). If not pre-installed (run `zsh --version` to confirm), check the following wiki instructions here: | |
| 84 | + [Installing ZSH](https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH) | |
| 85 | +- `curl` or `wget` should be installed | |
| 86 | +- `git` should be installed (recommended v2.4.11 or higher) | |
| 87 | + | |
| 88 | +### Basic Installation | |
| 89 | + | |
| 90 | +Oh My Zsh is installed by running one of the following commands in your terminal. You can install this via the | |
| 91 | +command-line with either `curl`, `wget` or another similar tool. | |
| 92 | + | |
| 93 | +| Method | Command | | |
| 94 | +| :-------- | :------------------------------------------------------------------------------------------------ | | |
| 95 | +| **curl** | `sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` | | |
| 96 | +| **wget** | `sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` | | |
| 97 | +| **fetch** | `sh -c "$(fetch -o - https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` | | |
| 98 | + | |
| 99 | +Alternatively, the installer is also mirrored outside GitHub. Using this URL instead may be required if you're | |
| 100 | +in a country like China or India (for certain ISPs), that blocks `raw.githubusercontent.com`: | |
| 101 | + | |
| 102 | +| Method | Command | | |
| 103 | +| :-------- | :------------------------------------------------ | | |
| 104 | +| **curl** | `sh -c "$(curl -fsSL https://install.ohmyz.sh/)"` | | |
| 105 | +| **wget** | `sh -c "$(wget -O- https://install.ohmyz.sh/)"` | | |
| 106 | +| **fetch** | `sh -c "$(fetch -o - https://install.ohmyz.sh/)"` | | |
| 107 | + | |
| 108 | +_Note that any previous `.zshrc` will be renamed to `.zshrc.pre-oh-my-zsh`. After installation, you can move | |
| 109 | +the configuration you want to preserve into the new `.zshrc`._ | |
| 110 | + | |
| 111 | +#### Manual Inspection | |
| 112 | + | |
| 113 | +It's a good idea to inspect the install script from projects you don't yet know. You can do that by | |
| 114 | +downloading the install script first, looking through it so everything looks normal, then running it: | |
| 115 | + | |
| 116 | +```sh | |
| 117 | +wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh | |
| 118 | +sh install.sh | |
| 119 | +``` | |
| 120 | + | |
| 121 | +If the above URL times out or otherwise fails, you may have to substitute the URL for | |
| 122 | +`https://install.ohmyz.sh` to be able to get the script. | |
| 123 | + | |
| 124 | +## Using Oh My Zsh | |
| 125 | + | |
| 126 | +### Plugins | |
| 127 | + | |
| 128 | +Oh My Zsh comes with a shitload of plugins for you to take advantage of. You can take a look in the | |
| 129 | +[plugins](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins) directory and/or the | |
| 130 | +[wiki](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins) to see what's currently available. | |
| 131 | + | |
| 132 | +#### Enabling Plugins | |
| 133 | + | |
| 134 | +Once you spot a plugin (or several) that you'd like to use with Oh My Zsh, you'll need to enable them in the | |
| 135 | +`.zshrc` file. You'll find the zshrc file in your `$HOME` directory. Open it with your favorite text editor | |
| 136 | +and you'll see a spot to list all the plugins you want to load. | |
| 137 | + | |
| 138 | +```sh | |
| 139 | +vi ~/.zshrc | |
| 140 | +``` | |
| 141 | + | |
| 142 | +For example, this might begin to look like this: | |
| 143 | + | |
| 144 | +```sh | |
| 145 | +plugins=( | |
| 146 | + git | |
| 147 | + bundler | |
| 148 | + dotenv | |
| 149 | + macos | |
| 150 | + rake | |
| 151 | + rbenv | |
| 152 | + ruby | |
| 153 | +) | |
| 154 | +``` | |
| 155 | + | |
| 156 | +_Note that the plugins are separated by whitespace (spaces, tabs, new lines...). **Do not** use commas between | |
| 157 | +them or it will break._ | |
| 158 | + | |
| 159 | +#### Using Plugins | |
| 160 | + | |
| 161 | +Each built-in plugin includes a **README**, documenting it. This README should show the aliases (if the plugin | |
| 162 | +adds any) and extra goodies that are included in that particular plugin. | |
| 163 | + | |
| 164 | +### Themes | |
| 165 | + | |
| 166 | +We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme-happy. We have over one | |
| 167 | +hundred and fifty themes now bundled. Most of them have | |
| 168 | +[screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!). | |
| 169 | +Check them out! | |
| 170 | + | |
| 171 | +#### Selecting A Theme | |
| 172 | + | |
| 173 | +_Robby's theme is the default one. It's not the fanciest one. It's not the simplest one. It's just the right | |
| 174 | +one (for him)._ | |
| 175 | + | |
| 176 | +Once you find a theme that you'd like to use, you will need to edit the `~/.zshrc` file. You'll see an | |
| 177 | +environment variable (all caps) in there that looks like: | |
| 178 | + | |
| 179 | +```sh | |
| 180 | +ZSH_THEME="robbyrussell" | |
| 181 | +``` | |
| 182 | + | |
| 183 | +To use a different theme, simply change the value to match the name of your desired theme. For example: | |
| 184 | + | |
| 185 | +```sh | |
| 186 | +ZSH_THEME="agnoster" # (this is one of the fancy ones) | |
| 187 | +# see https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#agnoster | |
| 188 | +``` | |
| 189 | + | |
| 190 | +<!-- prettier-ignore-start --> | |
| 191 | +> [!NOTE] | |
| 192 | +> You will many times see screenshots for a zsh theme, and try it out, and find that it doesn't look the same for you. | |
| 193 | +> | |
| 194 | +> This is because many themes require installing a [Powerline Font](https://github.com/powerline/fonts) or a | |
| 195 | +> [Nerd Font](https://github.com/ryanoasis/nerd-fonts) in order to render properly. Without them, these themes | |
| 196 | +> will render weird prompt symbols. Check out | |
| 197 | +> [the FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#i-have-a-weird-character-in-my-prompt) for more | |
| 198 | +> information. | |
| 199 | +> | |
| 200 | +> Also, beware that themes only control what your prompt looks like. This is, the text you see before or after | |
| 201 | +> your cursor, where you'll type your commands. Themes don't control things such as the colors of your | |
| 202 | +> terminal window (known as _color scheme_) or the font of your terminal. These are settings that you can | |
| 203 | +> change in your terminal emulator. For more information, see | |
| 204 | +> [what is a zsh theme](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#what-is-a-zsh-theme). | |
| 205 | +<!-- prettier-ignore-end --> | |
| 206 | + | |
| 207 | +Open up a new terminal window and your prompt should look something like this: | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | +In case you did not find a suitable theme for your needs, please have a look at the wiki for | |
| 212 | +[more of them](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes). | |
| 213 | + | |
| 214 | +If you're feeling feisty, you can let the computer select one randomly for you each time you open a new | |
| 215 | +terminal window. | |
| 216 | + | |
| 217 | +```sh | |
| 218 | +ZSH_THEME="random" # (...please let it be pie... please be some pie..) | |
| 219 | +``` | |
| 220 | + | |
| 221 | +And if you want to pick a random theme from a list of your favorite themes: | |
| 222 | + | |
| 223 | +```sh | |
| 224 | +ZSH_THEME_RANDOM_CANDIDATES=( | |
| 225 | + "robbyrussell" | |
| 226 | + "agnoster" | |
| 227 | +) | |
| 228 | +``` | |
| 229 | + | |
| 230 | +If you only know which themes you don't like, you can add them similarly to an ignored list: | |
| 231 | + | |
| 232 | +```sh | |
| 233 | +ZSH_THEME_RANDOM_IGNORED=(pygmalion tjkirch_mod) | |
| 234 | +``` | |
| 235 | + | |
| 236 | +### FAQ | |
| 237 | + | |
| 238 | +If you have some more questions or issues, you might find a solution in our | |
| 239 | +[FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ). | |
| 240 | + | |
| 241 | +## Advanced Topics | |
| 242 | + | |
| 243 | +If you're the type that likes to get their hands dirty, these sections might resonate. | |
| 244 | + | |
| 245 | +### Advanced Installation | |
| 246 | + | |
| 247 | +Some users may want to manually install Oh My Zsh, or change the default path or other settings that the | |
| 248 | +installer accepts (these settings are also documented at the top of the install script). | |
| 249 | + | |
| 250 | +#### Custom Directory | |
| 251 | + | |
| 252 | +The default location is `~/.oh-my-zsh` (hidden in your home directory, you can access it with | |
| 253 | +`cd ~/.oh-my-zsh`) | |
| 254 | + | |
| 255 | +If you'd like to change the install directory with the `ZSH` environment variable, either by running | |
| 256 | +`export ZSH=/your/path` before installing, or by setting it before the end of the install pipeline like this: | |
| 257 | + | |
| 258 | +```sh | |
| 259 | +ZSH="$HOME/.dotfiles/oh-my-zsh" sh install.sh | |
| 260 | +``` | |
| 261 | + | |
| 262 | +#### Unattended Install | |
| 263 | + | |
| 264 | +If you're running the Oh My Zsh install script as part of an automated install, you can pass the | |
| 265 | +`--unattended` flag to the `install.sh` script. This will have the effect of not trying to change the default | |
| 266 | +shell, and it also won't run `zsh` when the installation has finished. | |
| 267 | + | |
| 268 | +```sh | |
| 269 | +sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended | |
| 270 | +``` | |
| 271 | + | |
| 272 | +If you're in China, India, or another country that blocks `raw.githubusercontent.com`, you may have to | |
| 273 | +substitute the URL for `https://install.ohmyz.sh` for it to install. | |
| 274 | + | |
| 275 | +#### Installing From A Forked Repository | |
| 276 | + | |
| 277 | +The install script also accepts these variables to allow the installation of a different repository: | |
| 278 | + | |
| 279 | +- `REPO` (default: `ohmyzsh/ohmyzsh`): this takes the form of `owner/repository`. If you set this variable, | |
| 280 | + the installer will look for a repository at `https://github.com/{owner}/{repository}`. | |
| 281 | + | |
| 282 | +- `REMOTE` (default: `https://github.com/${REPO}.git`): this is the full URL of the git repository clone. You | |
| 283 | + can use this setting if you want to install from a fork that is not on GitHub (GitLab, Bitbucket...) or if | |
| 284 | + you want to clone with SSH instead of HTTPS (`git@github.com:user/project.git`). | |
| 285 | + | |
| 286 | + _NOTE: it's incompatible with setting the `REPO` variable. This setting will take precedence._ | |
| 287 | + | |
| 288 | +- `BRANCH` (default: `master`): you can use this setting if you want to change the default branch to be | |
| 289 | + checked out when cloning the repository. This might be useful for testing a Pull Request, or if you want to | |
| 290 | + use a branch other than `master`. | |
| 291 | + | |
| 292 | +For example: | |
| 293 | + | |
| 294 | +```sh | |
| 295 | +REPO=apjanke/oh-my-zsh BRANCH=edge sh install.sh | |
| 296 | +``` | |
| 297 | + | |
| 298 | +#### Manual Installation | |
| 299 | + | |
| 300 | +##### 1. Clone The Repository <!-- omit in toc --> | |
| 301 | + | |
| 302 | +```sh | |
| 303 | +git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh | |
| 304 | +``` | |
| 305 | + | |
| 306 | +##### 2. _Optionally_, Backup Your Existing `~/.zshrc` File <!-- omit in toc --> | |
| 307 | + | |
| 308 | +```sh | |
| 309 | +cp ~/.zshrc ~/.zshrc.orig | |
| 310 | +``` | |
| 311 | + | |
| 312 | +##### 3. Create A New Zsh Configuration File <!-- omit in toc --> | |
| 313 | + | |
| 314 | +You can create a new zsh config file by copying the template that we have included for you. | |
| 315 | + | |
| 316 | +```sh | |
| 317 | +cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc | |
| 318 | +``` | |
| 319 | + | |
| 320 | +##### 4. Change Your Default Shell <!-- omit in toc --> | |
| 321 | + | |
| 322 | +```sh | |
| 323 | +chsh -s $(which zsh) | |
| 324 | +``` | |
| 325 | + | |
| 326 | +You must log out from your user session and log back in to see this change. | |
| 327 | + | |
| 328 | +##### 5. Initialize Your New Zsh Configuration <!-- omit in toc --> | |
| 329 | + | |
| 330 | +Once you open up a new terminal window, it should load zsh with Oh My Zsh's configuration. | |
| 331 | + | |
| 332 | +### Installation Problems | |
| 333 | + | |
| 334 | +If you have any hiccups installing, here are a few common fixes. | |
| 335 | + | |
| 336 | +- You _might_ need to modify your `PATH` in `~/.zshrc` if you're not able to find some commands after | |
| 337 | + switching to `oh-my-zsh`. | |
| 338 | +- If you installed manually or changed the install location, check the `ZSH` environment variable in | |
| 339 | + `~/.zshrc`. | |
| 340 | + | |
| 341 | +### Custom Plugins And Themes | |
| 342 | + | |
| 343 | +If you want to override any of the default behaviors, just add a new file (ending in `.zsh`) in the `custom/` | |
| 344 | +directory. | |
| 345 | + | |
| 346 | +If you have many functions that go well together, you can put them as a `XYZ.plugin.zsh` file in the | |
| 347 | +`custom/plugins/` directory and then enable this plugin. | |
| 348 | + | |
| 349 | +If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the | |
| 350 | +same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`. | |
| 351 | + | |
| 352 | +### Enable GNU ls In macOS And freeBSD Systems | |
| 353 | + | |
| 354 | +<a name="enable-gnu-ls"></a> | |
| 355 | + | |
| 356 | +The default behaviour in Oh My Zsh is to use BSD `ls` in macOS and FreeBSD systems. If GNU `ls` is installed | |
| 357 | +(as `gls` command), you can choose to use it instead. To do it, you can use zstyle-based config before | |
| 358 | +sourcing `oh-my-zsh.sh`: | |
| 359 | + | |
| 360 | +```zsh | |
| 361 | +zstyle ':omz:lib:theme-and-appearance' gnu-ls yes | |
| 362 | +``` | |
| 363 | + | |
| 364 | +_Note: this is not compatible with `DISABLE_LS_COLORS=true`_ | |
| 365 | + | |
| 366 | +### Skip Aliases | |
| 367 | + | |
| 368 | +<a name="remove-directories-aliases"></a> | |
| 369 | + | |
| 370 | +If you want to skip default Oh My Zsh aliases (those defined in `lib/*` files) or plugin aliases, you can use | |
| 371 | +the settings below in your `~/.zshrc` file, **before Oh My Zsh is loaded**. Note that there are many different | |
| 372 | +ways to skip aliases, depending on your needs. | |
| 373 | + | |
| 374 | +```sh | |
| 375 | +# Skip all aliases, in lib files and enabled plugins | |
| 376 | +zstyle ':omz:*' aliases no | |
| 377 | + | |
| 378 | +# Skip all aliases in lib files | |
| 379 | +zstyle ':omz:lib:*' aliases no | |
| 380 | +# Skip only aliases defined in the directories.zsh lib file | |
| 381 | +zstyle ':omz:lib:directories' aliases no | |
| 382 | + | |
| 383 | +# Skip all plugin aliases | |
| 384 | +zstyle ':omz:plugins:*' aliases no | |
| 385 | +# Skip only the aliases from the git plugin | |
| 386 | +zstyle ':omz:plugins:git' aliases no | |
| 387 | +``` | |
| 388 | + | |
| 389 | +You can combine these in other ways taking into account that more specific scopes take precedence: | |
| 390 | + | |
| 391 | +```sh | |
| 392 | +# Skip all plugin aliases, except for the git plugin | |
| 393 | +zstyle ':omz:plugins:*' aliases no | |
| 394 | +zstyle ':omz:plugins:git' aliases yes | |
| 395 | +``` | |
| 396 | + | |
| 397 | +A previous version of this feature was using the setting below, which has been removed: | |
| 398 | + | |
| 399 | +```sh | |
| 400 | +zstyle ':omz:directories' aliases no | |
| 401 | +``` | |
| 402 | + | |
| 403 | +Instead, you can now use the following: | |
| 404 | + | |
| 405 | +```sh | |
| 406 | +zstyle ':omz:lib:directories' aliases no | |
| 407 | +``` | |
| 408 | + | |
| 409 | +#### Notice <!-- omit in toc --> | |
| 410 | + | |
| 411 | +> This feature is currently in a testing phase and it may be subject to change in the future. It is also not | |
| 412 | +> currently compatible with plugin managers such as zpm or zinit, which don't source the init script | |
| 413 | +> (`oh-my-zsh.sh`) where this feature is implemented in. | |
| 414 | + | |
| 415 | +> It is also not currently aware of "aliases" that are defined as functions. Example of such are `gccd`, | |
| 416 | +> `ggf`, or `ggl` functions from the git plugin. | |
| 417 | + | |
| 418 | +### Async git prompt | |
| 419 | + | |
| 420 | +Async prompt functions are an experimental feature (included on April 3, 2024) that allows Oh My Zsh to render | |
| 421 | +prompt information asynchronously. This can improve prompt rendering performance, but it might not work well | |
| 422 | +with some setups. We hope that's not an issue, but if you're seeing problems with this new feature, you can | |
| 423 | +turn it off by setting the following in your .zshrc file, before Oh My Zsh is sourced: | |
| 424 | + | |
| 425 | +```sh | |
| 426 | +zstyle ':omz:alpha:lib:git' async-prompt no | |
| 427 | +``` | |
| 428 | + | |
| 429 | +If your problem is that the git prompt just stopped appearing, you can try to force it by setting the following | |
| 430 | +configuration before `oh-my-zsh.sh` is sourced. If it still does not work, please open an issue with your | |
| 431 | +case. | |
| 432 | + | |
| 433 | +```sh | |
| 434 | +zstyle ':omz:alpha:lib:git' async-prompt force | |
| 435 | +``` | |
| 436 | + | |
| 437 | +## Getting Updates | |
| 438 | + | |
| 439 | +By default, you will be prompted to check for updates every 2 weeks. You can choose other update modes by | |
| 440 | +adding a line to your `~/.zshrc` file, **before Oh My Zsh is loaded**: | |
| 441 | + | |
| 442 | +1. Automatic update without confirmation prompt: | |
| 443 | + | |
| 444 | + ```sh | |
| 445 | + zstyle ':omz:update' mode auto | |
| 446 | + ``` | |
| 447 | + | |
| 448 | +2. Just offer a reminder every few days, if there are updates available: | |
| 449 | + | |
| 450 | + ```sh | |
| 451 | + zstyle ':omz:update' mode reminder | |
| 452 | + ``` | |
| 453 | + | |
| 454 | +3. To disable automatic updates entirely: | |
| 455 | + | |
| 456 | + ```sh | |
| 457 | + zstyle ':omz:update' mode disabled | |
| 458 | + ``` | |
| 459 | + | |
| 460 | +NOTE: you can control how often Oh My Zsh checks for updates with the following setting: | |
| 461 | + | |
| 462 | +```sh | |
| 463 | +# This will check for updates every 7 days | |
| 464 | +zstyle ':omz:update' frequency 7 | |
| 465 | +# This will check for updates every time you open the terminal (not recommended) | |
| 466 | +zstyle ':omz:update' frequency 0 | |
| 467 | +``` | |
| 468 | + | |
| 469 | +### Updates Verbosity | |
| 470 | + | |
| 471 | +You can also limit the update verbosity with the following settings: | |
| 472 | + | |
| 473 | +```sh | |
| 474 | +zstyle ':omz:update' verbose default # default update prompt | |
| 475 | + | |
| 476 | +zstyle ':omz:update' verbose minimal # only few lines | |
| 477 | + | |
| 478 | +zstyle ':omz:update' verbose silent # only errors | |
| 479 | +``` | |
| 480 | + | |
| 481 | +### Manual Updates | |
| 482 | + | |
| 483 | +If you'd like to update at any point in time (maybe someone just released a new plugin and you don't want to | |
| 484 | +wait a week?) you just need to run: | |
| 485 | + | |
| 486 | +```sh | |
| 487 | +omz update | |
| 488 | +``` | |
| 489 | + | |
| 490 | +> [!NOTE] | |
| 491 | +> If you want to automate this process in a script, you should call directly the `upgrade` script, like this: | |
| 492 | +> | |
| 493 | +> ```sh | |
| 494 | +> $ZSH/tools/upgrade.sh | |
| 495 | +> ``` | |
| 496 | +> | |
| 497 | +> See more options in the [FAQ: How do I update Oh My Zsh?](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#how-do-i-update-oh-my-zsh). | |
| 498 | +> | |
| 499 | +> **USE OF `omz update --unattended` HAS BEEN REMOVED, AS IT HAS SIDE EFFECTS**. | |
| 500 | + | |
| 501 | +Magic! ๐ | |
| 502 | + | |
| 503 | +## Uninstalling Oh My Zsh | |
| 504 | + | |
| 505 | +Oh My Zsh isn't for everyone. We'll miss you, but we want to make this an easy breakup. | |
| 506 | + | |
| 507 | +If you want to uninstall `oh-my-zsh`, just run `uninstall_oh_my_zsh` from the command-line. It will remove | |
| 508 | +itself and revert your previous `bash` or `zsh` configuration. | |
| 509 | + | |
| 510 | +## How Do I Contribute To Oh My Zsh? | |
| 511 | + | |
| 512 | +Before you participate in our delightful community, please read the [code of conduct](CODE_OF_CONDUCT.md). | |
| 513 | + | |
| 514 | +I'm far from being a [Zsh](https://www.zsh.org/) expert and suspect there are many ways to improve โ if you | |
| 515 | +have ideas on how to make the configuration easier to maintain (and faster), don't hesitate to fork and send | |
| 516 | +pull requests! | |
| 517 | + | |
| 518 | +We also need people to test out pull requests. So take a look through | |
| 519 | +[the open issues](https://github.com/ohmyzsh/ohmyzsh/issues) and help where you can. | |
| 520 | + | |
| 521 | +See [Contributing](CONTRIBUTING.md) for more details. | |
| 522 | + | |
| 523 | +### Do Not Send Us Themes | |
| 524 | + | |
| 525 | +We have (more than) enough themes for the time being. Please add your theme to the | |
| 526 | +[external themes](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes) wiki page. | |
| 527 | + | |
| 528 | +## Contributors | |
| 529 | + | |
| 530 | +Oh My Zsh has a vibrant community of happy users and delightful contributors. Without all the time and help | |
| 531 | +from our contributors, it wouldn't be so awesome. | |
| 532 | + | |
| 533 | +Thank you so much! | |
| 534 | + | |
| 535 | +<a href="https://github.com/ohmyzsh/ohmyzsh/graphs/contributors"> | |
| 536 | + <img src="https://contrib.rocks/image?repo=ohmyzsh/ohmyzsh" width="100%"/> | |
| 537 | +</a> | |
| 538 | + | |
| 539 | +## Follow Us | |
| 540 | + | |
| 541 | +We're on social media: | |
| 542 | + | |
| 543 | +- [@ohmyzsh](https://x.com/ohmyzsh) on X (formerly Twitter). You should follow it. | |
| 544 | +- [Facebook](https://www.facebook.com/Oh-My-Zsh-296616263819290/) poke us. | |
| 545 | +- [Instagram](https://www.instagram.com/_ohmyzsh/) tag us in your post showing Oh My Zsh! | |
| 546 | +- [Discord](https://discord.gg/ohmyzsh) to chat with us! | |
| 547 | + | |
| 548 | +## Merchandise | |
| 549 | + | |
| 550 | +We have | |
| 551 | +[stickers, shirts, and coffee mugs available](https://shop.planetargon.com/collections/oh-my-zsh?utm_source=github) | |
| 552 | +for you to show off your love of Oh My Zsh. Again, you will become the talk of the town! | |
| 553 | + | |
| 554 | +## License | |
| 555 | + | |
| 556 | +Oh My Zsh is released under the [MIT license](LICENSE.txt). | |
| 557 | + | |
| 558 | +## About Planet Argon | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | +Oh My Zsh was started by the team at [Planet Argon](https://www.planetargon.com/?utm_source=github), a | |
| 563 | +[Ruby on Rails development agency](https://www.planetargon.com/services/ruby-on-rails-development?utm_source=github). | |
| 564 | +Check out our [other open source projects](https://www.planetargon.com/open-source?utm_source=github). |
+23-0.oh-my-zsh/SECURITY.md
| @@ -0,0 +1,23 @@ | ||
| 1 | +# Security Policy | |
| 2 | + | |
| 3 | +## Supported Versions | |
| 4 | + | |
| 5 | +At the moment Oh My Zsh only considers the very latest commit to be supported. | |
| 6 | +We combine that with our fast response to incidents and the automated updates | |
| 7 | +to minimize the time between vulnerability publication and patch release. | |
| 8 | + | |
| 9 | +| Version | Supported | | |
| 10 | +|:-------------- |:------------------ | | |
| 11 | +| master | :white_check_mark: | | |
| 12 | +| other commits | :x: | | |
| 13 | + | |
| 14 | +In the near future we will introduce versioning, so expect this section to change. | |
| 15 | + | |
| 16 | +## Reporting a Vulnerability | |
| 17 | + | |
| 18 | +**Do not submit an issue or pull request**: this might reveal the vulnerability. | |
| 19 | + | |
| 20 | +Instead, you should use the form to [privately report a vulnerability to us via GitHub](https://github.com/ohmyzsh/ohmyzsh/security/advisories/new) | |
| 21 | +or email the maintainers directly at: [**security@ohmyz.sh**](mailto:security@ohmyz.sh). | |
| 22 | + | |
| 23 | +We will deal with the vulnerability privately and submit a patch as soon as possible. |
+145-0.oh-my-zsh/lib/async_prompt.zsh
| @@ -0,0 +1,145 @@ | ||
| 1 | +# The async code is taken from | |
| 2 | +# https://github.com/zsh-users/zsh-autosuggestions/blob/master/src/async.zsh | |
| 3 | +# https://github.com/woefe/git-prompt.zsh/blob/master/git-prompt.zsh | |
| 4 | + | |
| 5 | +zmodload zsh/system | |
| 6 | +autoload -Uz is-at-least | |
| 7 | + | |
| 8 | +# For now, async prompt function handlers are set up like so: | |
| 9 | +# First, define the async function handler and register the handler | |
| 10 | +# with _omz_register_handler: | |
| 11 | +# | |
| 12 | +# function _git_prompt_status_async { | |
| 13 | +# # Do some expensive operation that outputs to stdout | |
| 14 | +# } | |
| 15 | +# _omz_register_handler _git_prompt_status_async | |
| 16 | +# | |
| 17 | +# Then add a stub prompt function in `$PROMPT` or similar prompt variables, | |
| 18 | +# which will show the output of "$_OMZ_ASYNC_OUTPUT[handler_name]": | |
| 19 | +# | |
| 20 | +# function git_prompt_status { | |
| 21 | +# echo -n $_OMZ_ASYNC_OUTPUT[_git_prompt_status_async] | |
| 22 | +# } | |
| 23 | +# | |
| 24 | +# RPROMPT='$(git_prompt_status)' | |
| 25 | +# | |
| 26 | +# This API is subject to change and optimization. Rely on it at your own risk. | |
| 27 | + | |
| 28 | +function _omz_register_handler { | |
| 29 | + setopt localoptions noksharrays unset | |
| 30 | + typeset -ga _omz_async_functions | |
| 31 | + # we want to do nothing if there's no $1 function or we already set it up | |
| 32 | + if [[ -z "$1" ]] || (( ! ${+functions[$1]} )) \ | |
| 33 | + || (( ${_omz_async_functions[(Ie)$1]} )); then | |
| 34 | + return | |
| 35 | + fi | |
| 36 | + _omz_async_functions+=("$1") | |
| 37 | + # let's add the hook to async_request if it's not there yet | |
| 38 | + if (( ! ${precmd_functions[(Ie)_omz_async_request]} )) \ | |
| 39 | + && (( ${+functions[_omz_async_request]})); then | |
| 40 | + autoload -Uz add-zsh-hook | |
| 41 | + add-zsh-hook precmd _omz_async_request | |
| 42 | + fi | |
| 43 | +} | |
| 44 | + | |
| 45 | +# Set up async handlers and callbacks | |
| 46 | +function _omz_async_request { | |
| 47 | + setopt localoptions noksharrays unset | |
| 48 | + local -i ret=$? | |
| 49 | + typeset -gA _OMZ_ASYNC_FDS _OMZ_ASYNC_PIDS _OMZ_ASYNC_OUTPUT | |
| 50 | + | |
| 51 | + # executor runs a subshell for all async requests based on key | |
| 52 | + local handler | |
| 53 | + for handler in ${_omz_async_functions}; do | |
| 54 | + (( ${+functions[$handler]} )) || continue | |
| 55 | + | |
| 56 | + local fd=${_OMZ_ASYNC_FDS[$handler]:--1} | |
| 57 | + local pid=${_OMZ_ASYNC_PIDS[$handler]:--1} | |
| 58 | + | |
| 59 | + # If we've got a pending request, cancel it | |
| 60 | + if (( fd != -1 && pid != -1 )) && { true <&$fd } 2>/dev/null; then | |
| 61 | + # Close the file descriptor and remove the handler | |
| 62 | + exec {fd}<&- | |
| 63 | + zle -F $fd | |
| 64 | + | |
| 65 | + # Zsh will make a new process group for the child process only if job | |
| 66 | + # control is enabled (MONITOR option) | |
| 67 | + if [[ -o MONITOR ]]; then | |
| 68 | + # Send the signal to the process group to kill any processes that may | |
| 69 | + # have been forked by the async function handler | |
| 70 | + kill -TERM -$pid 2>/dev/null | |
| 71 | + else | |
| 72 | + # Kill just the child process since it wasn't placed in a new process | |
| 73 | + # group. If the async function handler forked any child processes they may | |
| 74 | + # be orphaned and left behind. | |
| 75 | + kill -TERM $pid 2>/dev/null | |
| 76 | + fi | |
| 77 | + fi | |
| 78 | + | |
| 79 | + # Define global variables to store the file descriptor, PID and output | |
| 80 | + _OMZ_ASYNC_FDS[$handler]=-1 | |
| 81 | + _OMZ_ASYNC_PIDS[$handler]=-1 | |
| 82 | + | |
| 83 | + # Fork a process to fetch the git status and open a pipe to read from it | |
| 84 | + exec {fd}< <( | |
| 85 | + # Tell parent process our PID | |
| 86 | + builtin echo ${sysparams[pid]} | |
| 87 | + # Set exit code for the handler if used | |
| 88 | + () { return $ret } | |
| 89 | + # Run the async function handler | |
| 90 | + $handler | |
| 91 | + ) | |
| 92 | + | |
| 93 | + # Save FD for handler | |
| 94 | + _OMZ_ASYNC_FDS[$handler]=$fd | |
| 95 | + | |
| 96 | + # There's a weird bug here where ^C stops working unless we force a fork | |
| 97 | + # See https://github.com/zsh-users/zsh-autosuggestions/issues/364 | |
| 98 | + # and https://github.com/zsh-users/zsh-autosuggestions/pull/612 | |
| 99 | + is-at-least 5.8 || command true | |
| 100 | + | |
| 101 | + # Save the PID from the handler child process | |
| 102 | + read -u $fd "_OMZ_ASYNC_PIDS[$handler]" | |
| 103 | + | |
| 104 | + # When the fd is readable, call the response handler | |
| 105 | + zle -F "$fd" _omz_async_callback | |
| 106 | + done | |
| 107 | +} | |
| 108 | + | |
| 109 | +# Called when new data is ready to be read from the pipe | |
| 110 | +function _omz_async_callback() { | |
| 111 | + emulate -L zsh | |
| 112 | + | |
| 113 | + local fd=$1 # First arg will be fd ready for reading | |
| 114 | + local err=$2 # Second arg will be passed in case of error | |
| 115 | + | |
| 116 | + if [[ -z "$err" || "$err" == "hup" ]]; then | |
| 117 | + # Get handler name from fd | |
| 118 | + local handler="${(k)_OMZ_ASYNC_FDS[(r)$fd]}" | |
| 119 | + | |
| 120 | + # Store old output which is supposed to be already printed | |
| 121 | + local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}" | |
| 122 | + | |
| 123 | + # Read output from fd | |
| 124 | + IFS= read -r -u $fd -d '' "_OMZ_ASYNC_OUTPUT[$handler]" | |
| 125 | + | |
| 126 | + # Repaint prompt if output has changed | |
| 127 | + if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then | |
| 128 | + zle .reset-prompt | |
| 129 | + zle -R | |
| 130 | + fi | |
| 131 | + | |
| 132 | + # Close the fd | |
| 133 | + exec {fd}<&- | |
| 134 | + fi | |
| 135 | + | |
| 136 | + # Always remove the handler | |
| 137 | + zle -F "$fd" | |
| 138 | + | |
| 139 | + # Unset global FD variable to prevent closing user created FDs in the precmd hook | |
| 140 | + _OMZ_ASYNC_FDS[$handler]=-1 | |
| 141 | + _OMZ_ASYNC_PIDS[$handler]=-1 | |
| 142 | +} | |
| 143 | + | |
| 144 | +autoload -Uz add-zsh-hook | |
| 145 | +add-zsh-hook precmd _omz_async_request |
+14-0.oh-my-zsh/lib/bzr.zsh
| @@ -0,0 +1,14 @@ | ||
| 1 | +## Bazaar integration | |
| 2 | +## Just works with the GIT integration. Add $(bzr_prompt_info) to the PROMPT | |
| 3 | +function bzr_prompt_info() { | |
| 4 | + local bzr_branch | |
| 5 | + bzr_branch=$(bzr nick 2>/dev/null) || return | |
| 6 | + | |
| 7 | + if [[ -n "$bzr_branch" ]]; then | |
| 8 | + local bzr_dirty="" | |
| 9 | + if [[ -n $(bzr status 2>/dev/null) ]]; then | |
| 10 | + bzr_dirty=" %{$fg[red]%}*%{$reset_color%}" | |
| 11 | + fi | |
| 12 | + printf "%s%s%s%s" "$ZSH_THEME_SCM_PROMPT_PREFIX" "bzr::${bzr_branch##*:}" "$bzr_dirty" "$ZSH_THEME_GIT_PROMPT_SUFFIX" | |
| 13 | + fi | |
| 14 | +} |
+878-0.oh-my-zsh/lib/cli.zsh
| @@ -0,0 +1,878 @@ | ||
| 1 | +#!/usr/bin/env zsh | |
| 2 | + | |
| 3 | +function omz { | |
| 4 | + setopt localoptions noksharrays | |
| 5 | + [[ $# -gt 0 ]] || { | |
| 6 | + _omz::help | |
| 7 | + return 1 | |
| 8 | + } | |
| 9 | + | |
| 10 | + local command="$1" | |
| 11 | + shift | |
| 12 | + | |
| 13 | + # Subcommand functions start with _ so that they don't | |
| 14 | + # appear as completion entries when looking for `omz` | |
| 15 | + (( ${+functions[_omz::$command]} )) || { | |
| 16 | + _omz::help | |
| 17 | + return 1 | |
| 18 | + } | |
| 19 | + | |
| 20 | + _omz::$command "$@" | |
| 21 | +} | |
| 22 | + | |
| 23 | +function _omz { | |
| 24 | + local -a cmds subcmds | |
| 25 | + cmds=( | |
| 26 | + 'changelog:Print the changelog' | |
| 27 | + 'help:Usage information' | |
| 28 | + 'plugin:Manage plugins' | |
| 29 | + 'pr:Manage Oh My Zsh Pull Requests' | |
| 30 | + 'reload:Reload the current zsh session' | |
| 31 | + 'theme:Manage themes' | |
| 32 | + 'update:Update Oh My Zsh' | |
| 33 | + 'version:Show the version' | |
| 34 | + ) | |
| 35 | + | |
| 36 | + if (( CURRENT == 2 )); then | |
| 37 | + _describe 'command' cmds | |
| 38 | + elif (( CURRENT == 3 )); then | |
| 39 | + case "$words[2]" in | |
| 40 | + changelog) local -a refs | |
| 41 | + refs=("${(@f)$(builtin cd -q "$ZSH"; command git for-each-ref --format="%(refname:short):%(subject)" refs/heads refs/tags)}") | |
| 42 | + _describe 'command' refs ;; | |
| 43 | + plugin) subcmds=( | |
| 44 | + 'disable:Disable plugin(s)' | |
| 45 | + 'enable:Enable plugin(s)' | |
| 46 | + 'info:Get plugin information' | |
| 47 | + 'list:List plugins' | |
| 48 | + 'load:Load plugin(s)' | |
| 49 | + ) | |
| 50 | + _describe 'command' subcmds ;; | |
| 51 | + pr) subcmds=('clean:Delete all Pull Request branches' 'test:Test a Pull Request') | |
| 52 | + _describe 'command' subcmds ;; | |
| 53 | + theme) subcmds=('list:List themes' 'set:Set a theme in your .zshrc file' 'use:Load a theme') | |
| 54 | + _describe 'command' subcmds ;; | |
| 55 | + esac | |
| 56 | + elif (( CURRENT == 4 )); then | |
| 57 | + case "${words[2]}::${words[3]}" in | |
| 58 | + plugin::(disable|enable|load)) | |
| 59 | + local -aU valid_plugins | |
| 60 | + | |
| 61 | + if [[ "${words[3]}" = disable ]]; then | |
| 62 | + # if command is "disable", only offer already enabled plugins | |
| 63 | + valid_plugins=($plugins) | |
| 64 | + else | |
| 65 | + valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t)) | |
| 66 | + # if command is "enable", remove already enabled plugins | |
| 67 | + [[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins}) | |
| 68 | + fi | |
| 69 | + | |
| 70 | + _describe 'plugin' valid_plugins ;; | |
| 71 | + plugin::info) | |
| 72 | + local -aU plugins | |
| 73 | + plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t)) | |
| 74 | + _describe 'plugin' plugins ;; | |
| 75 | + theme::(set|use)) | |
| 76 | + local -aU themes | |
| 77 | + themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::)) | |
| 78 | + _describe 'theme' themes ;; | |
| 79 | + esac | |
| 80 | + elif (( CURRENT > 4 )); then | |
| 81 | + case "${words[2]}::${words[3]}" in | |
| 82 | + plugin::(enable|disable|load)) | |
| 83 | + local -aU valid_plugins | |
| 84 | + | |
| 85 | + if [[ "${words[3]}" = disable ]]; then | |
| 86 | + # if command is "disable", only offer already enabled plugins | |
| 87 | + valid_plugins=($plugins) | |
| 88 | + else | |
| 89 | + valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t)) | |
| 90 | + # if command is "enable", remove already enabled plugins | |
| 91 | + [[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins}) | |
| 92 | + fi | |
| 93 | + | |
| 94 | + # Remove plugins already passed as arguments | |
| 95 | + # NOTE: $(( CURRENT - 1 )) is the last plugin argument completely passed, i.e. that which | |
| 96 | + # has a space after them. This is to avoid removing plugins partially passed, which makes | |
| 97 | + # the completion not add a space after the completed plugin. | |
| 98 | + local -a args | |
| 99 | + args=(${words[4,$(( CURRENT - 1))]}) | |
| 100 | + valid_plugins=(${valid_plugins:|args}) | |
| 101 | + | |
| 102 | + _describe 'plugin' valid_plugins ;; | |
| 103 | + esac | |
| 104 | + fi | |
| 105 | + | |
| 106 | + return 0 | |
| 107 | +} | |
| 108 | + | |
| 109 | +# If run from a script, do not set the completion function | |
| 110 | +if (( ${+functions[compdef]} )); then | |
| 111 | + compdef _omz omz | |
| 112 | +fi | |
| 113 | + | |
| 114 | +## Utility functions | |
| 115 | + | |
| 116 | +function _omz::confirm { | |
| 117 | + # If question supplied, ask it before reading the answer | |
| 118 | + # NOTE: uses the logname of the caller function | |
| 119 | + if [[ -n "$1" ]]; then | |
| 120 | + _omz::log prompt "$1" "${${functrace[1]#_}%:*}" | |
| 121 | + fi | |
| 122 | + | |
| 123 | + # Read one character | |
| 124 | + read -r -k 1 | |
| 125 | + | |
| 126 | + # If no newline entered, add a newline | |
| 127 | + if [[ "$REPLY" != $'\n' ]]; then | |
| 128 | + echo | |
| 129 | + fi | |
| 130 | +} | |
| 131 | + | |
| 132 | +function _omz::log { | |
| 133 | + # if promptsubst is set, a message with `` or $() | |
| 134 | + # will be run even if quoted due to `print -P` | |
| 135 | + setopt localoptions nopromptsubst | |
| 136 | + | |
| 137 | + # $1 = info|warn|error|debug | |
| 138 | + # $2 = text | |
| 139 | + # $3 = (optional) name of the logger | |
| 140 | + | |
| 141 | + local logtype=$1 | |
| 142 | + local logname=${3:-${${functrace[1]#_}%:*}} | |
| 143 | + | |
| 144 | + # Don't print anything if debug is not active | |
| 145 | + if [[ $logtype = debug && -z $_OMZ_DEBUG ]]; then | |
| 146 | + return | |
| 147 | + fi | |
| 148 | + | |
| 149 | + # Choose coloring based on log type | |
| 150 | + case "$logtype" in | |
| 151 | + prompt) print -Pn "%S%F{blue}$logname%f%s: $2" ;; | |
| 152 | + debug) print -P "%F{white}$logname%f: $2" ;; | |
| 153 | + info) print -P "%F{green}$logname%f: $2" ;; | |
| 154 | + warn) print -P "%S%F{yellow}$logname%f%s: $2" ;; | |
| 155 | + error) print -P "%S%F{red}$logname%f%s: $2" ;; | |
| 156 | + esac >&2 | |
| 157 | +} | |
| 158 | + | |
| 159 | +## User-facing commands | |
| 160 | + | |
| 161 | +function _omz::help { | |
| 162 | + cat >&2 <<EOF | |
| 163 | +Usage: omz <command> [options] | |
| 164 | + | |
| 165 | +Available commands: | |
| 166 | + | |
| 167 | + help Print this help message | |
| 168 | + changelog Print the changelog | |
| 169 | + plugin <command> Manage plugins | |
| 170 | + pr <command> Manage Oh My Zsh Pull Requests | |
| 171 | + reload Reload the current zsh session | |
| 172 | + theme <command> Manage themes | |
| 173 | + update Update Oh My Zsh | |
| 174 | + version Show the version | |
| 175 | + | |
| 176 | +EOF | |
| 177 | +} | |
| 178 | + | |
| 179 | +function _omz::changelog { | |
| 180 | + local version=${1:-HEAD} format=${3:-"--text"} | |
| 181 | + | |
| 182 | + if ( | |
| 183 | + builtin cd -q "$ZSH" | |
| 184 | + ! command git show-ref --verify refs/heads/$version && \ | |
| 185 | + ! command git show-ref --verify refs/tags/$version && \ | |
| 186 | + ! command git rev-parse --verify "${version}^{commit}" | |
| 187 | + ) &>/dev/null; then | |
| 188 | + cat >&2 <<EOF | |
| 189 | +Usage: ${(j: :)${(s.::.)0#_}} [version] | |
| 190 | + | |
| 191 | +NOTE: <version> must be a valid branch, tag or commit. | |
| 192 | +EOF | |
| 193 | + return 1 | |
| 194 | + fi | |
| 195 | + | |
| 196 | + ZSH="$ZSH" command zsh -f "$ZSH/tools/changelog.sh" "$version" "${2:-}" "$format" | |
| 197 | +} | |
| 198 | + | |
| 199 | +function _omz::plugin { | |
| 200 | + (( $# > 0 && $+functions[$0::$1] )) || { | |
| 201 | + cat >&2 <<EOF | |
| 202 | +Usage: ${(j: :)${(s.::.)0#_}} <command> [options] | |
| 203 | + | |
| 204 | +Available commands: | |
| 205 | + | |
| 206 | + disable <plugin> Disable plugin(s) | |
| 207 | + enable <plugin> Enable plugin(s) | |
| 208 | + info <plugin> Get information of a plugin | |
| 209 | + list List all available Oh My Zsh plugins | |
| 210 | + load <plugin> Load plugin(s) | |
| 211 | + | |
| 212 | +EOF | |
| 213 | + return 1 | |
| 214 | + } | |
| 215 | + | |
| 216 | + local command="$1" | |
| 217 | + shift | |
| 218 | + | |
| 219 | + $0::$command "$@" | |
| 220 | +} | |
| 221 | + | |
| 222 | +function _omz::plugin::disable { | |
| 223 | + if [[ -z "$1" ]]; then | |
| 224 | + echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin> [...]" | |
| 225 | + return 1 | |
| 226 | + fi | |
| 227 | + | |
| 228 | + # Check that plugin is in $plugins | |
| 229 | + local -a dis_plugins | |
| 230 | + for plugin in "$@"; do | |
| 231 | + if [[ ${plugins[(Ie)$plugin]} -eq 0 ]]; then | |
| 232 | + _omz::log warn "plugin '$plugin' is not enabled." | |
| 233 | + continue | |
| 234 | + fi | |
| 235 | + dis_plugins+=("$plugin") | |
| 236 | + done | |
| 237 | + | |
| 238 | + # Exit if there are no enabled plugins to disable | |
| 239 | + if [[ ${#dis_plugins} -eq 0 ]]; then | |
| 240 | + return 1 | |
| 241 | + fi | |
| 242 | + | |
| 243 | + # Remove plugins substitution awk script | |
| 244 | + local awk_subst_plugins="\ | |
| 245 | + gsub(/[ \t]+(${(j:|:)dis_plugins})[ \t]+/, \" \") # with spaces before or after | |
| 246 | + gsub(/[ \t]+(${(j:|:)dis_plugins})$/, \"\") # with spaces before and EOL | |
| 247 | + gsub(/^(${(j:|:)dis_plugins})[ \t]+/, \"\") # with BOL and spaces after | |
| 248 | + | |
| 249 | + gsub(/\((${(j:|:)dis_plugins})[ \t]+/, \"(\") # with parenthesis before and spaces after | |
| 250 | + gsub(/[ \t]+(${(j:|:)dis_plugins})\)/, \")\") # with spaces before or parenthesis after | |
| 251 | + gsub(/\((${(j:|:)dis_plugins})\)/, \"()\") # with only parentheses | |
| 252 | + | |
| 253 | + gsub(/^(${(j:|:)dis_plugins})\)/, \")\") # with BOL and closing parenthesis | |
| 254 | + gsub(/\((${(j:|:)dis_plugins})$/, \"(\") # with opening parenthesis and EOL | |
| 255 | +" | |
| 256 | + | |
| 257 | + # Disable plugins awk script | |
| 258 | + local awk_script=" | |
| 259 | +# if plugins=() is in oneline form, substitute disabled plugins and go to next line | |
| 260 | +/^[ \t]*plugins=\([^#]+\).*\$/ { | |
| 261 | + $awk_subst_plugins | |
| 262 | + print \$0 | |
| 263 | + next | |
| 264 | +} | |
| 265 | + | |
| 266 | +# if plugins=() is in multiline form, enable multi flag and disable plugins if they're there | |
| 267 | +/^[ \t]*plugins=\(/ { | |
| 268 | + multi=1 | |
| 269 | + $awk_subst_plugins | |
| 270 | + print \$0 | |
| 271 | + next | |
| 272 | +} | |
| 273 | + | |
| 274 | +# if multi flag is enabled and we find a valid closing parenthesis, remove plugins and disable multi flag | |
| 275 | +multi == 1 && /^[^#]*\)/ { | |
| 276 | + multi=0 | |
| 277 | + $awk_subst_plugins | |
| 278 | + print \$0 | |
| 279 | + next | |
| 280 | +} | |
| 281 | + | |
| 282 | +multi == 1 && length(\$0) > 0 { | |
| 283 | + $awk_subst_plugins | |
| 284 | + if (length(\$0) > 0) print \$0 | |
| 285 | + next | |
| 286 | +} | |
| 287 | + | |
| 288 | +{ print \$0 } | |
| 289 | +" | |
| 290 | + | |
| 291 | + local zdot="${ZDOTDIR:-$HOME}" | |
| 292 | + local zshrc="${${:-"${zdot}/.zshrc"}:A}" | |
| 293 | + awk "$awk_script" "$zshrc" > "$zdot/.zshrc.new" \ | |
| 294 | + && command cp -f "$zshrc" "$zdot/.zshrc.bck" \ | |
| 295 | + && command mv -f "$zdot/.zshrc.new" "$zshrc" | |
| 296 | + | |
| 297 | + # Exit if the new .zshrc file wasn't created correctly | |
| 298 | + [[ $? -eq 0 ]] || { | |
| 299 | + local ret=$? | |
| 300 | + _omz::log error "error disabling plugins." | |
| 301 | + return $ret | |
| 302 | + } | |
| 303 | + | |
| 304 | + # Exit if the new .zshrc file has syntax errors | |
| 305 | + if ! command zsh -n "$zdot/.zshrc"; then | |
| 306 | + _omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..." | |
| 307 | + command mv -f "$zdot/.zshrc.bck" "$zshrc" | |
| 308 | + return 1 | |
| 309 | + fi | |
| 310 | + | |
| 311 | + # Restart the zsh session if there were no errors | |
| 312 | + _omz::log info "plugins disabled: ${(j:, :)dis_plugins}." | |
| 313 | + | |
| 314 | + # Only reload zsh if run in an interactive session | |
| 315 | + [[ ! -o interactive ]] || _omz::reload | |
| 316 | +} | |
| 317 | + | |
| 318 | +function _omz::plugin::enable { | |
| 319 | + if [[ -z "$1" ]]; then | |
| 320 | + echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin> [...]" | |
| 321 | + return 1 | |
| 322 | + fi | |
| 323 | + | |
| 324 | + # Check that plugin is not in $plugins | |
| 325 | + local -a add_plugins | |
| 326 | + for plugin in "$@"; do | |
| 327 | + if [[ ${plugins[(Ie)$plugin]} -ne 0 ]]; then | |
| 328 | + _omz::log warn "plugin '$plugin' is already enabled." | |
| 329 | + continue | |
| 330 | + fi | |
| 331 | + add_plugins+=("$plugin") | |
| 332 | + done | |
| 333 | + | |
| 334 | + # Exit if there are no plugins to enable | |
| 335 | + if [[ ${#add_plugins} -eq 0 ]]; then | |
| 336 | + return 1 | |
| 337 | + fi | |
| 338 | + | |
| 339 | + # Enable plugins awk script | |
| 340 | + local awk_script=" | |
| 341 | +# if plugins=() is in oneline form, substitute ) with new plugins and go to the next line | |
| 342 | +/^[ \t]*plugins=\([^#]+\).*\$/ { | |
| 343 | + sub(/\)/, \" $add_plugins&\") | |
| 344 | + print \$0 | |
| 345 | + next | |
| 346 | +} | |
| 347 | + | |
| 348 | +# if plugins=() is in multiline form, enable multi flag and indent by default with 2 spaces | |
| 349 | +/^[ \t]*plugins=\(/ { | |
| 350 | + multi=1 | |
| 351 | + indent=\" \" | |
| 352 | + print \$0 | |
| 353 | + next | |
| 354 | +} | |
| 355 | + | |
| 356 | +# if multi flag is enabled and we find a valid closing parenthesis, | |
| 357 | +# add new plugins with proper indent and disable multi flag | |
| 358 | +multi == 1 && /^[^#]*\)/ { | |
| 359 | + multi=0 | |
| 360 | + split(\"$add_plugins\",p,\" \") | |
| 361 | + for (i in p) { | |
| 362 | + print indent p[i] | |
| 363 | + } | |
| 364 | + print \$0 | |
| 365 | + next | |
| 366 | +} | |
| 367 | + | |
| 368 | +# if multi flag is enabled and we didnt find a closing parenthesis, | |
| 369 | +# get the indentation level to match when adding plugins | |
| 370 | +multi == 1 && /^[^#]*/ { | |
| 371 | + indent=\"\" | |
| 372 | + for (i = 1; i <= length(\$0); i++) { | |
| 373 | + char=substr(\$0, i, 1) | |
| 374 | + if (char == \" \" || char == \"\t\") { | |
| 375 | + indent = indent char | |
| 376 | + } else { | |
| 377 | + break | |
| 378 | + } | |
| 379 | + } | |
| 380 | +} | |
| 381 | + | |
| 382 | +{ print \$0 } | |
| 383 | +" | |
| 384 | + | |
| 385 | + local zdot="${ZDOTDIR:-$HOME}" | |
| 386 | + local zshrc="${${:-"${zdot}/.zshrc"}:A}" | |
| 387 | + awk "$awk_script" "$zshrc" > "$zdot/.zshrc.new" \ | |
| 388 | + && command cp -f "$zshrc" "$zdot/.zshrc.bck" \ | |
| 389 | + && command mv -f "$zdot/.zshrc.new" "$zshrc" | |
| 390 | + | |
| 391 | + # Exit if the new .zshrc file wasn't created correctly | |
| 392 | + [[ $? -eq 0 ]] || { | |
| 393 | + local ret=$? | |
| 394 | + _omz::log error "error enabling plugins." | |
| 395 | + return $ret | |
| 396 | + } | |
| 397 | + | |
| 398 | + # Exit if the new .zshrc file has syntax errors | |
| 399 | + if ! command zsh -n "$zdot/.zshrc"; then | |
| 400 | + _omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..." | |
| 401 | + command mv -f "$zdot/.zshrc.bck" "$zshrc" | |
| 402 | + return 1 | |
| 403 | + fi | |
| 404 | + | |
| 405 | + # Restart the zsh session if there were no errors | |
| 406 | + _omz::log info "plugins enabled: ${(j:, :)add_plugins}." | |
| 407 | + | |
| 408 | + # Only reload zsh if run in an interactive session | |
| 409 | + [[ ! -o interactive ]] || _omz::reload | |
| 410 | +} | |
| 411 | + | |
| 412 | +function _omz::plugin::info { | |
| 413 | + if [[ -z "$1" ]]; then | |
| 414 | + echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin>" | |
| 415 | + return 1 | |
| 416 | + fi | |
| 417 | + | |
| 418 | + local readme | |
| 419 | + for readme in "$ZSH_CUSTOM/plugins/$1/README.md" "$ZSH/plugins/$1/README.md"; do | |
| 420 | + if [[ -f "$readme" ]]; then | |
| 421 | + # If being piped, just cat the README | |
| 422 | + if [[ ! -t 1 ]]; then | |
| 423 | + cat "$readme" | |
| 424 | + return $? | |
| 425 | + fi | |
| 426 | + | |
| 427 | + # Enrich the README display depending on the tools we have | |
| 428 | + # - glow: https://github.com/charmbracelet/glow | |
| 429 | + # - bat: https://github.com/sharkdp/bat | |
| 430 | + # - less: typical pager command | |
| 431 | + case 1 in | |
| 432 | + ${+commands[glow]}) glow -p "$readme" ;; | |
| 433 | + ${+commands[bat]}) bat -l md --style plain "$readme" ;; | |
| 434 | + ${+commands[less]}) less "$readme" ;; | |
| 435 | + *) cat "$readme" ;; | |
| 436 | + esac | |
| 437 | + return $? | |
| 438 | + fi | |
| 439 | + done | |
| 440 | + | |
| 441 | + if [[ -d "$ZSH_CUSTOM/plugins/$1" || -d "$ZSH/plugins/$1" ]]; then | |
| 442 | + _omz::log error "the '$1' plugin doesn't have a README file" | |
| 443 | + else | |
| 444 | + _omz::log error "'$1' plugin not found" | |
| 445 | + fi | |
| 446 | + | |
| 447 | + return 1 | |
| 448 | +} | |
| 449 | + | |
| 450 | +function _omz::plugin::list { | |
| 451 | + local -a custom_plugins builtin_plugins | |
| 452 | + custom_plugins=("$ZSH_CUSTOM"/plugins/*(-/N:t)) | |
| 453 | + builtin_plugins=("$ZSH"/plugins/*(-/N:t)) | |
| 454 | + | |
| 455 | + # If the command is being piped, print all found line by line | |
| 456 | + if [[ ! -t 1 ]]; then | |
| 457 | + print -l ${(q-)custom_plugins} ${(q-)builtin_plugins} | |
| 458 | + return | |
| 459 | + fi | |
| 460 | + | |
| 461 | + if (( ${#custom_plugins} )); then | |
| 462 | + print -P "%U%BCustom plugins%b%u:" | |
| 463 | + print -lac ${(q-)custom_plugins} | |
| 464 | + fi | |
| 465 | + | |
| 466 | + if (( ${#builtin_plugins} )); then | |
| 467 | + (( ${#custom_plugins} )) && echo # add a line of separation | |
| 468 | + | |
| 469 | + print -P "%U%BBuilt-in plugins%b%u:" | |
| 470 | + print -lac ${(q-)builtin_plugins} | |
| 471 | + fi | |
| 472 | +} | |
| 473 | + | |
| 474 | +function _omz::plugin::load { | |
| 475 | + if [[ -z "$1" ]]; then | |
| 476 | + echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin> [...]" | |
| 477 | + return 1 | |
| 478 | + fi | |
| 479 | + | |
| 480 | + local plugin base has_completion=0 | |
| 481 | + for plugin in "$@"; do | |
| 482 | + if [[ -d "$ZSH_CUSTOM/plugins/$plugin" ]]; then | |
| 483 | + base="$ZSH_CUSTOM/plugins/$plugin" | |
| 484 | + elif [[ -d "$ZSH/plugins/$plugin" ]]; then | |
| 485 | + base="$ZSH/plugins/$plugin" | |
| 486 | + else | |
| 487 | + _omz::log warn "plugin '$plugin' not found" | |
| 488 | + continue | |
| 489 | + fi | |
| 490 | + | |
| 491 | + # Check if its a valid plugin | |
| 492 | + if [[ ! -f "$base/_$plugin" && ! -f "$base/$plugin.plugin.zsh" ]]; then | |
| 493 | + _omz::log warn "'$plugin' is not a valid plugin" | |
| 494 | + continue | |
| 495 | + # It is a valid plugin, add its directory to $fpath unless it is already there | |
| 496 | + elif (( ! ${fpath[(Ie)$base]} )); then | |
| 497 | + fpath=("$base" $fpath) | |
| 498 | + fi | |
| 499 | + | |
| 500 | + # Check if it has completion to reload compinit | |
| 501 | + local -a comp_files | |
| 502 | + comp_files=($base/_*(N)) | |
| 503 | + has_completion=$(( $#comp_files > 0 )) | |
| 504 | + | |
| 505 | + # Load the plugin | |
| 506 | + if [[ -f "$base/$plugin.plugin.zsh" ]]; then | |
| 507 | + source "$base/$plugin.plugin.zsh" | |
| 508 | + fi | |
| 509 | + done | |
| 510 | + | |
| 511 | + # If we have completion, we need to reload the completion | |
| 512 | + # We pass -D to avoid generating a new dump file, which would overwrite our | |
| 513 | + # current one for the next session (and we don't want that because we're not | |
| 514 | + # actually enabling the plugins for the next session). | |
| 515 | + # Note that we still have to pass -d "$_comp_dumpfile", so that compinit | |
| 516 | + # doesn't use the default zcompdump location (${ZDOTDIR:-$HOME}/.zcompdump). | |
| 517 | + if (( has_completion )); then | |
| 518 | + compinit -D -d "$_comp_dumpfile" | |
| 519 | + fi | |
| 520 | +} | |
| 521 | + | |
| 522 | +function _omz::pr { | |
| 523 | + (( $# > 0 && $+functions[$0::$1] )) || { | |
| 524 | + cat >&2 <<EOF | |
| 525 | +Usage: ${(j: :)${(s.::.)0#_}} <command> [options] | |
| 526 | + | |
| 527 | +Available commands: | |
| 528 | + | |
| 529 | + clean Delete all PR branches (ohmyzsh/pull-*) | |
| 530 | + test <PR_number_or_URL> Fetch PR #NUMBER and rebase against master | |
| 531 | + | |
| 532 | +EOF | |
| 533 | + return 1 | |
| 534 | + } | |
| 535 | + | |
| 536 | + local command="$1" | |
| 537 | + shift | |
| 538 | + | |
| 539 | + $0::$command "$@" | |
| 540 | +} | |
| 541 | + | |
| 542 | +function _omz::pr::clean { | |
| 543 | + ( | |
| 544 | + set -e | |
| 545 | + builtin cd -q "$ZSH" | |
| 546 | + | |
| 547 | + # Check if there are PR branches | |
| 548 | + local fmt branches | |
| 549 | + fmt="%(color:bold blue)%(align:18,right)%(refname:short)%(end)%(color:reset) %(color:dim bold red)%(objectname:short)%(color:reset) %(color:yellow)%(contents:subject)" | |
| 550 | + branches="$(command git for-each-ref --sort=-committerdate --color --format="$fmt" "refs/heads/ohmyzsh/pull-*")" | |
| 551 | + | |
| 552 | + # Exit if there are no PR branches | |
| 553 | + if [[ -z "$branches" ]]; then | |
| 554 | + _omz::log info "there are no Pull Request branches to remove." | |
| 555 | + return | |
| 556 | + fi | |
| 557 | + | |
| 558 | + # Print found PR branches | |
| 559 | + echo "$branches\n" | |
| 560 | + # Confirm before removing the branches | |
| 561 | + _omz::confirm "do you want remove these Pull Request branches? [Y/n] " | |
| 562 | + # Only proceed if the answer is a valid yes option | |
| 563 | + [[ "$REPLY" != [yY$'\n'] ]] && return | |
| 564 | + | |
| 565 | + _omz::log info "removing all Oh My Zsh Pull Request branches..." | |
| 566 | + command git branch --list 'ohmyzsh/pull-*' | while read branch; do | |
| 567 | + command git branch -D "$branch" | |
| 568 | + done | |
| 569 | + ) | |
| 570 | +} | |
| 571 | + | |
| 572 | +function _omz::pr::test { | |
| 573 | + # Allow $1 to be a URL to the pull request | |
| 574 | + if [[ "$1" = https://* ]]; then | |
| 575 | + 1="${1:t}" | |
| 576 | + fi | |
| 577 | + | |
| 578 | + # Check the input | |
| 579 | + if ! [[ -n "$1" && "$1" =~ ^[[:digit:]]+$ ]]; then | |
| 580 | + echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <PR_NUMBER_or_URL>" | |
| 581 | + return 1 | |
| 582 | + fi | |
| 583 | + | |
| 584 | + # Save current git HEAD | |
| 585 | + local branch | |
| 586 | + branch=$(builtin cd -q "$ZSH"; git symbolic-ref --short HEAD) || { | |
| 587 | + _omz::log error "error when getting the current git branch. Aborting..." | |
| 588 | + return 1 | |
| 589 | + } | |
| 590 | + | |
| 591 | + | |
| 592 | + # Fetch PR onto ohmyzsh/pull-<PR_NUMBER> branch and rebase against master | |
| 593 | + # If any of these operations fail, undo the changes made | |
| 594 | + ( | |
| 595 | + set -e | |
| 596 | + builtin cd -q "$ZSH" | |
| 597 | + | |
| 598 | + # Get the ohmyzsh git remote | |
| 599 | + command git remote -v | while read remote url _; do | |
| 600 | + case "$url" in | |
| 601 | + https://github.com/ohmyzsh/ohmyzsh(|.git)) found=1; break ;; | |
| 602 | + git@github.com:ohmyzsh/ohmyzsh(|.git)) found=1; break ;; | |
| 603 | + esac | |
| 604 | + done | |
| 605 | + | |
| 606 | + (( $found )) || { | |
| 607 | + _omz::log error "could not found the ohmyzsh git remote. Aborting..." | |
| 608 | + return 1 | |
| 609 | + } | |
| 610 | + | |
| 611 | + # Fetch pull request head | |
| 612 | + _omz::log info "fetching PR #$1 to ohmyzsh/pull-$1..." | |
| 613 | + command git fetch -f "$remote" refs/pull/$1/head:ohmyzsh/pull-$1 || { | |
| 614 | + _omz::log error "error when trying to fetch PR #$1." | |
| 615 | + return 1 | |
| 616 | + } | |
| 617 | + | |
| 618 | + # Rebase pull request branch against the current master | |
| 619 | + _omz::log info "rebasing PR #$1..." | |
| 620 | + local ret gpgsign | |
| 621 | + { | |
| 622 | + # Back up commit.gpgsign setting: use --local to get the current repository | |
| 623 | + # setting, not the global one. If --local is not a known option, it will | |
| 624 | + # exit with a 129 status code. | |
| 625 | + gpgsign=$(command git config --local commit.gpgsign 2>/dev/null) || ret=$? | |
| 626 | + [[ $ret -ne 129 ]] || gpgsign=$(command git config commit.gpgsign 2>/dev/null) | |
| 627 | + command git config commit.gpgsign false | |
| 628 | + | |
| 629 | + command git rebase master ohmyzsh/pull-$1 || { | |
| 630 | + command git rebase --abort &>/dev/null | |
| 631 | + _omz::log warn "could not rebase PR #$1 on top of master." | |
| 632 | + _omz::log warn "you might not see the latest stable changes." | |
| 633 | + _omz::log info "run \`zsh\` to test the changes." | |
| 634 | + return 1 | |
| 635 | + } | |
| 636 | + } always { | |
| 637 | + case "$gpgsign" in | |
| 638 | + "") command git config --unset commit.gpgsign ;; | |
| 639 | + *) command git config commit.gpgsign "$gpgsign" ;; | |
| 640 | + esac | |
| 641 | + } | |
| 642 | + | |
| 643 | + _omz::log info "fetch of PR #${1} successful." | |
| 644 | + ) | |
| 645 | + | |
| 646 | + # If there was an error, abort running zsh to test the PR | |
| 647 | + [[ $? -eq 0 ]] || return 1 | |
| 648 | + | |
| 649 | + # Run zsh to test the changes | |
| 650 | + _omz::log info "running \`zsh\` to test the changes. Run \`exit\` to go back." | |
| 651 | + command zsh -l | |
| 652 | + | |
| 653 | + # After testing, go back to the previous HEAD if the user wants | |
| 654 | + _omz::confirm "do you want to go back to the previous branch? [Y/n] " | |
| 655 | + # Only proceed if the answer is a valid yes option | |
| 656 | + [[ "$REPLY" != [yY$'\n'] ]] && return | |
| 657 | + | |
| 658 | + ( | |
| 659 | + set -e | |
| 660 | + builtin cd -q "$ZSH" | |
| 661 | + | |
| 662 | + command git checkout "$branch" -- || { | |
| 663 | + _omz::log error "could not go back to the previous branch ('$branch')." | |
| 664 | + return 1 | |
| 665 | + } | |
| 666 | + ) | |
| 667 | +} | |
| 668 | + | |
| 669 | +function _omz::reload { | |
| 670 | + # Delete current completion cache | |
| 671 | + command rm -f $_comp_dumpfile $ZSH_COMPDUMP | |
| 672 | + | |
| 673 | + # Old zsh versions don't have ZSH_ARGZERO | |
| 674 | + local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}" | |
| 675 | + # Check whether to run a login shell | |
| 676 | + [[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh" | |
| 677 | +} | |
| 678 | + | |
| 679 | +function _omz::theme { | |
| 680 | + (( $# > 0 && $+functions[$0::$1] )) || { | |
| 681 | + cat >&2 <<EOF | |
| 682 | +Usage: ${(j: :)${(s.::.)0#_}} <command> [options] | |
| 683 | + | |
| 684 | +Available commands: | |
| 685 | + | |
| 686 | + list List all available Oh My Zsh themes | |
| 687 | + set <theme> Set a theme in your .zshrc file | |
| 688 | + use <theme> Load a theme | |
| 689 | + | |
| 690 | +EOF | |
| 691 | + return 1 | |
| 692 | + } | |
| 693 | + | |
| 694 | + local command="$1" | |
| 695 | + shift | |
| 696 | + | |
| 697 | + $0::$command "$@" | |
| 698 | +} | |
| 699 | + | |
| 700 | +function _omz::theme::list { | |
| 701 | + local -a custom_themes builtin_themes | |
| 702 | + custom_themes=("$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::)) | |
| 703 | + builtin_themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r)) | |
| 704 | + | |
| 705 | + # If the command is being piped, print all found line by line | |
| 706 | + if [[ ! -t 1 ]]; then | |
| 707 | + print -l ${(q-)custom_themes} ${(q-)builtin_themes} | |
| 708 | + return | |
| 709 | + fi | |
| 710 | + | |
| 711 | + # Print theme in use | |
| 712 | + if [[ -n "$ZSH_THEME" ]]; then | |
| 713 | + print -Pn "%U%BCurrent theme%b%u: " | |
| 714 | + [[ $ZSH_THEME = random ]] && echo "$RANDOM_THEME (via random)" || echo "$ZSH_THEME" | |
| 715 | + echo | |
| 716 | + fi | |
| 717 | + | |
| 718 | + # Print custom themes if there are any | |
| 719 | + if (( ${#custom_themes} )); then | |
| 720 | + print -P "%U%BCustom themes%b%u:" | |
| 721 | + print -lac ${(q-)custom_themes} | |
| 722 | + echo | |
| 723 | + fi | |
| 724 | + | |
| 725 | + # Print built-in themes | |
| 726 | + print -P "%U%BBuilt-in themes%b%u:" | |
| 727 | + print -lac ${(q-)builtin_themes} | |
| 728 | +} | |
| 729 | + | |
| 730 | +function _omz::theme::set { | |
| 731 | + if [[ -z "$1" ]]; then | |
| 732 | + echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <theme>" | |
| 733 | + return 1 | |
| 734 | + fi | |
| 735 | + | |
| 736 | + # Check that theme exists | |
| 737 | + if [[ ! -f "$ZSH_CUSTOM/$1.zsh-theme" ]] \ | |
| 738 | + && [[ ! -f "$ZSH_CUSTOM/themes/$1.zsh-theme" ]] \ | |
| 739 | + && [[ ! -f "$ZSH/themes/$1.zsh-theme" ]]; then | |
| 740 | + _omz::log error "%B$1%b theme not found" | |
| 741 | + return 1 | |
| 742 | + fi | |
| 743 | + | |
| 744 | + # Enable theme in .zshrc | |
| 745 | + local awk_script=' | |
| 746 | +!set && /^[ \t]*ZSH_THEME=[^#]+.*$/ { | |
| 747 | + set=1 | |
| 748 | + sub(/^[ \t]*ZSH_THEME=[^#]+.*$/, "ZSH_THEME=\"'$1'\" # set by `omz`") | |
| 749 | + print $0 | |
| 750 | + next | |
| 751 | +} | |
| 752 | + | |
| 753 | +{ print $0 } | |
| 754 | + | |
| 755 | +END { | |
| 756 | + # If no ZSH_THEME= line was found, return an error | |
| 757 | + if (!set) exit 1 | |
| 758 | +} | |
| 759 | +' | |
| 760 | + | |
| 761 | + local zdot="${ZDOTDIR:-$HOME}" | |
| 762 | + local zshrc="${${:-"${zdot}/.zshrc"}:A}" | |
| 763 | + awk "$awk_script" "$zshrc" > "$zdot/.zshrc.new" \ | |
| 764 | + || { | |
| 765 | + # Prepend ZSH_THEME= line to .zshrc if it doesn't exist | |
| 766 | + cat <<EOF | |
| 767 | +ZSH_THEME="$1" # set by \`omz\` | |
| 768 | + | |
| 769 | +EOF | |
| 770 | + cat "$zdot/.zshrc" | |
| 771 | + } > "$zdot/.zshrc.new" \ | |
| 772 | + && command cp -f "$zshrc" "$zdot/.zshrc.bck" \ | |
| 773 | + && command mv -f "$zdot/.zshrc.new" "$zshrc" | |
| 774 | + | |
| 775 | + # Exit if the new .zshrc file wasn't created correctly | |
| 776 | + [[ $? -eq 0 ]] || { | |
| 777 | + local ret=$? | |
| 778 | + _omz::log error "error setting theme." | |
| 779 | + return $ret | |
| 780 | + } | |
| 781 | + | |
| 782 | + # Exit if the new .zshrc file has syntax errors | |
| 783 | + if ! command zsh -n "$zdot/.zshrc"; then | |
| 784 | + _omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..." | |
| 785 | + command mv -f "$zdot/.zshrc.bck" "$zshrc" | |
| 786 | + return 1 | |
| 787 | + fi | |
| 788 | + | |
| 789 | + # Restart the zsh session if there were no errors | |
| 790 | + _omz::log info "'$1' theme set correctly." | |
| 791 | + | |
| 792 | + # Only reload zsh if run in an interactive session | |
| 793 | + [[ ! -o interactive ]] || _omz::reload | |
| 794 | +} | |
| 795 | + | |
| 796 | +function _omz::theme::use { | |
| 797 | + if [[ -z "$1" ]]; then | |
| 798 | + echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <theme>" | |
| 799 | + return 1 | |
| 800 | + fi | |
| 801 | + | |
| 802 | + # Respect compatibility with old lookup order | |
| 803 | + if [[ -f "$ZSH_CUSTOM/$1.zsh-theme" ]]; then | |
| 804 | + source "$ZSH_CUSTOM/$1.zsh-theme" | |
| 805 | + elif [[ -f "$ZSH_CUSTOM/themes/$1.zsh-theme" ]]; then | |
| 806 | + source "$ZSH_CUSTOM/themes/$1.zsh-theme" | |
| 807 | + elif [[ -f "$ZSH/themes/$1.zsh-theme" ]]; then | |
| 808 | + source "$ZSH/themes/$1.zsh-theme" | |
| 809 | + else | |
| 810 | + _omz::log error "%B$1%b theme not found" | |
| 811 | + return 1 | |
| 812 | + fi | |
| 813 | + | |
| 814 | + # Update theme settings | |
| 815 | + ZSH_THEME="$1" | |
| 816 | + [[ $1 = random ]] || unset RANDOM_THEME | |
| 817 | +} | |
| 818 | + | |
| 819 | +function _omz::update { | |
| 820 | + # Check if git command is available | |
| 821 | + (( $+commands[git] )) || { | |
| 822 | + _omz::log error "git is not installed. Aborting..." | |
| 823 | + return 1 | |
| 824 | + } | |
| 825 | + | |
| 826 | + # Check if --unattended was passed | |
| 827 | + [[ "$1" != --unattended ]] || { | |
| 828 | + _omz::log error "the \`\e[2m--unattended\e[0m\` flag is no longer supported, use the \`\e[2mupgrade.sh\e[0m\` script instead." | |
| 829 | + _omz::log error "for more information see https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#how-do-i-update-oh-my-zsh" | |
| 830 | + return 1 | |
| 831 | + } | |
| 832 | + | |
| 833 | + local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null) | |
| 834 | + [[ $? -eq 0 ]] || { | |
| 835 | + _omz::log error "\`$ZSH\` is not a git directory. Aborting..." | |
| 836 | + return 1 | |
| 837 | + } | |
| 838 | + | |
| 839 | + # Run update script | |
| 840 | + zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default | |
| 841 | + ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode || return $? | |
| 842 | + | |
| 843 | + # Update last updated file | |
| 844 | + zmodload zsh/datetime | |
| 845 | + echo "LAST_EPOCH=$(( EPOCHSECONDS / 60 / 60 / 24 ))" >! "${ZSH_CACHE_DIR}/.zsh-update" | |
| 846 | + # Remove update lock if it exists | |
| 847 | + command rm -rf "$ZSH/log/update.lock" | |
| 848 | + | |
| 849 | + # Restart the zsh session if there were changes | |
| 850 | + if [[ "$(builtin cd -q "$ZSH"; git rev-parse HEAD)" != "$last_commit" ]]; then | |
| 851 | + # Old zsh versions don't have ZSH_ARGZERO | |
| 852 | + local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}" | |
| 853 | + # Check whether to run a login shell | |
| 854 | + [[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh" | |
| 855 | + fi | |
| 856 | +} | |
| 857 | + | |
| 858 | +function _omz::version { | |
| 859 | + ( | |
| 860 | + builtin cd -q "$ZSH" | |
| 861 | + | |
| 862 | + # Get the version name: | |
| 863 | + # 1) try tag-like version | |
| 864 | + # 2) try branch name | |
| 865 | + # 3) try name-rev (tag~<rev> or branch~<rev>) | |
| 866 | + local version | |
| 867 | + version=$(command git describe --tags HEAD 2>/dev/null) \ | |
| 868 | + || version=$(command git symbolic-ref --quiet --short HEAD 2>/dev/null) \ | |
| 869 | + || version=$(command git name-rev --no-undefined --name-only --exclude="remotes/*" HEAD 2>/dev/null) \ | |
| 870 | + || version="<detached>" | |
| 871 | + | |
| 872 | + # Get short hash for the current HEAD | |
| 873 | + local commit=$(command git rev-parse --short HEAD 2>/dev/null) | |
| 874 | + | |
| 875 | + # Show version and commit hash | |
| 876 | + printf "%s (%s)\n" "$version" "$commit" | |
| 877 | + ) | |
| 878 | +} |
+107-0.oh-my-zsh/lib/clipboard.zsh
| @@ -0,0 +1,107 @@ | ||
| 1 | +# System clipboard integration | |
| 2 | +# | |
| 3 | +# This file has support for doing system clipboard copy and paste operations | |
| 4 | +# from the command line in a generic cross-platform fashion. | |
| 5 | +# | |
| 6 | +# This is uses essentially the same heuristic as neovim, with the additional | |
| 7 | +# special support for Cygwin. | |
| 8 | +# See: https://github.com/neovim/neovim/blob/e682d799fa3cf2e80a02d00c6ea874599d58f0e7/runtime/autoload/provider/clipboard.vim#L55-L121 | |
| 9 | +# | |
| 10 | +# - pbcopy, pbpaste (macOS) | |
| 11 | +# - cygwin (Windows running Cygwin) | |
| 12 | +# - wl-copy, wl-paste (if $WAYLAND_DISPLAY is set) | |
| 13 | +# - xsel (if $DISPLAY is set) | |
| 14 | +# - xclip (if $DISPLAY is set) | |
| 15 | +# - lemonade (for SSH) https://github.com/pocke/lemonade | |
| 16 | +# - doitclient (for SSH) http://www.chiark.greenend.org.uk/~sgtatham/doit/ | |
| 17 | +# - win32yank (Windows) | |
| 18 | +# - tmux (if $TMUX is set) | |
| 19 | +# | |
| 20 | +# Defines two functions, clipcopy and clippaste, based on the detected platform. | |
| 21 | +## | |
| 22 | +# | |
| 23 | +# clipcopy - Copy data to clipboard | |
| 24 | +# | |
| 25 | +# Usage: | |
| 26 | +# | |
| 27 | +# <command> | clipcopy - copies stdin to clipboard | |
| 28 | +# | |
| 29 | +# clipcopy <file> - copies a file's contents to clipboard | |
| 30 | +# | |
| 31 | +## | |
| 32 | +# | |
| 33 | +# clippaste - "Paste" data from clipboard to stdout | |
| 34 | +# | |
| 35 | +# Usage: | |
| 36 | +# | |
| 37 | +# clippaste - writes clipboard's contents to stdout | |
| 38 | +# | |
| 39 | +# clippaste | <command> - pastes contents and pipes it to another process | |
| 40 | +# | |
| 41 | +# clippaste > <file> - paste contents to a file | |
| 42 | +# | |
| 43 | +# Examples: | |
| 44 | +# | |
| 45 | +# # Pipe to another process | |
| 46 | +# clippaste | grep foo | |
| 47 | +# | |
| 48 | +# # Paste to a file | |
| 49 | +# clippaste > file.txt | |
| 50 | +# | |
| 51 | +function detect-clipboard() { | |
| 52 | + emulate -L zsh | |
| 53 | + | |
| 54 | + if [[ "${OSTYPE}" == darwin* ]] && (( ${+commands[pbcopy]} )) && (( ${+commands[pbpaste]} )); then | |
| 55 | + function clipcopy() { cat "${1:-/dev/stdin}" | pbcopy; } | |
| 56 | + function clippaste() { pbpaste; } | |
| 57 | + elif [[ "${OSTYPE}" == (cygwin|msys)* ]]; then | |
| 58 | + function clipcopy() { cat "${1:-/dev/stdin}" > /dev/clipboard; } | |
| 59 | + function clippaste() { cat /dev/clipboard; } | |
| 60 | + elif (( $+commands[clip.exe] )) && (( $+commands[powershell.exe] )); then | |
| 61 | + function clipcopy() { cat "${1:-/dev/stdin}" | clip.exe; } | |
| 62 | + function clippaste() { powershell.exe -noprofile -command Get-Clipboard; } | |
| 63 | + elif [ -n "${WAYLAND_DISPLAY:-}" ] && (( ${+commands[wl-copy]} )) && (( ${+commands[wl-paste]} )); then | |
| 64 | + function clipcopy() { cat "${1:-/dev/stdin}" | wl-copy &>/dev/null &|; } | |
| 65 | + function clippaste() { wl-paste --no-newline; } | |
| 66 | + elif [ -n "${DISPLAY:-}" ] && (( ${+commands[xsel]} )); then | |
| 67 | + function clipcopy() { cat "${1:-/dev/stdin}" | xsel --clipboard --input; } | |
| 68 | + function clippaste() { xsel --clipboard --output; } | |
| 69 | + elif [ -n "${DISPLAY:-}" ] && (( ${+commands[xclip]} )); then | |
| 70 | + function clipcopy() { cat "${1:-/dev/stdin}" | xclip -selection clipboard -in &>/dev/null &|; } | |
| 71 | + function clippaste() { xclip -out -selection clipboard; } | |
| 72 | + elif (( ${+commands[lemonade]} )); then | |
| 73 | + function clipcopy() { cat "${1:-/dev/stdin}" | lemonade copy; } | |
| 74 | + function clippaste() { lemonade paste; } | |
| 75 | + elif (( ${+commands[doitclient]} )); then | |
| 76 | + function clipcopy() { cat "${1:-/dev/stdin}" | doitclient wclip; } | |
| 77 | + function clippaste() { doitclient wclip -r; } | |
| 78 | + elif (( ${+commands[win32yank]} )); then | |
| 79 | + function clipcopy() { cat "${1:-/dev/stdin}" | win32yank -i; } | |
| 80 | + function clippaste() { win32yank -o; } | |
| 81 | + elif [[ $OSTYPE == linux-android* ]] && (( $+commands[termux-clipboard-set] )); then | |
| 82 | + function clipcopy() { cat "${1:-/dev/stdin}" | termux-clipboard-set; } | |
| 83 | + function clippaste() { termux-clipboard-get; } | |
| 84 | + elif [ -n "${TMUX:-}" ] && (( ${+commands[tmux]} )); then | |
| 85 | + function clipcopy() { tmux load-buffer "${1:--}"; } | |
| 86 | + function clippaste() { tmux save-buffer -; } | |
| 87 | + else | |
| 88 | + function _retry_clipboard_detection_or_fail() { | |
| 89 | + local clipcmd="${1}"; shift | |
| 90 | + if detect-clipboard; then | |
| 91 | + "${clipcmd}" "$@" | |
| 92 | + else | |
| 93 | + print "${clipcmd}: Platform $OSTYPE not supported or xclip/xsel not installed" >&2 | |
| 94 | + return 1 | |
| 95 | + fi | |
| 96 | + } | |
| 97 | + function clipcopy() { _retry_clipboard_detection_or_fail clipcopy "$@"; } | |
| 98 | + function clippaste() { _retry_clipboard_detection_or_fail clippaste "$@"; } | |
| 99 | + return 1 | |
| 100 | + fi | |
| 101 | +} | |
| 102 | + | |
| 103 | +function clipcopy clippaste { | |
| 104 | + unfunction clipcopy clippaste | |
| 105 | + detect-clipboard || true # let one retry | |
| 106 | + "$0" "$@" | |
| 107 | +} |
+44-0.oh-my-zsh/lib/compfix.zsh
| @@ -0,0 +1,44 @@ | ||
| 1 | +# Handle completions insecurities (i.e., completion-dependent directories with | |
| 2 | +# insecure ownership or permissions) by: | |
| 3 | +# | |
| 4 | +# * Human-readably notifying the user of these insecurities. | |
| 5 | +function handle_completion_insecurities() { | |
| 6 | + # List of the absolute paths of all unique insecure directories, split on | |
| 7 | + # newline from compaudit()'s output resembling: | |
| 8 | + # | |
| 9 | + # There are insecure directories: | |
| 10 | + # /usr/share/zsh/site-functions | |
| 11 | + # /usr/share/zsh/5.0.6/functions | |
| 12 | + # /usr/share/zsh | |
| 13 | + # /usr/share/zsh/5.0.6 | |
| 14 | + # | |
| 15 | + # Since the ignorable first line is printed to stderr and thus not captured, | |
| 16 | + # stderr is squelched to prevent this output from leaking to the user. | |
| 17 | + local -aU insecure_dirs | |
| 18 | + insecure_dirs=( ${(f@):-"$(compaudit 2>/dev/null)"} ) | |
| 19 | + | |
| 20 | + # If no such directories exist, get us out of here. | |
| 21 | + [[ -z "${insecure_dirs}" ]] && return | |
| 22 | + | |
| 23 | + # List ownership and permissions of all insecure directories. | |
| 24 | + print "[oh-my-zsh] Insecure completion-dependent directories detected:" | |
| 25 | + ls -ld "${(@)insecure_dirs}" | |
| 26 | + | |
| 27 | + cat <<EOD | |
| 28 | + | |
| 29 | +[oh-my-zsh] For safety, we will not load completions from these directories until | |
| 30 | +[oh-my-zsh] you fix their permissions and ownership and restart zsh. | |
| 31 | +[oh-my-zsh] See the above list for directories with group or other writability. | |
| 32 | + | |
| 33 | +[oh-my-zsh] To fix your permissions you can do so by disabling | |
| 34 | +[oh-my-zsh] the write permission of "group" and "others" and making sure that the | |
| 35 | +[oh-my-zsh] owner of these directories is either root or your current user. | |
| 36 | +[oh-my-zsh] The following command may help: | |
| 37 | +[oh-my-zsh] compaudit | xargs chmod g-w,o-w | |
| 38 | + | |
| 39 | +[oh-my-zsh] If the above didn't help or you want to skip the verification of | |
| 40 | +[oh-my-zsh] insecure directories you can set the variable ZSH_DISABLE_COMPFIX to | |
| 41 | +[oh-my-zsh] "true" before oh-my-zsh is sourced in your zshrc file. | |
| 42 | + | |
| 43 | +EOD | |
| 44 | +} |
+78-0.oh-my-zsh/lib/completion.zsh
| @@ -0,0 +1,78 @@ | ||
| 1 | +# fixme - the load process here seems a bit bizarre | |
| 2 | +zmodload -i zsh/complist | |
| 3 | + | |
| 4 | +WORDCHARS='' | |
| 5 | + | |
| 6 | +unsetopt menu_complete # do not autoselect the first completion entry | |
| 7 | +unsetopt flowcontrol | |
| 8 | +setopt auto_menu # show completion menu on successive tab press | |
| 9 | +setopt complete_in_word | |
| 10 | +setopt always_to_end | |
| 11 | + | |
| 12 | +# should this be in keybindings? | |
| 13 | +bindkey -M menuselect '^o' accept-and-infer-next-history | |
| 14 | +zstyle ':completion:*:*:*:*:*' menu select | |
| 15 | + | |
| 16 | +# case insensitive (all), partial-word and substring completion | |
| 17 | +if [[ "$CASE_SENSITIVE" = true ]]; then | |
| 18 | + zstyle ':completion:*' matcher-list 'r:|=*' 'l:|=* r:|=*' | |
| 19 | +else | |
| 20 | + if [[ "$HYPHEN_INSENSITIVE" = true ]]; then | |
| 21 | + zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]-_}={[:upper:][:lower:]_-}' 'r:|=*' 'l:|=* r:|=*' | |
| 22 | + else | |
| 23 | + zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|=*' 'l:|=* r:|=*' | |
| 24 | + fi | |
| 25 | +fi | |
| 26 | +unset CASE_SENSITIVE HYPHEN_INSENSITIVE | |
| 27 | + | |
| 28 | +# Complete . and .. special directories | |
| 29 | +zstyle ':completion:*' special-dirs true | |
| 30 | + | |
| 31 | +zstyle ':completion:*' list-colors '' | |
| 32 | +zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01' | |
| 33 | + | |
| 34 | +if [[ "$OSTYPE" = solaris* ]]; then | |
| 35 | + zstyle ':completion:*:*:*:*:processes' command "ps -u $USERNAME -o pid,user,comm" | |
| 36 | +else | |
| 37 | + zstyle ':completion:*:*:*:*:processes' command "ps -u $USERNAME -o pid,user,comm -w -w" | |
| 38 | +fi | |
| 39 | + | |
| 40 | +# disable named-directories autocompletion | |
| 41 | +zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories | |
| 42 | + | |
| 43 | +# Use caching so that commands like apt and dpkg complete are useable | |
| 44 | +zstyle ':completion:*' use-cache yes | |
| 45 | +zstyle ':completion:*' cache-path $ZSH_CACHE_DIR | |
| 46 | + | |
| 47 | +# Don't complete uninteresting users | |
| 48 | +zstyle ':completion:*:*:*:users' ignored-patterns \ | |
| 49 | + adm amanda apache at avahi avahi-autoipd beaglidx bin cacti canna \ | |
| 50 | + clamav daemon dbus distcache dnsmasq dovecot fax ftp games gdm \ | |
| 51 | + gkrellmd gopher hacluster haldaemon halt hsqldb ident junkbust kdm \ | |
| 52 | + ldap lp mail mailman mailnull man messagebus mldonkey mysql nagios \ | |
| 53 | + named netdump news nfsnobody nobody nscd ntp nut nx obsrun openvpn \ | |
| 54 | + operator pcap polkitd postfix postgres privoxy pulse pvm quagga radvd \ | |
| 55 | + rpc rpcuser rpm rtkit scard shutdown squid sshd statd svn sync tftp \ | |
| 56 | + usbmux uucp vcsa wwwrun xfs '_*' | |
| 57 | + | |
| 58 | +# ... unless we really want to. | |
| 59 | +zstyle '*' single-ignored show | |
| 60 | + | |
| 61 | +if [[ ${COMPLETION_WAITING_DOTS:-false} != false ]]; then | |
| 62 | + expand-or-complete-with-dots() { | |
| 63 | + # use $COMPLETION_WAITING_DOTS either as toggle or as the sequence to show | |
| 64 | + [[ $COMPLETION_WAITING_DOTS = true ]] && COMPLETION_WAITING_DOTS="%F{red}โฆ%f" | |
| 65 | + # turn off line wrapping and print prompt-expanded "dot" sequence | |
| 66 | + printf '\e[?7l%s\e[?7h' "${(%)COMPLETION_WAITING_DOTS}" | |
| 67 | + zle expand-or-complete | |
| 68 | + zle redisplay | |
| 69 | + } | |
| 70 | + zle -N expand-or-complete-with-dots | |
| 71 | + # Set the function as the default tab completion widget | |
| 72 | + bindkey -M emacs "^I" expand-or-complete-with-dots | |
| 73 | + bindkey -M viins "^I" expand-or-complete-with-dots | |
| 74 | + bindkey -M vicmd "^I" expand-or-complete-with-dots | |
| 75 | +fi | |
| 76 | + | |
| 77 | +# automatically load bash completion functions | |
| 78 | +autoload -U +X bashcompinit && bashcompinit |
+10-0.oh-my-zsh/lib/correction.zsh
| @@ -0,0 +1,10 @@ | ||
| 1 | +if [[ "$ENABLE_CORRECTION" == "true" ]]; then | |
| 2 | + alias cp='nocorrect cp' | |
| 3 | + alias man='nocorrect man' | |
| 4 | + alias mkdir='nocorrect mkdir' | |
| 5 | + alias mv='nocorrect mv' | |
| 6 | + alias sudo='nocorrect sudo' | |
| 7 | + alias su='nocorrect su' | |
| 8 | + | |
| 9 | + setopt correct_all | |
| 10 | +fi |
+353-0.oh-my-zsh/lib/diagnostics.zsh
| @@ -0,0 +1,353 @@ | ||
| 1 | +# diagnostics.zsh | |
| 2 | +# | |
| 3 | +# Diagnostic and debugging support for oh-my-zsh | |
| 4 | + | |
| 5 | +# omz_diagnostic_dump() | |
| 6 | +# | |
| 7 | +# Author: Andrew Janke <andrew@apjanke.net> | |
| 8 | +# | |
| 9 | +# Usage: | |
| 10 | +# | |
| 11 | +# omz_diagnostic_dump [-v] [-V] [file] | |
| 12 | +# | |
| 13 | +# NOTE: This is a work in progress. Its interface and behavior are going to change, | |
| 14 | +# and probably in non-back-compatible ways. | |
| 15 | +# | |
| 16 | +# Outputs a bunch of information about the state and configuration of | |
| 17 | +# oh-my-zsh, zsh, and the user's system. This is intended to provide a | |
| 18 | +# bunch of context for diagnosing your own or a third party's problems, and to | |
| 19 | +# be suitable for posting to public bug reports. | |
| 20 | +# | |
| 21 | +# The output is human-readable and its format may change over time. It is not | |
| 22 | +# suitable for parsing. All the output is in one single file so it can be posted | |
| 23 | +# as a gist or bug comment on GitHub. GitHub doesn't support attaching tarballs | |
| 24 | +# or other files to bugs; otherwise, this would probably have an option to produce | |
| 25 | +# tarballs that contain copies of the config and customization files instead of | |
| 26 | +# catting them all in to one file. | |
| 27 | +# | |
| 28 | +# This is intended to be widely portable, and run anywhere that oh-my-zsh does. | |
| 29 | +# Feel free to report any portability issues as bugs. | |
| 30 | +# | |
| 31 | +# This is written in a defensive style so it still works (and can detect) cases when | |
| 32 | +# basic functionality like echo and which have been redefined. In particular, almost | |
| 33 | +# everything is invoked with "builtin" or "command", to work in the face of user | |
| 34 | +# redefinitions. | |
| 35 | +# | |
| 36 | +# OPTIONS | |
| 37 | +# | |
| 38 | +# [file] Specifies the output file. If not given, a file in the current directory | |
| 39 | +# is selected automatically. | |
| 40 | +# | |
| 41 | +# -v Increase the verbosity of the dump output. May be specified multiple times. | |
| 42 | +# Verbosity levels: | |
| 43 | +# 0 - Basic info, shell state, omz configuration, git state | |
| 44 | +# 1 - (default) Adds key binding info and configuration file contents | |
| 45 | +# 2 - Adds zcompdump file contents | |
| 46 | +# | |
| 47 | +# -V Reduce the verbosity of the dump output. May be specified multiple times. | |
| 48 | +# | |
| 49 | +# TODO: | |
| 50 | +# * Multi-file capture | |
| 51 | +# * Add automatic gist uploading | |
| 52 | +# * Consider whether to move default output file location to TMPDIR. More robust | |
| 53 | +# but less user friendly. | |
| 54 | +# | |
| 55 | + | |
| 56 | +autoload -Uz is-at-least | |
| 57 | + | |
| 58 | +function omz_diagnostic_dump() { | |
| 59 | + emulate -L zsh | |
| 60 | + | |
| 61 | + builtin echo "Generating diagnostic dump; please be patient..." | |
| 62 | + | |
| 63 | + local thisfcn=omz_diagnostic_dump | |
| 64 | + local -A opts | |
| 65 | + local opt_verbose opt_noverbose opt_outfile | |
| 66 | + local timestamp=$(date +%Y%m%d-%H%M%S) | |
| 67 | + local outfile=omz_diagdump_$timestamp.txt | |
| 68 | + builtin zparseopts -A opts -D -- "v+=opt_verbose" "V+=opt_noverbose" | |
| 69 | + local verbose n_verbose=${#opt_verbose} n_noverbose=${#opt_noverbose} | |
| 70 | + (( verbose = 1 + n_verbose - n_noverbose )) | |
| 71 | + | |
| 72 | + if [[ ${#*} > 0 ]]; then | |
| 73 | + opt_outfile=$1 | |
| 74 | + fi | |
| 75 | + if [[ ${#*} > 1 ]]; then | |
| 76 | + builtin echo "$thisfcn: error: too many arguments" >&2 | |
| 77 | + return 1 | |
| 78 | + fi | |
| 79 | + if [[ -n "$opt_outfile" ]]; then | |
| 80 | + outfile="$opt_outfile" | |
| 81 | + fi | |
| 82 | + | |
| 83 | + # Always write directly to a file so terminal escape sequences are | |
| 84 | + # captured cleanly | |
| 85 | + _omz_diag_dump_one_big_text &> "$outfile" | |
| 86 | + if [[ $? != 0 ]]; then | |
| 87 | + builtin echo "$thisfcn: error while creating diagnostic dump; see $outfile for details" | |
| 88 | + fi | |
| 89 | + | |
| 90 | + builtin echo | |
| 91 | + builtin echo Diagnostic dump file created at: "$outfile" | |
| 92 | + builtin echo | |
| 93 | + builtin echo To share this with OMZ developers, post it as a gist on GitHub | |
| 94 | + builtin echo at "https://gist.github.com" and share the link to the gist. | |
| 95 | + builtin echo | |
| 96 | + builtin echo "WARNING: This dump file contains all your zsh and omz configuration files," | |
| 97 | + builtin echo "so don't share it publicly if there's sensitive information in them." | |
| 98 | + builtin echo | |
| 99 | + | |
| 100 | +} | |
| 101 | + | |
| 102 | +function _omz_diag_dump_one_big_text() { | |
| 103 | + local program programs progfile md5 | |
| 104 | + | |
| 105 | + builtin echo oh-my-zsh diagnostic dump | |
| 106 | + builtin echo | |
| 107 | + builtin echo $outfile | |
| 108 | + builtin echo | |
| 109 | + | |
| 110 | + # Basic system and zsh information | |
| 111 | + command date | |
| 112 | + command uname -a | |
| 113 | + builtin echo OSTYPE=$OSTYPE | |
| 114 | + builtin echo ZSH_VERSION=$ZSH_VERSION | |
| 115 | + builtin echo User: $USERNAME | |
| 116 | + builtin echo umask: $(umask) | |
| 117 | + builtin echo | |
| 118 | + _omz_diag_dump_os_specific_version | |
| 119 | + builtin echo | |
| 120 | + | |
| 121 | + # Installed programs | |
| 122 | + programs=(sh zsh ksh bash sed cat grep ls find git posh) | |
| 123 | + local progfile="" extra_str="" sha_str="" | |
| 124 | + for program in $programs; do | |
| 125 | + extra_str="" sha_str="" | |
| 126 | + progfile=$(builtin which $program) | |
| 127 | + if [[ $? == 0 ]]; then | |
| 128 | + if [[ -e $progfile ]]; then | |
| 129 | + if builtin whence shasum &>/dev/null; then | |
| 130 | + sha_str=($(command shasum $progfile)) | |
| 131 | + sha_str=$sha_str[1] | |
| 132 | + extra_str+=" SHA $sha_str" | |
| 133 | + fi | |
| 134 | + if [[ -h "$progfile" ]]; then | |
| 135 | + extra_str+=" ( -> ${progfile:A} )" | |
| 136 | + fi | |
| 137 | + fi | |
| 138 | + builtin printf '%-9s %-20s %s\n' "$program is" "$progfile" "$extra_str" | |
| 139 | + else | |
| 140 | + builtin echo "$program: not found" | |
| 141 | + fi | |
| 142 | + done | |
| 143 | + builtin echo | |
| 144 | + builtin echo Command Versions: | |
| 145 | + builtin echo "zsh: $(zsh --version)" | |
| 146 | + builtin echo "this zsh session: $ZSH_VERSION" | |
| 147 | + builtin echo "bash: $(bash --version | command grep bash)" | |
| 148 | + builtin echo "git: $(git --version)" | |
| 149 | + builtin echo "grep: $(grep --version)" | |
| 150 | + builtin echo | |
| 151 | + | |
| 152 | + # Core command definitions | |
| 153 | + _omz_diag_dump_check_core_commands || return 1 | |
| 154 | + builtin echo | |
| 155 | + | |
| 156 | + # ZSH Process state | |
| 157 | + builtin echo Process state: | |
| 158 | + builtin echo pwd: $PWD | |
| 159 | + if builtin whence pstree &>/dev/null; then | |
| 160 | + builtin echo Process tree for this shell: | |
| 161 | + pstree -p $$ | |
| 162 | + else | |
| 163 | + ps -fT | |
| 164 | + fi | |
| 165 | + builtin set | command grep -a '^\(ZSH\|plugins\|TERM\|LC_\|LANG\|precmd\|chpwd\|preexec\|FPATH\|TTY\|DISPLAY\|PATH\)\|OMZ' | |
| 166 | + builtin echo | |
| 167 | + #TODO: Should this include `env` instead of or in addition to `export`? | |
| 168 | + builtin echo Exported: | |
| 169 | + builtin echo $(builtin export | command sed 's/=.*//') | |
| 170 | + builtin echo | |
| 171 | + builtin echo Locale: | |
| 172 | + command locale | |
| 173 | + builtin echo | |
| 174 | + | |
| 175 | + # Zsh installation and configuration | |
| 176 | + builtin echo Zsh configuration: | |
| 177 | + builtin echo setopt: $(builtin setopt) | |
| 178 | + builtin echo | |
| 179 | + builtin echo zstyle: | |
| 180 | + builtin zstyle | |
| 181 | + builtin echo | |
| 182 | + builtin echo 'compaudit output:' | |
| 183 | + compaudit | |
| 184 | + builtin echo | |
| 185 | + builtin echo '$fpath directories:' | |
| 186 | + command ls -lad $fpath | |
| 187 | + builtin echo | |
| 188 | + | |
| 189 | + # Oh-my-zsh installation | |
| 190 | + builtin echo oh-my-zsh installation: | |
| 191 | + command ls -ld ~/.z* | |
| 192 | + command ls -ld ~/.oh* | |
| 193 | + builtin echo | |
| 194 | + builtin echo oh-my-zsh git state: | |
| 195 | + (builtin cd $ZSH && builtin echo "HEAD: $(git rev-parse HEAD)" && git remote -v && git status | command grep "[^[:space:]]") | |
| 196 | + if [[ $verbose -ge 1 ]]; then | |
| 197 | + (builtin cd $ZSH && git reflog --date=default | command grep pull) | |
| 198 | + fi | |
| 199 | + builtin echo | |
| 200 | + if [[ -e $ZSH_CUSTOM ]]; then | |
| 201 | + local custom_dir=$ZSH_CUSTOM | |
| 202 | + if [[ -h $custom_dir ]]; then | |
| 203 | + custom_dir=$(builtin cd $custom_dir && pwd -P) | |
| 204 | + fi | |
| 205 | + builtin echo "oh-my-zsh custom dir:" | |
| 206 | + builtin echo " $ZSH_CUSTOM ($custom_dir)" | |
| 207 | + (builtin cd ${custom_dir:h} && command find ${custom_dir:t} -name .git -prune -o -print) | |
| 208 | + builtin echo | |
| 209 | + fi | |
| 210 | + | |
| 211 | + # Key binding and terminal info | |
| 212 | + if [[ $verbose -ge 1 ]]; then | |
| 213 | + builtin echo "bindkey:" | |
| 214 | + builtin bindkey | |
| 215 | + builtin echo | |
| 216 | + builtin echo "infocmp:" | |
| 217 | + command infocmp -L | |
| 218 | + builtin echo | |
| 219 | + fi | |
| 220 | + | |
| 221 | + # Configuration file info | |
| 222 | + local zdotdir=${ZDOTDIR:-$HOME} | |
| 223 | + builtin echo "Zsh configuration files:" | |
| 224 | + local cfgfile cfgfiles | |
| 225 | + # Some files for bash that zsh does not use are intentionally included | |
| 226 | + # to help with diagnosing behavior differences between bash and zsh | |
| 227 | + cfgfiles=( /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout | |
| 228 | + $zdotdir/.zshenv $zdotdir/.zprofile $zdotdir/.zshrc $zdotdir/.zlogin $zdotdir/.zlogout | |
| 229 | + ~/.zsh.pre-oh-my-zsh | |
| 230 | + /etc/bashrc /etc/profile ~/.bashrc ~/.profile ~/.bash_profile ~/.bash_logout ) | |
| 231 | + command ls -lad $cfgfiles 2>&1 | |
| 232 | + builtin echo | |
| 233 | + if [[ $verbose -ge 1 ]]; then | |
| 234 | + for cfgfile in $cfgfiles; do | |
| 235 | + _omz_diag_dump_echo_file_w_header $cfgfile | |
| 236 | + done | |
| 237 | + fi | |
| 238 | + builtin echo | |
| 239 | + builtin echo "Zsh compdump files:" | |
| 240 | + local dumpfile dumpfiles | |
| 241 | + command ls -lad $zdotdir/.zcompdump* | |
| 242 | + dumpfiles=( $zdotdir/.zcompdump*(N) ) | |
| 243 | + if [[ $verbose -ge 2 ]]; then | |
| 244 | + for dumpfile in $dumpfiles; do | |
| 245 | + _omz_diag_dump_echo_file_w_header $dumpfile | |
| 246 | + done | |
| 247 | + fi | |
| 248 | + | |
| 249 | +} | |
| 250 | + | |
| 251 | +function _omz_diag_dump_check_core_commands() { | |
| 252 | + builtin echo "Core command check:" | |
| 253 | + local redefined name builtins externals reserved_words | |
| 254 | + redefined=() | |
| 255 | + # All the zsh non-module builtin commands | |
| 256 | + # These are taken from the zsh reference manual for 5.0.2 | |
| 257 | + # Commands from modules should not be included. | |
| 258 | + # (For back-compatibility, if any of these are newish, they should be removed, | |
| 259 | + # or at least made conditional on the version of the current running zsh.) | |
| 260 | + # "history" is also excluded because OMZ is known to redefine that | |
| 261 | + reserved_words=( do done esac then elif else fi for case if while function | |
| 262 | + repeat time until select coproc nocorrect foreach end '!' '[[' '{' '}' | |
| 263 | + ) | |
| 264 | + builtins=( alias autoload bg bindkey break builtin bye cd chdir command | |
| 265 | + comparguments compcall compctl compdescribe compfiles compgroups compquote comptags | |
| 266 | + comptry compvalues continue dirs disable disown echo echotc echoti emulate | |
| 267 | + enable eval exec exit false fc fg functions getln getopts hash | |
| 268 | + jobs kill let limit log logout noglob popd print printf | |
| 269 | + pushd pushln pwd r read rehash return sched set setopt shift | |
| 270 | + source suspend test times trap true ttyctl type ulimit umask unalias | |
| 271 | + unfunction unhash unlimit unset unsetopt vared wait whence where which zcompile | |
| 272 | + zle zmodload zparseopts zregexparse zstyle ) | |
| 273 | + if is-at-least 5.1; then | |
| 274 | + reserved_word+=( declare export integer float local readonly typeset ) | |
| 275 | + else | |
| 276 | + builtins+=( declare export integer float local readonly typeset ) | |
| 277 | + fi | |
| 278 | + builtins_fatal=( builtin command local ) | |
| 279 | + externals=( zsh ) | |
| 280 | + for name in $reserved_words; do | |
| 281 | + if [[ $(builtin whence -w $name) != "$name: reserved" ]]; then | |
| 282 | + builtin echo "reserved word '$name' has been redefined" | |
| 283 | + builtin which $name | |
| 284 | + redefined+=$name | |
| 285 | + fi | |
| 286 | + done | |
| 287 | + for name in $builtins; do | |
| 288 | + if [[ $(builtin whence -w $name) != "$name: builtin" ]]; then | |
| 289 | + builtin echo "builtin '$name' has been redefined" | |
| 290 | + builtin which $name | |
| 291 | + redefined+=$name | |
| 292 | + fi | |
| 293 | + done | |
| 294 | + for name in $externals; do | |
| 295 | + if [[ $(builtin whence -w $name) != "$name: command" ]]; then | |
| 296 | + builtin echo "command '$name' has been redefined" | |
| 297 | + builtin which $name | |
| 298 | + redefined+=$name | |
| 299 | + fi | |
| 300 | + done | |
| 301 | + | |
| 302 | + if [[ -n "$redefined" ]]; then | |
| 303 | + builtin echo "SOME CORE COMMANDS HAVE BEEN REDEFINED: $redefined" | |
| 304 | + else | |
| 305 | + builtin echo "All core commands are defined normally" | |
| 306 | + fi | |
| 307 | + | |
| 308 | +} | |
| 309 | + | |
| 310 | +function _omz_diag_dump_echo_file_w_header() { | |
| 311 | + local file=$1 | |
| 312 | + if [[ ( -f $file || -h $file ) ]]; then | |
| 313 | + builtin echo "========== $file ==========" | |
| 314 | + if [[ -h $file ]]; then | |
| 315 | + builtin echo "========== ( => ${file:A} ) ==========" | |
| 316 | + fi | |
| 317 | + command cat $file | |
| 318 | + builtin echo "========== end $file ==========" | |
| 319 | + builtin echo | |
| 320 | + elif [[ -d $file ]]; then | |
| 321 | + builtin echo "File '$file' is a directory" | |
| 322 | + elif [[ ! -e $file ]]; then | |
| 323 | + builtin echo "File '$file' does not exist" | |
| 324 | + else | |
| 325 | + command ls -lad "$file" | |
| 326 | + fi | |
| 327 | +} | |
| 328 | + | |
| 329 | +function _omz_diag_dump_os_specific_version() { | |
| 330 | + local osname osver version_file version_files | |
| 331 | + case "$OSTYPE" in | |
| 332 | + darwin*) | |
| 333 | + osname=$(command sw_vers -productName) | |
| 334 | + osver=$(command sw_vers -productVersion) | |
| 335 | + builtin echo "OS Version: $osname $osver build $(sw_vers -buildVersion)" | |
| 336 | + ;; | |
| 337 | + cygwin) | |
| 338 | + command systeminfo | command head -n 4 | command tail -n 2 | |
| 339 | + ;; | |
| 340 | + esac | |
| 341 | + | |
| 342 | + if builtin which lsb_release >/dev/null; then | |
| 343 | + builtin echo "OS Release: $(command lsb_release -s -d)" | |
| 344 | + fi | |
| 345 | + | |
| 346 | + version_files=( /etc/*-release(N) /etc/*-version(N) /etc/*_version(N) ) | |
| 347 | + for version_file in $version_files; do | |
| 348 | + builtin echo "$version_file:" | |
| 349 | + command cat "$version_file" | |
| 350 | + builtin echo | |
| 351 | + done | |
| 352 | +} | |
| 353 | + |
+40-0.oh-my-zsh/lib/directories.zsh
| @@ -0,0 +1,40 @@ | ||
| 1 | +# Changing/making/removing directory | |
| 2 | +setopt auto_cd | |
| 3 | +setopt auto_pushd | |
| 4 | +setopt pushd_ignore_dups | |
| 5 | +setopt pushdminus | |
| 6 | + | |
| 7 | + | |
| 8 | +alias -g ...='../..' | |
| 9 | +alias -g ....='../../..' | |
| 10 | +alias -g .....='../../../..' | |
| 11 | +alias -g ......='../../../../..' | |
| 12 | + | |
| 13 | +alias -- -='cd -' | |
| 14 | +alias 1='cd -1' | |
| 15 | +alias 2='cd -2' | |
| 16 | +alias 3='cd -3' | |
| 17 | +alias 4='cd -4' | |
| 18 | +alias 5='cd -5' | |
| 19 | +alias 6='cd -6' | |
| 20 | +alias 7='cd -7' | |
| 21 | +alias 8='cd -8' | |
| 22 | +alias 9='cd -9' | |
| 23 | + | |
| 24 | +alias md='mkdir -p' | |
| 25 | +alias rd=rmdir | |
| 26 | + | |
| 27 | +function d () { | |
| 28 | + if [[ -n $1 ]]; then | |
| 29 | + dirs "$@" | |
| 30 | + else | |
| 31 | + dirs -v | head -n 10 | |
| 32 | + fi | |
| 33 | +} | |
| 34 | +compdef _dirs d | |
| 35 | + | |
| 36 | +# List directory contents | |
| 37 | +alias lsa='ls -lah' | |
| 38 | +alias l='ls -lah' | |
| 39 | +alias ll='ls -lh' | |
| 40 | +alias la='ls -lAh' |
+281-0.oh-my-zsh/lib/functions.zsh
| @@ -0,0 +1,281 @@ | ||
| 1 | +function zsh_stats() { | |
| 2 | + fc -l 1 \ | |
| 3 | + | awk '{ CMD[$2]++; count++; } END { for (a in CMD) print CMD[a] " " CMD[a]*100/count "% " a }' \ | |
| 4 | + | grep -v "./" | sort -nr | head -n 20 | column -c3 -s " " -t | nl | |
| 5 | +} | |
| 6 | + | |
| 7 | +function uninstall_oh_my_zsh() { | |
| 8 | + command env ZSH="$ZSH" sh "$ZSH/tools/uninstall.sh" | |
| 9 | +} | |
| 10 | + | |
| 11 | +function upgrade_oh_my_zsh() { | |
| 12 | + echo >&2 "${fg[yellow]}Note: \`$0\` is deprecated. Use \`omz update\` instead.$reset_color" | |
| 13 | + omz update | |
| 14 | +} | |
| 15 | + | |
| 16 | +function open_command() { | |
| 17 | + local open_cmd | |
| 18 | + | |
| 19 | + # define the open command | |
| 20 | + case "$OSTYPE" in | |
| 21 | + darwin*) open_cmd='open' ;; | |
| 22 | + cygwin*) open_cmd='cygstart' ;; | |
| 23 | + linux*) [[ "$(uname -r)" != *icrosoft* ]] && open_cmd='nohup xdg-open' || { | |
| 24 | + open_cmd='cmd.exe /c start ""' | |
| 25 | + [[ -e "$1" ]] && { 1="$(wslpath -w "${1:a}")" || return 1 } | |
| 26 | + } ;; | |
| 27 | + msys*) open_cmd='start ""' ;; | |
| 28 | + *) echo "Platform $OSTYPE not supported" | |
| 29 | + return 1 | |
| 30 | + ;; | |
| 31 | + esac | |
| 32 | + | |
| 33 | + # If a URL is passed, $BROWSER might be set to a local browser within SSH. | |
| 34 | + # See https://github.com/ohmyzsh/ohmyzsh/issues/11098 | |
| 35 | + if [[ -n "$BROWSER" && "$1" = (http|https)://* ]]; then | |
| 36 | + "$BROWSER" "$@" | |
| 37 | + return | |
| 38 | + fi | |
| 39 | + | |
| 40 | + ${=open_cmd} "$@" &>/dev/null | |
| 41 | +} | |
| 42 | + | |
| 43 | +# take functions | |
| 44 | + | |
| 45 | +# mkcd is equivalent to takedir | |
| 46 | +function mkcd takedir() { | |
| 47 | + mkdir -p $@ && cd ${@:$#} | |
| 48 | +} | |
| 49 | + | |
| 50 | +function takeurl() { | |
| 51 | + local data thedir | |
| 52 | + data="$(mktemp)" | |
| 53 | + curl -L "$1" > "$data" | |
| 54 | + tar xf "$data" | |
| 55 | + thedir="$(tar tf "$data" | head -n 1)" | |
| 56 | + rm "$data" | |
| 57 | + cd "$thedir" | |
| 58 | +} | |
| 59 | + | |
| 60 | +function takezip() { | |
| 61 | + local data thedir | |
| 62 | + data="$(mktemp)" | |
| 63 | + curl -L "$1" > "$data" | |
| 64 | + unzip "$data" -d "./" | |
| 65 | + thedir="$(unzip -l "$data" | awk 'NR==4 {print $4}' | sed 's/\/.*//')" | |
| 66 | + rm "$data" | |
| 67 | + cd "$thedir" | |
| 68 | +} | |
| 69 | + | |
| 70 | +function takegit() { | |
| 71 | + git clone "$1" | |
| 72 | + cd "$(basename ${1%%.git})" | |
| 73 | +} | |
| 74 | + | |
| 75 | +function take() { | |
| 76 | + if [[ $1 =~ ^(https?|ftp).*\.(tar\.(gz|bz2|xz)|tgz)$ ]]; then | |
| 77 | + takeurl "$1" | |
| 78 | + elif [[ $1 =~ ^(https?|ftp).*\.(zip)$ ]]; then | |
| 79 | + takezip "$1" | |
| 80 | + elif [[ $1 =~ ^([A-Za-z0-9]\+@|https?|git|ssh|ftps?|rsync).*\.git/?$ ]]; then | |
| 81 | + takegit "$1" | |
| 82 | + else | |
| 83 | + takedir "$@" | |
| 84 | + fi | |
| 85 | +} | |
| 86 | + | |
| 87 | +# | |
| 88 | +# Get the value of an alias. | |
| 89 | +# | |
| 90 | +# Arguments: | |
| 91 | +# 1. alias - The alias to get its value from | |
| 92 | +# STDOUT: | |
| 93 | +# The value of alias $1 (if it has one). | |
| 94 | +# Return value: | |
| 95 | +# 0 if the alias was found, | |
| 96 | +# 1 if it does not exist | |
| 97 | +# | |
| 98 | +function alias_value() { | |
| 99 | + (( $+aliases[$1] )) && echo $aliases[$1] | |
| 100 | +} | |
| 101 | + | |
| 102 | +# | |
| 103 | +# Try to get the value of an alias, | |
| 104 | +# otherwise return the input. | |
| 105 | +# | |
| 106 | +# Arguments: | |
| 107 | +# 1. alias - The alias to get its value from | |
| 108 | +# STDOUT: | |
| 109 | +# The value of alias $1, or $1 if there is no alias $1. | |
| 110 | +# Return value: | |
| 111 | +# Always 0 | |
| 112 | +# | |
| 113 | +function try_alias_value() { | |
| 114 | + alias_value "$1" || echo "$1" | |
| 115 | +} | |
| 116 | + | |
| 117 | +# | |
| 118 | +# Set variable "$1" to default value "$2" if "$1" is not yet defined. | |
| 119 | +# | |
| 120 | +# Arguments: | |
| 121 | +# 1. name - The variable to set | |
| 122 | +# 2. val - The default value | |
| 123 | +# Return value: | |
| 124 | +# 0 if the variable exists, 3 if it was set | |
| 125 | +# | |
| 126 | +function default() { | |
| 127 | + (( $+parameters[$1] )) && return 0 | |
| 128 | + typeset -g "$1"="$2" && return 3 | |
| 129 | +} | |
| 130 | + | |
| 131 | +# | |
| 132 | +# Set environment variable "$1" to default value "$2" if "$1" is not yet defined. | |
| 133 | +# | |
| 134 | +# Arguments: | |
| 135 | +# 1. name - The env variable to set | |
| 136 | +# 2. val - The default value | |
| 137 | +# Return value: | |
| 138 | +# 0 if the env variable exists, 3 if it was set | |
| 139 | +# | |
| 140 | +function env_default() { | |
| 141 | + [[ ${parameters[$1]} = *-export* ]] && return 0 | |
| 142 | + export "$1=$2" && return 3 | |
| 143 | +} | |
| 144 | + | |
| 145 | + | |
| 146 | +# Required for $langinfo | |
| 147 | +zmodload zsh/langinfo | |
| 148 | + | |
| 149 | +# URL-encode a string | |
| 150 | +# | |
| 151 | +# Encodes a string using RFC 2396 URL-encoding (%-escaped). | |
| 152 | +# See: https://www.ietf.org/rfc/rfc2396.txt | |
| 153 | +# | |
| 154 | +# By default, reserved characters and unreserved "mark" characters are | |
| 155 | +# not escaped by this function. This allows the common usage of passing | |
| 156 | +# an entire URL in, and encoding just special characters in it, with | |
| 157 | +# the expectation that reserved and mark characters are used appropriately. | |
| 158 | +# The -r and -m options turn on escaping of the reserved and mark characters, | |
| 159 | +# respectively, which allows arbitrary strings to be fully escaped for | |
| 160 | +# embedding inside URLs, where reserved characters might be misinterpreted. | |
| 161 | +# | |
| 162 | +# Prints the encoded string on stdout. | |
| 163 | +# Returns nonzero if encoding failed. | |
| 164 | +# | |
| 165 | +# Usage: | |
| 166 | +# omz_urlencode [-r] [-m] [-P] <string> [<string> ...] | |
| 167 | +# | |
| 168 | +# -r causes reserved characters (;/?:@&=+$,) to be escaped | |
| 169 | +# | |
| 170 | +# -m causes "mark" characters (_.!~*''()-) to be escaped | |
| 171 | +# | |
| 172 | +# -P causes spaces to be encoded as '%20' instead of '+' | |
| 173 | +function omz_urlencode() { | |
| 174 | + emulate -L zsh | |
| 175 | + setopt norematchpcre | |
| 176 | + | |
| 177 | + local -a opts | |
| 178 | + zparseopts -D -E -a opts r m P | |
| 179 | + | |
| 180 | + local in_str="$@" | |
| 181 | + local url_str="" | |
| 182 | + local spaces_as_plus | |
| 183 | + if [[ -z $opts[(r)-P] ]]; then spaces_as_plus=1; fi | |
| 184 | + local str="$in_str" | |
| 185 | + | |
| 186 | + # URLs must use UTF-8 encoding; convert str to UTF-8 if required | |
| 187 | + local encoding=$langinfo[CODESET] | |
| 188 | + local safe_encodings | |
| 189 | + safe_encodings=(UTF-8 utf8 US-ASCII) | |
| 190 | + if [[ -z ${safe_encodings[(r)$encoding]} ]]; then | |
| 191 | + str=$(echo -E "$str" | iconv -f $encoding -t UTF-8) | |
| 192 | + if [[ $? != 0 ]]; then | |
| 193 | + echo "Error converting string from $encoding to UTF-8" >&2 | |
| 194 | + return 1 | |
| 195 | + fi | |
| 196 | + fi | |
| 197 | + | |
| 198 | + # Use LC_CTYPE=C to process text byte-by-byte | |
| 199 | + # Note that this doesn't work in Termux, as it only has UTF-8 locale. | |
| 200 | + # Characters will be processed as UTF-8, which is fine for URLs. | |
| 201 | + local i byte ord LC_ALL=C | |
| 202 | + export LC_ALL | |
| 203 | + local reserved=';/?:@&=+$,' | |
| 204 | + local mark='_.!~*''()-' | |
| 205 | + local dont_escape="[A-Za-z0-9" | |
| 206 | + if [[ -z $opts[(r)-r] ]]; then | |
| 207 | + dont_escape+=$reserved | |
| 208 | + fi | |
| 209 | + # $mark must be last because of the "-" | |
| 210 | + if [[ -z $opts[(r)-m] ]]; then | |
| 211 | + dont_escape+=$mark | |
| 212 | + fi | |
| 213 | + dont_escape+="]" | |
| 214 | + | |
| 215 | + # Implemented to use a single printf call and avoid subshells in the loop, | |
| 216 | + # for performance (primarily on Windows). | |
| 217 | + local url_str="" | |
| 218 | + for (( i = 1; i <= ${#str}; ++i )); do | |
| 219 | + byte="$str[i]" | |
| 220 | + if [[ "$byte" =~ "$dont_escape" ]]; then | |
| 221 | + url_str+="$byte" | |
| 222 | + else | |
| 223 | + if [[ "$byte" == " " && -n $spaces_as_plus ]]; then | |
| 224 | + url_str+="+" | |
| 225 | + elif [[ "$PREFIX" = *com.termux* ]]; then | |
| 226 | + # Termux does not have non-UTF8 locales, so just send the UTF-8 character directly | |
| 227 | + url_str+="$byte" | |
| 228 | + else | |
| 229 | + ord=$(( [##16] #byte )) | |
| 230 | + url_str+="%$ord" | |
| 231 | + fi | |
| 232 | + fi | |
| 233 | + done | |
| 234 | + echo -E "$url_str" | |
| 235 | +} | |
| 236 | + | |
| 237 | +# URL-decode a string | |
| 238 | +# | |
| 239 | +# Decodes a RFC 2396 URL-encoded (%-escaped) string. | |
| 240 | +# This decodes the '+' and '%' escapes in the input string, and leaves | |
| 241 | +# other characters unchanged. Does not enforce that the input is a | |
| 242 | +# valid URL-encoded string. This is a convenience to allow callers to | |
| 243 | +# pass in a full URL or similar strings and decode them for human | |
| 244 | +# presentation. | |
| 245 | +# | |
| 246 | +# Outputs the encoded string on stdout. | |
| 247 | +# Returns nonzero if encoding failed. | |
| 248 | +# | |
| 249 | +# Usage: | |
| 250 | +# omz_urldecode <urlstring> - prints decoded string followed by a newline | |
| 251 | +function omz_urldecode { | |
| 252 | + emulate -L zsh | |
| 253 | + local encoded_url=$1 | |
| 254 | + | |
| 255 | + # Work bytewise, since URLs escape UTF-8 octets | |
| 256 | + local caller_encoding=$langinfo[CODESET] | |
| 257 | + local LC_ALL=C | |
| 258 | + export LC_ALL | |
| 259 | + | |
| 260 | + # Change + back to ' ' | |
| 261 | + local tmp=${encoded_url:gs/+/ /} | |
| 262 | + # Protect other escapes to pass through the printf unchanged | |
| 263 | + tmp=${tmp:gs/\\/\\\\/} | |
| 264 | + # Handle %-escapes by turning them into `\xXX` printf escapes | |
| 265 | + tmp=${tmp:gs/%/\\x/} | |
| 266 | + local decoded="$(printf -- "$tmp")" | |
| 267 | + | |
| 268 | + # Now we have a UTF-8 encoded string in the variable. We need to re-encode | |
| 269 | + # it if caller is in a non-UTF-8 locale. | |
| 270 | + local -a safe_encodings | |
| 271 | + safe_encodings=(UTF-8 utf8 US-ASCII) | |
| 272 | + if [[ -z ${safe_encodings[(r)$caller_encoding]} ]]; then | |
| 273 | + decoded=$(echo -E "$decoded" | iconv -f UTF-8 -t $caller_encoding) | |
| 274 | + if [[ $? != 0 ]]; then | |
| 275 | + echo "Error converting string from UTF-8 to $caller_encoding" >&2 | |
| 276 | + return 1 | |
| 277 | + fi | |
| 278 | + fi | |
| 279 | + | |
| 280 | + echo -E "$decoded" | |
| 281 | +} |
+367-0.oh-my-zsh/lib/git.zsh
| @@ -0,0 +1,367 @@ | ||
| 1 | +autoload -Uz is-at-least | |
| 2 | + | |
| 3 | +# The git prompt's git commands are read-only and should not interfere with | |
| 4 | +# other processes. This environment variable is equivalent to running with `git | |
| 5 | +# --no-optional-locks`, but falls back gracefully for older versions of git. | |
| 6 | +# See git(1) for and git-status(1) for a description of that flag. | |
| 7 | +# | |
| 8 | +# We wrap in a local function instead of exporting the variable directly in | |
| 9 | +# order to avoid interfering with manually-run git commands by the user. | |
| 10 | +function __git_prompt_git() { | |
| 11 | + GIT_OPTIONAL_LOCKS=0 command git "$@" | |
| 12 | +} | |
| 13 | + | |
| 14 | +function _omz_git_prompt_info() { | |
| 15 | + # If we are on a folder not tracked by git, get out. | |
| 16 | + # Otherwise, check for hide-info at global and local repository level | |
| 17 | + if ! __git_prompt_git rev-parse --git-dir &> /dev/null \ | |
| 18 | + || [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then | |
| 19 | + return 0 | |
| 20 | + fi | |
| 21 | + | |
| 22 | + # Get either: | |
| 23 | + # - the current branch name | |
| 24 | + # - the tag name if we are on a tag | |
| 25 | + # - the short SHA of the current commit | |
| 26 | + local ref | |
| 27 | + ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) \ | |
| 28 | + || ref=$(__git_prompt_git describe --tags --exact-match HEAD 2> /dev/null) \ | |
| 29 | + || ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) \ | |
| 30 | + || return 0 | |
| 31 | + | |
| 32 | + # Use global ZSH_THEME_GIT_SHOW_UPSTREAM=1 for including upstream remote info | |
| 33 | + local upstream | |
| 34 | + if (( ${+ZSH_THEME_GIT_SHOW_UPSTREAM} )); then | |
| 35 | + upstream=$(__git_prompt_git rev-parse --abbrev-ref --symbolic-full-name "@{upstream}" 2>/dev/null) \ | |
| 36 | + && upstream=" -> ${upstream}" | |
| 37 | + fi | |
| 38 | + | |
| 39 | + echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}" | |
| 40 | +} | |
| 41 | + | |
| 42 | +# Use async version if setting is enabled, or unset but zsh version is at least 5.0.6. | |
| 43 | +# This avoids async prompt issues caused by previous zsh versions: | |
| 44 | +# - https://github.com/ohmyzsh/ohmyzsh/issues/12331 | |
| 45 | +# - https://github.com/ohmyzsh/ohmyzsh/issues/12360 | |
| 46 | +# TODO(2024-06-12): @mcornella remove workaround when CentOS 7 reaches EOL | |
| 47 | +local _style | |
| 48 | +if zstyle -t ':omz:alpha:lib:git' async-prompt \ | |
| 49 | + || { is-at-least 5.0.6 && zstyle -T ':omz:alpha:lib:git' async-prompt }; then | |
| 50 | + function git_prompt_info() { | |
| 51 | + if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}" ]]; then | |
| 52 | + echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}" | |
| 53 | + fi | |
| 54 | + } | |
| 55 | + | |
| 56 | + function git_prompt_status() { | |
| 57 | + if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}" ]]; then | |
| 58 | + echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}" | |
| 59 | + fi | |
| 60 | + } | |
| 61 | + | |
| 62 | + # Conditionally register the async handler, only if it's needed in $PROMPT | |
| 63 | + # or any of the other prompt variables | |
| 64 | + function _defer_async_git_register() { | |
| 65 | + # Check if git_prompt_info is used in a prompt variable | |
| 66 | + case "${PS1}:${PS2}:${PS3}:${PS4}:${RPROMPT}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in | |
| 67 | + *(\$\(git_prompt_info\)|\`git_prompt_info\`)*) | |
| 68 | + _omz_register_handler _omz_git_prompt_info | |
| 69 | + ;; | |
| 70 | + esac | |
| 71 | + | |
| 72 | + case "${PS1}:${PS2}:${PS3}:${PS4}:${RPROMPT}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in | |
| 73 | + *(\$\(git_prompt_status\)|\`git_prompt_status\`)*) | |
| 74 | + _omz_register_handler _omz_git_prompt_status | |
| 75 | + ;; | |
| 76 | + esac | |
| 77 | + | |
| 78 | + add-zsh-hook -d precmd _defer_async_git_register | |
| 79 | + unset -f _defer_async_git_register | |
| 80 | + } | |
| 81 | + | |
| 82 | + # Register the async handler first. This needs to be done before | |
| 83 | + # the async request prompt is run | |
| 84 | + precmd_functions=(_defer_async_git_register $precmd_functions) | |
| 85 | +elif zstyle -s ':omz:alpha:lib:git' async-prompt _style && [[ $_style == "force" ]]; then | |
| 86 | + function git_prompt_info() { | |
| 87 | + if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}" ]]; then | |
| 88 | + echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}" | |
| 89 | + fi | |
| 90 | + } | |
| 91 | + | |
| 92 | + function git_prompt_status() { | |
| 93 | + if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}" ]]; then | |
| 94 | + echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}" | |
| 95 | + fi | |
| 96 | + } | |
| 97 | + | |
| 98 | + _omz_register_handler _omz_git_prompt_info | |
| 99 | + _omz_register_handler _omz_git_prompt_status | |
| 100 | +else | |
| 101 | + function git_prompt_info() { | |
| 102 | + _omz_git_prompt_info | |
| 103 | + } | |
| 104 | + function git_prompt_status() { | |
| 105 | + _omz_git_prompt_status | |
| 106 | + } | |
| 107 | +fi | |
| 108 | + | |
| 109 | +# Checks if working tree is dirty | |
| 110 | +function parse_git_dirty() { | |
| 111 | + local STATUS | |
| 112 | + local -a FLAGS | |
| 113 | + FLAGS=('--porcelain') | |
| 114 | + if [[ "$(__git_prompt_git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then | |
| 115 | + if [[ "${DISABLE_UNTRACKED_FILES_DIRTY:-}" == "true" ]]; then | |
| 116 | + FLAGS+='--untracked-files=no' | |
| 117 | + fi | |
| 118 | + case "${GIT_STATUS_IGNORE_SUBMODULES:-}" in | |
| 119 | + git) | |
| 120 | + # let git decide (this respects per-repo config in .gitmodules) | |
| 121 | + ;; | |
| 122 | + *) | |
| 123 | + # if unset: ignore dirty submodules | |
| 124 | + # other values are passed to --ignore-submodules | |
| 125 | + FLAGS+="--ignore-submodules=${GIT_STATUS_IGNORE_SUBMODULES:-dirty}" | |
| 126 | + ;; | |
| 127 | + esac | |
| 128 | + STATUS=$(__git_prompt_git status ${FLAGS} 2> /dev/null | tail -n 1) | |
| 129 | + fi | |
| 130 | + if [[ -n $STATUS ]]; then | |
| 131 | + echo "$ZSH_THEME_GIT_PROMPT_DIRTY" | |
| 132 | + else | |
| 133 | + echo "$ZSH_THEME_GIT_PROMPT_CLEAN" | |
| 134 | + fi | |
| 135 | +} | |
| 136 | + | |
| 137 | +# Gets the difference between the local and remote branches | |
| 138 | +function git_remote_status() { | |
| 139 | + local remote ahead behind git_remote_status git_remote_status_detailed | |
| 140 | + remote=${$(__git_prompt_git rev-parse --verify ${hook_com[branch]}@{upstream} --symbolic-full-name 2>/dev/null)/refs\/remotes\/} | |
| 141 | + if [[ -n ${remote} ]]; then | |
| 142 | + ahead=$(__git_prompt_git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l) | |
| 143 | + behind=$(__git_prompt_git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l) | |
| 144 | + | |
| 145 | + if [[ $ahead -eq 0 ]] && [[ $behind -eq 0 ]]; then | |
| 146 | + git_remote_status="$ZSH_THEME_GIT_PROMPT_EQUAL_REMOTE" | |
| 147 | + elif [[ $ahead -gt 0 ]] && [[ $behind -eq 0 ]]; then | |
| 148 | + git_remote_status="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE" | |
| 149 | + git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE$((ahead))%{$reset_color%}" | |
| 150 | + elif [[ $behind -gt 0 ]] && [[ $ahead -eq 0 ]]; then | |
| 151 | + git_remote_status="$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE" | |
| 152 | + git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE$((behind))%{$reset_color%}" | |
| 153 | + elif [[ $ahead -gt 0 ]] && [[ $behind -gt 0 ]]; then | |
| 154 | + git_remote_status="$ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE" | |
| 155 | + git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE$((ahead))%{$reset_color%}$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE$((behind))%{$reset_color%}" | |
| 156 | + fi | |
| 157 | + | |
| 158 | + if [[ -n $ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_DETAILED ]]; then | |
| 159 | + git_remote_status="$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_PREFIX${remote:gs/%/%%}$git_remote_status_detailed$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_SUFFIX" | |
| 160 | + fi | |
| 161 | + | |
| 162 | + echo $git_remote_status | |
| 163 | + fi | |
| 164 | +} | |
| 165 | + | |
| 166 | +# Outputs the name of the current branch | |
| 167 | +# Usage example: git pull origin $(git_current_branch) | |
| 168 | +# Using '--quiet' with 'symbolic-ref' will not cause a fatal error (128) if | |
| 169 | +# it's not a symbolic ref, but in a Git repo. | |
| 170 | +function git_current_branch() { | |
| 171 | + local ref | |
| 172 | + ref=$(__git_prompt_git symbolic-ref --quiet HEAD 2> /dev/null) | |
| 173 | + local ret=$? | |
| 174 | + if [[ $ret != 0 ]]; then | |
| 175 | + [[ $ret == 128 ]] && return # no git repo. | |
| 176 | + ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) || return | |
| 177 | + fi | |
| 178 | + echo ${ref#refs/heads/} | |
| 179 | +} | |
| 180 | + | |
| 181 | +# Outputs the name of the previously checked out branch | |
| 182 | +# Usage example: git pull origin $(git_previous_branch) | |
| 183 | +# rev-parse --symbolic-full-name @{-1} only prints if it is a branch | |
| 184 | +function git_previous_branch() { | |
| 185 | + local ref | |
| 186 | + ref=$(__git_prompt_git rev-parse --quiet --symbolic-full-name @{-1} 2> /dev/null) | |
| 187 | + local ret=$? | |
| 188 | + if [[ $ret != 0 ]] || [[ -z $ref ]]; then | |
| 189 | + return # no git repo or non-branch previous ref | |
| 190 | + fi | |
| 191 | + echo ${ref#refs/heads/} | |
| 192 | +} | |
| 193 | + | |
| 194 | +# Gets the number of commits ahead from remote | |
| 195 | +function git_commits_ahead() { | |
| 196 | + if __git_prompt_git rev-parse --git-dir &>/dev/null; then | |
| 197 | + local commits="$(__git_prompt_git rev-list --count @{upstream}..HEAD 2>/dev/null)" | |
| 198 | + if [[ -n "$commits" && "$commits" != 0 ]]; then | |
| 199 | + echo "$ZSH_THEME_GIT_COMMITS_AHEAD_PREFIX$commits$ZSH_THEME_GIT_COMMITS_AHEAD_SUFFIX" | |
| 200 | + fi | |
| 201 | + fi | |
| 202 | +} | |
| 203 | + | |
| 204 | +# Gets the number of commits behind remote | |
| 205 | +function git_commits_behind() { | |
| 206 | + if __git_prompt_git rev-parse --git-dir &>/dev/null; then | |
| 207 | + local commits="$(__git_prompt_git rev-list --count HEAD..@{upstream} 2>/dev/null)" | |
| 208 | + if [[ -n "$commits" && "$commits" != 0 ]]; then | |
| 209 | + echo "$ZSH_THEME_GIT_COMMITS_BEHIND_PREFIX$commits$ZSH_THEME_GIT_COMMITS_BEHIND_SUFFIX" | |
| 210 | + fi | |
| 211 | + fi | |
| 212 | +} | |
| 213 | + | |
| 214 | +# Outputs if current branch is ahead of remote | |
| 215 | +function git_prompt_ahead() { | |
| 216 | + if [[ -n "$(__git_prompt_git rev-list origin/$(git_current_branch)..HEAD 2> /dev/null)" ]]; then | |
| 217 | + echo "$ZSH_THEME_GIT_PROMPT_AHEAD" | |
| 218 | + fi | |
| 219 | +} | |
| 220 | + | |
| 221 | +# Outputs if current branch is behind remote | |
| 222 | +function git_prompt_behind() { | |
| 223 | + if [[ -n "$(__git_prompt_git rev-list HEAD..origin/$(git_current_branch) 2> /dev/null)" ]]; then | |
| 224 | + echo "$ZSH_THEME_GIT_PROMPT_BEHIND" | |
| 225 | + fi | |
| 226 | +} | |
| 227 | + | |
| 228 | +# Outputs if current branch exists on remote or not | |
| 229 | +function git_prompt_remote() { | |
| 230 | + if [[ -n "$(__git_prompt_git show-ref origin/$(git_current_branch) 2> /dev/null)" ]]; then | |
| 231 | + echo "$ZSH_THEME_GIT_PROMPT_REMOTE_EXISTS" | |
| 232 | + else | |
| 233 | + echo "$ZSH_THEME_GIT_PROMPT_REMOTE_MISSING" | |
| 234 | + fi | |
| 235 | +} | |
| 236 | + | |
| 237 | +# Formats prompt string for current git commit short SHA | |
| 238 | +function git_prompt_short_sha() { | |
| 239 | + local SHA | |
| 240 | + SHA=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER" | |
| 241 | +} | |
| 242 | + | |
| 243 | +# Formats prompt string for current git commit long SHA | |
| 244 | +function git_prompt_long_sha() { | |
| 245 | + local SHA | |
| 246 | + SHA=$(__git_prompt_git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER" | |
| 247 | +} | |
| 248 | + | |
| 249 | +function _omz_git_prompt_status() { | |
| 250 | + [[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return | |
| 251 | + | |
| 252 | + # Maps a git status prefix to an internal constant | |
| 253 | + # This cannot use the prompt constants, as they may be empty | |
| 254 | + local -A prefix_constant_map | |
| 255 | + prefix_constant_map=( | |
| 256 | + '\?\? ' 'UNTRACKED' | |
| 257 | + 'A ' 'ADDED' | |
| 258 | + 'M ' 'MODIFIED' | |
| 259 | + 'MM ' 'MODIFIED' | |
| 260 | + ' M ' 'MODIFIED' | |
| 261 | + 'AM ' 'MODIFIED' | |
| 262 | + ' T ' 'MODIFIED' | |
| 263 | + 'R ' 'RENAMED' | |
| 264 | + ' D ' 'DELETED' | |
| 265 | + 'D ' 'DELETED' | |
| 266 | + 'UU ' 'UNMERGED' | |
| 267 | + 'ahead' 'AHEAD' | |
| 268 | + 'behind' 'BEHIND' | |
| 269 | + 'diverged' 'DIVERGED' | |
| 270 | + 'stashed' 'STASHED' | |
| 271 | + ) | |
| 272 | + | |
| 273 | + # Maps the internal constant to the prompt theme | |
| 274 | + local -A constant_prompt_map | |
| 275 | + constant_prompt_map=( | |
| 276 | + 'UNTRACKED' "$ZSH_THEME_GIT_PROMPT_UNTRACKED" | |
| 277 | + 'ADDED' "$ZSH_THEME_GIT_PROMPT_ADDED" | |
| 278 | + 'MODIFIED' "$ZSH_THEME_GIT_PROMPT_MODIFIED" | |
| 279 | + 'RENAMED' "$ZSH_THEME_GIT_PROMPT_RENAMED" | |
| 280 | + 'DELETED' "$ZSH_THEME_GIT_PROMPT_DELETED" | |
| 281 | + 'UNMERGED' "$ZSH_THEME_GIT_PROMPT_UNMERGED" | |
| 282 | + 'AHEAD' "$ZSH_THEME_GIT_PROMPT_AHEAD" | |
| 283 | + 'BEHIND' "$ZSH_THEME_GIT_PROMPT_BEHIND" | |
| 284 | + 'DIVERGED' "$ZSH_THEME_GIT_PROMPT_DIVERGED" | |
| 285 | + 'STASHED' "$ZSH_THEME_GIT_PROMPT_STASHED" | |
| 286 | + ) | |
| 287 | + | |
| 288 | + # The order that the prompt displays should be added to the prompt | |
| 289 | + local status_constants | |
| 290 | + status_constants=( | |
| 291 | + UNTRACKED ADDED MODIFIED RENAMED DELETED | |
| 292 | + STASHED UNMERGED AHEAD BEHIND DIVERGED | |
| 293 | + ) | |
| 294 | + | |
| 295 | + local status_text | |
| 296 | + status_text="$(__git_prompt_git status --porcelain -b 2> /dev/null)" | |
| 297 | + | |
| 298 | + # Don't continue on a catastrophic failure | |
| 299 | + if [[ $? -eq 128 ]]; then | |
| 300 | + return 1 | |
| 301 | + fi | |
| 302 | + | |
| 303 | + # A lookup table of each git status encountered | |
| 304 | + local -A statuses_seen | |
| 305 | + | |
| 306 | + if __git_prompt_git rev-parse --verify refs/stash &>/dev/null; then | |
| 307 | + statuses_seen[STASHED]=1 | |
| 308 | + fi | |
| 309 | + | |
| 310 | + local status_lines | |
| 311 | + status_lines=("${(@f)${status_text}}") | |
| 312 | + | |
| 313 | + # If the tracking line exists, get and parse it | |
| 314 | + if [[ "$status_lines[1]" =~ "^## [^ ]+ \[(.*)\]" ]]; then | |
| 315 | + local branch_statuses | |
| 316 | + branch_statuses=("${(@s/,/)match}") | |
| 317 | + for branch_status in $branch_statuses; do | |
| 318 | + if [[ ! $branch_status =~ "(behind|diverged|ahead) ([0-9]+)?" ]]; then | |
| 319 | + continue | |
| 320 | + fi | |
| 321 | + local last_parsed_status=$prefix_constant_map[$match[1]] | |
| 322 | + statuses_seen[$last_parsed_status]=$match[2] | |
| 323 | + done | |
| 324 | + fi | |
| 325 | + | |
| 326 | + # For each status prefix, do a regex comparison | |
| 327 | + for status_prefix in ${(k)prefix_constant_map}; do | |
| 328 | + local status_constant="${prefix_constant_map[$status_prefix]}" | |
| 329 | + local status_regex=$'(^|\n)'"$status_prefix" | |
| 330 | + | |
| 331 | + if [[ "$status_text" =~ $status_regex ]]; then | |
| 332 | + statuses_seen[$status_constant]=1 | |
| 333 | + fi | |
| 334 | + done | |
| 335 | + | |
| 336 | + # Display the seen statuses in the order specified | |
| 337 | + local status_prompt | |
| 338 | + for status_constant in $status_constants; do | |
| 339 | + if (( ${+statuses_seen[$status_constant]} )); then | |
| 340 | + local next_display=$constant_prompt_map[$status_constant] | |
| 341 | + status_prompt="$next_display$status_prompt" | |
| 342 | + fi | |
| 343 | + done | |
| 344 | + | |
| 345 | + echo $status_prompt | |
| 346 | +} | |
| 347 | + | |
| 348 | +# Outputs the name of the current user | |
| 349 | +# Usage example: $(git_current_user_name) | |
| 350 | +function git_current_user_name() { | |
| 351 | + __git_prompt_git config user.name 2>/dev/null | |
| 352 | +} | |
| 353 | + | |
| 354 | +# Outputs the email of the current user | |
| 355 | +# Usage example: $(git_current_user_email) | |
| 356 | +function git_current_user_email() { | |
| 357 | + __git_prompt_git config user.email 2>/dev/null | |
| 358 | +} | |
| 359 | + | |
| 360 | +# Output the name of the root directory of the git repository | |
| 361 | +# Usage example: $(git_repo_name) | |
| 362 | +function git_repo_name() { | |
| 363 | + local repo_path | |
| 364 | + if repo_path="$(__git_prompt_git rev-parse --show-toplevel 2>/dev/null)" && [[ -n "$repo_path" ]]; then | |
| 365 | + echo ${repo_path:t} | |
| 366 | + fi | |
| 367 | +} |
+41-0.oh-my-zsh/lib/grep.zsh
| @@ -0,0 +1,41 @@ | ||
| 1 | +__GREP_CACHE_FILE="$ZSH_CACHE_DIR"/grep-alias | |
| 2 | + | |
| 3 | +# See if there's a cache file modified in the last day | |
| 4 | +__GREP_ALIAS_CACHES=("$__GREP_CACHE_FILE"(Nm-1)) | |
| 5 | +if [[ -n "$__GREP_ALIAS_CACHES" ]]; then | |
| 6 | + source "$__GREP_CACHE_FILE" | |
| 7 | +else | |
| 8 | + grep-flags-available() { | |
| 9 | + command grep "$@" "" &>/dev/null <<< "" | |
| 10 | + } | |
| 11 | + | |
| 12 | + # Ignore these folders (if the necessary grep flags are available) | |
| 13 | + EXC_FOLDERS="{.bzr,CVS,.git,.hg,.svn,.idea,.tox,.venv,venv}" | |
| 14 | + | |
| 15 | + # Check for --exclude-dir, otherwise check for --exclude. If --exclude | |
| 16 | + # isn't available, --color won't be either (they were released at the same | |
| 17 | + # time (v2.5): https://git.savannah.gnu.org/cgit/grep.git/tree/NEWS?id=1236f007 | |
| 18 | + if grep-flags-available --color=auto --exclude-dir=.cvs; then | |
| 19 | + GREP_OPTIONS="--color=auto --exclude-dir=$EXC_FOLDERS" | |
| 20 | + elif grep-flags-available --color=auto --exclude=.cvs; then | |
| 21 | + GREP_OPTIONS="--color=auto --exclude=$EXC_FOLDERS" | |
| 22 | + fi | |
| 23 | + | |
| 24 | + if [[ -n "$GREP_OPTIONS" ]]; then | |
| 25 | + # export grep, egrep and fgrep settings | |
| 26 | + alias grep="grep $GREP_OPTIONS" | |
| 27 | + alias egrep="grep -E" | |
| 28 | + alias fgrep="grep -F" | |
| 29 | + | |
| 30 | + # write to cache file if cache directory is writable | |
| 31 | + if [[ -w "$ZSH_CACHE_DIR" ]]; then | |
| 32 | + alias -L grep egrep fgrep >| "$__GREP_CACHE_FILE" | |
| 33 | + fi | |
| 34 | + fi | |
| 35 | + | |
| 36 | + # Clean up | |
| 37 | + unset GREP_OPTIONS EXC_FOLDERS | |
| 38 | + unfunction grep-flags-available | |
| 39 | +fi | |
| 40 | + | |
| 41 | +unset __GREP_CACHE_FILE __GREP_ALIAS_CACHES |
+48-0.oh-my-zsh/lib/history.zsh
| @@ -0,0 +1,48 @@ | ||
| 1 | +## History wrapper | |
| 2 | +function omz_history { | |
| 3 | + # parse arguments and remove from $@ | |
| 4 | + local clear list stamp REPLY | |
| 5 | + zparseopts -E -D c=clear l=list f=stamp E=stamp i=stamp t:=stamp | |
| 6 | + | |
| 7 | + if [[ -n "$clear" ]]; then | |
| 8 | + # if -c provided, clobber the history file | |
| 9 | + | |
| 10 | + # confirm action before deleting history | |
| 11 | + print -nu2 "This action will irreversibly delete your command history. Are you sure? [y/N] " | |
| 12 | + builtin read -E | |
| 13 | + [[ "$REPLY" = [yY] ]] || return 0 | |
| 14 | + | |
| 15 | + print -nu2 >| "$HISTFILE" | |
| 16 | + fc -p "$HISTFILE" | |
| 17 | + | |
| 18 | + print -u2 History file deleted. | |
| 19 | + elif [[ $# -eq 0 ]]; then | |
| 20 | + # if no arguments provided, show full history starting from 1 | |
| 21 | + builtin fc $stamp -l 1 | |
| 22 | + else | |
| 23 | + # otherwise, run `fc -l` with a custom format | |
| 24 | + builtin fc $stamp -l "$@" | |
| 25 | + fi | |
| 26 | +} | |
| 27 | + | |
| 28 | +# Timestamp format | |
| 29 | +case ${HIST_STAMPS-} in | |
| 30 | + "mm/dd/yyyy") alias history='omz_history -f' ;; | |
| 31 | + "dd.mm.yyyy") alias history='omz_history -E' ;; | |
| 32 | + "yyyy-mm-dd") alias history='omz_history -i' ;; | |
| 33 | + "") alias history='omz_history' ;; | |
| 34 | + *) alias history="omz_history -t '$HIST_STAMPS'" ;; | |
| 35 | +esac | |
| 36 | + | |
| 37 | +## History file configuration | |
| 38 | +[ -z "$HISTFILE" ] && HISTFILE="$HOME/.zsh_history" | |
| 39 | +[ "$HISTSIZE" -lt 50000 ] && HISTSIZE=50000 | |
| 40 | +[ "$SAVEHIST" -lt 10000 ] && SAVEHIST=10000 | |
| 41 | + | |
| 42 | +## History command configuration | |
| 43 | +setopt extended_history # record timestamp of command in HISTFILE | |
| 44 | +setopt hist_expire_dups_first # delete duplicates first when HISTFILE size exceeds HISTSIZE | |
| 45 | +setopt hist_ignore_dups # ignore duplicated commands history list | |
| 46 | +setopt hist_ignore_space # ignore commands that start with space | |
| 47 | +setopt hist_verify # show command with history expansion to user before running it | |
| 48 | +setopt share_history # share command history data |
+145-0.oh-my-zsh/lib/key-bindings.zsh
| @@ -0,0 +1,145 @@ | ||
| 1 | +# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html | |
| 2 | +# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Zle-Builtins | |
| 3 | +# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Standard-Widgets | |
| 4 | + | |
| 5 | +# Make sure that the terminal is in application mode when zle is active, since | |
| 6 | +# only then values from $terminfo are valid | |
| 7 | +if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then | |
| 8 | + function zle-line-init() { | |
| 9 | + echoti smkx | |
| 10 | + } | |
| 11 | + function zle-line-finish() { | |
| 12 | + echoti rmkx | |
| 13 | + } | |
| 14 | + zle -N zle-line-init | |
| 15 | + zle -N zle-line-finish | |
| 16 | +fi | |
| 17 | + | |
| 18 | +# Use emacs key bindings | |
| 19 | +bindkey -e | |
| 20 | + | |
| 21 | +# [PageUp] - Up a line of history | |
| 22 | +if [[ -n "${terminfo[kpp]}" ]]; then | |
| 23 | + bindkey -M emacs "${terminfo[kpp]}" up-line-or-history | |
| 24 | + bindkey -M viins "${terminfo[kpp]}" up-line-or-history | |
| 25 | + bindkey -M vicmd "${terminfo[kpp]}" up-line-or-history | |
| 26 | +fi | |
| 27 | +# [PageDown] - Down a line of history | |
| 28 | +if [[ -n "${terminfo[knp]}" ]]; then | |
| 29 | + bindkey -M emacs "${terminfo[knp]}" down-line-or-history | |
| 30 | + bindkey -M viins "${terminfo[knp]}" down-line-or-history | |
| 31 | + bindkey -M vicmd "${terminfo[knp]}" down-line-or-history | |
| 32 | +fi | |
| 33 | + | |
| 34 | +# Start typing + [Up-Arrow] - fuzzy find history forward | |
| 35 | +autoload -U up-line-or-beginning-search | |
| 36 | +zle -N up-line-or-beginning-search | |
| 37 | + | |
| 38 | +bindkey -M emacs "^[[A" up-line-or-beginning-search | |
| 39 | +bindkey -M viins "^[[A" up-line-or-beginning-search | |
| 40 | +bindkey -M vicmd "^[[A" up-line-or-beginning-search | |
| 41 | +if [[ -n "${terminfo[kcuu1]}" ]]; then | |
| 42 | + bindkey -M emacs "${terminfo[kcuu1]}" up-line-or-beginning-search | |
| 43 | + bindkey -M viins "${terminfo[kcuu1]}" up-line-or-beginning-search | |
| 44 | + bindkey -M vicmd "${terminfo[kcuu1]}" up-line-or-beginning-search | |
| 45 | +fi | |
| 46 | + | |
| 47 | +# Start typing + [Down-Arrow] - fuzzy find history backward | |
| 48 | +autoload -U down-line-or-beginning-search | |
| 49 | +zle -N down-line-or-beginning-search | |
| 50 | + | |
| 51 | +bindkey -M emacs "^[[B" down-line-or-beginning-search | |
| 52 | +bindkey -M viins "^[[B" down-line-or-beginning-search | |
| 53 | +bindkey -M vicmd "^[[B" down-line-or-beginning-search | |
| 54 | +if [[ -n "${terminfo[kcud1]}" ]]; then | |
| 55 | + bindkey -M emacs "${terminfo[kcud1]}" down-line-or-beginning-search | |
| 56 | + bindkey -M viins "${terminfo[kcud1]}" down-line-or-beginning-search | |
| 57 | + bindkey -M vicmd "${terminfo[kcud1]}" down-line-or-beginning-search | |
| 58 | +fi | |
| 59 | + | |
| 60 | +# [Home] - Go to beginning of line | |
| 61 | +if [[ -n "${terminfo[khome]}" ]]; then | |
| 62 | + bindkey -M emacs "${terminfo[khome]}" beginning-of-line | |
| 63 | + bindkey -M viins "${terminfo[khome]}" beginning-of-line | |
| 64 | + bindkey -M vicmd "${terminfo[khome]}" beginning-of-line | |
| 65 | +fi | |
| 66 | +# [End] - Go to end of line | |
| 67 | +if [[ -n "${terminfo[kend]}" ]]; then | |
| 68 | + bindkey -M emacs "${terminfo[kend]}" end-of-line | |
| 69 | + bindkey -M viins "${terminfo[kend]}" end-of-line | |
| 70 | + bindkey -M vicmd "${terminfo[kend]}" end-of-line | |
| 71 | +fi | |
| 72 | + | |
| 73 | +# [Shift-Tab] - move through the completion menu backwards | |
| 74 | +if [[ -n "${terminfo[kcbt]}" ]]; then | |
| 75 | + bindkey -M emacs "${terminfo[kcbt]}" reverse-menu-complete | |
| 76 | + bindkey -M viins "${terminfo[kcbt]}" reverse-menu-complete | |
| 77 | + bindkey -M vicmd "${terminfo[kcbt]}" reverse-menu-complete | |
| 78 | +fi | |
| 79 | + | |
| 80 | +# [Backspace] - delete backward | |
| 81 | +bindkey -M emacs '^?' backward-delete-char | |
| 82 | +bindkey -M viins '^?' backward-delete-char | |
| 83 | +bindkey -M vicmd '^?' backward-delete-char | |
| 84 | +# [Delete] - delete forward | |
| 85 | +if [[ -n "${terminfo[kdch1]}" ]]; then | |
| 86 | + bindkey -M emacs "${terminfo[kdch1]}" delete-char | |
| 87 | + bindkey -M viins "${terminfo[kdch1]}" delete-char | |
| 88 | + bindkey -M vicmd "${terminfo[kdch1]}" delete-char | |
| 89 | +else | |
| 90 | + bindkey -M emacs "^[[3~" delete-char | |
| 91 | + bindkey -M viins "^[[3~" delete-char | |
| 92 | + bindkey -M vicmd "^[[3~" delete-char | |
| 93 | + | |
| 94 | + bindkey -M emacs "^[3;5~" delete-char | |
| 95 | + bindkey -M viins "^[3;5~" delete-char | |
| 96 | + bindkey -M vicmd "^[3;5~" delete-char | |
| 97 | +fi | |
| 98 | + | |
| 99 | +# [Ctrl-Delete] - delete whole forward-word | |
| 100 | +bindkey -M emacs '^[[3;5~' kill-word | |
| 101 | +bindkey -M viins '^[[3;5~' kill-word | |
| 102 | +bindkey -M vicmd '^[[3;5~' kill-word | |
| 103 | + | |
| 104 | +# [Ctrl-RightArrow] - move forward one word | |
| 105 | +bindkey -M emacs '^[[1;5C' forward-word | |
| 106 | +bindkey -M viins '^[[1;5C' forward-word | |
| 107 | +bindkey -M vicmd '^[[1;5C' forward-word | |
| 108 | +# [Ctrl-LeftArrow] - move backward one word | |
| 109 | +bindkey -M emacs '^[[1;5D' backward-word | |
| 110 | +bindkey -M viins '^[[1;5D' backward-word | |
| 111 | +bindkey -M vicmd '^[[1;5D' backward-word | |
| 112 | + | |
| 113 | + | |
| 114 | +bindkey '\ew' kill-region # [Esc-w] - Kill from the cursor to the mark | |
| 115 | +bindkey -s '\el' 'ls\n' # [Esc-l] - run command: ls | |
| 116 | +bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backward incrementally for a specified string. The string may begin with ^ to anchor the search to the beginning of the line. | |
| 117 | +bindkey ' ' magic-space # [Space] - don't do history expansion | |
| 118 | + | |
| 119 | + | |
| 120 | +# Edit the current command line in $EDITOR | |
| 121 | +autoload -U edit-command-line | |
| 122 | +zle -N edit-command-line | |
| 123 | +bindkey '\C-x\C-e' edit-command-line | |
| 124 | + | |
| 125 | +# file rename magick | |
| 126 | +bindkey "^[m" copy-prev-shell-word | |
| 127 | + | |
| 128 | +# consider emacs keybindings: | |
| 129 | + | |
| 130 | +#bindkey -e ## emacs key bindings | |
| 131 | +# | |
| 132 | +#bindkey '^[[A' up-line-or-search | |
| 133 | +#bindkey '^[[B' down-line-or-search | |
| 134 | +#bindkey '^[^[[C' emacs-forward-word | |
| 135 | +#bindkey '^[^[[D' emacs-backward-word | |
| 136 | +# | |
| 137 | +#bindkey -s '^X^Z' '%-^M' | |
| 138 | +#bindkey '^[e' expand-cmd-path | |
| 139 | +#bindkey '^[^I' reverse-menu-complete | |
| 140 | +#bindkey '^X^N' accept-and-infer-next-history | |
| 141 | +#bindkey '^W' kill-region | |
| 142 | +#bindkey '^I' complete-word | |
| 143 | +## Fix weird sequence that rxvt produces | |
| 144 | +#bindkey -s '^[[Z' '\t' | |
| 145 | +# |
+38-0.oh-my-zsh/lib/misc.zsh
| @@ -0,0 +1,38 @@ | ||
| 1 | +autoload -Uz is-at-least | |
| 2 | + | |
| 3 | +# *-magic is known buggy in some versions; disable if so | |
| 4 | +if [[ $DISABLE_MAGIC_FUNCTIONS != true ]]; then | |
| 5 | + for d in $fpath; do | |
| 6 | + if [[ -e "$d/url-quote-magic" ]]; then | |
| 7 | + if is-at-least 5.1; then | |
| 8 | + autoload -Uz bracketed-paste-magic | |
| 9 | + zle -N bracketed-paste bracketed-paste-magic | |
| 10 | + fi | |
| 11 | + autoload -Uz url-quote-magic | |
| 12 | + zle -N self-insert url-quote-magic | |
| 13 | + break | |
| 14 | + fi | |
| 15 | + done | |
| 16 | +fi | |
| 17 | + | |
| 18 | +setopt multios # enable redirect to multiple streams: echo >file1 >file2 | |
| 19 | +setopt long_list_jobs # show long list format job notifications | |
| 20 | +setopt interactivecomments # recognize comments | |
| 21 | + | |
| 22 | +# define pager depending on what is available (less or more) | |
| 23 | +if (( ${+commands[less]} )); then | |
| 24 | + env_default 'PAGER' 'less' | |
| 25 | + env_default 'LESS' '-R' | |
| 26 | +elif (( ${+commands[more]} )); then | |
| 27 | + env_default 'PAGER' 'more' | |
| 28 | +fi | |
| 29 | + | |
| 30 | +## super user alias | |
| 31 | +alias _='sudo ' | |
| 32 | + | |
| 33 | +## more intelligent acking for ubuntu users and no alias for users without ack | |
| 34 | +if (( $+commands[ack-grep] )); then | |
| 35 | + alias afind='ack-grep -il' | |
| 36 | +elif (( $+commands[ack] )); then | |
| 37 | + alias afind='ack -il' | |
| 38 | +fi |
+6-0.oh-my-zsh/lib/nvm.zsh
| @@ -0,0 +1,6 @@ | ||
| 1 | +# get the nvm-controlled node.js version | |
| 2 | +function nvm_prompt_info() { | |
| 3 | + which nvm &>/dev/null || return | |
| 4 | + local nvm_prompt=${$(nvm current)#v} | |
| 5 | + echo "${ZSH_THEME_NVM_PROMPT_PREFIX}${nvm_prompt:gs/%/%%}${ZSH_THEME_NVM_PROMPT_SUFFIX}" | |
| 6 | +} |
+45-0.oh-my-zsh/lib/prompt_info_functions.zsh
| @@ -0,0 +1,45 @@ | ||
| 1 | +# *_prompt_info functions for usage in your prompt | |
| 2 | +# | |
| 3 | +# Plugin creators, please add your *_prompt_info function to the list | |
| 4 | +# of dummy implementations to help theme creators not receiving errors | |
| 5 | +# without the need of implementing conditional clauses. | |
| 6 | +# | |
| 7 | +# See also lib/bzr.zsh, lib/git.zsh and lib/nvm.zsh for | |
| 8 | +# git_prompt_info, bzr_prompt_info and nvm_prompt_info | |
| 9 | + | |
| 10 | +# Dummy implementations that return false to prevent command_not_found | |
| 11 | +# errors with themes, that implement these functions | |
| 12 | +# Real implementations will be used when the respective plugins are loaded | |
| 13 | +function chruby_prompt_info \ | |
| 14 | + rbenv_prompt_info \ | |
| 15 | + hg_prompt_info \ | |
| 16 | + pyenv_prompt_info \ | |
| 17 | + svn_prompt_info \ | |
| 18 | + vi_mode_prompt_info \ | |
| 19 | + virtualenv_prompt_info \ | |
| 20 | + jenv_prompt_info \ | |
| 21 | + azure_prompt_info \ | |
| 22 | + tf_prompt_info \ | |
| 23 | + conda_prompt_info \ | |
| 24 | +{ | |
| 25 | + return 1 | |
| 26 | +} | |
| 27 | + | |
| 28 | +# oh-my-zsh supports an rvm prompt by default | |
| 29 | +# get the name of the rvm ruby version | |
| 30 | +function rvm_prompt_info() { | |
| 31 | + [ -f $HOME/.rvm/bin/rvm-prompt ] || return 1 | |
| 32 | + local rvm_prompt | |
| 33 | + rvm_prompt=$($HOME/.rvm/bin/rvm-prompt ${=ZSH_THEME_RVM_PROMPT_OPTIONS} 2>/dev/null) | |
| 34 | + [[ -z "${rvm_prompt}" ]] && return 1 | |
| 35 | + echo "${ZSH_THEME_RUBY_PROMPT_PREFIX}${rvm_prompt:gs/%/%%}${ZSH_THEME_RUBY_PROMPT_SUFFIX}" | |
| 36 | +} | |
| 37 | + | |
| 38 | +ZSH_THEME_RVM_PROMPT_OPTIONS="i v g" | |
| 39 | + | |
| 40 | + | |
| 41 | +# use this to enable users to see their ruby version, no matter which | |
| 42 | +# version management system they use | |
| 43 | +function ruby_prompt_info() { | |
| 44 | + echo "$(rvm_prompt_info || rbenv_prompt_info || chruby_prompt_info)" | |
| 45 | +} |
+38-0.oh-my-zsh/lib/spectrum.zsh
| @@ -0,0 +1,38 @@ | ||
| 1 | +# A script to make using 256 colors in zsh less painful. | |
| 2 | +# P.C. Shyamshankar <sykora@lucentbeing.com> | |
| 3 | +# Copied from https://github.com/sykora/etc/blob/master/zsh/functions/spectrum/ | |
| 4 | + | |
| 5 | +typeset -AHg FX FG BG | |
| 6 | + | |
| 7 | +FX=( | |
| 8 | + reset "%{[00m%}" | |
| 9 | + bold "%{[01m%}" no-bold "%{[22m%}" | |
| 10 | + dim "%{[02m%}" no-dim "%{[22m%}" | |
| 11 | + italic "%{[03m%}" no-italic "%{[23m%}" | |
| 12 | + underline "%{[04m%}" no-underline "%{[24m%}" | |
| 13 | + blink "%{[05m%}" no-blink "%{[25m%}" | |
| 14 | + reverse "%{[07m%}" no-reverse "%{[27m%}" | |
| 15 | +) | |
| 16 | + | |
| 17 | +for color in {000..255}; do | |
| 18 | + FG[$color]="%{[38;5;${color}m%}" | |
| 19 | + BG[$color]="%{[48;5;${color}m%}" | |
| 20 | +done | |
| 21 | + | |
| 22 | +# Show all 256 colors with color number | |
| 23 | +function spectrum_ls() { | |
| 24 | + setopt localoptions nopromptsubst | |
| 25 | + local ZSH_SPECTRUM_TEXT=${ZSH_SPECTRUM_TEXT:-Arma virumque cano Troiae qui primus ab oris} | |
| 26 | + for code in {000..255}; do | |
| 27 | + print -P -- "$code: ${FG[$code]}${ZSH_SPECTRUM_TEXT}%{$reset_color%}" | |
| 28 | + done | |
| 29 | +} | |
| 30 | + | |
| 31 | +# Show all 256 colors where the background is set to specific color | |
| 32 | +function spectrum_bls() { | |
| 33 | + setopt localoptions nopromptsubst | |
| 34 | + local ZSH_SPECTRUM_TEXT=${ZSH_SPECTRUM_TEXT:-Arma virumque cano Troiae qui primus ab oris} | |
| 35 | + for code in {000..255}; do | |
| 36 | + print -P -- "$code: ${BG[$code]}${ZSH_SPECTRUM_TEXT}%{$reset_color%}" | |
| 37 | + done | |
| 38 | +} |
+164-0.oh-my-zsh/lib/termsupport.zsh
| @@ -0,0 +1,164 @@ | ||
| 1 | +# Set terminal window and tab/icon title | |
| 2 | +# | |
| 3 | +# usage: title short_tab_title [long_window_title] | |
| 4 | +# | |
| 5 | +# See: http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#ss3.1 | |
| 6 | +# Fully supports screen, iterm, and probably most modern xterm and rxvt | |
| 7 | +# (In screen, only short_tab_title is used) | |
| 8 | +# Limited support for Apple Terminal (Terminal can't set window and tab separately) | |
| 9 | +function title { | |
| 10 | + setopt localoptions nopromptsubst | |
| 11 | + | |
| 12 | + # Don't set the title if inside emacs, unless using vterm | |
| 13 | + [[ -n "${INSIDE_EMACS:-}" && "$INSIDE_EMACS" != vterm ]] && return | |
| 14 | + | |
| 15 | + # if $2 is unset use $1 as default | |
| 16 | + # if it is set and empty, leave it as is | |
| 17 | + : ${2=$1} | |
| 18 | + | |
| 19 | + case "$TERM" in | |
| 20 | + cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty*|st*|foot*|contour*) | |
| 21 | + print -Pn "\e]2;${2:q}\a" # set window name | |
| 22 | + print -Pn "\e]1;${1:q}\a" # set tab name | |
| 23 | + ;; | |
| 24 | + screen*|tmux*) | |
| 25 | + print -Pn "\ek${1:q}\e\\" # set screen hardstatus | |
| 26 | + ;; | |
| 27 | + *) | |
| 28 | + if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then | |
| 29 | + print -Pn "\e]2;${2:q}\a" # set window name | |
| 30 | + print -Pn "\e]1;${1:q}\a" # set tab name | |
| 31 | + else | |
| 32 | + # Try to use terminfo to set the title if the feature is available | |
| 33 | + if (( ${+terminfo[fsl]} && ${+terminfo[tsl]} )); then | |
| 34 | + print -Pn "${terminfo[tsl]}$1${terminfo[fsl]}" | |
| 35 | + fi | |
| 36 | + fi | |
| 37 | + ;; | |
| 38 | + esac | |
| 39 | +} | |
| 40 | + | |
| 41 | +ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD | |
| 42 | +ZSH_THEME_TERM_TITLE_IDLE="%n@%m:%~" | |
| 43 | +# Avoid duplication of directory in terminals with independent dir display | |
| 44 | +if [[ "$TERM_PROGRAM" == Apple_Terminal ]]; then | |
| 45 | + ZSH_THEME_TERM_TITLE_IDLE="%n@%m" | |
| 46 | +fi | |
| 47 | + | |
| 48 | +# Runs before showing the prompt | |
| 49 | +function omz_termsupport_precmd { | |
| 50 | + [[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return 0 | |
| 51 | + title "$ZSH_THEME_TERM_TAB_TITLE_IDLE" "$ZSH_THEME_TERM_TITLE_IDLE" | |
| 52 | +} | |
| 53 | + | |
| 54 | +# Runs before executing the command | |
| 55 | +function omz_termsupport_preexec { | |
| 56 | + [[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return | |
| 57 | + | |
| 58 | + emulate -L zsh | |
| 59 | + setopt extended_glob | |
| 60 | + | |
| 61 | + # split command into array of arguments | |
| 62 | + local -a cmdargs | |
| 63 | + cmdargs=("${(z)2}") | |
| 64 | + # if running fg, extract the command from the job description | |
| 65 | + if [[ "${cmdargs[1]}" = fg ]]; then | |
| 66 | + # get the job id from the first argument passed to the fg command | |
| 67 | + local job_id jobspec="${cmdargs[2]#%}" | |
| 68 | + # logic based on jobs arguments: | |
| 69 | + # http://zsh.sourceforge.net/Doc/Release/Jobs-_0026-Signals.html#Jobs | |
| 70 | + # https://www.zsh.org/mla/users/2007/msg00704.html | |
| 71 | + case "$jobspec" in | |
| 72 | + <->) # %number argument: | |
| 73 | + # use the same <number> passed as an argument | |
| 74 | + job_id=${jobspec} ;; | |
| 75 | + ""|%|+) # empty, %% or %+ argument: | |
| 76 | + # use the current job, which appears with a + in $jobstates: | |
| 77 | + # suspended:+:5071=suspended (tty output) | |
| 78 | + job_id=${(k)jobstates[(r)*:+:*]} ;; | |
| 79 | + -) # %- argument: | |
| 80 | + # use the previous job, which appears with a - in $jobstates: | |
| 81 | + # suspended:-:6493=suspended (signal) | |
| 82 | + job_id=${(k)jobstates[(r)*:-:*]} ;; | |
| 83 | + [?]*) # %?string argument: | |
| 84 | + # use $jobtexts to match for a job whose command *contains* <string> | |
| 85 | + job_id=${(k)jobtexts[(r)*${(Q)jobspec}*]} ;; | |
| 86 | + *) # %string argument: | |
| 87 | + # use $jobtexts to match for a job whose command *starts with* <string> | |
| 88 | + job_id=${(k)jobtexts[(r)${(Q)jobspec}*]} ;; | |
| 89 | + esac | |
| 90 | + | |
| 91 | + # override preexec function arguments with job command | |
| 92 | + if [[ -n "${jobtexts[$job_id]}" ]]; then | |
| 93 | + 1="${jobtexts[$job_id]}" | |
| 94 | + 2="${jobtexts[$job_id]}" | |
| 95 | + fi | |
| 96 | + fi | |
| 97 | + | |
| 98 | + # cmd name only, or if this is sudo or ssh, the next cmd | |
| 99 | + local CMD="${1[(wr)^(*=*|sudo|ssh|mosh|rake|-*)]:gs/%/%%}" | |
| 100 | + local LINE="${2:gs/%/%%}" | |
| 101 | + | |
| 102 | + title "$CMD" "%100>...>${LINE}%<<" | |
| 103 | +} | |
| 104 | + | |
| 105 | +autoload -Uz add-zsh-hook | |
| 106 | + | |
| 107 | +if [[ -z "$INSIDE_EMACS" || "$INSIDE_EMACS" = vterm ]]; then | |
| 108 | + add-zsh-hook precmd omz_termsupport_precmd | |
| 109 | + add-zsh-hook preexec omz_termsupport_preexec | |
| 110 | +fi | |
| 111 | + | |
| 112 | +# Keep terminal emulator's current working directory correct, | |
| 113 | +# even if the current working directory path contains symbolic links | |
| 114 | +# | |
| 115 | +# References: | |
| 116 | +# - Apple's Terminal.app: https://superuser.com/a/315029 | |
| 117 | +# - iTerm2: https://iterm2.com/documentation-escape-codes.html (iTerm2 Extension / CurrentDir+RemoteHost) | |
| 118 | +# - Konsole: https://bugs.kde.org/show_bug.cgi?id=327720#c1 | |
| 119 | +# - libvte (gnome-terminal, mate-terminal, โฆ): https://bugzilla.gnome.org/show_bug.cgi?id=675987#c14 | |
| 120 | +# Apparently it had a bug before ~2012 were it would display the unknown OSC 7 code | |
| 121 | +# | |
| 122 | +# As of May 2021 mlterm, PuTTY, rxvt, screen, termux & xterm simply ignore the unknown OSC. | |
| 123 | + | |
| 124 | +# Don't define the function if we're inside Emacs or in an SSH session (#11696) | |
| 125 | +if [[ -n "$INSIDE_EMACS" || -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then | |
| 126 | + return | |
| 127 | +fi | |
| 128 | + | |
| 129 | +# Don't define the function if we're in an unsupported terminal | |
| 130 | +case "$TERM" in | |
| 131 | + # all of these either process OSC 7 correctly or ignore entirely | |
| 132 | + xterm*|putty*|rxvt*|konsole*|mlterm*|alacritty*|screen*|tmux*) ;; | |
| 133 | + contour*|foot*) ;; | |
| 134 | + *) | |
| 135 | + # Terminal.app and iTerm2 process OSC 7 correctly | |
| 136 | + case "$TERM_PROGRAM" in | |
| 137 | + Apple_Terminal|iTerm.app) ;; | |
| 138 | + *) return ;; | |
| 139 | + esac ;; | |
| 140 | +esac | |
| 141 | + | |
| 142 | +# Emits the control sequence to notify many terminal emulators | |
| 143 | +# of the cwd | |
| 144 | +# | |
| 145 | +# Identifies the directory using a file: URI scheme, including | |
| 146 | +# the host name to disambiguate local vs. remote paths. | |
| 147 | +function omz_termsupport_cwd { | |
| 148 | + setopt localoptions unset | |
| 149 | + # Percent-encode the host and path names. | |
| 150 | + local URL_HOST URL_PATH | |
| 151 | + URL_HOST="$(omz_urlencode -P $HOST)" || return 1 | |
| 152 | + URL_PATH="$(omz_urlencode -P $PWD)" || return 1 | |
| 153 | + | |
| 154 | + # Konsole errors if the HOST is provided | |
| 155 | + [[ -z "$KONSOLE_PROFILE_NAME" && -z "$KONSOLE_DBUS_SESSION" ]] || URL_HOST="" | |
| 156 | + | |
| 157 | + # common control sequence (OSC 7) to set current host and path | |
| 158 | + printf "\e]7;file://%s%s\e\\" "${URL_HOST}" "${URL_PATH}" | |
| 159 | +} | |
| 160 | + | |
| 161 | +# Use a precmd hook instead of a chpwd hook to avoid contaminating output | |
| 162 | +# i.e. when a script or function changes directory without `cd -q`, chpwd | |
| 163 | +# will be called the output may be swallowed by the script or function. | |
| 164 | +add-zsh-hook precmd omz_termsupport_cwd |
+169-0.oh-my-zsh/lib/tests/cli.test.zsh
| @@ -0,0 +1,169 @@ | ||
| 1 | +#!/usr/bin/zsh -df | |
| 2 | + | |
| 3 | +run_awk() { | |
| 4 | + local -a dis_plugins=(${=1}) | |
| 5 | + local input_text="$2" | |
| 6 | + | |
| 7 | + (( ! DEBUG )) || set -xv | |
| 8 | + | |
| 9 | + local awk_subst_plugins="\ | |
| 10 | + gsub(/[ \t]+(${(j:|:)dis_plugins})[ \t]+/, \" \") # with spaces before or after | |
| 11 | + gsub(/[ \t]+(${(j:|:)dis_plugins})$/, \"\") # with spaces before and EOL | |
| 12 | + gsub(/^(${(j:|:)dis_plugins})[ \t]+/, \"\") # with BOL and spaces after | |
| 13 | + | |
| 14 | + gsub(/\((${(j:|:)dis_plugins})[ \t]+/, \"(\") # with parenthesis before and spaces after | |
| 15 | + gsub(/[ \t]+(${(j:|:)dis_plugins})\)/, \")\") # with spaces before or parenthesis after | |
| 16 | + gsub(/\((${(j:|:)dis_plugins})\)/, \"()\") # with only parentheses | |
| 17 | + | |
| 18 | + gsub(/^(${(j:|:)dis_plugins})\)/, \")\") # with BOL and closing parenthesis | |
| 19 | + gsub(/\((${(j:|:)dis_plugins})$/, \"(\") # with opening parenthesis and EOL | |
| 20 | + " | |
| 21 | + # Disable plugins awk script | |
| 22 | + local awk_script=" | |
| 23 | + # if plugins=() is in oneline form, substitute disabled plugins and go to next line | |
| 24 | + /^[ \t]*plugins=\([^#]+\).*\$/ { | |
| 25 | + $awk_subst_plugins | |
| 26 | + print \$0 | |
| 27 | + next | |
| 28 | + } | |
| 29 | + | |
| 30 | + # if plugins=() is in multiline form, enable multi flag and disable plugins if they're there | |
| 31 | + /^[ \t]*plugins=\(/ { | |
| 32 | + multi=1 | |
| 33 | + $awk_subst_plugins | |
| 34 | + print \$0 | |
| 35 | + next | |
| 36 | + } | |
| 37 | + | |
| 38 | + # if multi flag is enabled and we find a valid closing parenthesis, remove plugins and disable multi flag | |
| 39 | + multi == 1 && /^[^#]*\)/ { | |
| 40 | + multi=0 | |
| 41 | + $awk_subst_plugins | |
| 42 | + print \$0 | |
| 43 | + next | |
| 44 | + } | |
| 45 | + | |
| 46 | + multi == 1 && length(\$0) > 0 { | |
| 47 | + $awk_subst_plugins | |
| 48 | + if (length(\$0) > 0) print \$0 | |
| 49 | + next | |
| 50 | + } | |
| 51 | + | |
| 52 | + { print \$0 } | |
| 53 | + " | |
| 54 | + | |
| 55 | + command awk "$awk_script" <<< "$input_text" | |
| 56 | + | |
| 57 | + (( ! DEBUG )) || set +xv | |
| 58 | +} | |
| 59 | + | |
| 60 | +# runs awk against stdin, checks if the resulting file is not empty and then checks if the file has valid zsh syntax | |
| 61 | +run_awk_and_test() { | |
| 62 | + local description="$1" | |
| 63 | + local plugins_to_disable="$2" | |
| 64 | + local input_text="$3" | |
| 65 | + local expected_output="$4" | |
| 66 | + | |
| 67 | + local tmpfile==(:) | |
| 68 | + | |
| 69 | + { | |
| 70 | + print -u2 "Test: $description" | |
| 71 | + DEBUG=0 run_awk "$plugins_to_disable" "$input_text" >| $tmpfile | |
| 72 | + | |
| 73 | + if [[ ! -s "$tmpfile" ]]; then | |
| 74 | + print -u2 "\e[31mError\e[0m: output file empty" | |
| 75 | + return 1 | |
| 76 | + fi | |
| 77 | + | |
| 78 | + if ! zsh -n $tmpfile; then | |
| 79 | + print -u2 "\e[31mError\e[0m: zsh syntax error" | |
| 80 | + diff -u $tmpfile <(echo "$expected_output") | |
| 81 | + return 1 | |
| 82 | + fi | |
| 83 | + | |
| 84 | + if ! diff -u --color=always $tmpfile <(echo "$expected_output"); then | |
| 85 | + if (( DEBUG )); then | |
| 86 | + print -u2 "" | |
| 87 | + DEBUG=1 run_awk "$plugins_to_disable" "$input_text" | |
| 88 | + print -u2 "" | |
| 89 | + fi | |
| 90 | + print -u2 "\e[31mError\e[0m: output file does not match expected output" | |
| 91 | + return 1 | |
| 92 | + fi | |
| 93 | + | |
| 94 | + print -u2 "\e[32mSuccess\e[0m" | |
| 95 | + } always { | |
| 96 | + print -u2 "" | |
| 97 | + command rm -f "$tmpfile" | |
| 98 | + } | |
| 99 | +} | |
| 100 | + | |
| 101 | +# These tests are for the `omz plugin disable` command | |
| 102 | +run_awk_and_test \ | |
| 103 | + "it should delete a single plugin in oneline format" \ | |
| 104 | + "git" \ | |
| 105 | + "plugins=(git)" \ | |
| 106 | + "plugins=()" | |
| 107 | + | |
| 108 | +run_awk_and_test \ | |
| 109 | + "it should delete a single plugin in multiline format" \ | |
| 110 | + "github" \ | |
| 111 | +"plugins=( | |
| 112 | + github | |
| 113 | +)" \ | |
| 114 | +"plugins=( | |
| 115 | +)" | |
| 116 | + | |
| 117 | +run_awk_and_test \ | |
| 118 | + "it should delete multiple plugins in oneline format" \ | |
| 119 | + "github git z" \ | |
| 120 | + "plugins=(github git z)" \ | |
| 121 | + "plugins=()" | |
| 122 | + | |
| 123 | +run_awk_and_test \ | |
| 124 | + "it should delete multiple plugins in multiline format" \ | |
| 125 | + "github git z" \ | |
| 126 | +"plugins=( | |
| 127 | + github | |
| 128 | + git | |
| 129 | + z | |
| 130 | +)" \ | |
| 131 | +"plugins=( | |
| 132 | +)" | |
| 133 | + | |
| 134 | +run_awk_and_test \ | |
| 135 | + "it should delete a single plugin among multiple in oneline format" \ | |
| 136 | + "git" \ | |
| 137 | + "plugins=(github git z)" \ | |
| 138 | + "plugins=(github z)" | |
| 139 | + | |
| 140 | +run_awk_and_test \ | |
| 141 | + "it should delete a single plugin among multiple in multiline format" \ | |
| 142 | + "git" \ | |
| 143 | +"plugins=( | |
| 144 | + github | |
| 145 | + git | |
| 146 | + z | |
| 147 | +)" \ | |
| 148 | +"plugins=( | |
| 149 | + github | |
| 150 | + z | |
| 151 | +)" | |
| 152 | + | |
| 153 | +run_awk_and_test \ | |
| 154 | + "it should delete multiple plugins in mixed format" \ | |
| 155 | + "git z" \ | |
| 156 | +"plugins=(github | |
| 157 | +git z)" \ | |
| 158 | +"plugins=(github | |
| 159 | +)" | |
| 160 | + | |
| 161 | +run_awk_and_test \ | |
| 162 | + "it should delete multiple plugins in mixed format 2" \ | |
| 163 | + "github z" \ | |
| 164 | +"plugins=(github | |
| 165 | + git | |
| 166 | +z)" \ | |
| 167 | +"plugins=( | |
| 168 | + git | |
| 169 | +)" |
+81-0.oh-my-zsh/lib/theme-and-appearance.zsh
| @@ -0,0 +1,81 @@ | ||
| 1 | +# Sets color variable such as $fg, $bg, $color and $reset_color | |
| 2 | +autoload -U colors && colors | |
| 3 | + | |
| 4 | +# Expand variables and commands in PROMPT variables | |
| 5 | +setopt prompt_subst | |
| 6 | + | |
| 7 | +# Prompt function theming defaults | |
| 8 | +ZSH_THEME_GIT_PROMPT_PREFIX="git:(" # Beginning of the git prompt, before the branch name | |
| 9 | +ZSH_THEME_GIT_PROMPT_SUFFIX=")" # End of the git prompt | |
| 10 | +ZSH_THEME_GIT_PROMPT_DIRTY="*" # Text to display if the branch is dirty | |
| 11 | +ZSH_THEME_GIT_PROMPT_CLEAN="" # Text to display if the branch is clean | |
| 12 | +ZSH_THEME_RUBY_PROMPT_PREFIX="(" | |
| 13 | +ZSH_THEME_RUBY_PROMPT_SUFFIX=")" | |
| 14 | + | |
| 15 | + | |
| 16 | +# Use diff --color if available | |
| 17 | +if command diff --color /dev/null{,} &>/dev/null; then | |
| 18 | + function diff { | |
| 19 | + command diff --color "$@" | |
| 20 | + } | |
| 21 | +fi | |
| 22 | + | |
| 23 | +# Don't set ls coloring if disabled | |
| 24 | +[[ "$DISABLE_LS_COLORS" != true ]] || return 0 | |
| 25 | + | |
| 26 | +# Default coloring for BSD-based ls | |
| 27 | +export LSCOLORS="Gxfxcxdxbxegedabagacad" | |
| 28 | + | |
| 29 | +# Default coloring for GNU-based ls | |
| 30 | +if [[ -z "$LS_COLORS" ]]; then | |
| 31 | + # Define LS_COLORS via dircolors if available. Otherwise, set a default | |
| 32 | + # equivalent to LSCOLORS (generated via https://geoff.greer.fm/lscolors) | |
| 33 | + if (( $+commands[dircolors] )); then | |
| 34 | + [[ -f "$HOME/.dircolors" ]] \ | |
| 35 | + && source <(dircolors -b "$HOME/.dircolors") \ | |
| 36 | + || source <(dircolors -b) | |
| 37 | + else | |
| 38 | + export LS_COLORS="di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43" | |
| 39 | + fi | |
| 40 | +fi | |
| 41 | + | |
| 42 | +function test-ls-args { | |
| 43 | + local cmd="$1" # ls, gls, colorls, ... | |
| 44 | + local args="${@[2,-1]}" # arguments except the first one | |
| 45 | + command "$cmd" "$args" /dev/null &>/dev/null | |
| 46 | +} | |
| 47 | + | |
| 48 | +# Find the option for using colors in ls, depending on the version | |
| 49 | +case "$OSTYPE" in | |
| 50 | + netbsd*) | |
| 51 | + # On NetBSD, test if `gls` (GNU ls) is installed (this one supports colors); | |
| 52 | + # otherwise, leave ls as is, because NetBSD's ls doesn't support -G | |
| 53 | + test-ls-args gls --color && alias ls='gls --color=tty' | |
| 54 | + ;; | |
| 55 | + openbsd*) | |
| 56 | + # On OpenBSD, `gls` (ls from GNU coreutils) and `colorls` (ls from base, | |
| 57 | + # with color and multibyte support) are available from ports. | |
| 58 | + # `colorls` will be installed on purpose and can't be pulled in by installing | |
| 59 | + # coreutils (which might be installed for ), so prefer it to `gls`. | |
| 60 | + test-ls-args gls --color && alias ls='gls --color=tty' | |
| 61 | + test-ls-args colorls -G && alias ls='colorls -G' | |
| 62 | + ;; | |
| 63 | + (darwin|freebsd)*) | |
| 64 | + # This alias works by default just using $LSCOLORS | |
| 65 | + test-ls-args ls -G && alias ls='ls -G' | |
| 66 | + # Only use GNU ls if installed and there are user defaults for $LS_COLORS, | |
| 67 | + # as the default coloring scheme is not very pretty | |
| 68 | + zstyle -t ':omz:lib:theme-and-appearance' gnu-ls \ | |
| 69 | + && test-ls-args gls --color \ | |
| 70 | + && alias ls='gls --color=tty' | |
| 71 | + ;; | |
| 72 | + *) | |
| 73 | + if test-ls-args ls --color; then | |
| 74 | + alias ls='ls --color=tty' | |
| 75 | + elif test-ls-args ls -G; then | |
| 76 | + alias ls='ls -G' | |
| 77 | + fi | |
| 78 | + ;; | |
| 79 | +esac | |
| 80 | + | |
| 81 | +unfunction test-ls-args |
+53-0.oh-my-zsh/lib/vcs_info.zsh
| @@ -0,0 +1,53 @@ | ||
| 1 | +# Don't skip this file until a Zsh release does the necessary quoting. | |
| 2 | +# This is because even though 5.8.1 undid recursive prompt_subst inside | |
| 3 | +# prompt sequences, % characters in relevant fields will still be rendered | |
| 4 | +# incorrectly in vcs_info, on all Zsh releases up to writing this. | |
| 5 | +# | |
| 6 | +# There is no release yet that does this right, since it requires changing | |
| 7 | +# how what vcs_info hooks expect to receive. Even so, I'd rather be correct | |
| 8 | +# and break custom vcs_info hooks than have a broken prompt. | |
| 9 | + | |
| 10 | +# Quote necessary $hook_com[<field>] items just before they are used | |
| 11 | +# in the line "VCS_INFO_hook 'post-backend'" of the VCS_INFO_formats | |
| 12 | +# function, where <field> is: | |
| 13 | +# | |
| 14 | +# base: the full path of the repository's root directory. | |
| 15 | +# base-name: the name of the repository's root directory. | |
| 16 | +# branch: the name of the currently checked out branch. | |
| 17 | +# misc: a string that may contain anything the vcs_info backend wants. | |
| 18 | +# revision: an identifier of the currently checked out revision. | |
| 19 | +# subdir: the path of the current directory relative to the | |
| 20 | +# repository's root directory. | |
| 21 | +# | |
| 22 | +# This patch %-quotes these fields previous to their use in vcs_info hooks and | |
| 23 | +# the zformat call and, eventually, when they get expanded in the prompt. | |
| 24 | +# It's important to quote these here, and not later after hooks have modified the | |
| 25 | +# fields, because then we could be quoting % characters from valid prompt sequences, | |
| 26 | +# like %F{color}, %B, etc. | |
| 27 | +# | |
| 28 | +# 32 โ hook_com[subdir]="$(VCS_INFO_reposub ${hook_com[base]})" | |
| 29 | +# 33 โ hook_com[subdir_orig]="${hook_com[subdir]}" | |
| 30 | +# 34 โ | |
| 31 | +# 35 + โ for tmp in base base-name branch misc revision subdir; do | |
| 32 | +# 36 + โ hook_com[$tmp]="${hook_com[$tmp]//\%/%%}" | |
| 33 | +# 37 + โ done | |
| 34 | +# 38 + โ | |
| 35 | +# 39 โ VCS_INFO_hook 'post-backend' | |
| 36 | +# | |
| 37 | +# This is especially important so that no command substitution is performed | |
| 38 | +# due to malicious input as a consequence of CVE-2021-45444, which affects | |
| 39 | +# zsh versions from 5.0.3 to 5.8. | |
| 40 | +# | |
| 41 | +autoload -Uz +X regexp-replace VCS_INFO_formats 2>/dev/null || return 0 | |
| 42 | + | |
| 43 | +# We use $tmp here because it's already a local variable in VCS_INFO_formats | |
| 44 | +typeset PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"' | |
| 45 | +# Unique string to avoid reapplying the patch if this code gets called twice | |
| 46 | +typeset PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b | |
| 47 | +# Only patch the VCS_INFO_formats function if not already patched | |
| 48 | +if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then | |
| 49 | + regexp-replace 'functions[VCS_INFO_formats]' \ | |
| 50 | + "VCS_INFO_hook 'post-backend'" \ | |
| 51 | + ': ${PATCH_ID}; ${PATCH}; ${MATCH}' | |
| 52 | +fi | |
| 53 | +unset PATCH PATCH_ID |
+234-0.oh-my-zsh/oh-my-zsh.sh
| @@ -0,0 +1,234 @@ | ||
| 1 | +# ANSI formatting function (\033[<code>m) | |
| 2 | +# 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red, 33: yellow | |
| 3 | +omz_f() { | |
| 4 | + [ $# -gt 0 ] || return | |
| 5 | + IFS=";" printf "\033[%sm" $* | |
| 6 | +} | |
| 7 | +# If stdout is not a terminal ignore all formatting | |
| 8 | +[ -t 1 ] || omz_f() { :; } | |
| 9 | + | |
| 10 | +# Protect against non-zsh execution of Oh My Zsh (use POSIX syntax here) | |
| 11 | +[ -n "$ZSH_VERSION" ] || { | |
| 12 | + omz_ptree() { | |
| 13 | + # Get process tree of the current process | |
| 14 | + pid=$$; pids="$pid" | |
| 15 | + while [ ${pid-0} -ne 1 ] && ppid=$(ps -e -o pid,ppid | awk "\$1 == $pid { print \$2 }"); do | |
| 16 | + pids="$pids $pid"; pid=$ppid | |
| 17 | + done | |
| 18 | + | |
| 19 | + # Show process tree | |
| 20 | + case "$(uname)" in | |
| 21 | + Linux) ps -o ppid,pid,command -f -p $pids 2>/dev/null ;; | |
| 22 | + Darwin|*) ps -o ppid,pid,command -p $pids 2>/dev/null ;; | |
| 23 | + esac | |
| 24 | + | |
| 25 | + # If ps command failed, try Busybox ps | |
| 26 | + [ $? -eq 0 ] || ps -o ppid,pid,comm | awk "NR == 1 || index(\"$pids\", \$2) != 0" | |
| 27 | + } | |
| 28 | + | |
| 29 | + { | |
| 30 | + shell=$(ps -o pid,comm | awk "\$1 == $$ { print \$2 }") | |
| 31 | + printf "$(omz_f 1 31)Error:$(omz_f 22) Oh My Zsh can't be loaded from: $(omz_f 1)${shell}$(omz_f 22). " | |
| 32 | + printf "You need to run $(omz_f 1)zsh$(omz_f 22) instead.$(omz_f 0)\n" | |
| 33 | + printf "$(omz_f 33)Here's the process tree:$(omz_f 22)\n\n" | |
| 34 | + omz_ptree | |
| 35 | + printf "$(omz_f 0)\n" | |
| 36 | + } >&2 | |
| 37 | + | |
| 38 | + return 1 | |
| 39 | +} | |
| 40 | + | |
| 41 | +# Check if in emulation mode, if so early return | |
| 42 | +# https://github.com/ohmyzsh/ohmyzsh/issues/11686 | |
| 43 | +[[ "$(emulate)" = zsh ]] || { | |
| 44 | + printf "$(omz_f 1 31)Error:$(omz_f 22) Oh My Zsh can't be loaded in \`$(emulate)\` emulation mode.$(omz_f 0)\n" >&2 | |
| 45 | + return 1 | |
| 46 | +} | |
| 47 | + | |
| 48 | +unset -f omz_f | |
| 49 | + | |
| 50 | +# If ZSH is not defined, use the current script's directory. | |
| 51 | +[[ -n "$ZSH" ]] || export ZSH="${${(%):-%x}:a:h}" | |
| 52 | + | |
| 53 | +# Set ZSH_CUSTOM to the path where your custom config files | |
| 54 | +# and plugins exists, or else we will use the default custom/ | |
| 55 | +[[ -n "$ZSH_CUSTOM" ]] || ZSH_CUSTOM="$ZSH/custom" | |
| 56 | + | |
| 57 | +# Set ZSH_CACHE_DIR to the path where cache files should be created | |
| 58 | +# or else we will use the default cache/ | |
| 59 | +[[ -n "$ZSH_CACHE_DIR" ]] || ZSH_CACHE_DIR="$ZSH/cache" | |
| 60 | + | |
| 61 | +# Make sure $ZSH_CACHE_DIR is writable, otherwise use a directory in $HOME | |
| 62 | +if [[ ! -w "$ZSH_CACHE_DIR" ]]; then | |
| 63 | + ZSH_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/oh-my-zsh" | |
| 64 | +fi | |
| 65 | + | |
| 66 | +# Create cache and completions dir and add to $fpath | |
| 67 | +mkdir -p "$ZSH_CACHE_DIR/completions" | |
| 68 | +(( ${fpath[(Ie)$ZSH_CACHE_DIR/completions]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath) | |
| 69 | + | |
| 70 | +# Check for updates on initial load... | |
| 71 | +source "$ZSH/tools/check_for_upgrade.sh" | |
| 72 | + | |
| 73 | +# Initializes Oh My Zsh | |
| 74 | + | |
| 75 | +# add a function path | |
| 76 | +fpath=($ZSH/{functions,completions} $ZSH_CUSTOM/{functions,completions} $fpath) | |
| 77 | + | |
| 78 | +# Load all stock functions (from $fpath files) called below. | |
| 79 | +autoload -U compaudit compinit zrecompile | |
| 80 | + | |
| 81 | +is_plugin() { | |
| 82 | + local base_dir=$1 | |
| 83 | + local name=$2 | |
| 84 | + builtin test -f $base_dir/plugins/$name/$name.plugin.zsh \ | |
| 85 | + || builtin test -f $base_dir/plugins/$name/_$name | |
| 86 | +} | |
| 87 | + | |
| 88 | +# Add all defined plugins to fpath. This must be done | |
| 89 | +# before running compinit. | |
| 90 | +for plugin ($plugins); do | |
| 91 | + if is_plugin "$ZSH_CUSTOM" "$plugin"; then | |
| 92 | + fpath=("$ZSH_CUSTOM/plugins/$plugin" $fpath) | |
| 93 | + elif is_plugin "$ZSH" "$plugin"; then | |
| 94 | + fpath=("$ZSH/plugins/$plugin" $fpath) | |
| 95 | + else | |
| 96 | + echo "[oh-my-zsh] plugin '$plugin' not found" | |
| 97 | + fi | |
| 98 | +done | |
| 99 | + | |
| 100 | +# Figure out the SHORT hostname | |
| 101 | +if [[ "$OSTYPE" = darwin* ]]; then | |
| 102 | + # macOS's $HOST changes with dhcp, etc. Use ComputerName if possible. | |
| 103 | + SHORT_HOST=$(scutil --get ComputerName 2>/dev/null) || SHORT_HOST="${HOST/.*/}" | |
| 104 | +else | |
| 105 | + SHORT_HOST="${HOST/.*/}" | |
| 106 | +fi | |
| 107 | + | |
| 108 | +# Save the location of the current completion dump file. | |
| 109 | +if [[ -z "$ZSH_COMPDUMP" ]]; then | |
| 110 | + ZSH_COMPDUMP="${ZDOTDIR:-$HOME}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}" | |
| 111 | +fi | |
| 112 | + | |
| 113 | +# Construct zcompdump OMZ metadata | |
| 114 | +zcompdump_revision="#omz revision: $(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)" | |
| 115 | +zcompdump_fpath="#omz fpath: $fpath" | |
| 116 | + | |
| 117 | +# Delete the zcompdump file if OMZ zcompdump metadata changed | |
| 118 | +if ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null \ | |
| 119 | + || ! command grep -q -Fx "$zcompdump_fpath" "$ZSH_COMPDUMP" 2>/dev/null; then | |
| 120 | + command rm -f "$ZSH_COMPDUMP" | |
| 121 | + zcompdump_refresh=1 | |
| 122 | +fi | |
| 123 | + | |
| 124 | +if [[ "$ZSH_DISABLE_COMPFIX" != true ]]; then | |
| 125 | + source "$ZSH/lib/compfix.zsh" | |
| 126 | + # Load only from secure directories | |
| 127 | + compinit -i -d "$ZSH_COMPDUMP" | |
| 128 | + # If completion insecurities exist, warn the user | |
| 129 | + handle_completion_insecurities &| | |
| 130 | +else | |
| 131 | + # If the user wants it, load from all found directories | |
| 132 | + compinit -u -d "$ZSH_COMPDUMP" | |
| 133 | +fi | |
| 134 | + | |
| 135 | +# Append zcompdump metadata if missing | |
| 136 | +if (( $zcompdump_refresh )) \ | |
| 137 | + || ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null; then | |
| 138 | + # Use `tee` in case the $ZSH_COMPDUMP filename is invalid, to silence the error | |
| 139 | + # See https://github.com/ohmyzsh/ohmyzsh/commit/dd1a7269#commitcomment-39003489 | |
| 140 | + tee -a "$ZSH_COMPDUMP" &>/dev/null <<EOF | |
| 141 | + | |
| 142 | +$zcompdump_revision | |
| 143 | +$zcompdump_fpath | |
| 144 | +EOF | |
| 145 | +fi | |
| 146 | +unset zcompdump_revision zcompdump_fpath zcompdump_refresh | |
| 147 | + | |
| 148 | +# zcompile the completion dump file if the .zwc is older or missing. | |
| 149 | +if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then | |
| 150 | + zrecompile -q -p "$ZSH_COMPDUMP" | |
| 151 | + command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock" | |
| 152 | +fi | |
| 153 | + | |
| 154 | +_omz_source() { | |
| 155 | + local context filepath="$1" | |
| 156 | + | |
| 157 | + # Construct zstyle context based on path | |
| 158 | + case "$filepath" in | |
| 159 | + lib/*) context="lib:${filepath:t:r}" ;; # :t = lib_name.zsh, :r = lib_name | |
| 160 | + plugins/*) context="plugins:${filepath:h:t}" ;; # :h = plugins/plugin_name, :t = plugin_name | |
| 161 | + esac | |
| 162 | + | |
| 163 | + local disable_aliases=0 | |
| 164 | + zstyle -T ":omz:${context}" aliases || disable_aliases=1 | |
| 165 | + | |
| 166 | + # Back up alias names prior to sourcing | |
| 167 | + local -A aliases_pre galiases_pre | |
| 168 | + if (( disable_aliases )); then | |
| 169 | + aliases_pre=("${(@kv)aliases}") | |
| 170 | + galiases_pre=("${(@kv)galiases}") | |
| 171 | + fi | |
| 172 | + | |
| 173 | + # Source file from $ZSH_CUSTOM if it exists, otherwise from $ZSH | |
| 174 | + if [[ -f "$ZSH_CUSTOM/$filepath" ]]; then | |
| 175 | + source "$ZSH_CUSTOM/$filepath" | |
| 176 | + elif [[ -f "$ZSH/$filepath" ]]; then | |
| 177 | + source "$ZSH/$filepath" | |
| 178 | + fi | |
| 179 | + | |
| 180 | + # Unset all aliases that don't appear in the backed up list of aliases | |
| 181 | + if (( disable_aliases )); then | |
| 182 | + if (( #aliases_pre )); then | |
| 183 | + aliases=("${(@kv)aliases_pre}") | |
| 184 | + else | |
| 185 | + (( #aliases )) && unalias "${(@k)aliases}" | |
| 186 | + fi | |
| 187 | + if (( #galiases_pre )); then | |
| 188 | + galiases=("${(@kv)galiases_pre}") | |
| 189 | + else | |
| 190 | + (( #galiases )) && unalias "${(@k)galiases}" | |
| 191 | + fi | |
| 192 | + fi | |
| 193 | +} | |
| 194 | + | |
| 195 | +# Load all of the lib files in ~/.oh-my-zsh/lib that end in .zsh | |
| 196 | +# TIP: Add files you don't want in git to .gitignore | |
| 197 | +for lib_file ("$ZSH"/lib/*.zsh); do | |
| 198 | + _omz_source "lib/${lib_file:t}" | |
| 199 | +done | |
| 200 | +unset lib_file | |
| 201 | + | |
| 202 | +# Load all of the plugins that were defined in ~/.zshrc | |
| 203 | +for plugin ($plugins); do | |
| 204 | + _omz_source "plugins/$plugin/$plugin.plugin.zsh" | |
| 205 | +done | |
| 206 | +unset plugin | |
| 207 | + | |
| 208 | +# Load all of your custom configurations from custom/ | |
| 209 | +for config_file ("$ZSH_CUSTOM"/*.zsh(N)); do | |
| 210 | + source "$config_file" | |
| 211 | +done | |
| 212 | +unset config_file | |
| 213 | + | |
| 214 | +# Load the theme | |
| 215 | +is_theme() { | |
| 216 | + local base_dir=$1 | |
| 217 | + local name=$2 | |
| 218 | + builtin test -f $base_dir/$name.zsh-theme | |
| 219 | +} | |
| 220 | + | |
| 221 | +if [[ -n "$ZSH_THEME" ]]; then | |
| 222 | + if is_theme "$ZSH_CUSTOM" "$ZSH_THEME"; then | |
| 223 | + source "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme" | |
| 224 | + elif is_theme "$ZSH_CUSTOM/themes" "$ZSH_THEME"; then | |
| 225 | + source "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme" | |
| 226 | + elif is_theme "$ZSH/themes" "$ZSH_THEME"; then | |
| 227 | + source "$ZSH/themes/$ZSH_THEME.zsh-theme" | |
| 228 | + else | |
| 229 | + echo "[oh-my-zsh] theme '$ZSH_THEME' not found" | |
| 230 | + fi | |
| 231 | +fi | |
| 232 | + | |
| 233 | +# set completion colors to be the same as `ls`, after theme has been loaded | |
| 234 | +[[ -z "$LS_COLORS" ]] || zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" |
+15-0.oh-my-zsh/plugins/1password/1password.plugin.zsh
| @@ -0,0 +1,15 @@ | ||
| 1 | +# Do nothing if op is not installed | |
| 2 | +(( ${+commands[op]} )) || return | |
| 3 | + | |
| 4 | +# If the completion file doesn't exist yet, we need to autoload it and | |
| 5 | +# bind it to `op`. Otherwise, compinit will have already done that. | |
| 6 | +if [[ ! -f "$ZSH_CACHE_DIR/completions/_op" ]]; then | |
| 7 | + typeset -g -A _comps | |
| 8 | + autoload -Uz _op | |
| 9 | + _comps[op]=_op | |
| 10 | +fi | |
| 11 | + | |
| 12 | +op completion zsh >| "$ZSH_CACHE_DIR/completions/_op" &| | |
| 13 | + | |
| 14 | +# Load opswd function | |
| 15 | +autoload -Uz opswd |
+40-0.oh-my-zsh/plugins/1password/README.md
| @@ -0,0 +1,40 @@ | ||
| 1 | +# 1Password | |
| 2 | + | |
| 3 | +This plugin adds 1Password functionality to oh-my-zsh. | |
| 4 | + | |
| 5 | +To use, add `1password` to the list of plugins in your `.zshrc` file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... 1password) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +Then, you can use the command `opswd` to copy passwords for services into your | |
| 12 | +clipboard. | |
| 13 | + | |
| 14 | +## `opswd` | |
| 15 | + | |
| 16 | +The `opswd` command is a wrapper around the `op` command. It takes a service | |
| 17 | +name as an argument and copies the username, then the password for that service | |
| 18 | +to the clipboard, after confirmation on the user part. | |
| 19 | + | |
| 20 | +If the service also contains a TOTP, it is copied to the clipboard after confirmation | |
| 21 | +on the user part. Finally, after 20 seconds, the clipboard is cleared. | |
| 22 | + | |
| 23 | +For example, `opswd github.com` will put your GitHub username into your clipboard. Then, | |
| 24 | +it will ask for confirmation to continue, and copy the password to your clipboard. Finally, | |
| 25 | +if a TOTP is available, it will be copied to the clipboard after your confirmation. | |
| 26 | + | |
| 27 | +This function has completion support, so you can use tab completion to select which | |
| 28 | +service you want to get. | |
| 29 | + | |
| 30 | +> NOTE: you need to be signed in for `opswd` to work. If you are using biometric unlock, | |
| 31 | +> 1Password CLI will automatically prompt you to sign in. See: | |
| 32 | +> | |
| 33 | +> - [Get started with 1Password CLI 2: Sign in](https://developer.1password.com/docs/cli/get-started#sign-in) | |
| 34 | +> - [Sign in to your 1Password account manually](https://developer.1password.com/docs/cli/sign-in-manually) | |
| 35 | + | |
| 36 | +## Requirements | |
| 37 | + | |
| 38 | +- [1Password CLI 2](https://developer.1password.com/docs/cli/get-started#install) | |
| 39 | + | |
| 40 | + > NOTE: if you're using 1Password CLI 1, [see how to upgrade to CLI 2](https://developer.1password.com/docs/cli/upgrade). |
+19-0.oh-my-zsh/plugins/1password/_opswd
| @@ -0,0 +1,19 @@ | ||
| 1 | +#compdef opswd | |
| 2 | + | |
| 3 | +function _opswd() { | |
| 4 | + local -a services | |
| 5 | + services=("${(@f)$(op item list --categories Login --cache 2>/dev/null | awk 'NR != 1 { print $2 }')}") | |
| 6 | + [[ -z "$services" ]] || compadd -a -- services | |
| 7 | +} | |
| 8 | + | |
| 9 | +# TODO: 2022-03-26: Remove support for op CLI 1 | |
| 10 | +autoload -Uz is-at-least | |
| 11 | +is-at-least 2.0.0 $(op --version) || { | |
| 12 | + function _opswd() { | |
| 13 | + local -a services | |
| 14 | + services=("${(@f)$(op list items --categories Login 2>/dev/null | op get item - --fields title 2>/dev/null)}") | |
| 15 | + [[ -z "$services" ]] || compadd -a -- services | |
| 16 | + } | |
| 17 | +} | |
| 18 | + | |
| 19 | +_opswd "$@" |
+90-0.oh-my-zsh/plugins/1password/opswd
| @@ -0,0 +1,90 @@ | ||
| 1 | +#autoload | |
| 2 | + | |
| 3 | +# opswd puts the password of the named service into the clipboard. If there's a | |
| 4 | +# one time password, it will be copied into the clipboard after 10 seconds. The | |
| 5 | +# clipboard is cleared after another 20 seconds. | |
| 6 | +function opswd() { | |
| 7 | + if [[ $# -lt 1 ]]; then | |
| 8 | + echo "Usage: opswd <service>" | |
| 9 | + return 1 | |
| 10 | + fi | |
| 11 | + | |
| 12 | + local service=$1 | |
| 13 | + | |
| 14 | + # If not logged in, print error and return | |
| 15 | + op user list > /dev/null || return | |
| 16 | + | |
| 17 | + local username | |
| 18 | + # Copy the username to the clipboard | |
| 19 | + if ! username=$(op item get "$service" --fields username 2>/dev/null); then | |
| 20 | + echo "error: could not obtain username for $service" | |
| 21 | + return 1 | |
| 22 | + fi | |
| 23 | + | |
| 24 | + echo -n "$username" | clipcopy | |
| 25 | + echo "โ username for service $service copied to the clipboard. Press Enter to continue" | |
| 26 | + read | |
| 27 | + | |
| 28 | + local password | |
| 29 | + # Copy the password to the clipboard | |
| 30 | + if ! password=$(op item get "$service" --reveal --fields password 2>/dev/null); then | |
| 31 | + echo "error: could not obtain password for $service" | |
| 32 | + return 1 | |
| 33 | + fi | |
| 34 | + | |
| 35 | + echo -n "$password" | clipcopy | |
| 36 | + echo "โ password for $service copied to clipboard. Press Enter to continue" | |
| 37 | + read | |
| 38 | + | |
| 39 | + # If there's a one time password, copy it to the clipboard | |
| 40 | + local totp | |
| 41 | + if totp=$(op item get --otp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then | |
| 42 | + echo -n "$totp" | clipcopy | |
| 43 | + echo "โ TOTP for $service copied to clipboard" | |
| 44 | + fi | |
| 45 | + | |
| 46 | + (sleep 20 && clipcopy </dev/null 2>/dev/null) &! | |
| 47 | +} | |
| 48 | + | |
| 49 | +# TODO: 2022-03-26: Remove support for op CLI 1 | |
| 50 | +autoload -Uz is-at-least | |
| 51 | +is-at-least 2.0.0 $(op --version) || { | |
| 52 | + print -ru2 ${(%):-"%F{yellow}opswd: usage with op version $(op --version) is deprecated. Upgrade to CLI 2 and reload zsh. | |
| 53 | +For instructions, see https://developer.1password.com/docs/cli/upgrade.%f"} | |
| 54 | + | |
| 55 | + # opswd puts the password of the named service into the clipboard. If there's a | |
| 56 | + # one time password, it will be copied into the clipboard after 10 seconds. The | |
| 57 | + # clipboard is cleared after another 20 seconds. | |
| 58 | + function opswd() { | |
| 59 | + if [[ $# -lt 1 ]]; then | |
| 60 | + echo "Usage: opswd <service>" | |
| 61 | + return 1 | |
| 62 | + fi | |
| 63 | + | |
| 64 | + local service=$1 | |
| 65 | + | |
| 66 | + # If not logged in, print error and return | |
| 67 | + op list users > /dev/null || return | |
| 68 | + | |
| 69 | + local password | |
| 70 | + # Copy the password to the clipboard | |
| 71 | + if ! password=$(op get item "$service" --fields password 2>/dev/null); then | |
| 72 | + echo "error: could not obtain password for $service" | |
| 73 | + return 1 | |
| 74 | + fi | |
| 75 | + | |
| 76 | + echo -n "$password" | clipcopy | |
| 77 | + echo "โ password for $service copied to clipboard" | |
| 78 | + | |
| 79 | + # If there's a one time password, copy it to the clipboard after 5 seconds | |
| 80 | + local totp | |
| 81 | + if totp=$(op get totp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then | |
| 82 | + sleep 10 && echo -n "$totp" | clipcopy | |
| 83 | + echo "โ TOTP for $service copied to clipboard" | |
| 84 | + fi | |
| 85 | + | |
| 86 | + (sleep 20 && clipcopy </dev/null 2>/dev/null) &! | |
| 87 | + } | |
| 88 | +} | |
| 89 | + | |
| 90 | +opswd "$@" |
+9-0.oh-my-zsh/plugins/alias-finder/.zunit.yml
| @@ -0,0 +1,9 @@ | ||
| 1 | +tap: false | |
| 2 | +directories: | |
| 3 | + tests: tests | |
| 4 | + output: tests/_output | |
| 5 | + support: tests/_support | |
| 6 | +time_limit: 0 | |
| 7 | +fail_fast: false | |
| 8 | +allow_risky: false | |
| 9 | +verbose: true |
+68-0.oh-my-zsh/plugins/alias-finder/README.md
| @@ -0,0 +1,68 @@ | ||
| 1 | +# alias-finder plugin | |
| 2 | + | |
| 3 | +This plugin searches the defined aliases and outputs any that match the command inputted. This makes learning new aliases easier. | |
| 4 | + | |
| 5 | +## Setup | |
| 6 | + | |
| 7 | +To use it, add `alias-finder` to the `plugins` array of your zshrc file: | |
| 8 | +``` | |
| 9 | +plugins=(... alias-finder) | |
| 10 | +``` | |
| 11 | + | |
| 12 | +To enable it for every single command, set zstyle in your `~/.zshrc`. | |
| 13 | + | |
| 14 | +```zsh | |
| 15 | +# ~/.zshrc | |
| 16 | + | |
| 17 | +zstyle ':omz:plugins:alias-finder' autoload yes # disabled by default | |
| 18 | +zstyle ':omz:plugins:alias-finder' longer yes # disabled by default | |
| 19 | +zstyle ':omz:plugins:alias-finder' exact yes # disabled by default | |
| 20 | +zstyle ':omz:plugins:alias-finder' cheaper yes # disabled by default | |
| 21 | +``` | |
| 22 | + | |
| 23 | +As you can see, options are also available with zstyle. | |
| 24 | + | |
| 25 | +## Usage | |
| 26 | + | |
| 27 | +When you execute a command alias finder will look at your defined aliases and suggest shorter aliases you could have used, for example: | |
| 28 | + | |
| 29 | +Running the un-aliased `git status` command: | |
| 30 | +```sh | |
| 31 | +โญโtim@fox ~/repo/gitopolis โนmainโบ | |
| 32 | +โฐโ$ git status | |
| 33 | + | |
| 34 | +gst='git status' # <=== shorter suggestion from alias-finder | |
| 35 | + | |
| 36 | +On branch main | |
| 37 | +Your branch is up-to-date with 'origin/main'. | |
| 38 | +nothing to commit, working tree clean | |
| 39 | +``` | |
| 40 | + | |
| 41 | +Running a shorter `git st` alias from `.gitconfig` that it suggested : | |
| 42 | +```sh | |
| 43 | +โญโtim@fox ~/repo/gitopolis โนmainโบ | |
| 44 | +โฐโ$ git st | |
| 45 | +gs='git st' # <=== shorter suggestion from alias-finder | |
| 46 | +## main...origin/main | |
| 47 | +``` | |
| 48 | + | |
| 49 | +Running the shortest `gs` shell alias that it found: | |
| 50 | +```sh | |
| 51 | +โญโtim@fox ~/repo/gitopolis โนmainโบ | |
| 52 | +โฐโ$ gs | |
| 53 | + # <=== no suggestions alias-finder because this is the shortest | |
| 54 | +## main...origin/main | |
| 55 | +``` | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | +### Options | |
| 61 | + | |
| 62 | +> In order to clarify, let's say `alias a=abc` has source 'abc' and destination 'a'. | |
| 63 | + | |
| 64 | +- Use `--longer` or `-l` to include aliases where the source is longer than the input (in other words, the source could contain the whole input). | |
| 65 | +- Use `--exact` or `-e` to avoid aliases where the source is shorter than the input (in other words, the source must be the same with the input). | |
| 66 | +- Use `--cheaper` or `-c` to avoid aliases where the destination is longer than the input (in other words, the destination must be the shorter than the input). | |
| 67 | + | |
| 68 | + |
+66-0.oh-my-zsh/plugins/alias-finder/alias-finder.plugin.zsh
| @@ -0,0 +1,66 @@ | ||
| 1 | +alias-finder() { | |
| 2 | + local cmd=" " exact="" longer="" cheaper="" wordEnd="'{0,1}$" finder="" filter="" | |
| 3 | + | |
| 4 | + # build command and options | |
| 5 | + for c in "$@"; do | |
| 6 | + case $c in | |
| 7 | + # TODO: Remove backward compatibility (other than zstyle form) | |
| 8 | + # set options if exist | |
| 9 | + -e|--exact) exact=true;; | |
| 10 | + -l|--longer) longer=true;; | |
| 11 | + -c|--cheaper) cheaper=true;; | |
| 12 | + # concatenate cmd | |
| 13 | + *) cmd="$cmd$c " ;; | |
| 14 | + esac | |
| 15 | + done | |
| 16 | + | |
| 17 | + zstyle -t ':omz:plugins:alias-finder' longer && longer=true | |
| 18 | + zstyle -t ':omz:plugins:alias-finder' exact && exact=true | |
| 19 | + zstyle -t ':omz:plugins:alias-finder' cheaper && cheaper=true | |
| 20 | + | |
| 21 | + # format cmd for grep | |
| 22 | + ## - replace newlines with spaces | |
| 23 | + ## - trim both ends | |
| 24 | + ## - replace multiple spaces with one space | |
| 25 | + ## - add escaping character to special characters | |
| 26 | + cmd=$(echo -n "$cmd" | tr '\n' ' ' | xargs | tr -s '[:space:]' | sed 's/[].\|$(){}?+*^[]/\\&/g') | |
| 27 | + | |
| 28 | + if [[ $longer == true ]]; then | |
| 29 | + wordEnd="" # remove wordEnd to find longer aliases | |
| 30 | + fi | |
| 31 | + | |
| 32 | + # find with alias and grep, removing last word each time until no more words | |
| 33 | + while [[ $cmd != "" ]]; do | |
| 34 | + finder="'{0,1}$cmd$wordEnd" | |
| 35 | + | |
| 36 | + # make filter to find only shorter results than current cmd | |
| 37 | + if [[ $cheaper == true ]]; then | |
| 38 | + cmdLen=$(echo -n "$cmd" | wc -c) | |
| 39 | + if [[ $cmdLen -le 1 ]]; then | |
| 40 | + return | |
| 41 | + fi | |
| 42 | + | |
| 43 | + filter="^'?.{1,$((cmdLen - 1))}'?=" # some aliases is surrounded by single quotes | |
| 44 | + fi | |
| 45 | + | |
| 46 | + alias | grep -E "$filter" | grep -E "=$finder" | |
| 47 | + | |
| 48 | + if [[ $exact == true ]]; then | |
| 49 | + break # because exact case is only one | |
| 50 | + elif [[ $longer == true ]]; then | |
| 51 | + break # because above grep command already found every longer aliases during first cycle | |
| 52 | + fi | |
| 53 | + | |
| 54 | + cmd=$(sed -E 's/ {0,}[^ ]*$//' <<< "$cmd") # remove last word | |
| 55 | + done | |
| 56 | +} | |
| 57 | + | |
| 58 | +preexec_alias-finder() { | |
| 59 | + # TODO: Remove backward compatibility (other than zstyle form) | |
| 60 | + zstyle -t ':omz:plugins:alias-finder' autoload && alias-finder $1 || if [[ $ZSH_ALIAS_FINDER_AUTOMATIC = true ]]; then | |
| 61 | + alias-finder $1 | |
| 62 | + fi | |
| 63 | +} | |
| 64 | + | |
| 65 | +autoload -U add-zsh-hook | |
| 66 | +add-zsh-hook preexec preexec_alias-finder |
+0-0.oh-my-zsh/plugins/alias-finder/tests/_output/.gitkeep
No content changes (mode or rename only).
+0-0.oh-my-zsh/plugins/alias-finder/tests/_support/.gitkeep
No content changes (mode or rename only).
+2-0.oh-my-zsh/plugins/alias-finder/tests/_support/bootstrap
| @@ -0,0 +1,2 @@ | ||
| 1 | +#!/usr/bin/env zsh | |
| 2 | +# Write your bootstrap code here |
+107-0.oh-my-zsh/plugins/alias-finder/tests/test_run.sh
| @@ -0,0 +1,107 @@ | ||
| 1 | +#!/usr/bin/env zunit | |
| 2 | + | |
| 3 | +@setup { | |
| 4 | + load ../alias-finder.plugin.zsh | |
| 5 | + | |
| 6 | + set_git_aliases() { | |
| 7 | + unalias -a # all | |
| 8 | + alias g="git" | |
| 9 | + alias gc="git commit" | |
| 10 | + alias gcv="git commit -v" | |
| 11 | + alias gcvs="git commit -v -S" | |
| 12 | + } | |
| 13 | +} | |
| 14 | + | |
| 15 | +@test 'find aliases that contain input' { | |
| 16 | + set_git_aliases | |
| 17 | + | |
| 18 | + run alias-finder "git" | |
| 19 | + | |
| 20 | + assert "${#lines[@]}" equals 1 | |
| 21 | + assert "${lines[1]}" same_as "g=git" | |
| 22 | +} | |
| 23 | + | |
| 24 | +@test 'find aliases that contain input with whitespaces at ends' { | |
| 25 | + set_git_aliases | |
| 26 | + | |
| 27 | + run alias-finder " git " | |
| 28 | + | |
| 29 | + assert "${#lines[@]}" equals 1 | |
| 30 | + assert "${lines[1]}" same_as "g=git" | |
| 31 | +} | |
| 32 | + | |
| 33 | +@test 'find aliases that contain multiple words' { | |
| 34 | + set_git_aliases | |
| 35 | + | |
| 36 | + run alias-finder "git commit -v" | |
| 37 | + | |
| 38 | + assert "${#lines[@]}" equals 3 | |
| 39 | + assert "${lines[1]}" same_as "gcv='git commit -v'" | |
| 40 | + assert "${lines[2]}" same_as "gc='git commit'" | |
| 41 | + assert "${lines[3]}" same_as "g=git" | |
| 42 | +} | |
| 43 | + | |
| 44 | +@test 'find alias that is the same with input when --exact option is set' { | |
| 45 | + set_git_aliases | |
| 46 | + | |
| 47 | + run alias-finder -e "git" | |
| 48 | + | |
| 49 | + assert "${#lines[@]}" equals 1 | |
| 50 | + assert "${lines[1]}" same_as "g=git" | |
| 51 | +} | |
| 52 | + | |
| 53 | +@test 'find alias that is the same with multiple words input when --exact option is set' { | |
| 54 | + set_git_aliases | |
| 55 | + | |
| 56 | + run alias-finder -e "git commit -v" | |
| 57 | + | |
| 58 | + assert "${#lines[@]}" equals 1 | |
| 59 | + assert "${lines[1]}" same_as "gcv='git commit -v'" | |
| 60 | +} | |
| 61 | + | |
| 62 | +@test 'find alias that is the same with or longer than input when --longer option is set' { | |
| 63 | + set_git_aliases | |
| 64 | + | |
| 65 | + run alias-finder -l "git" | |
| 66 | + | |
| 67 | + assert "${#lines[@]}" equals 4 | |
| 68 | + assert "${lines[1]}" same_as "g=git" | |
| 69 | + assert "${lines[2]}" same_as "gc='git commit'" | |
| 70 | + assert "${lines[3]}" same_as "gcv='git commit -v'" | |
| 71 | + assert "${lines[4]}" same_as "gcvs='git commit -v -S'" | |
| 72 | +} | |
| 73 | + | |
| 74 | +@test 'find alias that is the same with or longer than multiple words input when --longer option is set' { | |
| 75 | + set_git_aliases | |
| 76 | + | |
| 77 | + run alias-finder -l "git commit -v" | |
| 78 | + | |
| 79 | + assert "${#lines[@]}" equals 2 | |
| 80 | + assert "${lines[1]}" same_as "gcv='git commit -v'" | |
| 81 | + assert "${lines[2]}" same_as "gcvs='git commit -v -S'" | |
| 82 | +} | |
| 83 | + | |
| 84 | +@test 'find aliases including expensive (longer) than input' { | |
| 85 | + set_git_aliases | |
| 86 | + alias expensiveCommands="git commit" | |
| 87 | + | |
| 88 | + run alias-finder "git commit -v" | |
| 89 | + | |
| 90 | + assert "${#lines[@]}" equals 4 | |
| 91 | + assert "${lines[1]}" same_as "gcv='git commit -v'" | |
| 92 | + assert "${lines[2]}" same_as "expensiveCommands='git commit'" | |
| 93 | + assert "${lines[3]}" same_as "gc='git commit'" | |
| 94 | + assert "${lines[4]}" same_as "g=git" | |
| 95 | +} | |
| 96 | + | |
| 97 | +@test 'find aliases excluding expensive (longer) than input when --cheap option is set' { | |
| 98 | + set_git_aliases | |
| 99 | + alias expensiveCommands="git commit" | |
| 100 | + | |
| 101 | + run alias-finder -c "git commit -v" | |
| 102 | + | |
| 103 | + assert "${#lines[@]}" equals 3 | |
| 104 | + assert "${lines[1]}" same_as "gcv='git commit -v'" | |
| 105 | + assert "${lines[2]}" same_as "gc='git commit'" | |
| 106 | + assert "${lines[3]}" same_as "g=git" | |
| 107 | +} |
+1-0.oh-my-zsh/plugins/aliases/.gitignore
| @@ -0,0 +1 @@ | ||
| 1 | +__pycache__ |
+28-0.oh-my-zsh/plugins/aliases/README.md
| @@ -0,0 +1,28 @@ | ||
| 1 | +# Aliases cheatsheet | |
| 2 | + | |
| 3 | +With lots of 3rd-party amazing aliases installed, this plugin helps list the shortcuts | |
| 4 | +that are currently available based on the plugins you have enabled. | |
| 5 | + | |
| 6 | +To use it, add `aliases` to the plugins array in your zshrc file: | |
| 7 | + | |
| 8 | +```zsh | |
| 9 | +plugins=(aliases) | |
| 10 | +``` | |
| 11 | + | |
| 12 | +Requirements: Python needs to be installed. | |
| 13 | + | |
| 14 | +**Maintainer:** [@hqingyi](https://github.com/hqingyi) | |
| 15 | + | |
| 16 | +## Usage | |
| 17 | + | |
| 18 | +- `als`: show all aliases by group | |
| 19 | + | |
| 20 | +- `als -h/--help`: print help message | |
| 21 | + | |
| 22 | +- `als <keyword(s)>`: filter and highlight aliases by `<keyword>` | |
| 23 | + | |
| 24 | +- `als -g <group>/--group <group>`: show only aliases for group `<group>`. Multiple uses of the flag show all groups | |
| 25 | + | |
| 26 | +- `als --groups`: show only group names | |
| 27 | + | |
| 28 | +  |
+14-0.oh-my-zsh/plugins/aliases/aliases.plugin.zsh
| @@ -0,0 +1,14 @@ | ||
| 1 | +# Handle $0 according to the standard: | |
| 2 | +# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html | |
| 3 | +0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" | |
| 4 | +0="${${(M)0:#/*}:-$PWD/$0}" | |
| 5 | + | |
| 6 | +eval ' | |
| 7 | + function als(){ | |
| 8 | + (( $+commands[python3] )) || { | |
| 9 | + echo "[error] No python executable detected" | |
| 10 | + return | |
| 11 | + } | |
| 12 | + alias | python3 "'"${0:h}"'/cheatsheet.py" "$@" | |
| 13 | + } | |
| 14 | +' |
+69-0.oh-my-zsh/plugins/aliases/cheatsheet.py
| @@ -0,0 +1,69 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +import sys | |
| 3 | +import itertools | |
| 4 | +import termcolor | |
| 5 | +import argparse | |
| 6 | + | |
| 7 | +def parse(line): | |
| 8 | + left = line[0:line.find('=')].strip() | |
| 9 | + right = line[line.find('=')+1:].strip('\'"\n ') | |
| 10 | + try: | |
| 11 | + cmd = next(part for part in right.split() if len([char for char in '=<>' if char in part])==0) | |
| 12 | + except StopIteration: | |
| 13 | + cmd = right | |
| 14 | + return (left, right, cmd) | |
| 15 | + | |
| 16 | +def cheatsheet(lines): | |
| 17 | + exps = [ parse(line) for line in lines ] | |
| 18 | + exps.sort(key=lambda exp:exp[2]) | |
| 19 | + cheatsheet = {'_default': []} | |
| 20 | + for key, group in itertools.groupby(exps, lambda exp:exp[2]): | |
| 21 | + group_list = [ item for item in group ] | |
| 22 | + if len(group_list)==1: | |
| 23 | + target_aliases = cheatsheet['_default'] | |
| 24 | + else: | |
| 25 | + if key not in cheatsheet: | |
| 26 | + cheatsheet[key] = [] | |
| 27 | + target_aliases = cheatsheet[key] | |
| 28 | + target_aliases.extend(group_list) | |
| 29 | + return cheatsheet | |
| 30 | + | |
| 31 | +def pretty_print_group(key, aliases, highlight=None, only_groupname=False): | |
| 32 | + if len(aliases) == 0: | |
| 33 | + return | |
| 34 | + group_hl_formatter = lambda g, hl: termcolor.colored(hl, 'yellow').join([termcolor.colored(part, 'red') for part in ('[%s]' % g).split(hl)]) | |
| 35 | + alias_hl_formatter = lambda alias, hl: termcolor.colored(hl, 'yellow').join([termcolor.colored(part, 'green') for part in ('\t%s = %s' % alias[0:2]).split(hl)]) | |
| 36 | + group_formatter = lambda g: termcolor.colored('[%s]' % g, 'red') | |
| 37 | + alias_formatter = lambda alias: termcolor.colored('\t%s = %s' % alias[0:2], 'green') | |
| 38 | + if highlight and len(highlight)>0: | |
| 39 | + print (group_hl_formatter(key, highlight)) | |
| 40 | + if not only_groupname: | |
| 41 | + print ('\n'.join([alias_hl_formatter(alias, highlight) for alias in aliases])) | |
| 42 | + else: | |
| 43 | + print (group_formatter(key)) | |
| 44 | + if not only_groupname: | |
| 45 | + print ('\n'.join([alias_formatter(alias) for alias in aliases])) | |
| 46 | + print ('') | |
| 47 | + | |
| 48 | +def pretty_print(cheatsheet, wfilter, group_list=None, groups_only=False): | |
| 49 | + sorted_key = sorted(cheatsheet.keys()) | |
| 50 | + for key in sorted_key: | |
| 51 | + if group_list and key not in group_list: | |
| 52 | + continue | |
| 53 | + aliases = cheatsheet.get(key) | |
| 54 | + if not wfilter: | |
| 55 | + pretty_print_group(key, aliases, wfilter, groups_only) | |
| 56 | + else: | |
| 57 | + pretty_print_group(key, [ alias for alias in aliases if alias[0].find(wfilter)>-1 or alias[1].find(wfilter)>-1], wfilter) | |
| 58 | + | |
| 59 | +if __name__ == '__main__': | |
| 60 | + parser = argparse.ArgumentParser(description="Pretty print aliases.", prog="als") | |
| 61 | + parser.add_argument('filter', nargs="*", metavar="<keyword>", help="search aliases matching keywords") | |
| 62 | + parser.add_argument('-g', '--group', dest="group_list", action='append', help="only print aliases in given groups") | |
| 63 | + parser.add_argument('--groups', dest='groups_only', action='store_true', help="only print alias groups") | |
| 64 | + args = parser.parse_args() | |
| 65 | + | |
| 66 | + lines = sys.stdin.readlines() | |
| 67 | + group_list = args.group_list or None | |
| 68 | + wfilter = " ".join(args.filter) or None | |
| 69 | + pretty_print(cheatsheet(lines), wfilter, group_list, args.groups_only) |
+168-0.oh-my-zsh/plugins/aliases/termcolor.py
| @@ -0,0 +1,168 @@ | ||
| 1 | +# coding: utf-8 | |
| 2 | +# Copyright (c) 2008-2011 Volvox Development Team | |
| 3 | +# | |
| 4 | +# Permission is hereby granted, free of charge, to any person obtaining a copy | |
| 5 | +# of this software and associated documentation files (the "Software"), to deal | |
| 6 | +# in the Software without restriction, including without limitation the rights | |
| 7 | +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| 8 | +# copies of the Software, and to permit persons to whom the Software is | |
| 9 | +# furnished to do so, subject to the following conditions: | |
| 10 | +# | |
| 11 | +# The above copyright notice and this permission notice shall be included in | |
| 12 | +# all copies or substantial portions of the Software. | |
| 13 | +# | |
| 14 | +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| 15 | +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| 16 | +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| 17 | +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| 18 | +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| 19 | +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
| 20 | +# THE SOFTWARE. | |
| 21 | +# | |
| 22 | +# Author: Konstantin Lepa <konstantin.lepa@gmail.com> | |
| 23 | + | |
| 24 | +"""ANSI Color formatting for output in terminal.""" | |
| 25 | + | |
| 26 | +from __future__ import print_function | |
| 27 | +import os | |
| 28 | + | |
| 29 | + | |
| 30 | +__ALL__ = [ 'colored', 'cprint' ] | |
| 31 | + | |
| 32 | +VERSION = (1, 1, 0) | |
| 33 | + | |
| 34 | +ATTRIBUTES = dict( | |
| 35 | + list(zip([ | |
| 36 | + 'bold', | |
| 37 | + 'dark', | |
| 38 | + '', | |
| 39 | + 'underline', | |
| 40 | + 'blink', | |
| 41 | + '', | |
| 42 | + 'reverse', | |
| 43 | + 'concealed' | |
| 44 | + ], | |
| 45 | + list(range(1, 9)) | |
| 46 | + )) | |
| 47 | + ) | |
| 48 | +del ATTRIBUTES[''] | |
| 49 | + | |
| 50 | + | |
| 51 | +HIGHLIGHTS = dict( | |
| 52 | + list(zip([ | |
| 53 | + 'on_grey', | |
| 54 | + 'on_red', | |
| 55 | + 'on_green', | |
| 56 | + 'on_yellow', | |
| 57 | + 'on_blue', | |
| 58 | + 'on_magenta', | |
| 59 | + 'on_cyan', | |
| 60 | + 'on_white' | |
| 61 | + ], | |
| 62 | + list(range(40, 48)) | |
| 63 | + )) | |
| 64 | + ) | |
| 65 | + | |
| 66 | + | |
| 67 | +COLORS = dict( | |
| 68 | + list(zip([ | |
| 69 | + 'grey', | |
| 70 | + 'red', | |
| 71 | + 'green', | |
| 72 | + 'yellow', | |
| 73 | + 'blue', | |
| 74 | + 'magenta', | |
| 75 | + 'cyan', | |
| 76 | + 'white', | |
| 77 | + ], | |
| 78 | + list(range(30, 38)) | |
| 79 | + )) | |
| 80 | + ) | |
| 81 | + | |
| 82 | + | |
| 83 | +RESET = '\033[0m' | |
| 84 | + | |
| 85 | + | |
| 86 | +def colored(text, color=None, on_color=None, attrs=None): | |
| 87 | + """Colorize text. | |
| 88 | + | |
| 89 | + Available text colors: | |
| 90 | + red, green, yellow, blue, magenta, cyan, white. | |
| 91 | + | |
| 92 | + Available text highlights: | |
| 93 | + on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white. | |
| 94 | + | |
| 95 | + Available attributes: | |
| 96 | + bold, dark, underline, blink, reverse, concealed. | |
| 97 | + | |
| 98 | + Example: | |
| 99 | + colored('Hello, World!', 'red', 'on_grey', ['blue', 'blink']) | |
| 100 | + colored('Hello, World!', 'green') | |
| 101 | + """ | |
| 102 | + if os.getenv('ANSI_COLORS_DISABLED') is None: | |
| 103 | + fmt_str = '\033[%dm%s' | |
| 104 | + if color is not None: | |
| 105 | + text = fmt_str % (COLORS[color], text) | |
| 106 | + | |
| 107 | + if on_color is not None: | |
| 108 | + text = fmt_str % (HIGHLIGHTS[on_color], text) | |
| 109 | + | |
| 110 | + if attrs is not None: | |
| 111 | + for attr in attrs: | |
| 112 | + text = fmt_str % (ATTRIBUTES[attr], text) | |
| 113 | + | |
| 114 | + text += RESET | |
| 115 | + return text | |
| 116 | + | |
| 117 | + | |
| 118 | +def cprint(text, color=None, on_color=None, attrs=None, **kwargs): | |
| 119 | + """Print colorize text. | |
| 120 | + | |
| 121 | + It accepts arguments of print function. | |
| 122 | + """ | |
| 123 | + | |
| 124 | + print((colored(text, color, on_color, attrs)), **kwargs) | |
| 125 | + | |
| 126 | + | |
| 127 | +if __name__ == '__main__': | |
| 128 | + print('Current terminal type: %s' % os.getenv('TERM')) | |
| 129 | + print('Test basic colors:') | |
| 130 | + cprint('Grey color', 'grey') | |
| 131 | + cprint('Red color', 'red') | |
| 132 | + cprint('Green color', 'green') | |
| 133 | + cprint('Yellow color', 'yellow') | |
| 134 | + cprint('Blue color', 'blue') | |
| 135 | + cprint('Magenta color', 'magenta') | |
| 136 | + cprint('Cyan color', 'cyan') | |
| 137 | + cprint('White color', 'white') | |
| 138 | + print(('-' * 78)) | |
| 139 | + | |
| 140 | + print('Test highlights:') | |
| 141 | + cprint('On grey color', on_color='on_grey') | |
| 142 | + cprint('On red color', on_color='on_red') | |
| 143 | + cprint('On green color', on_color='on_green') | |
| 144 | + cprint('On yellow color', on_color='on_yellow') | |
| 145 | + cprint('On blue color', on_color='on_blue') | |
| 146 | + cprint('On magenta color', on_color='on_magenta') | |
| 147 | + cprint('On cyan color', on_color='on_cyan') | |
| 148 | + cprint('On white color', color='grey', on_color='on_white') | |
| 149 | + print('-' * 78) | |
| 150 | + | |
| 151 | + print('Test attributes:') | |
| 152 | + cprint('Bold grey color', 'grey', attrs=['bold']) | |
| 153 | + cprint('Dark red color', 'red', attrs=['dark']) | |
| 154 | + cprint('Underline green color', 'green', attrs=['underline']) | |
| 155 | + cprint('Blink yellow color', 'yellow', attrs=['blink']) | |
| 156 | + cprint('Reversed blue color', 'blue', attrs=['reverse']) | |
| 157 | + cprint('Concealed Magenta color', 'magenta', attrs=['concealed']) | |
| 158 | + cprint('Bold underline reverse cyan color', 'cyan', | |
| 159 | + attrs=['bold', 'underline', 'reverse']) | |
| 160 | + cprint('Dark blink concealed white color', 'white', | |
| 161 | + attrs=['dark', 'blink', 'concealed']) | |
| 162 | + print(('-' * 78)) | |
| 163 | + | |
| 164 | + print('Test mixing:') | |
| 165 | + cprint('Underline red on grey color', 'red', 'on_grey', | |
| 166 | + ['underline']) | |
| 167 | + cprint('Reversed green on red color', 'green', 'on_red', ['reverse']) | |
| 168 | + |
+31-0.oh-my-zsh/plugins/ansible/README.md
| @@ -0,0 +1,31 @@ | ||
| 1 | +# ansible plugin | |
| 2 | + | |
| 3 | +The `ansible plugin` adds several aliases for useful [ansible](https://docs.ansible.com/ansible/latest/index.html) commands and [aliases](#aliases). | |
| 4 | + | |
| 5 | +To use it, add `ansible` to the plugins array of your zshrc file: | |
| 6 | + | |
| 7 | +``` | |
| 8 | +plugins=(... ansible) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Aliases | |
| 12 | + | |
| 13 | +| Command | Description | | |
| 14 | +|:-------------------------------------------|:--------------------------------------------------------------------| | |
| 15 | +| `ansible-version` / `aver` | Show the version on ansible installed in this host | | |
| 16 | +| `ansible-role-init <role name>` / `arinit` | Creates the Ansible Role as per Ansible Galaxy standard | | |
| 17 | +| `a` | command `ansible` | | |
| 18 | +| `aconf` | command `ansible-config` | | |
| 19 | +| `acon` | command `ansible-console` | | |
| 20 | +| `ainv` | command `ansible-inventory` | | |
| 21 | +| `aplaybook` | command `ansible-playbook` | | |
| 22 | +| `adoc` | command `ansible-doc` | | |
| 23 | +| `agal` | command `ansible-galaxy` | | |
| 24 | +| `apull` | command `ansible-pull` | | |
| 25 | +| `aval` | command `ansible-vault` | | |
| 26 | + | |
| 27 | +## Maintainer | |
| 28 | + | |
| 29 | +### [Deepankumar](https://github.com/deepan10) | |
| 30 | + | |
| 31 | +[https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin](https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin) |
+28-0.oh-my-zsh/plugins/ansible/ansible.plugin.zsh
| @@ -0,0 +1,28 @@ | ||
| 1 | +# Functions | |
| 2 | +function ansible-version(){ | |
| 3 | + ansible --version | |
| 4 | +} | |
| 5 | + | |
| 6 | +function ansible-role-init(){ | |
| 7 | + if ! [ -z $1 ] ; then | |
| 8 | + echo "Ansible Role : $1 Creating...." | |
| 9 | + ansible-galaxy init $1 | |
| 10 | + tree $1 | |
| 11 | + else | |
| 12 | + echo "Usage : ansible-role-init <role name>" | |
| 13 | + echo "Example : ansible-role-init role1" | |
| 14 | + fi | |
| 15 | +} | |
| 16 | + | |
| 17 | +# Alias | |
| 18 | +alias a='ansible ' | |
| 19 | +alias aconf='ansible-config ' | |
| 20 | +alias acon='ansible-console ' | |
| 21 | +alias aver='ansible-version' | |
| 22 | +alias arinit='ansible-role-init' | |
| 23 | +alias aplaybook='ansible-playbook ' | |
| 24 | +alias ainv='ansible-inventory ' | |
| 25 | +alias adoc='ansible-doc ' | |
| 26 | +alias agal='ansible-galaxy ' | |
| 27 | +alias apull='ansible-pull ' | |
| 28 | +alias aval='ansible-vault' |
+12-0.oh-my-zsh/plugins/ant/README.md
| @@ -0,0 +1,12 @@ | ||
| 1 | +# Ant | |
| 2 | + | |
| 3 | +This plugin provides completion for [Ant](https://ant.apache.org/). | |
| 4 | + | |
| 5 | +To use it, add `ant` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... ant) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +It caches ant targets in a file named `.ant_targets`, you might want to add that to | |
| 12 | +your `.gitignore` file. |
+22-0.oh-my-zsh/plugins/ant/_ant
| @@ -0,0 +1,22 @@ | ||
| 1 | +#compdef ant | |
| 2 | + | |
| 3 | +_ant_does_target_list_need_generating () { | |
| 4 | + [[ ! -f .ant_targets ]] && return 0 | |
| 5 | + [[ build.xml -nt .ant_targets ]] && return 0 | |
| 6 | + return 1 | |
| 7 | +} | |
| 8 | + | |
| 9 | +_ant () { | |
| 10 | + if [[ ! -f build.xml ]]; then | |
| 11 | + return | |
| 12 | + fi | |
| 13 | + | |
| 14 | + if ! _ant_does_target_list_need_generating; then | |
| 15 | + return | |
| 16 | + fi | |
| 17 | + | |
| 18 | + ant -p | awk -F " " 'NR > 5 { print lastTarget } { lastTarget = $1 }' >| .ant_targets | |
| 19 | + compadd -- "$(cat .ant_targets)" | |
| 20 | +} | |
| 21 | + | |
| 22 | +_ant "$@" |
+2-0.oh-my-zsh/plugins/ant/ant.plugin.zsh
| @@ -0,0 +1,2 @@ | ||
| 1 | +# Default to colored output | |
| 2 | +export ANT_ARGS='-logger org.apache.tools.ant.listener.AnsiColorLogger' |
+21-0.oh-my-zsh/plugins/apache2-macports/README.md
| @@ -0,0 +1,21 @@ | ||
| 1 | +# apache2-macports plugin | |
| 2 | + | |
| 3 | +Enables aliases to control a local Apache2 installed via [MacPorts](https://www.macports.org/). | |
| 4 | + | |
| 5 | +To use it, add `apache2-macports` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... apache2-macports) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Aliases | |
| 12 | + | |
| 13 | +| Alias | Function | Description | | |
| 14 | +|----------------|-----------------------------------------|-----------------------| | |
| 15 | +| apache2restart | `sudo /path/to/apache2.wrapper restart` | Restart apache daemon | | |
| 16 | +| apache2start | `sudo /path/to/apache2.wrapper start` | Start apache daemon | | |
| 17 | +| apache2stop | `sudo /path/to/apache2.wrapper stop` | Stop apache daemon | | |
| 18 | + | |
| 19 | +## Contributors | |
| 20 | + | |
| 21 | +- Alexander Rinass (alex@rinass.net) |
+6-0.oh-my-zsh/plugins/apache2-macports/apache2-macports.plugin.zsh
| @@ -0,0 +1,6 @@ | ||
| 1 | +# commands to control local apache2 server installation | |
| 2 | +# paths are for osx installation via macports | |
| 3 | + | |
| 4 | +alias apache2start='sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper start' | |
| 5 | +alias apache2stop='sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper stop' | |
| 6 | +alias apache2restart='sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper restart' |
+43-0.oh-my-zsh/plugins/arcanist/README.md
| @@ -0,0 +1,43 @@ | ||
| 1 | +## arcanist | |
| 2 | + | |
| 3 | +This plugin adds many useful aliases for [arcanist](https://github.com/phacility/arcanist). | |
| 4 | + | |
| 5 | +To use it, add `arcanist` to the plugins array of your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... arcanist) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Aliases | |
| 12 | + | |
| 13 | +| Alias | Command | | |
| 14 | +| ------- | ---------------------------------- | | |
| 15 | +| ara | `arc amend` | | |
| 16 | +| arb | `arc branch` | | |
| 17 | +| arbl | `arc bland` | | |
| 18 | +| arco | `arc cover` | | |
| 19 | +| arci | `arc commit` | | |
| 20 | +| ard | `arc diff` | | |
| 21 | +| ardc | `arc diff --create` | | |
| 22 | +| ardp | `arc diff --preview` | | |
| 23 | +| ardnu | `arc diff --nounit` | | |
| 24 | +| ardnupc | `arc diff --nounit --plan-changes` | | |
| 25 | +| ardpc | `arc diff --plan-changes` | | |
| 26 | +| are | `arc export` | | |
| 27 | +| arh | `arc help` | | |
| 28 | +| arho | `arc hotfix` | | |
| 29 | +| arl | `arc land` | | |
| 30 | +| arli | `arc lint` | | |
| 31 | +| arls | `arc list` | | |
| 32 | +| arpa | `arc patch` | | |
| 33 | + | |
| 34 | +## Functions | |
| 35 | + | |
| 36 | +The following functions make copy pasting revision ids from the URL bar of your browser | |
| 37 | +easier, as they allow for copy pasting the whole URL. For example: `ardu` accepts | |
| 38 | +both `https://arcanist-url.com/<REVISION>` as well as `<REVISION>`. | |
| 39 | + | |
| 40 | +| Function | Command | | |
| 41 | +| ------------------------- | --------------------------------- | | |
| 42 | +| ardu [URL or revision_id] | `arc diff --update` [revision_id] | | |
| 43 | +| arpa [URL or revision_id] | `arc patch` [revision_id] | |
+39-0.oh-my-zsh/plugins/arcanist/arcanist.plugin.zsh
| @@ -0,0 +1,39 @@ | ||
| 1 | +# | |
| 2 | +# Aliases | |
| 3 | +# (sorted alphabetically) | |
| 4 | +# | |
| 5 | + | |
| 6 | +alias ara='arc amend' | |
| 7 | +alias arb='arc branch' | |
| 8 | +alias arbl='arc bland' | |
| 9 | +alias arco='arc cover' | |
| 10 | +alias arci='arc commit' | |
| 11 | + | |
| 12 | +alias ard='arc diff' | |
| 13 | +alias ardc='arc diff --create' | |
| 14 | +alias ardnu='arc diff --nounit' | |
| 15 | +alias ardnupc='arc diff --nounit --plan-changes' | |
| 16 | +alias ardpc='arc diff --plan-changes' | |
| 17 | +alias ardp='arc diff --preview' # creates a new diff in the phab interface | |
| 18 | + | |
| 19 | +alias are='arc export' | |
| 20 | +alias arh='arc help' | |
| 21 | +alias arho='arc hotfix' | |
| 22 | +alias arl='arc land' | |
| 23 | +alias arli='arc lint' | |
| 24 | +alias arls='arc list' | |
| 25 | + | |
| 26 | +# | |
| 27 | +# Functions | |
| 28 | +# (sorted alphabetically) | |
| 29 | +# | |
| 30 | + | |
| 31 | +ardu() { | |
| 32 | + # Both `ardu https://arcanist-url.com/<REVISION>`, and `ardu <REVISION>` work. | |
| 33 | + arc diff --update "${1:t}" | |
| 34 | +} | |
| 35 | + | |
| 36 | +arpa() { | |
| 37 | + # Both `arpa https://arcanist-url.com/<REVISION>`, and `arpa <REVISION>` work. | |
| 38 | + arc patch "${1:t}" | |
| 39 | +} |
+184-0.oh-my-zsh/plugins/archlinux/README.md
| @@ -0,0 +1,184 @@ | ||
| 1 | +# Arch Linux plugin | |
| 2 | + | |
| 3 | +This plugin adds some aliases and functions to work with Arch Linux. | |
| 4 | + | |
| 5 | +To use it, add `archlinux` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... archlinux) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Features | |
| 12 | + | |
| 13 | +### Pacman | |
| 14 | + | |
| 15 | +| Alias | Command | Description | | |
| 16 | +|--------------|----------------------------------------|------------------------------------------------------------------| | |
| 17 | +| pacin | `sudo pacman -S` | Install packages from the repositories | | |
| 18 | +| pacins | `sudo pacman -U` | Install a package from a local file | | |
| 19 | +| pacinsd | `sudo pacman -S --asdeps` | Install packages as dependencies of another package | | |
| 20 | +| paclean | `sudo pacman -Sc` | Clean out old and unused caches and packages | | |
| 21 | +| pacloc | `pacman -Qi` | Display information about a package in the local database | | |
| 22 | +| paclocs | `pacman -Qs` | Search for packages in the local database | | |
| 23 | +| paclr | `sudo pacman -Scc` | Remove all files from the cache | | |
| 24 | +| paclsorphans | `sudo pacman -Qdt` | List all orphaned packages | | |
| 25 | +| pacmir | `sudo pacman -Syy` | Force refresh of all package lists after updating mirrorlist | | |
| 26 | +| pacre | `sudo pacman -R` | Remove packages, keeping its settings and dependencies | | |
| 27 | +| pacrem | `sudo pacman -Rns` | Remove packages, including its settings and dependencies | | |
| 28 | +| pacrep | `pacman -Si` | Display information about a package in the repositories | | |
| 29 | +| pacreps | `pacman -Ss` | Search for packages in the repositories | | |
| 30 | +| pacrmorphans | `sudo pacman -Rs $(pacman -Qtdq)` | Delete all orphaned packages | | |
| 31 | +| pacupd | `sudo pacman -Sy` | Update and refresh local package, ABS and AUR databases | | |
| 32 | +| pacupg | `sudo pacman -Syu` | Sync with repositories before upgrading packages | | |
| 33 | +| pacfileupg | `sudo pacman -Fy` | Download fresh package databases from the server | | |
| 34 | +| pacfiles | `pacman -F` | Search package file names for matching strings | | |
| 35 | +| pacls | `pacman -Ql` | List files in a package | | |
| 36 | +| pacown | `pacman -Qo` | Show which package owns a file | | |
| 37 | +| upgrade[ยน](#f1) | `sudo pacman -Syu` | Sync with repositories before upgrading packages | | |
| 38 | + | |
| 39 | +| Function | Description | | |
| 40 | +|----------------|-----------------------------------------------------------| | |
| 41 | +| pacdisowned | List all disowned files in your system | | |
| 42 | +| paclist | List all explicitly installed packages with a description | | |
| 43 | +| pacmanallkeys | Get all keys for developers and trusted users | | |
| 44 | +| pacmansignkeys | Locally trust all keys passed as parameters | | |
| 45 | +| pacweb | Open the website of an ArchLinux package | | |
| 46 | + | |
| 47 | +Note: paclist used to print packages with a description which are (1) explicitly installed | |
| 48 | +and (2) available for upgrade. Due to flawed scripting, it also printed all packages if no | |
| 49 | +upgrades were available. Use `pacman -Que` instead. | |
| 50 | + | |
| 51 | +### AUR helpers | |
| 52 | + | |
| 53 | +#### Aura | |
| 54 | + | |
| 55 | +| Alias | Command | Description | | |
| 56 | +|---------|-------------------------------------------------|-------------------------------------------------------------------------| | |
| 57 | +| auclean | `sudo aura -Sc` | Clean out old and unused caches and packages | | |
| 58 | +| auclr | `sudo aura -Scc` | Remove all files from the cache | | |
| 59 | +| auin | `sudo aura -S` | Install packages from the repositories | | |
| 60 | +| aurin | `sudo aura -A` | Install packages from the repositories | | |
| 61 | +| auins | `sudo aura -U` | Install a package from a local file | | |
| 62 | +| auinsd | `sudo aura -S --asdeps` | Install packages as dependencies of another package (repositories only) | | |
| 63 | +| aurinsd | `sudo aura -A --asdeps` | Install packages as dependencies of another package (AUR only) | | |
| 64 | +| auloc | `aura -Qi` | Display information about a package in the local database | | |
| 65 | +| aulocs | `aura -Qs` | Search for packages in the local database | | |
| 66 | +| auls | `aura -Qql` | List all files owned by a given package | | |
| 67 | +| aulst | `aura -Qe` | List installed packages including from AUR (tagged as "local") | | |
| 68 | +| aumir | `sudo aura -Syy` | Force refresh of all package lists after updating mirrorlist | | |
| 69 | +| aurph | `sudo aura -Oj` | Remove orphans using aura | | |
| 70 | +| auown | `aura -Qqo` | Search for packages that own the specified file(s) | | |
| 71 | +| aure | `sudo aura -R` | Remove packages, keeping its settings and dependencies | | |
| 72 | +| aurem | `sudo aura -Rns` | Remove packages, including its settings and unneeded dependencies | | |
| 73 | +| aurep | `aura -Si` | Display information about a package in the repositories | | |
| 74 | +| aurrep | `aura -Ai` | Display information about a package from AUR | | |
| 75 | +| aureps | `aura -As --both` | Search for packages in the repositories and AUR | | |
| 76 | +| auras | `aura -As --both` | Same as above | | |
| 77 | +| auupd | `sudo aura -Sy` | Update and refresh local package, ABS and AUR databases | | |
| 78 | +| auupg | `sudo sh -c "aura -Syu && aura -Au"` | Sync with repositories before upgrading all packages (from AUR too) | | |
| 79 | +| ausu | `sudo sh -c "aura -Syu --no-confirm && aura -Au --no-confirm"` | Same as `auupg`, but without confirmation | | |
| 80 | +| upgrade[ยน](#f1) | `sudo aura -Syu` | Sync with repositories before upgrading packages | | |
| 81 | + | |
| 82 | +| Function | Description | | |
| 83 | +|-----------------|---------------------------------------------------------------------| | |
| 84 | +| auownloc _file_ | Display information about a package that owns the specified file(s) | | |
| 85 | +| auownls _file_ | List all files owned by a package that owns the specified file(s) | | |
| 86 | + | |
| 87 | +#### Pacaur | |
| 88 | + | |
| 89 | +| Alias | Command | Description | | |
| 90 | +|---------|-----------------------------------|---------------------------------------------------------------------| | |
| 91 | +| pacclean| `pacaur -Sc` | Clean out old and unused caches and packages | | |
| 92 | +| pacclr | `pacaur -Scc` | Remove all files from the cache | | |
| 93 | +| pain | `pacaur -S` | Install packages from the repositories | | |
| 94 | +| pains | `pacaur -U` | Install a package from a local file | | |
| 95 | +| painsd | `pacaur -S --asdeps` | Install packages as dependencies of another package | | |
| 96 | +| paloc | `pacaur -Qi` | Display information about a package in the local database | | |
| 97 | +| palocs | `pacaur -Qs` | Search for packages in the local database | | |
| 98 | +| palst | `pacaur -Qe` | List installed packages including from AUR (tagged as "local") | | |
| 99 | +| pamir | `pacaur -Syy` | Force refresh of all package lists after updating mirrorlist | | |
| 100 | +| paorph | `pacaur -Qtd` | Remove orphans using pacaur | | |
| 101 | +| pare | `pacaur -R` | Remove packages, keeping its settings and dependencies | | |
| 102 | +| parem | `pacaur -Rns` | Remove packages, including its settings and unneeded dependencies | | |
| 103 | +| parep | `pacaur -Si` | Display information about a package in the repositories | | |
| 104 | +| pareps | `pacaur -Ss` | Search for packages in the repositories | | |
| 105 | +| paupd | `pacaur -Sy` | Update and refresh local package, ABS and AUR databases | | |
| 106 | +| paupg | `pacaur -Syua` | Sync with repositories before upgrading all packages (from AUR too) | | |
| 107 | +| pasu | `pacaur -Syua --no-confirm` | Same as `paupg`, but without confirmation | | |
| 108 | +| upgrade[ยน](#f1) | `pacaur -Syu` | Sync with repositories before upgrading packages | | |
| 109 | + | |
| 110 | +#### Trizen | |
| 111 | + | |
| 112 | +| Alias | Command | Description | | |
| 113 | +|---------|-----------------------------------|---------------------------------------------------------------------| | |
| 114 | +| trconf | `trizen -C` | Fix all configuration files with vimdiff | | |
| 115 | +| trclean | `trizen -Sc` | Clean out old and unused caches and packages | | |
| 116 | +| trclr | `trizen -Scc` | Remove all files from the cache | | |
| 117 | +| trin | `trizen -S` | Install packages from the repositories | | |
| 118 | +| trins | `trizen -U` | Install a package from a local file | | |
| 119 | +| trinsd | `trizen -S --asdeps` | Install packages as dependencies of another package | | |
| 120 | +| trloc | `trizen -Qi` | Display information about a package in the local database | | |
| 121 | +| trlocs | `trizen -Qs` | Search for packages in the local database | | |
| 122 | +| trlst | `trizen -Qe` | List installed packages including from AUR (tagged as "local") | | |
| 123 | +| trmir | `trizen -Syy` | Force refresh of all package lists after updating mirrorlist | | |
| 124 | +| trorph | `trizen -Qtd` | Remove orphans using yaourt | | |
| 125 | +| trre | `trizen -R` | Remove packages, keeping its settings and dependencies | | |
| 126 | +| trrem | `trizen -Rns` | Remove packages, including its settings and unneeded dependencies | | |
| 127 | +| trrep | `trizen -Si` | Display information about a package in the repositories | | |
| 128 | +| trreps | `trizen -Ss` | Search for packages in the repositories | | |
| 129 | +| trupd | `trizen -Sy` | Update and refresh local package, ABS and AUR databases | | |
| 130 | +| trupg | `trizen -Syua` | Sync with repositories before upgrading all packages (from AUR too) | | |
| 131 | +| trsu | `trizen -Syua --no-confirm` | Same as `trupg`, but without confirmation | | |
| 132 | +| upgrade[ยน](#f1) | `trizen -Syu` | Sync with repositories before upgrading packages | | |
| 133 | + | |
| 134 | +#### Yay | |
| 135 | + | |
| 136 | +| Alias | Command | Description | | |
| 137 | +|---------|--------------------------------|-------------------------------------------------------------------| | |
| 138 | +| yaconf | `yay -Pg` | Print current configuration | | |
| 139 | +| yaclean | `yay -Sc` | Clean out old and unused caches and packages | | |
| 140 | +| yaclr | `yay -Scc` | Remove all files from the cache | | |
| 141 | +| yain | `yay -S` | Install packages from the repositories | | |
| 142 | +| yains | `yay -U` | Install a package from a local file | | |
| 143 | +| yainsd | `yay -S --asdeps` | Install packages as dependencies of another package | | |
| 144 | +| yaloc | `yay -Qi` | Display information about a package in the local database | | |
| 145 | +| yalocs | `yay -Qs` | Search for packages in the local database | | |
| 146 | +| yalst | `yay -Qe` | List installed packages including from AUR (tagged as "local") | | |
| 147 | +| yamir | `yay -Syy` | Force refresh of all package lists after updating mirrorlist | | |
| 148 | +| yaorph | `yay -Qtd` | Remove orphans using yay | | |
| 149 | +| yare | `yay -R` | Remove packages, keeping its settings and dependencies | | |
| 150 | +| yarem | `yay -Rns` | Remove packages, including its settings and unneeded dependencies | | |
| 151 | +| yarep | `yay -Si` | Display information about a package in the repositories | | |
| 152 | +| yareps | `yay -Ss` | Search for packages in the repositories | | |
| 153 | +| yaupd | `yay -Sy` | Update and refresh local package, ABS and AUR databases | | |
| 154 | +| yaupg | `yay -Syu` | Sync with repositories before upgrading packages | | |
| 155 | +| yasu | `yay -Syu --no-confirm` | Same as `yaupg`, but without confirmation | | |
| 156 | +| upgrade[ยน](#f1) | `yay -Syu` | Sync with repositories before upgrading packages | | |
| 157 | + | |
| 158 | +--- | |
| 159 | + | |
| 160 | +<span id="f1">ยน</span> | |
| 161 | +The `upgrade` alias is set for all package managers. Its value will depend on | |
| 162 | +whether the package manager is installed, checked in the following order: | |
| 163 | + | |
| 164 | +1. `yay` | |
| 165 | +2. `trizen` | |
| 166 | +3. `pacaur` | |
| 167 | +4. `aura` | |
| 168 | +5. `pacman` | |
| 169 | + | |
| 170 | +## Contributors | |
| 171 | + | |
| 172 | +- Benjamin Boudreau - dreurmail@gmail.com | |
| 173 | +- Celso Miranda - contacto@celsomiranda.net | |
| 174 | +- ratijas (ivan tkachenko) - me@ratijas.tk | |
| 175 | +- Juraj Fiala - doctorjellyface@riseup.net | |
| 176 | +- KhasMek - Boushh@gmail.com | |
| 177 | +- Majora320 (Moses Miller) - Majora320@gmail.com | |
| 178 | +- Martin Putniorz - mputniorz@gmail.com | |
| 179 | +- MatthR3D - matthr3d@gmail.com | |
| 180 | +- ornicar - thibault.duplessis@gmail.com | |
| 181 | +- Ybalrid (Arthur Brainville) - ybalrid@ybalrid.info | |
| 182 | +- Jeff M. Hubbard - jeffmhubbard@gmail.com | |
| 183 | +- K. Harishankar(harishnkr) - hari2menon1234@gmail.com | |
| 184 | +- WH-2099 - wh2099@outlook.com |
+204-0.oh-my-zsh/plugins/archlinux/archlinux.plugin.zsh
| @@ -0,0 +1,204 @@ | ||
| 1 | +####################################### | |
| 2 | +# Pacman # | |
| 3 | +####################################### | |
| 4 | + | |
| 5 | +# Pacman - https://wiki.archlinux.org/index.php/Pacman_Tips | |
| 6 | +alias pacupg='sudo pacman -Syu' | |
| 7 | +alias pacin='sudo pacman -S' | |
| 8 | +alias paclean='sudo pacman -Sc' | |
| 9 | +alias pacins='sudo pacman -U' | |
| 10 | +alias paclr='sudo pacman -Scc' | |
| 11 | +alias pacre='sudo pacman -R' | |
| 12 | +alias pacrem='sudo pacman -Rns' | |
| 13 | +alias pacrep='pacman -Si' | |
| 14 | +alias pacreps='pacman -Ss' | |
| 15 | +alias pacloc='pacman -Qi' | |
| 16 | +alias paclocs='pacman -Qs' | |
| 17 | +alias pacinsd='sudo pacman -S --asdeps' | |
| 18 | +alias pacmir='sudo pacman -Syy' | |
| 19 | +alias paclsorphans='sudo pacman -Qdt' | |
| 20 | +alias pacrmorphans='sudo pacman -Rs $(pacman -Qtdq)' | |
| 21 | +alias pacfileupg='sudo pacman -Fy' | |
| 22 | +alias pacfiles='pacman -F' | |
| 23 | +alias pacls='pacman -Ql' | |
| 24 | +alias pacown='pacman -Qo' | |
| 25 | +alias pacupd="sudo pacman -Sy" | |
| 26 | + | |
| 27 | +function paclist() { | |
| 28 | + pacman -Qqe | xargs -I{} -P0 --no-run-if-empty pacman -Qs --color=auto "^{}\$" | |
| 29 | +} | |
| 30 | + | |
| 31 | +function pacdisowned() { | |
| 32 | + local tmp_dir db fs | |
| 33 | + tmp_dir=$(mktemp --directory) | |
| 34 | + db=$tmp_dir/db | |
| 35 | + fs=$tmp_dir/fs | |
| 36 | + | |
| 37 | + trap "rm -rf $tmp_dir" EXIT | |
| 38 | + | |
| 39 | + pacman -Qlq | sort -u > "$db" | |
| 40 | + | |
| 41 | + find /etc /usr ! -name lost+found \ | |
| 42 | + \( -type d -printf '%p/\n' -o -print \) | sort > "$fs" | |
| 43 | + | |
| 44 | + comm -23 "$fs" "$db" | |
| 45 | + | |
| 46 | + rm -rf $tmp_dir | |
| 47 | +} | |
| 48 | + | |
| 49 | +alias pacmanallkeys='sudo pacman-key --refresh-keys' | |
| 50 | + | |
| 51 | +function pacmansignkeys() { | |
| 52 | + local key | |
| 53 | + for key in $@; do | |
| 54 | + sudo pacman-key --recv-keys $key | |
| 55 | + sudo pacman-key --lsign-key $key | |
| 56 | + printf 'trust\n3\n' | sudo gpg --homedir /etc/pacman.d/gnupg \ | |
| 57 | + --no-permission-warning --command-fd 0 --edit-key $key | |
| 58 | + done | |
| 59 | +} | |
| 60 | + | |
| 61 | +if (( $+commands[xdg-open] )); then | |
| 62 | + function pacweb() { | |
| 63 | + if [[ $# = 0 || "$1" =~ '--help|-h' ]]; then | |
| 64 | + local underline_color="\e[${color[underline]}m" | |
| 65 | + echo "$0 - open the website of an ArchLinux package" | |
| 66 | + echo | |
| 67 | + echo "Usage:" | |
| 68 | + echo " $bold_color$0$reset_color ${underline_color}target${reset_color}" | |
| 69 | + return 1 | |
| 70 | + fi | |
| 71 | + | |
| 72 | + local pkg="$1" | |
| 73 | + local infos="$(LANG=C pacman -Si "$pkg")" | |
| 74 | + if [[ -z "$infos" ]]; then | |
| 75 | + return | |
| 76 | + fi | |
| 77 | + local repo="$(grep -m 1 '^Repo' <<< "$infos" | grep -oP '[^ ]+$')" | |
| 78 | + local arch="$(grep -m 1 '^Arch' <<< "$infos" | grep -oP '[^ ]+$')" | |
| 79 | + xdg-open "https://www.archlinux.org/packages/$repo/$arch/$pkg/" &>/dev/null | |
| 80 | + } | |
| 81 | +fi | |
| 82 | + | |
| 83 | +####################################### | |
| 84 | +# AUR helpers # | |
| 85 | +####################################### | |
| 86 | + | |
| 87 | +if (( $+commands[aura] )); then | |
| 88 | + alias auin='sudo aura -S' | |
| 89 | + alias aurin='sudo aura -A' | |
| 90 | + alias auclean='sudo aura -Sc' | |
| 91 | + alias auclr='sudo aura -Scc' | |
| 92 | + alias auins='sudo aura -U' | |
| 93 | + alias auinsd='sudo aura -S --asdeps' | |
| 94 | + alias aurinsd='sudo aura -A --asdeps' | |
| 95 | + alias auloc='aura -Qi' | |
| 96 | + alias aulocs='aura -Qs' | |
| 97 | + alias aulst='aura -Qe' | |
| 98 | + alias aumir='sudo aura -Syy' | |
| 99 | + alias aurph='sudo aura -Oj' | |
| 100 | + alias aure='sudo aura -R' | |
| 101 | + alias aurem='sudo aura -Rns' | |
| 102 | + alias aurep='aura -Si' | |
| 103 | + alias aurrep='aura -Ai' | |
| 104 | + alias aureps='aura -As --both' | |
| 105 | + alias auras='aura -As --both' | |
| 106 | + alias auupd="sudo aura -Sy" | |
| 107 | + alias auupg='sudo sh -c "aura -Syu && aura -Au"' | |
| 108 | + alias ausu='sudo sh -c "aura -Syu --no-confirm && aura -Au --no-confirm"' | |
| 109 | + | |
| 110 | + # extra bonus specially for aura | |
| 111 | + alias auown="aura -Qqo" | |
| 112 | + alias auls="aura -Qql" | |
| 113 | + function auownloc() { aura -Qi $(aura -Qqo $@); } | |
| 114 | + function auownls () { aura -Qql $(aura -Qqo $@); } | |
| 115 | +fi | |
| 116 | + | |
| 117 | +if (( $+commands[pacaur] )); then | |
| 118 | + alias pacclean='pacaur -Sc' | |
| 119 | + alias pacclr='pacaur -Scc' | |
| 120 | + alias paupg='pacaur -Syu' | |
| 121 | + alias pasu='pacaur -Syu --noconfirm' | |
| 122 | + alias pain='pacaur -S' | |
| 123 | + alias pains='pacaur -U' | |
| 124 | + alias pare='pacaur -R' | |
| 125 | + alias parem='pacaur -Rns' | |
| 126 | + alias parep='pacaur -Si' | |
| 127 | + alias pareps='pacaur -Ss' | |
| 128 | + alias paloc='pacaur -Qi' | |
| 129 | + alias palocs='pacaur -Qs' | |
| 130 | + alias palst='pacaur -Qe' | |
| 131 | + alias paorph='pacaur -Qtd' | |
| 132 | + alias painsd='pacaur -S --asdeps' | |
| 133 | + alias pamir='pacaur -Syy' | |
| 134 | + alias paupd="pacaur -Sy" | |
| 135 | +fi | |
| 136 | + | |
| 137 | +if (( $+commands[trizen] )); then | |
| 138 | + alias trconf='trizen -C' | |
| 139 | + alias trupg='trizen -Syua' | |
| 140 | + alias trsu='trizen -Syua --noconfirm' | |
| 141 | + alias trin='trizen -S' | |
| 142 | + alias trclean='trizen -Sc' | |
| 143 | + alias trclr='trizen -Scc' | |
| 144 | + alias trins='trizen -U' | |
| 145 | + alias trre='trizen -R' | |
| 146 | + alias trrem='trizen -Rns' | |
| 147 | + alias trrep='trizen -Si' | |
| 148 | + alias trreps='trizen -Ss' | |
| 149 | + alias trloc='trizen -Qi' | |
| 150 | + alias trlocs='trizen -Qs' | |
| 151 | + alias trlst='trizen -Qe' | |
| 152 | + alias trorph='trizen -Qtd' | |
| 153 | + alias trinsd='trizen -S --asdeps' | |
| 154 | + alias trmir='trizen -Syy' | |
| 155 | + alias trupd="trizen -Sy" | |
| 156 | +fi | |
| 157 | + | |
| 158 | +if (( $+commands[yay] )); then | |
| 159 | + alias yaconf='yay -Pg' | |
| 160 | + alias yaclean='yay -Sc' | |
| 161 | + alias yaclr='yay -Scc' | |
| 162 | + alias yaupg='yay -Syu' | |
| 163 | + alias yasu='yay -Syu --noconfirm' | |
| 164 | + alias yain='yay -S' | |
| 165 | + alias yains='yay -U' | |
| 166 | + alias yare='yay -R' | |
| 167 | + alias yarem='yay -Rns' | |
| 168 | + alias yarep='yay -Si' | |
| 169 | + alias yareps='yay -Ss' | |
| 170 | + alias yaloc='yay -Qi' | |
| 171 | + alias yalocs='yay -Qs' | |
| 172 | + alias yalst='yay -Qe' | |
| 173 | + alias yaorph='yay -Qtd' | |
| 174 | + alias yainsd='yay -S --asdeps' | |
| 175 | + alias yamir='yay -Syy' | |
| 176 | + alias yaupd="yay -Sy" | |
| 177 | +fi | |
| 178 | + | |
| 179 | +# Check Arch Linux PGP Keyring before System Upgrade to prevent failure. | |
| 180 | +function upgrade() { | |
| 181 | + sudo pacman -Sy | |
| 182 | + echo ":: Checking Arch Linux PGP Keyring..." | |
| 183 | + local installedver="$(LANG= sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')" | |
| 184 | + local currentver="$(LANG= sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')" | |
| 185 | + if [ $installedver != $currentver ]; then | |
| 186 | + echo " Arch Linux PGP Keyring is out of date." | |
| 187 | + echo " Updating before full system upgrade." | |
| 188 | + sudo pacman -S --needed --noconfirm archlinux-keyring | |
| 189 | + else | |
| 190 | + echo " Arch Linux PGP Keyring is up to date." | |
| 191 | + echo " Proceeding with full system upgrade." | |
| 192 | + fi | |
| 193 | + if (( $+commands[yay] )); then | |
| 194 | + yay -Su | |
| 195 | + elif (( $+commands[trizen] )); then | |
| 196 | + trizen -Su | |
| 197 | + elif (( $+commands[pacaur] )); then | |
| 198 | + pacaur -Su | |
| 199 | + elif (( $+commands[aura] )); then | |
| 200 | + sudo aura -Su | |
| 201 | + else | |
| 202 | + sudo pacman -Su | |
| 203 | + fi | |
| 204 | +} |
+9-0.oh-my-zsh/plugins/arduino-cli/README.md
| @@ -0,0 +1,9 @@ | ||
| 1 | +# Arduino CLI plugin | |
| 2 | + | |
| 3 | +This plugin adds completion for the [arduino-cli](https://github.com/arduino/arduino-cli) tool. | |
| 4 | + | |
| 5 | +To use it, add `arduino-cli` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... arduino-cli) | |
| 9 | +``` |
+14-0.oh-my-zsh/plugins/arduino-cli/arduino-cli.plugin.zsh
| @@ -0,0 +1,14 @@ | ||
| 1 | +if (( ! $+commands[arduino-cli] )); then | |
| 2 | + return | |
| 3 | +fi | |
| 4 | + | |
| 5 | +# If the completion file doesn't exist yet, we need to autoload it and | |
| 6 | +# bind it to `arduino-cli`. Otherwise, compinit will have already done that. | |
| 7 | +if [[ ! -f "$ZSH_CACHE_DIR/completions/_arduino-cli" ]]; then | |
| 8 | + typeset -g -A _comps | |
| 9 | + autoload -Uz _arduino-cli | |
| 10 | + _comps[arduino-cli]=_arduino-cli | |
| 11 | +fi | |
| 12 | + | |
| 13 | +# Generate and load arduino-cli completion | |
| 14 | +arduino-cli completion zsh >! "$ZSH_CACHE_DIR/completions/_arduino-cli" &| |
+20-0.oh-my-zsh/plugins/argocd/README.md
| @@ -0,0 +1,20 @@ | ||
| 1 | +# Argo CD plugin | |
| 2 | + | |
| 3 | +This plugin adds completion for the [Argo CD](https://argoproj.github.io/cd/) CLI. | |
| 4 | + | |
| 5 | +To use it, add `argocd` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... argocd) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +This plugin does not add any aliases. | |
| 12 | + | |
| 13 | +## Cache | |
| 14 | + | |
| 15 | +This plugin caches the completion script and is automatically updated asynchronously when the plugin is | |
| 16 | +loaded, which is usually when you start up a new terminal emulator. | |
| 17 | + | |
| 18 | +The cache is stored at: | |
| 19 | + | |
| 20 | +- `$ZSH_CACHE/completions/_argocd` completions script |
+14-0.oh-my-zsh/plugins/argocd/argocd.plugin.zsh
| @@ -0,0 +1,14 @@ | ||
| 1 | +# Autocompletion for argocd. | |
| 2 | +if (( ! $+commands[argocd] )); then | |
| 3 | + return | |
| 4 | +fi | |
| 5 | + | |
| 6 | +# If the completion file doesn't exist yet, we need to autoload it and | |
| 7 | +# bind it to `argocd`. Otherwise, compinit will have already done that. | |
| 8 | +if [[ ! -f "$ZSH_CACHE_DIR/completions/_argocd" ]]; then | |
| 9 | + typeset -g -A _comps | |
| 10 | + autoload -Uz _argocd | |
| 11 | + _comps[argocd]=_argocd | |
| 12 | +fi | |
| 13 | + | |
| 14 | +argocd completion zsh >| "$ZSH_CACHE_DIR/completions/_argocd" &| |
+48-0.oh-my-zsh/plugins/asdf/README.md
| @@ -0,0 +1,48 @@ | ||
| 1 | +# asdf | |
| 2 | + | |
| 3 | +Adds integration with [asdf](https://github.com/asdf-vm/asdf), the extendable version manager, with support for Ruby, Node.js, Elixir, Erlang and more. | |
| 4 | + | |
| 5 | +## Installation | |
| 6 | + | |
| 7 | +1. [Install](https://asdf-vm.com/guide/getting-started.html#_1-install-asdf) asdf and ensure that's it's discoverable on `$PATH`; | |
| 8 | +2. Enable it by adding it to your `plugins` definition in `~/.zshrc`: | |
| 9 | + | |
| 10 | +```sh | |
| 11 | +plugins=(asdf) | |
| 12 | +``` | |
| 13 | + | |
| 14 | +## Usage | |
| 15 | + | |
| 16 | +Refer to the [asdf plugin documentation](https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin) for information on how to add a plugin and install the many runtime versions for it. | |
| 17 | + | |
| 18 | +Example for installing the nodejs plugin and the many runtimes for it: | |
| 19 | + | |
| 20 | +```sh | |
| 21 | +# Add plugin to asdf | |
| 22 | +asdf plugin add nodejs | |
| 23 | + | |
| 24 | +# Install the latest available version | |
| 25 | +asdf install nodejs latest | |
| 26 | + | |
| 27 | +# Uninstall the latest version | |
| 28 | +asdf uninstall nodejs latest | |
| 29 | + | |
| 30 | +# Install a specific version | |
| 31 | +asdf install nodejs 16.5.0 | |
| 32 | + | |
| 33 | +# Set the latest version in .tool-versions of the `current directory` | |
| 34 | +asdf set nodejs latest | |
| 35 | + | |
| 36 | +# Set a specific version in the `parent directory` | |
| 37 | +asdf set -p nodejs 16.5.0 # -p is shorthand for --parent | |
| 38 | + | |
| 39 | +# Set a global version under `$HOME` | |
| 40 | +asdf set -u nodejs 16.5.0 # -u is shorthand for --home | |
| 41 | +``` | |
| 42 | + | |
| 43 | +For more commands, run `asdf help` or refer to the | |
| 44 | +[asdf CLI documentation](https://asdf-vm.com/manage/commands.html#all-commands). | |
| 45 | + | |
| 46 | +## Maintainer | |
| 47 | + | |
| 48 | +- [@RobLoach](https://github.com/RobLoach) |
+13-0.oh-my-zsh/plugins/asdf/asdf.plugin.zsh
| @@ -0,0 +1,13 @@ | ||
| 1 | +(( ! $+commands[asdf] )) && return | |
| 2 | + | |
| 3 | +export ASDF_DATA_DIR="${ASDF_DATA_DIR:-$HOME/.asdf}" | |
| 4 | +path=("$ASDF_DATA_DIR/shims" $path) | |
| 5 | + | |
| 6 | +# If the completion file doesn't exist yet, we need to autoload it and | |
| 7 | +# bind it to `asdf`. Otherwise, compinit will have already done that. | |
| 8 | +if [[ ! -f "$ZSH_CACHE_DIR/completions/_asdf" ]]; then | |
| 9 | + typeset -g -A _comps | |
| 10 | + autoload -Uz _asdf | |
| 11 | + _comps[asdf]=_asdf | |
| 12 | +fi | |
| 13 | +asdf completion zsh >| "$ZSH_CACHE_DIR/completions/_asdf" &| |
+20-0.oh-my-zsh/plugins/autoenv/README.md
| @@ -0,0 +1,20 @@ | ||
| 1 | +# Autoenv plugin | |
| 2 | + | |
| 3 | +This plugin loads the [Autoenv](https://github.com/inishchith/autoenv). | |
| 4 | + | |
| 5 | +To use it, add `autoenv` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... autoenv) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Functions | |
| 12 | + | |
| 13 | +* `use_env()`: creates and/or activates a virtualenv. For use in `.env` files. | |
| 14 | + See the source code for details. | |
| 15 | + | |
| 16 | +## Requirements | |
| 17 | + | |
| 18 | +In order to make this work, you will need to have the autoenv installed. | |
| 19 | + | |
| 20 | +More info on the usage and install at [the project's homepage](https://github.com/inishchith/autoenv). |
+80-0.oh-my-zsh/plugins/autoenv/autoenv.plugin.zsh
| @@ -0,0 +1,80 @@ | ||
| 1 | +# Initialization: activate autoenv or report its absence | |
| 2 | +() { | |
| 3 | +local d autoenv_dir install_locations | |
| 4 | +if ! type autoenv_init >/dev/null; then | |
| 5 | + # Check if activate.sh is in $PATH | |
| 6 | + if (( $+commands[activate.sh] )); then | |
| 7 | + autoenv_dir="${commands[activate.sh]:h}" | |
| 8 | + fi | |
| 9 | + | |
| 10 | + # Locate autoenv installation | |
| 11 | + if [[ -z $autoenv_dir ]]; then | |
| 12 | + install_locations=( | |
| 13 | + ~/.autoenv | |
| 14 | + ~/.local/bin | |
| 15 | + /usr/local/opt/autoenv | |
| 16 | + /opt/homebrew/opt/autoenv | |
| 17 | + /usr/local/bin | |
| 18 | + /usr/share/autoenv-git | |
| 19 | + ~/Library/Python/bin | |
| 20 | + .venv/bin | |
| 21 | + venv/bin | |
| 22 | + env/bin | |
| 23 | + .env/bin | |
| 24 | + ) | |
| 25 | + for d ( $install_locations ); do | |
| 26 | + if [[ -e $d/activate || -e $d/activate.sh ]]; then | |
| 27 | + autoenv_dir=$d | |
| 28 | + break | |
| 29 | + fi | |
| 30 | + done | |
| 31 | + fi | |
| 32 | + | |
| 33 | + # Look for Homebrew path as a last resort | |
| 34 | + if [[ -z "$autoenv_dir" ]] && (( $+commands[brew] )); then | |
| 35 | + d=$(brew --prefix)/opt/autoenv | |
| 36 | + if [[ -e $d/activate || -e $d/activate.sh ]]; then | |
| 37 | + autoenv_dir=$d | |
| 38 | + fi | |
| 39 | + fi | |
| 40 | + | |
| 41 | + # Complain if autoenv is not installed | |
| 42 | + if [[ -z $autoenv_dir ]]; then | |
| 43 | + cat <<END >&2 | |
| 44 | +-------- AUTOENV --------- | |
| 45 | +Could not locate autoenv installation. | |
| 46 | +Please check if autoenv is correctly installed. | |
| 47 | +In the meantime the autoenv plugin is DISABLED. | |
| 48 | +-------------------------- | |
| 49 | +END | |
| 50 | + return 1 | |
| 51 | + fi | |
| 52 | + # Load autoenv | |
| 53 | + if [[ -e $autoenv_dir/activate ]]; then | |
| 54 | + source $autoenv_dir/activate | |
| 55 | + else | |
| 56 | + source $autoenv_dir/activate.sh | |
| 57 | + fi | |
| 58 | +fi | |
| 59 | +} | |
| 60 | +[[ $? != 0 ]] && return $? | |
| 61 | + | |
| 62 | +# The use_env call below is a reusable command to activate/create a new Python | |
| 63 | +# virtualenv, requiring only a single declarative line of code in your .env files. | |
| 64 | +# It only performs an action if the requested virtualenv is not the current one. | |
| 65 | + | |
| 66 | +use_env() { | |
| 67 | + local venv | |
| 68 | + venv="$1" | |
| 69 | + if [[ "${VIRTUAL_ENV:t}" != "$venv" ]]; then | |
| 70 | + if workon | grep -q "$venv"; then | |
| 71 | + workon "$venv" | |
| 72 | + else | |
| 73 | + echo -n "Create virtualenv $venv now? (Yn) " | |
| 74 | + read answer | |
| 75 | + if [[ "$answer" == "Y" ]]; then | |
| 76 | + mkvirtualenv "$venv" | |
| 77 | + fi | |
| 78 | + fi | |
| 79 | + fi | |
| 80 | +} |
+11-0.oh-my-zsh/plugins/autojump/README.md
| @@ -0,0 +1,11 @@ | ||
| 1 | +# Autojump plugin | |
| 2 | + | |
| 3 | +This plugin loads the [autojump navigation tool](https://github.com/wting/autojump). | |
| 4 | + | |
| 5 | +To use it, add `autojump` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... autojump) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +**Note:** you have to [install autojump](https://github.com/wting/autojump#installation) first. |
+41-0.oh-my-zsh/plugins/autojump/autojump.plugin.zsh
| @@ -0,0 +1,41 @@ | ||
| 1 | +declare -a autojump_paths | |
| 2 | +autojump_paths=( | |
| 3 | + $HOME/.autojump/etc/profile.d/autojump.zsh # manual installation | |
| 4 | + $HOME/.autojump/share/autojump/autojump.zsh # manual installation | |
| 5 | + $HOME/.nix-profile/etc/profile.d/autojump.sh # NixOS installation | |
| 6 | + /run/current-system/sw/share/autojump/autojump.zsh # NixOS installation | |
| 7 | + /etc/profiles/per-user/$USER/share/autojump/autojump.zsh # Home Manager, NixOS with user-scoped packages | |
| 8 | + /usr/share/autojump/autojump.zsh # Debian and Ubuntu package | |
| 9 | + $PREFIX/share/autojump/autojump.zsh # Termux package | |
| 10 | + /etc/profile.d/autojump.zsh # manual installation | |
| 11 | + /etc/profile.d/autojump.sh # Gentoo installation | |
| 12 | + /usr/local/share/autojump/autojump.zsh # FreeBSD installation | |
| 13 | + /usr/pkg/share/autojump/autojump.zsh # NetBSD installation | |
| 14 | + /opt/local/etc/profile.d/autojump.sh # macOS with MacPorts | |
| 15 | + /usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default) | |
| 16 | + /opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs) | |
| 17 | + /opt/pkg/share/autojump/autojump.zsh # macOS with pkgsrc | |
| 18 | + /etc/profiles/per-user/$USER/etc/profile.d/autojump.sh # macOS Nix, Home Manager and flakes | |
| 19 | + /nix/var/nix/gcroots/current-system/sw/share/zsh/site-functions/autojump.zsh # macOS Nix, nix-darwin | |
| 20 | +) | |
| 21 | + | |
| 22 | +for file in $autojump_paths; do | |
| 23 | + if [[ -f "$file" ]]; then | |
| 24 | + source "$file" | |
| 25 | + found=1 | |
| 26 | + break | |
| 27 | + fi | |
| 28 | +done | |
| 29 | + | |
| 30 | +# if no path found, try Homebrew | |
| 31 | +if (( ! found && $+commands[brew] )); then | |
| 32 | + file=$(brew --prefix)/etc/profile.d/autojump.sh | |
| 33 | + if [[ -f "$file" ]]; then | |
| 34 | + source "$file" | |
| 35 | + found=1 | |
| 36 | + fi | |
| 37 | +fi | |
| 38 | + | |
| 39 | +(( ! found )) && echo '[oh-my-zsh] autojump not found. Please install it first.' | |
| 40 | + | |
| 41 | +unset autojump_paths file found |
+8-0.oh-my-zsh/plugins/autopep8/README.md
| @@ -0,0 +1,8 @@ | ||
| 1 | +# autopep8 plugin | |
| 2 | + | |
| 3 | +This plugin adds completion for [autopep8](https://pypi.org/project/autopep8/), a tool that automatically formats Python code to conform to the [PEP 8](http://www.python.org/dev/peps/pep-0008/) style guide. | |
| 4 | + | |
| 5 | +To use it, add autopep8 to the plugins array of your zshrc file: | |
| 6 | +``` | |
| 7 | +plugins=(... autopep8) | |
| 8 | +``` |
+32-0.oh-my-zsh/plugins/autopep8/_autopep8
| @@ -0,0 +1,32 @@ | ||
| 1 | +#compdef autopep8 | |
| 2 | +# | |
| 3 | +# this is zsh completion function file. | |
| 4 | +# generated by genzshcomp(ver: 0.5.1) | |
| 5 | +# | |
| 6 | + | |
| 7 | +typeset -A opt_args | |
| 8 | +local context state line | |
| 9 | + | |
| 10 | +_arguments -s -S \ | |
| 11 | + "--help[show this help message and exit]:" \ | |
| 12 | + "-h[show this help message and exit]:" \ | |
| 13 | + "--version[show program's version number and exit]:" \ | |
| 14 | + "--verbose[print verbose messages; multiple -v result in more verbose messages]" \ | |
| 15 | + "-v[print verbose messages; multiple -v result in more verbose messages]" \ | |
| 16 | + "--diff[print the diff for the fixed source]" \ | |
| 17 | + "-d[print the diff for the fixed source]" \ | |
| 18 | + "--in-place[make changes to files in place]" \ | |
| 19 | + "-i[make changes to files in place]" \ | |
| 20 | + "--recursive[run recursively; must be used with --in-place or --diff]" \ | |
| 21 | + "-r[run recursively; must be used with --in-place or --diff]" \ | |
| 22 | + "--jobs[number of parallel jobs; match CPU count if value is less than 1]::n number of parallel jobs; match CPU count if value is:_files" \ | |
| 23 | + "-j[number of parallel jobs; match CPU count if value is less than 1]::n number of parallel jobs; match CPU count if value is:_files" \ | |
| 24 | + "--pep8-passes[maximum number of additional pep8 passes (default: 100)]::n:_files" \ | |
| 25 | + "-p[maximum number of additional pep8 passes (default: 100)]::n:_files" \ | |
| 26 | + "-a[-a result in more aggressive changes]::result:_files" \ | |
| 27 | + "--exclude[exclude files/directories that match these comma- separated globs]::globs:_files" \ | |
| 28 | + "--list-fixes[list codes for fixes; used by --ignore and --select]" \ | |
| 29 | + "--ignore[do not fix these errors/warnings (default E226,E24)]::errors:_files" \ | |
| 30 | + "--select[fix only these errors/warnings (e.g. E4,W)]::errors:_files" \ | |
| 31 | + "--max-line-length[set maximum allowed line length (default: 79)]::n:_files" \ | |
| 32 | + "*::args:_files" |
+98-0.oh-my-zsh/plugins/aws/README.md
| @@ -0,0 +1,98 @@ | ||
| 1 | +# aws | |
| 2 | + | |
| 3 | +This plugin provides completion support for [awscli v2](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/index.html) | |
| 4 | +and a few utilities to manage AWS profiles/regions and display them in the prompt. | |
| 5 | +[awscli v1](https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html) is no longer supported. | |
| 6 | + | |
| 7 | +To use it, add `aws` to the plugins array in your zshrc file. | |
| 8 | + | |
| 9 | +```zsh | |
| 10 | +plugins=(... aws) | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Plugin commands | |
| 14 | + | |
| 15 | +* `asp [<profile>]`: sets `$AWS_PROFILE` and `$AWS_DEFAULT_PROFILE` (legacy) to `<profile>`. | |
| 16 | + It also sets `$AWS_EB_PROFILE` to `<profile>` for the Elastic Beanstalk CLI. It sets `$AWS_PROFILE_REGION` for display in `aws_prompt_info`. | |
| 17 | + Run `asp` without arguments to clear the profile. | |
| 18 | +* `asp [<profile>] login`: If AWS SSO has been configured in your aws profile, it will run the `aws sso login` command following profile selection. | |
| 19 | +* `asp [<profile>] login [<sso_session>]`: In addition to `asp [<profile>] login`, if SSO session has been configured in your aws profile, it will run the `aws sso login --sso-session <sso_session>` command following profile selection. | |
| 20 | +* `asp [<profile>] logout`: If AWS SSO has been configured in your aws profile, it will run the `aws sso logout` command following profile selection. | |
| 21 | + | |
| 22 | +* `asr [<region>]`: sets `$AWS_REGION` and `$AWS_DEFAULT_REGION` (legacy) to `<region>`. | |
| 23 | + Run `asr` without arguments to clear the profile. | |
| 24 | + | |
| 25 | +* `acp [<profile>] [<mfa_token>]`: in addition to `asp` functionality, it actually changes | |
| 26 | + the profile by assuming the role specified in the `<profile>` configuration. It supports | |
| 27 | + MFA and sets `$AWS_ACCESS_KEY_ID`, `$AWS_SECRET_ACCESS_KEY` and `$AWS_SESSION_TOKEN`, if | |
| 28 | + obtained. It requires the roles to be configured as per the | |
| 29 | + [official guide](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html). | |
| 30 | + Run `acp` without arguments to clear the profile. | |
| 31 | + | |
| 32 | +* `agp`: gets the current value of `$AWS_PROFILE`. | |
| 33 | + | |
| 34 | +* `agr`: gets the current value of `$AWS_REGION`. | |
| 35 | + | |
| 36 | +* `aws_change_access_key`: changes the AWS access key of a profile. | |
| 37 | + | |
| 38 | +* `aws_profiles`: lists the available profiles in the `$AWS_CONFIG_FILE` (default: `~/.aws/config`). | |
| 39 | + Used to provide completion for the `asp` function. | |
| 40 | + | |
| 41 | +* `aws_regions`: lists the available regions. | |
| 42 | + Used to provide completion for the `asr` function. | |
| 43 | + | |
| 44 | +## Plugin options | |
| 45 | + | |
| 46 | +* Set `SHOW_AWS_PROMPT=false` in your zshrc file if you want to prevent the plugin from modifying your RPROMPT. | |
| 47 | + Some themes might overwrite the value of RPROMPT instead of appending to it, so they'll need to be fixed to | |
| 48 | + see the AWS profile/region prompt. | |
| 49 | + | |
| 50 | +* Set `AWS_PROFILE_STATE_ENABLED=true` in your zshrc file if you want the aws profile to persist between shell sessions. | |
| 51 | + This option might slow down your shell startup time. | |
| 52 | + By default the state file path is `/tmp/.aws_current_profile`. This means that the state won't survive a reboot or otherwise GC. | |
| 53 | + You can control the state file path using the `AWS_STATE_FILE` environment variable. | |
| 54 | + | |
| 55 | +## Theme | |
| 56 | + | |
| 57 | +The plugin creates an `aws_prompt_info` function that you can use in your theme, which displays | |
| 58 | +the current `$AWS_PROFILE` and `$AWS_REGION`. It uses four variables to control how that is shown: | |
| 59 | + | |
| 60 | +* ZSH_THEME_AWS_PROFILE_PREFIX: sets the prefix of the AWS_PROFILE. Defaults to `<aws:`. | |
| 61 | + | |
| 62 | +* ZSH_THEME_AWS_PROFILE_SUFFIX: sets the suffix of the AWS_PROFILE. Defaults to `>`. | |
| 63 | + | |
| 64 | +* ZSH_THEME_AWS_REGION_PREFIX: sets the prefix of the AWS_REGION. Defaults to `<region:`. | |
| 65 | + | |
| 66 | +* ZSH_THEME_AWS_REGION_SUFFIX: sets the suffix of the AWS_REGION. Defaults to `>`. | |
| 67 | + | |
| 68 | +* ZSH_THEME_AWS_DIVIDER: sets the divider between ZSH_THEME_AWS_PROFILE_SUFFIX and ZSH_THEME_AWS_REGION_PREFIX. Defaults to ` ` (single space). | |
| 69 | + | |
| 70 | +## Configuration | |
| 71 | + | |
| 72 | +[Configuration and credential file settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) by AWS | |
| 73 | + | |
| 74 | +### Scenario: IAM roles with a source profile and MFA authentication | |
| 75 | + | |
| 76 | +Source profile credentials in `~/.aws/credentials`: | |
| 77 | + | |
| 78 | +```ini | |
| 79 | +[source-profile-name] | |
| 80 | +aws_access_key_id = ... | |
| 81 | +aws_secret_access_key = ... | |
| 82 | +``` | |
| 83 | + | |
| 84 | +Role configuration in `~/.aws/config`: | |
| 85 | + | |
| 86 | +```ini | |
| 87 | +[profile source-profile-name] | |
| 88 | +mfa_serial = arn:aws:iam::111111111111:mfa/myuser | |
| 89 | +region = us-east-1 | |
| 90 | +output = json | |
| 91 | + | |
| 92 | +[profile profile-with-role] | |
| 93 | +role_arn = arn:aws:iam::9999999999999:role/myrole | |
| 94 | +mfa_serial = arn:aws:iam::111111111111:mfa/myuser | |
| 95 | +source_profile = source-profile-name | |
| 96 | +region = us-east-1 | |
| 97 | +output = json | |
| 98 | +``` |
+338-0.oh-my-zsh/plugins/aws/aws.plugin.zsh
| @@ -0,0 +1,338 @@ | ||
| 1 | +function agp() { | |
| 2 | + echo $AWS_PROFILE | |
| 3 | +} | |
| 4 | + | |
| 5 | +function agr() { | |
| 6 | + echo $AWS_REGION | |
| 7 | +} | |
| 8 | + | |
| 9 | +# Update state file if enabled | |
| 10 | +function _aws_update_state() { | |
| 11 | + if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then | |
| 12 | + test -d $(dirname ${AWS_STATE_FILE}) || exit 1 | |
| 13 | + echo "${AWS_PROFILE} ${AWS_REGION}" > "${AWS_STATE_FILE}" | |
| 14 | + fi | |
| 15 | +} | |
| 16 | + | |
| 17 | +function _aws_clear_state() { | |
| 18 | + if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then | |
| 19 | + test -d $(dirname ${AWS_STATE_FILE}) || exit 1 | |
| 20 | + echo -n > "${AWS_STATE_FILE}" | |
| 21 | + fi | |
| 22 | +} | |
| 23 | + | |
| 24 | +# AWS profile selection | |
| 25 | +function asp() { | |
| 26 | + if [[ -z "$1" ]]; then | |
| 27 | + unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE AWS_PROFILE_REGION | |
| 28 | + _aws_clear_state | |
| 29 | + echo AWS profile cleared. | |
| 30 | + return | |
| 31 | + fi | |
| 32 | + | |
| 33 | + local -a available_profiles | |
| 34 | + available_profiles=($(aws_profiles)) | |
| 35 | + if [[ -z "${available_profiles[(r)$1]}" ]]; then | |
| 36 | + echo "${fg[red]}Profile '$1' not found in '${AWS_CONFIG_FILE:-$HOME/.aws/config}'" >&2 | |
| 37 | + echo "Available profiles: ${(j:, :)available_profiles:-no profiles found}${reset_color}" >&2 | |
| 38 | + return 1 | |
| 39 | + fi | |
| 40 | + | |
| 41 | + export AWS_DEFAULT_PROFILE=$1 | |
| 42 | + export AWS_PROFILE=$1 | |
| 43 | + export AWS_EB_PROFILE=$1 | |
| 44 | + | |
| 45 | + export AWS_PROFILE_REGION=$(aws configure get region) | |
| 46 | + | |
| 47 | + _aws_update_state | |
| 48 | + | |
| 49 | + if [[ "$2" == "login" ]]; then | |
| 50 | + if [[ -n "$3" ]]; then | |
| 51 | + aws sso login --sso-session $3 | |
| 52 | + else | |
| 53 | + aws sso login | |
| 54 | + fi | |
| 55 | + elif [[ "$2" == "logout" ]]; then | |
| 56 | + aws sso logout | |
| 57 | + fi | |
| 58 | +} | |
| 59 | + | |
| 60 | +# AWS region selection | |
| 61 | +function asr() { | |
| 62 | + if [[ -z "$1" ]]; then | |
| 63 | + unset AWS_DEFAULT_REGION AWS_REGION | |
| 64 | + _aws_update_state | |
| 65 | + echo AWS region cleared. | |
| 66 | + return | |
| 67 | + fi | |
| 68 | + | |
| 69 | + local -a available_regions | |
| 70 | + available_regions=($(aws_regions)) | |
| 71 | + if [[ -z "${available_regions[(r)$1]}" ]]; then | |
| 72 | + echo "${fg[red]}Available regions: \n$(aws_regions)" | |
| 73 | + return 1 | |
| 74 | + fi | |
| 75 | + | |
| 76 | + export AWS_REGION=$1 | |
| 77 | + export AWS_DEFAULT_REGION=$1 | |
| 78 | + _aws_update_state | |
| 79 | +} | |
| 80 | + | |
| 81 | +# AWS profile switch | |
| 82 | +function acp() { | |
| 83 | + if [[ -z "$1" ]]; then | |
| 84 | + unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE | |
| 85 | + unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN | |
| 86 | + echo AWS profile cleared. | |
| 87 | + return | |
| 88 | + fi | |
| 89 | + | |
| 90 | + local -a available_profiles | |
| 91 | + available_profiles=($(aws_profiles)) | |
| 92 | + if [[ -z "${available_profiles[(r)$1]}" ]]; then | |
| 93 | + echo "${fg[red]}Profile '$1' not found in '${AWS_CONFIG_FILE:-$HOME/.aws/config}'" >&2 | |
| 94 | + echo "Available profiles: ${(j:, :)available_profiles:-no profiles found}${reset_color}" >&2 | |
| 95 | + return 1 | |
| 96 | + fi | |
| 97 | + | |
| 98 | + local profile="$1" | |
| 99 | + local mfa_token="$2" | |
| 100 | + | |
| 101 | + # Get fallback credentials for if the aws command fails or no command is run | |
| 102 | + local aws_access_key_id="$(aws configure get aws_access_key_id --profile $profile)" | |
| 103 | + local aws_secret_access_key="$(aws configure get aws_secret_access_key --profile $profile)" | |
| 104 | + local aws_session_token="$(aws configure get aws_session_token --profile $profile)" | |
| 105 | + | |
| 106 | + | |
| 107 | + # First, if the profile has MFA configured, lets get the token and session duration | |
| 108 | + local mfa_serial="$(aws configure get mfa_serial --profile $profile)" | |
| 109 | + local sess_duration="$(aws configure get duration_seconds --profile $profile)" | |
| 110 | + | |
| 111 | + if [[ -n "$mfa_serial" ]]; then | |
| 112 | + local -a mfa_opt | |
| 113 | + if [[ -z "$mfa_token" ]]; then | |
| 114 | + echo -n "Please enter your MFA token for $mfa_serial: " | |
| 115 | + read -r mfa_token | |
| 116 | + fi | |
| 117 | + if [[ -z "$sess_duration" ]]; then | |
| 118 | + echo -n "Please enter the session duration in seconds (900-43200; default: 3600, which is the default maximum for a role): " | |
| 119 | + read -r sess_duration | |
| 120 | + fi | |
| 121 | + mfa_opt=(--serial-number "$mfa_serial" --token-code "$mfa_token" --duration-seconds "${sess_duration:-3600}") | |
| 122 | + fi | |
| 123 | + | |
| 124 | + # Now see whether we need to just MFA for the current role, or assume a different one | |
| 125 | + local role_arn="$(aws configure get role_arn --profile $profile)" | |
| 126 | + local sess_name="$(aws configure get role_session_name --profile $profile)" | |
| 127 | + | |
| 128 | + if [[ -n "$role_arn" ]]; then | |
| 129 | + # Means we need to assume a specified role | |
| 130 | + aws_command=(aws sts assume-role --role-arn "$role_arn" "${mfa_opt[@]}") | |
| 131 | + | |
| 132 | + # Check whether external_id is configured to use while assuming the role | |
| 133 | + local external_id="$(aws configure get external_id --profile $profile)" | |
| 134 | + if [[ -n "$external_id" ]]; then | |
| 135 | + aws_command+=(--external-id "$external_id") | |
| 136 | + fi | |
| 137 | + | |
| 138 | + # Get source profile to use to assume role | |
| 139 | + local source_profile="$(aws configure get source_profile --profile $profile)" | |
| 140 | + if [[ -z "$sess_name" ]]; then | |
| 141 | + sess_name="${source_profile:-profile}" | |
| 142 | + fi | |
| 143 | + aws_command+=(--profile="${source_profile:-profile}" --role-session-name "${sess_name}") | |
| 144 | + | |
| 145 | + echo "Assuming role $role_arn using profile ${source_profile:-profile}" | |
| 146 | + else | |
| 147 | + # Means we only need to do MFA | |
| 148 | + aws_command=(aws sts get-session-token --profile="$profile" "${mfa_opt[@]}") | |
| 149 | + echo "Obtaining session token for profile $profile" | |
| 150 | + fi | |
| 151 | + | |
| 152 | + # Format output of aws command for easier processing | |
| 153 | + aws_command+=(--query '[Credentials.AccessKeyId,Credentials.SecretAccessKey,Credentials.SessionToken]' --output text) | |
| 154 | + | |
| 155 | + # Run the aws command to obtain credentials | |
| 156 | + local -a credentials | |
| 157 | + credentials=(${(ps:\t:)"$(${aws_command[@]})"}) | |
| 158 | + | |
| 159 | + if [[ -n "$credentials" ]]; then | |
| 160 | + aws_access_key_id="${credentials[1]}" | |
| 161 | + aws_secret_access_key="${credentials[2]}" | |
| 162 | + aws_session_token="${credentials[3]}" | |
| 163 | + fi | |
| 164 | + | |
| 165 | + # Switch to AWS profile | |
| 166 | + if [[ -n "${aws_access_key_id}" && -n "$aws_secret_access_key" ]]; then | |
| 167 | + export AWS_DEFAULT_PROFILE="$profile" | |
| 168 | + export AWS_PROFILE="$profile" | |
| 169 | + export AWS_EB_PROFILE="$profile" | |
| 170 | + export AWS_ACCESS_KEY_ID="$aws_access_key_id" | |
| 171 | + export AWS_SECRET_ACCESS_KEY="$aws_secret_access_key" | |
| 172 | + | |
| 173 | + if [[ -n "$aws_session_token" ]]; then | |
| 174 | + export AWS_SESSION_TOKEN="$aws_session_token" | |
| 175 | + else | |
| 176 | + unset AWS_SESSION_TOKEN | |
| 177 | + fi | |
| 178 | + | |
| 179 | + echo "Switched to AWS Profile: $profile" | |
| 180 | + fi | |
| 181 | +} | |
| 182 | + | |
| 183 | +function aws_change_access_key() { | |
| 184 | + if [[ -z "$1" ]]; then | |
| 185 | + echo "usage: $0 <profile>" | |
| 186 | + return 1 | |
| 187 | + fi | |
| 188 | + | |
| 189 | + local profile="$1" | |
| 190 | + # Get current access key | |
| 191 | + local original_aws_access_key_id="$(aws configure get aws_access_key_id --profile $profile)" | |
| 192 | + | |
| 193 | + asp "$profile" || return 1 | |
| 194 | + echo "Generating a new access key pair for you now." | |
| 195 | + if aws --no-cli-pager iam create-access-key; then | |
| 196 | + echo "Insert the newly generated credentials when asked." | |
| 197 | + aws --no-cli-pager configure --profile $profile | |
| 198 | + else | |
| 199 | + echo "Current access keys:" | |
| 200 | + aws --no-cli-pager iam list-access-keys | |
| 201 | + echo "Profile \"${profile}\" is currently using the $original_aws_access_key_id key. You can delete an old access key by running \`aws --profile $profile iam delete-access-key --access-key-id AccessKeyId\`" | |
| 202 | + return 1 | |
| 203 | + fi | |
| 204 | + | |
| 205 | + read -q "yn?Would you like to disable your previous access key (${original_aws_access_key_id}) now? " | |
| 206 | + case $yn in | |
| 207 | + [Yy]*) | |
| 208 | + echo -n "\nDisabling access key ${original_aws_access_key_id}..." | |
| 209 | + if aws --no-cli-pager iam update-access-key --access-key-id ${original_aws_access_key_id} --status Inactive; then | |
| 210 | + echo "done." | |
| 211 | + else | |
| 212 | + echo "\nFailed to disable ${original_aws_access_key_id} key." | |
| 213 | + fi | |
| 214 | + ;; | |
| 215 | + *) | |
| 216 | + echo "" | |
| 217 | + ;; | |
| 218 | + esac | |
| 219 | + echo "You can now safely delete the old access key by running \`aws --profile $profile iam delete-access-key --access-key-id ${original_aws_access_key_id}\`" | |
| 220 | + echo "Your current keys are:" | |
| 221 | + aws --no-cli-pager iam list-access-keys | |
| 222 | +} | |
| 223 | + | |
| 224 | +function aws_regions() { | |
| 225 | + local region | |
| 226 | + if [[ $AWS_DEFAULT_REGION ]];then | |
| 227 | + region="$AWS_DEFAULT_REGION" | |
| 228 | + elif [[ $AWS_REGION ]];then | |
| 229 | + region="$AWS_REGION" | |
| 230 | + else | |
| 231 | + region="us-west-1" | |
| 232 | + fi | |
| 233 | + | |
| 234 | + if [[ $AWS_DEFAULT_PROFILE || $AWS_PROFILE ]];then | |
| 235 | + aws ec2 describe-regions --region $region |grep RegionName | awk -F ':' '{gsub(/"/, "", $2);gsub(/,/, "", $2);gsub(/ /, "", $2); print $2}' | |
| 236 | + else | |
| 237 | + echo "You must specify a AWS profile." | |
| 238 | + fi | |
| 239 | +} | |
| 240 | + | |
| 241 | +function aws_profiles() { | |
| 242 | + aws --no-cli-pager configure list-profiles 2> /dev/null && return | |
| 243 | + [[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1 | |
| 244 | + grep --color=never -Eo '\[.*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | sed -E 's/^[[:space:]]*\[(profile)?[[:space:]]*([^[:space:]]+)\][[:space:]]*$/\2/g' | |
| 245 | +} | |
| 246 | + | |
| 247 | +function _aws_regions() { | |
| 248 | + reply=($(aws_regions)) | |
| 249 | +} | |
| 250 | +compctl -K _aws_regions asr | |
| 251 | + | |
| 252 | +function _aws_profiles() { | |
| 253 | + reply=($(aws_profiles)) | |
| 254 | +} | |
| 255 | +compctl -K _aws_profiles asp acp aws_change_access_key | |
| 256 | + | |
| 257 | +# AWS prompt | |
| 258 | +function aws_prompt_info() { | |
| 259 | + local _aws_to_show | |
| 260 | + local region="${AWS_REGION:-${AWS_DEFAULT_REGION:-$AWS_PROFILE_REGION}}" | |
| 261 | + | |
| 262 | + if [[ -n "$AWS_PROFILE" ]];then | |
| 263 | + _aws_to_show+="${ZSH_THEME_AWS_PROFILE_PREFIX="<aws:"}${AWS_PROFILE}${ZSH_THEME_AWS_PROFILE_SUFFIX=">"}" | |
| 264 | + fi | |
| 265 | + | |
| 266 | + if [[ -n "$region" ]]; then | |
| 267 | + [[ -n "$_aws_to_show" ]] && _aws_to_show+="${ZSH_THEME_AWS_DIVIDER=" "}" | |
| 268 | + _aws_to_show+="${ZSH_THEME_AWS_REGION_PREFIX="<region:"}${region}${ZSH_THEME_AWS_REGION_SUFFIX=">"}" | |
| 269 | + fi | |
| 270 | + | |
| 271 | + echo "$_aws_to_show" | |
| 272 | +} | |
| 273 | + | |
| 274 | +if [[ "$SHOW_AWS_PROMPT" != false && "$RPROMPT" != *'$(aws_prompt_info)'* ]]; then | |
| 275 | + RPROMPT='$(aws_prompt_info)'"$RPROMPT" | |
| 276 | +fi | |
| 277 | + | |
| 278 | +if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then | |
| 279 | + AWS_STATE_FILE="${AWS_STATE_FILE:-/tmp/.aws_current_profile}" | |
| 280 | + test -s "${AWS_STATE_FILE}" || return | |
| 281 | + | |
| 282 | + aws_state=($(cat $AWS_STATE_FILE)) | |
| 283 | + | |
| 284 | + export AWS_DEFAULT_PROFILE="${aws_state[1]}" | |
| 285 | + export AWS_PROFILE="$AWS_DEFAULT_PROFILE" | |
| 286 | + export AWS_EB_PROFILE="$AWS_DEFAULT_PROFILE" | |
| 287 | + | |
| 288 | + test -z "${aws_state[2]}" && AWS_REGION=$(aws configure get region) | |
| 289 | + | |
| 290 | + export AWS_REGION=${AWS_REGION:-$aws_state[2]} | |
| 291 | + export AWS_DEFAULT_REGION="$AWS_REGION" | |
| 292 | +fi | |
| 293 | + | |
| 294 | +# Load awscli completions | |
| 295 | + | |
| 296 | +# AWS CLI v2 comes with its own autocompletion. Check if that is there, otherwise fall back | |
| 297 | +if command -v aws_completer &> /dev/null; then | |
| 298 | + autoload -Uz bashcompinit && bashcompinit | |
| 299 | + complete -C aws_completer aws | |
| 300 | +else | |
| 301 | + function _awscli-homebrew-installed() { | |
| 302 | + # check if Homebrew is installed | |
| 303 | + (( $+commands[brew] )) || return 1 | |
| 304 | + | |
| 305 | + # speculatively check default brew prefix | |
| 306 | + if [ -h /usr/local/opt/awscli ]; then | |
| 307 | + _brew_prefix=/usr/local/opt/awscli | |
| 308 | + else | |
| 309 | + # ok, it is not in the default prefix | |
| 310 | + # this call to brew is expensive (about 400 ms), so at least let's make it only once | |
| 311 | + _brew_prefix=$(brew --prefix awscli) | |
| 312 | + fi | |
| 313 | + } | |
| 314 | + | |
| 315 | + # get aws_zsh_completer.sh location from $PATH | |
| 316 | + _aws_zsh_completer_path="$commands[aws_zsh_completer.sh]" | |
| 317 | + | |
| 318 | + # otherwise check common locations | |
| 319 | + if [[ -z $_aws_zsh_completer_path ]]; then | |
| 320 | + # Homebrew | |
| 321 | + if _awscli-homebrew-installed; then | |
| 322 | + _aws_zsh_completer_path=$_brew_prefix/libexec/bin/aws_zsh_completer.sh | |
| 323 | + # Ubuntu | |
| 324 | + elif [[ -e /usr/share/zsh/vendor-completions/_awscli ]]; then | |
| 325 | + _aws_zsh_completer_path=/usr/share/zsh/vendor-completions/_awscli | |
| 326 | + # NixOS | |
| 327 | + elif [[ -e "${commands[aws]:P:h:h}/share/zsh/site-functions/aws_zsh_completer.sh" ]]; then | |
| 328 | + _aws_zsh_completer_path="${commands[aws]:P:h:h}/share/zsh/site-functions/aws_zsh_completer.sh" | |
| 329 | + # RPM | |
| 330 | + else | |
| 331 | + _aws_zsh_completer_path=/usr/share/zsh/site-functions/aws_zsh_completer.sh | |
| 332 | + fi | |
| 333 | + fi | |
| 334 | + | |
| 335 | + [[ -r $_aws_zsh_completer_path ]] && source $_aws_zsh_completer_path | |
| 336 | + unset _aws_zsh_completer_path _brew_prefix | |
| 337 | +fi | |
| 338 | + |
+49-0.oh-my-zsh/plugins/azure/README.md
| @@ -0,0 +1,49 @@ | ||
| 1 | +# azure | |
| 2 | + | |
| 3 | +This plugin provides completion support for [azure cli](https://docs.microsoft.com/en-us/cli/azure/) | |
| 4 | +and a few utilities to manage azure subscriptions and display them in the prompt. | |
| 5 | + | |
| 6 | +To use it, add `azure` to the plugins array in your zshrc file. | |
| 7 | + | |
| 8 | +```zsh | |
| 9 | +plugins=(... azure) | |
| 10 | +``` | |
| 11 | + | |
| 12 | +## Plugin commands | |
| 13 | + | |
| 14 | + | |
| 15 | +* `az_subscriptions`: lists the available subscriptions in the `AZURE_CONFIG_DIR` (default: `~/.azure/`). | |
| 16 | + Used to provide completion for the `azss` function. | |
| 17 | + | |
| 18 | +* `azgs`: gets the current value of `$azure_subscription`. | |
| 19 | + | |
| 20 | +* `azss [<subscription>]`: sets the `$azure_subscription`. | |
| 21 | + | |
| 22 | + | |
| 23 | +NOTE : because azure keeps the state of active subscription in ${AZURE_CONFIG_DIR:-$HOME/.azure/azureProfile.json}, the prompt command requires `jq` to be enabled to parse the file. If jq is not in the path the prompt will show nothing | |
| 24 | + | |
| 25 | +## Theme | |
| 26 | + | |
| 27 | +The plugin creates an `azure_prompt_info` function that you can use in your theme, which displays | |
| 28 | +the current `$azure_subscription`. It uses two variables to control how that is shown: | |
| 29 | + | |
| 30 | +- ZSH_THEME_AZURE_PREFIX: sets the prefix of the azure_subscription. Defaults to `<az:`. | |
| 31 | + | |
| 32 | +- ZSH_THEME_azure_SUFFIX: sets the suffix of the azure_subscription. Defaults to `>`. | |
| 33 | + | |
| 34 | + | |
| 35 | +``` | |
| 36 | +RPROMPT='$(azure_prompt_info)' | |
| 37 | +``` | |
| 38 | + | |
| 39 | +## Develop | |
| 40 | + | |
| 41 | +On ubuntu get a working environment with : | |
| 42 | + | |
| 43 | +` docker run -it -v $(pwd):/mnt -w /mnt ubuntu bash` | |
| 44 | + | |
| 45 | +``` | |
| 46 | +apt install -y curl jq zsh git vim | |
| 47 | +sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" | |
| 48 | +curl -sL https://aka.ms/InstallAzureCLIDeb | bash | |
| 49 | +``` |
+60-0.oh-my-zsh/plugins/azure/azure.plugin.zsh
| @@ -0,0 +1,60 @@ | ||
| 1 | +# AZ Get Subscriptions | |
| 2 | +function azgs() { | |
| 3 | + az account show --output tsv --query 'name' 2>/dev/null | |
| 4 | +} | |
| 5 | + | |
| 6 | +# AZ Subscription Selection | |
| 7 | +alias azss="az account set --subscription" | |
| 8 | + | |
| 9 | + | |
| 10 | +function az_subscriptions() { | |
| 11 | + az account list --all --output tsv --query '[*].name' 2> /dev/null | |
| 12 | +} | |
| 13 | + | |
| 14 | +function _az_subscriptions() { | |
| 15 | + reply=($(az_subscriptions)) | |
| 16 | +} | |
| 17 | +compctl -K _az_subscriptions azss | |
| 18 | + | |
| 19 | +# Azure prompt | |
| 20 | +function azure_prompt_info() { | |
| 21 | + [[ ! -f "${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json" ]] && return | |
| 22 | + # azgs is too expensive, if we have jq, we enable the prompt | |
| 23 | + (( $+commands[jq] )) || return 1 | |
| 24 | + azgs=$(jq -r '.subscriptions[] | select(.isDefault==true) .name' "${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json") | |
| 25 | + echo "${ZSH_THEME_AZURE_PREFIX:=<az:}${azgs}${ZSH_THEME_AZURE_SUFFIX:=>}" | |
| 26 | +} | |
| 27 | + | |
| 28 | + | |
| 29 | +# Load az completions | |
| 30 | +function _az-homebrew-installed() { | |
| 31 | + # check if Homebrew is installed | |
| 32 | + (( $+commands[brew] )) || return 1 | |
| 33 | + | |
| 34 | + # if so, we assume it's default way to install brew | |
| 35 | + if [[ ${commands[brew]:t2} == bin/brew ]]; then | |
| 36 | + _brew_prefix="${commands[brew]:h:h}" # remove trailing /bin/brew | |
| 37 | + else | |
| 38 | + # ok, it is not in the default prefix | |
| 39 | + # this call to brew is expensive (about 400 ms), so at least let's make it only once | |
| 40 | + _brew_prefix=$(brew --prefix) | |
| 41 | + fi | |
| 42 | +} | |
| 43 | + | |
| 44 | + | |
| 45 | +# get az.completion.sh location from $PATH | |
| 46 | +_az_zsh_completer_path="$commands[az_zsh_completer.sh]" | |
| 47 | + | |
| 48 | +# otherwise check common locations | |
| 49 | +if [[ -z $_az_zsh_completer_path ]]; then | |
| 50 | + # Homebrew | |
| 51 | + if _az-homebrew-installed; then | |
| 52 | + _az_zsh_completer_path=$_brew_prefix/etc/bash_completion.d/az | |
| 53 | + # Linux | |
| 54 | + else | |
| 55 | + _az_zsh_completer_path=/etc/bash_completion.d/azure-cli | |
| 56 | + fi | |
| 57 | +fi | |
| 58 | + | |
| 59 | +[[ -r $_az_zsh_completer_path ]] && autoload -U +X bashcompinit && bashcompinit && source $_az_zsh_completer_path | |
| 60 | +unset _az_zsh_completer_path _brew_prefix |
+36-0.oh-my-zsh/plugins/battery/README.md
| @@ -0,0 +1,36 @@ | ||
| 1 | +# Battery Plugin | |
| 2 | + | |
| 3 | +This plugin adds some functions you can use to display battery information in your custom theme. | |
| 4 | + | |
| 5 | +To use, add `battery` to the list of plugins in your `.zshrc` file: | |
| 6 | + | |
| 7 | +`plugins=(... battery)` | |
| 8 | + | |
| 9 | +Then, add the `battery_pct_prompt` function to your custom theme. For example: | |
| 10 | + | |
| 11 | +```zsh | |
| 12 | +RPROMPT='$(battery_pct_prompt) ...' | |
| 13 | +``` | |
| 14 | + | |
| 15 | +Also, you set the `BATTERY_CHARGING` variable to your favor. | |
| 16 | +For example: | |
| 17 | + | |
| 18 | +```zsh | |
| 19 | +BATTERY_CHARGING="โก๏ธ" | |
| 20 | +``` | |
| 21 | + | |
| 22 | +## Requirements | |
| 23 | + | |
| 24 | +- On Linux, you must have the `acpi` or `acpitool` commands installed on your operating system. | |
| 25 | + On Debian/Ubuntu, you can do that with `sudo apt install acpi` or `sudo apt install acpitool`. | |
| 26 | + | |
| 27 | +- On Android (via [Termux](https://play.google.com/store/apps/details?id=com.termux)), you must have: | |
| 28 | + | |
| 29 | + 1. The `Termux:API` addon app installed: | |
| 30 | + [Google Play](https://play.google.com/store/apps/details?id=com.termux.api) | [F-Droid](https://f-droid.org/packages/com.termux.api/) | |
| 31 | + | |
| 32 | + 2. The `termux-api` package installed within termux: | |
| 33 | + | |
| 34 | + ```sh | |
| 35 | + pkg install termux-api | |
| 36 | + ``` |
+306-0.oh-my-zsh/plugins/battery/battery.plugin.zsh
| @@ -0,0 +1,306 @@ | ||
| 1 | +########################################### | |
| 2 | +# Battery plugin for oh-my-zsh # | |
| 3 | +# Original Author: Peter hoeg (peterhoeg) # | |
| 4 | +# Email: peter@speartail.com # | |
| 5 | +########################################### | |
| 6 | +# Author: Sean Jones (neuralsandwich) # | |
| 7 | +# Email: neuralsandwich@gmail.com # | |
| 8 | +# Modified to add support for Apple Mac # | |
| 9 | +########################################### | |
| 10 | +# Author: J (927589452) # | |
| 11 | +# Modified to add support for FreeBSD # | |
| 12 | +########################################### | |
| 13 | +# Author: Avneet Singh (kalsi-avneet) # | |
| 14 | +# Modified to add support for Android # | |
| 15 | +########################################### | |
| 16 | +# Author: Not Pua (im-notpua) # | |
| 17 | +# Modified to add support for OpenBSD # | |
| 18 | +########################################### | |
| 19 | + | |
| 20 | + | |
| 21 | +if [[ "$OSTYPE" = darwin* ]]; then | |
| 22 | + function battery_is_charging() { | |
| 23 | + ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ Yes' | |
| 24 | + } | |
| 25 | + function battery_pct() { | |
| 26 | + pmset -g batt | grep -Eo "\d+%" | cut -d% -f1 | |
| 27 | + } | |
| 28 | + function battery_pct_remaining() { | |
| 29 | + if battery_is_charging; then | |
| 30 | + echo "External Power" | |
| 31 | + else | |
| 32 | + battery_pct | |
| 33 | + fi | |
| 34 | + } | |
| 35 | + function battery_time_remaining() { | |
| 36 | + local smart_battery_status="$(ioreg -rc "AppleSmartBattery")" | |
| 37 | + if [[ $(echo $smart_battery_status | command grep -c '^.*"ExternalConnected"\ =\ No') -eq 1 ]]; then | |
| 38 | + timeremaining=$(echo $smart_battery_status | command grep '^.*"AvgTimeToEmpty"\ =\ ' | sed -e 's/^.*"AvgTimeToEmpty"\ =\ //') | |
| 39 | + if [ $timeremaining -gt 720 ]; then | |
| 40 | + echo "::" | |
| 41 | + else | |
| 42 | + echo "~$((timeremaining / 60)):$((timeremaining % 60))" | |
| 43 | + fi | |
| 44 | + else | |
| 45 | + echo "โ" | |
| 46 | + fi | |
| 47 | + } | |
| 48 | + function battery_pct_prompt () { | |
| 49 | + local battery_pct color | |
| 50 | + if ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ No'; then | |
| 51 | + battery_pct=$(battery_pct_remaining) | |
| 52 | + if [[ $battery_pct -gt 50 ]]; then | |
| 53 | + color='green' | |
| 54 | + elif [[ $battery_pct -gt 20 ]]; then | |
| 55 | + color='yellow' | |
| 56 | + else | |
| 57 | + color='red' | |
| 58 | + fi | |
| 59 | + echo "%{$fg[$color]%}[${battery_pct}%%]%{$reset_color%}" | |
| 60 | + else | |
| 61 | + echo "${BATTERY_CHARGING-โก๏ธ}" | |
| 62 | + fi | |
| 63 | + } | |
| 64 | + | |
| 65 | +elif [[ "$OSTYPE" = freebsd* ]]; then | |
| 66 | + function battery_is_charging() { | |
| 67 | + [[ $(sysctl -n hw.acpi.battery.state) -eq 2 ]] | |
| 68 | + } | |
| 69 | + function battery_pct() { | |
| 70 | + if (( $+commands[sysctl] )); then | |
| 71 | + sysctl -n hw.acpi.battery.life | |
| 72 | + fi | |
| 73 | + } | |
| 74 | + function battery_pct_remaining() { | |
| 75 | + if ! battery_is_charging; then | |
| 76 | + battery_pct | |
| 77 | + else | |
| 78 | + echo "External Power" | |
| 79 | + fi | |
| 80 | + } | |
| 81 | + function battery_time_remaining() { | |
| 82 | + local remaining_time | |
| 83 | + remaining_time=$(sysctl -n hw.acpi.battery.time) | |
| 84 | + if [[ $remaining_time -ge 0 ]]; then | |
| 85 | + ((hour = $remaining_time / 60 )) | |
| 86 | + ((minute = $remaining_time % 60 )) | |
| 87 | + printf %02d:%02d $hour $minute | |
| 88 | + fi | |
| 89 | + } | |
| 90 | + function battery_pct_prompt() { | |
| 91 | + local battery_pct color | |
| 92 | + battery_pct=$(battery_pct_remaining) | |
| 93 | + if battery_is_charging; then | |
| 94 | + echo "โ" | |
| 95 | + else | |
| 96 | + if [[ $battery_pct -gt 50 ]]; then | |
| 97 | + color='green' | |
| 98 | + elif [[ $battery_pct -gt 20 ]]; then | |
| 99 | + color='yellow' | |
| 100 | + else | |
| 101 | + color='red' | |
| 102 | + fi | |
| 103 | + echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}" | |
| 104 | + fi | |
| 105 | + } | |
| 106 | +elif [[ "$OSTYPE" = linux-android ]] && (( ${+commands[termux-battery-status]} )); then | |
| 107 | + function battery_is_charging() { | |
| 108 | + termux-battery-status 2>/dev/null | command awk '/status/ { exit ($0 ~ /DISCHARGING/) }' | |
| 109 | + } | |
| 110 | + function battery_pct() { | |
| 111 | + # Sample output: | |
| 112 | + # { | |
| 113 | + # "health": "GOOD", | |
| 114 | + # "percentage": 93, | |
| 115 | + # "plugged": "UNPLUGGED", | |
| 116 | + # "status": "DISCHARGING", | |
| 117 | + # "temperature": 29.0, | |
| 118 | + # "current": 361816 | |
| 119 | + # } | |
| 120 | + termux-battery-status 2>/dev/null | command awk '/percentage/ { gsub(/[,]/,""); print $2}' | |
| 121 | + } | |
| 122 | + function battery_pct_remaining() { | |
| 123 | + if ! battery_is_charging; then | |
| 124 | + battery_pct | |
| 125 | + else | |
| 126 | + echo "External Power" | |
| 127 | + fi | |
| 128 | + } | |
| 129 | + function battery_time_remaining() { } # Not available on android | |
| 130 | + function battery_pct_prompt() { | |
| 131 | + local battery_pct color | |
| 132 | + battery_pct=$(battery_pct_remaining) | |
| 133 | + if battery_is_charging; then | |
| 134 | + echo "โ" | |
| 135 | + else | |
| 136 | + if [[ $battery_pct -gt 50 ]]; then | |
| 137 | + color='green' | |
| 138 | + elif [[ $battery_pct -gt 20 ]]; then | |
| 139 | + color='yellow' | |
| 140 | + else | |
| 141 | + color='red' | |
| 142 | + fi | |
| 143 | + echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}" | |
| 144 | + fi | |
| 145 | + } | |
| 146 | +elif [[ "$OSTYPE" = openbsd* ]]; then | |
| 147 | + function battery_is_charging() { | |
| 148 | + [[ $(apm -b) -eq 3 ]] | |
| 149 | + } | |
| 150 | + function battery_pct() { | |
| 151 | + apm -l | |
| 152 | + } | |
| 153 | + function battery_pct_remaining() { | |
| 154 | + if ! battery_is_charging; then | |
| 155 | + battery_pct | |
| 156 | + else | |
| 157 | + echo "External Power" | |
| 158 | + fi | |
| 159 | + } | |
| 160 | + function battery_time_remaining() { | |
| 161 | + local remaining_time | |
| 162 | + remaining_time=$(apm -m) | |
| 163 | + if [[ $remaining_time -ge 0 ]]; then | |
| 164 | + ((hour = $remaining_time / 60 )) | |
| 165 | + ((minute = $remaining_time % 60 )) | |
| 166 | + printf %02d:%02d $hour $minute | |
| 167 | + fi | |
| 168 | + } | |
| 169 | + function battery_pct_prompt() { | |
| 170 | + local battery_pct color | |
| 171 | + battery_pct=$(battery_pct_remaining) | |
| 172 | + if battery_is_charging; then | |
| 173 | + echo "โ" | |
| 174 | + else | |
| 175 | + if [[ $battery_pct -gt 50 ]]; then | |
| 176 | + color='green' | |
| 177 | + elif [[ $battery_pct -gt 20 ]]; then | |
| 178 | + color='yellow' | |
| 179 | + else | |
| 180 | + color='red' | |
| 181 | + fi | |
| 182 | + echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}" | |
| 183 | + fi | |
| 184 | + } | |
| 185 | + | |
| 186 | +elif [[ "$OSTYPE" = linux* ]]; then | |
| 187 | + function battery_is_charging() { | |
| 188 | + if (( $+commands[acpitool] )); then | |
| 189 | + ! acpitool 2>/dev/null | command grep -qE '^\s+Battery.*Discharging' | |
| 190 | + elif (( $+commands[acpi] )); then | |
| 191 | + ! acpi 2>/dev/null | command grep -v "rate information unavailable" | command grep -q '^Battery.*Discharging' | |
| 192 | + fi | |
| 193 | + } | |
| 194 | + function battery_pct() { | |
| 195 | + if (( $+commands[acpitool] )); then | |
| 196 | + # Sample output: | |
| 197 | + # Battery #1 : Unknown, 99.55% | |
| 198 | + # Battery #2 : Discharging, 49.58%, 01:12:05 | |
| 199 | + # All batteries : 62.60%, 02:03:03 | |
| 200 | + local -i pct=$(acpitool 2>/dev/null | command awk -F, ' | |
| 201 | + /^\s+All batteries/ { | |
| 202 | + gsub(/[^0-9.]/, "", $1) | |
| 203 | + pct=$1 | |
| 204 | + exit | |
| 205 | + } | |
| 206 | + !pct && /^\s+Battery/ { | |
| 207 | + gsub(/[^0-9.]/, "", $2) | |
| 208 | + pct=$2 | |
| 209 | + } | |
| 210 | + END { print pct } | |
| 211 | + ') | |
| 212 | + echo $pct | |
| 213 | + elif (( $+commands[acpi] )); then | |
| 214 | + # Sample output: | |
| 215 | + # Battery 0: Discharging, 0%, rate information unavailable | |
| 216 | + # Battery 1: Full, 100% | |
| 217 | + acpi 2>/dev/null | command awk -F, ' | |
| 218 | + /rate information unavailable/ { next } | |
| 219 | + /^Battery.*: /{ gsub(/[^0-9]/, "", $2); print $2; exit } | |
| 220 | + ' | |
| 221 | + fi | |
| 222 | + } | |
| 223 | + function battery_pct_remaining() { | |
| 224 | + if ! battery_is_charging; then | |
| 225 | + battery_pct | |
| 226 | + else | |
| 227 | + echo "External Power" | |
| 228 | + fi | |
| 229 | + } | |
| 230 | + function battery_time_remaining() { | |
| 231 | + if ! battery_is_charging; then | |
| 232 | + acpi 2>/dev/null | command grep -v "rate information unavailable" | cut -f3 -d ',' | |
| 233 | + fi | |
| 234 | + } | |
| 235 | + function battery_pct_prompt() { | |
| 236 | + local battery_pct color | |
| 237 | + battery_pct=$(battery_pct_remaining) | |
| 238 | + if battery_is_charging; then | |
| 239 | + echo "โ" | |
| 240 | + else | |
| 241 | + if [[ $battery_pct -gt 50 ]]; then | |
| 242 | + color='green' | |
| 243 | + elif [[ $battery_pct -gt 20 ]]; then | |
| 244 | + color='yellow' | |
| 245 | + else | |
| 246 | + color='red' | |
| 247 | + fi | |
| 248 | + echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}" | |
| 249 | + fi | |
| 250 | + } | |
| 251 | +else | |
| 252 | + # Empty functions so we don't cause errors in prompts | |
| 253 | + function battery_is_charging { false } | |
| 254 | + function battery_pct \ | |
| 255 | + battery_pct_remaining \ | |
| 256 | + battery_time_remaining \ | |
| 257 | + battery_pct_prompt { } | |
| 258 | +fi | |
| 259 | + | |
| 260 | +function battery_level_gauge() { | |
| 261 | + local gauge_slots=${BATTERY_GAUGE_SLOTS:-10} | |
| 262 | + local green_threshold=${BATTERY_GREEN_THRESHOLD:-$(( gauge_slots * 0.6 ))} | |
| 263 | + local yellow_threshold=${BATTERY_YELLOW_THRESHOLD:-$(( gauge_slots * 0.4 ))} | |
| 264 | + local color_green=${BATTERY_COLOR_GREEN:-%F{green}} | |
| 265 | + local color_yellow=${BATTERY_COLOR_YELLOW:-%F{yellow}} | |
| 266 | + local color_red=${BATTERY_COLOR_RED:-%F{red}} | |
| 267 | + local color_reset=${BATTERY_COLOR_RESET:-%{%f%k%b%}} | |
| 268 | + local battery_prefix=${BATTERY_GAUGE_PREFIX:-'['} | |
| 269 | + local battery_suffix=${BATTERY_GAUGE_SUFFIX:-']'} | |
| 270 | + local filled_symbol=${BATTERY_GAUGE_FILLED_SYMBOL:-'โถ'} | |
| 271 | + local empty_symbol=${BATTERY_GAUGE_EMPTY_SYMBOL:-'โท'} | |
| 272 | + local charging_color=${BATTERY_CHARGING_COLOR:-$color_yellow} | |
| 273 | + local charging_symbol=${BATTERY_CHARGING_SYMBOL:-'โก'} | |
| 274 | + | |
| 275 | + local -i battery_remaining_percentage=$(battery_pct) | |
| 276 | + local filled empty gauge_color | |
| 277 | + | |
| 278 | + if [[ $battery_remaining_percentage =~ [0-9]+ ]]; then | |
| 279 | + filled=$(( ($battery_remaining_percentage * $gauge_slots) / 100 )) | |
| 280 | + empty=$(( $gauge_slots - $filled )) | |
| 281 | + | |
| 282 | + if [[ $filled -gt $green_threshold ]]; then | |
| 283 | + gauge_color=$color_green | |
| 284 | + elif [[ $filled -gt $yellow_threshold ]]; then | |
| 285 | + gauge_color=$color_yellow | |
| 286 | + else | |
| 287 | + gauge_color=$color_red | |
| 288 | + fi | |
| 289 | + else | |
| 290 | + filled=$gauge_slots | |
| 291 | + empty=0 | |
| 292 | + filled_symbol=${BATTERY_UNKNOWN_SYMBOL:-'.'} | |
| 293 | + fi | |
| 294 | + | |
| 295 | + local charging=' ' | |
| 296 | + battery_is_charging && charging=$charging_symbol | |
| 297 | + | |
| 298 | + # Charging status and prefix | |
| 299 | + print -n ${charging_color}${charging}${color_reset}${battery_prefix}${gauge_color} | |
| 300 | + # Filled slots | |
| 301 | + [[ $filled -gt 0 ]] && printf ${filled_symbol//\%/\%\%}'%.0s' {1..$filled} | |
| 302 | + # Empty slots | |
| 303 | + [[ $filled -lt $gauge_slots ]] && printf ${empty_symbol//\%/\%\%}'%.0s' {1..$empty} | |
| 304 | + # Suffix | |
| 305 | + print -n ${color_reset}${battery_suffix}${color_reset} | |
| 306 | +} |
+29-0.oh-my-zsh/plugins/bazel/README.md
| @@ -0,0 +1,29 @@ | ||
| 1 | +# Bazel plugin | |
| 2 | + | |
| 3 | +This plugin adds completion and aliases for [bazel](https://bazel.build), an open-source build and test tool | |
| 4 | +that scalably supports multi-language and multi-platform projects. | |
| 5 | + | |
| 6 | +To use it, add `bazel` to the plugins array in your zshrc file: | |
| 7 | + | |
| 8 | +```zsh | |
| 9 | +plugins=(... bazel) | |
| 10 | +``` | |
| 11 | + | |
| 12 | +The plugin has a copy of [the completion script from the git repository][1]. | |
| 13 | + | |
| 14 | +[1]: https://github.com/bazelbuild/bazel/blob/master/scripts/zsh_completion/_bazel | |
| 15 | + | |
| 16 | +## Aliases | |
| 17 | + | |
| 18 | +| Alias | Command | Description | | |
| 19 | +| ----- | ------------- | ------------------------- | | |
| 20 | +| bzb | `bazel build` | The `bazel build` command | | |
| 21 | +| bzt | `bazel test` | The `bazel test` command | | |
| 22 | +| bzr | `bazel run` | The `bazel run` command | | |
| 23 | +| bzq | `bazel query` | The `bazel query` command | | |
| 24 | + | |
| 25 | +## Functions | |
| 26 | + | |
| 27 | +| Function | Description | | |
| 28 | +| -------- | -------------------------------- | | |
| 29 | +| sri-hash | Generate SRI hash used by bzlmod | |
+341-0.oh-my-zsh/plugins/bazel/_bazel
| @@ -0,0 +1,341 @@ | ||
| 1 | +#compdef bazel bazelisk | |
| 2 | + | |
| 3 | +# Copyright 2015 The Bazel Authors. All rights reserved. | |
| 4 | +# | |
| 5 | +# Licensed under the Apache License, Version 2.0 (the "License"); | |
| 6 | +# you may not use this file except in compliance with the License. | |
| 7 | +# You may obtain a copy of the License at | |
| 8 | +# | |
| 9 | +# http://www.apache.org/licenses/LICENSE-2.0 | |
| 10 | +# | |
| 11 | +# Unless required by applicable law or agreed to in writing, software | |
| 12 | +# distributed under the License is distributed on an "AS IS" BASIS, | |
| 13 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 14 | +# See the License for the specific language governing permissions and | |
| 15 | +# limitations under the License. | |
| 16 | + | |
| 17 | +# Installation | |
| 18 | +# ------------ | |
| 19 | +# | |
| 20 | +# 1. Add this script to a directory on your $fpath: | |
| 21 | +# fpath[1,0]=~/.zsh/completion/ | |
| 22 | +# mkdir -p ~/.zsh/completion/ | |
| 23 | +# cp scripts/zsh_completion/_bazel ~/.zsh/completion | |
| 24 | +# | |
| 25 | +# 2. Optionally, add the following to your .zshrc. | |
| 26 | +# zstyle ':completion:*' use-cache on | |
| 27 | +# zstyle ':completion:*' cache-path ~/.zsh/cache | |
| 28 | +# | |
| 29 | +# This way, the completion script does not have to parse Bazel's options | |
| 30 | +# repeatedly. The directory in cache-path must be created manually. | |
| 31 | +# | |
| 32 | +# 3. Restart the shell | |
| 33 | +# | |
| 34 | +# Options | |
| 35 | +# ------- | |
| 36 | +# completion:init:bazel:* cache-lifetime | |
| 37 | +# Lifetime for the completion cache (if turned on, default: 1 week) | |
| 38 | + | |
| 39 | +local curcontext="$curcontext" state line | |
| 40 | + | |
| 41 | +: ${BAZEL_COMPLETION_PACKAGE_PATH:=%workspace%} | |
| 42 | +: ${BAZEL:=bazel} | |
| 43 | +_bazel_b() { ${BAZEL} --noblock_for_lock "$@" 2>/dev/null; } | |
| 44 | + | |
| 45 | +# Default cache lifetime is 1 week | |
| 46 | +zstyle -s ":completion:${curcontext}:" cache-lifetime lifetime | |
| 47 | +if [[ -z "${lifetime}" ]]; then | |
| 48 | + lifetime=$((60*60*24*7)) | |
| 49 | +fi | |
| 50 | + | |
| 51 | +_bazel_cache_policy() { | |
| 52 | + local -a oldp | |
| 53 | + oldp=( "$1"(Nms+${lifetime}) ) | |
| 54 | + (( $#oldp )) | |
| 55 | +} | |
| 56 | + | |
| 57 | +_set_cache_policy() { | |
| 58 | + zstyle -s ":completion:*:$curcontext*" cache-policy update_policy | |
| 59 | + | |
| 60 | + if [[ -z "$update_policy" ]]; then | |
| 61 | + zstyle ":completion:$curcontext*" cache-policy _bazel_cache_policy | |
| 62 | + fi | |
| 63 | +} | |
| 64 | + | |
| 65 | +# Skips over all global arguments. After invocation, OFFSET contains the | |
| 66 | +# position of the bazel command in $words. | |
| 67 | +_adapt_subcommand_offset() { | |
| 68 | + OFFSET=2 | |
| 69 | + for w in ${words[2,-1]}; do | |
| 70 | + if [[ $w == (#b)-* ]]; then | |
| 71 | + (( OFFSET++ )) | |
| 72 | + else | |
| 73 | + return | |
| 74 | + fi | |
| 75 | + done | |
| 76 | +} | |
| 77 | + | |
| 78 | +# Retrieve the cache but also check that the value is not empty. | |
| 79 | +_bazel_safe_retrieve_cache() { | |
| 80 | + _retrieve_cache $1 && [[ ${(P)#2} -gt 0 ]] | |
| 81 | +} | |
| 82 | + | |
| 83 | +# Puts the name of the variable that contains the options for the bazel | |
| 84 | +# subcommand handed in as the first argument into the global variable | |
| 85 | +# _bazel_cmd_options. | |
| 86 | +_bazel_get_options() { | |
| 87 | + local lcmd=$1 | |
| 88 | + _bazel_cmd_options=_bazel_${lcmd}_options | |
| 89 | + _bazel_cmd_args=_bazel_${lcmd}_args | |
| 90 | + if [[ ${(P)#_bazel_cmd_options} != 0 ]]; then | |
| 91 | + return | |
| 92 | + fi | |
| 93 | + if _cache_invalid BAZEL_${lcmd}_options || _cache_invalid BAZEL_${lcmd}_args \ | |
| 94 | + || ! _bazel_safe_retrieve_cache BAZEL_${lcmd}_options ${_bazel_cmd_options} \ | |
| 95 | + || ! _retrieve_cache BAZEL_${lcmd}_args ${_bazel_cmd_args}; then | |
| 96 | + if ! eval "$(_bazel_b help completion)"; then | |
| 97 | + return | |
| 98 | + fi | |
| 99 | + local opts_var | |
| 100 | + if [[ $lcmd == "startup_options" ]]; then | |
| 101 | + opts_var="BAZEL_STARTUP_OPTIONS" | |
| 102 | + else | |
| 103 | + opts_var="BAZEL_COMMAND_${lcmd:u}_FLAGS" | |
| 104 | + fi | |
| 105 | + local -a raw_options | |
| 106 | + if ! eval "raw_options=(\${(@f)$opts_var})"; then | |
| 107 | + return | |
| 108 | + fi | |
| 109 | + | |
| 110 | + local -a option_list | |
| 111 | + for opt in $raw_options; do | |
| 112 | + case $opt in | |
| 113 | + --*"={"*) | |
| 114 | + local lst="${${opt##*"={"}%"}"}" | |
| 115 | + local opt="${opt%%=*}=" | |
| 116 | + option_list+=("${opt}:string:_values '' ${lst//,/ }") ;; | |
| 117 | + --*=path) | |
| 118 | + option_list+=("${opt%path}:path:_files") ;; | |
| 119 | + --*=label) | |
| 120 | + option_list+=("${opt%label}:target:_bazel_complete_target") ;; | |
| 121 | + --*=*) | |
| 122 | + option_list+=("${opt}:string:") ;; | |
| 123 | + *) | |
| 124 | + option_list+=("$opt") ;; | |
| 125 | + esac | |
| 126 | + done | |
| 127 | + | |
| 128 | + local -a cmd_args | |
| 129 | + local cmd_type | |
| 130 | + if eval "cmd_type=\${BAZEL_COMMAND_${lcmd:u}_ARGUMENT}" && [[ -n $cmd_type ]]; then | |
| 131 | + case $cmd_type in | |
| 132 | + label|label-*) | |
| 133 | + cmd_args+=("*::${cmd_type}:_bazel_complete_target_${cmd_type//-/_}") ;; | |
| 134 | + info-key) | |
| 135 | + cmd_args+=('1::key:_bazel_info_key') ;; | |
| 136 | + path) | |
| 137 | + cmd_args+=('1::profile:_path_files') ;; | |
| 138 | + "command|{"*"}") | |
| 139 | + local lst=${${cmd_type#"command|{"}%"}"} | |
| 140 | + cmd_args+=("1::topic:_bazel_help_topic -- ${lst//,/ }") ;; | |
| 141 | + esac | |
| 142 | + fi | |
| 143 | + | |
| 144 | + typeset -g "${_bazel_cmd_options}"="${(pj:|:)option_list[*]}" | |
| 145 | + _store_cache BAZEL_${lcmd}_options ${_bazel_cmd_options} | |
| 146 | + typeset -g "${_bazel_cmd_args}"="${(pj:|:)cmd_args[*]}" | |
| 147 | + _store_cache BAZEL_${lcmd}_args ${_bazel_cmd_args} | |
| 148 | + fi | |
| 149 | +} | |
| 150 | + | |
| 151 | +_get_build_targets() { | |
| 152 | + local pkg=$1 | |
| 153 | + local rule_re | |
| 154 | + typeset -a completions | |
| 155 | + case $target_type in | |
| 156 | + test) | |
| 157 | + rule_re=".*_test" | |
| 158 | + ;; | |
| 159 | + build) | |
| 160 | + rule_re=".*" | |
| 161 | + ;; | |
| 162 | + bin) | |
| 163 | + rule_re=".*_test|.*_binary" | |
| 164 | + ;; | |
| 165 | + esac | |
| 166 | + completions=(${$(_bazel_b query "kind(\"${rule_re}\", ${pkg}:all)" 2>/dev/null)##*:}) | |
| 167 | + if ( (( ${#completions} > 0 )) && [[ $target_type != bin ]] ); then | |
| 168 | + completions+=(all) | |
| 169 | + fi | |
| 170 | + echo ${completions[*]} | |
| 171 | +} | |
| 172 | + | |
| 173 | +# Returns all packages that match $PREFIX. PREFIX may start with //, in which | |
| 174 | +# case the workspace roots are searched. Otherwise, they are completed based on | |
| 175 | +# PWD. | |
| 176 | +_get_build_packages() { | |
| 177 | + local workspace pfx | |
| 178 | + typeset -a package_roots paths final_paths | |
| 179 | + workspace=$PWD | |
| 180 | + package_roots=(${(ps.:.)BAZEL_COMPLETION_PACKAGE_PATH}) | |
| 181 | + package_roots=(${^package_roots//\%workspace\%/$workspace}) | |
| 182 | + if [[ "${(e)PREFIX}" == //* ]]; then | |
| 183 | + pfx=${(e)PREFIX[2,-1]} | |
| 184 | + else | |
| 185 | + pfx=${(e)PREFIX} | |
| 186 | + fi | |
| 187 | + paths=(${^package_roots}/${pfx}*(/)) | |
| 188 | + for p in ${paths[*]}; do | |
| 189 | + if [[ -f ${p}/BUILD || -f ${p}/BUILD.bazel ]]; then | |
| 190 | + final_paths+=(${p##*/}:) | |
| 191 | + fi | |
| 192 | + final_paths+=(${p##*/}/) | |
| 193 | + done | |
| 194 | + echo ${final_paths[*]} | |
| 195 | +} | |
| 196 | + | |
| 197 | +_package_remove_slash() { | |
| 198 | + if [[ $KEYS == ':' && $LBUFFER == */ ]]; then | |
| 199 | + LBUFFER=${LBUFFER[1,-2]} | |
| 200 | + fi | |
| 201 | +} | |
| 202 | + | |
| 203 | +# Completion function for BUILD targets, called by the completion system. | |
| 204 | +_bazel_complete_target() { | |
| 205 | + local expl | |
| 206 | + typeset -a packages targets | |
| 207 | + if [[ "${(e)PREFIX}" != *:* ]]; then | |
| 208 | + # There is no : in the prefix, completion can be either | |
| 209 | + # a package or a target, if the cwd is a package itself. | |
| 210 | + if [[ -f $PWD/BUILD || -f $PWD/BUILD.bazel ]]; then | |
| 211 | + targets=($(_get_build_targets "")) | |
| 212 | + _description build_target expl "BUILD target" | |
| 213 | + compadd "${expl[@]}" -a targets | |
| 214 | + fi | |
| 215 | + packages=($(_get_build_packages)) | |
| 216 | + _description build_package expl "BUILD package" | |
| 217 | + # Chop of the leading path segments from the prefix for display. | |
| 218 | + compset -P '*/' | |
| 219 | + compadd -R _package_remove_slash -S '' "${expl[@]}" -a packages | |
| 220 | + else | |
| 221 | + targets=($(_get_build_targets "${${(e)PREFIX}%:*}")) | |
| 222 | + _description build_target expl "BUILD target" | |
| 223 | + # Ignore the current prefix for the upcoming completion, since we only list | |
| 224 | + # the names of the targets, not the full path. | |
| 225 | + compset -P '*:' | |
| 226 | + compadd "${expl[@]}" -a targets | |
| 227 | + fi | |
| 228 | +} | |
| 229 | + | |
| 230 | +_bazel_complete_target_label() { | |
| 231 | + typeset -g target_type=build | |
| 232 | + _bazel_complete_target | |
| 233 | +} | |
| 234 | + | |
| 235 | +_bazel_complete_target_label_test() { | |
| 236 | + typeset -g target_type=test | |
| 237 | + _bazel_complete_target | |
| 238 | +} | |
| 239 | + | |
| 240 | +_bazel_complete_target_label_bin() { | |
| 241 | + typeset -g target_type=bin | |
| 242 | + _bazel_complete_target | |
| 243 | +} | |
| 244 | + | |
| 245 | +### Actual completion commands | |
| 246 | + | |
| 247 | +_bazel() { | |
| 248 | + _adapt_subcommand_offset | |
| 249 | + if (( CURRENT - OFFSET > 0 )); then | |
| 250 | + # Remember the subcommand name, stored globally so we can access it | |
| 251 | + # from any subsequent function | |
| 252 | + cmd=${words[OFFSET]//-/_} | |
| 253 | + | |
| 254 | + # Set the context for the subcommand. | |
| 255 | + curcontext="${curcontext%:*:*}:bazel-$cmd:" | |
| 256 | + _set_cache_policy | |
| 257 | + | |
| 258 | + # Narrow the range of words we are looking at to exclude cmd | |
| 259 | + # name and any leading options | |
| 260 | + (( CURRENT = CURRENT - OFFSET + 1 )) | |
| 261 | + shift $((OFFSET - 1)) words | |
| 262 | + # Run the completion for the subcommand | |
| 263 | + _bazel_get_options $cmd | |
| 264 | + _arguments : \ | |
| 265 | + ${(Pps:|:)_bazel_cmd_options} \ | |
| 266 | + ${(Pps:|:)_bazel_cmd_args} | |
| 267 | + else | |
| 268 | + _set_cache_policy | |
| 269 | + # Start special handling for global options, | |
| 270 | + # which can be retrieved by calling | |
| 271 | + # $ bazel help startup_options | |
| 272 | + _bazel_get_options startup_options | |
| 273 | + _arguments : \ | |
| 274 | + ${(Pps:|:)_bazel_cmd_options} \ | |
| 275 | + "*:commands:_bazel_commands" | |
| 276 | + fi | |
| 277 | + return | |
| 278 | +} | |
| 279 | + | |
| 280 | +_get_commands() { | |
| 281 | + # bazel_cmd_list is a global (g) array (a) | |
| 282 | + typeset -ga _bazel_cmd_list | |
| 283 | + # Use `bazel help` instead of `bazel help completion` to get command | |
| 284 | + # descriptions. | |
| 285 | + if _bazel_cmd_list=("${(@f)$(_bazel_b help | awk ' | |
| 286 | +/Available commands/ { command=1; } | |
| 287 | +/ [-a-z]+[ \t]+.+/ { if (command) { printf "%s:", $1; for (i=2; i<=NF; i++) printf "%s ", $i; print "" } } | |
| 288 | +/^$/ { command=0; }')}"); then | |
| 289 | + _store_cache BAZEL_commands _bazel_cmd_list | |
| 290 | + fi | |
| 291 | +} | |
| 292 | + | |
| 293 | +# Completion function for bazel subcommands, called by the completion system. | |
| 294 | +_bazel_commands() { | |
| 295 | + if [[ ${#_bazel_cmd_list} == 0 ]]; then | |
| 296 | + if _cache_invalid BAZEL_commands \ | |
| 297 | + || ! _bazel_safe_retrieve_cache BAZEL_commands _bazel_cmd_list; then | |
| 298 | + _get_commands | |
| 299 | + fi | |
| 300 | + fi | |
| 301 | + | |
| 302 | + _describe -t bazel-commands 'Bazel command' _bazel_cmd_list | |
| 303 | +} | |
| 304 | + | |
| 305 | +# Completion function for bazel help options, called by the completion system. | |
| 306 | +_bazel_help_topic() { | |
| 307 | + if [[ ${#_bazel_cmd_list} == 0 ]]; then | |
| 308 | + if _cache_invalid BAZEL_commands \ | |
| 309 | + || ! _bazel_safe_retrieve_cache BAZEL_commands _bazel_cmd_list; then | |
| 310 | + _get_commands | |
| 311 | + fi | |
| 312 | + fi | |
| 313 | + | |
| 314 | + while [[ $# -gt 0 ]]; do | |
| 315 | + if [[ $1 == -- ]]; then | |
| 316 | + shift | |
| 317 | + break | |
| 318 | + fi | |
| 319 | + shift | |
| 320 | + done | |
| 321 | + _bazel_help_list=($@) | |
| 322 | + _bazel_help_list+=($_bazel_cmd_list) | |
| 323 | + _describe -t bazel-help 'Help topic' _bazel_help_list | |
| 324 | +} | |
| 325 | + | |
| 326 | +# Completion function for bazel info keys, called by the completion system. | |
| 327 | +_bazel_info_key() { | |
| 328 | + if [[ ${#_bazel_info_keys_list} == 0 ]]; then | |
| 329 | + if _cache_invalid BAZEL_info_keys \ | |
| 330 | + || ! _bazel_safe_retrieve_cache BAZEL_info_keys _bazel_info_keys_list; then | |
| 331 | + typeset -ga _bazel_info_keys_list | |
| 332 | + # Use `bazel help` instead of `bazel help completion` to get info-key | |
| 333 | + # descriptions. | |
| 334 | + if _bazel_info_keys_list=("${(@f)$(_bazel_b help info-keys | awk ' | |
| 335 | + { printf "%s:", $1; for (i=2; i<=NF; i++) printf "%s ", $i; print "" }')}"); then | |
| 336 | + _store_cache BAZEL_info_keys _bazel_info_keys_list | |
| 337 | + fi | |
| 338 | + fi | |
| 339 | + fi | |
| 340 | + _describe -t bazel-info 'Key' _bazel_info_keys_list | |
| 341 | +} |
+9-0.oh-my-zsh/plugins/bazel/bazel.plugin.zsh
| @@ -0,0 +1,9 @@ | ||
| 1 | +# Aliases for bazel | |
| 2 | +alias bzb='bazel build' | |
| 3 | +alias bzt='bazel test' | |
| 4 | +alias bzr='bazel run' | |
| 5 | +alias bzq='bazel query' | |
| 6 | + | |
| 7 | +sri-hash() { | |
| 8 | + openssl dgst -sha256 -binary $1 | openssl base64 -A | sed 's/^/sha256-/' | |
| 9 | +} |
+20-0.oh-my-zsh/plugins/bbedit/README.md
| @@ -0,0 +1,20 @@ | ||
| 1 | +## bbedit | |
| 2 | + | |
| 3 | +Plugin for BBEdit, an HTML and text editor for Mac OS X | |
| 4 | + | |
| 5 | +### Requirements | |
| 6 | + | |
| 7 | + * [BBEdit](https://www.barebones.com/products/bbedit/) | |
| 8 | + * [BBEdit Command-Line Tools](https://www.barebones.com/support/bbedit/cmd-line-tools.html) | |
| 9 | + | |
| 10 | +### Usage | |
| 11 | + | |
| 12 | + * If the `bb` command is called without an argument, launch BBEdit | |
| 13 | + | |
| 14 | + * If `bb` is passed a directory, cd to it and open it in BBEdit | |
| 15 | + | |
| 16 | + * If `bb` is passed a file, open it in BBEdit | |
| 17 | + | |
| 18 | + * If `bbpb` create a new BBEdit document with the contents of the clipboard | |
| 19 | + | |
| 20 | + * If `bbd` alias for BBEdit diff tool |
+21-0.oh-my-zsh/plugins/bbedit/bbedit.plugin.zsh
| @@ -0,0 +1,21 @@ | ||
| 1 | +alias bbpb='pbpaste | bbedit --clean --view-top' | |
| 2 | + | |
| 3 | +alias bbd=bbdiff | |
| 4 | + | |
| 5 | +# | |
| 6 | +# If the bb command is called without an argument, launch BBEdit | |
| 7 | +# If bb is passed a directory, cd to it and open it in BBEdit | |
| 8 | +# If bb is passed a file, open it in BBEdit | |
| 9 | +# | |
| 10 | +function bb() { | |
| 11 | + if [[ -z "$1" ]] | |
| 12 | + then | |
| 13 | + bbedit --launch | |
| 14 | + else | |
| 15 | + bbedit "$1" | |
| 16 | + if [[ -d "$1" ]] | |
| 17 | + then | |
| 18 | + cd "$1" | |
| 19 | + fi | |
| 20 | + fi | |
| 21 | +} |
+5-0.oh-my-zsh/plugins/bedtools/README.md
| @@ -0,0 +1,5 @@ | ||
| 1 | +# Bedtools plugin | |
| 2 | + | |
| 3 | +This plugin adds support for the [bedtools suite](http://bedtools.readthedocs.org/en/latest/): | |
| 4 | + | |
| 5 | +* Adds autocomplete options for all bedtools sub commands. |
+64-0.oh-my-zsh/plugins/bedtools/_bedtools
| @@ -0,0 +1,64 @@ | ||
| 1 | +#compdef bedtools | |
| 2 | +#autoload | |
| 3 | + | |
| 4 | +local curcontext="$curcontext" state line ret=1 | |
| 5 | +local -a _files | |
| 6 | + | |
| 7 | +_arguments -C \ | |
| 8 | + '1: :->cmds' \ | |
| 9 | + '2:: :->args' && ret=0 | |
| 10 | + | |
| 11 | +case $state in | |
| 12 | + cmds) | |
| 13 | + _values "bedtools command" \ | |
| 14 | + "--contact[Feature requests, bugs, mailing lists, etc.]" \ | |
| 15 | + "--help[Print this help menu.]" \ | |
| 16 | + "--version[What version of bedtools are you using?.]" \ | |
| 17 | + "annotate[Annotate coverage of features from multiple files.]" \ | |
| 18 | + "bamtobed[Convert BAM alignments to BED (& other) formats.]" \ | |
| 19 | + "bamtofastq[Convert BAM records to FASTQ records.]" \ | |
| 20 | + "bed12tobed6[Breaks BED12 intervals into discrete BED6 intervals.]" \ | |
| 21 | + "bedpetobam[Convert BEDPE intervals to BAM records.]" \ | |
| 22 | + "bedtobam[Convert intervals to BAM records.]" \ | |
| 23 | + "closest[Find the closest, potentially non-overlapping interval.]" \ | |
| 24 | + "cluster[Cluster (but don't merge) overlapping/nearby intervals.]" \ | |
| 25 | + "complement[Extract intervals _not_ represented by an interval file.]" \ | |
| 26 | + "coverage[Compute the coverage over defined intervals.]" \ | |
| 27 | + "expand[Replicate lines based on lists of values in columns.]" \ | |
| 28 | + "fisher[Calculate Fisher statistic b/w two feature files.]" \ | |
| 29 | + "flank[Create new intervals from the flanks of existing intervals.]" \ | |
| 30 | + "genomecov[Compute the coverage over an entire genome.]" \ | |
| 31 | + "getfasta[Use intervals to extract sequences from a FASTA file.]" \ | |
| 32 | + "groupby[Group by common cols. & summarize oth. cols. (~ SQL "groupBy")]" \ | |
| 33 | + "igv[Create an IGV snapshot batch script.]" \ | |
| 34 | + "intersect[Find overlapping intervals in various ways.]" \ | |
| 35 | + "jaccard[Calculate the Jaccard statistic b/w two sets of intervals.]" \ | |
| 36 | + "links[Create a HTML page of links to UCSC locations.]" \ | |
| 37 | + "makewindows[Make interval "windows" across a genome.]" \ | |
| 38 | + "map[Apply a function to a column for each overlapping interval.]" \ | |
| 39 | + "maskfasta[Use intervals to mask sequences from a FASTA file.]" \ | |
| 40 | + "merge[Combine overlapping/nearby intervals into a single interval.]" \ | |
| 41 | + "multicov[Counts coverage from multiple BAMs at specific intervals.]" \ | |
| 42 | + "multiinter[Identifies common intervals among multiple interval files.]" \ | |
| 43 | + "nuc[Profile the nucleotide content of intervals in a FASTA file.]" \ | |
| 44 | + "overlap[Computes the amount of overlap from two intervals.]" \ | |
| 45 | + "pairtobed[Find pairs that overlap intervals in various ways.]" \ | |
| 46 | + "pairtopair[Find pairs that overlap other pairs in various ways.]" \ | |
| 47 | + "random[Generate random intervals in a genome.]" \ | |
| 48 | + "reldist[Calculate the distribution of relative distances b/w two files.]" \ | |
| 49 | + "sample[Sample random records from file using reservoir sampling.]" \ | |
| 50 | + "shuffle[Randomly redistribute intervals in a genome.]" \ | |
| 51 | + "slop[Adjust the size of intervals.]" \ | |
| 52 | + "sort[Order the intervals in a file.]" \ | |
| 53 | + "subtract[Remove intervals based on overlaps b/w two files.]" \ | |
| 54 | + "tag[Tag BAM alignments based on overlaps with interval files.]" \ | |
| 55 | + "unionbedg[Combines coverage intervals from multiple BEDGRAPH files.]" \ | |
| 56 | + "window[Find overlapping intervals within a window around an interval.]" \ | |
| 57 | + ret=0 | |
| 58 | + ;; | |
| 59 | + *) | |
| 60 | + _files | |
| 61 | + ;; | |
| 62 | +esac | |
| 63 | + | |
| 64 | +return ret |
+64-0.oh-my-zsh/plugins/bgnotify/README.md
| @@ -0,0 +1,64 @@ | ||
| 1 | +# bgnotify zsh plugin | |
| 2 | + | |
| 3 | +cross-platform background notifications for long running commands! Supports OSX and Linux. | |
| 4 | + | |
| 5 | +Standalone homepage: [t413/zsh-background-notify](https://github.com/t413/zsh-background-notify) | |
| 6 | + | |
| 7 | +--- | |
| 8 | + | |
| 9 | +## How to use | |
| 10 | + | |
| 11 | +Just add bgnotify to your plugins list in your `.zshrc` | |
| 12 | + | |
| 13 | +- On OS X you'll need [terminal-notifier](https://github.com/alloy/terminal-notifier) | |
| 14 | + * `brew install terminal-notifier` (or `gem install terminal-notifier`) | |
| 15 | +- On Linux, make sure you have `notify-send` or `kdialog` installed. If you're using Ubuntu you should already be all set! | |
| 16 | +- On Windows you can use [notifu](https://www.paralint.com/projects/notifu/) or the Cygwin Ports libnotify package | |
| 17 | + | |
| 18 | + | |
| 19 | +## Screenshots | |
| 20 | + | |
| 21 | +**Linux** | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | +**OS X** | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | +**Windows** | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | +## Configuration | |
| 35 | + | |
| 36 | +One can configure a few things: | |
| 37 | + | |
| 38 | +- `bgnotify_bell` enabled or disables the terminal bell (default true) | |
| 39 | +- `bgnotify_threshold` sets the notification threshold time (default 6 seconds) | |
| 40 | +- `function bgnotify_formatted` lets you change the notification. You can for instance customize the message and pass in an icon. | |
| 41 | +- `bgnotify_extraargs` appends extra args to notifier (e.g. `-e` for notify-send to create a transient notification) | |
| 42 | + | |
| 43 | +Use these by adding a function definition before the your call to source. Example: | |
| 44 | + | |
| 45 | +```sh | |
| 46 | +bgnotify_bell=false ## disable terminal bell | |
| 47 | +bgnotify_threshold=4 ## set your own notification threshold | |
| 48 | + | |
| 49 | +function bgnotify_formatted { | |
| 50 | + ## $1=exit_status, $2=command, $3=elapsed_time | |
| 51 | + | |
| 52 | + # Humanly readable elapsed time | |
| 53 | + local elapsed="$(( $3 % 60 ))s" | |
| 54 | + (( $3 < 60 )) || elapsed="$((( $3 % 3600) / 60 ))m $elapsed" | |
| 55 | + (( $3 < 3600 )) || elapsed="$(( $3 / 3600 ))h $elapsed" | |
| 56 | + | |
| 57 | + [ $1 -eq 0 ] && title="Holy Smokes Batman" || title="Holy Graf Zeppelin" | |
| 58 | + [ $1 -eq 0 ] && icon="$HOME/icons/success.png" || icon="$HOME/icons/fail.png" | |
| 59 | + bgnotify "$title - took ${elapsed}" "$2" "$icon" | |
| 60 | +} | |
| 61 | + | |
| 62 | +plugins=(git bgnotify) ## add to plugins list | |
| 63 | +source $ZSH/oh-my-zsh.sh ## existing source call | |
| 64 | +``` |
+141-0.oh-my-zsh/plugins/bgnotify/bgnotify.plugin.zsh
| @@ -0,0 +1,141 @@ | ||
| 1 | +#!/usr/bin/env zsh | |
| 2 | + | |
| 3 | +## Setup | |
| 4 | + | |
| 5 | +[[ -o interactive ]] || return # don't load on non-interactive shells | |
| 6 | +[[ -z "$SSH_CLIENT" && -z "$SSH_TTY" ]] || return # don't load on a SSH connection | |
| 7 | + | |
| 8 | +zmodload zsh/datetime # faster than `date` | |
| 9 | + | |
| 10 | + | |
| 11 | +## Zsh Hooks | |
| 12 | + | |
| 13 | +function bgnotify_begin { | |
| 14 | + bgnotify_timestamp=$EPOCHSECONDS | |
| 15 | + bgnotify_lastcmd="${1:-$2}" | |
| 16 | +} | |
| 17 | + | |
| 18 | +function bgnotify_end { | |
| 19 | + { | |
| 20 | + local exit_status=$? | |
| 21 | + local elapsed=$(( EPOCHSECONDS - bgnotify_timestamp )) | |
| 22 | + | |
| 23 | + # check time elapsed | |
| 24 | + [[ $bgnotify_timestamp -gt 0 ]] || return 0 | |
| 25 | + [[ $elapsed -ge $bgnotify_threshold ]] || return 0 | |
| 26 | + | |
| 27 | + # check if Terminal app is not active | |
| 28 | + [[ $(bgnotify_appid) != "$bgnotify_termid" ]] || return 0 | |
| 29 | + | |
| 30 | + bgnotify_formatted "$exit_status" "$bgnotify_lastcmd" "$elapsed" | |
| 31 | + } always { | |
| 32 | + bgnotify_timestamp=0 | |
| 33 | + } | |
| 34 | +} | |
| 35 | + | |
| 36 | +autoload -Uz add-zsh-hook | |
| 37 | +add-zsh-hook preexec bgnotify_begin | |
| 38 | +add-zsh-hook precmd bgnotify_end | |
| 39 | + | |
| 40 | + | |
| 41 | +## Functions | |
| 42 | + | |
| 43 | +# allow custom function override | |
| 44 | +(( ${+functions[bgnotify_formatted]} )) || \ | |
| 45 | +function bgnotify_formatted { | |
| 46 | + local exit_status=$1 | |
| 47 | + local cmd="$2" | |
| 48 | + | |
| 49 | + # humanly readable elapsed time | |
| 50 | + local elapsed="$(( $3 % 60 ))s" | |
| 51 | + (( $3 < 60 )) || elapsed="$((( $3 % 3600) / 60 ))m $elapsed" | |
| 52 | + (( $3 < 3600 )) || elapsed="$(( $3 / 3600 ))h $elapsed" | |
| 53 | + | |
| 54 | + [[ $bgnotify_bell = true ]] && printf '\a' # beep sound | |
| 55 | + if [[ $exit_status -eq 0 ]]; then | |
| 56 | + bgnotify "#win (took $elapsed)" "$cmd" | |
| 57 | + else | |
| 58 | + bgnotify "#fail (took $elapsed)" "$cmd" | |
| 59 | + fi | |
| 60 | +} | |
| 61 | + | |
| 62 | +function bgnotify_appid { | |
| 63 | + if (( ${+commands[osascript]} )); then | |
| 64 | + osascript -e "tell application id \"$(bgnotify_programid)\" to get the {id, frontmost, id of front window, visible of front window}" 2>/dev/null | |
| 65 | + elif [[ -n $WAYLAND_DISPLAY ]] && ([[ -n $SWAYSOCK ]] || [[ -n $I3SOCK ]]) && (( ${+commands[swaymsg]} )); then # wayland+sway | |
| 66 | + local app_id=$(bgnotify_find_sway_appid) | |
| 67 | + [[ -n "$app_id" ]] && echo "$app_id" || echo $EPOCHSECONDS | |
| 68 | + elif [[ -z $WAYLAND_DISPLAY ]] && [[ -n $DISPLAY ]] && (( ${+commands[xprop]} )); then | |
| 69 | + xprop -root _NET_ACTIVE_WINDOW 2>/dev/null | cut -d' ' -f5 | |
| 70 | + else | |
| 71 | + echo $EPOCHSECONDS | |
| 72 | + fi | |
| 73 | +} | |
| 74 | + | |
| 75 | + | |
| 76 | +function bgnotify_find_sway_appid { | |
| 77 | + # output is "app_id,container_id", for example "Alacritty,1694" | |
| 78 | + # see example swaymsg output: https://github.com/ohmyzsh/ohmyzsh/files/13463939/output.json | |
| 79 | + if (( ${+commands[jq]} )); then | |
| 80 | + swaymsg -t get_tree | jq '.. | select(.type?) | select(.focused==true) | {app_id, id} | join(",")' | |
| 81 | + else | |
| 82 | + swaymsg -t get_tree | awk ' | |
| 83 | + BEGIN { Id = ""; Appid = ""; FocusNesting = -1; Nesting = 0 } | |
| 84 | + { | |
| 85 | + # Enter a block | |
| 86 | + if ($0 ~ /.*{$/) Nesting++ | |
| 87 | + | |
| 88 | + # Exit a block. If Nesting is now less than FocusNesting, we have the data we are looking for | |
| 89 | + if ($0 ~ /^[[:blank:]]*}.*/) { Nesting--; if (FocusNesting > 0 && Nesting < FocusNesting) exit 0 } | |
| 90 | + | |
| 91 | + # Save the Id, it is potentially what we are looking for | |
| 92 | + if ($0 ~ /^[[:blank:]]*"id": [0-9]*,?$/) { sub(/^[[:blank:]]*"id": /, ""); sub(/,$/, ""); Id = $0 } | |
| 93 | + | |
| 94 | + # Save the Appid, it is potentially what we are looking for | |
| 95 | + if ($0 ~ /^[[:blank:]]*"app_id": ".*",?$/) { sub(/^[[:blank:]]*"app_id": "/, ""); sub(/",$/, ""); Appid = $0 } | |
| 96 | + | |
| 97 | + # Window is focused, this nesting block contains the Id and Appid we want! | |
| 98 | + if ($0 ~ /^[[:blank:]]*"focused": true,?$/) { FocusNesting = Nesting } | |
| 99 | + } | |
| 100 | + END { | |
| 101 | + if (Appid != "" && Id != "" && FocusNesting != -1) print Appid "," Id | |
| 102 | + else print "" | |
| 103 | + }' | |
| 104 | + fi | |
| 105 | +} | |
| 106 | + | |
| 107 | +function bgnotify_programid { | |
| 108 | + case "$TERM_PROGRAM" in | |
| 109 | + iTerm.app) echo 'com.googlecode.iterm2' ;; | |
| 110 | + Apple_Terminal) echo 'com.apple.terminal' ;; | |
| 111 | + esac | |
| 112 | +} | |
| 113 | + | |
| 114 | +function bgnotify { | |
| 115 | + local title="$1" | |
| 116 | + local message="$2" | |
| 117 | + local icon="$3" | |
| 118 | + if (( ${+commands[terminal-notifier]} )); then # macOS | |
| 119 | + local term_id=$(bgnotify_programid) | |
| 120 | + terminal-notifier -message "$message" -title "$title" ${=icon:+-appIcon "$icon"} ${=term_id:+-activate "$term_id"} ${=bgnotify_extraargs:-} &>/dev/null | |
| 121 | + elif (( ${+commands[growlnotify]} )); then # macOS growl | |
| 122 | + growlnotify -m "$title" "$message" ${=bgnotify_extraargs:-} | |
| 123 | + elif (( ${+commands[notify-send]} )); then | |
| 124 | + notify-send "$title" "$message" ${=icon:+--icon "$icon"} ${=bgnotify_extraargs:-} | |
| 125 | + elif (( ${+commands[kdialog]} )); then # KDE | |
| 126 | + kdialog --title "$title" --passivepopup "$message" 5 ${=bgnotify_extraargs:-} | |
| 127 | + elif (( ${+commands[notifu]} )); then # cygwin | |
| 128 | + notifu /m "$message" /p "$title" ${=icon:+/i "$icon"} ${=bgnotify_extraargs:-} | |
| 129 | + fi | |
| 130 | +} | |
| 131 | + | |
| 132 | +## Defaults | |
| 133 | + | |
| 134 | +# enable terminal bell on notify by default | |
| 135 | +bgnotify_bell=${bgnotify_bell:-true} | |
| 136 | + | |
| 137 | +# notify if command took longer than 5s by default | |
| 138 | +bgnotify_threshold=${bgnotify_threshold:-5} | |
| 139 | + | |
| 140 | +# bgnotify_appid is slow in macOS and the terminal ID won't change, so cache it at startup | |
| 141 | +bgnotify_termid="$(bgnotify_appid)" |
+17-0.oh-my-zsh/plugins/bower/README.md
| @@ -0,0 +1,17 @@ | ||
| 1 | +# Bower plugin | |
| 2 | + | |
| 3 | +This plugin adds completion for [Bower](https://bower.io/) and a few useful aliases for common Bower commands. | |
| 4 | + | |
| 5 | +To use it, add `bower` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... bower) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Aliases | |
| 12 | + | |
| 13 | +| Alias | Command | Description | | |
| 14 | +|-------|-----------------|--------------------------------------------------------| | |
| 15 | +| bi | `bower install` | Installs the project dependencies listed in bower.json | | |
| 16 | +| bl | `bower list` | List local packages and possible updates | | |
| 17 | +| bs | `bower search` | Finds all packages or a specific package. | |
+58-0.oh-my-zsh/plugins/bower/_bower
| @@ -0,0 +1,58 @@ | ||
| 1 | + | |
| 2 | + | |
| 3 | +# Credits to npm's awesome completion utility. | |
| 4 | +# | |
| 5 | +# Bower completion script, based on npm completion script. | |
| 6 | + | |
| 7 | +###-begin-bower-completion-### | |
| 8 | +# | |
| 9 | +# Installation: bower completion >> ~/.bashrc (or ~/.zshrc) | |
| 10 | +# Or, maybe: bower completion > /usr/local/etc/bash_completion.d/bower | |
| 11 | +# | |
| 12 | + | |
| 13 | +COMP_WORDBREAKS=${COMP_WORDBREAKS/=/} | |
| 14 | +COMP_WORDBREAKS=${COMP_WORDBREAKS/@/} | |
| 15 | +export COMP_WORDBREAKS | |
| 16 | + | |
| 17 | +if type complete &>/dev/null; then | |
| 18 | + _bower_completion () { | |
| 19 | + local si="$IFS" | |
| 20 | + IFS=$'\n' COMPREPLY=($(COMP_CWORD="$COMP_CWORD" \ | |
| 21 | + COMP_LINE="$COMP_LINE" \ | |
| 22 | + COMP_POINT="$COMP_POINT" \ | |
| 23 | + bower completion -- "${COMP_WORDS[@]}" \ | |
| 24 | + 2>/dev/null)) || return $? | |
| 25 | + IFS="$si" | |
| 26 | + } | |
| 27 | + complete -F _bower_completion bower | |
| 28 | +elif type compdef &>/dev/null; then | |
| 29 | + _bower_completion() { | |
| 30 | + si=$IFS | |
| 31 | + compadd -- $(COMP_CWORD=$((CURRENT-1)) \ | |
| 32 | + COMP_LINE=$BUFFER \ | |
| 33 | + COMP_POINT=0 \ | |
| 34 | + bower completion -- "${words[@]}" \ | |
| 35 | + 2>/dev/null) | |
| 36 | + IFS=$si | |
| 37 | + } | |
| 38 | + compdef _bower_completion bower | |
| 39 | +elif type compctl &>/dev/null; then | |
| 40 | + _bower_completion () { | |
| 41 | + local cword line point words si | |
| 42 | + read -Ac words | |
| 43 | + read -cn cword | |
| 44 | + let cword-=1 | |
| 45 | + read -l line | |
| 46 | + read -ln point | |
| 47 | + si="$IFS" | |
| 48 | + IFS=$'\n' reply=($(COMP_CWORD="$cword" \ | |
| 49 | + COMP_LINE="$line" \ | |
| 50 | + COMP_POINT="$point" \ | |
| 51 | + bower completion -- "${words[@]}" \ | |
| 52 | + 2>/dev/null)) || return $? | |
| 53 | + IFS="$si" | |
| 54 | + } | |
| 55 | + compctl -K _bower_completion bower | |
| 56 | +fi | |
| 57 | +###-end-bower-completion-### | |
| 58 | + |
+84-0.oh-my-zsh/plugins/bower/bower.plugin.zsh
| @@ -0,0 +1,84 @@ | ||
| 1 | +alias bi="bower install" | |
| 2 | +alias bisd="bower install --save-dev" | |
| 3 | +alias bis="bower install --save" | |
| 4 | +alias bl="bower list" | |
| 5 | +alias bs="bower search" | |
| 6 | + | |
| 7 | +_bower_installed_packages () { | |
| 8 | + bower_package_list=$(bower ls --no-color 2>/dev/null| awk 'NR>3{print p}{p=$0}'| cut -d ' ' -f 2|sed 's/#.*//') | |
| 9 | +} | |
| 10 | +_bower () | |
| 11 | +{ | |
| 12 | + local -a _1st_arguments _no_color _dopts _save_dev _force_latest _production | |
| 13 | + local expl | |
| 14 | + typeset -A opt_args | |
| 15 | + | |
| 16 | + _no_color=('--no-color[Do not print colors (available in all commands)]') | |
| 17 | + | |
| 18 | + _dopts=( | |
| 19 | + '(--save)--save[Save installed packages into the project"s bower.json dependencies]' | |
| 20 | + '(--force)--force[Force fetching remote resources even if a local copy exists on disk]' | |
| 21 | + ) | |
| 22 | + | |
| 23 | + _save_dev=('(--save-dev)--save-dev[Save installed packages into the project"s bower.json devDependencies]') | |
| 24 | + | |
| 25 | + _force_latest=('(--force-latest)--force-latest[Force latest version on conflict]') | |
| 26 | + | |
| 27 | + _production=('(--production)--production[Do not install project devDependencies]') | |
| 28 | + | |
| 29 | + _1st_arguments=( | |
| 30 | + 'cache-clean:Clean the Bower cache, or the specified package caches' \ | |
| 31 | + 'help:Display help information about Bower' \ | |
| 32 | + 'info:Version info and description of a particular package' \ | |
| 33 | + 'init:Interactively create a bower.json file' \ | |
| 34 | + 'install:Install a package locally' \ | |
| 35 | + 'link:Symlink a package folder' \ | |
| 36 | + 'lookup:Look up a package URL by name' \ | |
| 37 | + 'register:Register a package' \ | |
| 38 | + 'search:Search for a package by name' \ | |
| 39 | + 'uninstall:Remove a package' \ | |
| 40 | + 'update:Update a package' \ | |
| 41 | + {ls,list}:'[List all installed packages]' | |
| 42 | + ) | |
| 43 | + _arguments \ | |
| 44 | + $_no_color \ | |
| 45 | + '*:: :->subcmds' && return 0 | |
| 46 | + | |
| 47 | + if (( CURRENT == 1 )); then | |
| 48 | + _describe -t commands "bower subcommand" _1st_arguments | |
| 49 | + return | |
| 50 | + fi | |
| 51 | + | |
| 52 | + case "$words[1]" in | |
| 53 | + install) | |
| 54 | + _arguments \ | |
| 55 | + $_dopts \ | |
| 56 | + $_save_dev \ | |
| 57 | + $_force_latest \ | |
| 58 | + $_no_color \ | |
| 59 | + $_production | |
| 60 | + ;; | |
| 61 | + update) | |
| 62 | + _arguments \ | |
| 63 | + $_dopts \ | |
| 64 | + $_no_color \ | |
| 65 | + $_force_latest | |
| 66 | + _bower_installed_packages | |
| 67 | + compadd "$@" $(echo $bower_package_list) | |
| 68 | + ;; | |
| 69 | + uninstall) | |
| 70 | + _arguments \ | |
| 71 | + $_no_color \ | |
| 72 | + $_dopts | |
| 73 | + _bower_installed_packages | |
| 74 | + compadd "$@" $(echo $bower_package_list) | |
| 75 | + ;; | |
| 76 | + *) | |
| 77 | + _arguments \ | |
| 78 | + $_no_color \ | |
| 79 | + ;; | |
| 80 | + esac | |
| 81 | + | |
| 82 | +} | |
| 83 | + | |
| 84 | +compdef _bower bower |
+49-0.oh-my-zsh/plugins/branch/README.md
| @@ -0,0 +1,49 @@ | ||
| 1 | +# Branch plugin | |
| 2 | + | |
| 3 | +This plugin displays the current Git or Mercurial branch, fast. If in a Mercurial repository, | |
| 4 | +also display the current bookmark, if present. | |
| 5 | + | |
| 6 | +To use it, add `branch` to the plugins array in your zshrc file: | |
| 7 | + | |
| 8 | +```zsh | |
| 9 | +plugins=(... branch) | |
| 10 | +``` | |
| 11 | + | |
| 12 | +## Speed test | |
| 13 | + | |
| 14 | +- `hg branch`: | |
| 15 | + | |
| 16 | + ```console | |
| 17 | + $ time hg branch | |
| 18 | + 0.11s user 0.14s system 70% cpu 0.355 total | |
| 19 | + ``` | |
| 20 | + | |
| 21 | +- branch plugin: | |
| 22 | + | |
| 23 | + ```console | |
| 24 | + $ time zsh /tmp/branch_prompt_info_test.zsh | |
| 25 | + 0.00s user 0.01s system 78% cpu 0.014 total | |
| 26 | + ``` | |
| 27 | + | |
| 28 | +## Usage | |
| 29 | + | |
| 30 | +Copy your theme to `$ZSH_CUSTOM/themes/` and modify it to add `$(branch_prompt_info)` in your prompt. | |
| 31 | +This example is for the `robbyrussell` theme: | |
| 32 | + | |
| 33 | +```diff | |
| 34 | +diff --git a/themes/robbyrussell.zsh-theme b/themes/robbyrussell.zsh-theme | |
| 35 | +index 2fd5f2cd..9d89a464 100644 | |
| 36 | +--- a/themes/robbyrussell.zsh-theme | |
| 37 | ++++ b/themes/robbyrussell.zsh-theme | |
| 38 | +@@ -1,5 +1,5 @@ | |
| 39 | + PROMPT="%(?:%{$fg_bold[green]%}โ :%{$fg_bold[red]%}โ )" | |
| 40 | +-PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)' | |
| 41 | ++PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(branch_prompt_info)' | |
| 42 | + | |
| 43 | + ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}" | |
| 44 | + ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} " | |
| 45 | +``` | |
| 46 | + | |
| 47 | +## Maintainer | |
| 48 | + | |
| 49 | +Victor Torres (<vpaivatorres@gmail.com>) |
+35-0.oh-my-zsh/plugins/branch/branch.plugin.zsh
| @@ -0,0 +1,35 @@ | ||
| 1 | +# Branch: displays the current Git or Mercurial branch fast. | |
| 2 | +# Victor Torres <vpaivatorres@gmail.com> | |
| 3 | +# Oct 2, 2015 | |
| 4 | + | |
| 5 | +function branch_prompt_info() { | |
| 6 | + # Start checking in current working directory | |
| 7 | + local branch="" dir="$PWD" | |
| 8 | + while [[ "$dir" != '/' ]]; do | |
| 9 | + # Found .git directory | |
| 10 | + if [[ -d "${dir}/.git" ]]; then | |
| 11 | + branch="${"$(<"${dir}/.git/HEAD")"##ref: refs/heads/}" | |
| 12 | + echo 'ยฑ' "${branch:gs/%/%%}" | |
| 13 | + return | |
| 14 | + fi | |
| 15 | + | |
| 16 | + # Found .hg directory | |
| 17 | + if [[ -d "${dir}/.hg" ]]; then | |
| 18 | + if [[ -f "${dir}/.hg/branch" ]]; then | |
| 19 | + branch="$(<"${dir}/.hg/branch")" | |
| 20 | + else | |
| 21 | + branch="default" | |
| 22 | + fi | |
| 23 | + | |
| 24 | + if [[ -f "${dir}/.hg/bookmarks.current" ]]; then | |
| 25 | + branch="${branch}/$(<"${dir}/.hg/bookmarks.current")" | |
| 26 | + fi | |
| 27 | + | |
| 28 | + echo 'โฟ' "${branch:gs/%/%%}" | |
| 29 | + return | |
| 30 | + fi | |
| 31 | + | |
| 32 | + # Check parent directory | |
| 33 | + dir="${dir:h}" | |
| 34 | + done | |
| 35 | +} |
+62-0.oh-my-zsh/plugins/brew/README.md
| @@ -0,0 +1,62 @@ | ||
| 1 | +# brew plugin | |
| 2 | + | |
| 3 | +The plugin adds several aliases for common [brew](https://brew.sh) commands. | |
| 4 | + | |
| 5 | +To use it, add `brew` to the plugins array of your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... brew) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Shellenv | |
| 12 | + | |
| 13 | +If `brew` is not found in the PATH, this plugin will attempt to find it in common locations, and execute | |
| 14 | +`brew shellenv` to set the environment appropriately. This plugin will also export | |
| 15 | +`HOMEBREW_PREFIX="$(brew --prefix)"` if not previously defined for convenience. | |
| 16 | + | |
| 17 | +In case you installed `brew` in a non-common location, you can still set `BREW_LOCATION` variable pointing to | |
| 18 | +the `brew` binary before sourcing `oh-my-zsh.sh` and it'll set up the environment. | |
| 19 | + | |
| 20 | +## Aliases | |
| 21 | + | |
| 22 | +| Alias | Command | Description | | |
| 23 | +| -------- | --------------------------------------- | --------------------------------------------------------------------- | | |
| 24 | +| `ba` | `brew autoremove` | Uninstall unnecessary formulae. | | |
| 25 | +| `bci` | `brew info --cask` | Display information about the given cask. | | |
| 26 | +| `bcin` | `brew install --cask` | Install the given cask. | | |
| 27 | +| `bcl` | `brew list --cask` | List installed casks. | | |
| 28 | +| `bcn` | `brew cleanup` | Run cleanup. | | |
| 29 | +| `bco` | `brew outdated --cask` | Report all outdated casks. | | |
| 30 | +| `bcrin` | `brew reinstall --cask` | Reinstall the given cask. | | |
| 31 | +| `bcubc` | `brew upgrade --cask && brew cleanup` | Upgrade outdated casks, then run cleanup. | | |
| 32 | +| `bcubo` | `brew update && brew outdated --cask` | Update Homebrew data, then list outdated casks. | | |
| 33 | +| `bcup` | `brew upgrade --cask` | Upgrade all outdated casks. | | |
| 34 | +| `bfu` | `brew upgrade --formula` | Upgrade only formulae (not casks). | | |
| 35 | +| `bi` | `brew install` | Install a formula. | | |
| 36 | +| `bl` | `brew list` | List all installed formulae. | | |
| 37 | +| `bo` | `brew outdated` | List installed formulae that have an updated version available. | | |
| 38 | +| `brewp` | `brew pin` | Pin a specified formula so that it's not upgraded. | | |
| 39 | +| `brews` | `brew list -1` | List installed formulae or the installed files for a given formula. | | |
| 40 | +| `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. | | |
| 41 | +| `bsl` | `brew services list` | List all running services. | | |
| 42 | +| `bsoff` | `brew services stop` | Stop the service and unregister it from launching at login (or boot). | | |
| 43 | +| `bsoffa` | `bsoff --all` | Stop all started services. | | |
| 44 | +| `bson` | `brew services start` | Start the service and register it to launch at login (or boot). | | |
| 45 | +| `bsona` | `bson --all` | Start all stopped services. | | |
| 46 | +| `bsr` | `brew services run` | Run the service without registering to launch at login (or boot). | | |
| 47 | +| `bsra` | `bsr --all` | Run all stopped services. | | |
| 48 | +| `bu` | `brew update` | Update brew and all installed formulae. | | |
| 49 | +| `bubo` | `brew update && brew outdated` | Update Homebrew data, then list outdated formulae and casks. | | |
| 50 | +| `bubu` | `bubo && bup` | Do the last two operations above. | | |
| 51 | +| `bugbc` | `brew upgrade --greedy && brew cleanup` | Upgrade outdated formulae and casks (greedy), then run cleanup. | | |
| 52 | +| `bup` | `brew upgrade` | Upgrade outdated, unpinned brews. | | |
| 53 | +| `buz` | `brew uninstall --zap` | Remove all files associated with a cask. | | |
| 54 | + | |
| 55 | +## Completion | |
| 56 | + | |
| 57 | +This plugin configures paths with Homebrew's completion functions automatically, so you don't need to do it | |
| 58 | +manually. See: https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh. | |
| 59 | + | |
| 60 | +With the release of Homebrew 1.0, they decided to bundle the zsh completion as part of the brew installation, | |
| 61 | +so we no longer ship it with the brew plugin; now it only has brew aliases. If you find that brew completion | |
| 62 | +no longer works, make sure you have your Homebrew installation fully up to date. |
+79-0.oh-my-zsh/plugins/brew/brew.plugin.zsh
| @@ -0,0 +1,79 @@ | ||
| 1 | +if (( ! $+commands[brew] )); then | |
| 2 | + if [[ -n "$BREW_LOCATION" ]]; then | |
| 3 | + if [[ ! -x "$BREW_LOCATION" ]]; then | |
| 4 | + echo "[oh-my-zsh] $BREW_LOCATION is not executable" | |
| 5 | + return | |
| 6 | + fi | |
| 7 | + elif [[ -x /opt/homebrew/bin/brew ]]; then | |
| 8 | + BREW_LOCATION="/opt/homebrew/bin/brew" | |
| 9 | + elif [[ -x /usr/local/bin/brew ]]; then | |
| 10 | + BREW_LOCATION="/usr/local/bin/brew" | |
| 11 | + elif [[ -x /home/linuxbrew/.linuxbrew/bin/brew ]]; then | |
| 12 | + BREW_LOCATION="/home/linuxbrew/.linuxbrew/bin/brew" | |
| 13 | + elif [[ -x "$HOME/.linuxbrew/bin/brew" ]]; then | |
| 14 | + BREW_LOCATION="$HOME/.linuxbrew/bin/brew" | |
| 15 | + else | |
| 16 | + return | |
| 17 | + fi | |
| 18 | + | |
| 19 | + # Only add Homebrew installation to PATH, MANPATH, and INFOPATH if brew is | |
| 20 | + # not already on the path, to prevent duplicate entries. This aligns with | |
| 21 | + # the behavior of the brew installer.sh post-install steps. | |
| 22 | + eval "$("$BREW_LOCATION" shellenv)" | |
| 23 | + unset BREW_LOCATION | |
| 24 | +fi | |
| 25 | + | |
| 26 | +if [[ -z "$HOMEBREW_PREFIX" ]]; then | |
| 27 | + # Maintain compatibility with potential custom user profiles, where we had | |
| 28 | + # previously relied on always sourcing shellenv. OMZ plugins should not rely | |
| 29 | + # on this to be defined due to out of order processing. | |
| 30 | + export HOMEBREW_PREFIX="$(brew --prefix)" | |
| 31 | +fi | |
| 32 | + | |
| 33 | +if [[ -d "$HOMEBREW_PREFIX/share/zsh/site-functions" ]]; then | |
| 34 | + fpath+=("$HOMEBREW_PREFIX/share/zsh/site-functions") | |
| 35 | +fi | |
| 36 | + | |
| 37 | +alias ba='brew autoremove' | |
| 38 | +alias bci='brew info --cask' | |
| 39 | +alias bcin='brew install --cask' | |
| 40 | +alias bcl='brew list --cask' | |
| 41 | +alias bcn='brew cleanup' | |
| 42 | +alias bco='brew outdated --cask' | |
| 43 | +alias bcrin='brew reinstall --cask' | |
| 44 | +alias bcubc='brew upgrade --cask && brew cleanup' | |
| 45 | +alias bcubo='brew update && brew outdated --cask' | |
| 46 | +alias bcup='brew upgrade --cask' | |
| 47 | +alias bfu='brew upgrade --formula' | |
| 48 | +alias bi='brew install' | |
| 49 | +alias bl='brew list' | |
| 50 | +alias bo='brew outdated' | |
| 51 | +alias brewp='brew pin' | |
| 52 | +alias brewsp='brew list --pinned' | |
| 53 | +alias bsl='brew services list' | |
| 54 | +alias bsoff='brew services stop' | |
| 55 | +alias bsoffa='bsoff --all' | |
| 56 | +alias bson='brew services start' | |
| 57 | +alias bsona='bson --all' | |
| 58 | +alias bsr='brew services run' | |
| 59 | +alias bsra='bsr --all' | |
| 60 | +alias bu='brew update' | |
| 61 | +alias bubo='brew update && brew outdated' | |
| 62 | +alias bubu='bubo && bup' | |
| 63 | +alias bubug='bubo && bugbc' | |
| 64 | +alias bugbc='brew upgrade --greedy && brew cleanup' | |
| 65 | +alias bup='brew upgrade' | |
| 66 | +alias buz='brew uninstall --zap' | |
| 67 | + | |
| 68 | +function brews() { | |
| 69 | + local formulae="$(brew leaves | xargs brew deps --installed --for-each)" | |
| 70 | + local casks="$(brew list --cask 2>/dev/null)" | |
| 71 | + | |
| 72 | + local blue="$(tput setaf 4)" | |
| 73 | + local bold="$(tput bold)" | |
| 74 | + local off="$(tput sgr0)" | |
| 75 | + | |
| 76 | + echo "${blue}==>${off} ${bold}Formulae${off}" | |
| 77 | + echo "${formulae}" | sed "s/^\(.*\):\(.*\)$/\1${blue}\2${off}/" | |
| 78 | + echo "\n${blue}==>${off} ${bold}Casks${off}\n${casks}" | |
| 79 | +} |
+26-0.oh-my-zsh/plugins/bridgetown/README.md
| @@ -0,0 +1,26 @@ | ||
| 1 | +# Bridgetown plugin | |
| 2 | + | |
| 3 | +This plugin adds some aliases and autocompletion for common [Bridgetown](https://bridgetownrb.com/) commands. | |
| 4 | + | |
| 5 | +To use it, add `bridgetown` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... bridgetown) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Aliases | |
| 12 | + | |
| 13 | +| Alias | Command | | |
| 14 | +|-------|----------------------------| | |
| 15 | +| br | `bridgetown` | | |
| 16 | +| bra | `bin/bridgetown apply` | | |
| 17 | +| brb | `bin/bridgetown build` | | |
| 18 | +| brc | `bin/bridgetown console` | | |
| 19 | +| brclean | `bin/bridgetown clean` | | |
| 20 | +| brd | `bin/bridgetown deploy` | | |
| 21 | +| brdoc | `bin/bridgetown doctor` | | |
| 22 | +| brh | `bin/bridgetown help` | | |
| 23 | +| brn | `bridgetown new` | | |
| 24 | +| brp | `bridgetown plugins` | | |
| 25 | +| brpl | `bridgetown plugins list` | | |
| 26 | +| brs | `bin/bridgetown start` | |
+12-0.oh-my-zsh/plugins/bridgetown/bridgetown.plugin.zsh
| @@ -0,0 +1,12 @@ | ||
| 1 | +alias br='bridgetown' | |
| 2 | +alias bra='bin/bridgetown apply' | |
| 3 | +alias brb='bin/bridgetown build' | |
| 4 | +alias brc='bin/bridgetown console' | |
| 5 | +alias brclean='bin/bridgetown clean' | |
| 6 | +alias brd='bin/bridgetown deploy' | |
| 7 | +alias brdoc='bin/bridgetown doctor' | |
| 8 | +alias brh='bin/bridgetown help' | |
| 9 | +alias brn='bridgetown new' | |
| 10 | +alias brp='bridgetown plugins' | |
| 11 | +alias brpl='bridgetown plugins list' | |
| 12 | +alias brs='bin/bridgetown start' |
+9-0.oh-my-zsh/plugins/buf/README.md
| @@ -0,0 +1,9 @@ | ||
| 1 | +# Buf plugin | |
| 2 | + | |
| 3 | +This plugin adds completion for [Buf CLI](https://github.com/bufbuild/buf), a tool working with Protocol Buffers. | |
| 4 | + | |
| 5 | +To use it, add `buf` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... buf) | |
| 9 | +``` |
+14-0.oh-my-zsh/plugins/buf/buf.plugin.zsh
| @@ -0,0 +1,14 @@ | ||
| 1 | +# Autocompletion for the Buf CLI (buf). | |
| 2 | +if (( !$+commands[buf] )); then | |
| 3 | + return | |
| 4 | +fi | |
| 5 | +# If the completion file doesn't exist yet, we need to autoload it and | |
| 6 | +# bind it to `buf`. Otherwise, compinit will have already done that. | |
| 7 | +if [[ ! -f "$ZSH_CACHE_DIR/completions/_buf" ]]; then | |
| 8 | + typeset -g -A _comps | |
| 9 | + autoload -Uz _buf | |
| 10 | + _comps[buf]=_buf | |
| 11 | +fi | |
| 12 | + | |
| 13 | +# Generate and load buf completion | |
| 14 | +buf completion zsh >! "$ZSH_CACHE_DIR/completions/_buf" &| |
+20-0.oh-my-zsh/plugins/bun/README.md
| @@ -0,0 +1,20 @@ | ||
| 1 | +# Bun Plugin | |
| 2 | + | |
| 3 | +This plugin sets up completion for [Bun](https://bun.sh). | |
| 4 | + | |
| 5 | +To use it, add `bun` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... bun) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +This plugin does not add any aliases. | |
| 12 | + | |
| 13 | +## Cache | |
| 14 | + | |
| 15 | +This plugin caches the completion script and is automatically updated when the | |
| 16 | +plugin is loaded, which is usually when you start up a new terminal emulator. | |
| 17 | + | |
| 18 | +The cache is stored at: | |
| 19 | + | |
| 20 | +- `$ZSH_CACHE_DIR/completions/_bun_` completions script |
+14-0.oh-my-zsh/plugins/bun/bun.plugin.zsh
| @@ -0,0 +1,14 @@ | ||
| 1 | +# If Bun is not found, don't do the rest of the script | |
| 2 | +if (( ! $+commands[bun] )); then | |
| 3 | + return | |
| 4 | +fi | |
| 5 | + | |
| 6 | +# If the completion file doesn't exist yet, we need to autoload it and | |
| 7 | +# bind it to `bun`. Otherwise, compinit will have already done that. | |
| 8 | +if [[ ! -f "$ZSH_CACHE_DIR/completions/_bun" ]]; then | |
| 9 | + typeset -g -A _comps | |
| 10 | + autoload -Uz _bun | |
| 11 | + _comps[bun]=_bun | |
| 12 | +fi | |
| 13 | + | |
| 14 | +SHELL=zsh bun completions >| "$ZSH_CACHE_DIR/completions/_bun" &| |
+74-0.oh-my-zsh/plugins/bundler/README.md
| @@ -0,0 +1,74 @@ | ||
| 1 | +# Bundler | |
| 2 | + | |
| 3 | +This plugin adds completion for basic bundler commands, as well as aliases and helper functions for | |
| 4 | +an easier experience with bundler. | |
| 5 | + | |
| 6 | +To use it, add `bundler` to the plugins array in your zshrc file: | |
| 7 | + | |
| 8 | +```zsh | |
| 9 | +plugins=(... bundler) | |
| 10 | +``` | |
| 11 | + | |
| 12 | +## Aliases | |
| 13 | + | |
| 14 | +| Alias | Command | Description | | |
| 15 | +|--------|--------------------------------------|------------------------------------------------------------------------------------------| | |
| 16 | +| `ba` | `bundle add` | Add gem to the Gemfile and run bundle install | | |
| 17 | +| `bck` | `bundle check` | Verifies if dependencies are satisfied by installed gems | | |
| 18 | +| `bcn` | `bundle clean` | Cleans up unused gems in your bundler directory | | |
| 19 | +| `be` | `bundle exec` | Execute a command in the context of the bundle | | |
| 20 | +| `bi` | `bundle install --jobs=<core_count>` | Install the dependencies specified in your Gemfile (using all cores in bundler >= 1.4.0) | | |
| 21 | +| `bl` | `bundle list` | List all the gems in the bundle | | |
| 22 | +| `bo` | `bundle open` | Opens the source directory for a gem in your bundle | | |
| 23 | +| `bout` | `bundle outdated` | List installed gems with newer versions available | | |
| 24 | +| `bp` | `bundle package` | Package your needed .gem files into your application | | |
| 25 | +| `bu` | `bundle update` | Update your gems to the latest available versions | | |
| 26 | + | |
| 27 | +## Gem wrapper | |
| 28 | + | |
| 29 | +The plugin adds a wrapper for common gems, which: | |
| 30 | + | |
| 31 | +- Looks for a binstub under `./bin/` and executes it if present. | |
| 32 | +- Calls `bundle exec <gem>` otherwise. | |
| 33 | + | |
| 34 | +Common gems wrapped by default (by name of the executable): | |
| 35 | + | |
| 36 | +`annotate`, `cap`, `capify`, `cucumber`, `foodcritic`, `guard`, `hanami`, `irb`, `jekyll`, `kitchen`, `knife`, `middleman`, `nanoc`, `pry`, `puma`, `rackup`, `rainbows`, `rake`, `rspec`, `rubocop`, `shotgun`, `sidekiq`, `spec`, `spork`, `spring`, `strainer`, `tailor`, `taps`, `thin`, `thor`, `unicorn` and `unicorn_rails`. | |
| 37 | + | |
| 38 | +### Settings | |
| 39 | + | |
| 40 | +You can add or remove gems from the list of wrapped commands. | |
| 41 | +Please **use the exact name of the executable** and not the gem name. | |
| 42 | + | |
| 43 | +#### Include gems to be wrapped (`BUNDLED_COMMANDS`) | |
| 44 | + | |
| 45 | +Add this before the plugin list in your `.zshrc`: | |
| 46 | + | |
| 47 | +```sh | |
| 48 | +BUNDLED_COMMANDS=(rubocop) | |
| 49 | +plugins=(... bundler ...) | |
| 50 | +``` | |
| 51 | + | |
| 52 | +This will add the wrapper for the `rubocop` gem (i.e. the executable). | |
| 53 | + | |
| 54 | +#### Exclude gems from being wrapped (`UNBUNDLED_COMMANDS`) | |
| 55 | + | |
| 56 | +Add this before the plugin list in your `.zshrc`: | |
| 57 | + | |
| 58 | +```sh | |
| 59 | +UNBUNDLED_COMMANDS=(foreman spin) | |
| 60 | +plugins=(... bundler ...) | |
| 61 | +``` | |
| 62 | + | |
| 63 | +This will exclude the `foreman` and `spin` gems (i.e. their executable) from being wrapped. | |
| 64 | + | |
| 65 | +### Excluded gems | |
| 66 | + | |
| 67 | +These gems should not be called with `bundle exec`. Please see [issue #2923](https://github.com/ohmyzsh/ohmyzsh/pull/2923) on GitHub for clarification: | |
| 68 | + | |
| 69 | +- `berks` | |
| 70 | +- `foreman` | |
| 71 | +- `mailcatcher` | |
| 72 | +- `rails` | |
| 73 | +- `ruby` | |
| 74 | +- `spin` |
+105-0.oh-my-zsh/plugins/bundler/_bundler
| @@ -0,0 +1,105 @@ | ||
| 1 | +#compdef bundle bundler | |
| 2 | + | |
| 3 | +local curcontext="$curcontext" state line _gems _opts ret=1 | |
| 4 | + | |
| 5 | +_arguments -C -A "-v" -A "--version" \ | |
| 6 | + '(- 1 *)'{-v,--version}'[display version information]' \ | |
| 7 | + '1: :->cmds' \ | |
| 8 | + '*:: :->args' && ret=0 | |
| 9 | + | |
| 10 | +case $state in | |
| 11 | + cmds) | |
| 12 | + _values "bundle command" \ | |
| 13 | + "install[Install the gems specified by the Gemfile or Gemfile.lock]" \ | |
| 14 | + "update[Update dependencies to their latest versions]" \ | |
| 15 | + "package[Package the .gem files required by your application]" \ | |
| 16 | + "exec[Execute a script in the context of the current bundle]" \ | |
| 17 | + "config[Specify and read configuration options for bundler]" \ | |
| 18 | + "check[Determine whether the requirements for your application are installed]" \ | |
| 19 | + "list[Show all of the gems in the current bundle]" \ | |
| 20 | + "show[Show the source location of a particular gem in the bundle]" \ | |
| 21 | + "info[Show details of a particular gem in the bundle]" \ | |
| 22 | + "outdated[Show all of the outdated gems in the current bundle]" \ | |
| 23 | + "console[Start an IRB session in the context of the current bundle]" \ | |
| 24 | + "open[Open an installed gem in the editor]" \ | |
| 25 | + "viz[Generate a visual representation of your dependencies]" \ | |
| 26 | + "init[Generate a simple Gemfile, placed in the current directory]" \ | |
| 27 | + "gem[Create a simple gem, suitable for development with bundler]" \ | |
| 28 | + "platform[Displays platform compatibility information]" \ | |
| 29 | + "clean[Cleans up unused gems in your bundler directory]" \ | |
| 30 | + "help[Describe available tasks or one specific task]" | |
| 31 | + ret=0 | |
| 32 | + ;; | |
| 33 | + args) | |
| 34 | + case $line[1] in | |
| 35 | + help) | |
| 36 | + _values 'commands' \ | |
| 37 | + 'install' \ | |
| 38 | + 'update' \ | |
| 39 | + 'package' \ | |
| 40 | + 'exec' \ | |
| 41 | + 'config' \ | |
| 42 | + 'check' \ | |
| 43 | + 'list' \ | |
| 44 | + 'show' \ | |
| 45 | + 'outdated' \ | |
| 46 | + 'console' \ | |
| 47 | + 'open' \ | |
| 48 | + 'viz' \ | |
| 49 | + 'init' \ | |
| 50 | + 'gem' \ | |
| 51 | + 'platform' \ | |
| 52 | + 'help' && ret=0 | |
| 53 | + ;; | |
| 54 | + install) | |
| 55 | + _arguments \ | |
| 56 | + '(--no-color)--no-color[disable colorization in output]' \ | |
| 57 | + '(--local)--local[do not attempt to connect to rubygems.org]' \ | |
| 58 | + '(--quiet)--quiet[only output warnings and errors]' \ | |
| 59 | + '(--gemfile)--gemfile=-[use the specified gemfile instead of Gemfile]:gemfile' \ | |
| 60 | + '(--system)--system[install to the system location]' \ | |
| 61 | + '(--deployment)--deployment[install using defaults tuned for deployment environments]' \ | |
| 62 | + '(--frozen)--frozen[do not allow the Gemfile.lock to be updated after this install]' \ | |
| 63 | + '(--path)--path=-[specify a different path than the system default]:path:_files' \ | |
| 64 | + '(--binstubs)--binstubs=-[generate bin stubs for bundled gems to ./bin]:directory:_files' \ | |
| 65 | + '(--without)--without=-[exclude gems that are part of the specified named group]:groups' | |
| 66 | + ret=0 | |
| 67 | + ;; | |
| 68 | + exec) | |
| 69 | + _normal && ret=0 | |
| 70 | + ;; | |
| 71 | + clean) | |
| 72 | + _arguments \ | |
| 73 | + '(--force)--force[forces clean even if --path is not set]' \ | |
| 74 | + '(--dry-run)--dry-run[only print out changes, do not actually clean gems]' \ | |
| 75 | + '(--no-color)--no-color[Disable colorization in output]' \ | |
| 76 | + '(--verbose)--verbose[Enable verbose output mode]' | |
| 77 | + ret=0 | |
| 78 | + ;; | |
| 79 | + outdated) | |
| 80 | + _arguments \ | |
| 81 | + '(--pre)--pre[Check for newer pre-release gems]' \ | |
| 82 | + '(--source)--source[Check against a specific source]' \ | |
| 83 | + '(--local)--local[Do not attempt to fetch gems remotely and use the gem cache instead]' \ | |
| 84 | + '(--no-color)--no-color[Disable colorization in output]' \ | |
| 85 | + '(--verbose)--verbose[Enable verbose output mode]' | |
| 86 | + ret=0 | |
| 87 | + ;; | |
| 88 | + (open|show|info) | |
| 89 | + _gems=( $(bundle show 2> /dev/null | sed -e '/^ \*/!d; s/^ \* \([^ ]*\) .*/\1/') ) | |
| 90 | + if [[ $_gems != "" ]]; then | |
| 91 | + _values 'gems' $_gems && ret=0 | |
| 92 | + fi | |
| 93 | + ;; | |
| 94 | + *) | |
| 95 | + _opts=( $(bundle help $line[1] | sed -e '/^ \[-/!d; s/^ \[\(-[^=]*\)=.*/\1/') ) | |
| 96 | + _opts+=( $(bundle help $line[1] | sed -e '/^ -/!d; s/^ \(-.\), \[\(-[^=]*\)=.*/\1 \2/') ) | |
| 97 | + if [[ $_opts != "" ]]; then | |
| 98 | + _values 'options' $_opts && ret=0 | |
| 99 | + fi | |
| 100 | + ;; | |
| 101 | + esac | |
| 102 | + ;; | |
| 103 | +esac | |
| 104 | + | |
| 105 | +return ret |
+127-0.oh-my-zsh/plugins/bundler/bundler.plugin.zsh
| @@ -0,0 +1,127 @@ | ||
| 1 | +## Aliases | |
| 2 | + | |
| 3 | +alias ba="bundle add" | |
| 4 | +alias bck="bundle check" | |
| 5 | +alias bcn="bundle clean" | |
| 6 | +alias be="bundle exec" | |
| 7 | +alias bi="bundle_install" | |
| 8 | +alias bl="bundle list" | |
| 9 | +alias bo="bundle open" | |
| 10 | +alias bout="bundle outdated" | |
| 11 | +alias bp="bundle package" | |
| 12 | +alias bu="bundle update" | |
| 13 | + | |
| 14 | +## Functions | |
| 15 | + | |
| 16 | +bundle_install() { | |
| 17 | + # Bail out if bundler is not installed | |
| 18 | + if (( ! $+commands[bundle] )); then | |
| 19 | + echo "Bundler is not installed" | |
| 20 | + return 1 | |
| 21 | + fi | |
| 22 | + | |
| 23 | + # Bail out if not in a bundled project | |
| 24 | + if ! _within-bundled-project; then | |
| 25 | + echo "Can't 'bundle install' outside a bundled project" | |
| 26 | + return 1 | |
| 27 | + fi | |
| 28 | + | |
| 29 | + # Check the bundler version is at least 1.4.0 | |
| 30 | + autoload -Uz is-at-least | |
| 31 | + local bundler_version=$(bundle version | cut -d' ' -f3) | |
| 32 | + if ! is-at-least 1.4.0 "$bundler_version"; then | |
| 33 | + bundle install "$@" | |
| 34 | + return $? | |
| 35 | + fi | |
| 36 | + | |
| 37 | + # If bundler is at least 1.4.0, use all the CPU cores to bundle install | |
| 38 | + if [[ "$OSTYPE" = (darwin|freebsd)* ]]; then | |
| 39 | + local cores_num="$(sysctl -n hw.ncpu)" | |
| 40 | + else | |
| 41 | + local cores_num="$(nproc)" | |
| 42 | + fi | |
| 43 | + BUNDLE_JOBS="$cores_num" bundle install "$@" | |
| 44 | +} | |
| 45 | + | |
| 46 | +## Gem wrapper | |
| 47 | + | |
| 48 | +bundled_commands=( | |
| 49 | + annotate | |
| 50 | + cap | |
| 51 | + capify | |
| 52 | + cucumber | |
| 53 | + foodcritic | |
| 54 | + guard | |
| 55 | + hanami | |
| 56 | + irb | |
| 57 | + jekyll | |
| 58 | + kitchen | |
| 59 | + knife | |
| 60 | + middleman | |
| 61 | + nanoc | |
| 62 | + pry | |
| 63 | + puma | |
| 64 | + rackup | |
| 65 | + rainbows | |
| 66 | + rake | |
| 67 | + rspec | |
| 68 | + rubocop | |
| 69 | + shotgun | |
| 70 | + sidekiq | |
| 71 | + spec | |
| 72 | + spork | |
| 73 | + spring | |
| 74 | + strainer | |
| 75 | + tailor | |
| 76 | + taps | |
| 77 | + thin | |
| 78 | + thor | |
| 79 | + unicorn | |
| 80 | + unicorn_rails | |
| 81 | +) | |
| 82 | + | |
| 83 | +# Remove $UNBUNDLED_COMMANDS from the bundled_commands list | |
| 84 | +bundled_commands=(${bundled_commands:|UNBUNDLED_COMMANDS}) | |
| 85 | +unset UNBUNDLED_COMMANDS | |
| 86 | + | |
| 87 | +# Add $BUNDLED_COMMANDS to the bundled_commands list | |
| 88 | +bundled_commands+=($BUNDLED_COMMANDS) | |
| 89 | +unset BUNDLED_COMMANDS | |
| 90 | + | |
| 91 | +# Check if in the root or a subdirectory of a bundled project | |
| 92 | +_within-bundled-project() { | |
| 93 | + local check_dir="$PWD" | |
| 94 | + while [[ "$check_dir" != "/" ]]; do | |
| 95 | + if [[ -f "$check_dir/Gemfile" || -f "$check_dir/gems.rb" ]]; then | |
| 96 | + return 0 | |
| 97 | + fi | |
| 98 | + check_dir="${check_dir:h}" | |
| 99 | + done | |
| 100 | + return 1 | |
| 101 | +} | |
| 102 | + | |
| 103 | +_run-with-bundler() { | |
| 104 | + if (( ! $+commands[bundle] )) || ! _within-bundled-project; then | |
| 105 | + "$@" | |
| 106 | + return $? | |
| 107 | + fi | |
| 108 | + | |
| 109 | + if [[ -f "./bin/${1}" ]]; then | |
| 110 | + ./bin/${^^@} | |
| 111 | + else | |
| 112 | + bundle exec "$@" | |
| 113 | + fi | |
| 114 | +} | |
| 115 | + | |
| 116 | +for cmd in $bundled_commands; do | |
| 117 | + # Create wrappers for bundled and unbundled execution | |
| 118 | + eval "function unbundled_$cmd () { \"$cmd\" \"\$@\"; }" | |
| 119 | + eval "function bundled_$cmd () { _run-with-bundler \"$cmd\" \"\$@\"; }" | |
| 120 | + alias "$cmd"="bundled_$cmd" | |
| 121 | + | |
| 122 | + # Bind completion function to wrapped gem if available | |
| 123 | + if (( $+functions[_$cmd] )); then | |
| 124 | + compdef "_$cmd" "bundled_$cmd"="$cmd" | |
| 125 | + fi | |
| 126 | +done | |
| 127 | +unset cmd bundled_commands |
+9-0.oh-my-zsh/plugins/cabal/README.md
| @@ -0,0 +1,9 @@ | ||
| 1 | +# Cabal | |
| 2 | + | |
| 3 | +This plugin provides completion for [Cabal](https://www.haskell.org/cabal/), a build tool for Haskell. It | |
| 4 | +also provides a function `cabal_sandbox_info` that prints whether the current working directory is in a sandbox. | |
| 5 | + | |
| 6 | +To use it, add cabal to the plugins array of your zshrc file: | |
| 7 | +``` | |
| 8 | +plugins=(... cabal) | |
| 9 | +``` |
+93-0.oh-my-zsh/plugins/cabal/cabal.plugin.zsh
| @@ -0,0 +1,93 @@ | ||
| 1 | +function cabal_sandbox_info() { | |
| 2 | + cabal_files=(*.cabal(N)) | |
| 3 | + if [ $#cabal_files -gt 0 ]; then | |
| 4 | + if [ -f cabal.sandbox.config ]; then | |
| 5 | + echo "%{$fg[green]%}sandboxed%{$reset_color%}" | |
| 6 | + else | |
| 7 | + echo "%{$fg[red]%}not sandboxed%{$reset_color%}" | |
| 8 | + fi | |
| 9 | + fi | |
| 10 | +} | |
| 11 | + | |
| 12 | +function _cabal_commands() { | |
| 13 | + local ret=1 state | |
| 14 | + _arguments ':subcommand:->subcommand' && ret=0 | |
| 15 | + | |
| 16 | + case $state in | |
| 17 | + subcommand) | |
| 18 | + subcommands=( | |
| 19 | + "bench:Run the benchmark, if any (configure with UserHooks)" | |
| 20 | + "build:Compile all targets or specific target." | |
| 21 | + "check:Check the package for common mistakes" | |
| 22 | + "clean:Clean up after a build" | |
| 23 | + "copy:Copy the files into the install locations" | |
| 24 | + "configure:Prepare to build the package" | |
| 25 | + "exec:Run a command with the cabal environment" | |
| 26 | + "fetch:Downloads packages for later installation" | |
| 27 | + "freeze:Freeze dependencies." | |
| 28 | + "get:Gets a package's source code" | |
| 29 | + "haddock:Generate Haddock HTML documentation" | |
| 30 | + "help:Help about commands" | |
| 31 | + "hscolour:Generate HsColour colourised code, in HTML format" | |
| 32 | + "info:Display detailed information about a particular package" | |
| 33 | + "init:Interactively create a .cabal file" | |
| 34 | + "install:Installs a list of packages" | |
| 35 | + "list:List packages matching a search string" | |
| 36 | + "register:Register this package with the compiler" | |
| 37 | + "repl:Open an interpreter session for the given target" | |
| 38 | + "report:Upload build reports to a remote server" | |
| 39 | + "run:Runs the compiled executable" | |
| 40 | + "sandbox:Create/modify/delete a sandbox" | |
| 41 | + "sdist:Generate a source distribution file (.tar.gz)" | |
| 42 | + "test:Run the test suite, if any (configure with UserHooks)" | |
| 43 | + "unpack:Unpacks packages for user inspection" | |
| 44 | + "update:Updates list of known packages" | |
| 45 | + "upload:Uploads source packages to Hackage" | |
| 46 | + ) | |
| 47 | + _describe -t subcommands 'cabal subcommands' subcommands && ret=0 | |
| 48 | + esac | |
| 49 | + | |
| 50 | + return ret | |
| 51 | +} | |
| 52 | + | |
| 53 | +compdef _cabal_commands cabal | |
| 54 | + | |
| 55 | +function _cab_commands() { | |
| 56 | + local ret=1 state | |
| 57 | + _arguments ':subcommand:->subcommand' && ret=0 | |
| 58 | + | |
| 59 | + case $state in | |
| 60 | + subcommand) | |
| 61 | + subcommands=( | |
| 62 | + "sync:Fetch the latest package index" | |
| 63 | + "install:Install packages" | |
| 64 | + "uninstall:Uninstall packages" | |
| 65 | + "installed:List installed packages" | |
| 66 | + "configure:Configure a cabal package" | |
| 67 | + "build:Build a cabal package" | |
| 68 | + "clean:Clean up a build directory" | |
| 69 | + "outdated:Display outdated packages" | |
| 70 | + "info:Display information of a package" | |
| 71 | + "sdist:Make tar.gz for source distribution" | |
| 72 | + "upload:Uploading tar.gz to HackageDB" | |
| 73 | + "get:Untar a package in the current directory" | |
| 74 | + "deps:Show dependencies of this package" | |
| 75 | + "revdeps:Show reverse dependencies of this package" | |
| 76 | + "check:Check consistency of packages" | |
| 77 | + "genpaths:Generate Paths_<pkg>.hs" | |
| 78 | + "search:Search available packages by package name" | |
| 79 | + "add:Add a source directory" | |
| 80 | + "test:Run tests" | |
| 81 | + "bench:Run benchmarks" | |
| 82 | + "doc:Generate manuals" | |
| 83 | + "ghci:Run GHCi (with a sandbox)" | |
| 84 | + "init:Initialize a sandbox" | |
| 85 | + "help:Display the help message of the command" | |
| 86 | + ) | |
| 87 | + _describe -t subcommands 'cab subcommands' subcommands && ret=0 | |
| 88 | + esac | |
| 89 | + | |
| 90 | + return ret | |
| 91 | +} | |
| 92 | + | |
| 93 | +command -v cab >/dev/null 2>&1 && { compdef _cab_commands cab } |
+15-0.oh-my-zsh/plugins/cake/README.md
| @@ -0,0 +1,15 @@ | ||
| 1 | +# Cake | |
| 2 | + | |
| 3 | +This plugin provides completion for [CakePHP](https://cakephp.org/). | |
| 4 | + | |
| 5 | +To use it add cake to the plugins array in your zshrc file. | |
| 6 | + | |
| 7 | +```bash | |
| 8 | +plugins=(... cake) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Note | |
| 12 | + | |
| 13 | +This plugin generates a cache file of the cake tasks found, named `.cake_task_cache`, in the current working directory. | |
| 14 | +It is regenerated when the Cakefile is newer than the cache file. It is advised that you add the cake file to your | |
| 15 | +`.gitignore` files. |
+33-0.oh-my-zsh/plugins/cake/cake.plugin.zsh
| @@ -0,0 +1,33 @@ | ||
| 1 | +# Set this to 1 if you want to cache the tasks | |
| 2 | +_cake_cache_task_list=1 | |
| 3 | + | |
| 4 | +# Cache filename | |
| 5 | +_cake_task_cache_file='.cake_task_cache' | |
| 6 | + | |
| 7 | +_cake_get_target_list () { | |
| 8 | + cake | grep '^cake ' | sed -e "s/cake \([^ ]*\) .*/\1/" | grep -v '^$' | |
| 9 | +} | |
| 10 | + | |
| 11 | +_cake_does_target_list_need_generating () { | |
| 12 | + | |
| 13 | + if [ ${_cake_cache_task_list} -eq 0 ]; then | |
| 14 | + return 1; | |
| 15 | + fi | |
| 16 | + | |
| 17 | + [ ! -f ${_cake_task_cache_file} ] && return 0; | |
| 18 | + [ Cakefile -nt ${_cake_task_cache_file} ] && return 0; | |
| 19 | + return 1; | |
| 20 | +} | |
| 21 | + | |
| 22 | +_cake () { | |
| 23 | + if [ -f Cakefile ]; then | |
| 24 | + if _cake_does_target_list_need_generating; then | |
| 25 | + _cake_get_target_list > ${_cake_task_cache_file} | |
| 26 | + compadd `cat ${_cake_task_cache_file}` | |
| 27 | + else | |
| 28 | + compadd `_cake_get_target_list` | |
| 29 | + fi | |
| 30 | + fi | |
| 31 | +} | |
| 32 | + | |
| 33 | +compdef _cake cake |
+16-0.oh-my-zsh/plugins/cakephp3/README.md
| @@ -0,0 +1,16 @@ | ||
| 1 | +# cakephp3 plugin | |
| 2 | + | |
| 3 | +The plugin adds aliases and autocompletion for [cakephp3](https://book.cakephp.org/3.0/en/index.html). | |
| 4 | + | |
| 5 | +To use it, add `cakephp3` to the plugins array of your zshrc file: | |
| 6 | +``` | |
| 7 | +plugins=(... cakephp3) | |
| 8 | +``` | |
| 9 | + | |
| 10 | +## Aliases | |
| 11 | + | |
| 12 | +| Alias | Command | | |
| 13 | +|-----------|-------------------------------| | |
| 14 | +| c3 | `bin/cake` | | |
| 15 | +| c3cache | `bin/cake orm_cache clear` | | |
| 16 | +| c3migrate | `bin/cake migrations migrate` | |
+38-0.oh-my-zsh/plugins/cakephp3/cakephp3.plugin.zsh
| @@ -0,0 +1,38 @@ | ||
| 1 | +# CakePHP 3 basic command completion | |
| 2 | +_cakephp3_get_command_list () { | |
| 3 | + bin/cake completion commands | |
| 4 | +} | |
| 5 | + | |
| 6 | +_cakephp3_get_sub_command_list () { | |
| 7 | + bin/cake completion subcommands ${words[2]} | |
| 8 | +} | |
| 9 | + | |
| 10 | +_cakephp3_get_3rd_argument () { | |
| 11 | + bin/cake ${words[2]} ${words[3]} | \grep '\-\ '| \awk '{print $2}' | |
| 12 | +} | |
| 13 | + | |
| 14 | +_cakephp3 () { | |
| 15 | + local -a has3rdargument | |
| 16 | + has3rdargument=("all" "controller" "fixture" "model" "template") | |
| 17 | + if [ -f bin/cake ]; then | |
| 18 | + if (( CURRENT == 2 )); then | |
| 19 | + compadd $(_cakephp3_get_command_list) | |
| 20 | + fi | |
| 21 | + if (( CURRENT == 3 )); then | |
| 22 | + compadd $(_cakephp3_get_sub_command_list) | |
| 23 | + fi | |
| 24 | + if (( CURRENT == 4 )); then | |
| 25 | + if [[ ${has3rdargument[(i)${words[3]}]} -le ${#has3rdargument} ]]; then | |
| 26 | + compadd $(_cakephp3_get_3rd_argument) | |
| 27 | + fi | |
| 28 | + fi | |
| 29 | + fi | |
| 30 | +} | |
| 31 | + | |
| 32 | +compdef _cakephp3 bin/cake | |
| 33 | +compdef _cakephp3 cake | |
| 34 | + | |
| 35 | +#Alias | |
| 36 | +alias c3='bin/cake' | |
| 37 | +alias c3cache='bin/cake schema_cache clear' | |
| 38 | +alias c3migrate='bin/cake migrations migrate' |
+14-0.oh-my-zsh/plugins/capistrano/README.md
| @@ -0,0 +1,14 @@ | ||
| 1 | +# Capistrano | |
| 2 | + | |
| 3 | +This plugin provides completion for [Capistrano](https://capistranorb.com/). | |
| 4 | + | |
| 5 | +To use it add capistrano to the plugins array in your zshrc file. | |
| 6 | + | |
| 7 | +```bash | |
| 8 | +plugins=(... capistrano) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +For a working completion use the `capit` command instead of `cap`, because cap is a | |
| 12 | +[reserved word in zsh](http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module). | |
| 13 | + | |
| 14 | +`capit` automatically runs cap with bundler if a Gemfile is found. |
+49-0.oh-my-zsh/plugins/capistrano/_capistrano
| @@ -0,0 +1,49 @@ | ||
| 1 | +#compdef capit | |
| 2 | +#autoload | |
| 3 | + | |
| 4 | +# Added `capit` because `cap` is a reserved word. `cap` completion doesn't work. | |
| 5 | +# http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module | |
| 6 | + | |
| 7 | +local curcontext="$curcontext" state line ret=1 | |
| 8 | +local -a _configs | |
| 9 | + | |
| 10 | +_arguments -C \ | |
| 11 | + '1: :->cmds' \ | |
| 12 | + '2:: :->args' && ret=0 | |
| 13 | + | |
| 14 | +_cap_tasks() { | |
| 15 | + if [[ -f config/deploy.rb || -f Capfile ]]; then | |
| 16 | + if [[ ! -f .cap_tasks~ ]]; then | |
| 17 | + capit --tasks | sed 's/\(\[\)\(.*\)\(\]\)/\2:/' | awk '{command=$2; $1=$2=$3=""; gsub(/^[ \t\r\n]+/, "", $0); gsub(":", "\\:", command); print command"["$0"]"}' > .cap_tasks~ | |
| 18 | + fi | |
| 19 | + | |
| 20 | + OLD_IFS=$IFS | |
| 21 | + IFS=$'\n' | |
| 22 | + _values 'cap commands' $(< .cap_tasks~) | |
| 23 | + IFS=$OLD_IFS | |
| 24 | + # zmodload zsh/mapfile | |
| 25 | + # _values ${(f)mapfile[.cap_tasks~]} | |
| 26 | + fi | |
| 27 | +} | |
| 28 | + | |
| 29 | +_cap_stages() { | |
| 30 | + compadd $(find config/deploy -name \*.rb | cut -d/ -f3 | sed s:.rb::g) | |
| 31 | +} | |
| 32 | + | |
| 33 | +case $state in | |
| 34 | + cmds) | |
| 35 | + # check if it uses multistage | |
| 36 | + if [[ -d config/deploy ]]; then | |
| 37 | + _cap_stages | |
| 38 | + else | |
| 39 | + _cap_tasks | |
| 40 | + fi | |
| 41 | + ret=0 | |
| 42 | + ;; | |
| 43 | + args) | |
| 44 | + _cap_tasks | |
| 45 | + ret=0 | |
| 46 | + ;; | |
| 47 | +esac | |
| 48 | + | |
| 49 | +return ret |
+11-0.oh-my-zsh/plugins/capistrano/capistrano.plugin.zsh
| @@ -0,0 +1,11 @@ | ||
| 1 | +# Added `capit` because `cap` is a reserved word. `cap` completion doesn't work. | |
| 2 | +# http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module | |
| 3 | + | |
| 4 | +function capit() { | |
| 5 | + if [ -f Gemfile ] | |
| 6 | + then | |
| 7 | + bundle exec cap $* | |
| 8 | + else | |
| 9 | + cap $* | |
| 10 | + fi | |
| 11 | +} |
+15-0.oh-my-zsh/plugins/cask/README.md
| @@ -0,0 +1,15 @@ | ||
| 1 | +# Cask plugin | |
| 2 | + | |
| 3 | +[Cask](https://github.com/cask/cask) is a project management tool for Emacs that helps | |
| 4 | +automate the package development cycle; development, dependencies, testing, building, | |
| 5 | +packaging and more. | |
| 6 | + | |
| 7 | +This plugin loads `cask` completion from non-standard locations, such as if installed | |
| 8 | +via Homebrew or others. To enable it, add `cask` to your plugins array: | |
| 9 | + | |
| 10 | +```zsh | |
| 11 | +plugins=(... cask) | |
| 12 | +``` | |
| 13 | + | |
| 14 | +Make sure you have the `cask` directory in your `$PATH` before loading Oh My Zsh, | |
| 15 | +otherwise you'll get a "command not found" error. |
+26-0.oh-my-zsh/plugins/cask/cask.plugin.zsh
| @@ -0,0 +1,26 @@ | ||
| 1 | +() { | |
| 2 | + emulate -L zsh | |
| 3 | + | |
| 4 | + if ! (( $+commands[cask] )); then | |
| 5 | + print "zsh cask plugin: cask command not found" >&2 | |
| 6 | + return | |
| 7 | + fi | |
| 8 | + | |
| 9 | + cask_base=${commands[cask]:h:h} | |
| 10 | + | |
| 11 | + # Plain cask installation location (for Cask 0.7.2 and earlier) | |
| 12 | + comp_files=($cask_base/etc/cask_completion.zsh) | |
| 13 | + | |
| 14 | + # Mac Homebrew installs the completion in a different location | |
| 15 | + if (( $+commands[brew] )); then | |
| 16 | + comp_files+=($(brew --prefix)/share/zsh/site-functions/cask_completion.zsh) | |
| 17 | + fi | |
| 18 | + | |
| 19 | + # Load first found file | |
| 20 | + for f in $comp_files; do | |
| 21 | + if [[ -f "$f" ]]; then | |
| 22 | + source "$f" | |
| 23 | + break | |
| 24 | + fi | |
| 25 | + done | |
| 26 | +} |
+24-0.oh-my-zsh/plugins/catimg/README.md
| @@ -0,0 +1,24 @@ | ||
| 1 | +# catimg | |
| 2 | + | |
| 3 | +Plugin for displaying images on the terminal using the `catimg.sh` script provided by | |
| 4 | +[posva](https://github.com/posva/catimg) | |
| 5 | + | |
| 6 | +To use it, add `catimg` to the plugins array in your zshrc file: | |
| 7 | + | |
| 8 | +```zsh | |
| 9 | +plugins=(... catimg) | |
| 10 | +``` | |
| 11 | + | |
| 12 | +## Requirements | |
| 13 | + | |
| 14 | +- `magick convert` (ImageMagick) | |
| 15 | + | |
| 16 | +## Functions | |
| 17 | + | |
| 18 | +| Function | Description | | |
| 19 | +| -------- | ---------------------------------------- | | |
| 20 | +| `catimg` | Displays the given image on the terminal | | |
| 21 | + | |
| 22 | +## Usage examples | |
| 23 | + | |
| 24 | +[](https://asciinema.org/a/204702) |
+19-0.oh-my-zsh/plugins/catimg/catimg.plugin.zsh
| @@ -0,0 +1,19 @@ | ||
| 1 | +################################################################################ | |
| 2 | +# catimg script by Eduardo San Martin Morote aka Posva # | |
| 3 | +# https://posva.net # | |
| 4 | +# # | |
| 5 | +# Output the content of an image to the stdout using the 256 colors of the # | |
| 6 | +# terminal. # | |
| 7 | +# GitHub: https://github.com/posva/catimg # | |
| 8 | +################################################################################ | |
| 9 | + | |
| 10 | + | |
| 11 | +function catimg() { | |
| 12 | + if (( $+commands[magick] )); then | |
| 13 | + CONVERT_CMD="magick" zsh $ZSH/plugins/catimg/catimg.sh $@ | |
| 14 | + elif (( $+commands[convert] )); then | |
| 15 | + CONVERT_CMD="convert" zsh $ZSH/plugins/catimg/catimg.sh $@ | |
| 16 | + else | |
| 17 | + echo "catimg need magick/convert (ImageMagick) to work)" | |
| 18 | + fi | |
| 19 | +} |
+92-0.oh-my-zsh/plugins/catimg/catimg.sh
| @@ -0,0 +1,92 @@ | ||
| 1 | +################################################################################ | |
| 2 | +# catimg script by Eduardo San Martin Morote aka Posva # | |
| 3 | +# https://posva.net # | |
| 4 | +# # | |
| 5 | +# Output the content of an image to the stdout using the 256 colors of the # | |
| 6 | +# terminal. # | |
| 7 | +# GitHub: https://github.com/posva/catimg # | |
| 8 | +################################################################################ | |
| 9 | + | |
| 10 | +# this should come from outside, either `magick` or `convert` | |
| 11 | +# from imagemagick v7 and ahead `convert` is deprecated | |
| 12 | +: ${CONVERT_CMD:=convert} | |
| 13 | + | |
| 14 | +function help() { | |
| 15 | + echo "Usage catimg [-h] [-w width] [-c char] img" | |
| 16 | + echo "By default char is \" \" and w is the terminal width" | |
| 17 | +} | |
| 18 | + | |
| 19 | +# VARIABLES | |
| 20 | +COLOR_FILE=$(dirname $0)/colors.png | |
| 21 | +CHAR=" " | |
| 22 | + | |
| 23 | +WIDTH="" | |
| 24 | +IMG="" | |
| 25 | + | |
| 26 | +while getopts qw:c:h opt; do | |
| 27 | + case "$opt" in | |
| 28 | + w) WIDTH="$OPTARG" ;; | |
| 29 | + c) CHAR="$OPTARG" ;; | |
| 30 | + h) help; exit ;; | |
| 31 | + *) help ; exit 1;; | |
| 32 | + esac | |
| 33 | + done | |
| 34 | + | |
| 35 | +while [ "$1" ]; do | |
| 36 | + IMG="$1" | |
| 37 | + shift | |
| 38 | +done | |
| 39 | + | |
| 40 | +if [ "$IMG" = "" -o ! -f "$IMG" ]; then | |
| 41 | + help | |
| 42 | + exit 1 | |
| 43 | +fi | |
| 44 | + | |
| 45 | +if [ ! "$WIDTH" ]; then | |
| 46 | + COLS=$(expr $(tput cols) "/" $(echo -n "$CHAR" | wc -c)) | |
| 47 | +else | |
| 48 | + COLS=$(expr $WIDTH "/" $(echo -n "$CHAR" | wc -c)) | |
| 49 | +fi | |
| 50 | +WIDTH=$($CONVERT_CMD "$IMG" -print "%w\n" /dev/null) | |
| 51 | +if [ "$WIDTH" -gt "$COLS" ]; then | |
| 52 | + WIDTH=$COLS | |
| 53 | +fi | |
| 54 | + | |
| 55 | +REMAP="" | |
| 56 | +if $CONVERT_CMD "$IMG" -resize $COLS\> +dither -remap $COLOR_FILE /dev/null ; then | |
| 57 | + REMAP="-remap $COLOR_FILE" | |
| 58 | +else | |
| 59 | + echo "The version of convert is too old, don't expect good results :(" >&2 | |
| 60 | + # $CONVERT_CMD "$IMG" -colors 256 PNG8:tmp.png | |
| 61 | + # IMG="tmp.png" | |
| 62 | +fi | |
| 63 | + | |
| 64 | +# Display the image | |
| 65 | +I=0 | |
| 66 | +$CONVERT_CMD "$IMG" -resize $COLS\> +dither `echo $REMAP` txt:- 2>/dev/null | | |
| 67 | +sed -e 's/.*none.*/NO NO NO/g' -e '1d;s/^.*(\(.*\)[,)].*$/\1/g;y/,/ /' | | |
| 68 | +while read R G B f; do | |
| 69 | + if [ ! "$R" = "NO" ]; then | |
| 70 | + if [ "$R" -eq "$G" -a "$G" -eq "$B" ]; then | |
| 71 | + (( | |
| 72 | + I++, | |
| 73 | + IDX = 232 + R * 23 / 255 | |
| 74 | + )) | |
| 75 | + else | |
| 76 | + (( | |
| 77 | + I++, | |
| 78 | + IDX = 16 | |
| 79 | + + R * 5 / 255 * 36 | |
| 80 | + + G * 5 / 255 * 6 | |
| 81 | + + B * 5 / 255 | |
| 82 | + )) | |
| 83 | + fi | |
| 84 | + #echo "$R,$G,$B: $IDX" | |
| 85 | + echo -ne "\e[48;5;${IDX}m${CHAR}" | |
| 86 | + else | |
| 87 | + (( I++ )) | |
| 88 | + echo -ne "\e[0m${CHAR}" | |
| 89 | + fi | |
| 90 | + # New lines | |
| 91 | + (( $I % $WIDTH )) || echo -e "\e[0m" | |
| 92 | +done |
+0-0.oh-my-zsh/plugins/catimg/colors.png
Binary file changed.
+9-0.oh-my-zsh/plugins/celery/README.md
| @@ -0,0 +1,9 @@ | ||
| 1 | +# Celery | |
| 2 | + | |
| 3 | +This plugin provides completion for [Celery](http://www.celeryproject.org/). | |
| 4 | + | |
| 5 | +To use it add celery to the plugins array in your zshrc file. | |
| 6 | + | |
| 7 | +```bash | |
| 8 | +plugins=(... celery) | |
| 9 | +``` |
+129-0.oh-my-zsh/plugins/celery/_celery
| @@ -0,0 +1,129 @@ | ||
| 1 | +#compdef celery | |
| 2 | +#autoload | |
| 3 | + | |
| 4 | +#celery zsh completion | |
| 5 | + | |
| 6 | +_celery () { | |
| 7 | +local -a _1st_arguments ifargs dopts controlargs | |
| 8 | + | |
| 9 | +typeset -A opt_args | |
| 10 | + | |
| 11 | +_1st_arguments=('worker' 'events' 'beat' 'shell' 'multi' 'amqp' 'status' 'inspect' \ | |
| 12 | + 'control' 'purge' 'list' 'migrate' 'call' 'result' 'report') | |
| 13 | +ifargs=('--app=' '--broker=' '--loader=' '--config=' '--version') | |
| 14 | +dopts=('--detach' '--umask=' '--gid=' '--uid=' '--pidfile=' '--logfile=' '--loglevel=') | |
| 15 | +controlargs=('--timeout' '--destination') | |
| 16 | +_arguments \ | |
| 17 | + '(-A --app=)'{-A,--app}'[app instance to use (e.g. module.attr_name):APP]' \ | |
| 18 | + '(-b --broker=)'{-b,--broker}'[url to broker. default is "amqp://guest@localhost//":BROKER]' \ | |
| 19 | + '(--loader)--loader[name of custom loader class to use.:LOADER]' \ | |
| 20 | + '(--config)--config[Name of the configuration module:CONFIG]' \ | |
| 21 | + '(--workdir)--workdir[Optional directory to change to after detaching.:WORKING_DIRECTORY]' \ | |
| 22 | + '(-q --quiet)'{-q,--quiet}'[Don"t show as much output.]' \ | |
| 23 | + '(-C --no-color)'{-C,--no-color}'[Don"t display colors.]' \ | |
| 24 | + '(--version)--version[show program"s version number and exit]' \ | |
| 25 | + '(- : *)'{-h,--help}'[show this help message and exit]' \ | |
| 26 | + '*:: :->subcmds' && return 0 | |
| 27 | + | |
| 28 | +if (( CURRENT == 1 )); then | |
| 29 | + _describe -t commands "celery subcommand" _1st_arguments | |
| 30 | + return | |
| 31 | +fi | |
| 32 | + | |
| 33 | +case "$words[1]" in | |
| 34 | + worker) | |
| 35 | + _arguments \ | |
| 36 | + '(-C --concurrency=)'{-C,--concurrency=}'[Number of child processes processing the queue. The default is the number of CPUs.]' \ | |
| 37 | + '(--pool)--pool=:::(processes eventlet gevent threads solo)' \ | |
| 38 | + '(--purge --discard)'{--discard,--purge}'[Purges all waiting tasks before the daemon is started.]' \ | |
| 39 | + '(-f --logfile=)'{-f,--logfile=}'[Path to log file. If no logfile is specified, stderr is used.]' \ | |
| 40 | + '(--loglevel=)--loglevel=:::(critical error warning info debug)' \ | |
| 41 | + '(-N --hostname=)'{-N,--hostname=}'[Set custom hostname, e.g. "foo.example.com".]' \ | |
| 42 | + '(-B --beat)'{-B,--beat}'[Also run the celerybeat periodic task scheduler.]' \ | |
| 43 | + '(-s --schedule=)'{-s,--schedule=}'[Path to the schedule database if running with the -B option. Defaults to celerybeat-schedule.]' \ | |
| 44 | + '(-S --statedb=)'{-S,--statedb=}'[Path to the state database.Default: None]' \ | |
| 45 | + '(-E --events)'{-E,--events}'[Send events that can be captured by monitors like celeryev, celerymon, and others.]' \ | |
| 46 | + '(--time-limit=)--time-limit=[nables a hard time limit (in seconds int/float) for tasks]' \ | |
| 47 | + '(--soft-time-limit=)--soft-time-limit=[Enables a soft time limit (in seconds int/float) for tasks]' \ | |
| 48 | + '(--maxtasksperchild=)--maxtasksperchild=[Maximum number of tasks a pool worker can execute before it"s terminated and replaced by a new worker.]' \ | |
| 49 | + '(-Q --queues=)'{-Q,--queues=}'[List of queues to enable for this worker, separated by comma. By default all configured queues are enabled.]' \ | |
| 50 | + '(-I --include=)'{-I,--include=}'[Comma separated list of additional modules to import.]' \ | |
| 51 | + '(--pidfile=)--pidfile=[Optional file used to store the process pid.]' \ | |
| 52 | + '(--autoscale=)--autoscale=[Enable autoscaling by providing max_concurrency, min_concurrency.]' \ | |
| 53 | + '(--autoreload)--autoreload[Enable autoreloading.]' \ | |
| 54 | + '(--no-execv)--no-execv[Don"t do execv after multiprocessing child fork.]' | |
| 55 | + compadd -a ifargs | |
| 56 | + ;; | |
| 57 | + inspect) | |
| 58 | + _values -s \ | |
| 59 | + 'active[dump active tasks (being processed)]' \ | |
| 60 | + 'active_queues[dump queues being consumed from]' \ | |
| 61 | + 'ping[ping worker(s)]' \ | |
| 62 | + 'registered[dump of registered tasks]' \ | |
| 63 | + 'report[get bugreport info]' \ | |
| 64 | + 'reserved[dump reserved tasks (waiting to be processed)]' \ | |
| 65 | + 'revoked[dump of revoked task ids]' \ | |
| 66 | + 'scheduled[dump scheduled tasks (eta/countdown/retry)]' \ | |
| 67 | + 'stats[dump worker statistics]' | |
| 68 | + compadd -a controlargs ifargs | |
| 69 | + ;; | |
| 70 | + control) | |
| 71 | + _values -s \ | |
| 72 | + 'add_consumer[tell worker(s) to start consuming a queue]' \ | |
| 73 | + 'autoscale[change autoscale settings]' \ | |
| 74 | + 'cancel_consumer[tell worker(s) to stop consuming a queue]' \ | |
| 75 | + 'disable_events[tell worker(s) to disable events]' \ | |
| 76 | + 'enable_events[tell worker(s) to enable events]' \ | |
| 77 | + 'pool_grow[start more pool processes]' \ | |
| 78 | + 'pool_shrink[use less pool processes]' \ | |
| 79 | + 'rate_limit[tell worker(s) to modify the rate limit for a task type]' \ | |
| 80 | + 'time_limit[tell worker(s) to modify the time limit for a task type.]' | |
| 81 | + compadd -a controlargs ifargs | |
| 82 | + ;; | |
| 83 | + multi) | |
| 84 | + _values -s \ | |
| 85 | + '--nosplash[Don"t display program info.]' \ | |
| 86 | + '--verbose[Show more output.]' \ | |
| 87 | + '--no-color[Don"t display colors.]' \ | |
| 88 | + '--quiet[Don"t show as much output.]' \ | |
| 89 | + 'start' 'restart' 'stopwait' 'stop' 'show' \ | |
| 90 | + 'names' 'expand' 'get' 'kill' | |
| 91 | + compadd -a ifargs | |
| 92 | + ;; | |
| 93 | + amqp) | |
| 94 | + _values -s \ | |
| 95 | + 'queue.declare' 'queue.purge' 'exchange.delete' 'basic.publish' \ | |
| 96 | + 'exchange.declare' 'queue.delete' 'queue.bind' 'basic.get' | |
| 97 | + ;; | |
| 98 | + list) | |
| 99 | + _values -s, 'bindings' | |
| 100 | + ;; | |
| 101 | + shell) | |
| 102 | + _values -s \ | |
| 103 | + '--ipython[force iPython.]' \ | |
| 104 | + '--bpython[force bpython.]' \ | |
| 105 | + '--python[force default Python shell.]' \ | |
| 106 | + '--without-tasks[don"t add tasks to locals.]' \ | |
| 107 | + '--eventlet[use eventlet.]' \ | |
| 108 | + '--gevent[use gevent.]' | |
| 109 | + compadd -a ifargs | |
| 110 | + ;; | |
| 111 | + beat) | |
| 112 | + _arguments \ | |
| 113 | + '(-s --schedule=)'{-s,--schedule=}'[Path to the schedule database. Defaults to celerybeat-schedule.]' \ | |
| 114 | + '(-S --scheduler=)'{-S,--scheduler=}'[Scheduler class to use. Default is celery.beat.PersistentScheduler.]' \ | |
| 115 | + '(--max-interval)--max-interval[]' | |
| 116 | + compadd -a dopts fargs | |
| 117 | + ;; | |
| 118 | + events) | |
| 119 | + _arguments \ | |
| 120 | + '(-d --dump)'{-d,--dump}'[Dump events to stdout.]' \ | |
| 121 | + '(-c --camera=)'{-c,--camera=}'[Take snapshots of events using this camera.]' \ | |
| 122 | + '(-F --frequency=)'{-F,--frequency=}'[Camera: Shutter frequency. Default is every 1.0 seconds.]' \ | |
| 123 | + '(-r --maxrate=)'{-r,--maxrate=}'[Camera: Optional shutter rate limit (e.g. 10/m).]' | |
| 124 | + compadd -a dopts fargs | |
| 125 | + ;; | |
| 126 | + *) | |
| 127 | + ;; | |
| 128 | + esac | |
| 129 | +} |
+9-0.oh-my-zsh/plugins/charm/README.md
| @@ -0,0 +1,9 @@ | ||
| 1 | +# Charm plugin | |
| 2 | + | |
| 3 | +This plugin adds completion for the [charm](https://github.com/charmbracelet/charm) CLI. | |
| 4 | + | |
| 5 | +To use it, add `charm` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... charm) | |
| 9 | +``` |
+14-0.oh-my-zsh/plugins/charm/charm.plugin.zsh
| @@ -0,0 +1,14 @@ | ||
| 1 | +# Autocompletion for the Charm CLI (charm). | |
| 2 | +if (( ! $+commands[charm] )); then | |
| 3 | + return | |
| 4 | +fi | |
| 5 | + | |
| 6 | +# If the completion file doesn't exist yet, we need to autoload it and | |
| 7 | +# bind it to `charm`. Otherwise, compinit will have already done that. | |
| 8 | +if [[ ! -f "$ZSH_CACHE_DIR/completions/_charm" ]]; then | |
| 9 | + typeset -g -A _comps | |
| 10 | + autoload -Uz _charm | |
| 11 | + _comps[charm]=_charm | |
| 12 | +fi | |
| 13 | + | |
| 14 | +charm completion zsh >| "$ZSH_CACHE_DIR/completions/_charm" &| |
+11-0.oh-my-zsh/plugins/chezmoi/README.md
| @@ -0,0 +1,11 @@ | ||
| 1 | +# chezmoi Plugin | |
| 2 | + | |
| 3 | +## Introduction | |
| 4 | + | |
| 5 | +This `chezmoi` plugin sets up completion for [chezmoi](https://chezmoi.io). | |
| 6 | + | |
| 7 | +To use it, add `chezmoi` to the plugins array of your zshrc file: | |
| 8 | + | |
| 9 | +```bash | |
| 10 | +plugins=(... chezmoi) | |
| 11 | +``` |
+14-0.oh-my-zsh/plugins/chezmoi/chezmoi.plugin.zsh
| @@ -0,0 +1,14 @@ | ||
| 1 | +# COMPLETION FUNCTION | |
| 2 | +if (( ! $+commands[chezmoi] )); then | |
| 3 | + return | |
| 4 | +fi | |
| 5 | + | |
| 6 | +# If the completion file doesn't exist yet, we need to autoload it and | |
| 7 | +# bind it to `chezmoi`. Otherwise, compinit will have already done that. | |
| 8 | +if [[ ! -f "$ZSH_CACHE_DIR/completions/_chezmoi" ]]; then | |
| 9 | + typeset -g -A _comps | |
| 10 | + autoload -Uz _chezmoi | |
| 11 | + _comps[chezmoi]=_chezmoi | |
| 12 | +fi | |
| 13 | + | |
| 14 | +chezmoi completion zsh >| "$ZSH_CACHE_DIR/completions/_chezmoi" &| |
+21-0.oh-my-zsh/plugins/chruby/README.md
| @@ -0,0 +1,21 @@ | ||
| 1 | +# chruby plugin | |
| 2 | + | |
| 3 | +This plugin loads [chruby](https://github.com/postmodern/chruby), a tool that changes the | |
| 4 | +current Ruby version, and completion and a prompt function to display the Ruby version. | |
| 5 | +Supports brew and manual installation of chruby. | |
| 6 | + | |
| 7 | +To use it, add `chruby` to the plugins array in your zshrc file: | |
| 8 | + | |
| 9 | +```zsh | |
| 10 | +plugins=(... chruby) | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Usage | |
| 14 | + | |
| 15 | +If you'd prefer to specify an explicit path to load chruby from | |
| 16 | +you can set variables like so: | |
| 17 | + | |
| 18 | +```zsh | |
| 19 | +zstyle :omz:plugins:chruby path /local/path/to/chruby.sh | |
| 20 | +zstyle :omz:plugins:chruby auto /local/path/to/auto.sh | |
| 21 | +``` |
+96-0.oh-my-zsh/plugins/chruby/chruby.plugin.zsh
| @@ -0,0 +1,96 @@ | ||
| 1 | +## load chruby from different locations | |
| 2 | + | |
| 3 | +_source-from-omz-settings() { | |
| 4 | + local _chruby_path _chruby_auto | |
| 5 | + | |
| 6 | + zstyle -s :omz:plugins:chruby path _chruby_path || return 1 | |
| 7 | + zstyle -s :omz:plugins:chruby auto _chruby_auto || return 1 | |
| 8 | + | |
| 9 | + if [[ -r ${_chruby_path} ]]; then | |
| 10 | + source ${_chruby_path} | |
| 11 | + fi | |
| 12 | + | |
| 13 | + if [[ -r ${_chruby_auto} ]]; then | |
| 14 | + source ${_chruby_auto} | |
| 15 | + fi | |
| 16 | +} | |
| 17 | + | |
| 18 | +_source-from-homebrew() { | |
| 19 | + (( $+commands[brew] )) || return 1 | |
| 20 | + | |
| 21 | + local _brew_prefix | |
| 22 | + # check default brew prefix | |
| 23 | + if [[ -h /usr/local/opt/chruby ]];then | |
| 24 | + _brew_prefix="/usr/local/opt/chruby" | |
| 25 | + elif [[ -h /opt/homebrew/opt/chruby ]]; then | |
| 26 | + _brew_prefix="/opt/homebrew/opt/chruby" | |
| 27 | + else | |
| 28 | + # ok , it is not default prefix | |
| 29 | + # this call to brew is expensive ( about 400 ms ), so at least let's make it only once | |
| 30 | + _brew_prefix=$(brew --prefix chruby) | |
| 31 | + fi | |
| 32 | + | |
| 33 | + [[ -r "$_brew_prefix" ]] || return 1 | |
| 34 | + | |
| 35 | + source $_brew_prefix/share/chruby/chruby.sh | |
| 36 | + source $_brew_prefix/share/chruby/auto.sh | |
| 37 | +} | |
| 38 | + | |
| 39 | +_load-chruby-dirs() { | |
| 40 | + local dir | |
| 41 | + for dir in "$HOME/.rubies" "$PREFIX/opt/rubies"; do | |
| 42 | + if [[ -d "$dir" ]]; then | |
| 43 | + RUBIES+=("$dir") | |
| 44 | + fi | |
| 45 | + done | |
| 46 | +} | |
| 47 | + | |
| 48 | +# Load chruby | |
| 49 | +if _source-from-omz-settings; then | |
| 50 | + _load-chruby-dirs | |
| 51 | +elif [[ -r "/usr/local/share/chruby/chruby.sh" ]] ; then | |
| 52 | + source /usr/local/share/chruby/chruby.sh | |
| 53 | + source /usr/local/share/chruby/auto.sh | |
| 54 | + _load-chruby-dirs | |
| 55 | +elif _source-from-homebrew; then | |
| 56 | + _load-chruby-dirs | |
| 57 | +fi | |
| 58 | + | |
| 59 | +unfunction _source-from-homebrew _source-from-omz-settings _load-chruby-dirs | |
| 60 | + | |
| 61 | + | |
| 62 | +## chruby utility functions and aliases | |
| 63 | + | |
| 64 | +# rvm and rbenv plugins also provide this alias | |
| 65 | +alias rubies='chruby' | |
| 66 | + | |
| 67 | +function current_ruby() { | |
| 68 | + local ruby | |
| 69 | + ruby="$(chruby | grep \* | tr -d '* ')" | |
| 70 | + if [[ $(chruby | grep -c \*) -eq 1 ]]; then | |
| 71 | + echo ${ruby} | |
| 72 | + else | |
| 73 | + echo "system" | |
| 74 | + fi | |
| 75 | +} | |
| 76 | + | |
| 77 | +function chruby_prompt_info() { | |
| 78 | + echo "${$(current_ruby):gs/%/%%}" | |
| 79 | +} | |
| 80 | + | |
| 81 | +# Complete chruby command with installed rubies | |
| 82 | +_chruby() { | |
| 83 | + compadd $(chruby | tr -d '* ') | |
| 84 | + if PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" command ruby &>/dev/null; then | |
| 85 | + compadd system | |
| 86 | + fi | |
| 87 | +} | |
| 88 | + | |
| 89 | +compdef _chruby chruby | |
| 90 | + | |
| 91 | + | |
| 92 | +# Simple definition completer for ruby-build | |
| 93 | +if command ruby-build &> /dev/null; then | |
| 94 | + _ruby-build() { compadd $(ruby-build --definitions) } | |
| 95 | + compdef _ruby-build ruby-build | |
| 96 | +fi |
+1-0.oh-my-zsh/plugins/chucknorris/.gitignore
| @@ -0,0 +1 @@ | ||
| 1 | +fortunes/chucknorris.dat |
+45-0.oh-my-zsh/plugins/chucknorris/README.md
| @@ -0,0 +1,45 @@ | ||
| 1 | +# chucknorris | |
| 2 | + | |
| 3 | +Fortunes plugin for Chuck Norris for Oh My Zsh. Perfectly suitable as MOTD. | |
| 4 | + | |
| 5 | +To use it add `chucknorris` to the plugins array in you zshrc file. | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... chucknorris) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Usage | |
| 12 | + | |
| 13 | +| Command | Description | | |
| 14 | +| ----------- | ------------------------------- | | |
| 15 | +| `chuck` | Print random Chuck Norris quote | | |
| 16 | +| `chuck_cow` | Print quote in cowthink | | |
| 17 | + | |
| 18 | +Example: output of `chuck_cow`: | |
| 19 | + | |
| 20 | +``` | |
| 21 | +Last login: Fri Jan 30 23:12:26 on ttys001 | |
| 22 | + ______________________________________ | |
| 23 | +( When Chuck Norris plays Monopoly, it ) | |
| 24 | +( affects the actual world economy. ) | |
| 25 | + -------------------------------------- | |
| 26 | + o ^__^ | |
| 27 | + o (oo)\_______ | |
| 28 | + (__)\ )\/\ | |
| 29 | + ||----w | | |
| 30 | + || || | |
| 31 | +``` | |
| 32 | + | |
| 33 | +## Requirements | |
| 34 | + | |
| 35 | +- `fortune` | |
| 36 | +- `cowsay` if using `chuck_cow` | |
| 37 | + | |
| 38 | +Available via homebrew, apt, ... | |
| 39 | + | |
| 40 | +> [!NOTE] | |
| 41 | +> In addition to installing `fortune`, it may be necessary to run: | |
| 42 | +> | |
| 43 | +> `strfile $ZSH/plugins/chucknorris/fortunes/chucknorris\n` | |
| 44 | +> | |
| 45 | +> (include the "\n" literally) to write the fortune data to the proper directory. |
+24-0.oh-my-zsh/plugins/chucknorris/chucknorris.plugin.zsh
| @@ -0,0 +1,24 @@ | ||
| 1 | +() { | |
| 2 | + # %x: name of file containing code being executed | |
| 3 | + local fortunes_dir="${${(%):-%x}:h}/fortunes" | |
| 4 | + | |
| 5 | + # Aliases | |
| 6 | + alias chuck="fortune -a $fortunes_dir" | |
| 7 | + alias chuck_cow="chuck | cowthink" | |
| 8 | + | |
| 9 | + # Automatically generate or update Chuck's compiled fortune data file | |
| 10 | + if [[ "$fortunes_dir/chucknorris" -ot "$fortunes_dir/chucknorris.dat" ]]; then | |
| 11 | + return | |
| 12 | + fi | |
| 13 | + | |
| 14 | + # For some reason, Cygwin puts strfile in /usr/sbin, which is not on the path by default | |
| 15 | + local strfile="${commands[strfile]:-/usr/sbin/strfile}" | |
| 16 | + if [[ ! -x "$strfile" ]]; then | |
| 17 | + echo "[oh-my-zsh] chucknorris depends on strfile, which is not installed" >&2 | |
| 18 | + echo "[oh-my-zsh] strfile is often provided as part of the 'fortune' package" >&2 | |
| 19 | + return | |
| 20 | + fi | |
| 21 | + | |
| 22 | + # Generate the compiled fortune data file | |
| 23 | + $strfile "$fortunes_dir/chucknorris" "$fortunes_dir/chucknorris.dat" >/dev/null | |
| 24 | +} |
+568-0.oh-my-zsh/plugins/chucknorris/fortunes/chucknorris
| @@ -0,0 +1,568 @@ | ||
| 1 | +King Kong climbed the Empire State building in fear of Chuck Norris who was downstairs at the time. | |
| 2 | +% | |
| 3 | +"2012" is code for, Chuck Norris when he is pissed. | |
| 4 | +% | |
| 5 | +"The Big Chuck Norris Roundhouse-Kick Theory" | |
| 6 | +% | |
| 7 | +"The wind cries Chuck Norris" | |
| 8 | +% | |
| 9 | +"Walker Texas Ranger: The Movie 3-D" was considered by Warner Brothers; however the technology to create the visual effects will never be possible. | |
| 10 | +% | |
| 11 | +A Handicapped parking sign does not signify that this spot is for handicapped people. It is actually in fact a warning, that the spot belongs to Chuck Norris and that you will be handicapped if you park there. | |
| 12 | +% | |
| 13 | +Abraham Lincoln didn't die because he was shot, Chuck Norris roundhouse-kicked so fast his foot went back in time and killed Abraham Lincoln. | |
| 14 | +% | |
| 15 | +Achievement Unlocked: Chuck Norris of Death | |
| 16 | +% | |
| 17 | +After Chuck counted to infinity the first time, he vowed to count to infinity a second time....by counting the bodies of those previously roundhoused. | |
| 18 | +% | |
| 19 | +Aliens fear that Chuck Norris might abduct them. | |
| 20 | +% | |
| 21 | +An angry glare from Chuck Norris is known to kill on the spot. | |
| 22 | +% | |
| 23 | +Behind every successful man is Chuck Norris. | |
| 24 | +% | |
| 25 | +Beware of dogs... Dogs, beware of Chuck Norris. | |
| 26 | +% | |
| 27 | +Bruce Lee didn't defeat Chuck Norris. Chuck hit Bruce with a Delayed roundhouse kick that was so fast that Lee only felt the impact a year later! | |
| 28 | +% | |
| 29 | +CNN was originally created as the "Chuck Norris Network" to update Americans with on-the-spot ass kicking in real-time. | |
| 30 | +% | |
| 31 | +Casinos pay Chuck Norris not to play at anything or wish anyone good luck. | |
| 32 | +% | |
| 33 | +Chuck Norris - the new standard. | |
| 34 | +% | |
| 35 | +Chuck Norris CAN balance the light-switch between ON and OFF. | |
| 36 | +% | |
| 37 | +Chuck Norris CAN believe it's not butter. | |
| 38 | +% | |
| 39 | +Chuck Norris CAN spell with an I before E even after C. | |
| 40 | +% | |
| 41 | +Chuck Norris can play the theme from the Twilight Zone with his beard. | |
| 42 | +% | |
| 43 | +Chuck Norris can power solar panels. At night. | |
| 44 | +% | |
| 45 | +Chuck Norris watches "the Nat.Geo. Specials" on Discovery Channel. | |
| 46 | +% | |
| 47 | +Chuck Norris bowled a 301 after constructing another pin out of his beard hair. | |
| 48 | +% | |
| 49 | +Chuck Norris burnt a fire proof vest, UNDERWATER! | |
| 50 | +% | |
| 51 | +Chuck Norris can French kiss his elbow. | |
| 52 | +% | |
| 53 | +Chuck Norris can bake in a freezer. | |
| 54 | +% | |
| 55 | +Chuck Norris can defuse a bomb by cutting the wrong wire. | |
| 56 | +% | |
| 57 | +Chuck Norris can dig a hole in air. | |
| 58 | +% | |
| 59 | +Chuck Norris can divide by zero. | |
| 60 | +% | |
| 61 | +Chuck Norris can do a regime change with a roundhouse kick. | |
| 62 | +% | |
| 63 | +Chuck Norris can fit 10 gallons of water in a 5 gallon bucket. | |
| 64 | +% | |
| 65 | +Chuck Norris can grill a popsicle. | |
| 66 | +% | |
| 67 | +Chuck Norris can lead a horse to water AND make it drink. | |
| 68 | +% | |
| 69 | +Chuck Norris can make his own megazord "The Chuck Norris Roundhouse Kickers Ultimate Super Awesome Megazord". | |
| 70 | +% | |
| 71 | +Chuck Norris can milk an alligator. | |
| 72 | +% | |
| 73 | +Chuck Norris can play the death waltz with his chin. | |
| 74 | +% | |
| 75 | +Chuck Norris can roundhouse kick someone through a window without breaking the glass. | |
| 76 | +% | |
| 77 | +Chuck Norris can roundhouse-kick round houses into squares. | |
| 78 | +% | |
| 79 | +Chuck Norris can rub two fires together and make a stick! | |
| 80 | +% | |
| 81 | +Chuck Norris can see in 3D with just one eye. | |
| 82 | +% | |
| 83 | +Chuck Norris can slam a revolving door. | |
| 84 | +% | |
| 85 | +Chuck Norris can terminate a repeating decimal. | |
| 86 | +% | |
| 87 | +Chuck Norris can turn toast back into bread. | |
| 88 | +% | |
| 89 | +Chuck Norris can win a game of Connect Four in only three moves. | |
| 90 | +% | |
| 91 | +Chuck Norris can win in a top spinning tournament with a cube. | |
| 92 | +% | |
| 93 | +Chuck Norris can't perform Hadoukens, he IS a Hadouken. | |
| 94 | +% | |
| 95 | +Chuck Norris checks under his bed for Fedor Emelianenko because he takes Fedor to the vet regularly. | |
| 96 | +% | |
| 97 | +Chuck Norris counted to infinity - twice. | |
| 98 | +% | |
| 99 | +Chuck Norris created Heavy Metal when he was upset. | |
| 100 | +% | |
| 101 | +Chuck Norris does not get frostbite. Chuck Norris bites frost. | |
| 102 | +% | |
| 103 | +Chuck Norris does not have a cell phone because he hears everything. | |
| 104 | +% | |
| 105 | +Chuck Norris does not sleep. He waits. | |
| 106 | +% | |
| 107 | +Chuck Norris doesn't bowl strikes, he just knocks down one pin and the other nine faint. | |
| 108 | +% | |
| 109 | +Chuck Norris doesn't call the wrong number, you just answer the wrong phone. | |
| 110 | +% | |
| 111 | +Chuck Norris doesn't cheat death, he beats it fair and square. | |
| 112 | +% | |
| 113 | +Chuck Norris doesn't churn butter. He roundhouse kicks the cows and the butter comes straight out. | |
| 114 | +% | |
| 115 | +Chuck Norris doesn't eat, he just sucks the energy out of food by staring at it. | |
| 116 | +% | |
| 117 | +Chuck Norris doesn't exhale. The air runs desperately scared out of his lungs. | |
| 118 | +% | |
| 119 | +Chuck Norris doesn't go hunting.... CHUCK NORRIS GOES KILLING. | |
| 120 | +% | |
| 121 | +Chuck Norris doesn't let it go. | |
| 122 | +% | |
| 123 | +Chuck Norris doesn't like Mudkipz. | |
| 124 | +% | |
| 125 | +Chuck Norris doesn't look for fun. The fun looks for Chuck Norris. | |
| 126 | +% | |
| 127 | +Chuck Norris doesn't need a bulletproof vest. He catches them with his bare hands. | |
| 128 | +% | |
| 129 | +Chuck Norris doesn't need air, he is air. | |
| 130 | +% | |
| 131 | +Chuck Norris doesn't need sunglasses, the sun needs Chuck Norris glasses. | |
| 132 | +% | |
| 133 | +Chuck Norris doesn't need to brush his teeth, his spit acts as a bleach. | |
| 134 | +% | |
| 135 | +Chuck Norris doesn't read books. He stares them down until he gets the information he wants. | |
| 136 | +% | |
| 137 | +Chuck Norris doesn't throw up if he drinks too much. Chuck Norris throws down! | |
| 138 | +% | |
| 139 | +Chuck Norris doesn't eat salad, he eats vegetarians. | |
| 140 | +% | |
| 141 | +Chuck Norris doesn't wash his clothes, he disembowels them. | |
| 142 | +% | |
| 143 | +Chuck Norris doesn't wear a watch. HE decides what time it is. | |
| 144 | +% | |
| 145 | +Chuck Norris doesn't carry a list. He always knows what to do. | |
| 146 | +% | |
| 147 | +Chuck Norris drives an ice cream truck covered in human skulls. | |
| 148 | +% | |
| 149 | +Chuck Norris drowned a man ON LAND. | |
| 150 | +% | |
| 151 | +Chuck Norris fed the Hunger Games. | |
| 152 | +% | |
| 153 | +Chuck Norris found the hay in the needle stack. | |
| 154 | +% | |
| 155 | +Chuck Norris found the last digit of pi. | |
| 156 | +% | |
| 157 | +Chuck Norris had a knife thrown at him. The knife didn't impale him; he impaled the knife. | |
| 158 | +% | |
| 159 | +Chuck Norris has a battle cruiser AND a car. | |
| 160 | +% | |
| 161 | +Chuck Norris has killed the Dead Sea. | |
| 162 | +% | |
| 163 | +Chuck Norris has made a 148 break at snooker. | |
| 164 | +% | |
| 165 | +Chuck Norris invented Kentucky Fried Chicken's famous secret recipe, with eleven herbs and spices. But nobody ever mentions the twelfth ingredient: Fear. | |
| 166 | +% | |
| 167 | +Chuck Norris is allowed two carry-ons. | |
| 168 | +% | |
| 169 | +Chuck Norris is currently suing NBC, claiming Law and Order are trademarked names for his left and right legs. | |
| 170 | +% | |
| 171 | +Chuck Norris is currently suing any broadway theater that plays "The Nutcracker". He claims its an infringement on his "other" roundhouse kick. | |
| 172 | +% | |
| 173 | +Chuck Norris is entitled to his own facts. | |
| 174 | +% | |
| 175 | +Chuck Norris is my Homeboy. | |
| 176 | +% | |
| 177 | +Chuck Norris is so fast, he can run around the world and punch himself in the back of the head. | |
| 178 | +% | |
| 179 | +Chuck Norris is so hard, he uses diamonds as stress balls. | |
| 180 | +% | |
| 181 | +Chuck Norris is so scary, he makes sharks swim backwards away from him. | |
| 182 | +% | |
| 183 | +Chuck Norris is ten feet tall, weighs two-tons, breathes fire, and could eat a hammer and take a shotgun blast standing. | |
| 184 | +% | |
| 185 | +Chuck Norris is the ghost in paranormal activity. | |
| 186 | +% | |
| 187 | +Chuck Norris is the life of parties he doesn't attend. | |
| 188 | +% | |
| 189 | +Chuck Norris is the meaning of life. Too bad he's also the meaning of death. | |
| 190 | +% | |
| 191 | +Chuck Norris is the only man to ever defeat a brick wall in a game of tennis. | |
| 192 | +% | |
| 193 | +Chuck Norris is the only one who can tear a facebook page! | |
| 194 | +% | |
| 195 | +Chuck Norris is the reason that the world will end in 2012. He was getting bored with the Earth. | |
| 196 | +% | |
| 197 | +Chuck Norris is the reason tumbleweeds tumble. | |
| 198 | +% | |
| 199 | +Chuck Norris is the reason why Waldo is hiding. | |
| 200 | +% | |
| 201 | +Chuck Norris is waiting for Mt. St. Helens to erupt again. He's hoping the lava is hot enough to soften his beard so he can shave for the first time. | |
| 202 | +% | |
| 203 | +Chuck Norris isn't allowed at the zoo, because when he's there the animals are too terrified to come out of their cages. | |
| 204 | +% | |
| 205 | +Chuck Norris made a statue bleed. | |
| 206 | +% | |
| 207 | +Chuck Norris made the big bang just by clicking his fingers. | |
| 208 | +% | |
| 209 | +Chuck Norris never trains, because he's Chuck Norris. | |
| 210 | +% | |
| 211 | +Chuck Norris once cried just to see what it was like. The end result was the creation of life. | |
| 212 | +% | |
| 213 | +Chuck Norris once cut a knife with a stick of butter. | |
| 214 | +% | |
| 215 | +Chuck Norris once got a 200 yard punt return. | |
| 216 | +% | |
| 217 | +Chuck Norris once had a pet monkey named KING KONG. | |
| 218 | +% | |
| 219 | +Chuck Norris once had a street named after him. The name removed at once, because nobody crosses Chuck Norris, and lives. | |
| 220 | +% | |
| 221 | +Chuck Norris once had a weak moment, just to know what it felt like. | |
| 222 | +% | |
| 223 | +Chuck Norris once played Duck Duck Goose with a group of Kindergarteners. Only one kid made it to first grade. | |
| 224 | +% | |
| 225 | +Chuck Norris once proved p^~p by induction on his beard hairs. | |
| 226 | +% | |
| 227 | +Chuck Norris once punched the ground to stop an earthquake. The resulting aftershock caused the BP oil spill. | |
| 228 | +% | |
| 229 | +Chuck Norris once round-house kicked a salesman. Over the phone. | |
| 230 | +% | |
| 231 | +Chuck Norris once roundhouse kicked a football. The astronomical society now considers it a planet. | |
| 232 | +% | |
| 233 | +Chuck Norris once thought he was wrong. He was, however, mistaken. | |
| 234 | +% | |
| 235 | +Chuck Norris once walked down a street with his fists in his pockets. He was then arrested for concealing two deadly weapons. | |
| 236 | +% | |
| 237 | +Chuck Norris once won the Tour de France riding a "big wheel". | |
| 238 | +% | |
| 239 | +Chuck Norris originally appeared in the "Street Fighter II" video game, but was removed by Beta Testers because every button caused him to do a roundhouse kick. When asked bout this "glitch," Norris replied, "That's no glitch." | |
| 240 | +% | |
| 241 | +Chuck Norris owns all number 1 pencils. | |
| 242 | +% | |
| 243 | +Chuck Norris pees Adamantium. | |
| 244 | +% | |
| 245 | +Chuck Norris plays Texas Hold'Em with Zeus, every second Wednesday of the month. | |
| 246 | +% | |
| 247 | +Chuck Norris played "Got your Nose" with Voldemort and won. | |
| 248 | +% | |
| 249 | +Chuck Norris played the game of thrones and won. | |
| 250 | +% | |
| 251 | +Chuck Norris protects his bodyguards. | |
| 252 | +% | |
| 253 | +Chuck Norris rolled a 20 on a 6 sided die. | |
| 254 | +% | |
| 255 | +Chuck Norris roundhouse kicks people in the face first and asks questions later. | |
| 256 | +% | |
| 257 | +Chuck Norris sent a BBM to an iPhone. | |
| 258 | +% | |
| 259 | +Chuck Norris shops at Sam's Club, but leaves without having his receipt checked. | |
| 260 | +% | |
| 261 | +Chuck Norris splattered tiger blood and Adonis' DNA on Charlie Sheen with 1 roundhouse kick! | |
| 262 | +% | |
| 263 | +Chuck Norris started Chuck Norris. | |
| 264 | +% | |
| 265 | +Chuck Norris starts his day with 6 live chickens, two cows, three pigs, and a boiling hot cup of pure fury. | |
| 266 | +% | |
| 267 | +Chuck Norris told me to put this here. | |
| 268 | +% | |
| 269 | +Chuck Norris uses a real mouse to move the cursor, type on the keyboard, write e-mails, code entire websites, and make coffee. | |
| 270 | +% | |
| 271 | +Chuck Norris uses pepper spray to spice up his steaks. | |
| 272 | +% | |
| 273 | +Chuck Norris was heard in a soundproof room! | |
| 274 | +% | |
| 275 | +Chuck Norris was once turned down for American Idol. When Simon was questioned about it, he replied "I'm retiring after this season". I wonder why? | |
| 276 | +% | |
| 277 | +Chuck Norris was originally in Mortal Kombat, but that version was deleted because no one can beat Chuck Norris in a fight. | |
| 278 | +% | |
| 279 | +Chuck Norris was the image used for Papa Smurf. | |
| 280 | +% | |
| 281 | +Chuck Norris was the reason why the Great Wall of China was constructed. It failed miserably. | |
| 282 | +% | |
| 283 | +Chuck Norris was what Willis was talking about. | |
| 284 | +% | |
| 285 | +Chuck Norris wasn't born on his birthday. | |
| 286 | +% | |
| 287 | +Chuck Norris watched the first steps on the moon... from his summer home on Mars. | |
| 288 | +% | |
| 289 | +Chuck Norris went up the creek without a paddle... or a canoe. | |
| 290 | +% | |
| 291 | +Chuck Norris will attain statehood in 2009. His state flower will be the Magnolia. | |
| 292 | +% | |
| 293 | +Chuck Norris wins NASCAR races with all right turns. | |
| 294 | +% | |
| 295 | +Chuck Norris won a stepdance contest by standing on his hands. | |
| 296 | +% | |
| 297 | +Chuck Norris yells at drill Sergeants. | |
| 298 | +% | |
| 299 | +Chuck Norris' dog picks up after him. | |
| 300 | +% | |
| 301 | +Chuck Norris' films are factual documentaries. | |
| 302 | +% | |
| 303 | +Chuck Norris' first job was as a paperboy. There were no survivors. | |
| 304 | +% | |
| 305 | +Chuck Norris' glass is never half full or half empty. It stays full even after he takes a drink. | |
| 306 | +% | |
| 307 | +Chuck Norris' hand is the only hand that can beat a Royal Flush. | |
| 308 | +% | |
| 309 | +Chuck Norris' personal airplane is called Air Force Chuck. | |
| 310 | +% | |
| 311 | +Chuck Norris. Enough said. | |
| 312 | +% | |
| 313 | +Chuck Norris: even Naruto can't believe it. | |
| 314 | +% | |
| 315 | +Chuck Norris can make sour milk turn fresh. | |
| 316 | +% | |
| 317 | +Contrary to popular belief, Rome WAS built in a day, by Chuck Norris. | |
| 318 | +% | |
| 319 | +Contrary to popular belief, America is not a democracy, it is a Chucktatorship. | |
| 320 | +% | |
| 321 | +Contrary to popular belief, Chuck Norris, not the box jellyfish of northern Australia, is the most venomous creature on Earth. | |
| 322 | +% | |
| 323 | +Cops don't need badges in their wallets, but only a picture of Chuck Norris. | |
| 324 | +% | |
| 325 | +Crop circles are Chuck Norris' way of telling the world that sometimes corn needs to lie down. | |
| 326 | +% | |
| 327 | +Did you hear about the boy who cried Chuck Norris? | |
| 328 | +% | |
| 329 | +Dog the Bounty Hunter can't track Chuck Norris down. | |
| 330 | +% | |
| 331 | +Don't get Chuck Norris angry. Last time somebody did that, Chuck Norris made the Grand Canyon. | |
| 332 | +% | |
| 333 | +Earth's rotation is purely governed by the direction that Chuck Norris is walking. | |
| 334 | +% | |
| 335 | +Ever wonder what really happened to the dinosaurs? They all dug their own graves when they heard Chuck Norris was coming. | |
| 336 | +% | |
| 337 | +Every line in a Chuck Norris haiku is "A roundhouse kick to the face." And they all have the correct number of syllables. | |
| 338 | +% | |
| 339 | +Every phobia known to man has a phobia of Chuck Norris. | |
| 340 | +% | |
| 341 | +Every time there's an earthquake, you know Chuck Norris is hungry. The earthquake is caused by his stomach growling. | |
| 342 | +% | |
| 343 | +Evolution's driving mechanism is nature's desperate attempt to escape Chuck Norris. | |
| 344 | +% | |
| 345 | +Fear of spiders is arachnophobia. Fear of tight spaces is claustrophobia. Fear of Chuck Norris is called Logic. | |
| 346 | +% | |
| 347 | +Fool me once, shame on you. Fool Chuck Norris once and he will roundhouse you in the face. | |
| 348 | +% | |
| 349 | +Ghosts can see Chuck Norris. | |
| 350 | +% | |
| 351 | +Guns don't kill people. Chuck Norris kills people. | |
| 352 | +% | |
| 353 | +How much wood could a woodchuck chuck if a woodchuck could chuck wood? No woodchuck could chuck Chuck's wood! | |
| 354 | +% | |
| 355 | +If Chuck Norris were a calendar, every month would be named Chucktober, and every day he'd kick your ass. | |
| 356 | +% | |
| 357 | +If Chuck Norris were to get into a fight with another Chuck Norris, Chuck Norris would win. | |
| 358 | +% | |
| 359 | +If God doesn't know, Chuck does. | |
| 360 | +% | |
| 361 | +If Goliath listened to Chuck Norris, he would have won. | |
| 362 | +% | |
| 363 | +If at first you don't succeed, you're not Chuck Norris. | |
| 364 | +% | |
| 365 | +If you ask Chuck Norris what time it is, he always says, "Two seconds 'til." After you ask, "Two seconds 'til what?" he roundhouse kicks you in the face. | |
| 366 | +% | |
| 367 | +If you put in the correct cheat code in Halo 2, you can have Master Chief play without his helmet, revealing himself to be Chuck Norris. | |
| 368 | +% | |
| 369 | +If you see a man in the street who looks like Chuck Norris, but isn't, run: you don't want to be caught in the resulting roundhouse kick to his face. | |
| 370 | +% | |
| 371 | +If you spell Chuck Norris in Scrabble, you win. Forever. | |
| 372 | +% | |
| 373 | +In 1945 The US army asked if they could clone Chuck Norris. Instead he said he could sort out the Japanese. | |
| 374 | +% | |
| 375 | +In Texas, there are five sizes for fountain drinks: small, medium, large, Texas sized, and Chuck Norris sized. It is a cup made of a human skull. | |
| 376 | +% | |
| 377 | +In a rain storm Chuck Norris stays dry. Rain drops are scared to hit him. | |
| 378 | +% | |
| 379 | +In the back of the book of world records, it says "All records are held by Chuck Norris. The ones listed are in second place." | |
| 380 | +% | |
| 381 | +James Bond has a license to kill. He got it from Chuck Norris. | |
| 382 | +% | |
| 383 | +Jedis are now taught to use the "Chuck". | |
| 384 | +% | |
| 385 | +MacGyver immediately tried to make a bomb out of some Q-Tips and Gatorade, but Chuck Norris roundhouse-kicked him in the solar plexus. MacGyver promptly threw up his own heart. | |
| 386 | +% | |
| 387 | +Machiavelli said it is better to be feared than loved because he was inspired by Chuck Norris. | |
| 388 | +% | |
| 389 | +May the Force be with Chuck Norris... for its own good. | |
| 390 | +% | |
| 391 | +Merlin was Chuck Norris' assistant. | |
| 392 | +% | |
| 393 | +Most people have 23 pairs of chromosomes. Chuck Norris has 72... and they're all poisonous. | |
| 394 | +% | |
| 395 | +Note to self: Don't be the cashier to tell Chuck Norris his coupons have expired. | |
| 396 | +% | |
| 397 | +Chuck Norris' keyboard has no control key. Chuck Norris is always in control. | |
| 398 | +% | |
| 399 | +Once upon a time, Chuck Norris found himself in a town called Shit Creek. He opened a Paddle Store. | |
| 400 | +% | |
| 401 | +One glance from Chuck Norris and snow turns itself yellow. | |
| 402 | +% | |
| 403 | +One time a test cheated on Chuck Norris. | |
| 404 | +% | |
| 405 | +Only Chuck Norris can win the mind game, 'cause he never minds. | |
| 406 | +% | |
| 407 | +Only Chuck Norris is stronger than an Altoid. | |
| 408 | +% | |
| 409 | +Outer space exists because it's afraid to be on the same planet with Chuck Norris. | |
| 410 | +% | |
| 411 | +Ozzy Osbourne once accidentally bit the head off a live bat - Chuck Norris once deliberately bit the head off a live pterodactyl. | |
| 412 | +% | |
| 413 | +Pluto is actually an orbiting group of British soldiers from the American Revolution who entered space after the Chuck gave them a roundhouse kick to the face. | |
| 414 | +% | |
| 415 | +Police label anyone attacking Chuck Norris as a Code 45-11.... a suicide. | |
| 416 | +% | |
| 417 | +Remember the Soviet Union? They decided to quit after watching a DeltaForce marathon on Satellite TV. | |
| 418 | +% | |
| 419 | +Simon doesn't say... Chuck Norris says. | |
| 420 | +% | |
| 421 | +Some boots were made for walking. Some boots may walk all over you, but Chuck Norris' boots walk THROUGH you. | |
| 422 | +% | |
| 423 | +Some kids pee their name in snow. Chuck Norris pees his name in concrete. | |
| 424 | +% | |
| 425 | +Some people ask for a Kleenex when they sneeze, Chuck Norris asks for a body bag. | |
| 426 | +% | |
| 427 | +Someone once videotaped Chuck Norris getting pissed off. It was called Walker: Texas Chain Saw Massacre. | |
| 428 | +% | |
| 429 | +Staring at Chuck Norris for extended periods of time without proper eye protection will cause blindness, and possibly foot sized bruises on the face. | |
| 430 | +% | |
| 431 | +Taking Karate Lessons = $100, Buying MMA DVD's = $150, Subscribing to a UFC event = $50, Getting a Roundhouse Kick from Chuck Norris = PRICELESS. | |
| 432 | +% | |
| 433 | +That's not an eclipse. That's the sun hiding from Chuck Norris. | |
| 434 | +% | |
| 435 | +The Beatles are on iTunes because Chuck Norris bought a Mac. | |
| 436 | +% | |
| 437 | +The Earth is made up of two-thirds water and one-third Chuck Norris. | |
| 438 | +% | |
| 439 | +The Earth was almost destroyed by a 50 km wide asteroid in 1984, but Chuck Norris roundhouse kicked it into the Sun. | |
| 440 | +% | |
| 441 | +The Great Wall of China was originally created to keep Chuck Norris out. It failed miserably. | |
| 442 | +% | |
| 443 | +The Joneses are trying to keep up with Chuck Norris. | |
| 444 | +% | |
| 445 | +The Matrix Trilogy would have ended on the first movie had Keanu Reeves said, โI know Chuck Norris.โ | |
| 446 | +% | |
| 447 | +The answer to life, the universe and everything isn't 42. It's Chuck Norris. | |
| 448 | +% | |
| 449 | +The apple falls far from the tree, when Chuck's roundhouse kick is taken to the trunk. | |
| 450 | +% | |
| 451 | +The best part of waking up is not Folgers in your cup. it's knowing that Chuck Norris let you live. | |
| 452 | +% | |
| 453 | +The chief export of Chuck Norris is pain. | |
| 454 | +% | |
| 455 | +The dictionary references Chuck Norris several times, he is mentioned under Fear, Law, Order and Chucktatorship. | |
| 456 | +% | |
| 457 | +The leading causes of death in the United States are: 1. Heart Disease 2. Chuck Norris 3. Cancer. | |
| 458 | +% | |
| 459 | +The letters in Chuck Norris cannot be unscrambled. | |
| 460 | +% | |
| 461 | +The only place where the Starship Enterprise refuses to boldly go is Chuck Norris' planet... which is all of them. | |
| 462 | +% | |
| 463 | +The only reason that USA lost the 2011 world cup to Japan is because Chuck Norris wasn't there. | |
| 464 | +% | |
| 465 | +The only sure things are Death and Taxes, and when Chuck Norris goes to work for the IRS, they'll be the same thing. | |
| 466 | +% | |
| 467 | +The only way sharks will come near CN underwater is when CN is inside of a cage. | |
| 468 | +% | |
| 469 | +The only word that rhymes with orange is Chuck Norris. | |
| 470 | +% | |
| 471 | +The producers of the movie "The Last Airbender" are now in talks with Chuck Norris in Order to star him in their next sequel "The Last Skull Bender". | |
| 472 | +% | |
| 473 | +The quickest way to a man's heart is with Chuck Norris' fist. | |
| 474 | +% | |
| 475 | +The reason why Batman only comes out at night is because he's afraid he might encounter Chuck Norris in the morning and afternoon. | |
| 476 | +% | |
| 477 | +The red phone in the oval office rings directly to Chuck Norris' cell phone. | |
| 478 | +% | |
| 479 | +The show Survivor had the original premise of putting people on an island with Chuck Norris. There were no survivors, and nobody is brave enough to go to the island to retrieve the footage. | |
| 480 | +% | |
| 481 | +The square root of Chuck Norris is pain. Do not try to square Chuck Norris. The result is death. | |
| 482 | +% | |
| 483 | +The sun only rises every morning because Chuck Norris allows it to. | |
| 484 | +% | |
| 485 | +The truth hurts, doesn't it? Chuck Norris' truth kills. | |
| 486 | +% | |
| 487 | +There is no chin behind Chuck Norris' beard. There is only another fist. | |
| 488 | +% | |
| 489 | +There is no limbo, only a world that doesn't know of Chuck Norris. | |
| 490 | +% | |
| 491 | +There is no such thing as global warming. Chuck Norris was cold, so he turned the sun up. | |
| 492 | +% | |
| 493 | +There is no theory of evolution, just a list of creatures Chuck Norris has allowed to live. | |
| 494 | +% | |
| 495 | +This one time at band camp... BAM! Chuck Norris. | |
| 496 | +% | |
| 497 | +Those who ignore history, are doomed by Chuck Norris. | |
| 498 | +% | |
| 499 | +Trick me once, shame on you, trick Chuck Norris.. rest in peace. | |
| 500 | +% | |
| 501 | +Unlike Jack Bauer, Chuck Norris doesn't need bullets. A quick roundhouse to the face kills twice as fast. | |
| 502 | +% | |
| 503 | +Walker: Texas Ranger went into syndication before the first episode was shot. | |
| 504 | +% | |
| 505 | +What was going through the minds of all of Chuck Norris' victims before they died? His shoe. | |
| 506 | +% | |
| 507 | +Whatever Chuck Norris wants, it will instantly appear. | |
| 508 | +% | |
| 509 | +When Betty White gets angry, she turns into the Hulk. When Valerie Bertinelli gets mad, she turns into Chuck Norris. | |
| 510 | +% | |
| 511 | +When Chuck Norris creates a login, it tells him "password not strong enough." He types in his name and it tells him "password too strong." | |
| 512 | +% | |
| 513 | +When Chuck Norris does a pushup, he isn't lifting himself up, he's pushing the Earth down. | |
| 514 | +% | |
| 515 | +When Chuck Norris drinks water, the water automatically pasteurized. | |
| 516 | +% | |
| 517 | +When Chuck Norris goes to Vegas, he doesn't have to gamble. The casinos just give him stacks of money. | |
| 518 | +% | |
| 519 | +When Chuck Norris goes to rodeos, bulls ride him. | |
| 520 | +% | |
| 521 | +When Chuck Norris goes to the library, he looks for the Guinness book of records in the comedy section. | |
| 522 | +% | |
| 523 | +When Chuck Norris inhales helium, his voice doesn't change. | |
| 524 | +% | |
| 525 | +When Chuck Norris performs a roundhouse kick, he's actually measuring the circumference of the universe. | |
| 526 | +% | |
| 527 | +When Chuck Norris played the card game War with a friend, France surrendered. | |
| 528 | +% | |
| 529 | +When Chuck Norris pokes the Pillsbury Doughboy, it's not a laughing matter. | |
| 530 | +% | |
| 531 | +When Chuck Norris roundhouse-kicks you, he decides when you will feel the impact. | |
| 532 | +% | |
| 533 | +When Chuck Norris sends in his taxes, he sends blank forms and includes only a picture of himself, crouched and ready to attack. Chuck Norris has not had to pay taxes, ever. | |
| 534 | +% | |
| 535 | +When Chuck Norris tosses a coin, it lands on both heads and tails. | |
| 536 | +% | |
| 537 | +When God said "Let there be light!", Chuck Norris said "Only for half the day." | |
| 538 | +% | |
| 539 | +When Presidents speak, their nation listens. When Chuck Norris blinks, the whole world listens. | |
| 540 | +% | |
| 541 | +When Steven Seagal kills a ninja, he only takes its hide. When Chuck Norris kills a ninja, he uses every part. | |
| 542 | +% | |
| 543 | +When chuck Norris was in school, he made his PE teacher run laps. | |
| 544 | +% | |
| 545 | +When does Chuck Norris run out of shotgun bullets? whenever he wants to. | |
| 546 | +% | |
| 547 | +When taking the SAT, write "Chuck Norris" for every answer. You will score over 8000. | |
| 548 | +% | |
| 549 | +When the Boogeyman goes to sleep every night, he checks his closet for Chuck Norris. | |
| 550 | +% | |
| 551 | +When things go bump in the night, it's Chuck Norris | |
| 552 | +% | |
| 553 | +While visiting the Hexagon, Chuck Norris was asked to demonstrate his famous roundhouse kick. Henceforth, it has been known as the Pentagon. | |
| 554 | +% | |
| 555 | +Why didn't the chicken cross the road? Because Chuck Norris got to it first. | |
| 556 | +% | |
| 557 | +You know Chuck Norris' pet lizard, right? Last I heard, he was in the movie "Godzilla". Oh, and his pet turtle starred in "Gamera" as well. | |
| 558 | +% | |
| 559 | +http://chucknorrisfacts.com/ is built in Drupal because Chuck Norris knows a good CMS when he sees one. | |
| 560 | +% | |
| 561 | +Chuck Norris made the first Giraffe by uppercutting a horse. | |
| 562 | +% | |
| 563 | +Chuck Norris can hear sign language. | |
| 564 | +% | |
| 565 | +Chuck Norris make onions cry. | |
| 566 | +% | |
| 567 | +Chuck Norris doesn't shake hands, he makes them tremble. | |
| 568 | +% |
+58-0.oh-my-zsh/plugins/cloudfoundry/README.md
| @@ -0,0 +1,58 @@ | ||
| 1 | +# Cloudfoundry Plugin | |
| 2 | + | |
| 3 | +This plugin is intended to offer a few simple aliases for regular users of the [Cloud Foundry Cli][1]. Most are just simple aliases that will save a bit of typing. Others include mini functions and or accept parameters. Take a look at the table below for details. | |
| 4 | + | |
| 5 | +| Alias | Command | Description | | |
| 6 | +|----------|-----------------------------|--------------------------------------------------------------------------| | |
| 7 | +| cfl | `cf login` | Login to Cloud Foundry | | |
| 8 | +| cft | `cf target` | Target the cli at a specific Org/Space in Cloud Foundry | | |
| 9 | +| cfa | `cf apps` | List all applications in the current Org/Space | | |
| 10 | +| cfs | `cf services` | List all services in the current Org/Space | | |
| 11 | +| cfm | `cf marketplace` | List the services available in the Marketplace | | |
| 12 | +| cfp | `cf push` | Push your application code to Cloud Foundry | | |
| 13 | +| cfcs | `cf create-service` | Create a service based on a Marketplace offering | | |
| 14 | +| cfbs | `cf bind-service` | Bind an application to a service you created | | |
| 15 | +| cfus | `cf unbind-service` | Unbind a service from an application | | |
| 16 | +| cfds | `cf delete-service` | Delete a service you no longer have bound | | |
| 17 | +| cfup | `cf cups` | Create a "user-provided-service" | | |
| 18 | +| cflg | `cf logs` | Tail the logs of an application (requires <APP_NAME>) | | |
| 19 | +| cfr | `cf routes` | List all the routes in the current Space | | |
| 20 | +| cfe | `cf env` | Show the environment variables for an application (requires <APP_NAME>) | | |
| 21 | +| cfsh | `cf ssh` | Attach to a running container (requires an <APP_NAME> etc.) | | |
| 22 | +| cfsc | `cf scale` | Scale an application (requires an <APP_NAME> etc.) | | |
| 23 | +| cfev | `cf events` | Show the application events (requires <APP_NAME>) | | |
| 24 | +| cfdor | `cf delete-orphaned-routes` | Delete routes that are no longer bound to applications | | |
| 25 | +| cfbpk | `cf buildpacks` | List the available buildpacks | | |
| 26 | +| cfdm | `cf domains` | List the domains associates with this Cloud Foundry foundation | | |
| 27 | +| cfsp | `cf spaces` | List all the Spaces in the current Org | | |
| 28 | +| cfap | `cf app` | Show the details of a deployed application (requires <APP_NAME>) | | |
| 29 | +| cfh. | `export CF_HOME=$PWD/.cf` | Set the current directory as CF_HOME | | |
| 30 | +| cfh~ | `export CF_HOME=~/.cf` | Set the user's root directory as CF_HOME | | |
| 31 | +| cfhu | `unset CF_HOME` | Unsets CF_HOME | | |
| 32 | +| cfpm | `cf push -f` | Push an application using a manifest (requires <MANIFEST_FILE> location) | | |
| 33 | +| cflr | `cf logs --recent` | Show the recent logs (requires <APP_NAME>) | | |
| 34 | +| cfsrt | `cf start` | Start an application (requires <APP_NAME>) | | |
| 35 | +| cfstp | `cf stop` | Stop an application (requires <APP_NAME>) | | |
| 36 | +| cfstg | `cf restage` | Restage an application (requires <APP_NAME>) | | |
| 37 | +| cfdel | `cf delete` | Delete an application (requires <APP_NAME>) | | |
| 38 | +| cfsrtall | - | Start all apps that are currently in the "Stopped" state | | |
| 39 | +| cfstpall | - | Stop all apps that are currently in the "Started" state | | |
| 40 | + | |
| 41 | +For help and advice on what any of the commands does, consult the built in `cf` help functions as follows:- | |
| 42 | + | |
| 43 | +```bash | |
| 44 | +cf help # List the most popular and commonly used commands | |
| 45 | +cf help -a # Complete list of all possible commands | |
| 46 | +cf <COMMAND_NAME> --help # Help on a specific command including arguments and examples | |
| 47 | +``` | |
| 48 | + | |
| 49 | +Alternatively, seek out the [online documentation][3]. And don't forget, there are loads of great [community plugins for the cf-cli][4] command line tool that can greatly extend its power and usefulness. | |
| 50 | + | |
| 51 | +## Contributors | |
| 52 | + | |
| 53 | +Contributed to `oh_my_zsh` by [benwilcock][2]. | |
| 54 | + | |
| 55 | +[1]: https://docs.cloudfoundry.org/cf-cli/install-go-cli.html | |
| 56 | +[2]: https://github.com/benwilcock | |
| 57 | +[3]: https://docs.cloudfoundry.org/cf-cli/getting-started.html | |
| 58 | +[4]: https://plugins.cloudfoundry.org/ |
+34-0.oh-my-zsh/plugins/cloudfoundry/cloudfoundry.plugin.zsh
| @@ -0,0 +1,34 @@ | ||
| 1 | +# Some Useful CloudFoundry Aliases & Functions | |
| 2 | +alias cfl="cf login" | |
| 3 | +alias cft="cf target" | |
| 4 | +alias cfa="cf apps" | |
| 5 | +alias cfs="cf services" | |
| 6 | +alias cfm="cf marketplace" | |
| 7 | +alias cfp="cf push" | |
| 8 | +alias cfcs="cf create-service" | |
| 9 | +alias cfbs="cf bind-service" | |
| 10 | +alias cfus="cf unbind-service" | |
| 11 | +alias cfds="cf delete-service" | |
| 12 | +alias cfup="cf cups" | |
| 13 | +alias cflg="cf logs" | |
| 14 | +alias cfr="cf routes" | |
| 15 | +alias cfe="cf env" | |
| 16 | +alias cfsh="cf ssh" | |
| 17 | +alias cfsc="cf scale" | |
| 18 | +alias cfev="cf events" | |
| 19 | +alias cfdor="cf delete-orphaned-routes" | |
| 20 | +alias cfbpk="cf buildpacks" | |
| 21 | +alias cfdm="cf domains" | |
| 22 | +alias cfsp="cf spaces" | |
| 23 | +function cfap() { cf app $1 } | |
| 24 | +function cfh.() { export CF_HOME=$PWD/.cf } | |
| 25 | +function cfh~() { export CF_HOME=~/.cf } | |
| 26 | +function cfhu() { unset CF_HOME } | |
| 27 | +function cfpm() { cf push -f $1 } | |
| 28 | +function cflr() { cf logs $1 --recent } | |
| 29 | +function cfsrt() { cf start $1 } | |
| 30 | +function cfstp() { cf stop $1 } | |
| 31 | +function cfstg() { cf restage $1 } | |
| 32 | +function cfdel() { cf delete $1 } | |
| 33 | +function cfsrtall() {cf apps | awk '/stopped/ { system("cf start " $1)}'} | |
| 34 | +function cfstpall() {cf apps | awk '/started/ { system("cf stop " $1)}'} |
+8-0.oh-my-zsh/plugins/codeclimate/README.md
| @@ -0,0 +1,8 @@ | ||
| 1 | +# codeclimate plugin | |
| 2 | + | |
| 3 | +This plugin adds autocompletion for the [`codeclimate` CLI](https://github.com/codeclimate/codeclimate). | |
| 4 | + | |
| 5 | +To use it, add `codeclimate` to the plugins array in your zshrc file: | |
| 6 | +```zsh | |
| 7 | +plugins=(... codeclimate) | |
| 8 | +``` |
+82-0.oh-my-zsh/plugins/codeclimate/_codeclimate
| @@ -0,0 +1,82 @@ | ||
| 1 | +#compdef codeclimate | |
| 2 | + | |
| 3 | +_codeclimate_all_engines() { | |
| 4 | + engines_all=(`codeclimate engines:list | tail -n +2 | gawk '{ print $2 }' | gawk -F: '{ print $1 }'`) | |
| 5 | +} | |
| 6 | + | |
| 7 | +_codeclimate_installed_engines() { | |
| 8 | + _codeclimate_all_engines | |
| 9 | + | |
| 10 | + engines_installed=() | |
| 11 | + | |
| 12 | + if [ -e .codeclimate.yml ] | |
| 13 | + then | |
| 14 | + for engine in $engines_all | |
| 15 | + do | |
| 16 | + if grep -q $engine ".codeclimate.yml" | |
| 17 | + then | |
| 18 | + engines_installed+=$engine | |
| 19 | + fi | |
| 20 | + done | |
| 21 | + fi | |
| 22 | +} | |
| 23 | + | |
| 24 | +_codeclimate_not_installed_engines() { | |
| 25 | + _codeclimate_all_engines | |
| 26 | + | |
| 27 | + engines_not_installed=() | |
| 28 | + | |
| 29 | + if [ -e .codeclimate.yml ] | |
| 30 | + then | |
| 31 | + for engine in $engines_all | |
| 32 | + do | |
| 33 | + if ! grep -q $engine ".codeclimate.yml" | |
| 34 | + then | |
| 35 | + engines_not_installed+=$engine | |
| 36 | + fi | |
| 37 | + done | |
| 38 | + fi | |
| 39 | +} | |
| 40 | + | |
| 41 | +local curcontext="$curcontext" state line ret=1 | |
| 42 | +local expl | |
| 43 | +local -a engines_all engines_installed engines_not_installed | |
| 44 | + | |
| 45 | +_arguments \ | |
| 46 | + '1: :->cmds' \ | |
| 47 | + '*:: :->args' && ret=0 | |
| 48 | + | |
| 49 | +case $state in | |
| 50 | + cmds) | |
| 51 | + _values "bundle command" \ | |
| 52 | + "analyze[Analyze all relevant files in the current working directory]" \ | |
| 53 | + "console[Start an interactive session providing access to the classes within the CLI]" \ | |
| 54 | + "engines\:disable[Prevents the engine from being used in this project]" \ | |
| 55 | + "engines\:enable[This engine will be run the next time your project is analyzed]" \ | |
| 56 | + "engines\:install[Compares the list of engines in your .codeclimate.yml file to those that are currently installed, then installs any missing engines]" \ | |
| 57 | + "engines\:list[Lists all available engines in the Code Climate Docker Hub]" \ | |
| 58 | + "engines\:remove[Removes an engine from your .codeclimate.yml file]" \ | |
| 59 | + "help[Displays a list of commands that can be passed to the Code Climate CLI]" \ | |
| 60 | + "init[Generates a new .codeclimate.yml file in the current working directory]" \ | |
| 61 | + "validate-config[Validates the .codeclimate.yml file in the current working directory]" \ | |
| 62 | + "version[Displays the current version of the Code Climate CLI]" | |
| 63 | + ret=0 | |
| 64 | + ;; | |
| 65 | + args) | |
| 66 | + case $line[1] in | |
| 67 | + engines:enable) | |
| 68 | + _codeclimate_not_installed_engines | |
| 69 | + _wanted engines_not_installed expl 'not installed engines' compadd -a engines_not_installed ;; | |
| 70 | + engines:disable|engines:remove) | |
| 71 | + _codeclimate_installed_engines | |
| 72 | + _wanted engines_installed expl 'installed engines' compadd -a engines_installed ;; | |
| 73 | + analyze) | |
| 74 | + _arguments \ | |
| 75 | + '-f:Output Format:(text json)' | |
| 76 | + ret=0 | |
| 77 | + ;; | |
| 78 | + esac | |
| 79 | + ;; | |
| 80 | +esac | |
| 81 | + | |
| 82 | +return ret |
+31-0.oh-my-zsh/plugins/coffee/README.md
| @@ -0,0 +1,31 @@ | ||
| 1 | +# Coffeescript Plugin | |
| 2 | + | |
| 3 | +This plugin provides aliases for quickly compiling and previewing your | |
| 4 | +coffeescript code. | |
| 5 | + | |
| 6 | +When writing Coffeescript it's very common to want to preview the output of a | |
| 7 | +certain snippet of code, either because you want to test the output or because | |
| 8 | +you'd like to execute it in a browser console which doesn't accept Coffeescript. | |
| 9 | + | |
| 10 | +Preview the compiled result of your coffeescript with `cf "code"` as per the | |
| 11 | +following: | |
| 12 | + | |
| 13 | +```zsh | |
| 14 | +$ cf 'if a then b else c' | |
| 15 | +if (a) { | |
| 16 | + b; | |
| 17 | +} else { | |
| 18 | + c; | |
| 19 | +} | |
| 20 | +``` | |
| 21 | + | |
| 22 | +Also provides the following aliases: | |
| 23 | + | |
| 24 | +* **cfc:** Copies the compiled JS to your clipboard. Very useful when you want | |
| 25 | + to run the code in a JS console. | |
| 26 | + | |
| 27 | +* **cfp:** Compiles from your currently copied clipboard. Useful when you want | |
| 28 | + to compile large/multi-line snippets | |
| 29 | + | |
| 30 | +* **cfpc:** Paste coffeescript from clipboard, compile to JS, then copy the | |
| 31 | + the result back to clipboard. |
+81-0.oh-my-zsh/plugins/coffee/_coffee
| @@ -0,0 +1,81 @@ | ||
| 1 | +#compdef coffee | |
| 2 | +# ------------------------------------------------------------------------------ | |
| 3 | +# Copyright (c) 2011 GitHub zsh-users - https://github.com/zsh-users | |
| 4 | +# All rights reserved. | |
| 5 | +# | |
| 6 | +# Redistribution and use in source and binary forms, with or without | |
| 7 | +# modification, are permitted provided that the following conditions are met: | |
| 8 | +# * Redistributions of source code must retain the above copyright | |
| 9 | +# notice, this list of conditions and the following disclaimer. | |
| 10 | +# * Redistributions in binary form must reproduce the above copyright | |
| 11 | +# notice, this list of conditions and the following disclaimer in the | |
| 12 | +# documentation and/or other materials provided with the distribution. | |
| 13 | +# * Neither the name of the zsh-users nor the | |
| 14 | +# names of its contributors may be used to endorse or promote products | |
| 15 | +# derived from this software without specific prior written permission. | |
| 16 | +# | |
| 17 | +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
| 18 | +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
| 19 | +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| 20 | +# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY | |
| 21 | +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
| 22 | +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
| 23 | +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
| 24 | +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 25 | +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
| 26 | +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 27 | +# ------------------------------------------------------------------------------ | |
| 28 | +# Description | |
| 29 | +# ----------- | |
| 30 | +# | |
| 31 | +# Completion script for Coffee.js v0.6.11 (https://coffeescript.org) | |
| 32 | +# | |
| 33 | +# ------------------------------------------------------------------------------ | |
| 34 | +# Authors | |
| 35 | +# ------- | |
| 36 | +# | |
| 37 | +# * Mario Fernandez (https://github.com/sirech) | |
| 38 | +# * Dong Weiming (https://github.com/dongweiming) | |
| 39 | +# | |
| 40 | +# ------------------------------------------------------------------------------ | |
| 41 | + | |
| 42 | +local curcontext="$curcontext" state line ret=1 version | |
| 43 | +local -a opts | |
| 44 | +typeset -A opt_args | |
| 45 | +version=(${(f)"$(_call_program version $words[1] --version)"}) || return ret | |
| 46 | +version=${${(z)${version[1]}}[3]} | |
| 47 | + | |
| 48 | +autoload -Uz is-at-least | |
| 49 | +if ! is-at-least 1.6.3 "$version"; then | |
| 50 | + opts+=('(-l --lint)'{-l,--lint}'[pipe the compiled JavaScript through JavaScript Lint]' | |
| 51 | + '(-r --require)'{-r,--require}'[require a library before executing your script]:library') | |
| 52 | +fi | |
| 53 | + | |
| 54 | + | |
| 55 | +_arguments -C \ | |
| 56 | + '(- *)'{-h,--help}'[display this help message]' \ | |
| 57 | + '(- *)'{-v,--version}'[display the version number]' \ | |
| 58 | + $opts \ | |
| 59 | + '(-b --bare)'{-b,--bare}'[compile without a top-level function wrapper]' \ | |
| 60 | + '(-e --eval)'{-e,--eval}'[pass a string from the command line as input]:Inline Script' \ | |
| 61 | + '(-i --interactive)'{-i,--interactive}'[run an interactive CoffeeScript REPL]' \ | |
| 62 | + '(-j --join)'{-j,--join}'[concatenate the source CoffeeScript before compiling]:Destination JS file:_files -g "*.js"' \ | |
| 63 | + '(--nodejs)--nodejs[pass options directly to the "node" binary]' \ | |
| 64 | + '(-c --compile)'{-c,--compile}'[compile to JavaScript and save as .js files]' \ | |
| 65 | + '(-o --output)'{-o,--output}'[set the output directory for compiled JavaScript]:Output Directory:_files -/' \ | |
| 66 | + '(-n -t -p)'{-n,--nodes}'[print out the parse tree that the parser produces]' \ | |
| 67 | + '(-n -t -p)'{-p,--print}'[print out the compiled JavaScript]' \ | |
| 68 | + '(-n -t -p)'{-t,--tokens}'[print out the tokens that the lexer/rewriter produce]' \ | |
| 69 | + '(-s --stdio)'{-s,--stdio}'[listen for and compile scripts over stdio]' \ | |
| 70 | + '(-w --watch)'{-w,--watch}'[watch scripts for changes and rerun commands]' \ | |
| 71 | + '*:script or directory:_files' && ret=0 | |
| 72 | + | |
| 73 | +return ret | |
| 74 | + | |
| 75 | +# Local Variables: | |
| 76 | +# mode: Shell-Script | |
| 77 | +# sh-indentation: 2 | |
| 78 | +# indent-tabs-mode: nil | |
| 79 | +# sh-basic-offset: 2 | |
| 80 | +# End: | |
| 81 | +# vim: ft=zsh sw=2 ts=2 et |
+16-0.oh-my-zsh/plugins/coffee/coffee.plugin.zsh
| @@ -0,0 +1,16 @@ | ||
| 1 | +#!/bin/zsh | |
| 2 | + | |
| 3 | +# compile a string of coffeescript and print to output | |
| 4 | +cf () { | |
| 5 | + coffee -peb "$1" | |
| 6 | +} | |
| 7 | +# compile & copy to clipboard | |
| 8 | +cfc () { | |
| 9 | + cf "$1" | clipcopy | |
| 10 | +} | |
| 11 | + | |
| 12 | +# compile from clipboard & print | |
| 13 | +alias cfp='cf "$(clippaste)"' | |
| 14 | + | |
| 15 | +# compile from clipboard and copy to clipboard | |
| 16 | +alias cfpc='cfp | clipcopy' |
+1-0.oh-my-zsh/plugins/colemak/.gitignore
| @@ -0,0 +1 @@ | ||
| 1 | +.less |
+48-0.oh-my-zsh/plugins/colemak/README.md
| @@ -0,0 +1,48 @@ | ||
| 1 | +# Colemak plugin | |
| 2 | + | |
| 3 | +This plugin remaps keys in `zsh`'s [`vi`-style navigation mode](http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Keymaps) | |
| 4 | +for a [Colemak](https://colemak.com/) keyboard layout, to match the QWERTY position: | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | +To use it, add it to the plugins array in your `~/.zshrc` file: | |
| 9 | + | |
| 10 | +``` | |
| 11 | +plugins=(... colemak) | |
| 12 | +``` | |
| 13 | + | |
| 14 | +You will also need to enable `vi` mode, so add another line to `~/.zshrc`: | |
| 15 | +``` | |
| 16 | +bindkey -v | |
| 17 | +``` | |
| 18 | + | |
| 19 | +Restart your shell and hit the `<ESC>` key to activate `vicmd` (navigation) mode, | |
| 20 | +and start navigating `zsh` with your new keybindings! | |
| 21 | + | |
| 22 | +## Key bindings for vicmd | |
| 23 | + | |
| 24 | +| Old | New | Binding | Description | | |
| 25 | +|------------|------------|---------------------------|----------------------------------------------------| | |
| 26 | +| `CTRL`+`j` | `CTRL`+`n` | accept-line | Insert new line | | |
| 27 | +| `j` | `n` | down-line-or-history | Move one line down or command history forwards | | |
| 28 | +| `k` | `e` | up-line-or-history | Move one line up or command history backwards | | |
| 29 | +| `l` | `i` | vi-forward-char | Move one character to the right | | |
| 30 | +| `n` | `k` | vi-repeat-search | Repeat command search forwards | | |
| 31 | +| `N` | `K` | vi-rev-repeat-search | Repeat command search backwards | | |
| 32 | +| `i` | `u` | vi-insert | Enter insert mode | | |
| 33 | +| `I` | `U` | vi-insert-bol | Move to first non-blank char and enter insert mode | | |
| 34 | +| `<none>` | `l` | vi-undo-change | Undo change | | |
| 35 | +| `J` | `N` | vi-join | Join the current line with the next one | | |
| 36 | +| `e` | `j` | vi-forward-word-end | Move to the end of the next word | | |
| 37 | +| `E` | `J` | vi-forward-blank-word-end | Move to end of the current or next word | | |
| 38 | + | |
| 39 | +## Key bindings for less | |
| 40 | + | |
| 41 | +| Keyboard shortcut | `less` key binding | | |
| 42 | +|-------------------|--------------------| | |
| 43 | +| `n` | forw-line | | |
| 44 | +| `e` | back-line | | |
| 45 | +| `k` | repeat-search | | |
| 46 | +| `ESC`+`k` | repeat-search-all | | |
| 47 | +| `K` | reverse-search | | |
| 48 | +| `ESC`+`K` | reverse-search-all | |
+6-0.oh-my-zsh/plugins/colemak/colemak-less
| @@ -0,0 +1,6 @@ | ||
| 1 | +n forw-line | |
| 2 | +e back-line | |
| 3 | +k repeat-search | |
| 4 | +\ek repeat-search-all | |
| 5 | +K reverse-search | |
| 6 | +\eK reverse-search-all |
+38-0.oh-my-zsh/plugins/colemak/colemak.plugin.zsh
| @@ -0,0 +1,38 @@ | ||
| 1 | +# ctrl-j newline | |
| 2 | +bindkey '^n' accept-line | |
| 3 | +bindkey -a '^n' accept-line | |
| 4 | + | |
| 5 | +# another rotation to match qwerty | |
| 6 | +bindkey -a 'n' down-line-or-history | |
| 7 | +bindkey -a 'e' up-line-or-history | |
| 8 | +bindkey -a 'i' vi-forward-char | |
| 9 | + | |
| 10 | +# make qwerty | |
| 11 | +bindkey -a 'k' vi-repeat-search | |
| 12 | +bindkey -a 'K' vi-rev-repeat-search | |
| 13 | +bindkey -a 'u' vi-insert | |
| 14 | +bindkey -a 'U' vi-insert-bol | |
| 15 | +bindkey -a 'l' vi-undo-change | |
| 16 | +bindkey -a 'N' vi-join | |
| 17 | + | |
| 18 | +# spare | |
| 19 | +bindkey -a 'j' vi-forward-word-end | |
| 20 | +bindkey -a 'J' vi-forward-blank-word-end | |
| 21 | + | |
| 22 | +# Handle $0 according to the standard: | |
| 23 | +# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html | |
| 24 | +0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" | |
| 25 | +0="${${(M)0:#/*}:-$PWD/$0}" | |
| 26 | + | |
| 27 | +# New less versions will read this file directly | |
| 28 | +export LESSKEYIN="${0:h:A}/colemak-less" | |
| 29 | + | |
| 30 | +# Only run lesskey if less version is older than v582 | |
| 31 | +less_ver=$(less --version | awk '{print $2;exit}') | |
| 32 | +autoload -Uz is-at-least | |
| 33 | +if ! is-at-least 582 $less_ver; then | |
| 34 | + # Old less versions will read this transformed file | |
| 35 | + export LESSKEY="${0:h:A}/.less" | |
| 36 | + lesskey -o "$LESSKEY" "$LESSKEYIN" 2>/dev/null | |
| 37 | +fi | |
| 38 | +unset less_ver |
+32-0.oh-my-zsh/plugins/colored-man-pages/README.md
| @@ -0,0 +1,32 @@ | ||
| 1 | +# Colored man pages plugin | |
| 2 | + | |
| 3 | +This plugin adds colors to man pages. | |
| 4 | + | |
| 5 | +To use it, add `colored-man-pages` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... colored-man-pages) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +It will also automatically colorize man pages displayed by `dman` or `debman`, | |
| 12 | +from [`debian-goodies`](https://packages.debian.org/stable/debian-goodies). | |
| 13 | + | |
| 14 | +You can also try to color other pages by prefixing the respective command with `colored`: | |
| 15 | + | |
| 16 | +```zsh | |
| 17 | +colored git help clone | |
| 18 | +``` | |
| 19 | + | |
| 20 | +## Customization | |
| 21 | + | |
| 22 | +The plugin declares global associative array `less_termcap`, which maps termcap capabilities to escape | |
| 23 | +sequences for the `less` pager. This mapping can be further customized by the user after the plugin is | |
| 24 | +loaded. Check out sources for more. | |
| 25 | + | |
| 26 | +For example: `less_termcap[md]` maps to `LESS_TERMCAP_md` which is the escape sequence that tells `less` | |
| 27 | +how to print something in bold. It's currently shown in bold red, but if you want to change it, you | |
| 28 | +can redefine `less_termcap[md]` in your zshrc file, after OMZ is sourced: | |
| 29 | + | |
| 30 | +```zsh | |
| 31 | +less_termcap[md]="${fg_bold[blue]}" # this tells less to print bold text in bold blue | |
| 32 | +``` |
+54-0.oh-my-zsh/plugins/colored-man-pages/colored-man-pages.plugin.zsh
| @@ -0,0 +1,54 @@ | ||
| 1 | +# Requires colors autoload. | |
| 2 | +# See termcap(5). | |
| 3 | + | |
| 4 | +# Set up once, and then reuse. This way it supports user overrides after the | |
| 5 | +# plugin is loaded. | |
| 6 | +typeset -AHg less_termcap | |
| 7 | + | |
| 8 | +# bold & blinking mode | |
| 9 | +less_termcap[mb]="${fg_bold[red]}" | |
| 10 | +less_termcap[md]="${fg_bold[red]}" | |
| 11 | +less_termcap[me]="${reset_color}" | |
| 12 | +# standout mode | |
| 13 | +less_termcap[so]="${fg_bold[yellow]}${bg[blue]}" | |
| 14 | +less_termcap[se]="${reset_color}" | |
| 15 | +# underlining | |
| 16 | +less_termcap[us]="${fg_bold[green]}" | |
| 17 | +less_termcap[ue]="${reset_color}" | |
| 18 | + | |
| 19 | +# Handle $0 according to the standard: | |
| 20 | +# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html | |
| 21 | +0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" | |
| 22 | +0="${${(M)0:#/*}:-$PWD/$0}" | |
| 23 | + | |
| 24 | +# Absolute path to this file's directory. | |
| 25 | +typeset -g __colored_man_pages_dir="${0:A:h}" | |
| 26 | + | |
| 27 | +function colored() { | |
| 28 | + local -a environment | |
| 29 | + | |
| 30 | + # Convert associative array to plain array of NAME=VALUE items. | |
| 31 | + local k v | |
| 32 | + for k v in "${(@kv)less_termcap}"; do | |
| 33 | + environment+=( "LESS_TERMCAP_${k}=${v}" ) | |
| 34 | + done | |
| 35 | + | |
| 36 | + # Prefer `less` whenever available, since we specifically configured | |
| 37 | + # environment for it. | |
| 38 | + environment+=( PAGER="${commands[less]:-$PAGER}" ) | |
| 39 | + environment+=( GROFF_NO_SGR=1 ) | |
| 40 | + | |
| 41 | + # See ./nroff script. | |
| 42 | + if [[ "$OSTYPE" = solaris* ]]; then | |
| 43 | + environment+=( PATH="${__colored_man_pages_dir}:$PATH" ) | |
| 44 | + fi | |
| 45 | + | |
| 46 | + command env $environment "$@" | |
| 47 | +} | |
| 48 | + | |
| 49 | +# Colorize man and dman/debman (from debian-goodies) | |
| 50 | +function man \ | |
| 51 | + dman \ | |
| 52 | + debman { | |
| 53 | + colored $0 "$@" | |
| 54 | +} |
+12-0.oh-my-zsh/plugins/colored-man-pages/nroff
| @@ -0,0 +1,12 @@ | ||
| 1 | +#!/bin/sh | |
| 2 | + | |
| 3 | +# The whole point of this wrapper is to replace emboldening factor -u0 with | |
| 4 | +# -u1 under certain circumstances on Solaris. | |
| 5 | + | |
| 6 | +if [ "$1,$2,$3" = "-u0,-Tlp,-man" ]; then | |
| 7 | + shift | |
| 8 | + exec /usr/bin/nroff -u1 "$@" | |
| 9 | +else | |
| 10 | + # Some other invocation of nroff | |
| 11 | + exec /usr/bin/nroff "$@" | |
| 12 | +fi |
+56-0.oh-my-zsh/plugins/colorize/README.md
| @@ -0,0 +1,56 @@ | ||
| 1 | +# colorize | |
| 2 | + | |
| 3 | +With this plugin you can syntax-highlight file contents of over 300 supported languages and other text formats. | |
| 4 | + | |
| 5 | +Colorize will highlight the content based on the filename extension. If it can't find a syntax-highlighting | |
| 6 | +method for a given extension, it will try to find one by looking at the file contents. If no highlight method | |
| 7 | +is found it will just cat the file normally, without syntax highlighting. | |
| 8 | + | |
| 9 | +## Setup | |
| 10 | + | |
| 11 | +To use it, add colorize to the plugins array of your `~/.zshrc` file: | |
| 12 | +``` | |
| 13 | +plugins=(... colorize) | |
| 14 | +``` | |
| 15 | + | |
| 16 | +## Configuration | |
| 17 | + | |
| 18 | +### Requirements | |
| 19 | + | |
| 20 | +This plugin requires that at least one of the following tools is installed: | |
| 21 | + | |
| 22 | +* [Chroma](https://github.com/alecthomas/chroma) | |
| 23 | +* [Pygments](https://pygments.org/download/) | |
| 24 | + | |
| 25 | +### Colorize tool | |
| 26 | + | |
| 27 | +Colorize supports `pygmentize` and `chroma` as syntax highlighter. By default colorize uses `pygmentize` unless it's not installed and `chroma` is. This can be overridden by the `ZSH_COLORIZE_TOOL` environment variable: | |
| 28 | + | |
| 29 | +``` | |
| 30 | +ZSH_COLORIZE_TOOL=chroma | |
| 31 | +``` | |
| 32 | + | |
| 33 | +### Styles | |
| 34 | + | |
| 35 | +Pygments offers multiple styles. By default, the `default` style is used, but you can choose another theme by setting the `ZSH_COLORIZE_STYLE` environment variable: | |
| 36 | + | |
| 37 | +``` | |
| 38 | +ZSH_COLORIZE_STYLE="colorful" | |
| 39 | +``` | |
| 40 | + | |
| 41 | +### Chroma Formatter Settings | |
| 42 | + | |
| 43 | +Chroma supports terminal output in 8 color, 256 color, and true-color. If you need to change the default terminal output style from the standard 8 color output, set the `ZSH_COLORIZE_CHROMA_FORMATTER` environment variable: | |
| 44 | + | |
| 45 | +``` | |
| 46 | +ZSH_COLORIZE_CHROMA_FORMATTER=terminal256 | |
| 47 | +``` | |
| 48 | + | |
| 49 | +## Usage | |
| 50 | + | |
| 51 | +* `ccat <file> [files]`: colorize the contents of the file (or files, if more than one are provided). | |
| 52 | + If no files are passed it will colorize the standard input. | |
| 53 | + | |
| 54 | +* `cless [less-options] <file> [files]`: colorize the contents of the file (or files, if more than one are provided) and open less. | |
| 55 | + If no files are passed it will colorize the standard input. | |
| 56 | + The LESSOPEN and LESSCLOSE will be overwritten for this to work, but only in a local scope. |
+114-0.oh-my-zsh/plugins/colorize/colorize.plugin.zsh
| @@ -0,0 +1,114 @@ | ||
| 1 | +# Easier alias to use the plugin | |
| 2 | +alias ccat="colorize_cat" | |
| 3 | +alias cless="colorize_less" | |
| 4 | + | |
| 5 | +# '$0:A' gets the absolute path of this file | |
| 6 | +ZSH_COLORIZE_PLUGIN_PATH=$0:A | |
| 7 | + | |
| 8 | +colorize_check_requirements() { | |
| 9 | + local -a available_tools | |
| 10 | + available_tools=("chroma" "pygmentize") | |
| 11 | + | |
| 12 | + if [ -z "$ZSH_COLORIZE_TOOL" ]; then | |
| 13 | + if (( $+commands[pygmentize] )); then | |
| 14 | + ZSH_COLORIZE_TOOL="pygmentize" | |
| 15 | + elif (( $+commands[chroma] )); then | |
| 16 | + ZSH_COLORIZE_TOOL="chroma" | |
| 17 | + else | |
| 18 | + echo "Neither 'pygments' nor 'chroma' is installed!" >&2 | |
| 19 | + return 1 | |
| 20 | + fi | |
| 21 | + fi | |
| 22 | + | |
| 23 | + if [[ ${available_tools[(Ie)$ZSH_COLORIZE_TOOL]} -eq 0 ]]; then | |
| 24 | + echo "ZSH_COLORIZE_TOOL '$ZSH_COLORIZE_TOOL' not recognized. Available options are 'pygmentize' and 'chroma'." >&2 | |
| 25 | + return 1 | |
| 26 | + elif ! (( $+commands[$ZSH_COLORIZE_TOOL] )); then | |
| 27 | + echo "Package '$ZSH_COLORIZE_TOOL' is not installed!" >&2 | |
| 28 | + return 1 | |
| 29 | + fi | |
| 30 | +} | |
| 31 | + | |
| 32 | +colorize_cat() { | |
| 33 | + if ! colorize_check_requirements; then | |
| 34 | + return 1 | |
| 35 | + fi | |
| 36 | + | |
| 37 | + # If the environment variable ZSH_COLORIZE_STYLE | |
| 38 | + # is set, use that theme instead. Otherwise, | |
| 39 | + # use the default. | |
| 40 | + if [ -z "$ZSH_COLORIZE_STYLE" ]; then | |
| 41 | + # Both pygmentize & chroma support 'emacs' | |
| 42 | + ZSH_COLORIZE_STYLE="emacs" | |
| 43 | + fi | |
| 44 | + | |
| 45 | + # Use stdin if stdin is not attached to a terminal. | |
| 46 | + if [ ! -t 0 ]; then | |
| 47 | + if [[ "$ZSH_COLORIZE_TOOL" == "pygmentize" ]]; then | |
| 48 | + pygmentize -O style="$ZSH_COLORIZE_STYLE" -g | |
| 49 | + else | |
| 50 | + chroma --style="$ZSH_COLORIZE_STYLE" --formatter="${ZSH_COLORIZE_CHROMA_FORMATTER:-terminal}" "$@" | |
| 51 | + fi | |
| 52 | + return $? | |
| 53 | + fi | |
| 54 | + | |
| 55 | + # Guess lexer from file extension, or guess it from file contents if unsuccessful. | |
| 56 | + local FNAME lexer | |
| 57 | + for FNAME in "$@"; do | |
| 58 | + if [[ "$ZSH_COLORIZE_TOOL" == "pygmentize" ]]; then | |
| 59 | + lexer=$(pygmentize -N "$FNAME") | |
| 60 | + if [[ $lexer != text ]]; then | |
| 61 | + pygmentize -O style="$ZSH_COLORIZE_STYLE" -l "$lexer" "$FNAME" | |
| 62 | + else | |
| 63 | + pygmentize -O style="$ZSH_COLORIZE_STYLE" -g "$FNAME" | |
| 64 | + fi | |
| 65 | + else | |
| 66 | + chroma --style="$ZSH_COLORIZE_STYLE" --formatter="${ZSH_COLORIZE_CHROMA_FORMATTER:-terminal}" "$FNAME" | |
| 67 | + fi | |
| 68 | + done | |
| 69 | +} | |
| 70 | + | |
| 71 | +# The less option 'F - Forward forever; like "tail -f".' will not work in this implementation | |
| 72 | +# caused by the lack of the ability to follow the file within pygmentize. | |
| 73 | +colorize_less() { | |
| 74 | + if ! colorize_check_requirements; then | |
| 75 | + return 1 | |
| 76 | + fi | |
| 77 | + | |
| 78 | + _cless() { | |
| 79 | + # LESS="-R $LESS" enables raw ANSI colors, while maintain already set options. | |
| 80 | + local LESS="-R $LESS" | |
| 81 | + | |
| 82 | + # This variable tells less to pipe every file through the specified command | |
| 83 | + # (see the man page of less INPUT PREPROCESSOR). | |
| 84 | + # 'zsh -ic "colorize_cat %s 2> /dev/null"' would not work for huge files like | |
| 85 | + # the ~/.zsh_history. For such files the tty of the preprocessor will be suspended. | |
| 86 | + # Therefore we must source this file to make colorize_cat available in the | |
| 87 | + # preprocessor without the interactive mode. | |
| 88 | + # `2>/dev/null` will suppress the error for large files 'broken pipe' of the python | |
| 89 | + # script pygmentize, which will show up if less has not fully "loaded the file" | |
| 90 | + # (e.g. when not scrolled to the bottom) while already the next file will be displayed. | |
| 91 | + local LESSOPEN="| zsh -c 'source \"$ZSH_COLORIZE_PLUGIN_PATH\"; \ | |
| 92 | + ZSH_COLORIZE_TOOL=$ZSH_COLORIZE_TOOL ZSH_COLORIZE_STYLE=$ZSH_COLORIZE_STYLE \ | |
| 93 | + colorize_cat %s 2> /dev/null'" | |
| 94 | + | |
| 95 | + # LESSCLOSE will be set to prevent any errors by executing a user script | |
| 96 | + # which assumes that his LESSOPEN has been executed. | |
| 97 | + local LESSCLOSE="" | |
| 98 | + | |
| 99 | + LESS="$LESS" LESSOPEN="$LESSOPEN" LESSCLOSE="$LESSCLOSE" command less "$@" | |
| 100 | + } | |
| 101 | + | |
| 102 | + if [ -t 0 ]; then | |
| 103 | + _cless "$@" | |
| 104 | + else | |
| 105 | + # The input is not associated with a terminal, therefore colorize_cat will | |
| 106 | + # colorize this input and pass it to less. | |
| 107 | + # Less has now to decide what to use. If any files have been provided, less | |
| 108 | + # will ignore the input by default, otherwise the colorized input will be used. | |
| 109 | + # If files have been supplied and the input has been redirected, this will | |
| 110 | + # lead to unnecessary overhead, but retains the ability to use the less options | |
| 111 | + # without checking for them inside this script. | |
| 112 | + colorize_cat | _cless "$@" | |
| 113 | + fi | |
| 114 | +} |
+35-0.oh-my-zsh/plugins/command-not-found/README.md
| @@ -0,0 +1,35 @@ | ||
| 1 | +# command-not-found plugin | |
| 2 | + | |
| 3 | +This plugin uses the command-not-found package for zsh to provide suggested packages to be installed if a command cannot be found. | |
| 4 | + | |
| 5 | +To use it, add `command-not-found` to the plugins array of your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... command-not-found) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +An example of how this plugin works in Ubuntu: | |
| 12 | +``` | |
| 13 | +$ mutt | |
| 14 | +The program 'mutt' can be found in the following packages: | |
| 15 | + * mutt | |
| 16 | + * mutt-kz | |
| 17 | + * mutt-patched | |
| 18 | +Try: sudo apt install <selected package> | |
| 19 | +``` | |
| 20 | + | |
| 21 | +### Supported platforms | |
| 22 | + | |
| 23 | +It works out of the box with the command-not-found packages for: | |
| 24 | + | |
| 25 | +- [Ubuntu](https://www.porcheron.info/command-not-found-for-zsh/) | |
| 26 | +- [Debian](https://packages.debian.org/search?keywords=command-not-found) | |
| 27 | +- [Arch Linux](https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found) | |
| 28 | +- [macOS (Homebrew)](https://github.com/Homebrew/homebrew-command-not-found) | |
| 29 | +- [Fedora](https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound) | |
| 30 | +- [NixOS](https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/programs/command-not-found) | |
| 31 | +- [Termux](https://github.com/termux/command-not-found) | |
| 32 | +- [SUSE](https://www.unix.com/man-page/suse/1/command-not-found/) | |
| 33 | +- [Gentoo](https://github.com/AndrewAmmerlaan/command-not-found-gentoo/tree/main) | |
| 34 | + | |
| 35 | +You can add support for other platforms by submitting a Pull Request. |
+70-0.oh-my-zsh/plugins/command-not-found/command-not-found.plugin.zsh
| @@ -0,0 +1,70 @@ | ||
| 1 | +## Platforms with a built-in command-not-found handler init file | |
| 2 | + | |
| 3 | +for file ( | |
| 4 | + # Arch Linux. Must have pkgfile installed: https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found | |
| 5 | + /usr/share/doc/pkgfile/command-not-found.zsh | |
| 6 | + # Homebrew: https://github.com/Homebrew/homebrew-command-not-found | |
| 7 | + /opt/homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh | |
| 8 | + /usr/local/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh | |
| 9 | + /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh | |
| 10 | +); do | |
| 11 | + if [[ -r "$file" ]]; then | |
| 12 | + source "$file" | |
| 13 | + unset file | |
| 14 | + return 0 | |
| 15 | + fi | |
| 16 | +done | |
| 17 | +unset file | |
| 18 | + | |
| 19 | + | |
| 20 | +## Platforms with manual command_not_found_handler() setup | |
| 21 | + | |
| 22 | +# Debian and derivatives: https://launchpad.net/ubuntu/+source/command-not-found | |
| 23 | +if [[ -x /usr/lib/command-not-found || -x /usr/share/command-not-found/command-not-found ]]; then | |
| 24 | + command_not_found_handler() { | |
| 25 | + if [[ -x /usr/lib/command-not-found ]]; then | |
| 26 | + /usr/lib/command-not-found -- "$1" | |
| 27 | + return $? | |
| 28 | + elif [[ -x /usr/share/command-not-found/command-not-found ]]; then | |
| 29 | + /usr/share/command-not-found/command-not-found -- "$1" | |
| 30 | + return $? | |
| 31 | + else | |
| 32 | + printf "zsh: command not found: %s\n" "$1" >&2 | |
| 33 | + return 127 | |
| 34 | + fi | |
| 35 | + } | |
| 36 | +fi | |
| 37 | + | |
| 38 | +# Fedora: https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound | |
| 39 | +if [[ -x /usr/libexec/pk-command-not-found ]]; then | |
| 40 | + command_not_found_handler() { | |
| 41 | + if [[ -S /var/run/dbus/system_bus_socket && -x /usr/libexec/packagekitd ]]; then | |
| 42 | + /usr/libexec/pk-command-not-found "$@" | |
| 43 | + return $? | |
| 44 | + fi | |
| 45 | + | |
| 46 | + printf "zsh: command not found: %s\n" "$1" >&2 | |
| 47 | + return 127 | |
| 48 | + } | |
| 49 | +fi | |
| 50 | + | |
| 51 | +# NixOS: https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/programs/command-not-found | |
| 52 | +if [[ -x /run/current-system/sw/bin/command-not-found ]]; then | |
| 53 | + command_not_found_handler() { | |
| 54 | + /run/current-system/sw/bin/command-not-found "$@" | |
| 55 | + } | |
| 56 | +fi | |
| 57 | + | |
| 58 | +# Termux: https://github.com/termux/command-not-found | |
| 59 | +if [[ -x /data/data/com.termux/files/usr/libexec/termux/command-not-found ]]; then | |
| 60 | + command_not_found_handler() { | |
| 61 | + /data/data/com.termux/files/usr/libexec/termux/command-not-found "$1" | |
| 62 | + } | |
| 63 | +fi | |
| 64 | + | |
| 65 | +# SUSE and derivates: https://www.unix.com/man-page/suse/1/command-not-found/ | |
| 66 | +if [[ -x /usr/bin/command-not-found ]]; then | |
| 67 | + command_not_found_handler() { | |
| 68 | + /usr/bin/command-not-found "$1" | |
| 69 | + } | |
| 70 | +fi |
+130-0.oh-my-zsh/plugins/common-aliases/README.md
| @@ -0,0 +1,130 @@ | ||
| 1 | +# Common Aliases Plugin | |
| 2 | + | |
| 3 | +This plugin creates helpful shortcut aliases for many commonly used commands. | |
| 4 | + | |
| 5 | +To use it add `common-aliases` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... common-aliases) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Aliases | |
| 12 | + | |
| 13 | +### ls command | |
| 14 | + | |
| 15 | +| Alias | Command | Description | | |
| 16 | +| ----- | ------------ | --------------------------------------------------------------------------- | | |
| 17 | +| l | `ls -lFh` | List files as a long list, show size, type, human-readable | | |
| 18 | +| la | `ls -lAFh` | List almost all files as a long list show size, type, human-readable | | |
| 19 | +| lr | `ls -tRFh` | List files recursively sorted by date, show type, human-readable | | |
| 20 | +| lt | `ls -ltFh` | List files as a long list sorted by date, show type, human-readable | | |
| 21 | +| ll | `ls -l` | List files as a long list | | |
| 22 | +| ldot | `ls -ld .*` | List dot files as a long list | | |
| 23 | +| lS | `ls -1FSsh` | List files showing only size and name sorted by size | | |
| 24 | +| lart | `ls -1Fcart` | List all files sorted in reverse of create/modification time (oldest first) | | |
| 25 | +| lrt | `ls -1Fcrt` | List files sorted in reverse of create/modification time(oldest first) | | |
| 26 | +| lsr | `ls -lARFh` | List all files and directories recursively | | |
| 27 | +| lsn | `ls -1` | List files and directories in a single column | | |
| 28 | + | |
| 29 | +### File handling | |
| 30 | + | |
| 31 | +| Alias | Command | Description | | |
| 32 | +| ----- | --------------------- | ------------------------------------------------------------------------------- | | |
| 33 | +| rm | `rm -i` | Remove a file | | |
| 34 | +| cp | `cp -i` | Copy a file | | |
| 35 | +| mv | `mv -i` | Move a file | | |
| 36 | +| zshrc | `${=EDITOR} ~/.zshrc` | Quickly access the ~/.zshrc file | | |
| 37 | +| dud | `du -d 1 -h` | Display the size of files at depth 1 in current location in human-readable form | | |
| 38 | +| duf\* | `du -sh` | Display the size of files in current location in human-readable form | | |
| 39 | +| t | `tail -f` | Shorthand for tail which outputs the last part of a file | | |
| 40 | + | |
| 41 | +\* Only if the [`duf`](https://github.com/muesli/duf) command isn't installed. | |
| 42 | + | |
| 43 | +### find and grep | |
| 44 | + | |
| 45 | +| Alias | Command | Description | | |
| 46 | +| ----- | -------------------------------------------------- | ------------------------------------ | | |
| 47 | +| fd\* | `find . -type d -name` | Find a directory with the given name | | |
| 48 | +| ff | `find . -type f -name` | Find a file with the given name | | |
| 49 | +| grep | `grep --color` | Searches for a query string | | |
| 50 | +| sgrep | `grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS}` | Useful for searching within files | | |
| 51 | + | |
| 52 | +\* Only if the [`fd`](https://github.com/sharkdp/fd) command isn't installed. | |
| 53 | + | |
| 54 | +### Other Aliases | |
| 55 | + | |
| 56 | +| Alias | Command | Description | | |
| 57 | +| -------- | ------------------ | ----------------------------------------------------------- | | |
| 58 | +| h | `history` | Lists all recently used commands | | |
| 59 | +| hgrep | `fc -El 0 \| grep` | Searches for a word in the list of previously used commands | | |
| 60 | +| help | `man` | Opens up the man page for a command | | |
| 61 | +| p | `ps -f` | Displays currently executing processes | | |
| 62 | +| sortnr | `sort -n -r` | Used to sort the lines of a text file | | |
| 63 | +| unexport | `unset` | Used to unset an environment variable | | |
| 64 | + | |
| 65 | +## Global aliases | |
| 66 | + | |
| 67 | +These aliases are expanded in any position in the command line, meaning you can use them even at the | |
| 68 | +end of the command you've typed. Examples: | |
| 69 | + | |
| 70 | +Quickly pipe to less: | |
| 71 | + | |
| 72 | +```zsh | |
| 73 | +$ ls -l /var/log L | |
| 74 | +# will run | |
| 75 | +$ ls -l /var/log | less | |
| 76 | +``` | |
| 77 | + | |
| 78 | +Silences stderr output: | |
| 79 | + | |
| 80 | +```zsh | |
| 81 | +$ find . -type f NE | |
| 82 | +# will run | |
| 83 | +$ find . -type f 2>/dev/null | |
| 84 | +``` | |
| 85 | + | |
| 86 | +| Alias | Command | Description | | |
| 87 | +| ----- | --------------------------- | ----------------------------------------------------------- | | |
| 88 | +| H | `\| head` | Pipes output to head which outputs the first part of a file | | |
| 89 | +| T | `\| tail` | Pipes output to tail which outputs the last part of a file | | |
| 90 | +| G | `\| grep` | Pipes output to grep to search for some word | | |
| 91 | +| L | `\| less` | Pipes output to less, useful for paging | | |
| 92 | +| M | `\| most` | Pipes output to more, useful for paging | | |
| 93 | +| LL | `2>&1 \| less` | Writes stderr to stdout and passes it to less | | |
| 94 | +| CA | `2>&1 \| cat -A` | Writes stderr to stdout and passes it to cat | | |
| 95 | +| NE | `2 > /dev/null` | Silences stderr | | |
| 96 | +| NUL | `> /dev/null 2>&1` | Silences both stdout and stderr | | |
| 97 | +| P | `2>&1\| pygmentize -l pytb` | Writes stderr to stdout and passes it to pygmentize | | |
| 98 | + | |
| 99 | +## File extension aliases | |
| 100 | + | |
| 101 | +These are special aliases that are triggered when a file name is passed as the command. For example, | |
| 102 | +if the pdf file extension is aliased to `acroread` (a popular Linux pdf reader), when running `file.pdf` | |
| 103 | +that file will be open with `acroread`. | |
| 104 | + | |
| 105 | +### Reading Docs | |
| 106 | + | |
| 107 | +| Alias | Command | Description | | |
| 108 | +| ----- | ---------- | ---------------------------------- | | |
| 109 | +| pdf | `acroread` | Opens up a document using acroread | | |
| 110 | +| ps | `gv` | Opens up a .ps file using gv | | |
| 111 | +| dvi | `xdvi` | Opens up a .dvi file using xdvi | | |
| 112 | +| chm | `xchm` | Opens up a .chm file using xchm | | |
| 113 | +| djvu | `djview` | Opens up a .djvu file using djview | | |
| 114 | + | |
| 115 | +### Listing files inside a packed file | |
| 116 | + | |
| 117 | +| Alias | Command | Description | | |
| 118 | +| ------ | ---------- | --------------------------------- | | |
| 119 | +| zip | `unzip -l` | Lists files inside a .zip file | | |
| 120 | +| rar | `unrar l` | Lists files inside a .rar file | | |
| 121 | +| tar | `tar tf` | Lists files inside a .tar file | | |
| 122 | +| tar.gz | `echo` | Lists files inside a .tar.gz file | | |
| 123 | +| ace | `unace l` | Lists files inside a .ace file | | |
| 124 | + | |
| 125 | +### Some other features | |
| 126 | + | |
| 127 | +- Opens urls in terminal using browser specified by the variable `$BROWSER` | |
| 128 | +- Opens C, C++, Tex and text files using editor specified by the variable `$EDITOR` | |
| 129 | +- Opens images using image viewer specified by the variable `$XIVIEWER` | |
| 130 | +- Opens videos and other media using mplayer |
+90-0.oh-my-zsh/plugins/common-aliases/common-aliases.plugin.zsh
| @@ -0,0 +1,90 @@ | ||
| 1 | +# Advanced Aliases. | |
| 2 | +# Use with caution | |
| 3 | +# | |
| 4 | + | |
| 5 | +# ls, the common ones I use a lot shortened for rapid fire usage | |
| 6 | +alias l='ls -lFh' #size,show type,human readable | |
| 7 | +alias la='ls -lAFh' #long list,show almost all,show type,human readable | |
| 8 | +alias lr='ls -tRFh' #sorted by date,recursive,show type,human readable | |
| 9 | +alias lt='ls -ltFh' #long list,sorted by date,show type,human readable | |
| 10 | +alias ll='ls -l' #long list | |
| 11 | +alias ldot='ls -ld .*' | |
| 12 | +alias lS='ls -1FSsh' | |
| 13 | +alias lart='ls -1Fcart' | |
| 14 | +alias lrt='ls -1Fcrt' | |
| 15 | +alias lsr='ls -lARFh' #Recursive list of files and directories | |
| 16 | +alias lsn='ls -1' #A column contains name of files and directories | |
| 17 | + | |
| 18 | +alias zshrc='${=EDITOR} ${ZDOTDIR:-$HOME}/.zshrc' # Quick access to the .zshrc file | |
| 19 | + | |
| 20 | +alias grep='grep --color' | |
| 21 | +alias sgrep='grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS} ' | |
| 22 | + | |
| 23 | +alias t='tail -f' | |
| 24 | + | |
| 25 | +# Command line head / tail shortcuts | |
| 26 | +alias -g H='| head' | |
| 27 | +alias -g T='| tail' | |
| 28 | +alias -g G='| grep' | |
| 29 | +alias -g L="| less" | |
| 30 | +alias -g M="| most" | |
| 31 | +alias -g LL="2>&1 | less" | |
| 32 | +alias -g CA="2>&1 | cat -A" | |
| 33 | +alias -g NE="2> /dev/null" | |
| 34 | +alias -g NUL="> /dev/null 2>&1" | |
| 35 | +alias -g P="2>&1| pygmentize -l pytb" | |
| 36 | + | |
| 37 | +alias dud='du -d 1 -h' | |
| 38 | +(( $+commands[duf] )) || alias duf='du -sh *' | |
| 39 | +(( $+commands[fd] )) || alias fd='find . -type d -name' | |
| 40 | +alias ff='find . -type f -name' | |
| 41 | + | |
| 42 | +alias h='history' | |
| 43 | +alias hgrep="fc -El 0 | grep" | |
| 44 | +alias help='man' | |
| 45 | +alias p='ps -f' | |
| 46 | +alias sortnr='sort -n -r' | |
| 47 | +alias unexport='unset' | |
| 48 | + | |
| 49 | +alias rm='rm -i' | |
| 50 | +alias cp='cp -i' | |
| 51 | +alias mv='mv -i' | |
| 52 | + | |
| 53 | +# zsh is able to auto-do some kungfoo | |
| 54 | +# depends on the SUFFIX :) | |
| 55 | +autoload -Uz is-at-least | |
| 56 | +if is-at-least 4.2.0; then | |
| 57 | + # open browser on urls | |
| 58 | + if [[ -n "$BROWSER" ]]; then | |
| 59 | + _browser_fts=(htm html de org net com at cx nl se dk) | |
| 60 | + for ft in $_browser_fts; do alias -s $ft='$BROWSER'; done | |
| 61 | + fi | |
| 62 | + | |
| 63 | + _editor_fts=(cpp cxx cc c hh h inl asc txt TXT tex) | |
| 64 | + for ft in $_editor_fts; do alias -s $ft='$EDITOR'; done | |
| 65 | + | |
| 66 | + if [[ -n "$XIVIEWER" ]]; then | |
| 67 | + _image_fts=(jpg jpeg png gif mng tiff tif xpm) | |
| 68 | + for ft in $_image_fts; do alias -s $ft='$XIVIEWER'; done | |
| 69 | + fi | |
| 70 | + | |
| 71 | + _media_fts=(ape avi flv m4a mkv mov mp3 mpeg mpg ogg ogm rm wav webm) | |
| 72 | + for ft in $_media_fts; do alias -s $ft=mplayer; done | |
| 73 | + | |
| 74 | + #read documents | |
| 75 | + alias -s pdf=acroread | |
| 76 | + alias -s ps=gv | |
| 77 | + alias -s dvi=xdvi | |
| 78 | + alias -s chm=xchm | |
| 79 | + alias -s djvu=djview | |
| 80 | + | |
| 81 | + #list whats inside packed file | |
| 82 | + alias -s zip="unzip -l" | |
| 83 | + alias -s rar="unrar l" | |
| 84 | + alias -s tar="tar tf" | |
| 85 | + alias -s tar.gz="echo " | |
| 86 | + alias -s ace="unace l" | |
| 87 | +fi | |
| 88 | + | |
| 89 | +# Make zsh know about hosts already accessed by SSH | |
| 90 | +zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%[# ]*}//,/ })' |
+9-0.oh-my-zsh/plugins/compleat/README.md
| @@ -0,0 +1,9 @@ | ||
| 1 | +# compleat plugin | |
| 2 | + | |
| 3 | +This plugin looks for [compleat](https://github.com/mbrubeck/compleat) and loads its completion. | |
| 4 | + | |
| 5 | +To use it, add compleat to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... compleat) | |
| 9 | +``` |
+20-0.oh-my-zsh/plugins/compleat/compleat.plugin.zsh
| @@ -0,0 +1,20 @@ | ||
| 1 | +# ------------------------------------------------------------------------------ | |
| 2 | +# FILE: compleat.plugin.zsh | |
| 3 | +# DESCRIPTION: oh-my-zsh plugin file. | |
| 4 | +# AUTHOR: Sorin Ionescu (sorin.ionescu@gmail.com) | |
| 5 | +# VERSION: 1.0.0 | |
| 6 | +# ------------------------------------------------------------------------------ | |
| 7 | + | |
| 8 | +if (( ${+commands[compleat]} )); then | |
| 9 | + local prefix="${commands[compleat]:h:h}" | |
| 10 | + local setup="${prefix}/share/compleat-1.0/compleat_setup" | |
| 11 | + | |
| 12 | + if [[ -f "$setup" ]]; then | |
| 13 | + if ! bashcompinit >/dev/null 2>&1; then | |
| 14 | + autoload -U bashcompinit | |
| 15 | + bashcompinit -i | |
| 16 | + fi | |
| 17 | + | |
| 18 | + source "$setup" | |
| 19 | + fi | |
| 20 | +fi |
+35-0.oh-my-zsh/plugins/composer/README.md
| @@ -0,0 +1,35 @@ | ||
| 1 | +# composer | |
| 2 | + | |
| 3 | +This plugin provides completion for [composer](https://getcomposer.org/), as well as aliases | |
| 4 | +for frequent composer commands. It also adds Composer's global binaries to the PATH, using | |
| 5 | +Composer if available. | |
| 6 | + | |
| 7 | +To use it add `composer` to the plugins array in your zshrc file. | |
| 8 | + | |
| 9 | +```zsh | |
| 10 | +plugins=(... composer) | |
| 11 | +``` | |
| 12 | + | |
| 13 | +Original author: Daniel Gomes <me@danielcsgomes.com> | |
| 14 | + | |
| 15 | +## Aliases | |
| 16 | + | |
| 17 | +| Alias | Command | Description | | |
| 18 | +| ------ | ---------------------------------- | --------------------------------------------------------------------------------------- | | |
| 19 | +| `c` | `composer` | Starts composer | | |
| 20 | +| `ccp` | `composer create-project` | Create new project from an existing package | | |
| 21 | +| `cdo` | `composer dump-autoload -o` | Converts PSR-0/4 autoloading to classmap for a faster autoloader (good for production) | | |
| 22 | +| `cdu` | `composer dump-autoload` | Updates the autoloader | | |
| 23 | +| `cget` | `curl -s <installer> \| php` | Installs composer in the current directory | | |
| 24 | +| `cgr` | `composer global require` | Allows require command to run on COMPOSER_HOME directory | | |
| 25 | +| `cgrm` | `composer global remove` | Allows remove command to run on COMPOSER_HOME directory | | |
| 26 | +| `cgu` | `composer global update` | Allows update command to run on COMPOSER_HOME directory | | |
| 27 | +| `ci` | `composer install` | Resolves and installs dependencies from `composer.json` | | |
| 28 | +| `co` | `composer outdated` | Shows a list of installed packages with available updates | | |
| 29 | +| `cod` | `composer outdated --direct` | Shows a list of installed packages with available updates which are direct dependencies | | |
| 30 | +| `cr` | `composer require` | Adds new packages to `composer.json` | | |
| 31 | +| `crm` | `composer remove` | Removes packages from `composer.json` | | |
| 32 | +| `cs` | `composer show` | Lists available packages, with optional filtering | | |
| 33 | +| `csu` | `composer self-update` | Updates composer to the latest version | | |
| 34 | +| `cu` | `composer update` | Updates composer dependencies and `composer.lock` file | | |
| 35 | +| `cuh` | `composer update -d <config-home>` | Updates globally installed packages | |
+76-0.oh-my-zsh/plugins/composer/composer.plugin.zsh
| @@ -0,0 +1,76 @@ | ||
| 1 | +## Basic Composer command completion | |
| 2 | +# Since Zsh 5.7, an improved composer command completion is provided | |
| 3 | +if ! is-at-least 5.7; then | |
| 4 | + _composer () { | |
| 5 | + local curcontext="$curcontext" state line | |
| 6 | + typeset -A opt_args | |
| 7 | + _arguments '*:: :->subcmds' | |
| 8 | + | |
| 9 | + if (( CURRENT == 1 )) || ( (( CURRENT == 2 )) && [[ "$words[1]" = "global" ]] ); then | |
| 10 | + # Command list | |
| 11 | + local -a subcmds | |
| 12 | + subcmds=("${(@f)"$($_comp_command1 --no-ansi 2>/dev/null | awk ' | |
| 13 | + /Available commands/{ r=1 } | |
| 14 | + r == 1 && /^[ \t]*[a-z]+/{ | |
| 15 | + gsub(/^[ \t]+/, "") | |
| 16 | + gsub(/ +/, ":") | |
| 17 | + print $0 | |
| 18 | + } | |
| 19 | + ')"}") | |
| 20 | + _describe -t commands 'composer command' subcmds | |
| 21 | + else | |
| 22 | + # Required list | |
| 23 | + compadd $($_comp_command1 show -s --no-ansi 2>/dev/null \ | |
| 24 | + | sed '1,/requires/d' \ | |
| 25 | + | awk 'NF > 0 && !/^requires \(dev\)/{ print $1 }') | |
| 26 | + fi | |
| 27 | + } | |
| 28 | + | |
| 29 | + compdef _composer composer | |
| 30 | + compdef _composer composer.phar | |
| 31 | +fi | |
| 32 | + | |
| 33 | + | |
| 34 | +## Aliases | |
| 35 | +alias c='composer' | |
| 36 | +alias ccp='composer create-project' | |
| 37 | +alias cdo='composer dump-autoload -o' | |
| 38 | +alias cdu='composer dump-autoload' | |
| 39 | +alias cget='curl -s https://getcomposer.org/installer | php' | |
| 40 | +alias cgr='composer global require' | |
| 41 | +alias cgrm='composer global remove' | |
| 42 | +alias cgu='composer global update' | |
| 43 | +alias ci='composer install' | |
| 44 | +alias co='composer outdated' | |
| 45 | +alias cod='composer outdated --direct' | |
| 46 | +alias cr='composer require' | |
| 47 | +alias crm='composer remove' | |
| 48 | +alias cs='composer show' | |
| 49 | +alias csu='composer self-update' | |
| 50 | +alias cu='composer update' | |
| 51 | +alias cuh='composer update --working-dir=$(composer config -g home)' | |
| 52 | + | |
| 53 | + | |
| 54 | +## If Composer not found, try to add known directories to $PATH | |
| 55 | +if (( ! $+commands[composer] )); then | |
| 56 | + [[ -d "$HOME/.composer/vendor/bin" ]] && export PATH="$PATH:$HOME/.composer/vendor/bin" | |
| 57 | + [[ -d "$HOME/.config/composer/vendor/bin" ]] && export PATH="$PATH:$HOME/.config/composer/vendor/bin" | |
| 58 | + | |
| 59 | + # If still not found, don't do the rest of the script | |
| 60 | + (( $+commands[composer] )) || return 0 | |
| 61 | +fi | |
| 62 | + | |
| 63 | + | |
| 64 | +## Add Composer's global binaries to PATH | |
| 65 | +autoload -Uz _store_cache _retrieve_cache _cache_invalid | |
| 66 | +_retrieve_cache composer | |
| 67 | + | |
| 68 | +if [[ -z $__composer_bin_dir ]]; then | |
| 69 | + __composer_bin_dir=$(composer global config bin-dir --absolute 2>/dev/null) | |
| 70 | + _store_cache composer __composer_bin_dir | |
| 71 | +fi | |
| 72 | + | |
| 73 | +# Add Composer's global binaries to PATH | |
| 74 | +export PATH="$PATH:$__composer_bin_dir" | |
| 75 | + | |
| 76 | +unset __composer_bin_dir |
+44-0.oh-my-zsh/plugins/conda-env/README.md
| @@ -0,0 +1,44 @@ | ||
| 1 | +# conda-env | |
| 2 | + | |
| 3 | +The plugin displays information of the created virtual container of conda and allows background theming. | |
| 4 | + | |
| 5 | +To use it, add `conda-env` to the plugins array of your zshrc file: | |
| 6 | +``` | |
| 7 | +plugins=(... conda-env) | |
| 8 | +``` | |
| 9 | + | |
| 10 | +The plugin creates a `conda_prompt_info` function that you can use in your theme, which displays the | |
| 11 | +basename of the current `$CONDA_DEFAULT_ENV`. | |
| 12 | + | |
| 13 | +You can use this prompt function in your themes, by adding it to the `PROMPT` or `RPROMPT` variables. See [Example](#example) for more information. | |
| 14 | + | |
| 15 | +## Settings | |
| 16 | + | |
| 17 | +It uses two variables to control how the information is shown: | |
| 18 | + | |
| 19 | +- `ZSH_THEME_CONDA_PREFIX`: sets the prefix of the CONDA_DEFAULT_ENV. | |
| 20 | +Defaults to `[`. | |
| 21 | + | |
| 22 | +- `ZSH_THEME_CONDA_SUFFIX`: sets the suffix of the CONDA_DEFAULT_ENV. | |
| 23 | +Defaults to `]`. | |
| 24 | + | |
| 25 | +## Example | |
| 26 | + | |
| 27 | +```sh | |
| 28 | +ZSH_THEME_CONDA_PREFIX='conda:%F{green}' | |
| 29 | +ZSH_THEME_CONDA_SUFFIX='%f' | |
| 30 | +RPROMPT='$(conda_prompt_info)' | |
| 31 | +``` | |
| 32 | + | |
| 33 | +## `CONDA_CHANGEPS1` | |
| 34 | + | |
| 35 | +This plugin also automatically sets the `CONDA_CHANGEPS1` variable to `false` to avoid conda changing the prompt | |
| 36 | +automatically. This has the same effect as running `conda config --set changeps1 false`. | |
| 37 | + | |
| 38 | +You can override this behavior by adding `unset CONDA_CHANGEPS1` in your `.zshrc` file, after Oh My Zsh has been | |
| 39 | +sourced. | |
| 40 | + | |
| 41 | +References: | |
| 42 | + | |
| 43 | +- https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#determining-your-current-environment | |
| 44 | +- https://conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html#precedence |
+9-0.oh-my-zsh/plugins/conda-env/conda-env.plugin.zsh
| @@ -0,0 +1,9 @@ | ||
| 1 | +function conda_prompt_info(){ | |
| 2 | + [[ -n ${CONDA_DEFAULT_ENV} ]] || return | |
| 3 | + echo "${ZSH_THEME_CONDA_PREFIX=[}${CONDA_DEFAULT_ENV:t:gs/%/%%}${ZSH_THEME_CONDA_SUFFIX=]}" | |
| 4 | +} | |
| 5 | + | |
| 6 | +# Has the same effect as `conda config --set changeps1 false` | |
| 7 | +# - https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#determining-your-current-environment | |
| 8 | +# - https://conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html#precedence | |
| 9 | +export CONDA_CHANGEPS1=false |
+37-0.oh-my-zsh/plugins/conda/README.md
| @@ -0,0 +1,37 @@ | ||
| 1 | +# conda plugin | |
| 2 | + | |
| 3 | +The conda plugin provides [aliases](#aliases) for `conda`, usually installed via [anaconda](https://www.anaconda.com/) or [miniconda](https://docs.conda.io/en/latest/miniconda.html). | |
| 4 | + | |
| 5 | +To use it, add `conda` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... conda) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Aliases | |
| 12 | + | |
| 13 | +| Alias | Command | Description | | |
| 14 | +| :------- | :-------------------------------------- | :------------------------------------------------------------------------------ | | |
| 15 | +| `cna` | `conda activate` | Activate the specified conda environment | | |
| 16 | +| `cnab` | `conda activate base` | Activate the base conda environment | | |
| 17 | +| `cncf` | `conda env create -f` | Create a new conda environment from a YAML file | | |
| 18 | +| `cncn` | `conda create -y -n` | Create a new conda environment with the given name | | |
| 19 | +| `cnconf` | `conda config` | View or modify conda configuration | | |
| 20 | +| `cncp` | `conda create -y -p` | Create a new conda environment with the given prefix | | |
| 21 | +| `cncr` | `conda create -n` | Create new virtual environment with given name | | |
| 22 | +| `cncss` | `conda config --show-source` | Show the locations of conda configuration sources | | |
| 23 | +| `cnde` | `conda deactivate` | Deactivate the current conda environment | | |
| 24 | +| `cnel` | `conda env list` | List all available conda environments | | |
| 25 | +| `cni` | `conda install` | Install given package | | |
| 26 | +| `cniy` | `conda install -y` | Install given package without confirmation | | |
| 27 | +| `cnl` | `conda list` | List installed packages in the current environment | | |
| 28 | +| `cnle` | `conda list --export` | Export the list of installed packages in the current environment | | |
| 29 | +| `cnles` | `conda list --explicit > spec-file.txt` | Export the list of installed packages in the current environment to a spec file | | |
| 30 | +| `cnr` | `conda remove` | Remove given package | | |
| 31 | +| `cnrn` | `conda remove -y -all -n` | Remove all packages in the specified environment | | |
| 32 | +| `cnrp` | `conda remove -y -all -p` | Remove all packages in the specified prefix | | |
| 33 | +| `cnry` | `conda remove -y` | Remove given package without confirmation | | |
| 34 | +| `cnsr` | `conda search` | Search conda repositories for package | | |
| 35 | +| `cnu` | `conda update` | Update conda package manager | | |
| 36 | +| `cnua` | `conda update --all` | Update all installed packages | | |
| 37 | +| `cnuc` | `conda update conda` | Update conda package manager | |
+23-0.oh-my-zsh/plugins/conda/conda.plugin.zsh
| @@ -0,0 +1,23 @@ | ||
| 1 | +alias cna='conda activate' | |
| 2 | +alias cnab='conda activate base' | |
| 3 | +alias cncf='conda env create -f' | |
| 4 | +alias cncn='conda create -y -n' | |
| 5 | +alias cnconf='conda config' | |
| 6 | +alias cncp='conda create -y -p' | |
| 7 | +alias cncr='conda create -n' | |
| 8 | +alias cncss='conda config --show-source' | |
| 9 | +alias cnde='conda deactivate' | |
| 10 | +alias cnel='conda env list' | |
| 11 | +alias cni='conda install' | |
| 12 | +alias cniy='conda install -y' | |
| 13 | +alias cnl='conda list' | |
| 14 | +alias cnle='conda list --export' | |
| 15 | +alias cnles='conda list --explicit > spec-file.txt' | |
| 16 | +alias cnr='conda remove' | |
| 17 | +alias cnrn='conda remove -y --all -n' | |
| 18 | +alias cnrp='conda remove -y --all -p' | |
| 19 | +alias cnry='conda remove -y' | |
| 20 | +alias cnsr='conda search' | |
| 21 | +alias cnu='conda update' | |
| 22 | +alias cnua='conda update --all' | |
| 23 | +alias cnuc='conda update conda' |
+11-0.oh-my-zsh/plugins/copybuffer/README.md
| @@ -0,0 +1,11 @@ | ||
| 1 | +# `copybuffer` plugin | |
| 2 | + | |
| 3 | +This plugin adds the <kbd>ctrl-o</kbd> keyboard shortcut to copy the current text | |
| 4 | +in the command line to the system clipboard. | |
| 5 | + | |
| 6 | +This is useful if you type a command - and before you hit enter to execute it - want | |
| 7 | +to copy it maybe so you can paste it into a script, gist or whatnot. | |
| 8 | + | |
| 9 | +```zsh | |
| 10 | +plugins=(... copybuffer) | |
| 11 | +``` |
+16-0.oh-my-zsh/plugins/copybuffer/copybuffer.plugin.zsh
| @@ -0,0 +1,16 @@ | ||
| 1 | +# copy the active line from the command line buffer | |
| 2 | +# onto the system clipboard | |
| 3 | + | |
| 4 | +copybuffer () { | |
| 5 | + if builtin which clipcopy &>/dev/null; then | |
| 6 | + printf "%s" "$BUFFER" | clipcopy | |
| 7 | + else | |
| 8 | + zle -M "clipcopy not found. Please make sure you have Oh My Zsh installed correctly." | |
| 9 | + fi | |
| 10 | +} | |
| 11 | + | |
| 12 | +zle -N copybuffer | |
| 13 | + | |
| 14 | +bindkey -M emacs "^O" copybuffer | |
| 15 | +bindkey -M viins "^O" copybuffer | |
| 16 | +bindkey -M vicmd "^O" copybuffer |
+11-0.oh-my-zsh/plugins/copyfile/README.md
| @@ -0,0 +1,11 @@ | ||
| 1 | +# copyfile plugin | |
| 2 | + | |
| 3 | +Puts the contents of a file in your system clipboard so you can paste it anywhere. | |
| 4 | + | |
| 5 | +To use, add `copyfile` to your plugins array: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... copyfile) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +Then you can run the command `copyfile <filename>` to copy the file named `filename`. |
+7-0.oh-my-zsh/plugins/copyfile/copyfile.plugin.zsh
| @@ -0,0 +1,7 @@ | ||
| 1 | +# Copies the contents of a given file to the system or X Windows clipboard | |
| 2 | +# | |
| 3 | +# copyfile <file> | |
| 4 | +function copyfile { | |
| 5 | + emulate -L zsh | |
| 6 | + clipcopy $1 | |
| 7 | +} |
+15-0.oh-my-zsh/plugins/copypath/README.md
| @@ -0,0 +1,15 @@ | ||
| 1 | +# copypath plugin | |
| 2 | + | |
| 3 | +Copies the path of given directory or file to the system clipboard. | |
| 4 | + | |
| 5 | +To use it, add `copypath` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... copypath) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Usage | |
| 12 | + | |
| 13 | +- `copypath`: copies the absolute path of the current directory. | |
| 14 | + | |
| 15 | +- `copypath <file_or_directory>`: copies the absolute path of the given file. |
+15-0.oh-my-zsh/plugins/copypath/copypath.plugin.zsh
| @@ -0,0 +1,15 @@ | ||
| 1 | +# Copies the path of given directory or file to the system or X Windows clipboard. | |
| 2 | +# Copy current directory if no parameter. | |
| 3 | +function copypath { | |
| 4 | + # If no argument passed, use current directory | |
| 5 | + local file="${1:-.}" | |
| 6 | + | |
| 7 | + # If argument is not an absolute path, prepend $PWD | |
| 8 | + [[ $file = /* ]] || file="$PWD/$file" | |
| 9 | + | |
| 10 | + # Copy the absolute path without resolving symlinks | |
| 11 | + # If clipcopy fails, exit the function with an error | |
| 12 | + print -n "${file:a}" | clipcopy || return 1 | |
| 13 | + | |
| 14 | + echo ${(%):-"%B${file:a}%b copied to clipboard."} | |
| 15 | +} |
+32-0.oh-my-zsh/plugins/cp/README.md
| @@ -0,0 +1,32 @@ | ||
| 1 | +# cp plugin | |
| 2 | + | |
| 3 | +This plugin defines a `cpv` function that uses `rsync` so that you | |
| 4 | +get the features and security of this command. | |
| 5 | + | |
| 6 | +To enable, add `cp` to your `plugins` array in your zshrc file: | |
| 7 | + | |
| 8 | +```zsh | |
| 9 | +plugins=(... cp) | |
| 10 | +``` | |
| 11 | + | |
| 12 | +## Description | |
| 13 | + | |
| 14 | +The enabled options for rsync are: | |
| 15 | + | |
| 16 | +- `-p`: preserves permissions. | |
| 17 | + | |
| 18 | +- `-o`: preserves owner. | |
| 19 | + | |
| 20 | +* `-g`: preserves group. | |
| 21 | + | |
| 22 | +* `-b`: make a backup of the original file instead of overwriting it, if it exists. | |
| 23 | + | |
| 24 | +* `-r`: recurse directories. | |
| 25 | + | |
| 26 | +* `-hhh`: outputs numbers in human-readable format, in units of 1024 (K, M, G, T). | |
| 27 | + | |
| 28 | +* `--backup-dir="/tmp/rsync-$USERNAME"`: move backup copies to "/tmp/rsync-$USERNAME". | |
| 29 | + | |
| 30 | +* `-e /dev/null`: only work on local files (disable remote shells). | |
| 31 | + | |
| 32 | +* `--progress`: display progress. |
+4-0.oh-my-zsh/plugins/cp/cp.plugin.zsh
| @@ -0,0 +1,4 @@ | ||
| 1 | +cpv() { | |
| 2 | + rsync -pogbr -hhh --backup-dir="/tmp/rsync-${USERNAME}" -e /dev/null --progress "$@" | |
| 3 | +} | |
| 4 | +compdef _files cpv |
+9-0.oh-my-zsh/plugins/cpanm/README.md
| @@ -0,0 +1,9 @@ | ||
| 1 | +# Cpanm | |
| 2 | + | |
| 3 | +This plugin provides completion for [Cpanm](https://github.com/miyagawa/cpanminus) ([docs](https://metacpan.org/pod/App::cpanminus)). | |
| 4 | + | |
| 5 | +To use it add cpanm to the plugins array in your zshrc file. | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... cpanm) | |
| 9 | +``` |
+64-0.oh-my-zsh/plugins/cpanm/_cpanm
| @@ -0,0 +1,64 @@ | ||
| 1 | +#compdef cpanm | |
| 2 | + | |
| 3 | +## | |
| 4 | +# cpanminus Z Shell completion script | |
| 5 | +## | |
| 6 | +# | |
| 7 | +# Current supported cpanm version: 1.4000 (Tue Mar 8 01:00:49 PST 2011) | |
| 8 | +# | |
| 9 | + | |
| 10 | +local arguments curcontext="$curcontext" | |
| 11 | +typeset -A opt_args | |
| 12 | + | |
| 13 | + | |
| 14 | +arguments=( | |
| 15 | + | |
| 16 | +# Commands | |
| 17 | +# '(--install -i)'{--install,-i}'[Installs the modules]' | |
| 18 | + '(- :)--self-upgrade[Upgrades itself]' | |
| 19 | + '(- :)--info[Displays distribution info on CPAN]' | |
| 20 | + '(--installdeps)--installdeps[Only install dependencies]' | |
| 21 | + '(--look)--look[Download/unpack the distribution and then open the directory with your shell]' | |
| 22 | + '(- :)'{--help,-h}'[Displays help information]' | |
| 23 | + '(- :)'{--version,-V}'[Displays software version]' | |
| 24 | + | |
| 25 | +# Options | |
| 26 | + {--force,-f}'[Force install]' | |
| 27 | + {--notest,-n}'[Do not run unit tests]' | |
| 28 | + {--sudo,-S}'[sudo to run install commands]' | |
| 29 | + '(-v --verbose --quiet -q)'{--verbose,-v}'[Turns on chatty output]' | |
| 30 | + '(-q --quiet --verbose -v)'{--quiet,-q}'[Turns off all output]' | |
| 31 | + {--local-lib,-l}'[Specify the install base to install modules]' | |
| 32 | + {--local-lib-contained,-L}'[Specify the install base to install all non-core modules]' | |
| 33 | + '--mirror[Specify the base URL for the mirror (e.g. http://cpan.cpantesters.org/)]:URLs:_urls' | |
| 34 | + '--mirror-only[Use the mirror\''s index file instead of the CPAN Meta DB]' | |
| 35 | + '--prompt[Prompt when configure/build/test fails]' | |
| 36 | + '--reinstall[Reinstall the distribution even if you already have the latest version installed]' | |
| 37 | + '--interactive[Turn on interactive configure]' | |
| 38 | + | |
| 39 | + '--scandeps[Scan the dependencies of given modules and output the tree in a text format]' | |
| 40 | + '--format[Specify what format to display the scanned dependency tree]:scandeps format:(tree json yaml dists)' | |
| 41 | + | |
| 42 | + '--save-dists[Specify the optional directory path to copy downloaded tarballs]' | |
| 43 | +# '--uninst-shadows[Uninstalls the shadow files of the distribution that you\''re installing]' | |
| 44 | + | |
| 45 | + '--auto-cleanup[Number of days that cpanm\''s work directories expire in. Defaults to 7]' | |
| 46 | + '(--no-man-pages)--man-pages[Generates man pages for executables (man1) and libraries (man3)]' | |
| 47 | + '(--man-pages)--no-man-pages[Do not generate man pages]' | |
| 48 | + | |
| 49 | + | |
| 50 | + # Note: Normally with "--lwp", "--wget" and "--curl" options set to true (which is the default) cpanm tries LWP, | |
| 51 | + # Wget, cURL and HTTP::Tiny (in that order) and uses the first one available. | |
| 52 | + # (So that the exclusions are not enabled here for the completion) | |
| 53 | + '(--lwp)--lwp[Use LWP module to download stuff]' | |
| 54 | + '(--wget)--wget[Use GNU Wget (if available) to download stuff]' | |
| 55 | + '(--curl)--curl[Use cURL (if available) to download stuff]' | |
| 56 | + | |
| 57 | +# Other completions | |
| 58 | + '*:Local directory or archive:_files -/ -g "*.(tar.gz|tgz|tar.bz2|zip)(-.)"' | |
| 59 | + # '*::args: _normal' # this looks for default files (any files) | |
| 60 | +) | |
| 61 | +_arguments -s $arguments \ | |
| 62 | + && return 0 | |
| 63 | + | |
| 64 | +return 1 |
+28-0.oh-my-zsh/plugins/dash/README.md
| @@ -0,0 +1,28 @@ | ||
| 1 | +# Dash plugin | |
| 2 | + | |
| 3 | +This plugin adds command line functionality for [Dash](https://kapeli.com/dash), | |
| 4 | +an API Documentation Browser for macOS. This plugin requires Dash to be installed | |
| 5 | +to work. | |
| 6 | + | |
| 7 | +To use it, add `dash` to the plugins array in your zshrc file: | |
| 8 | + | |
| 9 | +```zsh | |
| 10 | +plugins=(... dash) | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Usage | |
| 14 | + | |
| 15 | +- Open and switch to the dash application. | |
| 16 | +``` | |
| 17 | +dash | |
| 18 | +``` | |
| 19 | + | |
| 20 | +- Query for something in dash app: `dash query` | |
| 21 | +``` | |
| 22 | +dash golang | |
| 23 | +``` | |
| 24 | + | |
| 25 | +- You can optionally provide a keyword: `dash [keyword:]query` | |
| 26 | +``` | |
| 27 | +dash python:tuple | |
| 28 | +``` |
+84-0.oh-my-zsh/plugins/dash/dash.plugin.zsh
| @@ -0,0 +1,84 @@ | ||
| 1 | +# Usage: dash [keyword:]query | |
| 2 | +dash() { open -a Dash.app "dash://$(omz_urlencode -r $*)" } | |
| 3 | +compdef _dash dash | |
| 4 | + | |
| 5 | +_dash() { | |
| 6 | + # No sense doing this for anything except the 2nd position and if we haven't | |
| 7 | + # specified which docset to query against | |
| 8 | + if [[ $CURRENT -ne 2 || "$words[2]" =~ ":" ]]; then | |
| 9 | + return | |
| 10 | + fi | |
| 11 | + | |
| 12 | + local -aU docsets | |
| 13 | + docsets=() | |
| 14 | + | |
| 15 | + # Use defaults to get the array of docsets from preferences | |
| 16 | + # Have to smash it into one big line so that each docset is an element of our docsets array | |
| 17 | + # Only output docsets that are actually enabled | |
| 18 | + local -a enabled_docsets | |
| 19 | + enabled_docsets=("${(@f)$(defaults read com.kapeli.dashdoc docsets \ | |
| 20 | + | tr -d '\n' | grep -oE '\{.*?\}' | grep -E 'isEnabled = 1;')}") | |
| 21 | + | |
| 22 | + local docset name keyword | |
| 23 | + # Now get each docset and output each on their own line | |
| 24 | + for docset in "$enabled_docsets[@]"; do | |
| 25 | + keyword='' | |
| 26 | + # Order of preference as explained to me by @kapeli via email | |
| 27 | + for locator in keyword suggestedKeyword platform; do | |
| 28 | + # Echo the docset, try to find the appropriate keyword | |
| 29 | + # Strip doublequotes and colon from any keyword so that everything has the | |
| 30 | + # same format when output (we'll add the colon in the completion) | |
| 31 | + if [[ "$docset" =~ "$locator = ([^;]*);" ]]; then | |
| 32 | + keyword="${match[1]//[\":]}" | |
| 33 | + fi | |
| 34 | + | |
| 35 | + if [[ -z "$keyword" ]]; then | |
| 36 | + continue | |
| 37 | + fi | |
| 38 | + | |
| 39 | + # if we fall back to platform, we should do some checking per @kapeli | |
| 40 | + if [[ "$locator" == "platform" ]]; then | |
| 41 | + # Since these are the only special cases right now, let's not do the | |
| 42 | + # expensive processing unless we have to | |
| 43 | + if [[ "$keyword" = (python|java|qt|cocos2d) ]]; then | |
| 44 | + if [[ "$docset" =~ "docsetName = ([^;]*);" ]]; then | |
| 45 | + name="${match[1]//[\":]}" | |
| 46 | + case "$keyword" in | |
| 47 | + python) | |
| 48 | + case "$name" in | |
| 49 | + "Python 2") keyword="python2" ;; | |
| 50 | + "Python 3") keyword="python3" ;; | |
| 51 | + esac ;; | |
| 52 | + java) | |
| 53 | + case "$name" in | |
| 54 | + "Java SE7") keyword="java7" ;; | |
| 55 | + "Java SE6") keyword="java6" ;; | |
| 56 | + "Java SE8") keyword="java8" ;; | |
| 57 | + esac ;; | |
| 58 | + qt) | |
| 59 | + case "$name" in | |
| 60 | + "Qt 5") keyword="qt5" ;; | |
| 61 | + "Qt 4"|Qt) keyword="qt4" ;; | |
| 62 | + esac ;; | |
| 63 | + cocos2d) | |
| 64 | + case "$name" in | |
| 65 | + Cocos3D) keyword="cocos3d" ;; | |
| 66 | + esac ;; | |
| 67 | + esac | |
| 68 | + fi | |
| 69 | + fi | |
| 70 | + fi | |
| 71 | + | |
| 72 | + # Bail once we have a match | |
| 73 | + break | |
| 74 | + done | |
| 75 | + | |
| 76 | + # If we have a keyword, add it to the list! | |
| 77 | + if [[ -n "$keyword" ]]; then | |
| 78 | + docsets+=($keyword) | |
| 79 | + fi | |
| 80 | + done | |
| 81 | + | |
| 82 | + # special thanks to [arx] on #zsh for getting me sorted on this piece | |
| 83 | + compadd -qS: -- "$docsets[@]" | |
| 84 | +} |
+27-0.oh-my-zsh/plugins/dbt/README.md
| @@ -0,0 +1,27 @@ | ||
| 1 | +# dbt plugin | |
| 2 | + | |
| 3 | +The `dbt plugin` adds several aliases for useful [dbt](https://docs.getdbt.com/) commands and | |
| 4 | +[aliases](#aliases). | |
| 5 | + | |
| 6 | +To use it, add `dbt` to the plugins array of your zshrc file: | |
| 7 | + | |
| 8 | +```zsh | |
| 9 | +plugins=(... dbt) | |
| 10 | +``` | |
| 11 | + | |
| 12 | +## Aliases | |
| 13 | + | |
| 14 | +| Alias | Command | Description | | |
| 15 | +| ------ | ------------------------------------------------ | ---------------------------------------------------- | | |
| 16 | +| dbtlm | `dbt ls -s state:modified` | List modified models only | | |
| 17 | +| dbtrm | `dbt run -s state:modified` | Run modified models only | | |
| 18 | +| dbttm | `dbt test -m state:modified` | Test modified models only | | |
| 19 | +| dbtrtm | `dbtrm && dbttm` | Run and test modified models only | | |
| 20 | +| dbtrs | `dbt clean; dbt deps; dbt seed` | Re-seed data | | |
| 21 | +| dbtfrt | `dbtrs; dbt run --full-refresh; dbt test` | Perform a full fresh run with tests | | |
| 22 | +| dbtcds | `dbt docs generate; dbt docs serve` | Generate docs without compiling | | |
| 23 | +| dbtds | `dbt docs generate --no-compile; dbt docs serve` | Generate and serve docs skipping doc. re-compilation | | |
| 24 | + | |
| 25 | +## Maintainer | |
| 26 | + | |
| 27 | +- [msempere](https://github.com/msempere) |
+23-0.oh-my-zsh/plugins/dbt/dbt.plugin.zsh
| @@ -0,0 +1,23 @@ | ||
| 1 | +# list modified models only | |
| 2 | +alias dbtlm="dbt ls -s state:modified" | |
| 3 | + | |
| 4 | +# run modified models only | |
| 5 | +alias dbtrm="dbt run -s state:modified" | |
| 6 | + | |
| 7 | +# test modified models only | |
| 8 | +alias dbttm="dbt test -m state:modified" | |
| 9 | + | |
| 10 | +# run and test modified models only | |
| 11 | +alias dbtrtm="dbtrm && dbttm" | |
| 12 | + | |
| 13 | +# re-seed data | |
| 14 | +alias dbtrs="dbt clean; dbt deps; dbt seed" | |
| 15 | + | |
| 16 | +# perform a full fresh run with tests | |
| 17 | +alias dbtfrt="dbtrs; dbt run --full-refresh; dbt test" | |
| 18 | + | |
| 19 | +# generate and serve docs | |
| 20 | +alias dbtcds="dbt docs generate; dbt docs serve" | |
| 21 | + | |
| 22 | +# generate and serve docs skipping doc. re-compilation | |
| 23 | +alias dbtds="dbt docs generate --no-compile; dbt docs serve" |
+92-0.oh-my-zsh/plugins/debian/README.md
| @@ -0,0 +1,92 @@ | ||
| 1 | +# debian | |
| 2 | + | |
| 3 | +This plugin provides Debian-related aliases and functions for zsh. | |
| 4 | + | |
| 5 | +To use it add `debian` to the plugins array in your zshrc file. | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... debian) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Settings | |
| 12 | + | |
| 13 | +- `$apt_pref`: use aptitude or apt if installed, fallback is apt-get. | |
| 14 | +- `$apt_upgr`: use upgrade or safe-upgrade (for aptitude). | |
| 15 | + | |
| 16 | +Set **both** `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh My Zsh) to override this behavior, e.g.: | |
| 17 | + | |
| 18 | +```sh | |
| 19 | +apt_pref='apt' | |
| 20 | +apt_upgr='full-upgrade' | |
| 21 | +``` | |
| 22 | + | |
| 23 | +## Common Aliases | |
| 24 | + | |
| 25 | +| Alias | Command | Description | | |
| 26 | +| ------ | ---------------------------------------------------------------------- | ---------------------------------------------------------- | | |
| 27 | +| `age` | `apt-get` | Command line tool for handling packages | | |
| 28 | +| `api` | `aptitude` | Same functionality as `apt-get`, provides extra options | | |
| 29 | +| `acs` | `apt-cache search` | Command line tool for searching apt software package cache | | |
| 30 | +| `aps` | `aptitude search` | Searches installed packages using aptitude | | |
| 31 | +| `as` | `aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search` | Print searched packages using a custom format | | |
| 32 | +| `afs` | `apt-file search --regexp` | Search file in packages | | |
| 33 | +| `asrc` | `apt-get source` | Fetch source packages through `apt-get` | | |
| 34 | +| `app` | `apt-cache policy` | Displays priority of package sources | | |
| 35 | + | |
| 36 | +## Superuser Operations Aliases | |
| 37 | + | |
| 38 | +| Alias | Command | Description | | |
| 39 | +| -------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | | |
| 40 | +| `aac` | `sudo $apt_pref autoclean` | Clears out the local repository of retrieved package files | | |
| 41 | +| `aar` | `sudo $apt_pref autoremove` | Removes packages installed automatically that are no longer needed | | |
| 42 | +| `abd` | `sudo $apt_pref build-dep` | Installs all dependencies for building packages | | |
| 43 | +| `ac` | `sudo $apt_pref clean` | Clears out the local repository of retrieved package files except lock files | | |
| 44 | +| `ad` | `sudo $apt_pref update` | Updates the package lists for upgrades for packages | | |
| 45 | +| `adg` | `sudo $apt_pref update && sudo $apt_pref $apt_upgr` | Update and upgrade packages | | |
| 46 | +| `ads` | `sudo apt-get dselect-upgrade` | Installs packages from list and removes all not in the list | | |
| 47 | +| `adu` | `sudo $apt_pref update && sudo $apt_pref dist-upgrade` | Smart upgrade that handles dependencies | | |
| 48 | +| `afu` | `sudo apt-file update` | Update the files in packages | | |
| 49 | +| `ai` | `sudo $apt_pref install` | Command-line tool to install package | | |
| 50 | +| `ail` | `sed -e 's/ */ /g' -e 's/ *//' \| cut -s -d ' ' -f 1 \| xargs sudo $apt_pref install` | Install all packages given on the command line while using only the first word of each line | | |
| 51 | +| `alu` | `sudo apt update && apt list -u && sudo apt upgrade` | Update, list and upgrade packages | | |
| 52 | +| `ap` | `sudo $apt_pref purge` | Removes packages along with configuration files | | |
| 53 | +| `au` | `sudo $apt_pref $apt_upgr` | Install package upgrades | | |
| 54 | +| `di` | `sudo dpkg -i` | Install all .deb files in the current directory | | |
| 55 | +| `dia` | `sudo dpkg -i ./*.deb` | Install all .deb files in the current directory | | |
| 56 | +| `kclean` | `sudo aptitude remove -P ?and(~i~nlinux-(ima\|hea) ?not(~n$(uname -r)))` | Remove ALL kernel images and headers EXCEPT the one in use | | |
| 57 | + | |
| 58 | +## Aliases - Commands using `su` | |
| 59 | + | |
| 60 | +| Alias | Command | | |
| 61 | +| ----- | --------------------------------------------------------- | | |
| 62 | +| `aac` | `su -ls "$apt_pref autoclean" root` | | |
| 63 | +| `aar` | `su -ls "$apt_pref autoremove" root` | | |
| 64 | +| `ac` | `su -ls "$apt_pref clean" root` | | |
| 65 | +| `ad` | `su -lc "$apt_pref update" root` | | |
| 66 | +| `adg` | `su -lc "$apt_pref update && aptitude $apt_upgr" root` | | |
| 67 | +| `adu` | `su -lc "$apt_pref update && aptitude dist-upgrade" root` | | |
| 68 | +| `afu` | `su -lc "apt-file update"` | | |
| 69 | +| `au` | `su -lc "$apt_pref $apt_upgr" root` | | |
| 70 | +| `dia` | `su -lc "dpkg -i ./*.deb" root` | | |
| 71 | + | |
| 72 | +## Miscellaneous Aliases | |
| 73 | + | |
| 74 | +| Alias | Command | Description | | |
| 75 | +| --------- | ---------------------------------------------- | ------------------------------ | | |
| 76 | +| `allpkgs` | `aptitude search -F "%p" --disable-columns ~i` | Display all installed packages | | |
| 77 | +| `mydeb` | `time dpkg-buildpackage -rfakeroot -us -uc` | Create a basic .deb package | | |
| 78 | + | |
| 79 | +## Functions | |
| 80 | + | |
| 81 | +| Function | Description | | |
| 82 | +| ------------------- | --------------------------------------------------------------- | | |
| 83 | +| `apt-copy` | Create a simple script that can be used to 'duplicate' a system | | |
| 84 | +| `apt-history` | Displays apt history for a command | | |
| 85 | +| `apt-list-packages` | List packages by size | | |
| 86 | +| `kerndeb` | Builds kernel packages | | |
| 87 | + | |
| 88 | +## Authors | |
| 89 | + | |
| 90 | +- [@AlexBio](https://github.com/AlexBio) | |
| 91 | +- [@dbb](https://github.com/dbb) | |
| 92 | +- [@Mappleconfusers](https://github.com/Mappleconfusers) |
+227-0.oh-my-zsh/plugins/debian/debian.plugin.zsh
| @@ -0,0 +1,227 @@ | ||
| 1 | +# Use aptitude or apt if installed, fallback is apt-get | |
| 2 | +# You can just set apt_pref='apt-get' to override it. | |
| 3 | + | |
| 4 | +if [[ -z $apt_pref || -z $apt_upgr ]]; then | |
| 5 | + if [[ -e $commands[aptitude] ]]; then | |
| 6 | + apt_pref='aptitude' | |
| 7 | + apt_upgr='safe-upgrade' | |
| 8 | + elif [[ -e $commands[apt] ]]; then | |
| 9 | + apt_pref='apt' | |
| 10 | + apt_upgr='upgrade' | |
| 11 | + else | |
| 12 | + apt_pref='apt-get' | |
| 13 | + apt_upgr='upgrade' | |
| 14 | + fi | |
| 15 | +fi | |
| 16 | + | |
| 17 | +# Use sudo by default if it's installed | |
| 18 | +if [[ -e $commands[sudo] ]]; then | |
| 19 | + use_sudo=1 | |
| 20 | +fi | |
| 21 | + | |
| 22 | +# Aliases ################################################################### | |
| 23 | +# These are for more obscure uses of apt-get and aptitude that aren't covered | |
| 24 | +# below. | |
| 25 | +alias age='apt-get' | |
| 26 | +alias api='aptitude' | |
| 27 | + | |
| 28 | +# Some self-explanatory aliases | |
| 29 | +alias acs="apt-cache search" | |
| 30 | +alias aps='aptitude search' | |
| 31 | +alias as="aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search" | |
| 32 | + | |
| 33 | +# apt-file | |
| 34 | +alias afs='apt-file search --regexp' | |
| 35 | + | |
| 36 | + | |
| 37 | +# These are apt-get only | |
| 38 | +alias asrc='apt-get source' | |
| 39 | +alias app='apt-cache policy' | |
| 40 | + | |
| 41 | +# superuser operations ###################################################### | |
| 42 | +if [[ $use_sudo -eq 1 ]]; then | |
| 43 | +# commands using sudo ####### | |
| 44 | + alias aac="sudo $apt_pref autoclean" | |
| 45 | + alias abd="sudo $apt_pref build-dep" | |
| 46 | + alias ac="sudo $apt_pref clean" | |
| 47 | + alias ad="sudo $apt_pref update" | |
| 48 | + alias adg="sudo $apt_pref update && sudo $apt_pref $apt_upgr" | |
| 49 | + alias adu="sudo $apt_pref update && sudo $apt_pref dist-upgrade" | |
| 50 | + alias afu="sudo apt-file update" | |
| 51 | + alias au="sudo $apt_pref $apt_upgr" | |
| 52 | + alias ai="sudo $apt_pref install" | |
| 53 | + # Install all packages given on the command line while using only the first word of each line: | |
| 54 | + # acse ... | ail | |
| 55 | + | |
| 56 | + alias ail="sed -e 's/ */ /g' -e 's/ *//' | cut -s -d ' ' -f 1 | xargs sudo $apt_pref install" | |
| 57 | + alias ap="sudo $apt_pref purge" | |
| 58 | + alias aar="sudo $apt_pref autoremove" | |
| 59 | + | |
| 60 | + # apt-get only | |
| 61 | + alias ads="sudo apt-get dselect-upgrade" | |
| 62 | + | |
| 63 | + # apt only | |
| 64 | + alias alu="sudo apt update && apt list -u && sudo apt upgrade" | |
| 65 | + | |
| 66 | + # Install all .deb files in the current directory. | |
| 67 | + # Warning: you will need to put the glob in single quotes if you use: | |
| 68 | + # glob_subst | |
| 69 | + alias dia="sudo dpkg -i ./*.deb" | |
| 70 | + alias di="sudo dpkg -i" | |
| 71 | + | |
| 72 | + # Remove ALL kernel images and headers EXCEPT the one in use | |
| 73 | + alias kclean='sudo aptitude remove -P "?and(~i~nlinux-(ima|hea) ?not(~n$(uname -r)))"' | |
| 74 | + | |
| 75 | + | |
| 76 | +# commands using su ######### | |
| 77 | +else | |
| 78 | + alias aac="su -ls '$apt_pref autoclean' root" | |
| 79 | + function abd() { | |
| 80 | + cmd="su -lc '$apt_pref build-dep $@' root" | |
| 81 | + print "$cmd" | |
| 82 | + eval "$cmd" | |
| 83 | + } | |
| 84 | + alias ac="su -ls '$apt_pref clean' root" | |
| 85 | + alias ad="su -lc '$apt_pref update' root" | |
| 86 | + alias adg="su -lc '$apt_pref update && $apt_pref $apt_upgr' root" | |
| 87 | + alias adu="su -lc '$apt_pref update && $apt_pref dist-upgrade' root" | |
| 88 | + alias afu="su -lc 'apt-file update'" | |
| 89 | + alias au="su -lc '$apt_pref $apt_upgr' root" | |
| 90 | + function ai() { | |
| 91 | + cmd="su -lc '$apt_pref install $@' root" | |
| 92 | + print "$cmd" | |
| 93 | + eval "$cmd" | |
| 94 | + } | |
| 95 | + function ap() { | |
| 96 | + cmd="su -lc '$apt_pref purge $@' root" | |
| 97 | + print "$cmd" | |
| 98 | + eval "$cmd" | |
| 99 | + } | |
| 100 | + function aar() { | |
| 101 | + cmd="su -lc '$apt_pref autoremove $@' root" | |
| 102 | + print "$cmd" | |
| 103 | + eval "$cmd" | |
| 104 | + } | |
| 105 | + # Install all .deb files in the current directory | |
| 106 | + # Assumes glob_subst is off | |
| 107 | + alias dia='su -lc "dpkg -i ./*.deb" root' | |
| 108 | + alias di='su -lc "dpkg -i" root' | |
| 109 | + | |
| 110 | + # Remove ALL kernel images and headers EXCEPT the one in use | |
| 111 | + alias kclean='su -lc "aptitude remove -P \"?and(~i~nlinux-(ima|hea) ?not(~n$(uname -r)))\"" root' | |
| 112 | +fi | |
| 113 | + | |
| 114 | +# Completion ################################################################ | |
| 115 | + | |
| 116 | +# | |
| 117 | +# Registers a compdef for $1 that calls $apt_pref with the commands $2 | |
| 118 | +# To do that it creates a new completion function called _apt_pref_$2 | |
| 119 | +# | |
| 120 | +function apt_pref_compdef() { | |
| 121 | + local f fb | |
| 122 | + f="_apt_pref_${2}" | |
| 123 | + | |
| 124 | + eval "function ${f}() { | |
| 125 | + shift words; | |
| 126 | + service=\"\$apt_pref\"; | |
| 127 | + words=(\"\$apt_pref\" '$2' \$words); | |
| 128 | + ((CURRENT++)) | |
| 129 | + test \"\${apt_pref}\" = 'aptitude' && _aptitude || _apt | |
| 130 | + }" | |
| 131 | + | |
| 132 | + compdef "$f" "$1" | |
| 133 | +} | |
| 134 | + | |
| 135 | +apt_pref_compdef aac "autoclean" | |
| 136 | +apt_pref_compdef abd "build-dep" | |
| 137 | +apt_pref_compdef ac "clean" | |
| 138 | +apt_pref_compdef ad "update" | |
| 139 | +apt_pref_compdef afu "update" | |
| 140 | +apt_pref_compdef au "$apt_upgr" | |
| 141 | +apt_pref_compdef ai "install" | |
| 142 | +apt_pref_compdef ail "install" | |
| 143 | +apt_pref_compdef ap "purge" | |
| 144 | +apt_pref_compdef aar "autoremove" | |
| 145 | +apt_pref_compdef ads "dselect-upgrade" | |
| 146 | + | |
| 147 | +# Misc. ##################################################################### | |
| 148 | +# print all installed packages | |
| 149 | +alias allpkgs='aptitude search -F "%p" --disable-columns ~i' | |
| 150 | + | |
| 151 | +# Create a basic .deb package | |
| 152 | +alias mydeb='time dpkg-buildpackage -rfakeroot -us -uc' | |
| 153 | + | |
| 154 | + | |
| 155 | +# Functions ################################################################# | |
| 156 | +# create a simple script that can be used to 'duplicate' a system | |
| 157 | +function apt-copy() { | |
| 158 | + print '#!/bin/sh'"\n" > apt-copy.sh | |
| 159 | + | |
| 160 | + cmd='$apt_pref install' | |
| 161 | + | |
| 162 | + for p in ${(f)"$(aptitude search -F "%p" --disable-columns \~i)"}; { | |
| 163 | + cmd="${cmd} ${p}" | |
| 164 | + } | |
| 165 | + | |
| 166 | + print $cmd "\n" >> apt-copy.sh | |
| 167 | + | |
| 168 | + chmod +x apt-copy.sh | |
| 169 | +} | |
| 170 | + | |
| 171 | +# Prints apt history | |
| 172 | +# Usage: | |
| 173 | +# apt-history install | |
| 174 | +# apt-history upgrade | |
| 175 | +# apt-history remove | |
| 176 | +# apt-history rollback | |
| 177 | +# apt-history list | |
| 178 | +# Based On: https://linuxcommando.blogspot.com/2008/08/how-to-show-apt-log-history.html | |
| 179 | +function apt-history() { | |
| 180 | + case "$1" in | |
| 181 | + install) | |
| 182 | + zgrep --no-filename 'install ' $(ls -rt /var/log/dpkg*) | |
| 183 | + ;; | |
| 184 | + upgrade|remove) | |
| 185 | + zgrep --no-filename $1 $(ls -rt /var/log/dpkg*) | |
| 186 | + ;; | |
| 187 | + rollback) | |
| 188 | + zgrep --no-filename upgrade $(ls -rt /var/log/dpkg*) | \ | |
| 189 | + grep "$2" -A10000000 | \ | |
| 190 | + grep "$3" -B10000000 | \ | |
| 191 | + awk '{print $4"="$5}' | |
| 192 | + ;; | |
| 193 | + list) | |
| 194 | + zgrep --no-filename '' $(ls -rt /var/log/dpkg*) | |
| 195 | + ;; | |
| 196 | + *) | |
| 197 | + echo "Parameters:" | |
| 198 | + echo " install - Lists all packages that have been installed." | |
| 199 | + echo " upgrade - Lists all packages that have been upgraded." | |
| 200 | + echo " remove - Lists all packages that have been removed." | |
| 201 | + echo " rollback - Lists rollback information." | |
| 202 | + echo " list - Lists all contains of dpkg logs." | |
| 203 | + ;; | |
| 204 | + esac | |
| 205 | +} | |
| 206 | + | |
| 207 | +# Kernel-package building shortcut | |
| 208 | +function kerndeb() { | |
| 209 | + # temporarily unset MAKEFLAGS ( '-j3' will fail ) | |
| 210 | + MAKEFLAGS=$( print - $MAKEFLAGS | perl -pe 's/-j\s*[\d]+//g' ) | |
| 211 | + print '$MAKEFLAGS set to '"'$MAKEFLAGS'" | |
| 212 | + appendage='-custom' # this shows up in $(uname -r ) | |
| 213 | + revision=$(date +"%Y%m%d") # this shows up in the .deb file name | |
| 214 | + | |
| 215 | + make-kpkg clean | |
| 216 | + | |
| 217 | + time fakeroot make-kpkg --append-to-version "$appendage" --revision \ | |
| 218 | + "$revision" kernel_image kernel_headers | |
| 219 | +} | |
| 220 | + | |
| 221 | +# List packages by size | |
| 222 | +function apt-list-packages() { | |
| 223 | + dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | \ | |
| 224 | + grep -v deinstall | \ | |
| 225 | + sort -n | \ | |
| 226 | + awk '{print $1" "$2}' | |
| 227 | +} |
+20-0.oh-my-zsh/plugins/deno/README.md
| @@ -0,0 +1,20 @@ | ||
| 1 | +# Deno Plugin | |
| 2 | + | |
| 3 | +This plugin sets up completion and aliases for [Deno](https://deno.land). | |
| 4 | + | |
| 5 | +## Aliases | |
| 6 | + | |
| 7 | +| Alias | Full command | | |
| 8 | +| ----- | ------------------- | | |
| 9 | +| db | deno bundle | | |
| 10 | +| dc | deno compile | | |
| 11 | +| dca | deno cache | | |
| 12 | +| dfmt | deno fmt | | |
| 13 | +| dh | deno help | | |
| 14 | +| dli | deno lint | | |
| 15 | +| drn | deno run | | |
| 16 | +| drA | deno run -A | | |
| 17 | +| drw | deno run --watch | | |
| 18 | +| dru | deno run --unstable | | |
| 19 | +| dts | deno test | | |
| 20 | +| dup | deno upgrade | |
+28-0.oh-my-zsh/plugins/deno/deno.plugin.zsh
| @@ -0,0 +1,28 @@ | ||
| 1 | +# ALIASES | |
| 2 | +alias db='deno bundle' | |
| 3 | +alias dc='deno compile' | |
| 4 | +alias dca='deno cache' | |
| 5 | +alias dfmt='deno fmt' | |
| 6 | +alias dh='deno help' | |
| 7 | +alias dli='deno lint' | |
| 8 | +alias drn='deno run' | |
| 9 | +alias drA='deno run -A' | |
| 10 | +alias drw='deno run --watch' | |
| 11 | +alias dru='deno run --unstable' | |
| 12 | +alias dts='deno test' | |
| 13 | +alias dup='deno upgrade' | |
| 14 | + | |
| 15 | +# COMPLETION FUNCTION | |
| 16 | +if (( ! $+commands[deno] )); then | |
| 17 | + return | |
| 18 | +fi | |
| 19 | + | |
| 20 | +# If the completion file doesn't exist yet, we need to autoload it and | |
| 21 | +# bind it to `deno`. Otherwise, compinit will have already done that. | |
| 22 | +if [[ ! -f "$ZSH_CACHE_DIR/completions/_deno" ]]; then | |
| 23 | + typeset -g -A _comps | |
| 24 | + autoload -Uz _deno | |
| 25 | + _comps[deno]=_deno | |
| 26 | +fi | |
| 27 | + | |
| 28 | +deno completions zsh >| "$ZSH_CACHE_DIR/completions/_deno" &| |
+82-0.oh-my-zsh/plugins/dircycle/README.md
| @@ -0,0 +1,82 @@ | ||
| 1 | +# dircycle | |
| 2 | + | |
| 3 | +Plugin for cycling through the directory stack | |
| 4 | + | |
| 5 | +This plugin enables directory navigation similar to using back and forward on browsers or common file explorers like Finder or Nautilus. It uses a small zle trick that lets you cycle through your directory stack left or right using <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> / <kbd>Right</kbd> . This is useful when moving back and forth between directories in development environments, and can be thought of as kind of a nondestructive pushd/popd. | |
| 6 | + | |
| 7 | +## Enabling the plugin | |
| 8 | + | |
| 9 | +1. Open your `.zshrc` file and add `dircycle` in the plugins section: | |
| 10 | + | |
| 11 | + ```zsh | |
| 12 | + plugins=( | |
| 13 | + # all your enabled plugins | |
| 14 | + dircycle | |
| 15 | + ) | |
| 16 | + ``` | |
| 17 | + | |
| 18 | +2. Restart the shell or restart your Terminal session: | |
| 19 | + | |
| 20 | + ```console | |
| 21 | + $ exec zsh | |
| 22 | + $ | |
| 23 | + ``` | |
| 24 | + | |
| 25 | +## Usage Examples | |
| 26 | + | |
| 27 | +Say you opened these directories on the terminal: | |
| 28 | + | |
| 29 | +```console | |
| 30 | +~$ cd Projects | |
| 31 | +~/Projects$ cd Hacktoberfest | |
| 32 | +~/Projects/Hacktoberfest$ cd oh-my-zsh | |
| 33 | +~/Projects/Hacktoberfest/oh-my-zsh$ dirs -v | |
| 34 | +0 ~/Projects/Hacktoberfest/oh-my-zsh | |
| 35 | +1 ~/Projects/Hacktoberfest | |
| 36 | +2 ~/Projects | |
| 37 | +3 ~ | |
| 38 | +``` | |
| 39 | + | |
| 40 | +By pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd>, the current working directory or `$PWD` will be from `oh-my-zsh` to `Hacktoberfest`. Press it again and it will be at `Projects`. | |
| 41 | + | |
| 42 | +And by pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd>, the `$PWD` will be from `Projects` to `Hacktoberfest`. Press it again and it will be at `oh-my-zsh`. | |
| 43 | + | |
| 44 | +Here's a example history table with the same accessed directories like above: | |
| 45 | + | |
| 46 | +| Current `$PWD` | Key press | New `$PWD` | | |
| 47 | +| --------------- | ----------------------------------------------------- | --------------- | | |
| 48 | +| `oh-my-zsh` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> | `Hacktoberfest` | | |
| 49 | +| `Hacktoberfest` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> | `Projects` | | |
| 50 | +| `Projects` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> | `~` | | |
| 51 | +| `~` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `Projects` | | |
| 52 | +| `Projects` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `Hacktoberfest` | | |
| 53 | +| `Hacktoberfest` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `oh-my-zsh` | | |
| 54 | +| `oh-my-zsh` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `~` | | |
| 55 | + | |
| 56 | +Note the last traversal, when pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> on a last known `$PWD`, it will change back to the first known `$PWD`, which in the example is `~`. | |
| 57 | + | |
| 58 | +Here's an asciinema cast demonstrating the example above: | |
| 59 | + | |
| 60 | +[](https://asciinema.org/a/204406) | |
| 61 | + | |
| 62 | +## Functions | |
| 63 | + | |
| 64 | +| Function | Description | | |
| 65 | +| -------------------- | ------------------------------------------------------------------------------------------------------------------- | | |
| 66 | +| `insert-cycledleft` | Change `$PWD` to the previous known stack, bound to <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> | | |
| 67 | +| `insert-cycledright` | Change `$PWD` to the next known stack, bound to <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | | |
| 68 | +| `insert-cycledup` | Change `$PWD` to the parent folder, bound to <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Up</kbd> | | |
| 69 | +| `insert-cycleddown` | Change `$PWD` to the first alphabetical child folder, bound to <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Down</kbd> | | |
| 70 | + | |
| 71 | +## Rebinding keys | |
| 72 | + | |
| 73 | +You can bind these functions to other key sequences, as long as you know the bindkey sequence. For example, these commands bind to <kbd>Alt</kbd> + <kbd>Shift</kbd> + <kbd>key</kbd> in `xterm-256color`: | |
| 74 | + | |
| 75 | +```zsh | |
| 76 | +bindkey '^[[1;4D' insert-cycledleft | |
| 77 | +bindkey '^[[1;4C' insert-cycledright | |
| 78 | +bindkey "\e[1;4A" insert-cycledup | |
| 79 | +bindkey "\e[1;4B" insert-cycleddown | |
| 80 | +``` | |
| 81 | + | |
| 82 | +You can get the bindkey sequence by pressing <kbd>Ctrl</kbd> + <kbd>V</kbd>, then pressing the keyboard shortcut you want to use. |
+87-0.oh-my-zsh/plugins/dircycle/dircycle.plugin.zsh
| @@ -0,0 +1,87 @@ | ||
| 1 | +# enables cycling through the directory stack using | |
| 2 | +# Ctrl+Shift+Left/Right | |
| 3 | +# | |
| 4 | +# left/right direction follows the order in which directories | |
| 5 | +# were visited, like left/right arrows do in a browser | |
| 6 | + | |
| 7 | +# NO_PUSHD_MINUS syntax: | |
| 8 | +# pushd +N: start counting from left of `dirs' output | |
| 9 | +# pushd -N: start counting from right of `dirs' output | |
| 10 | + | |
| 11 | +# Either switch to a directory from dirstack, using +N or -N syntax | |
| 12 | +# or switch to a directory by path, using `switch-to-dir -- <path>` | |
| 13 | +switch-to-dir () { | |
| 14 | + # If $1 is --, then treat $2 as a directory path | |
| 15 | + if [[ $1 == -- ]]; then | |
| 16 | + # We use `-q` because we don't want chpwd to run, we'll do it manually | |
| 17 | + [[ -d "$2" ]] && builtin pushd -q "$2" &>/dev/null | |
| 18 | + return $? | |
| 19 | + fi | |
| 20 | + | |
| 21 | + setopt localoptions nopushdminus | |
| 22 | + [[ ${#dirstack} -eq 0 ]] && return 1 | |
| 23 | + | |
| 24 | + while ! builtin pushd -q $1 &>/dev/null; do | |
| 25 | + # We found a missing directory: pop it out of the dir stack | |
| 26 | + builtin popd -q $1 | |
| 27 | + | |
| 28 | + # Stop trying if there are no more directories in the dir stack | |
| 29 | + [[ ${#dirstack} -eq 0 ]] && return 1 | |
| 30 | + done | |
| 31 | +} | |
| 32 | + | |
| 33 | +insert-cycledleft () { | |
| 34 | + switch-to-dir +1 || return $? | |
| 35 | + | |
| 36 | + local fn | |
| 37 | + for fn in chpwd $chpwd_functions precmd $precmd_functions; do | |
| 38 | + (( $+functions[$fn] )) && $fn | |
| 39 | + done | |
| 40 | + zle reset-prompt | |
| 41 | +} | |
| 42 | +zle -N insert-cycledleft | |
| 43 | + | |
| 44 | +insert-cycledright () { | |
| 45 | + switch-to-dir -0 || return $? | |
| 46 | + | |
| 47 | + local fn | |
| 48 | + for fn in chpwd $chpwd_functions precmd $precmd_functions; do | |
| 49 | + (( $+functions[$fn] )) && $fn | |
| 50 | + done | |
| 51 | + zle reset-prompt | |
| 52 | +} | |
| 53 | +zle -N insert-cycledright | |
| 54 | + | |
| 55 | +insert-cycledup () { | |
| 56 | + switch-to-dir -- .. || return $? | |
| 57 | + | |
| 58 | + local fn | |
| 59 | + for fn in chpwd $chpwd_functions precmd $precmd_functions; do | |
| 60 | + (( $+functions[$fn] )) && $fn | |
| 61 | + done | |
| 62 | + zle reset-prompt | |
| 63 | +} | |
| 64 | +zle -N insert-cycledup | |
| 65 | + | |
| 66 | +insert-cycleddown () { | |
| 67 | + switch-to-dir -- "$(find . -mindepth 1 -maxdepth 1 -type d | sort -n | head -n 1)" || return $? | |
| 68 | + | |
| 69 | + local fn | |
| 70 | + for fn in chpwd $chpwd_functions precmd $precmd_functions; do | |
| 71 | + (( $+functions[$fn] )) && $fn | |
| 72 | + done | |
| 73 | + zle reset-prompt | |
| 74 | +} | |
| 75 | +zle -N insert-cycleddown | |
| 76 | + | |
| 77 | +# These sequences work for xterm, Apple Terminal.app, and probably others. | |
| 78 | +# Not for rxvt-unicode, but it doesn't seem differentiate Ctrl-Shift-Arrow | |
| 79 | +# from plain Shift-Arrow, at least by default. | |
| 80 | +# | |
| 81 | +# iTerm2 does not have these key combinations defined by default; you will need | |
| 82 | +# to add them under "Keys" in your profile if you want to use this. You can do | |
| 83 | +# this conveniently by loading the "xterm with Numeric Keypad" preset. | |
| 84 | +bindkey "\e[1;6D" insert-cycledleft # Ctrl+Shift+Left | |
| 85 | +bindkey "\e[1;6C" insert-cycledright # Ctrl+Shift+Right | |
| 86 | +bindkey "\e[1;6A" insert-cycledup # Ctrl+Shift+Up | |
| 87 | +bindkey "\e[1;6B" insert-cycleddown # Ctrl+Shift+Down |
+15-0.oh-my-zsh/plugins/direnv/README.md
| @@ -0,0 +1,15 @@ | ||
| 1 | +# direnv plugin | |
| 2 | + | |
| 3 | +This plugin creates the [Direnv](https://direnv.net/) hook. | |
| 4 | + | |
| 5 | +To use it, add `direnv` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... direnv) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Requirements | |
| 12 | + | |
| 13 | +In order to make this work, you will need to have the direnv installed. | |
| 14 | + | |
| 15 | +More info on the usage and install: https://github.com/direnv/direnv |
+19-0.oh-my-zsh/plugins/direnv/direnv.plugin.zsh
| @@ -0,0 +1,19 @@ | ||
| 1 | +# If direnv is not found, don't continue and print a warning | |
| 2 | +if (( ! $+commands[direnv] )); then | |
| 3 | + echo "Warning: direnv not found. Please install direnv and ensure it's in your PATH before using this plugin." | |
| 4 | + return | |
| 5 | +fi | |
| 6 | + | |
| 7 | +_direnv_hook() { | |
| 8 | + trap -- '' SIGINT; | |
| 9 | + eval "$(direnv export zsh)"; | |
| 10 | + trap - SIGINT; | |
| 11 | +} | |
| 12 | +typeset -ag precmd_functions; | |
| 13 | +if [[ -z "${precmd_functions[(r)_direnv_hook]+1}" ]]; then | |
| 14 | + precmd_functions=( _direnv_hook ${precmd_functions[@]} ) | |
| 15 | +fi | |
| 16 | +typeset -ag chpwd_functions; | |
| 17 | +if [[ -z "${chpwd_functions[(r)_direnv_hook]+1}" ]]; then | |
| 18 | + chpwd_functions=( _direnv_hook ${chpwd_functions[@]} ) | |
| 19 | +fi |
+105-0.oh-my-zsh/plugins/dirhistory/README.md
| @@ -0,0 +1,105 @@ | ||
| 1 | +# Dirhistory plugin | |
| 2 | + | |
| 3 | +This plugin adds keyboard shortcuts for navigating directory history and hierarchy. | |
| 4 | + | |
| 5 | +To use it, add `dirhistory` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... dirhistory) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Keyboard Shortcuts | |
| 12 | + | |
| 13 | +| Shortcut | Description | | |
| 14 | +|-----------------------------------|-----------------------------------------------------------| | |
| 15 | +| <kbd>Alt</kbd> + <kbd>Left</kbd> | Go to previous directory | | |
| 16 | +| <kbd>Alt</kbd> + <kbd>Right</kbd> | Go to next directory | | |
| 17 | +| <kbd>Alt</kbd> + <kbd>Up</kbd> | Move into the parent directory | | |
| 18 | +| <kbd>Alt</kbd> + <kbd>Down</kbd> | Move into the first child directory by alphabetical order | | |
| 19 | + | |
| 20 | +**For macOS: use the Option key (<kbd>โฅ</kbd>) instead of <kbd>Alt</kbd>**. | |
| 21 | + | |
| 22 | +> NOTE: some terminals might override the <kbd>Alt</kbd> + Arrows key bindings (e.g. Windows Terminal). | |
| 23 | +> If these don't work check your terminal settings and change them to a different keyboard shortcut. | |
| 24 | + | |
| 25 | +## Usage | |
| 26 | + | |
| 27 | +This plugin allows you to navigate the history of previous working directories using <kbd>Alt</kbd> + <kbd>Left</kbd> | |
| 28 | +and <kbd>Alt</kbd> + <kbd>Right</kbd>. <kbd>Alt</kbd> + <kbd>Left</kbd> moves to past directories, and | |
| 29 | +<kbd>Alt</kbd> + <kbd>Right</kbd> goes back to recent directories. | |
| 30 | + | |
| 31 | +**NOTE: the maximum directory history size is 30.** | |
| 32 | + | |
| 33 | +You can also navigate **directory hierarchies** using <kbd>Alt</kbd> + <kbd>Up</kbd> and <kbd>Alt</kbd> + <kbd>Down</kbd>. | |
| 34 | +<kbd>Alt</kbd> + <kbd>Up</kbd> moves to the parent directory, while <kbd>Alt</kbd> + <kbd>Down</kbd> moves into the first | |
| 35 | +child directory found in alphabetical order (useful to navigate long empty directories, e.g. Java packages). | |
| 36 | + | |
| 37 | +For example, if the shell was started, and the following commands were entered: | |
| 38 | + | |
| 39 | +```shell | |
| 40 | +cd ~ | |
| 41 | +cd /usr | |
| 42 | +cd share | |
| 43 | +cd doc | |
| 44 | +``` | |
| 45 | + | |
| 46 | +the directory stack (`dirs -v`) would look like this: | |
| 47 | + | |
| 48 | +```console | |
| 49 | +$ dirs -v | |
| 50 | +0 /usr/share/doc | |
| 51 | +1 /usr/share | |
| 52 | +2 /usr | |
| 53 | +3 ~ | |
| 54 | +``` | |
| 55 | + | |
| 56 | +then entering <kbd>Alt</kbd> + <kbd>Left</kbd> at the prompt would change directory from `/usr/share/doc` to `/usr/share`, | |
| 57 | +then if pressed again to `/usr`, then `~`. If <kbd>Alt</kbd> + <kbd>Right</kbd> were pressed the directory would be changed | |
| 58 | +to `/usr` again. | |
| 59 | + | |
| 60 | +After that, <kbd>Alt</kbd> + <kbd>Down</kbd> will probably go to `/usr/bin` if `bin` is the first directory in alphabetical | |
| 61 | +order (depends on your `/usr` folder structure). <kbd>Alt</kbd> + <kbd>Up</kbd> will return to `/usr`, and once more will get | |
| 62 | +you to the root folder (`/`). | |
| 63 | + | |
| 64 | +### cde | |
| 65 | + | |
| 66 | +This plugin also provides a `cde` alias that allows you to change to a directory without clearing the next directory stack. | |
| 67 | +This changes the default behavior of `dirhistory`, which is to clear the next directory stack when changing directories. | |
| 68 | + | |
| 69 | +For example, if the shell was started, and the following commands were entered: | |
| 70 | + | |
| 71 | +```shell | |
| 72 | +cd ~ | |
| 73 | +cd /usr | |
| 74 | +cd share | |
| 75 | +cd doc | |
| 76 | + | |
| 77 | +# <Alt + Left> | |
| 78 | +# <Alt + Left> | |
| 79 | +``` | |
| 80 | + | |
| 81 | +The directory stack would look like this: | |
| 82 | + | |
| 83 | +```sh | |
| 84 | +โ /usr typeset -pm dirhistory_\* | |
| 85 | +typeset -ax dirhistory_past=( /home/user /usr ) | |
| 86 | +typeset -ax dirhistory_future=( /usr/share/doc /usr/share ) | |
| 87 | +``` | |
| 88 | + | |
| 89 | +This means that pressing <kbd>Alt</kbd> + <kbd>Right</kbd>, you'd go to `/usr/share` and `/usr/share/doc` (the "future" directories). | |
| 90 | + | |
| 91 | +If you run `cd /usr/bin`, the "future" directories will be removed, and you won't be able to access them with <kbd>Alt</kbd> + <kbd>Right</kbd>: | |
| 92 | + | |
| 93 | +```sh | |
| 94 | +โ /u/bin typeset -pm dirhistory_\* | |
| 95 | +typeset -ax dirhistory_past=( /home/user /usr ) | |
| 96 | +typeset -ax dirhistory_future=( /usr/bin ) | |
| 97 | +``` | |
| 98 | + | |
| 99 | +If you instead run `cde /usr/bin`, the "future" directories will be preserved: | |
| 100 | + | |
| 101 | +```sh | |
| 102 | +โ /u/bin typeset -pm dirhistory_\* | |
| 103 | +typeset -ax dirhistory_past=( /home/user /usr /usr/bin ) | |
| 104 | +typeset -ax dirhistory_future=( /usr/share/doc /usr/share ) | |
| 105 | +``` |
+236-0.oh-my-zsh/plugins/dirhistory/dirhistory.plugin.zsh
| @@ -0,0 +1,236 @@ | ||
| 1 | +## | |
| 2 | +# Navigate directory history using ALT-LEFT and ALT-RIGHT. ALT-LEFT moves back to directories | |
| 3 | +# that the user has changed to in the past, and ALT-RIGHT undoes ALT-LEFT. | |
| 4 | +# | |
| 5 | +# Navigate directory hierarchy using ALT-UP and ALT-DOWN. | |
| 6 | +# ALT-UP moves to higher hierarchy (cd ..) | |
| 7 | +# ALT-DOWN moves into the first directory found in alphabetical order | |
| 8 | +# | |
| 9 | + | |
| 10 | +dirhistory_past=($PWD) | |
| 11 | +dirhistory_future=() | |
| 12 | +export dirhistory_past | |
| 13 | +export dirhistory_future | |
| 14 | +export DIRHISTORY_SIZE=30 | |
| 15 | + | |
| 16 | +alias cde='dirhistory_cd' | |
| 17 | + | |
| 18 | +# Pop the last element of dirhistory_past. | |
| 19 | +# Pass the name of the variable to return the result in. | |
| 20 | +# Returns the element if the array was not empty, | |
| 21 | +# otherwise returns empty string. | |
| 22 | +function pop_past() { | |
| 23 | + setopt localoptions no_ksh_arrays | |
| 24 | + if [[ $#dirhistory_past -gt 0 ]]; then | |
| 25 | + typeset -g $1="${dirhistory_past[$#dirhistory_past]}" | |
| 26 | + dirhistory_past[$#dirhistory_past]=() | |
| 27 | + fi | |
| 28 | +} | |
| 29 | + | |
| 30 | +function pop_future() { | |
| 31 | + setopt localoptions no_ksh_arrays | |
| 32 | + if [[ $#dirhistory_future -gt 0 ]]; then | |
| 33 | + typeset -g $1="${dirhistory_future[$#dirhistory_future]}" | |
| 34 | + dirhistory_future[$#dirhistory_future]=() | |
| 35 | + fi | |
| 36 | +} | |
| 37 | + | |
| 38 | +# Push a new element onto the end of dirhistory_past. If the size of the array | |
| 39 | +# is >= DIRHISTORY_SIZE, the array is shifted | |
| 40 | +function push_past() { | |
| 41 | + setopt localoptions no_ksh_arrays | |
| 42 | + if [[ $#dirhistory_past -ge $DIRHISTORY_SIZE ]]; then | |
| 43 | + shift dirhistory_past | |
| 44 | + fi | |
| 45 | + if [[ $#dirhistory_past -eq 0 || $dirhistory_past[$#dirhistory_past] != "$1" ]]; then | |
| 46 | + dirhistory_past+=($1) | |
| 47 | + fi | |
| 48 | +} | |
| 49 | + | |
| 50 | +function push_future() { | |
| 51 | + setopt localoptions no_ksh_arrays | |
| 52 | + if [[ $#dirhistory_future -ge $DIRHISTORY_SIZE ]]; then | |
| 53 | + shift dirhistory_future | |
| 54 | + fi | |
| 55 | + if [[ $#dirhistory_future -eq 0 || $dirhistory_futuret[$#dirhistory_future] != "$1" ]]; then | |
| 56 | + dirhistory_future+=($1) | |
| 57 | + fi | |
| 58 | +} | |
| 59 | + | |
| 60 | +# Called by zsh when directory changes | |
| 61 | +autoload -U add-zsh-hook | |
| 62 | +add-zsh-hook chpwd chpwd_dirhistory | |
| 63 | +function chpwd_dirhistory() { | |
| 64 | + push_past $PWD | |
| 65 | + # If DIRHISTORY_CD is not set... | |
| 66 | + if [[ -z "${DIRHISTORY_CD+x}" ]]; then | |
| 67 | + # ... clear future. | |
| 68 | + dirhistory_future=() | |
| 69 | + fi | |
| 70 | +} | |
| 71 | + | |
| 72 | +function dirhistory_cd(){ | |
| 73 | + DIRHISTORY_CD="1" | |
| 74 | + cd $1 | |
| 75 | + unset DIRHISTORY_CD | |
| 76 | +} | |
| 77 | + | |
| 78 | +# Move backward in directory history | |
| 79 | +function dirhistory_back() { | |
| 80 | + local cw="" | |
| 81 | + local d="" | |
| 82 | + # Last element in dirhistory_past is the cwd. | |
| 83 | + | |
| 84 | + pop_past cw | |
| 85 | + if [[ "" == "$cw" ]]; then | |
| 86 | + # Someone overwrote our variable. Recover it. | |
| 87 | + dirhistory_past=($PWD) | |
| 88 | + return | |
| 89 | + fi | |
| 90 | + | |
| 91 | + pop_past d | |
| 92 | + if [[ "" != "$d" ]]; then | |
| 93 | + dirhistory_cd $d | |
| 94 | + push_future $cw | |
| 95 | + else | |
| 96 | + push_past $cw | |
| 97 | + fi | |
| 98 | +} | |
| 99 | + | |
| 100 | + | |
| 101 | +# Move forward in directory history | |
| 102 | +function dirhistory_forward() { | |
| 103 | + local d="" | |
| 104 | + | |
| 105 | + pop_future d | |
| 106 | + if [[ "" != "$d" ]]; then | |
| 107 | + dirhistory_cd $d | |
| 108 | + push_past $d | |
| 109 | + fi | |
| 110 | +} | |
| 111 | + | |
| 112 | + | |
| 113 | +# Bind keys to history navigation | |
| 114 | +function dirhistory_zle_dirhistory_back() { | |
| 115 | + # Erase current line in buffer | |
| 116 | + zle .kill-buffer | |
| 117 | + dirhistory_back | |
| 118 | + zle .accept-line | |
| 119 | +} | |
| 120 | + | |
| 121 | +function dirhistory_zle_dirhistory_future() { | |
| 122 | + # Erase current line in buffer | |
| 123 | + zle .kill-buffer | |
| 124 | + dirhistory_forward | |
| 125 | + zle .accept-line | |
| 126 | +} | |
| 127 | + | |
| 128 | +zle -N dirhistory_zle_dirhistory_back | |
| 129 | +zle -N dirhistory_zle_dirhistory_future | |
| 130 | + | |
| 131 | +for keymap in emacs vicmd viins; do | |
| 132 | + # dirhistory_back | |
| 133 | + bindkey -M $keymap "\e[3D" dirhistory_zle_dirhistory_back # xterm in normal mode | |
| 134 | + bindkey -M $keymap "\e[1;3D" dirhistory_zle_dirhistory_back # xterm in normal mode | |
| 135 | + bindkey -M $keymap "\e\e[D" dirhistory_zle_dirhistory_back # Putty | |
| 136 | + bindkey -M $keymap "\eO3D" dirhistory_zle_dirhistory_back # GNU screen | |
| 137 | + | |
| 138 | + case "$TERM_PROGRAM" in | |
| 139 | + Apple_Terminal) bindkey -M $keymap "^[b" dirhistory_zle_dirhistory_back ;; # Terminal.app | |
| 140 | + ghostty) bindkey -M $keymap "^[b" dirhistory_zle_dirhistory_back ;; # ghostty | |
| 141 | + iTerm.app) | |
| 142 | + bindkey -M $keymap "^[^[[D" dirhistory_zle_dirhistory_back | |
| 143 | + bindkey -M $keymap "^[b" dirhistory_zle_dirhistory_back | |
| 144 | + ;; | |
| 145 | + esac | |
| 146 | + | |
| 147 | + if (( ${+terminfo[kcub1]} )); then | |
| 148 | + bindkey -M $keymap "^[${terminfo[kcub1]}" dirhistory_zle_dirhistory_back # urxvt | |
| 149 | + fi | |
| 150 | + | |
| 151 | + # dirhistory_future | |
| 152 | + bindkey -M $keymap "\e[3C" dirhistory_zle_dirhistory_future # xterm in normal mode | |
| 153 | + bindkey -M $keymap "\e[1;3C" dirhistory_zle_dirhistory_future # xterm in normal mode | |
| 154 | + bindkey -M $keymap "\e\e[C" dirhistory_zle_dirhistory_future # Putty | |
| 155 | + bindkey -M $keymap "\eO3C" dirhistory_zle_dirhistory_future # GNU screen | |
| 156 | + | |
| 157 | + case "$TERM_PROGRAM" in | |
| 158 | + Apple_Terminal) bindkey -M $keymap "^[f" dirhistory_zle_dirhistory_future ;; # Terminal.app | |
| 159 | + ghostty) bindkey -M $keymap "^[f" dirhistory_zle_dirhistory_future ;; # ghostty | |
| 160 | + iTerm.app) | |
| 161 | + bindkey -M $keymap "^[^[[C" dirhistory_zle_dirhistory_future | |
| 162 | + bindkey -M $keymap "^[f" dirhistory_zle_dirhistory_future | |
| 163 | + ;; | |
| 164 | + esac | |
| 165 | + | |
| 166 | + if (( ${+terminfo[kcuf1]} )); then | |
| 167 | + bindkey -M $keymap "^[${terminfo[kcuf1]}" dirhistory_zle_dirhistory_future # urxvt | |
| 168 | + fi | |
| 169 | +done | |
| 170 | + | |
| 171 | +# | |
| 172 | +# HIERARCHY Implemented in this section, in case someone wants to split it to another plugin if it clashes bindings | |
| 173 | +# | |
| 174 | + | |
| 175 | +# Move up in hierarchy | |
| 176 | +function dirhistory_up() { | |
| 177 | + cd .. || return 1 | |
| 178 | +} | |
| 179 | + | |
| 180 | +# Move down in hierarchy | |
| 181 | +function dirhistory_down() { | |
| 182 | + cd "$(find . -mindepth 1 -maxdepth 1 -type d | sort -n | head -n 1)" || return 1 | |
| 183 | +} | |
| 184 | + | |
| 185 | + | |
| 186 | +# Bind keys to hierarchy navigation | |
| 187 | +function dirhistory_zle_dirhistory_up() { | |
| 188 | + zle .kill-buffer # Erase current line in buffer | |
| 189 | + dirhistory_up | |
| 190 | + zle .accept-line | |
| 191 | +} | |
| 192 | + | |
| 193 | +function dirhistory_zle_dirhistory_down() { | |
| 194 | + zle .kill-buffer # Erase current line in buffer | |
| 195 | + dirhistory_down | |
| 196 | + zle .accept-line | |
| 197 | +} | |
| 198 | + | |
| 199 | +zle -N dirhistory_zle_dirhistory_up | |
| 200 | +zle -N dirhistory_zle_dirhistory_down | |
| 201 | + | |
| 202 | +for keymap in emacs vicmd viins; do | |
| 203 | + # dirhistory_up | |
| 204 | + bindkey -M $keymap "\e[3A" dirhistory_zle_dirhistory_up # xterm in normal mode | |
| 205 | + bindkey -M $keymap "\e[1;3A" dirhistory_zle_dirhistory_up # xterm in normal mode | |
| 206 | + bindkey -M $keymap "\e\e[A" dirhistory_zle_dirhistory_up # Putty | |
| 207 | + bindkey -M $keymap "\eO3A" dirhistory_zle_dirhistory_up # GNU screen | |
| 208 | + | |
| 209 | + case "$TERM_PROGRAM" in | |
| 210 | + Apple_Terminal) bindkey -M $keymap "^[[A" dirhistory_zle_dirhistory_up ;; # Terminal.app | |
| 211 | + iTerm.app) bindkey -M $keymap "^[^[[A" dirhistory_zle_dirhistory_up ;; # iTerm2 | |
| 212 | + ghostty) bindkey -M $keymap "^[[1;3A" dirhistory_zle_dirhistory_up ;; # ghostty | |
| 213 | + esac | |
| 214 | + | |
| 215 | + if (( ${+terminfo[kcuu1]} )); then | |
| 216 | + bindkey -M $keymap "^[${terminfo[kcuu1]}" dirhistory_zle_dirhistory_up # urxvt | |
| 217 | + fi | |
| 218 | + | |
| 219 | + # dirhistory_down | |
| 220 | + bindkey -M $keymap "\e[3B" dirhistory_zle_dirhistory_down # xterm in normal mode | |
| 221 | + bindkey -M $keymap "\e[1;3B" dirhistory_zle_dirhistory_down # xterm in normal mode | |
| 222 | + bindkey -M $keymap "\e\e[B" dirhistory_zle_dirhistory_down # Putty | |
| 223 | + bindkey -M $keymap "\eO3B" dirhistory_zle_dirhistory_down # GNU screen | |
| 224 | + | |
| 225 | + case "$TERM_PROGRAM" in | |
| 226 | + Apple_Terminal) bindkey -M $keymap "^[[B" dirhistory_zle_dirhistory_down ;; # Terminal.app | |
| 227 | + iTerm.app) bindkey -M $keymap "^[^[[B" dirhistory_zle_dirhistory_down ;; # iTerm2 | |
| 228 | + ghostty) bindkey -M $keymap "^[[1;3B" dirhistory_zle_dirhistory_down ;; # ghostty | |
| 229 | + esac | |
| 230 | + | |
| 231 | + if (( ${+terminfo[kcud1]} )); then | |
| 232 | + bindkey -M $keymap "^[${terminfo[kcud1]}" dirhistory_zle_dirhistory_down # urxvt | |
| 233 | + fi | |
| 234 | +done | |
| 235 | + | |
| 236 | +unset keymap |
+10-0.oh-my-zsh/plugins/dirpersist/README.md
| @@ -0,0 +1,10 @@ | ||
| 1 | +# Dirpersist plugin | |
| 2 | + | |
| 3 | +This plugin keeps a running tally of the previous 20 unique directories in the `$HOME/.zdirs` file. | |
| 4 | +When you cd to a new directory, it is prepended to the beginning of the file. | |
| 5 | + | |
| 6 | +To use it, add `dirpersist` to the plugins array in your zshrc file: | |
| 7 | + | |
| 8 | +```zsh | |
| 9 | +plugins=(... dirpersist) | |
| 10 | +``` |
+21-0.oh-my-zsh/plugins/dirpersist/dirpersist.plugin.zsh
| @@ -0,0 +1,21 @@ | ||
| 1 | +# Save dirstack history to .zdirs | |
| 2 | +# adapted from: | |
| 3 | +# github.com/grml/grml-etc-core/blob/master/etc/zsh/zshrc#L1547 | |
| 4 | + | |
| 5 | +DIRSTACKSIZE=${DIRSTACKSIZE:-20} | |
| 6 | +dirstack_file=${dirstack_file:-${HOME}/.zdirs} | |
| 7 | + | |
| 8 | +if [[ -f ${dirstack_file} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then | |
| 9 | + dirstack=( ${(f)"$(< $dirstack_file)"} ) | |
| 10 | + # "cd -" won't work after login by just setting $OLDPWD, so | |
| 11 | + [[ -d $dirstack[1] ]] && cd $dirstack[1] && cd $OLDPWD | |
| 12 | +fi | |
| 13 | + | |
| 14 | +autoload -U add-zsh-hook | |
| 15 | +add-zsh-hook chpwd chpwd_dirpersist | |
| 16 | +chpwd_dirpersist() { | |
| 17 | + if (( $DIRSTACKSIZE <= 0 )) || [[ -z $dirstack_file ]]; then return; fi | |
| 18 | + local -ax my_stack | |
| 19 | + my_stack=( ${PWD} ${dirstack} ) | |
| 20 | + builtin print -l ${(u)my_stack} >! ${dirstack_file} | |
| 21 | +} |
+32-0.oh-my-zsh/plugins/dnf/README.md
| @@ -0,0 +1,32 @@ | ||
| 1 | +# dnf plugin | |
| 2 | + | |
| 3 | +This plugin makes `dnf` usage easier by adding aliases for the most common commands. | |
| 4 | + | |
| 5 | +`dnf` is the new package manager for RPM-based distributions, which replaces `yum`. | |
| 6 | + | |
| 7 | +To use it, add `dnf` to the plugins array in your zshrc file: | |
| 8 | + | |
| 9 | +```zsh | |
| 10 | +plugins=(... dnf) | |
| 11 | +``` | |
| 12 | + | |
| 13 | +Classic `dnf` is getting superseded by `dnf5`; this plugin detects the presence | |
| 14 | +of `dnf5` and uses it as drop-in alternative to the slower `dnf`. | |
| 15 | + | |
| 16 | +## Aliases | |
| 17 | + | |
| 18 | +| Alias | Command | Description | | |
| 19 | +|-------|-------------------------|--------------------------| | |
| 20 | +| dnfl | `dnf list` | List packages | | |
| 21 | +| dnfli | `dnf list installed` | List installed packages | | |
| 22 | +| dnfgl | `dnf grouplist` | List package groups | | |
| 23 | +| dnfmc | `dnf makecache` | Generate metadata cache | | |
| 24 | +| dnfp | `dnf info` | Show package information | | |
| 25 | +| dnfs | `dnf search` | Search package | | |
| 26 | +| **Use `sudo`** | | |
| 27 | +| dnfu | `sudo dnf upgrade` | Upgrade package | | |
| 28 | +| dnfi | `sudo dnf install` | Install package | | |
| 29 | +| dnfgi | `sudo dnf groupinstall` | Install package group | | |
| 30 | +| dnfr | `sudo dnf remove` | Remove package | | |
| 31 | +| dnfgr | `sudo dnf groupremove` | Remove package group | | |
| 32 | +| dnfc | `sudo dnf clean all` | Clean cache | |
+570-0.oh-my-zsh/plugins/dnf/_dnf5
| @@ -0,0 +1,570 @@ | ||
| 1 | +#compdef dnf5 | |
| 2 | +# based on dnf-5.2.6.2 | |
| 3 | + | |
| 4 | +# utility functions | |
| 5 | + | |
| 6 | +_dnf5_helper() { | |
| 7 | + _call_program specs $service "${(q-)@}" "${(q-)PREFIX}\*" \ | |
| 8 | + -qC --assumeno --nogpgcheck 2>/dev/null </dev/null | |
| 9 | +} | |
| 10 | + | |
| 11 | +_dnf5_repositories() { | |
| 12 | + # required option: -T (all|disabled|enabled) | |
| 13 | + local selected expl | |
| 14 | + zparseopts -D -E - T:=selected | |
| 15 | + selected=$selected[2] | |
| 16 | + _wanted $selected-repositories expl "$selected repository" \ | |
| 17 | + compadd "$@" - "${(@)${(f)$(_dnf5_helper repo list --$selected)}[2,-1]%% *}" | |
| 18 | +} | |
| 19 | + | |
| 20 | +_dnf5_packages() { | |
| 21 | + # required option: -T (all|available|installed|upgradable) | |
| 22 | + local selected opt expl | |
| 23 | + zparseopts -D -E - T:=selected | |
| 24 | + selected=$selected[2] | |
| 25 | + case $selected in | |
| 26 | + all) opt='' ;; # option --all does not exist | |
| 27 | + upgradable) opt='--upgrades' ;; | |
| 28 | + *) opt="--$selected" ;; | |
| 29 | + esac | |
| 30 | + _wanted $selected-packages expl "$selected package" \ | |
| 31 | + compadd "$@" - $(_dnf5_helper repoquery $opt --qf='%{name} ') | |
| 32 | +} | |
| 33 | + | |
| 34 | +_dnf5_rpm_files() { | |
| 35 | + local expl | |
| 36 | + _wanted rpm-files expl 'rpm file' _files -g '(#i)*.rpm(-.)' | |
| 37 | +} | |
| 38 | + | |
| 39 | +_dnf5_packages_or_rpms() { | |
| 40 | + if [[ "$words[CURRENT]" = (*/*|\~*) ]]; then # if looks like a path name | |
| 41 | + _dnf5_rpm_files | |
| 42 | + else | |
| 43 | + _dnf5_packages "$@" | |
| 44 | + fi | |
| 45 | +} | |
| 46 | + | |
| 47 | +_dnf5_groups() { | |
| 48 | + # optional option: -T (available|installed) | |
| 49 | + local update_policy selected line pat groups | |
| 50 | + zparseopts -D -E - T:=selected | |
| 51 | + selected=$selected[2] | |
| 52 | + if [[ -z $selected ]]; then | |
| 53 | + selected=all | |
| 54 | + opt= # option --all does not exist | |
| 55 | + else | |
| 56 | + opt=--$selected | |
| 57 | + fi | |
| 58 | + # XXX hidden groups are not included | |
| 59 | + for line in ${${(f)"$(_dnf5_helper group list $opt)"}[2,-1]}; do | |
| 60 | + line=( ${(z)line} ) | |
| 61 | + groups+=( "$line[1]:$line[2,-2]" ) | |
| 62 | + done | |
| 63 | + _describe -t $selected-groups "$selected group" groups | |
| 64 | +} | |
| 65 | + | |
| 66 | +_dnf5_environments() { | |
| 67 | + local line envs | |
| 68 | + for line in ${${(f)"$(_dnf5_helper environment list)"}[2,-1]}; do | |
| 69 | + line=( ${(z)line} ) | |
| 70 | + envs+=( "$line[1]:$line[2,-2]" ) | |
| 71 | + done | |
| 72 | + _describe -t environments 'environment' envs | |
| 73 | +} | |
| 74 | + | |
| 75 | +# completers for (several) dnf commands | |
| 76 | + | |
| 77 | +_dnf5-advisory () { | |
| 78 | + _arguments : \ | |
| 79 | + $advisory_opts \ | |
| 80 | + '--contains-pkgs=[only show advisories containing specified packages]: : _sequence _dnf5_packages -T installed' \ | |
| 81 | + + '(with)' \ | |
| 82 | + '--with-cve[show only advisories referencing CVE ticket]' \ | |
| 83 | + '--with-bz[show only advisories referencing Bugzilla ticket]' \ | |
| 84 | + + '(type)' \ | |
| 85 | + '--all[show all advisories]' \ | |
| 86 | + '--available[show advisories containing newer versions of installed packages (default)]' \ | |
| 87 | + '--installed[show advisories containing equal and older version of installed packages]' \ | |
| 88 | + '--updates[show advisories containing upgradable packages]' \ | |
| 89 | + + args \ | |
| 90 | + ':subcommand:(list info summary)' '*:advisory spec:' | |
| 91 | +} | |
| 92 | + | |
| 93 | +_dnf5-group() { | |
| 94 | + local -a tmp | |
| 95 | + if (( CURRENT == 2 )); then | |
| 96 | + tmp=( | |
| 97 | + 'list:list all matching groups' | |
| 98 | + 'info:print detailed information about groups' | |
| 99 | + 'install:install packages from specified groups' | |
| 100 | + 'remove:remove removable packages in specified groups' | |
| 101 | + 'upgrade:upgrade specified groups and packages in them' | |
| 102 | + ) | |
| 103 | + _describe -t subcommands 'subcommand' tmp | |
| 104 | + else | |
| 105 | + case $words[2] in | |
| 106 | + list|info) | |
| 107 | + tmp=( | |
| 108 | + '(--installed)--available[show only available groups]' | |
| 109 | + '(--available)--installed[show only installed groups]' | |
| 110 | + '--hidden[show also hidden groups]' | |
| 111 | + '--contains-pkgs=[show only groups containing specified packages]: : _sequence _dnf5_packages -T all' | |
| 112 | + '*: : _dnf5_groups' | |
| 113 | + ) | |
| 114 | + ;; | |
| 115 | + install) | |
| 116 | + tmp=( $common_opts | |
| 117 | + '--with-optional[include optional packages from the groups]' | |
| 118 | + '*: : _dnf5_groups -T available' ) | |
| 119 | + ;| | |
| 120 | + upgrade) | |
| 121 | + tmp=( ${common_opts:#--skip-broken*} | |
| 122 | + '*: : _dnf5_groups -T installed' ) | |
| 123 | + ;| | |
| 124 | + remove) | |
| 125 | + tmp=( $offline_opts | |
| 126 | + '*: : _dnf5_groups -T installed' ) | |
| 127 | + ;| | |
| 128 | + install|remove) | |
| 129 | + tmp+=( '--no-packages[operate on groups only, not manipulate any packages]' ) | |
| 130 | + ;| | |
| 131 | + install|upgrade) | |
| 132 | + tmp+=( $downgrade_opts ) | |
| 133 | + ;; | |
| 134 | + esac | |
| 135 | + _arguments : $tmp | |
| 136 | + fi | |
| 137 | +} | |
| 138 | + | |
| 139 | +_dnf5-history() { | |
| 140 | + local -a tmp | |
| 141 | + if (( CURRENT == 2 )); then | |
| 142 | + tmp=( | |
| 143 | + 'list:list info about recorded transactions' | |
| 144 | + 'info:print detailed about specific transactions' | |
| 145 | + 'undo:revert all actions from the specified transaction' | |
| 146 | + 'redo:repeat the specified transaction' | |
| 147 | + 'rollback:undo all transactions performed after the specified transaction' | |
| 148 | + 'store:store the transaction into a directory' | |
| 149 | + ) | |
| 150 | + _describe -t subcommands 'subcommand' tmp | |
| 151 | + else | |
| 152 | + case $words[2] in | |
| 153 | + list|info) | |
| 154 | + tmp=( '--reverse[reverse the order of transactions in output]' ) | |
| 155 | + ;; | |
| 156 | + undo|rollback|redo) | |
| 157 | + tmp=( '--skip-unavailable[allow skipping impossible actions]' ) | |
| 158 | + ;| | |
| 159 | + undo|rollback) | |
| 160 | + tmp+=( $replay_opts ) | |
| 161 | + ;; | |
| 162 | + store) | |
| 163 | + tmp=( {-o,--output=}'[directory for storing the transaction (default ./transaction)]: : _directories') | |
| 164 | + esac | |
| 165 | + _arguments : $tmp '2:transaction:( )' | |
| 166 | + fi | |
| 167 | +} | |
| 168 | + | |
| 169 | +_dnf5-mark() { | |
| 170 | + local -a tmp | |
| 171 | + if (( CURRENT == 2 )); then | |
| 172 | + tmp=( | |
| 173 | + 'user:mark the package as user-installed' | |
| 174 | + 'dependency:mark the package as a dependency' | |
| 175 | + 'weak:mark the package as a weak dependency' | |
| 176 | + 'group:mark the package as installed by the specified group' | |
| 177 | + ) | |
| 178 | + _describe -t subcommands 'subcommand' tmp | |
| 179 | + else | |
| 180 | + tmp=( | |
| 181 | + '--skip-unavailable[skip packages not installed on the system]' | |
| 182 | + '--store=[store the transaction in specified directory]: : _directories' | |
| 183 | + ) | |
| 184 | + if [[ $words[2] = group ]]; then | |
| 185 | + tmp+=( '2:group-id: _dnf5_groups -T installed' ) | |
| 186 | + fi | |
| 187 | + _arguments : $tmp '*: : _dnf5_packages -T installed' | |
| 188 | + fi | |
| 189 | +} | |
| 190 | + | |
| 191 | +_dnf5-module() { | |
| 192 | + local -a tmp | |
| 193 | + if (( CURRENT == 2 )); then | |
| 194 | + tmp=( | |
| 195 | + 'list:list module streams' | |
| 196 | + 'info:print details about module streams' | |
| 197 | + 'enable:enable module streams' | |
| 198 | + 'disable:disable modules including all their streams' | |
| 199 | + "reset:reset module state so it's no longer enabled or disabled" | |
| 200 | + ) | |
| 201 | + _describe -t subcommands 'subcommand' tmp | |
| 202 | + elif (( CURRENT == 3 )) && [[ $cur = -* ]]; then | |
| 203 | + case $words[2] in | |
| 204 | + list|info) tmp=( --enabled --disabled ) ;; | |
| 205 | + enable) tmp=( --skip-broken --skip-unavailable ) ;; | |
| 206 | + *) tmp=( --skip-unavailable ) ;; | |
| 207 | + esac | |
| 208 | + _wanted options expl 'option' compadd -a tmp | |
| 209 | + else | |
| 210 | + _message 'module spec' | |
| 211 | + fi | |
| 212 | +} | |
| 213 | + | |
| 214 | +_dnf5-offline() { # also used by the 'system-upgrade' command | |
| 215 | + local -a tmp | |
| 216 | + if (( CURRENT == 2 )); then | |
| 217 | + tmp=( | |
| 218 | + 'clean:remove any stored offline transactions and cached packages' | |
| 219 | + 'log:list boots during which offline transaction was attempted' | |
| 220 | + 'reboot:prepare the system for offline transaction and reboot' | |
| 221 | + ) | |
| 222 | + if [[ $cmd = offline ]]; then | |
| 223 | + tmp+=( 'status:show status of the current offline transaction' ) | |
| 224 | + else | |
| 225 | + tmp+=( 'download:download all packages needed for upgrade' ) | |
| 226 | + fi | |
| 227 | + _describe -t subcommands 'subcommand' tmp && ret=0 | |
| 228 | + else | |
| 229 | + case $words[2] in | |
| 230 | + download) | |
| 231 | + _arguments : \ | |
| 232 | + '--releasever=[the version to upgrade to]:version number:' \ | |
| 233 | + '--no-downgrade:do not install packages older than currently installed' '*: :' && ret=0 | |
| 234 | + ;; | |
| 235 | + log) | |
| 236 | + _arguments : \ | |
| 237 | + '--number=[show log of transaction specified by number]:transaction number:' '*: :' && ret=0 | |
| 238 | + ;; | |
| 239 | + reboot) | |
| 240 | + _wanted options expl 'option' compadd -- --poweroff && ret=0 | |
| 241 | + ;; | |
| 242 | + esac | |
| 243 | + fi | |
| 244 | +} | |
| 245 | + | |
| 246 | +_dnf5-repoquery() { | |
| 247 | + local v | |
| 248 | + local -a opts=( | |
| 249 | + $advisory_opts | |
| 250 | + '--arch=[limit results to specified architectures]:list of archs: ' | |
| 251 | + '--available[limit results to available packages]' | |
| 252 | + '--disable-modular-filtering[include packages of inactive module streams]' | |
| 253 | + '--duplicates[limit to installed duplicate packages]' | |
| 254 | + '--exactdeps[limit to packages that require capability specified by ==what{requires,depends}]' | |
| 255 | + '--extras[limit to installed packages that are not present in any available repository]' | |
| 256 | + '--file=[limit results to packages which own specified file]:list of files: _sequence _files' | |
| 257 | + '--installed[query installed packages]' | |
| 258 | + '--installonly[limit to installed installonly packages]' | |
| 259 | + '--latest-limit=[limit to latest packages of specified number]:number:' | |
| 260 | + '--leaves[limit to groups of installed packages not required by other installed packages]' | |
| 261 | + '--providers-of=[select packages that provide specified attribute]:attribute:(conflicts depends enhances obsoletes provides recommends requires requires_pre suggests supplement)' | |
| 262 | + '--recent[limit to only recently changed packages]' | |
| 263 | + '--recursive[make --whatrequires/--providers-of work recursively]' | |
| 264 | + '--security[limit to packages in security advisories]' | |
| 265 | + '--srpm[use the corresponding source RPM]' | |
| 266 | + '--unneeded[limit to unneeded installed packages]' | |
| 267 | + '--upgrades[limit to available packages that provide upgrade for installed packages]' | |
| 268 | + '--userinstalled[limit to packages that are not installed as dependencies]' | |
| 269 | + '--whatdepends=[limit to packages that require, enhance, recommend, suggest of supplement specified capability]:list of capability:' | |
| 270 | + '--whatconflicts=[limit to packages that conflicts with specified capabilities]:list of capability: ' | |
| 271 | + ) | |
| 272 | + for v in enhance obsolete provide recommend require suggest supplement; do | |
| 273 | + opts+=( "--what${v}s=[limit to packages that $v specified capabilities]:list of capability: ") | |
| 274 | + done | |
| 275 | + # mutually exclusive formating options | |
| 276 | + opts+=( | |
| 277 | + + '(format)' | |
| 278 | + '--conflicts[display capabilities that the package conflicts with]' | |
| 279 | + '--depends[display capabilities that the package depends on, enables, recommends, suggests or supplements]' | |
| 280 | + '--files[show files in the package]' | |
| 281 | + '--requires-pre[display capabilities required to run pre/post scripts of the package]' | |
| 282 | + '--sourcerpm[display source RPM of the package]' | |
| 283 | + '--location[display location of the package]' | |
| 284 | + '--info[show detailed information about the package]' | |
| 285 | + '--changelogs[print the package changelogs]' | |
| 286 | + '(- *)--querytags[list tags recognized by --queryformat]' | |
| 287 | + '--queryformat=[specify output format]:format:' | |
| 288 | + ) | |
| 289 | + for v in enhance obsolete provide recommend require suggest supplement; do | |
| 290 | + opts+=( "--${v}s[display capabilities ${v}ed by the package]" ) | |
| 291 | + done | |
| 292 | + | |
| 293 | + _arguments : '*: : _dnf5_packages -T all' $opts | |
| 294 | +} | |
| 295 | + | |
| 296 | +# dnf commands | |
| 297 | + | |
| 298 | +_dnf5_commands() { | |
| 299 | + local -a dnf_cmds=( | |
| 300 | + 'advisory:manage advisories' | |
| 301 | + 'autoremove:remove unneeded packages' | |
| 302 | + 'check:check for problems in package database' | |
| 303 | + 'check-upgrade:check for available package upgrades' | |
| 304 | + 'clean:remove or invalidate cached data' | |
| 305 | + 'distro-sync:up/downgrade installed packages to the latest available' | |
| 306 | + 'downgrade:downgrade packages' | |
| 307 | + 'download:download packages' | |
| 308 | + 'environment:manage comps environments' | |
| 309 | + 'group:manage comps groups' | |
| 310 | + 'history:manage transaction history' | |
| 311 | + 'info:provide detailed information about packages' | |
| 312 | + 'install:install packages' | |
| 313 | + 'leaves:list groups of leaf packages' | |
| 314 | + 'list:list installed or available packages' | |
| 315 | + 'makecache:generate the metadata cache' | |
| 316 | + 'mark:change the reason of an installed package' | |
| 317 | + 'module:manage modules' | |
| 318 | + 'offline:manage offline transactions' | |
| 319 | + 'provides:find what package provides the given value' | |
| 320 | + 'reinstall:reinstall packages' | |
| 321 | + 'remove:remove packages' | |
| 322 | + 'replay:replay stored transactions' | |
| 323 | + 'repo:manage repositories' | |
| 324 | + 'repoquery:search for packages in repositories' | |
| 325 | + 'search:search for packages using keywords' | |
| 326 | + 'swap:remove software and install another in the single transaction' | |
| 327 | + 'system-upgrade:upgrade the system to a new major release' | |
| 328 | + 'upgrade:upgrade packages' | |
| 329 | + 'versionlock:protect packages from updates to newer versions' | |
| 330 | + ) | |
| 331 | + _describe -t dnf-commands 'dnf command' dnf_cmds | |
| 332 | +} | |
| 333 | + | |
| 334 | +# subcommands and options | |
| 335 | + | |
| 336 | +_dnf5_subcmds_opts() { | |
| 337 | + local cur=$words[CURRENT] cmd=$words[1] expl ret=1 | |
| 338 | + local -a tmp | |
| 339 | + # common options | |
| 340 | + local -a offline_opts=( | |
| 341 | + '(--store)--offline[store the transaction to be performed offline]' | |
| 342 | + '(--offline)--store=[store the transaction in specified directory]: : _directories' | |
| 343 | + ) | |
| 344 | + local -a common_opts=( | |
| 345 | + $offline_opts | |
| 346 | + '--allowerasing[allow erasing of installed packages]' | |
| 347 | + '--skip-broken[resolve dependency problems by skipping problematic packages]' | |
| 348 | + "--skip-unavailable[skip packages that can't be synchronized]" | |
| 349 | + '--downloadonly[download packages without executing transaction]' | |
| 350 | + ) | |
| 351 | + local -a advisory_opts=( | |
| 352 | + '--advisories=[consider only specified advisories]:list of advisories:' | |
| 353 | + '--advisory-severities=[limit to advisories with specified severity]:severity:_sequence compadd - critical important moderate low none' | |
| 354 | + '--bzs=[limit to advisories that fix specified Bugzilla ID]:list of Bugzilla ID:' | |
| 355 | + '--cves=[limit to advisories that fix specified CVE ID]:list of CVD ID]:' | |
| 356 | + '--security[limit to security advisories]' | |
| 357 | + '--bugfix[limit to bugfix advisories]' | |
| 358 | + '--enhancement[limit to enhancement advisories]' | |
| 359 | + '--newpackage[limit to newpackage advisories]' | |
| 360 | + ) | |
| 361 | + local -a downgrade_opts=( | |
| 362 | + '(--no-allow-downgrade)--allow-downgrade[enable downgrade of dependencies]' | |
| 363 | + '(--allow-downgrade)--no-allow-downgrade[disable downgrade of dependencies]' | |
| 364 | + ) | |
| 365 | + local -a replay_opts=( | |
| 366 | + '--ignore-extras[not consider extra packages]' | |
| 367 | + '--ignore-installed[mismatches between installed and stored transaction are not errors]' | |
| 368 | + ) | |
| 369 | + # Deal with some aliases (not comprehensive) | |
| 370 | + case $cmd in | |
| 371 | + check-updgrade) cmd=check-update;; | |
| 372 | + dg) cmd=downgrade;; | |
| 373 | + dsync) cmd=distro-sync;; | |
| 374 | + grp) cmd=group;; | |
| 375 | + if) cmd=info;; | |
| 376 | + in) cmd=install;; | |
| 377 | + ls) cmd=list;; | |
| 378 | + mc) cmd=makecache;; | |
| 379 | + rei) cmd=reinstall;; | |
| 380 | + rm) cmd=remove ;; | |
| 381 | + rq) cmd=repoquery;; | |
| 382 | + se) cmd=search;; | |
| 383 | + update|up) cmd=upgrade;; | |
| 384 | + esac | |
| 385 | + local curcontext="${curcontext%:*:*}:dnf-${cmd}:" | |
| 386 | + | |
| 387 | + case $cmd in | |
| 388 | + advisory|group|history|mark|module|offline|repoquery) | |
| 389 | + _dnf5-$cmd && ret=0 | |
| 390 | + ;; | |
| 391 | + system-upgrade) | |
| 392 | + _dnf5-offline && ret=0 | |
| 393 | + ;; | |
| 394 | + autoremove) | |
| 395 | + _arguments : $offline_opts && ret=0 | |
| 396 | + ;; | |
| 397 | + check) | |
| 398 | + _arguments : \ | |
| 399 | + '--dependencies[show missing dependencies and conflicts]' \ | |
| 400 | + '--duplicates[show duplicated packages]' \ | |
| 401 | + '--obsoleted[show obsoleted packages]' && ret=0 | |
| 402 | + ;; | |
| 403 | + check-upgrade) | |
| 404 | + _arguments : \ | |
| 405 | + $advisory_opts \ | |
| 406 | + '--changelogs[print package changelogs]' \ | |
| 407 | + '--minimal[reports the lowest versions of packages that fix advisories]' \ | |
| 408 | + '*: : _dnf5_packages -T installed' && ret=0 | |
| 409 | + ;; | |
| 410 | + clean) | |
| 411 | + tmp=( | |
| 412 | + 'dbcache:remove cache files generated from the repository metadata' | |
| 413 | + 'expire-cache:mark the repository metadata expired' | |
| 414 | + 'metadata:remove the repository metadata' | |
| 415 | + 'packages:remove any cached packages' | |
| 416 | + 'all:clean all' | |
| 417 | + ) | |
| 418 | + _describe -t cache-types 'cache type' tmp && ret=0 | |
| 419 | + ;; | |
| 420 | + distro-sync) | |
| 421 | + _arguments : $common_opts '*: : _dnf5_packages -T installed' && ret=0 | |
| 422 | + ;; | |
| 423 | + downgrade) | |
| 424 | + _arguments : \ | |
| 425 | + $common_opts $downgrade_opts \ | |
| 426 | + '*: : _dnf5_packages -T installed' && ret=0 | |
| 427 | + ;; | |
| 428 | + download) | |
| 429 | + _arguments : \ | |
| 430 | + '--arch=[limit to packages of specified architecture]:list of architectures:' \ | |
| 431 | + '--resolve[resolve and download needed dependencies]' \ | |
| 432 | + '--alldeps[with --resolve, also download already installed dependencies]' \ | |
| 433 | + '--destdir=[download to the specified directory]: : _directories' \ | |
| 434 | + '--srpm[download the source rpm]' \ | |
| 435 | + '--url[print the list of URLs where the rpms can be downloaded]' \ | |
| 436 | + '*--urlprotocol=[with --url, limit to specified protocols]:protocol:_sequence compadd - http https ftp file' \ | |
| 437 | + '*: : _dnf5_packages -T all' && ret=0 | |
| 438 | + ;; | |
| 439 | + environment) | |
| 440 | + _arguments : \ | |
| 441 | + '--available[show only available environments]' \ | |
| 442 | + '--installed[show only installed environments]' \ | |
| 443 | + ':subcommand:(list info)' \ | |
| 444 | + '*: : _dnf5_environments' && ret=0 | |
| 445 | + ;; | |
| 446 | + info|list) | |
| 447 | + _arguments : \ | |
| 448 | + '--showduplicates[show all versions of the packages]' \ | |
| 449 | + '*: : _dnf5_packages -T all' \ | |
| 450 | + + '(type)' \ | |
| 451 | + '--installed[list only installed packages]:*: : _dnf5_packages -T installed' \ | |
| 452 | + '--available[list only available packages]:*: : _dnf5_packages -T available' \ | |
| 453 | + '--extras[list only extras]' \ | |
| 454 | + '--obsoletes[list only installed but obsoleted packages]:*: : _dnf5_packages -T installed' \ | |
| 455 | + '--recent[list only recently added packages]' \ | |
| 456 | + '--upgrades[list only available upgrades of installed packages]:*: : _dnf5_packages -T upgradable' \ | |
| 457 | + '--autoremove[list only packages that will be autoremoved]:*: : _dnf5_packages -T installed' &&ret=0 | |
| 458 | + ;; | |
| 459 | + install) | |
| 460 | + _arguments : \ | |
| 461 | + $common_opts $downgrade_opts $advisory_opts \ | |
| 462 | + '*: : _dnf5_packages_or_rpms -T available' && ret=0 | |
| 463 | + ;; | |
| 464 | + leaves|makecache) | |
| 465 | + # nothing to complete | |
| 466 | + ;; | |
| 467 | + provides) | |
| 468 | + _files && ret=0 | |
| 469 | + ;; | |
| 470 | + reinstall) | |
| 471 | + _arguments : \ | |
| 472 | + $common_opts $downgrade_opts \ | |
| 473 | + '*: : _dnf5_packages_or_rpms -T installed' && ret=0 | |
| 474 | + ;; | |
| 475 | + remove) | |
| 476 | + _arguments : \ | |
| 477 | + $offline_opts \ | |
| 478 | + '--no-autoremove[not remove dependencies that are no longer used]' \ | |
| 479 | + '*: : _dnf5_packages -T installed' && ret=0 | |
| 480 | + ;; | |
| 481 | + replay) | |
| 482 | + _arguments : \ | |
| 483 | + $replay_opts \ | |
| 484 | + ':transaction path:_directories' && ret=0 | |
| 485 | + ;; | |
| 486 | + repo) | |
| 487 | + _arguments : \ | |
| 488 | + '--all[show info about all repositories]' \ | |
| 489 | + '--enabled[show info only about enabled repositories]' \ | |
| 490 | + '--disabled[show info only about disabled repositories]' \ | |
| 491 | + ':subcommand:(list info)' && ret=0 | |
| 492 | + ;; | |
| 493 | + search) | |
| 494 | + _arguments : \ | |
| 495 | + '--all[search patterns also inside description and URL fields]' \ | |
| 496 | + '--showduplicates[show all versions of packages, not only the latest ones]' \ | |
| 497 | + '*:search pattern:' && ret=0 | |
| 498 | + ;; | |
| 499 | + swap) | |
| 500 | + _arguments : \ | |
| 501 | + $offline_opts \ | |
| 502 | + '--allowerasing[allow erasing of installed packages]' \ | |
| 503 | + ': : _dnf5_packages -T installed' \ | |
| 504 | + ': : _dnf5_packages -T available' && ret=0 | |
| 505 | + ;; | |
| 506 | + upgrade) | |
| 507 | + _arguments : \ | |
| 508 | + ${common_opts:#--skip-broken*} $downgrade_opts $advisory_opts \ | |
| 509 | + '--minimal[upgrade only to the lowest available versions that fix advisories]' \ | |
| 510 | + '--destdir=[specify directory into which downloading packages]: : _directories' \ | |
| 511 | + '*: : _dnf5_packages_or_rpms -T upgradable' && ret=0 | |
| 512 | + ;; | |
| 513 | + versionlock) | |
| 514 | + _arguments : \ | |
| 515 | + ':subcommand:(add exclude clear delete list)' \ | |
| 516 | + '*: : _dnf5_packages -T all' && ret=0 | |
| 517 | + ;; | |
| 518 | + esac | |
| 519 | + return ret | |
| 520 | +} | |
| 521 | + | |
| 522 | +# main completer | |
| 523 | + | |
| 524 | +_dnf5() { | |
| 525 | + local curcontext="$curcontext" state state_descr line ret=1 | |
| 526 | + typeset -A opt_args | |
| 527 | + local -a opts=( | |
| 528 | + '(-y --assumeyes)--assumeno[answer no for all questions]' | |
| 529 | + '--best[try the best available package version]' | |
| 530 | + '(-C --cacheonly)'{-C,--cacheonly}"[run entirely from system cache, don't update cache]" | |
| 531 | + '--comment=[add comment to transaction history]:comment:' | |
| 532 | + '(-c --config)'{-c+,--config=}'[specify configuration file]:config file:_files' | |
| 533 | + '--debugsolver[dump detailed solving results in file ./debugdata]' | |
| 534 | + '*--disable-plugin=[disable specified plugins]:list of plugin names:' | |
| 535 | + '(--repo)*--disable-repo=[disable specified repos]: : _sequence _dnf5_repositories -T enabled' | |
| 536 | + '--dump-main-config[print main configuration values to stdout]' | |
| 537 | + '*--dump-repo-config=[print repository configuration values to stdout]:repi id' | |
| 538 | + '--dump-variables[print variable values to stdout]' | |
| 539 | + '*--enable-plugin=[enable specified plugins]:list of plugin names:' | |
| 540 | + '*--enable-repo=[enable additional repos]: : _sequence _dnf5_repositories -T disabled' | |
| 541 | + '--forcearch=[force the use of the specified arch]:arch:' | |
| 542 | + '(-)'{-h,--help}'[show the help message]' | |
| 543 | + '--installroot=[set install root]: : _directories' | |
| 544 | + '--no-best[do not limit transactions to best candidates]' | |
| 545 | + '--no-docs[do not install documentation]' | |
| 546 | + '--no-gpgcheck[skip checking GPG signatures on packages]' | |
| 547 | + '--no-plugins[disable all plugins]' | |
| 548 | + '(-q --quiet)'{-q,--quiet}'[show just the relevant content]' | |
| 549 | + '--refresh[force refreshing metadata before running the command]' | |
| 550 | + '--releasever=[override distribution release in config files]:release ver:' | |
| 551 | + '(--disablerepo)*--repo=[enable just the specified repo]: : _sequence _dnf5_repositories -T all' | |
| 552 | + '*--repofrompath=[specify additional repos]:repository_label,path_or_url: ' | |
| 553 | + '*--setopt=[override option in config file]:repoid.option=value:' | |
| 554 | + '*--setvar=[override DNF5 variable value]' | |
| 555 | + '--show-new-leaves[show newly installed leaf packages]' | |
| 556 | + '--use-host-config[use config files and variables from host system]' | |
| 557 | + '(- *)--version[show dnf version]' | |
| 558 | + '(-y --assumeyes --assumeno)'{-y,--assumeyes}'[answer yes for all questions]' | |
| 559 | + '*'{-x+,--exclude=}'[exclude specified packages from transaction]: : _sequence _dnf5_packages -T all' | |
| 560 | + ) | |
| 561 | + _arguments -C -s : $opts ': :->command' '*:: :->cmd_args' && ret=0 | |
| 562 | + | |
| 563 | + case $state in | |
| 564 | + command) _dnf5_commands && ret=0 ;; | |
| 565 | + cmd_args) _dnf5_subcmds_opts && ret=0 ;; | |
| 566 | + esac | |
| 567 | + return ret | |
| 568 | +} | |
| 569 | + | |
| 570 | +_dnf5 "$@" |
+19-0.oh-my-zsh/plugins/dnf/dnf.plugin.zsh
| @@ -0,0 +1,19 @@ | ||
| 1 | +## Aliases | |
| 2 | +local dnfprog="dnf" | |
| 3 | + | |
| 4 | +# Prefer dnf5 if installed | |
| 5 | +command -v dnf5 > /dev/null && dnfprog=dnf5 | |
| 6 | + | |
| 7 | +alias dnfl="${dnfprog} list" # List packages | |
| 8 | +alias dnfli="${dnfprog} list installed" # List installed packages | |
| 9 | +alias dnfgl="${dnfprog} grouplist" # List package groups | |
| 10 | +alias dnfmc="${dnfprog} makecache" # Generate metadata cache | |
| 11 | +alias dnfp="${dnfprog} info" # Show package information | |
| 12 | +alias dnfs="${dnfprog} search" # Search package | |
| 13 | + | |
| 14 | +alias dnfu="sudo ${dnfprog} upgrade" # Upgrade package | |
| 15 | +alias dnfi="sudo ${dnfprog} install" # Install package | |
| 16 | +alias dnfgi="sudo ${dnfprog} groupinstall" # Install package group | |
| 17 | +alias dnfr="sudo ${dnfprog} remove" # Remove package | |
| 18 | +alias dnfgr="sudo ${dnfprog} groupremove" # Remove package group | |
| 19 | +alias dnfc="sudo ${dnfprog} clean all" # Clean cache |
+51-0.oh-my-zsh/plugins/dnote/README.md
| @@ -0,0 +1,51 @@ | ||
| 1 | +# Dnote Plugin | |
| 2 | + | |
| 3 | +This plugin adds auto-completion for [Dnote](https://www.getdnote.com/), a simple command line notebook. | |
| 4 | + | |
| 5 | +To use it, add `dnote` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(dnote) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Usage | |
| 12 | + | |
| 13 | +At the basic level, this plugin completes all Dnote commands. | |
| 14 | + | |
| 15 | +```zsh | |
| 16 | +$ dnote a(press <TAB> here) | |
| 17 | +``` | |
| 18 | + | |
| 19 | +would result in: | |
| 20 | + | |
| 21 | +```zsh | |
| 22 | +$ dnote add | |
| 23 | +``` | |
| 24 | + | |
| 25 | +For some commands, this plugin dynamically suggests matching book names. | |
| 26 | + | |
| 27 | +For instance, if you have three books that begin with 'j': 'javascript', 'job', 'js', | |
| 28 | + | |
| 29 | +```zsh | |
| 30 | +$ dnote view j(press <TAB> here) | |
| 31 | +``` | |
| 32 | + | |
| 33 | +would result in: | |
| 34 | + | |
| 35 | +```zsh | |
| 36 | +$ dnote v j | |
| 37 | +javascript job js | |
| 38 | +``` | |
| 39 | + | |
| 40 | +As another example, | |
| 41 | + | |
| 42 | +```zsh | |
| 43 | +$ dnote edit ja(press <TAB> here) | |
| 44 | +``` | |
| 45 | + | |
| 46 | +would result in: | |
| 47 | + | |
| 48 | + | |
| 49 | +```zsh | |
| 50 | +$ dnote v javascript | |
| 51 | +`````` |
+39-0.oh-my-zsh/plugins/dnote/_dnote
| @@ -0,0 +1,39 @@ | ||
| 1 | +#compdef dnote | |
| 2 | + | |
| 3 | +local -a _1st_arguments | |
| 4 | + | |
| 5 | +_1st_arguments=( | |
| 6 | + 'add:add a new note' | |
| 7 | + 'view:list books, notes, or view a content' | |
| 8 | + 'edit:edit a note or a book' | |
| 9 | + 'remove:remove a note or a book' | |
| 10 | + 'find:find notes by keywords' | |
| 11 | + 'sync:sync data with the server' | |
| 12 | + 'login:login to the dnote server' | |
| 13 | + 'logout:logout from the dnote server' | |
| 14 | + 'version:print the current version' | |
| 15 | + 'help:get help about any command' | |
| 16 | +) | |
| 17 | + | |
| 18 | +get_booknames() { | |
| 19 | + local names=$(dnote view --name-only) | |
| 20 | + local -a ret | |
| 21 | + | |
| 22 | + while read -r line; do | |
| 23 | + ret+=("${line}") | |
| 24 | + done <<< "$names" | |
| 25 | + | |
| 26 | + echo "$ret" | |
| 27 | +} | |
| 28 | + | |
| 29 | +if (( CURRENT == 2 )); then | |
| 30 | + _describe -t commands "dnote subcommand" _1st_arguments | |
| 31 | + return | |
| 32 | +elif (( CURRENT == 3 )); then | |
| 33 | + case "$words[2]" in | |
| 34 | + v|view|a|add) | |
| 35 | + _alternative \ | |
| 36 | + "names:book names:($(get_booknames))" | |
| 37 | + esac | |
| 38 | +fi | |
| 39 | + |
+34-0.oh-my-zsh/plugins/docker-compose/README.md
| @@ -0,0 +1,34 @@ | ||
| 1 | +# Docker-compose | |
| 2 | + | |
| 3 | +This plugin provides completion for [docker-compose](https://docs.docker.com/compose/) as well as some | |
| 4 | +aliases for frequent docker-compose commands. | |
| 5 | + | |
| 6 | +To use it, add docker-compose to the plugins array of your zshrc file: | |
| 7 | + | |
| 8 | +```zsh | |
| 9 | +plugins=(... docker-compose) | |
| 10 | +``` | |
| 11 | + | |
| 12 | +## Aliases | |
| 13 | + | |
| 14 | +| Alias | Command | Description | | |
| 15 | +|-----------|----------------------------------|----------------------------------------------------------------------------------| | |
| 16 | +| dco | `docker-compose` | Docker-compose main command | | |
| 17 | +| dcb | `docker-compose build` | Build containers | | |
| 18 | +| dce | `docker-compose exec` | Execute command inside a container | | |
| 19 | +| dcps | `docker-compose ps` | List containers | | |
| 20 | +| dcrestart | `docker-compose restart` | Restart container | | |
| 21 | +| dcrm | `docker-compose rm` | Remove container | | |
| 22 | +| dcr | `docker-compose run` | Run a command in container | | |
| 23 | +| dcstop | `docker-compose stop` | Stop a container | | |
| 24 | +| dcup | `docker-compose up` | Build, (re)create, start, and attach to containers for a service | | |
| 25 | +| dcupb | `docker-compose up --build` | Same as `dcup`, but build images before starting containers | | |
| 26 | +| dcupd | `docker-compose up -d` | Same as `dcup`, but starts as daemon | | |
| 27 | +| dcupdb | `docker-compose up -d --build` | Same as `dcup`, but build images before starting containers and starts as daemon | | |
| 28 | +| dcdn | `docker-compose down` | Stop and remove containers | | |
| 29 | +| dcl | `docker-compose logs` | Show logs of container | | |
| 30 | +| dclf | `docker-compose logs -f` | Show logs and follow output | | |
| 31 | +| dclF | `docker-compose logs -f --tail0` | Just follow recent logs | | |
| 32 | +| dcpull | `docker-compose pull` | Pull image of a service | | |
| 33 | +| dcstart | `docker-compose start` | Start a container | | |
| 34 | +| dck | `docker-compose kill` | Kills containers | |
+421-0.oh-my-zsh/plugins/docker-compose/_docker-compose
| @@ -0,0 +1,421 @@ | ||
| 1 | +#compdef docker-compose | |
| 2 | + | |
| 3 | +# Description | |
| 4 | +# ----------- | |
| 5 | +# zsh completion for docker-compose | |
| 6 | +# ------------------------------------------------------------------------- | |
| 7 | +# Authors | |
| 8 | +# ------- | |
| 9 | +# * Steve Durrheimer <s.durrheimer@gmail.com> | |
| 10 | +# ------------------------------------------------------------------------- | |
| 11 | +# Inspiration | |
| 12 | +# ----------- | |
| 13 | +# * @albers docker-compose bash completion script | |
| 14 | +# * @felixr docker zsh completion script : https://github.com/felixr/docker-zsh-completion | |
| 15 | +# ------------------------------------------------------------------------- | |
| 16 | + | |
| 17 | +__docker-compose_q() { | |
| 18 | + docker-compose 2>/dev/null $compose_options "$@" | |
| 19 | +} | |
| 20 | + | |
| 21 | +# All services defined in docker-compose.yml | |
| 22 | +__docker-compose_all_services_in_compose_file() { | |
| 23 | + local already_selected | |
| 24 | + local -a services | |
| 25 | + already_selected=$(echo $words | tr " " "|") | |
| 26 | + __docker-compose_q ps --services "$@" \ | |
| 27 | + | grep -Ev "^(${already_selected})$" | |
| 28 | +} | |
| 29 | + | |
| 30 | +# All services, even those without an existing container | |
| 31 | +__docker-compose_services_all() { | |
| 32 | + [[ $PREFIX = -* ]] && return 1 | |
| 33 | + integer ret=1 | |
| 34 | + services=$(__docker-compose_all_services_in_compose_file "$@") | |
| 35 | + _alternative "args:services:($services)" && ret=0 | |
| 36 | + | |
| 37 | + return ret | |
| 38 | +} | |
| 39 | + | |
| 40 | +# All services that are defined by a Dockerfile reference | |
| 41 | +__docker-compose_services_from_build() { | |
| 42 | + [[ $PREFIX = -* ]] && return 1 | |
| 43 | + __docker-compose_services_all --filter source=build | |
| 44 | +} | |
| 45 | + | |
| 46 | +# All services that are defined by an image | |
| 47 | +__docker-compose_services_from_image() { | |
| 48 | + [[ $PREFIX = -* ]] && return 1 | |
| 49 | + __docker-compose_services_all --filter source=image | |
| 50 | +} | |
| 51 | + | |
| 52 | +__docker-compose_pausedservices() { | |
| 53 | + [[ $PREFIX = -* ]] && return 1 | |
| 54 | + __docker-compose_services_all --filter status=paused | |
| 55 | +} | |
| 56 | + | |
| 57 | +__docker-compose_stoppedservices() { | |
| 58 | + [[ $PREFIX = -* ]] && return 1 | |
| 59 | + __docker-compose_services_all --filter status=stopped | |
| 60 | +} | |
| 61 | + | |
| 62 | +__docker-compose_runningservices() { | |
| 63 | + [[ $PREFIX = -* ]] && return 1 | |
| 64 | + __docker-compose_services_all --filter status=running | |
| 65 | +} | |
| 66 | + | |
| 67 | +__docker-compose_services() { | |
| 68 | + [[ $PREFIX = -* ]] && return 1 | |
| 69 | + __docker-compose_services_all | |
| 70 | +} | |
| 71 | + | |
| 72 | +__docker-compose_caching_policy() { | |
| 73 | + oldp=( "$1"(Nmh+1) ) # 1 hour | |
| 74 | + (( $#oldp )) | |
| 75 | +} | |
| 76 | + | |
| 77 | +__docker-compose_commands() { | |
| 78 | + local cache_policy | |
| 79 | + | |
| 80 | + zstyle -s ":completion:${curcontext}:" cache-policy cache_policy | |
| 81 | + if [[ -z "$cache_policy" ]]; then | |
| 82 | + zstyle ":completion:${curcontext}:" cache-policy __docker-compose_caching_policy | |
| 83 | + fi | |
| 84 | + | |
| 85 | + if ( [[ ${+_docker_compose_subcommands} -eq 0 ]] || _cache_invalid docker_compose_subcommands) \ | |
| 86 | + && ! _retrieve_cache docker_compose_subcommands; | |
| 87 | + then | |
| 88 | + local -a lines | |
| 89 | + lines=(${(f)"$(_call_program commands docker-compose 2>&1)"}) | |
| 90 | + _docker_compose_subcommands=(${${${lines[$((${lines[(i)Commands:]} + 1)),${lines[(I) *]}]}## #}/ ##/:}) | |
| 91 | + (( $#_docker_compose_subcommands > 0 )) && _store_cache docker_compose_subcommands _docker_compose_subcommands | |
| 92 | + fi | |
| 93 | + _describe -t docker-compose-commands "docker-compose command" _docker_compose_subcommands | |
| 94 | +} | |
| 95 | + | |
| 96 | +__docker-compose_subcommand() { | |
| 97 | + local opts_help opts_force_recreate opts_no_recreate opts_no_build opts_remove_orphans opts_timeout opts_no_color opts_no_deps | |
| 98 | + | |
| 99 | + opts_help='(: -)--help[Print usage]' | |
| 100 | + opts_force_recreate="(--no-recreate)--force-recreate[Recreate containers even if their configuration and image haven't changed. Incompatible with --no-recreate.]" | |
| 101 | + opts_no_recreate="(--force-recreate)--no-recreate[If containers already exist, don't recreate them. Incompatible with --force-recreate.]" | |
| 102 | + opts_no_build="(--build)--no-build[Don't build an image, even if it's missing.]" | |
| 103 | + opts_remove_orphans="--remove-orphans[Remove containers for services not defined in the Compose file]" | |
| 104 | + opts_timeout=('(-t --timeout)'{-t,--timeout}"[Specify a shutdown timeout in seconds. (default: 10)]:seconds: ") | |
| 105 | + opts_no_color='--no-color[Produce monochrome output.]' | |
| 106 | + opts_no_deps="--no-deps[Don't start linked services.]" | |
| 107 | + | |
| 108 | + integer ret=1 | |
| 109 | + | |
| 110 | + case "$words[1]" in | |
| 111 | + (build) | |
| 112 | + _arguments \ | |
| 113 | + $opts_help \ | |
| 114 | + "*--build-arg=[Set build-time variables for one service.]:<varname>=<value>: " \ | |
| 115 | + '--force-rm[Always remove intermediate containers.]' \ | |
| 116 | + '(--quiet -q)'{--quiet,-q}'[Curb build output]' \ | |
| 117 | + '(--memory -m)'{--memory,-m}'[Memory limit for the build container.]' \ | |
| 118 | + '--no-cache[Do not use cache when building the image.]' \ | |
| 119 | + '--pull[Always attempt to pull a newer version of the image.]' \ | |
| 120 | + '--compress[Compress the build context using gzip.]' \ | |
| 121 | + '--parallel[Build images in parallel.]' \ | |
| 122 | + '*:services:__docker-compose_services_from_build' && ret=0 | |
| 123 | + ;; | |
| 124 | + (config) | |
| 125 | + _arguments \ | |
| 126 | + $opts_help \ | |
| 127 | + '(--quiet -q)'{--quiet,-q}"[Only validate the configuration, don't print anything.]" \ | |
| 128 | + '--resolve-image-digests[Pin image tags to digests.]' \ | |
| 129 | + '--services[Print the service names, one per line.]' \ | |
| 130 | + '--volumes[Print the volume names, one per line.]' \ | |
| 131 | + '--hash[Print the service config hash, one per line. Set "service1,service2" for a list of specified services.]' && ret=0 | |
| 132 | + ;; | |
| 133 | + (create) | |
| 134 | + _arguments \ | |
| 135 | + $opts_help \ | |
| 136 | + $opts_force_recreate \ | |
| 137 | + $opts_no_recreate \ | |
| 138 | + $opts_no_build \ | |
| 139 | + "(--no-build)--build[Build images before creating containers.]" \ | |
| 140 | + '*:services:__docker-compose_services' && ret=0 | |
| 141 | + ;; | |
| 142 | + (down) | |
| 143 | + _arguments \ | |
| 144 | + $opts_help \ | |
| 145 | + $opts_timeout \ | |
| 146 | + "--rmi[Remove images. Type must be one of: 'all': Remove all images used by any service. 'local': Remove only images that don't have a custom tag set by the \`image\` field.]:type:(all local)" \ | |
| 147 | + '(-v --volumes)'{-v,--volumes}"[Remove named volumes declared in the \`volumes\` section of the Compose file and anonymous volumes attached to containers.]" \ | |
| 148 | + $opts_remove_orphans && ret=0 | |
| 149 | + ;; | |
| 150 | + (events) | |
| 151 | + _arguments \ | |
| 152 | + $opts_help \ | |
| 153 | + '--json[Output events as a stream of json objects]' \ | |
| 154 | + '*:services:__docker-compose_services' && ret=0 | |
| 155 | + ;; | |
| 156 | + (exec) | |
| 157 | + _arguments \ | |
| 158 | + $opts_help \ | |
| 159 | + '-d[Detached mode: Run command in the background.]' \ | |
| 160 | + '--privileged[Give extended privileges to the process.]' \ | |
| 161 | + '(-u --user)'{-u,--user=}'[Run the command as this user.]:username:_users' \ | |
| 162 | + '-T[Disable pseudo-tty allocation. By default `docker-compose exec` allocates a TTY.]' \ | |
| 163 | + '--index=[Index of the container if there are multiple instances of a service \[default: 1\]]:index: ' \ | |
| 164 | + '*'{-e,--env}'[KEY=VAL Set an environment variable (can be used multiple times)]:environment variable KEY=VAL: ' \ | |
| 165 | + '(-w --workdir)'{-w,--workdir=}'[Working directory inside the container]:workdir: ' \ | |
| 166 | + '(-):running services:__docker-compose_runningservices' \ | |
| 167 | + '(-):command: _command_names -e' \ | |
| 168 | + '*::arguments: _normal' && ret=0 | |
| 169 | + ;; | |
| 170 | + (help) | |
| 171 | + _arguments ':subcommand:__docker-compose_commands' && ret=0 | |
| 172 | + ;; | |
| 173 | + (images) | |
| 174 | + _arguments \ | |
| 175 | + $opts_help \ | |
| 176 | + '-q[Only display IDs]' \ | |
| 177 | + '*:services:__docker-compose_services' && ret=0 | |
| 178 | + ;; | |
| 179 | + (kill) | |
| 180 | + _arguments \ | |
| 181 | + $opts_help \ | |
| 182 | + '-s[SIGNAL to send to the container. Default signal is SIGKILL.]:signal:_signals' \ | |
| 183 | + '*:running services:__docker-compose_runningservices' && ret=0 | |
| 184 | + ;; | |
| 185 | + (logs) | |
| 186 | + _arguments \ | |
| 187 | + $opts_help \ | |
| 188 | + '(-f --follow)'{-f,--follow}'[Follow log output]' \ | |
| 189 | + $opts_no_color \ | |
| 190 | + '--tail=[Number of lines to show from the end of the logs for each container.]:number of lines: ' \ | |
| 191 | + '(-t --timestamps)'{-t,--timestamps}'[Show timestamps]' \ | |
| 192 | + '*:services:__docker-compose_services' && ret=0 | |
| 193 | + ;; | |
| 194 | + (pause) | |
| 195 | + _arguments \ | |
| 196 | + $opts_help \ | |
| 197 | + '*:running services:__docker-compose_runningservices' && ret=0 | |
| 198 | + ;; | |
| 199 | + (port) | |
| 200 | + _arguments \ | |
| 201 | + $opts_help \ | |
| 202 | + '--protocol=[tcp or udp \[default: tcp\]]:protocol:(tcp udp)' \ | |
| 203 | + '--index=[index of the container if there are multiple instances of a service \[default: 1\]]:index: ' \ | |
| 204 | + '1:running services:__docker-compose_runningservices' \ | |
| 205 | + '2:port:_ports' && ret=0 | |
| 206 | + ;; | |
| 207 | + (ps) | |
| 208 | + _arguments \ | |
| 209 | + $opts_help \ | |
| 210 | + '-q[Only display IDs]' \ | |
| 211 | + '--filter KEY=VAL[Filter services by a property]:<filtername>=<value>:' \ | |
| 212 | + '*:services:__docker-compose_services' && ret=0 | |
| 213 | + ;; | |
| 214 | + (pull) | |
| 215 | + _arguments \ | |
| 216 | + $opts_help \ | |
| 217 | + '--ignore-pull-failures[Pull what it can and ignores images with pull failures.]' \ | |
| 218 | + '--no-parallel[Disable parallel pulling]' \ | |
| 219 | + '(-q --quiet)'{-q,--quiet}'[Pull without printing progress information]' \ | |
| 220 | + '--include-deps[Also pull services declared as dependencies]' \ | |
| 221 | + '*:services:__docker-compose_services_from_image' && ret=0 | |
| 222 | + ;; | |
| 223 | + (push) | |
| 224 | + _arguments \ | |
| 225 | + $opts_help \ | |
| 226 | + '--ignore-push-failures[Push what it can and ignores images with push failures.]' \ | |
| 227 | + '*:services:__docker-compose_services' && ret=0 | |
| 228 | + ;; | |
| 229 | + (rm) | |
| 230 | + _arguments \ | |
| 231 | + $opts_help \ | |
| 232 | + '(-f --force)'{-f,--force}"[Don't ask to confirm removal]" \ | |
| 233 | + '-v[Remove any anonymous volumes attached to containers]' \ | |
| 234 | + '*:stopped services:__docker-compose_stoppedservices' && ret=0 | |
| 235 | + ;; | |
| 236 | + (run) | |
| 237 | + _arguments \ | |
| 238 | + $opts_help \ | |
| 239 | + $opts_no_deps \ | |
| 240 | + '-d[Detached mode: Run container in the background, print new container name.]' \ | |
| 241 | + '*-e[KEY=VAL Set an environment variable (can be used multiple times)]:environment variable KEY=VAL: ' \ | |
| 242 | + '*'{-l,--label}'[KEY=VAL Add or override a label (can be used multiple times)]:label KEY=VAL: ' \ | |
| 243 | + '--entrypoint[Overwrite the entrypoint of the image.]:entry point: ' \ | |
| 244 | + '--name=[Assign a name to the container]:name: ' \ | |
| 245 | + '(-p --publish)'{-p,--publish=}"[Publish a container's port(s) to the host]" \ | |
| 246 | + '--rm[Remove container after run. Ignored in detached mode.]' \ | |
| 247 | + "--service-ports[Run command with the service's ports enabled and mapped to the host.]" \ | |
| 248 | + '-T[Disable pseudo-tty allocation. By default `docker-compose run` allocates a TTY.]' \ | |
| 249 | + '(-u --user)'{-u,--user=}'[Run as specified username or uid]:username or uid:_users' \ | |
| 250 | + '(-v --volume)*'{-v,--volume=}'[Bind mount a volume]:volume: ' \ | |
| 251 | + '(-w --workdir)'{-w,--workdir=}'[Working directory inside the container]:workdir: ' \ | |
| 252 | + "--use-aliases[Use the services network aliases in the network(s) the container connects to]" \ | |
| 253 | + '(-):services:__docker-compose_services' \ | |
| 254 | + '(-):command: _command_names -e' \ | |
| 255 | + '*::arguments: _normal' && ret=0 | |
| 256 | + ;; | |
| 257 | + (scale) | |
| 258 | + _arguments \ | |
| 259 | + $opts_help \ | |
| 260 | + $opts_timeout \ | |
| 261 | + '*:running services:__docker-compose_runningservices' && ret=0 | |
| 262 | + ;; | |
| 263 | + (start) | |
| 264 | + _arguments \ | |
| 265 | + $opts_help \ | |
| 266 | + '*:stopped services:__docker-compose_stoppedservices' && ret=0 | |
| 267 | + ;; | |
| 268 | + (stop|restart) | |
| 269 | + _arguments \ | |
| 270 | + $opts_help \ | |
| 271 | + $opts_timeout \ | |
| 272 | + '*:running services:__docker-compose_runningservices' && ret=0 | |
| 273 | + ;; | |
| 274 | + (top) | |
| 275 | + _arguments \ | |
| 276 | + $opts_help \ | |
| 277 | + '*:running services:__docker-compose_runningservices' && ret=0 | |
| 278 | + ;; | |
| 279 | + (unpause) | |
| 280 | + _arguments \ | |
| 281 | + $opts_help \ | |
| 282 | + '*:paused services:__docker-compose_pausedservices' && ret=0 | |
| 283 | + ;; | |
| 284 | + (up) | |
| 285 | + _arguments \ | |
| 286 | + $opts_help \ | |
| 287 | + '(--abort-on-container-exit)-d[Detached mode: Run containers in the background, print new container names. Incompatible with --abort-on-container-exit and --attach-dependencies.]' \ | |
| 288 | + $opts_no_color \ | |
| 289 | + $opts_no_deps \ | |
| 290 | + $opts_force_recreate \ | |
| 291 | + $opts_no_recreate \ | |
| 292 | + $opts_no_build \ | |
| 293 | + "(--no-build)--build[Build images before starting containers.]" \ | |
| 294 | + "(-d)--abort-on-container-exit[Stops all containers if any container was stopped. Incompatible with -d.]" \ | |
| 295 | + "(-d)--attach-dependencies[Attach to dependent containers. Incompatible with -d.]" \ | |
| 296 | + '(-t --timeout)'{-t,--timeout}"[Use this timeout in seconds for container shutdown when attached or when containers are already running. (default: 10)]:seconds: " \ | |
| 297 | + '--scale[SERVICE=NUM Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if present.]:service scale SERVICE=NUM: ' \ | |
| 298 | + '--exit-code-from=[Return the exit code of the selected service container. Implies --abort-on-container-exit]:service:__docker-compose_services' \ | |
| 299 | + $opts_remove_orphans \ | |
| 300 | + '*:services:__docker-compose_services' && ret=0 | |
| 301 | + ;; | |
| 302 | + (version) | |
| 303 | + _arguments \ | |
| 304 | + $opts_help \ | |
| 305 | + "--short[Shows only Compose's version number.]" && ret=0 | |
| 306 | + ;; | |
| 307 | + (*) | |
| 308 | + _message 'Unknown sub command' && ret=1 | |
| 309 | + ;; | |
| 310 | + esac | |
| 311 | + | |
| 312 | + return ret | |
| 313 | +} | |
| 314 | + | |
| 315 | +_docker-compose() { | |
| 316 | + # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`. | |
| 317 | + # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`. | |
| 318 | + if [[ $service != docker-compose ]]; then | |
| 319 | + _call_function - _$service | |
| 320 | + return | |
| 321 | + fi | |
| 322 | + | |
| 323 | + local curcontext="$curcontext" state line | |
| 324 | + integer ret=1 | |
| 325 | + typeset -A opt_args | |
| 326 | + | |
| 327 | + local file_description | |
| 328 | + | |
| 329 | + if [[ -n ${words[(r)-f]} || -n ${words[(r)--file]} ]] ; then | |
| 330 | + file_description="Specify an override docker-compose file (default: docker-compose.override.yml)" | |
| 331 | + else | |
| 332 | + file_description="Specify an alternate docker-compose file (default: docker-compose.yml)" | |
| 333 | + fi | |
| 334 | + | |
| 335 | + _arguments -C \ | |
| 336 | + '(- :)'{-h,--help}'[Get help]' \ | |
| 337 | + '*'{-f,--file}"[${file_description}]:file:_files -g '*.yml'" \ | |
| 338 | + '(-p --project-name)'{-p,--project-name}'[Specify an alternate project name (default: directory name)]:project name:' \ | |
| 339 | + '--env-file[Specify an alternate environment file (default: .env)]:env-file:_files' \ | |
| 340 | + "--compatibility[If set, Compose will attempt to convert keys in v3 files to their non-Swarm equivalent]" \ | |
| 341 | + '(- :)'{-v,--version}'[Print version and exit]' \ | |
| 342 | + '--verbose[Show more output]' \ | |
| 343 | + '--log-level=[Set log level]:level:(DEBUG INFO WARNING ERROR CRITICAL)' \ | |
| 344 | + '--no-ansi[Do not print ANSI control characters]' \ | |
| 345 | + '--ansi=[Control when to print ANSI control characters]:when:(never always auto)' \ | |
| 346 | + '(-H --host)'{-H,--host}'[Daemon socket to connect to]:host:' \ | |
| 347 | + '--tls[Use TLS; implied by --tlsverify]' \ | |
| 348 | + '--tlscacert=[Trust certs signed only by this CA]:ca path:' \ | |
| 349 | + '--tlscert=[Path to TLS certificate file]:client cert path:' \ | |
| 350 | + '--tlskey=[Path to TLS key file]:tls key path:' \ | |
| 351 | + '--tlsverify[Use TLS and verify the remote]' \ | |
| 352 | + "--skip-hostname-check[Don't check the daemon's hostname against the name specified in the client certificate (for example if your docker host is an IP address)]" \ | |
| 353 | + '(-): :->command' \ | |
| 354 | + '(-)*:: :->option-or-argument' && ret=0 | |
| 355 | + | |
| 356 | + local -a relevant_compose_flags relevant_compose_repeatable_flags relevant_docker_flags compose_options docker_options | |
| 357 | + | |
| 358 | + relevant_compose_flags=( | |
| 359 | + "--env-file" | |
| 360 | + "--file" "-f" | |
| 361 | + "--host" "-H" | |
| 362 | + "--project-name" "-p" | |
| 363 | + "--tls" | |
| 364 | + "--tlscacert" | |
| 365 | + "--tlscert" | |
| 366 | + "--tlskey" | |
| 367 | + "--tlsverify" | |
| 368 | + "--skip-hostname-check" | |
| 369 | + ) | |
| 370 | + | |
| 371 | + relevant_compose_repeatable_flags=( | |
| 372 | + "--file" "-f" | |
| 373 | + ) | |
| 374 | + | |
| 375 | + relevant_docker_flags=( | |
| 376 | + "--host" "-H" | |
| 377 | + "--tls" | |
| 378 | + "--tlscacert" | |
| 379 | + "--tlscert" | |
| 380 | + "--tlskey" | |
| 381 | + "--tlsverify" | |
| 382 | + ) | |
| 383 | + | |
| 384 | + for k in "${(@k)opt_args}"; do | |
| 385 | + if [[ -n "${relevant_docker_flags[(r)$k]}" ]]; then | |
| 386 | + docker_options+=$k | |
| 387 | + if [[ -n "$opt_args[$k]" ]]; then | |
| 388 | + docker_options+=$opt_args[$k] | |
| 389 | + fi | |
| 390 | + fi | |
| 391 | + if [[ -n "${relevant_compose_flags[(r)$k]}" ]]; then | |
| 392 | + if [[ -n "${relevant_compose_repeatable_flags[(r)$k]}" ]]; then | |
| 393 | + values=("${(@s/:/)opt_args[$k]}") | |
| 394 | + for value in $values | |
| 395 | + do | |
| 396 | + compose_options+=$k | |
| 397 | + compose_options+=$value | |
| 398 | + done | |
| 399 | + else | |
| 400 | + compose_options+=$k | |
| 401 | + if [[ -n "$opt_args[$k]" ]]; then | |
| 402 | + compose_options+=$opt_args[$k] | |
| 403 | + fi | |
| 404 | + fi | |
| 405 | + fi | |
| 406 | + done | |
| 407 | + | |
| 408 | + case $state in | |
| 409 | + (command) | |
| 410 | + __docker-compose_commands && ret=0 | |
| 411 | + ;; | |
| 412 | + (option-or-argument) | |
| 413 | + curcontext=${curcontext%:*:*}:docker-compose-$words[1]: | |
| 414 | + __docker-compose_subcommand && ret=0 | |
| 415 | + ;; | |
| 416 | + esac | |
| 417 | + | |
| 418 | + return ret | |
| 419 | +} | |
| 420 | + | |
| 421 | +_docker-compose "$@" |
+27-0.oh-my-zsh/plugins/docker-compose/docker-compose.plugin.zsh
| @@ -0,0 +1,27 @@ | ||
| 1 | +# Support Compose v2 as docker CLI plugin | |
| 2 | +# | |
| 3 | +# This tests that the (old) docker-compose command is in $PATH and that | |
| 4 | +# it resolves to an existing executable file if it's a symlink. | |
| 5 | +[[ -x "${commands[docker-compose]:A}" ]] && dccmd='docker-compose' || dccmd='docker compose' | |
| 6 | + | |
| 7 | +alias dco="$dccmd" | |
| 8 | +alias dcb="$dccmd build" | |
| 9 | +alias dce="$dccmd exec" | |
| 10 | +alias dcps="$dccmd ps" | |
| 11 | +alias dcrestart="$dccmd restart" | |
| 12 | +alias dcrm="$dccmd rm" | |
| 13 | +alias dcr="$dccmd run" | |
| 14 | +alias dcstop="$dccmd stop" | |
| 15 | +alias dcup="$dccmd up" | |
| 16 | +alias dcupb="$dccmd up --build" | |
| 17 | +alias dcupd="$dccmd up -d" | |
| 18 | +alias dcupdb="$dccmd up -d --build" | |
| 19 | +alias dcdn="$dccmd down" | |
| 20 | +alias dcl="$dccmd logs" | |
| 21 | +alias dclf="$dccmd logs -f" | |
| 22 | +alias dclF="$dccmd logs -f --tail 0" | |
| 23 | +alias dcpull="$dccmd pull" | |
| 24 | +alias dcstart="$dccmd start" | |
| 25 | +alias dck="$dccmd kill" | |
| 26 | + | |
| 27 | +unset dccmd |
+86-0.oh-my-zsh/plugins/docker/README.md
| @@ -0,0 +1,86 @@ | ||
| 1 | +# Docker plugin | |
| 2 | + | |
| 3 | +This plugin adds auto-completion and aliases for [docker](https://www.docker.com/). | |
| 4 | + | |
| 5 | +To use it add `docker` to the plugins array in your zshrc file. | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... docker) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +A copy of the completion script from the docker/cli git repo: | |
| 12 | +https://github.com/docker/cli/blob/master/contrib/completion/zsh/_docker | |
| 13 | + | |
| 14 | +## Settings | |
| 15 | + | |
| 16 | +By default, the completion doesn't allow option-stacking, meaning if you try to complete | |
| 17 | +`docker run -it <TAB>` it won't work, because you're _stacking_ the `-i` and `-t` options. | |
| 18 | + | |
| 19 | +[You can enable it](https://github.com/docker/cli/commit/b10fb43048) by **adding the lines below to your zshrc | |
| 20 | +file**, but be aware of the side effects: | |
| 21 | + | |
| 22 | +> This enables Zsh to understand commands like `docker run -it ubuntu`. However, by enabling this, this also | |
| 23 | +> makes Zsh complete `docker run -u<tab>` with `docker run -uapprox` which is not valid. The users have to put | |
| 24 | +> the space or the equal sign themselves before trying to complete. | |
| 25 | +> | |
| 26 | +> Therefore, this behavior is disabled by default. To enable it: | |
| 27 | +> | |
| 28 | +> ```sh | |
| 29 | +> zstyle ':completion:*:*:docker:*' option-stacking yes | |
| 30 | +> zstyle ':completion:*:*:docker-*:*' option-stacking yes | |
| 31 | +> ``` | |
| 32 | + | |
| 33 | +### Use old-style completion | |
| 34 | + | |
| 35 | +If the current completion does not work well for you, you can enable legacy completion instead with the | |
| 36 | +following setting. See https://github.com/ohmyzsh/ohmyzsh/issues/11789 for more information. | |
| 37 | + | |
| 38 | +```zsh | |
| 39 | +zstyle ':omz:plugins:docker' legacy-completion yes | |
| 40 | +``` | |
| 41 | + | |
| 42 | +### For Podman's Docker wrapper users | |
| 43 | + | |
| 44 | +If you use Podman's Docker wrapper, you need to enable legacy completion. See above section. | |
| 45 | + | |
| 46 | +## Aliases | |
| 47 | + | |
| 48 | +| Alias | Command | Description | | |
| 49 | +| :------ | :---------------------------- | :--------------------------------------------------------------------------------------- | | |
| 50 | +| dbl | `docker build` | Build an image from a Dockerfile | | |
| 51 | +| dcin | `docker container inspect` | Display detailed information on one or more containers | | |
| 52 | +| dcls | `docker container ls` | List all the running docker containers | | |
| 53 | +| dclsa | `docker container ls -a` | List all running and stopped containers | | |
| 54 | +| dib | `docker image build` | Build an image from a Dockerfile (same as docker build) | | |
| 55 | +| dii | `docker image inspect` | Display detailed information on one or more images | | |
| 56 | +| dils | `docker image ls` | List docker images | | |
| 57 | +| dipu | `docker image push` | Push an image or repository to a remote registry | | |
| 58 | +| dipru | `docker image prune -a` | Remove all images not referenced by any container | | |
| 59 | +| dirm | `docker image rm` | Remove one or more images | | |
| 60 | +| dit | `docker image tag` | Add a name and tag to a particular image | | |
| 61 | +| dlo | `docker container logs` | Fetch the logs of a docker container | | |
| 62 | +| dnc | `docker network create` | Create a new network | | |
| 63 | +| dncn | `docker network connect` | Connect a container to a network | | |
| 64 | +| dndcn | `docker network disconnect` | Disconnect a container from a network | | |
| 65 | +| dni | `docker network inspect` | Return information about one or more networks | | |
| 66 | +| dnls | `docker network ls` | List all networks the engine daemon knows about, including those spanning multiple hosts | | |
| 67 | +| dnrm | `docker network rm` | Remove one or more networks | | |
| 68 | +| dpo | `docker container port` | List port mappings or a specific mapping for the container | | |
| 69 | +| dps | `docker ps` | List all the running docker containers | | |
| 70 | +| dpsa | `docker ps -a` | List all running and stopped containers | | |
| 71 | +| dpu | `docker pull` | Pull an image or a repository from a registry | | |
| 72 | +| dr | `docker container run` | Create a new container and start it using the specified command | | |
| 73 | +| drit | `docker container run -it` | Create a new container and start it in an interactive shell | | |
| 74 | +| drm | `docker container rm` | Remove the specified container(s) | | |
| 75 | +| drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) | | |
| 76 | +| dst | `docker container start` | Start one or more stopped containers | | |
| 77 | +| drs | `docker container restart` | Restart one or more containers | | |
| 78 | +| dsta | `docker stop $(docker ps -q)` | Stop all running containers | | |
| 79 | +| dstp | `docker container stop` | Stop one or more running containers | | |
| 80 | +| dsts | `docker stats` | Display real-time streaming statistics for containers | | |
| 81 | +| dtop | `docker top` | Display the running processes of a container | | |
| 82 | +| dvi | `docker volume inspect` | Display detailed information about one or more volumes | | |
| 83 | +| dvls | `docker volume ls` | List all the volumes known to docker | | |
| 84 | +| dvprune | `docker volume prune` | Cleanup dangling volumes | | |
| 85 | +| dxc | `docker container exec` | Run a new command in a running container | | |
| 86 | +| dxcit | `docker container exec -it` | Run a new command in a running container in an interactive shell | |
+3126-0.oh-my-zsh/plugins/docker/completions/_docker
| @@ -0,0 +1,3126 @@ | ||
| 1 | +#compdef docker dockerd | |
| 2 | +# | |
| 3 | +# zsh completion for docker (http://docker.com) | |
| 4 | +# | |
| 5 | +# version: 0.3.0 | |
| 6 | +# github: https://github.com/felixr/docker-zsh-completion | |
| 7 | +# | |
| 8 | +# contributors: | |
| 9 | +# - Felix Riedel | |
| 10 | +# - Steve Durrheimer | |
| 11 | +# - Vincent Bernat | |
| 12 | +# - Rohan Verma | |
| 13 | +# | |
| 14 | +# license: | |
| 15 | +# | |
| 16 | +# Copyright (c) 2013, Felix Riedel | |
| 17 | +# All rights reserved. | |
| 18 | +# | |
| 19 | +# Redistribution and use in source and binary forms, with or without | |
| 20 | +# modification, are permitted provided that the following conditions are met: | |
| 21 | +# * Redistributions of source code must retain the above copyright | |
| 22 | +# notice, this list of conditions and the following disclaimer. | |
| 23 | +# * Redistributions in binary form must reproduce the above copyright | |
| 24 | +# notice, this list of conditions and the following disclaimer in the | |
| 25 | +# documentation and/or other materials provided with the distribution. | |
| 26 | +# * Neither the name of the <organization> nor the | |
| 27 | +# names of its contributors may be used to endorse or promote products | |
| 28 | +# derived from this software without specific prior written permission. | |
| 29 | +# | |
| 30 | +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
| 31 | +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
| 32 | +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| 33 | +# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY | |
| 34 | +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
| 35 | +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
| 36 | +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
| 37 | +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 38 | +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
| 39 | +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 40 | +# | |
| 41 | + | |
| 42 | +# Short-option stacking can be enabled with: | |
| 43 | +# zstyle ':completion:*:*:docker:*' option-stacking yes | |
| 44 | +# zstyle ':completion:*:*:docker-*:*' option-stacking yes | |
| 45 | +__docker_arguments() { | |
| 46 | + if zstyle -t ":completion:${curcontext}:" option-stacking; then | |
| 47 | + print -- -s | |
| 48 | + fi | |
| 49 | +} | |
| 50 | + | |
| 51 | +__docker_get_containers() { | |
| 52 | + [[ $PREFIX = -* ]] && return 1 | |
| 53 | + integer ret=1 | |
| 54 | + local kind type line s | |
| 55 | + declare -a running stopped lines args names | |
| 56 | + | |
| 57 | + kind=$1; shift | |
| 58 | + type=$1; shift | |
| 59 | + [[ $kind = (stopped|all) ]] && args=($args -a) | |
| 60 | + | |
| 61 | + lines=(${(f)${:-"$(_call_program commands docker $docker_options ps --format 'table' --no-trunc $args)"$'\n'}}) | |
| 62 | + | |
| 63 | + # Parse header line to find columns | |
| 64 | + local i=1 j=1 k header=${lines[1]} | |
| 65 | + declare -A begin end | |
| 66 | + while (( j < ${#header} - 1 )); do | |
| 67 | + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) | |
| 68 | + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) | |
| 69 | + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) | |
| 70 | + begin[${header[$i,$((j-1))]}]=$i | |
| 71 | + end[${header[$i,$((j-1))]}]=$k | |
| 72 | + done | |
| 73 | + end[${header[$i,$((j-1))]}]=-1 # Last column, should go to the end of the line | |
| 74 | + lines=(${lines[2,-1]}) | |
| 75 | + | |
| 76 | + # Container ID | |
| 77 | + if [[ $type = (ids|all) ]]; then | |
| 78 | + for line in $lines; do | |
| 79 | + s="${${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}[0,12]}" | |
| 80 | + s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" | |
| 81 | + s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}" | |
| 82 | + if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then | |
| 83 | + stopped=($stopped $s) | |
| 84 | + else | |
| 85 | + running=($running $s) | |
| 86 | + fi | |
| 87 | + done | |
| 88 | + fi | |
| 89 | + | |
| 90 | + # Names: we only display the one without slash. All other names | |
| 91 | + # are generated and may clutter the completion. However, with | |
| 92 | + # Swarm, all names may be prefixed by the swarm node name. | |
| 93 | + if [[ $type = (names|all) ]]; then | |
| 94 | + for line in $lines; do | |
| 95 | + names=(${(ps:,:)${${line[${begin[NAMES]},${end[NAMES]}]}%% *}}) | |
| 96 | + # First step: find a common prefix and strip it (swarm node case) | |
| 97 | + (( ${#${(u)names%%/*}} == 1 )) && names=${names#${names[1]%%/*}/} | |
| 98 | + # Second step: only keep the first name without a / | |
| 99 | + s=${${names:#*/*}[1]} | |
| 100 | + # If no name, well give up. | |
| 101 | + (( $#s != 0 )) || continue | |
| 102 | + s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" | |
| 103 | + s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}" | |
| 104 | + if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then | |
| 105 | + stopped=($stopped $s) | |
| 106 | + else | |
| 107 | + running=($running $s) | |
| 108 | + fi | |
| 109 | + done | |
| 110 | + fi | |
| 111 | + | |
| 112 | + [[ $kind = (running|all) ]] && _describe -t containers-running "running containers" running "$@" && ret=0 | |
| 113 | + [[ $kind = (stopped|all) ]] && _describe -t containers-stopped "stopped containers" stopped "$@" && ret=0 | |
| 114 | + return ret | |
| 115 | +} | |
| 116 | + | |
| 117 | +__docker_complete_stopped_containers() { | |
| 118 | + [[ $PREFIX = -* ]] && return 1 | |
| 119 | + __docker_get_containers stopped all "$@" | |
| 120 | +} | |
| 121 | + | |
| 122 | +__docker_complete_running_containers() { | |
| 123 | + [[ $PREFIX = -* ]] && return 1 | |
| 124 | + __docker_get_containers running all "$@" | |
| 125 | +} | |
| 126 | + | |
| 127 | +__docker_complete_containers() { | |
| 128 | + [[ $PREFIX = -* ]] && return 1 | |
| 129 | + __docker_get_containers all all "$@" | |
| 130 | +} | |
| 131 | + | |
| 132 | +__docker_complete_containers_ids() { | |
| 133 | + [[ $PREFIX = -* ]] && return 1 | |
| 134 | + __docker_get_containers all ids "$@" | |
| 135 | +} | |
| 136 | + | |
| 137 | +__docker_complete_containers_names() { | |
| 138 | + [[ $PREFIX = -* ]] && return 1 | |
| 139 | + __docker_get_containers all names "$@" | |
| 140 | +} | |
| 141 | + | |
| 142 | +__docker_complete_info_plugins() { | |
| 143 | + [[ $PREFIX = -* ]] && return 1 | |
| 144 | + integer ret=1 | |
| 145 | + emulate -L zsh | |
| 146 | + setopt extendedglob | |
| 147 | + local -a plugins | |
| 148 | + plugins=(${(ps: :)${(M)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Plugins:}%%$'\n'^ *}}:# $1: *}## $1: }) | |
| 149 | + _describe -t plugins "$1 plugins" plugins && ret=0 | |
| 150 | + return ret | |
| 151 | +} | |
| 152 | + | |
| 153 | +__docker_complete_images() { | |
| 154 | + [[ $PREFIX = -* ]] && return 1 | |
| 155 | + integer ret=1 | |
| 156 | + declare -a images | |
| 157 | + images=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/(#b)([^ ]##) ##([^ ]##) ##([^ ]##)*/${match[3]}:${(r:15:: :::)match[2]} in ${match[1]}}) | |
| 158 | + _describe -t docker-images "images" images && ret=0 | |
| 159 | + __docker_complete_repositories_with_tags && ret=0 | |
| 160 | + return ret | |
| 161 | +} | |
| 162 | + | |
| 163 | +__docker_complete_repositories() { | |
| 164 | + [[ $PREFIX = -* ]] && return 1 | |
| 165 | + integer ret=1 | |
| 166 | + declare -a repos | |
| 167 | + repos=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}%% *}[2,-1]}) | |
| 168 | + repos=(${repos#<none>}) | |
| 169 | + _describe -t docker-repos "repositories" repos && ret=0 | |
| 170 | + return ret | |
| 171 | +} | |
| 172 | + | |
| 173 | +__docker_complete_repositories_with_tags() { | |
| 174 | + [[ $PREFIX = -* ]] && return 1 | |
| 175 | + integer ret=1 | |
| 176 | + declare -a repos onlyrepos matched | |
| 177 | + declare m | |
| 178 | + repos=(${${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/ ##/:::}%% *}) | |
| 179 | + repos=(${${repos%:::<none>}#<none>}) | |
| 180 | + # Check if we have a prefix-match for the current prefix. | |
| 181 | + onlyrepos=(${repos%::*}) | |
| 182 | + for m in $onlyrepos; do | |
| 183 | + [[ ${PREFIX##${~~m}} != ${PREFIX} ]] && { | |
| 184 | + # Yes, complete with tags | |
| 185 | + repos=(${${repos/:::/:}/:/\\:}) | |
| 186 | + _describe -t docker-repos-with-tags "repositories with tags" repos && ret=0 | |
| 187 | + return ret | |
| 188 | + } | |
| 189 | + done | |
| 190 | + # No, only complete repositories | |
| 191 | + onlyrepos=(${${repos%:::*}/:/\\:}) | |
| 192 | + _describe -t docker-repos "repositories" onlyrepos -qS : && ret=0 | |
| 193 | + | |
| 194 | + return ret | |
| 195 | +} | |
| 196 | + | |
| 197 | +__docker_search() { | |
| 198 | + [[ $PREFIX = -* ]] && return 1 | |
| 199 | + local cache_policy | |
| 200 | + zstyle -s ":completion:${curcontext}:" cache-policy cache_policy | |
| 201 | + if [[ -z "$cache_policy" ]]; then | |
| 202 | + zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy | |
| 203 | + fi | |
| 204 | + | |
| 205 | + local searchterm cachename | |
| 206 | + searchterm="${words[$CURRENT]%/}" | |
| 207 | + cachename=_docker-search-$searchterm | |
| 208 | + | |
| 209 | + local expl | |
| 210 | + local -a result | |
| 211 | + if ( [[ ${(P)+cachename} -eq 0 ]] || _cache_invalid ${cachename#_} ) \ | |
| 212 | + && ! _retrieve_cache ${cachename#_}; then | |
| 213 | + _message "Searching for ${searchterm}..." | |
| 214 | + result=(${${${(f)${:-"$(_call_program commands docker $docker_options search $searchterm)"$'\n'}}%% *}[2,-1]}) | |
| 215 | + _store_cache ${cachename#_} result | |
| 216 | + fi | |
| 217 | + _wanted dockersearch expl 'available images' compadd -a result | |
| 218 | +} | |
| 219 | + | |
| 220 | +__docker_get_log_options() { | |
| 221 | + [[ $PREFIX = -* ]] && return 1 | |
| 222 | + | |
| 223 | + integer ret=1 | |
| 224 | + local log_driver=${opt_args[--log-driver]:-"all"} | |
| 225 | + local -a common_options common_options2 awslogs_options fluentd_options gelf_options journald_options json_file_options logentries_options syslog_options splunk_options | |
| 226 | + | |
| 227 | + common_options=("max-buffer-size" "mode") | |
| 228 | + common_options2=("env" "env-regex" "labels") | |
| 229 | + awslogs_options=($common_options "awslogs-create-group" "awslogs-datetime-format" "awslogs-group" "awslogs-multiline-pattern" "awslogs-region" "awslogs-stream" "tag") | |
| 230 | + fluentd_options=($common_options $common_options2 "fluentd-address" "fluentd-async-connect" "fluentd-buffer-limit" "fluentd-retry-wait" "fluentd-max-retries" "fluentd-sub-second-precision" "tag") | |
| 231 | + gcplogs_options=($common_options $common_options2 "gcp-log-cmd" "gcp-meta-id" "gcp-meta-name" "gcp-meta-zone" "gcp-project") | |
| 232 | + gelf_options=($common_options $common_options2 "gelf-address" "gelf-compression-level" "gelf-compression-type" "tag") | |
| 233 | + journald_options=($common_options $common_options2 "tag") | |
| 234 | + json_file_options=($common_options $common_options2 "max-file" "max-size") | |
| 235 | + logentries_options=($common_options $common_options2 "logentries-token" "tag") | |
| 236 | + syslog_options=($common_options $common_options2 "syslog-address" "syslog-facility" "syslog-format" "syslog-tls-ca-cert" "syslog-tls-cert" "syslog-tls-key" "syslog-tls-skip-verify" "tag") | |
| 237 | + splunk_options=($common_options $common_options2 "splunk-caname" "splunk-capath" "splunk-format" "splunk-gzip" "splunk-gzip-level" "splunk-index" "splunk-insecureskipverify" "splunk-source" "splunk-sourcetype" "splunk-token" "splunk-url" "splunk-verify-connection" "tag") | |
| 238 | + | |
| 239 | + [[ $log_driver = (awslogs|all) ]] && _describe -t awslogs-options "awslogs options" awslogs_options "$@" && ret=0 | |
| 240 | + [[ $log_driver = (fluentd|all) ]] && _describe -t fluentd-options "fluentd options" fluentd_options "$@" && ret=0 | |
| 241 | + [[ $log_driver = (gcplogs|all) ]] && _describe -t gcplogs-options "gcplogs options" gcplogs_options "$@" && ret=0 | |
| 242 | + [[ $log_driver = (gelf|all) ]] && _describe -t gelf-options "gelf options" gelf_options "$@" && ret=0 | |
| 243 | + [[ $log_driver = (journald|all) ]] && _describe -t journald-options "journald options" journald_options "$@" && ret=0 | |
| 244 | + [[ $log_driver = (json-file|all) ]] && _describe -t json-file-options "json-file options" json_file_options "$@" && ret=0 | |
| 245 | + [[ $log_driver = (logentries|all) ]] && _describe -t logentries-options "logentries options" logentries_options "$@" && ret=0 | |
| 246 | + [[ $log_driver = (syslog|all) ]] && _describe -t syslog-options "syslog options" syslog_options "$@" && ret=0 | |
| 247 | + [[ $log_driver = (splunk|all) ]] && _describe -t splunk-options "splunk options" splunk_options "$@" && ret=0 | |
| 248 | + | |
| 249 | + return ret | |
| 250 | +} | |
| 251 | + | |
| 252 | +__docker_complete_log_drivers() { | |
| 253 | + [[ $PREFIX = -* ]] && return 1 | |
| 254 | + integer ret=1 | |
| 255 | + drivers=(awslogs etwlogs fluentd gcplogs gelf journald json-file none splunk syslog) | |
| 256 | + _describe -t log-drivers "log drivers" drivers && ret=0 | |
| 257 | + return ret | |
| 258 | +} | |
| 259 | + | |
| 260 | +__docker_complete_log_options() { | |
| 261 | + [[ $PREFIX = -* ]] && return 1 | |
| 262 | + integer ret=1 | |
| 263 | + | |
| 264 | + if compset -P '*='; then | |
| 265 | + case "${${words[-1]%=*}#*=}" in | |
| 266 | + (syslog-format) | |
| 267 | + local opts=('rfc3164' 'rfc5424' 'rfc5424micro') | |
| 268 | + _describe -t syslog-format-opts "syslog format options" opts && ret=0 | |
| 269 | + ;; | |
| 270 | + (mode) | |
| 271 | + local opts=('blocking' 'non-blocking') | |
| 272 | + _describe -t mode-opts "mode options" opts && ret=0 | |
| 273 | + ;; | |
| 274 | + *) | |
| 275 | + _message 'value' && ret=0 | |
| 276 | + ;; | |
| 277 | + esac | |
| 278 | + else | |
| 279 | + __docker_get_log_options -qS "=" && ret=0 | |
| 280 | + fi | |
| 281 | + | |
| 282 | + return ret | |
| 283 | +} | |
| 284 | + | |
| 285 | +__docker_complete_detach_keys() { | |
| 286 | + [[ $PREFIX = -* ]] && return 1 | |
| 287 | + integer ret=1 | |
| 288 | + | |
| 289 | + compset -P "*," | |
| 290 | + keys=(${:-{a-z}}) | |
| 291 | + ctrl_keys=(${:-ctrl-{{a-z},{@,'[','\\','^',']',_}}}) | |
| 292 | + _describe -t detach_keys "[a-z]" keys -qS "," && ret=0 | |
| 293 | + _describe -t detach_keys-ctrl "'ctrl-' + 'a-z @ [ \\\\ ] ^ _'" ctrl_keys -qS "," && ret=0 | |
| 294 | +} | |
| 295 | + | |
| 296 | +__docker_complete_pid() { | |
| 297 | + [[ $PREFIX = -* ]] && return 1 | |
| 298 | + integer ret=1 | |
| 299 | + local -a opts vopts | |
| 300 | + | |
| 301 | + opts=('host') | |
| 302 | + vopts=('container') | |
| 303 | + | |
| 304 | + if compset -P '*:'; then | |
| 305 | + case "${${words[-1]%:*}#*=}" in | |
| 306 | + (container) | |
| 307 | + __docker_complete_running_containers && ret=0 | |
| 308 | + ;; | |
| 309 | + *) | |
| 310 | + _message 'value' && ret=0 | |
| 311 | + ;; | |
| 312 | + esac | |
| 313 | + else | |
| 314 | + _describe -t pid-value-opts "PID Options with value" vopts -qS ":" && ret=0 | |
| 315 | + _describe -t pid-opts "PID Options" opts && ret=0 | |
| 316 | + fi | |
| 317 | + | |
| 318 | + return ret | |
| 319 | +} | |
| 320 | + | |
| 321 | +__docker_complete_runtimes() { | |
| 322 | + [[ $PREFIX = -* ]] && return 1 | |
| 323 | + integer ret=1 | |
| 324 | + | |
| 325 | + emulate -L zsh | |
| 326 | + setopt extendedglob | |
| 327 | + local -a runtimes_opts | |
| 328 | + runtimes_opts=(${(ps: :)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Runtimes: }%%$'\n'^ *}}}) | |
| 329 | + _describe -t runtimes-opts "runtimes options" runtimes_opts && ret=0 | |
| 330 | +} | |
| 331 | + | |
| 332 | +__docker_complete_ps_filters() { | |
| 333 | + [[ $PREFIX = -* ]] && return 1 | |
| 334 | + integer ret=1 | |
| 335 | + | |
| 336 | + if compset -P '*='; then | |
| 337 | + case "${${words[-1]%=*}#*=}" in | |
| 338 | + (ancestor) | |
| 339 | + __docker_complete_images && ret=0 | |
| 340 | + ;; | |
| 341 | + (before|since) | |
| 342 | + __docker_complete_containers && ret=0 | |
| 343 | + ;; | |
| 344 | + (health) | |
| 345 | + health_opts=('healthy' 'none' 'starting' 'unhealthy') | |
| 346 | + _describe -t health-filter-opts "health filter options" health_opts && ret=0 | |
| 347 | + ;; | |
| 348 | + (id) | |
| 349 | + __docker_complete_containers_ids && ret=0 | |
| 350 | + ;; | |
| 351 | + (is-task) | |
| 352 | + _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 | |
| 353 | + ;; | |
| 354 | + (name) | |
| 355 | + __docker_complete_containers_names && ret=0 | |
| 356 | + ;; | |
| 357 | + (network) | |
| 358 | + __docker_complete_networks && ret=0 | |
| 359 | + ;; | |
| 360 | + (status) | |
| 361 | + status_opts=('created' 'dead' 'exited' 'paused' 'restarting' 'running' 'removing') | |
| 362 | + _describe -t status-filter-opts "status filter options" status_opts && ret=0 | |
| 363 | + ;; | |
| 364 | + (volume) | |
| 365 | + __docker_complete_volumes && ret=0 | |
| 366 | + ;; | |
| 367 | + *) | |
| 368 | + _message 'value' && ret=0 | |
| 369 | + ;; | |
| 370 | + esac | |
| 371 | + else | |
| 372 | + opts=('ancestor' 'before' 'exited' 'expose' 'health' 'id' 'label' 'name' 'network' 'publish' 'since' 'status' 'volume') | |
| 373 | + _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 | |
| 374 | + fi | |
| 375 | + | |
| 376 | + return ret | |
| 377 | +} | |
| 378 | + | |
| 379 | +__docker_complete_search_filters() { | |
| 380 | + [[ $PREFIX = -* ]] && return 1 | |
| 381 | + integer ret=1 | |
| 382 | + declare -a boolean_opts opts | |
| 383 | + | |
| 384 | + boolean_opts=('true' 'false') | |
| 385 | + opts=('is-automated' 'is-official' 'stars') | |
| 386 | + | |
| 387 | + if compset -P '*='; then | |
| 388 | + case "${${words[-1]%=*}#*=}" in | |
| 389 | + (is-automated|is-official) | |
| 390 | + _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 | |
| 391 | + ;; | |
| 392 | + *) | |
| 393 | + _message 'value' && ret=0 | |
| 394 | + ;; | |
| 395 | + esac | |
| 396 | + else | |
| 397 | + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 | |
| 398 | + fi | |
| 399 | + | |
| 400 | + return ret | |
| 401 | +} | |
| 402 | + | |
| 403 | +__docker_complete_images_filters() { | |
| 404 | + [[ $PREFIX = -* ]] && return 1 | |
| 405 | + integer ret=1 | |
| 406 | + declare -a boolean_opts opts | |
| 407 | + | |
| 408 | + boolean_opts=('true' 'false') | |
| 409 | + opts=('before' 'dangling' 'label' 'reference' 'since') | |
| 410 | + | |
| 411 | + if compset -P '*='; then | |
| 412 | + case "${${words[-1]%=*}#*=}" in | |
| 413 | + (before|reference|since) | |
| 414 | + __docker_complete_images && ret=0 | |
| 415 | + ;; | |
| 416 | + (dangling) | |
| 417 | + _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 | |
| 418 | + ;; | |
| 419 | + *) | |
| 420 | + _message 'value' && ret=0 | |
| 421 | + ;; | |
| 422 | + esac | |
| 423 | + else | |
| 424 | + _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 | |
| 425 | + fi | |
| 426 | + | |
| 427 | + return ret | |
| 428 | +} | |
| 429 | + | |
| 430 | +__docker_complete_events_filter() { | |
| 431 | + [[ $PREFIX = -* ]] && return 1 | |
| 432 | + integer ret=1 | |
| 433 | + declare -a opts | |
| 434 | + | |
| 435 | + opts=('container' 'daemon' 'event' 'image' 'label' 'network' 'scope' 'type' 'volume') | |
| 436 | + | |
| 437 | + if compset -P '*='; then | |
| 438 | + case "${${words[-1]%=*}#*=}" in | |
| 439 | + (container) | |
| 440 | + __docker_complete_containers && ret=0 | |
| 441 | + ;; | |
| 442 | + (daemon) | |
| 443 | + emulate -L zsh | |
| 444 | + setopt extendedglob | |
| 445 | + local -a daemon_opts | |
| 446 | + daemon_opts=( | |
| 447 | + ${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Name: }%%$'\n'^ *}} | |
| 448 | + ${${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'ID: }%%$'\n'^ *}}//:/\\:} | |
| 449 | + ) | |
| 450 | + _describe -t daemon-filter-opts "daemon filter options" daemon_opts && ret=0 | |
| 451 | + ;; | |
| 452 | + (event) | |
| 453 | + local -a event_opts | |
| 454 | + event_opts=('attach' 'commit' 'connect' 'copy' 'create' 'delete' 'destroy' 'detach' 'die' 'disable' 'disconnect' 'enable' 'exec_create' 'exec_detach' | |
| 455 | + 'exec_start' 'export' 'health_status' 'import' 'install' 'kill' 'load' 'mount' 'oom' 'pause' 'pull' 'push' 'reload' 'remove' 'rename' 'resize' | |
| 456 | + 'restart' 'save' 'start' 'stop' 'tag' 'top' 'unmount' 'unpause' 'untag' 'update') | |
| 457 | + _describe -t event-filter-opts "event filter options" event_opts && ret=0 | |
| 458 | + ;; | |
| 459 | + (image) | |
| 460 | + __docker_complete_images && ret=0 | |
| 461 | + ;; | |
| 462 | + (network) | |
| 463 | + __docker_complete_networks && ret=0 | |
| 464 | + ;; | |
| 465 | + (scope) | |
| 466 | + local -a scope_opts | |
| 467 | + scope_opts=('local' 'swarm') | |
| 468 | + _describe -t scope-filter-opts "scope filter options" scope_opts && ret=0 | |
| 469 | + ;; | |
| 470 | + (type) | |
| 471 | + local -a type_opts | |
| 472 | + type_opts=('container' 'daemon' 'image' 'network' 'volume') | |
| 473 | + _describe -t type-filter-opts "type filter options" type_opts && ret=0 | |
| 474 | + ;; | |
| 475 | + (volume) | |
| 476 | + __docker_complete_volumes && ret=0 | |
| 477 | + ;; | |
| 478 | + *) | |
| 479 | + _message 'value' && ret=0 | |
| 480 | + ;; | |
| 481 | + esac | |
| 482 | + else | |
| 483 | + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 | |
| 484 | + fi | |
| 485 | + | |
| 486 | + return ret | |
| 487 | +} | |
| 488 | + | |
| 489 | +__docker_complete_prune_filters() { | |
| 490 | + [[ $PREFIX = -* ]] && return 1 | |
| 491 | + integer ret=1 | |
| 492 | + declare -a opts | |
| 493 | + | |
| 494 | + opts=('until') | |
| 495 | + | |
| 496 | + if compset -P '*='; then | |
| 497 | + case "${${words[-1]%=*}#*=}" in | |
| 498 | + *) | |
| 499 | + _message 'value' && ret=0 | |
| 500 | + ;; | |
| 501 | + esac | |
| 502 | + else | |
| 503 | + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 | |
| 504 | + fi | |
| 505 | + | |
| 506 | + return ret | |
| 507 | +} | |
| 508 | + | |
| 509 | +# BO checkpoint | |
| 510 | + | |
| 511 | +__docker_checkpoint_commands() { | |
| 512 | + local -a _docker_checkpoint_subcommands | |
| 513 | + _docker_checkpoint_subcommands=( | |
| 514 | + "create:Create a checkpoint from a running container" | |
| 515 | + "ls:List checkpoints for a container" | |
| 516 | + "rm:Remove a checkpoint" | |
| 517 | + ) | |
| 518 | + _describe -t docker-checkpoint-commands "docker checkpoint command" _docker_checkpoint_subcommands | |
| 519 | +} | |
| 520 | + | |
| 521 | +__docker_checkpoint_subcommand() { | |
| 522 | + local -a _command_args opts_help | |
| 523 | + local expl help="--help" | |
| 524 | + integer ret=1 | |
| 525 | + | |
| 526 | + opts_help=("(: -)--help[Print usage]") | |
| 527 | + | |
| 528 | + case "$words[1]" in | |
| 529 | + (create) | |
| 530 | + _arguments $(__docker_arguments) \ | |
| 531 | + $opts_help \ | |
| 532 | + "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \ | |
| 533 | + "($help)--leave-running[Leave the container running after checkpoint]" \ | |
| 534 | + "($help -)1:container:__docker_complete_running_containers" \ | |
| 535 | + "($help -)2:checkpoint: " && ret=0 | |
| 536 | + ;; | |
| 537 | + (ls|list) | |
| 538 | + _arguments $(__docker_arguments) \ | |
| 539 | + $opts_help \ | |
| 540 | + "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \ | |
| 541 | + "($help -)1:container:__docker_complete_containers" && ret=0 | |
| 542 | + ;; | |
| 543 | + (rm|remove) | |
| 544 | + _arguments $(__docker_arguments) \ | |
| 545 | + $opts_help \ | |
| 546 | + "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \ | |
| 547 | + "($help -)1:container:__docker_complete_containers" \ | |
| 548 | + "($help -)2:checkpoint: " && ret=0 | |
| 549 | + ;; | |
| 550 | + (help) | |
| 551 | + _arguments $(__docker_arguments) ":subcommand:__docker_checkpoint_commands" && ret=0 | |
| 552 | + ;; | |
| 553 | + esac | |
| 554 | + | |
| 555 | + return ret | |
| 556 | +} | |
| 557 | + | |
| 558 | +# EO checkpoint | |
| 559 | + | |
| 560 | +# BO container | |
| 561 | + | |
| 562 | +__docker_container_commands() { | |
| 563 | + local -a _docker_container_subcommands | |
| 564 | + _docker_container_subcommands=( | |
| 565 | + "attach:Attach to a running container" | |
| 566 | + "commit:Create a new image from a container's changes" | |
| 567 | + "cp:Copy files/folders between a container and the local filesystem" | |
| 568 | + "create:Create a new container" | |
| 569 | + "diff:Inspect changes on a container's filesystem" | |
| 570 | + "exec:Execute a command in a running container" | |
| 571 | + "export:Export a container's filesystem as a tar archive" | |
| 572 | + "inspect:Display detailed information on one or more containers" | |
| 573 | + "kill:Kill one or more running containers" | |
| 574 | + "logs:Fetch the logs of a container" | |
| 575 | + "ls:List containers" | |
| 576 | + "pause:Pause all processes within one or more containers" | |
| 577 | + "port:List port mappings or a specific mapping for the container" | |
| 578 | + "prune:Remove all stopped containers" | |
| 579 | + "rename:Rename a container" | |
| 580 | + "restart:Restart one or more containers" | |
| 581 | + "rm:Remove one or more containers" | |
| 582 | + "run:Create and run a new container from an image" | |
| 583 | + "start:Start one or more stopped containers" | |
| 584 | + "stats:Display a live stream of container(s) resource usage statistics" | |
| 585 | + "stop:Stop one or more running containers" | |
| 586 | + "top:Display the running processes of a container" | |
| 587 | + "unpause:Unpause all processes within one or more containers" | |
| 588 | + "update:Update configuration of one or more containers" | |
| 589 | + "wait:Block until one or more containers stop, then print their exit codes" | |
| 590 | + ) | |
| 591 | + _describe -t docker-container-commands "docker container command" _docker_container_subcommands | |
| 592 | +} | |
| 593 | + | |
| 594 | +__docker_container_subcommand() { | |
| 595 | + local -a _command_args opts_help opts_attach_exec_run_start opts_create_run opts_create_run_update | |
| 596 | + local expl help="--help" | |
| 597 | + integer ret=1 | |
| 598 | + | |
| 599 | + opts_attach_exec_run_start=( | |
| 600 | + "($help)--detach-keys=[Escape key sequence used to detach a container]:sequence:__docker_complete_detach_keys" | |
| 601 | + ) | |
| 602 | + opts_create_run=( | |
| 603 | + "($help -a --attach)"{-a=,--attach=}"[Attach to stdin, stdout or stderr]:device:(STDIN STDOUT STDERR)" | |
| 604 | + "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: " | |
| 605 | + "($help)*--annotation=[Add an annotation to the container (passed through to the OCI runtime)]:annotations: " | |
| 606 | + "($help)*--blkio-weight-device=[Block IO (relative device weight)]:device:Block IO weight: " | |
| 607 | + "($help)*--cap-add=[Add Linux capabilities]:capability: " | |
| 608 | + "($help)*--cap-drop=[Drop Linux capabilities]:capability: " | |
| 609 | + "($help)--cgroupns=[Cgroup namespace mode to use]:cgroup namespace mode: " | |
| 610 | + "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " | |
| 611 | + "($help)--cidfile=[Write the container ID to the file]:CID file:_files" | |
| 612 | + "($help)--cpus=[Number of CPUs (default 0.000)]:cpus: " | |
| 613 | + "($help)*--device=[Add a host device to the container]:device:_files" | |
| 614 | + "($help)*--device-cgroup-rule=[Add a rule to the cgroup allowed devices list]:device:cgroup: " | |
| 615 | + "($help)*--device-read-bps=[Limit the read rate (bytes per second) from a device]:device:IO rate: " | |
| 616 | + "($help)*--device-read-iops=[Limit the read rate (IO per second) from a device]:device:IO rate: " | |
| 617 | + "($help)*--device-write-bps=[Limit the write rate (bytes per second) to a device]:device:IO rate: " | |
| 618 | + "($help)*--device-write-iops=[Limit the write rate (IO per second) to a device]:device:IO rate: " | |
| 619 | + "($help)--disable-content-trust[Skip image verification]" | |
| 620 | + "($help)*--dns=[Custom DNS servers]:DNS server: " | |
| 621 | + "($help)*--dns-option=[Custom DNS options]:DNS option: " | |
| 622 | + "($help)*--dns-search=[Custom DNS search domains]:DNS domains: " | |
| 623 | + "($help)*--domainname=[Container NIS domain name]:domainname:_hosts" | |
| 624 | + "($help)*"{-e=,--env=}"[Environment variables]:environment variable: " | |
| 625 | + "($help)--entrypoint=[Overwrite the default entrypoint of the image]:entry point: " | |
| 626 | + "($help)*--env-file=[Read environment variables from a file]:environment file:_files" | |
| 627 | + "($help)*--expose=[Expose a port from the container without publishing it]: " | |
| 628 | + "($help)*--gpus=[GPU devices to add to the container ('all' to pass all GPUs)]:device: " | |
| 629 | + "($help)*--group-add=[Set one or more supplementary user groups for the container]:group:_groups" | |
| 630 | + "($help -h --hostname)"{-h=,--hostname=}"[Container host name]:hostname:_hosts" | |
| 631 | + "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" | |
| 632 | + "($help)--init[Run an init inside the container that forwards signals and reaps processes]" | |
| 633 | + "($help)--ip=[IPv4 address]:IPv4: " | |
| 634 | + "($help)--ip6=[IPv6 address]:IPv6: " | |
| 635 | + "($help)--ipc=[IPC namespace to use]:IPC namespace: " | |
| 636 | + "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" | |
| 637 | + "($help)*--link=[Add link to another container]:link:->link" | |
| 638 | + "($help)*--link-local-ip=[Container IPv4/IPv6 link-local addresses]:IPv4/IPv6: " | |
| 639 | + "($help)*"{-l=,--label=}"[Container metadata]:label: " | |
| 640 | + "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" | |
| 641 | + "($help)*--log-opt=[Log driver specific options]:log driver options:__docker_complete_log_options" | |
| 642 | + "($help)--mac-address=[Container MAC address]:MAC address: " | |
| 643 | + "($help)*--mount=[Attach a filesystem mount to the container]:mount: " | |
| 644 | + "($help)--name=[Container name]:name: " | |
| 645 | + "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" | |
| 646 | + "($help)*--network-alias=[Add network-scoped alias for the container]:alias: " | |
| 647 | + "($help)--oom-kill-disable[Disable OOM Killer]" | |
| 648 | + "($help)--oom-score-adj[Tune the host's OOM preferences for containers (accepts -1000 to 1000)]" | |
| 649 | + "($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]" | |
| 650 | + "($help -P --publish-all)"{-P,--publish-all}"[Publish all exposed ports]" | |
| 651 | + "($help)*"{-p=,--publish=}"[Expose a container's port to the host]:port:_ports" | |
| 652 | + "($help)--pid=[PID namespace to use]:PID namespace:__docker_complete_pid" | |
| 653 | + "($help)--privileged[Give extended privileges to this container]" | |
| 654 | + "($help -q --quiet)"{-q,--quiet}"[Suppress the pull output]" | |
| 655 | + "($help)--read-only[Mount the container's root filesystem as read only]" | |
| 656 | + "($help)*--security-opt=[Security options]:security option: " | |
| 657 | + "($help)*--shm-size=[Size of '/dev/shm' (format is '<number><unit>')]:shm size: " | |
| 658 | + "($help)--stop-signal=[Signal to kill a container]:signal:_signals" | |
| 659 | + "($help)--stop-timeout=[Timeout (in seconds) to stop a container]:time: " | |
| 660 | + "($help)*--sysctl=-[sysctl options]:sysctl: " | |
| 661 | + "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" | |
| 662 | + "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" | |
| 663 | + "($help)*--ulimit=[ulimit options]:ulimit: " | |
| 664 | + "($help)--userns=[Container user namespace]:user namespace:(host)" | |
| 665 | + "($help)--tmpfs[mount tmpfs]" | |
| 666 | + "($help)*-v[Bind mount a volume]:volume:_directories -W / -P '/' -S '\:' -r '/ '" | |
| 667 | + "($help)--volume-driver=[Optional volume driver for the container]:volume driver:(local)" | |
| 668 | + "($help)*--volumes-from=[Mount volumes from the specified container]:volume: " | |
| 669 | + "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" | |
| 670 | + ) | |
| 671 | + opts_create_run_update=( | |
| 672 | + "($help)--blkio-weight=[Block IO (relative weight), between 10 and 1000]:Block IO weight:(10 100 500 1000)" | |
| 673 | + "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" | |
| 674 | + "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " | |
| 675 | + "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " | |
| 676 | + "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " | |
| 677 | + "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " | |
| 678 | + "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " | |
| 679 | + "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " | |
| 680 | + "($help)--kernel-memory=[Kernel memory limit in bytes]:Memory limit: " | |
| 681 | + "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " | |
| 682 | + "($help)--memory-reservation=[Memory soft limit]:Memory limit: " | |
| 683 | + "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " | |
| 684 | + "($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]" | |
| 685 | + "($help)--restart=[Restart policy]:restart policy:(no on-failure always unless-stopped)" | |
| 686 | + ) | |
| 687 | + opts_help=("(: -)--help[Print usage]") | |
| 688 | + | |
| 689 | + case "$words[1]" in | |
| 690 | + (attach) | |
| 691 | + _arguments $(__docker_arguments) \ | |
| 692 | + $opts_help \ | |
| 693 | + $opts_attach_exec_run_start \ | |
| 694 | + "($help)--no-stdin[Do not attach stdin]" \ | |
| 695 | + "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \ | |
| 696 | + "($help -):containers:__docker_complete_running_containers" && ret=0 | |
| 697 | + ;; | |
| 698 | + (commit) | |
| 699 | + _arguments $(__docker_arguments) \ | |
| 700 | + $opts_help \ | |
| 701 | + "($help -a --author)"{-a=,--author=}"[Author]:author: " \ | |
| 702 | + "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \ | |
| 703 | + "($help -m --message)"{-m=,--message=}"[Commit message]:message: " \ | |
| 704 | + "($help -p --pause)"{-p,--pause}"[Pause container during commit]" \ | |
| 705 | + "($help -):container:__docker_complete_containers" \ | |
| 706 | + "($help -): :__docker_complete_repositories_with_tags" && ret=0 | |
| 707 | + ;; | |
| 708 | + (cp) | |
| 709 | + local state | |
| 710 | + _arguments $(__docker_arguments) \ | |
| 711 | + $opts_help \ | |
| 712 | + "($help -L --follow-link)"{-L,--follow-link}"[Always follow symbol link]" \ | |
| 713 | + "($help -)1:container:->container" \ | |
| 714 | + "($help -)2:hostpath:_files" && ret=0 | |
| 715 | + case $state in | |
| 716 | + (container) | |
| 717 | + if compset -P "*:"; then | |
| 718 | + _files && ret=0 | |
| 719 | + else | |
| 720 | + __docker_complete_containers -qS ":" && ret=0 | |
| 721 | + fi | |
| 722 | + ;; | |
| 723 | + esac | |
| 724 | + ;; | |
| 725 | + (create) | |
| 726 | + local state | |
| 727 | + _arguments $(__docker_arguments) \ | |
| 728 | + $opts_help \ | |
| 729 | + $opts_create_run \ | |
| 730 | + $opts_create_run_update \ | |
| 731 | + "($help -): :__docker_complete_images" \ | |
| 732 | + "($help -):command: _command_names -e" \ | |
| 733 | + "($help -)*::arguments: _normal" && ret=0 | |
| 734 | + case $state in | |
| 735 | + (link) | |
| 736 | + if compset -P "*:"; then | |
| 737 | + _wanted alias expl "Alias" compadd -E "" && ret=0 | |
| 738 | + else | |
| 739 | + __docker_complete_running_containers -qS ":" && ret=0 | |
| 740 | + fi | |
| 741 | + ;; | |
| 742 | + esac | |
| 743 | + ;; | |
| 744 | + (diff) | |
| 745 | + _arguments $(__docker_arguments) \ | |
| 746 | + $opts_help \ | |
| 747 | + "($help -)*:containers:__docker_complete_containers" && ret=0 | |
| 748 | + ;; | |
| 749 | + (exec) | |
| 750 | + local state | |
| 751 | + _arguments $(__docker_arguments) \ | |
| 752 | + $opts_help \ | |
| 753 | + $opts_attach_exec_run_start \ | |
| 754 | + "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \ | |
| 755 | + "($help)*"{-e=,--env=}"[Set environment variables]:environment variable: " \ | |
| 756 | + "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \ | |
| 757 | + "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" \ | |
| 758 | + "($help)--privileged[Give extended Linux capabilities to the command]" \ | |
| 759 | + "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" \ | |
| 760 | + "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" \ | |
| 761 | + "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" \ | |
| 762 | + "($help -):containers:__docker_complete_running_containers" \ | |
| 763 | + "($help -)*::command:->anycommand" && ret=0 | |
| 764 | + case $state in | |
| 765 | + (anycommand) | |
| 766 | + shift 1 words | |
| 767 | + (( CURRENT-- )) | |
| 768 | + _normal && ret=0 | |
| 769 | + ;; | |
| 770 | + esac | |
| 771 | + ;; | |
| 772 | + (export) | |
| 773 | + _arguments $(__docker_arguments) \ | |
| 774 | + $opts_help \ | |
| 775 | + "($help -o --output)"{-o=,--output=}"[Write to a file, instead of stdout]:output file:_files" \ | |
| 776 | + "($help -)*:containers:__docker_complete_containers" && ret=0 | |
| 777 | + ;; | |
| 778 | + (inspect) | |
| 779 | + _arguments $(__docker_arguments) \ | |
| 780 | + $opts_help \ | |
| 781 | + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ | |
| 782 | + "($help -s --size)"{-s,--size}"[Display total file sizes]" \ | |
| 783 | + "($help -)*:containers:__docker_complete_containers" && ret=0 | |
| 784 | + ;; | |
| 785 | + (kill) | |
| 786 | + _arguments $(__docker_arguments) \ | |
| 787 | + $opts_help \ | |
| 788 | + "($help -s --signal)"{-s=,--signal=}"[Signal to send]:signal:_signals" \ | |
| 789 | + "($help -)*:containers:__docker_complete_running_containers" && ret=0 | |
| 790 | + ;; | |
| 791 | + (logs) | |
| 792 | + _arguments $(__docker_arguments) \ | |
| 793 | + $opts_help \ | |
| 794 | + "($help)--details[Show extra details provided to logs]" \ | |
| 795 | + "($help -f --follow)"{-f,--follow}"[Follow log output]" \ | |
| 796 | + "($help -s --since)"{-s=,--since=}"[Show logs since this timestamp]:timestamp: " \ | |
| 797 | + "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \ | |
| 798 | + "($help -n --tail)"{-n=,--tail=}"[Number of lines to show from the end of the logs]:lines:(1 10 20 50 all)" \ | |
| 799 | + "($help -)*:containers:__docker_complete_containers" && ret=0 | |
| 800 | + ;; | |
| 801 | + (ls|list) | |
| 802 | + _arguments $(__docker_arguments) \ | |
| 803 | + $opts_help \ | |
| 804 | + "($help -a --all)"{-a,--all}"[Show all containers]" \ | |
| 805 | + "($help)--before=[Show only container created before...]:containers:__docker_complete_containers" \ | |
| 806 | + "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_ps_filters" \ | |
| 807 | + "($help)--format=[Format the output using the given Go template]:template: " \ | |
| 808 | + "($help -l --latest)"{-l,--latest}"[Show only the latest created container]" \ | |
| 809 | + "($help -n --last)"{-n=,--last=}"[Show n last created containers (includes all states)]:n:(1 5 10 25 50)" \ | |
| 810 | + "($help)--no-trunc[Do not truncate output]" \ | |
| 811 | + "($help -q --quiet)"{-q,--quiet}"[Only show container IDs]" \ | |
| 812 | + "($help -s --size)"{-s,--size}"[Display total file sizes]" \ | |
| 813 | + "($help)--since=[Show only containers created since...]:containers:__docker_complete_containers" && ret=0 | |
| 814 | + ;; | |
| 815 | + (pause|unpause) | |
| 816 | + _arguments $(__docker_arguments) \ | |
| 817 | + $opts_help \ | |
| 818 | + "($help -)*:containers:__docker_complete_running_containers" && ret=0 | |
| 819 | + ;; | |
| 820 | + (port) | |
| 821 | + _arguments $(__docker_arguments) \ | |
| 822 | + $opts_help \ | |
| 823 | + "($help -)1:containers:__docker_complete_running_containers" \ | |
| 824 | + "($help -)2:port:_ports" && ret=0 | |
| 825 | + ;; | |
| 826 | + (prune) | |
| 827 | + _arguments $(__docker_arguments) \ | |
| 828 | + $opts_help \ | |
| 829 | + "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ | |
| 830 | + "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 | |
| 831 | + ;; | |
| 832 | + (rename) | |
| 833 | + _arguments $(__docker_arguments) \ | |
| 834 | + $opts_help \ | |
| 835 | + "($help -):old name:__docker_complete_containers" \ | |
| 836 | + "($help -):new name: " && ret=0 | |
| 837 | + ;; | |
| 838 | + (restart) | |
| 839 | + _arguments $(__docker_arguments) \ | |
| 840 | + $opts_help \ | |
| 841 | + "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \ | |
| 842 | + "($help -)*:containers:__docker_complete_containers" && ret=0 | |
| 843 | + ;; | |
| 844 | + (rm) | |
| 845 | + local state | |
| 846 | + _arguments $(__docker_arguments) \ | |
| 847 | + $opts_help \ | |
| 848 | + "($help -f --force)"{-f,--force}"[Force removal]" \ | |
| 849 | + "($help -l --link)"{-l,--link}"[Remove the specified link and not the underlying container]" \ | |
| 850 | + "($help -v --volumes)"{-v,--volumes}"[Remove the volumes associated to the container]" \ | |
| 851 | + "($help -)*:containers:->values" && ret=0 | |
| 852 | + case $state in | |
| 853 | + (values) | |
| 854 | + if [[ ${words[(r)-f]} == -f || ${words[(r)--force]} == --force ]]; then | |
| 855 | + __docker_complete_containers && ret=0 | |
| 856 | + else | |
| 857 | + __docker_complete_stopped_containers && ret=0 | |
| 858 | + fi | |
| 859 | + ;; | |
| 860 | + esac | |
| 861 | + ;; | |
| 862 | + (run) | |
| 863 | + local state | |
| 864 | + _arguments $(__docker_arguments) \ | |
| 865 | + $opts_help \ | |
| 866 | + $opts_create_run \ | |
| 867 | + $opts_create_run_update \ | |
| 868 | + $opts_attach_exec_run_start \ | |
| 869 | + "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \ | |
| 870 | + "($help)--health-cmd=[Command to run to check health]:command: " \ | |
| 871 | + "($help)--health-interval=[Time between running the check]:time: " \ | |
| 872 | + "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" \ | |
| 873 | + "($help)--health-timeout=[Maximum time to allow one check to run]:time: " \ | |
| 874 | + "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" \ | |
| 875 | + "($help)--rm[Remove intermediate containers when it exits]" \ | |
| 876 | + "($help)--runtime=[Name of the runtime to be used for that container]:runtime:__docker_complete_runtimes" \ | |
| 877 | + "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \ | |
| 878 | + "($help)--storage-opt=[Storage driver options for the container]:storage options:->storage-opt" \ | |
| 879 | + "($help -): :__docker_complete_images" \ | |
| 880 | + "($help -):command: _command_names -e" \ | |
| 881 | + "($help -)*::arguments: _normal" && ret=0 | |
| 882 | + case $state in | |
| 883 | + (link) | |
| 884 | + if compset -P "*:"; then | |
| 885 | + _wanted alias expl "Alias" compadd -E "" && ret=0 | |
| 886 | + else | |
| 887 | + __docker_complete_running_containers -qS ":" && ret=0 | |
| 888 | + fi | |
| 889 | + ;; | |
| 890 | + (storage-opt) | |
| 891 | + if compset -P "*="; then | |
| 892 | + _message "value" && ret=0 | |
| 893 | + else | |
| 894 | + opts=('size') | |
| 895 | + _describe -t filter-opts "storage options" opts -qS "=" && ret=0 | |
| 896 | + fi | |
| 897 | + ;; | |
| 898 | + esac | |
| 899 | + ;; | |
| 900 | + (start) | |
| 901 | + _arguments $(__docker_arguments) \ | |
| 902 | + $opts_help \ | |
| 903 | + $opts_attach_exec_run_start \ | |
| 904 | + "($help -a --attach)"{-a,--attach}"[Attach container's stdout/stderr and forward all signals]" \ | |
| 905 | + "($help -i --interactive)"{-i,--interactive}"[Attach container's stdin]" \ | |
| 906 | + "($help -)*:containers:__docker_complete_stopped_containers" && ret=0 | |
| 907 | + ;; | |
| 908 | + (stats) | |
| 909 | + _arguments $(__docker_arguments) \ | |
| 910 | + $opts_help \ | |
| 911 | + "($help -a --all)"{-a,--all}"[Show all containers (default shows just running)]" \ | |
| 912 | + "($help)--format=[Format the output using the given Go template]:template: " \ | |
| 913 | + "($help)--no-stream[Disable streaming stats and only pull the first result]" \ | |
| 914 | + "($help)--no-trunc[Do not truncate output]" \ | |
| 915 | + "($help -)*:containers:__docker_complete_running_containers" && ret=0 | |
| 916 | + ;; | |
| 917 | + (stop) | |
| 918 | + _arguments $(__docker_arguments) \ | |
| 919 | + $opts_help \ | |
| 920 | + "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \ | |
| 921 | + "($help -)*:containers:__docker_complete_running_containers" && ret=0 | |
| 922 | + ;; | |
| 923 | + (top) | |
| 924 | + local state | |
| 925 | + _arguments $(__docker_arguments) \ | |
| 926 | + $opts_help \ | |
| 927 | + "($help -)1:containers:__docker_complete_running_containers" \ | |
| 928 | + "($help -)*:: :->ps-arguments" && ret=0 | |
| 929 | + case $state in | |
| 930 | + (ps-arguments) | |
| 931 | + _ps && ret=0 | |
| 932 | + ;; | |
| 933 | + esac | |
| 934 | + ;; | |
| 935 | + (update) | |
| 936 | + local state | |
| 937 | + _arguments $(__docker_arguments) \ | |
| 938 | + $opts_help \ | |
| 939 | + $opts_create_run_update \ | |
| 940 | + "($help -)*: :->values" && ret=0 | |
| 941 | + case $state in | |
| 942 | + (values) | |
| 943 | + if [[ ${words[(r)--kernel-memory*]} = (--kernel-memory*) ]]; then | |
| 944 | + __docker_complete_stopped_containers && ret=0 | |
| 945 | + else | |
| 946 | + __docker_complete_containers && ret=0 | |
| 947 | + fi | |
| 948 | + ;; | |
| 949 | + esac | |
| 950 | + ;; | |
| 951 | + (wait) | |
| 952 | + _arguments $(__docker_arguments) \ | |
| 953 | + $opts_help \ | |
| 954 | + "($help -)*:containers:__docker_complete_running_containers" && ret=0 | |
| 955 | + ;; | |
| 956 | + (help) | |
| 957 | + _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0 | |
| 958 | + ;; | |
| 959 | + esac | |
| 960 | + | |
| 961 | + return ret | |
| 962 | +} | |
| 963 | + | |
| 964 | +# EO container | |
| 965 | + | |
| 966 | +# BO image | |
| 967 | + | |
| 968 | +__docker_image_commands() { | |
| 969 | + local -a _docker_image_subcommands | |
| 970 | + _docker_image_subcommands=( | |
| 971 | + "build:Build an image from a Dockerfile" | |
| 972 | + "history:Show the history of an image" | |
| 973 | + "import:Import the contents from a tarball to create a filesystem image" | |
| 974 | + "inspect:Display detailed information on one or more images" | |
| 975 | + "load:Load an image from a tar archive or STDIN" | |
| 976 | + "ls:List images" | |
| 977 | + "prune:Remove unused images" | |
| 978 | + "pull:Download an image from a registry" | |
| 979 | + "push:Upload an image to a registry" | |
| 980 | + "rm:Remove one or more images" | |
| 981 | + "save:Save one or more images to a tar archive (streamed to STDOUT by default)" | |
| 982 | + "tag:Tag an image into a repository" | |
| 983 | + ) | |
| 984 | + _describe -t docker-image-commands "docker image command" _docker_image_subcommands | |
| 985 | +} | |
| 986 | + | |
| 987 | +__docker_image_subcommand() { | |
| 988 | + local -a _command_args opts_help | |
| 989 | + local expl help="--help" | |
| 990 | + integer ret=1 | |
| 991 | + | |
| 992 | + opts_help=("(: -)--help[Print usage]") | |
| 993 | + | |
| 994 | + case "$words[1]" in | |
| 995 | + (build) | |
| 996 | + _arguments $(__docker_arguments) \ | |
| 997 | + $opts_help \ | |
| 998 | + "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: " \ | |
| 999 | + "($help)*--build-arg=[Build-time variables]:<varname>=<value>: " \ | |
| 1000 | + "($help)*--cache-from=[Images to consider as cache sources]: :__docker_complete_repositories_with_tags" \ | |
| 1001 | + "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" \ | |
| 1002 | + "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " \ | |
| 1003 | + "($help)--compress[Compress the build context using gzip]" \ | |
| 1004 | + "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " \ | |
| 1005 | + "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " \ | |
| 1006 | + "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " \ | |
| 1007 | + "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " \ | |
| 1008 | + "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " \ | |
| 1009 | + "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " \ | |
| 1010 | + "($help)--disable-content-trust[Skip image verification]" \ | |
| 1011 | + "($help -f --file)"{-f=,--file=}"[Name of the Dockerfile]:Dockerfile:_files" \ | |
| 1012 | + "($help)--force-rm[Always remove intermediate containers]" \ | |
| 1013 | + "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" \ | |
| 1014 | + "($help)*--label=[Set metadata for an image]:label=value: " \ | |
| 1015 | + "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " \ | |
| 1016 | + "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " \ | |
| 1017 | + "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" \ | |
| 1018 | + "($help)--no-cache[Do not use cache when building the image]" \ | |
| 1019 | + "($help)--pull[Attempt to pull a newer version of the image]" \ | |
| 1020 | + "($help -q --quiet)"{-q,--quiet}"[Suppress verbose build output]" \ | |
| 1021 | + "($help)--rm[Remove intermediate containers after a successful build]" \ | |
| 1022 | + "($help)*--shm-size=[Size of '/dev/shm' (format is '<number><unit>')]:shm size: " \ | |
| 1023 | + "($help)--squash[Squash newly built layers into a single new layer]" \ | |
| 1024 | + "($help -t --tag)*"{-t=,--tag=}"[Repository, name and tag for the image]: :__docker_complete_repositories_with_tags" \ | |
| 1025 | + "($help)--target=[Set the target build stage to build.]" \ | |
| 1026 | + "($help)*--ulimit=[ulimit options]:ulimit: " \ | |
| 1027 | + "($help)--userns=[Container user namespace]:user namespace:(host)" \ | |
| 1028 | + "($help -):path or URL:_directories" && ret=0 | |
| 1029 | + ;; | |
| 1030 | + (history) | |
| 1031 | + _arguments $(__docker_arguments) \ | |
| 1032 | + $opts_help \ | |
| 1033 | + "($help -H --human)"{-H,--human}"[Print sizes and dates in human readable format]" \ | |
| 1034 | + "($help)--no-trunc[Do not truncate output]" \ | |
| 1035 | + "($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \ | |
| 1036 | + "($help -)*: :__docker_complete_images" && ret=0 | |
| 1037 | + ;; | |
| 1038 | + (import) | |
| 1039 | + _arguments $(__docker_arguments) \ | |
| 1040 | + $opts_help \ | |
| 1041 | + "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \ | |
| 1042 | + "($help -m --message)"{-m=,--message=}"[Commit message for imported image]:message: " \ | |
| 1043 | + "($help -):URL:(- http:// file://)" \ | |
| 1044 | + "($help -): :__docker_complete_repositories_with_tags" && ret=0 | |
| 1045 | + ;; | |
| 1046 | + (inspect) | |
| 1047 | + _arguments $(__docker_arguments) \ | |
| 1048 | + $opts_help \ | |
| 1049 | + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ | |
| 1050 | + "($help -)*:images:__docker_complete_images" && ret=0 | |
| 1051 | + ;; | |
| 1052 | + (load) | |
| 1053 | + _arguments $(__docker_arguments) \ | |
| 1054 | + $opts_help \ | |
| 1055 | + "($help -i --input)"{-i=,--input=}"[Read from tar archive file]:archive file:_files -g \"*.((tar|TAR)(.gz|.GZ|.Z|.bz2|.lzma|.xz|)|(tbz|tgz|txz))(-.)\"" \ | |
| 1056 | + "($help -q --quiet)"{-q,--quiet}"[Suppress the load output]" && ret=0 | |
| 1057 | + ;; | |
| 1058 | + (ls|list) | |
| 1059 | + local state | |
| 1060 | + _arguments $(__docker_arguments) \ | |
| 1061 | + $opts_help \ | |
| 1062 | + "($help -a --all)"{-a,--all}"[Show all images]" \ | |
| 1063 | + "($help)--digests[Show digests]" \ | |
| 1064 | + "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_images_filters" \ | |
| 1065 | + "($help)--format=[Format the output using the given Go template]:template: " \ | |
| 1066 | + "($help)--no-trunc[Do not truncate output]" \ | |
| 1067 | + "($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \ | |
| 1068 | + "($help -): :__docker_complete_repositories" && ret=0 | |
| 1069 | + ;; | |
| 1070 | + (prune) | |
| 1071 | + _arguments $(__docker_arguments) \ | |
| 1072 | + $opts_help \ | |
| 1073 | + "($help -a --all)"{-a,--all}"[Remove all unused images, not just dangling ones]" \ | |
| 1074 | + "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ | |
| 1075 | + "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 | |
| 1076 | + ;; | |
| 1077 | + (pull) | |
| 1078 | + _arguments $(__docker_arguments) \ | |
| 1079 | + $opts_help \ | |
| 1080 | + "($help -a --all-tags)"{-a,--all-tags}"[Download all tagged images]" \ | |
| 1081 | + "($help)--disable-content-trust[Skip image verification]" \ | |
| 1082 | + "($help -):name:__docker_search" && ret=0 | |
| 1083 | + ;; | |
| 1084 | + (push) | |
| 1085 | + _arguments $(__docker_arguments) \ | |
| 1086 | + $opts_help \ | |
| 1087 | + "($help -a --all-tags)"{-a,--all-tags}"[Push all tags of an image to the repository]" \ | |
| 1088 | + "($help)--disable-content-trust[Skip image signing]" \ | |
| 1089 | + "($help -): :__docker_complete_images" && ret=0 | |
| 1090 | + ;; | |
| 1091 | + (rm) | |
| 1092 | + _arguments $(__docker_arguments) \ | |
| 1093 | + $opts_help \ | |
| 1094 | + "($help -f --force)"{-f,--force}"[Force removal]" \ | |
| 1095 | + "($help)--no-prune[Do not delete untagged parents]" \ | |
| 1096 | + "($help -)*: :__docker_complete_images" && ret=0 | |
| 1097 | + ;; | |
| 1098 | + (save) | |
| 1099 | + _arguments $(__docker_arguments) \ | |
| 1100 | + $opts_help \ | |
| 1101 | + "($help -o --output)"{-o=,--output=}"[Write to file]:file:_files" \ | |
| 1102 | + "($help -)*: :__docker_complete_images" && ret=0 | |
| 1103 | + ;; | |
| 1104 | + (tag) | |
| 1105 | + _arguments $(__docker_arguments) \ | |
| 1106 | + $opts_help \ | |
| 1107 | + "($help -):source:__docker_complete_images"\ | |
| 1108 | + "($help -):destination:__docker_complete_repositories_with_tags" && ret=0 | |
| 1109 | + ;; | |
| 1110 | + (help) | |
| 1111 | + _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0 | |
| 1112 | + ;; | |
| 1113 | + esac | |
| 1114 | + | |
| 1115 | + return ret | |
| 1116 | +} | |
| 1117 | + | |
| 1118 | +# EO image | |
| 1119 | + | |
| 1120 | +# BO network | |
| 1121 | + | |
| 1122 | +__docker_network_complete_ls_filters() { | |
| 1123 | + [[ $PREFIX = -* ]] && return 1 | |
| 1124 | + integer ret=1 | |
| 1125 | + | |
| 1126 | + if compset -P '*='; then | |
| 1127 | + case "${${words[-1]%=*}#*=}" in | |
| 1128 | + (driver) | |
| 1129 | + __docker_complete_info_plugins Network && ret=0 | |
| 1130 | + ;; | |
| 1131 | + (id) | |
| 1132 | + __docker_complete_networks_ids && ret=0 | |
| 1133 | + ;; | |
| 1134 | + (name) | |
| 1135 | + __docker_complete_networks_names && ret=0 | |
| 1136 | + ;; | |
| 1137 | + (scope) | |
| 1138 | + opts=('global' 'local' 'swarm') | |
| 1139 | + _describe -t scope-filter-opts "Scope filter options" opts && ret=0 | |
| 1140 | + ;; | |
| 1141 | + (type) | |
| 1142 | + opts=('builtin' 'custom') | |
| 1143 | + _describe -t type-filter-opts "Type filter options" opts && ret=0 | |
| 1144 | + ;; | |
| 1145 | + *) | |
| 1146 | + _message 'value' && ret=0 | |
| 1147 | + ;; | |
| 1148 | + esac | |
| 1149 | + else | |
| 1150 | + opts=('driver' 'id' 'label' 'name' 'scope' 'type') | |
| 1151 | + _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 | |
| 1152 | + fi | |
| 1153 | + | |
| 1154 | + return ret | |
| 1155 | +} | |
| 1156 | + | |
| 1157 | +__docker_get_networks() { | |
| 1158 | + [[ $PREFIX = -* ]] && return 1 | |
| 1159 | + integer ret=1 | |
| 1160 | + local line s | |
| 1161 | + declare -a lines networks | |
| 1162 | + | |
| 1163 | + type=$1; shift | |
| 1164 | + | |
| 1165 | + lines=(${(f)${:-"$(_call_program commands docker $docker_options network ls)"$'\n'}}) | |
| 1166 | + | |
| 1167 | + # Parse header line to find columns | |
| 1168 | + local i=1 j=1 k header=${lines[1]} | |
| 1169 | + declare -A begin end | |
| 1170 | + while (( j < ${#header} - 1 )); do | |
| 1171 | + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) | |
| 1172 | + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) | |
| 1173 | + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) | |
| 1174 | + begin[${header[$i,$((j-1))]}]=$i | |
| 1175 | + end[${header[$i,$((j-1))]}]=$k | |
| 1176 | + done | |
| 1177 | + end[${header[$i,$((j-1))]}]=-1 | |
| 1178 | + lines=(${lines[2,-1]}) | |
| 1179 | + | |
| 1180 | + # Network ID | |
| 1181 | + if [[ $type = (ids|all) ]]; then | |
| 1182 | + for line in $lines; do | |
| 1183 | + s="${line[${begin[NETWORK ID]},${end[NETWORK ID]}]%% ##}" | |
| 1184 | + s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" | |
| 1185 | + s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}" | |
| 1186 | + networks=($networks $s) | |
| 1187 | + done | |
| 1188 | + fi | |
| 1189 | + | |
| 1190 | + # Names | |
| 1191 | + if [[ $type = (names|all) ]]; then | |
| 1192 | + for line in $lines; do | |
| 1193 | + s="${line[${begin[NAME]},${end[NAME]}]%% ##}" | |
| 1194 | + s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" | |
| 1195 | + s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}" | |
| 1196 | + networks=($networks $s) | |
| 1197 | + done | |
| 1198 | + fi | |
| 1199 | + | |
| 1200 | + _describe -t networks-list "networks" networks "$@" && ret=0 | |
| 1201 | + return ret | |
| 1202 | +} | |
| 1203 | + | |
| 1204 | +__docker_complete_networks() { | |
| 1205 | + [[ $PREFIX = -* ]] && return 1 | |
| 1206 | + __docker_get_networks all "$@" | |
| 1207 | +} | |
| 1208 | + | |
| 1209 | +__docker_complete_networks_ids() { | |
| 1210 | + [[ $PREFIX = -* ]] && return 1 | |
| 1211 | + __docker_get_networks ids "$@" | |
| 1212 | +} | |
| 1213 | + | |
| 1214 | +__docker_complete_networks_names() { | |
| 1215 | + [[ $PREFIX = -* ]] && return 1 | |
| 1216 | + __docker_get_networks names "$@" | |
| 1217 | +} | |
| 1218 | + | |
| 1219 | +__docker_network_commands() { | |
| 1220 | + local -a _docker_network_subcommands | |
| 1221 | + _docker_network_subcommands=( | |
| 1222 | + "connect:Connect a container to a network" | |
| 1223 | + "create:Creates a new network with a name specified by the user" | |
| 1224 | + "disconnect:Disconnects a container from a network" | |
| 1225 | + "inspect:Displays detailed information on a network" | |
| 1226 | + "ls:Lists all the networks created by the user" | |
| 1227 | + "prune:Remove all unused networks" | |
| 1228 | + "rm:Deletes one or more networks" | |
| 1229 | + ) | |
| 1230 | + _describe -t docker-network-commands "docker network command" _docker_network_subcommands | |
| 1231 | +} | |
| 1232 | + | |
| 1233 | +__docker_network_subcommand() { | |
| 1234 | + local -a _command_args opts_help | |
| 1235 | + local expl help="--help" | |
| 1236 | + integer ret=1 | |
| 1237 | + | |
| 1238 | + opts_help=("(: -)--help[Print usage]") | |
| 1239 | + | |
| 1240 | + case "$words[1]" in | |
| 1241 | + (connect) | |
| 1242 | + _arguments $(__docker_arguments) \ | |
| 1243 | + $opts_help \ | |
| 1244 | + "($help)*--alias=[Add network-scoped alias for the container]:alias: " \ | |
| 1245 | + "($help)--ip=[IPv4 address]:IPv4: " \ | |
| 1246 | + "($help)--ip6=[IPv6 address]:IPv6: " \ | |
| 1247 | + "($help)*--link=[Add a link to another container]:link:->link" \ | |
| 1248 | + "($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " \ | |
| 1249 | + "($help -)1:network:__docker_complete_networks" \ | |
| 1250 | + "($help -)2:containers:__docker_complete_containers" && ret=0 | |
| 1251 | + | |
| 1252 | + case $state in | |
| 1253 | + (link) | |
| 1254 | + if compset -P "*:"; then | |
| 1255 | + _wanted alias expl "Alias" compadd -E "" && ret=0 | |
| 1256 | + else | |
| 1257 | + __docker_complete_running_containers -qS ":" && ret=0 | |
| 1258 | + fi | |
| 1259 | + ;; | |
| 1260 | + esac | |
| 1261 | + ;; | |
| 1262 | + (create) | |
| 1263 | + _arguments $(__docker_arguments) -A '-*' \ | |
| 1264 | + $opts_help \ | |
| 1265 | + "($help)--attachable[Enable manual container attachment]" \ | |
| 1266 | + "($help)*--aux-address[Auxiliary IPv4 or IPv6 addresses used by network driver]:key=IP: " \ | |
| 1267 | + "($help -d --driver)"{-d=,--driver=}"[Driver to manage the Network]:driver:(null host bridge overlay)" \ | |
| 1268 | + "($help)*--gateway=[IPv4 or IPv6 Gateway for the master subnet]:IP: " \ | |
| 1269 | + "($help)--internal[Restricts external access to the network]" \ | |
| 1270 | + "($help)*--ip-range=[Allocate container ip from a sub-range]:IP/mask: " \ | |
| 1271 | + "($help)--ipam-driver=[IP Address Management Driver]:driver:(default)" \ | |
| 1272 | + "($help)*--ipam-opt=[Custom IPAM plugin options]:opt=value: " \ | |
| 1273 | + "($help)--ipv6[Enable IPv6 networking]" \ | |
| 1274 | + "($help)*--label=[Set metadata on a network]:label=value: " \ | |
| 1275 | + "($help)*"{-o=,--opt=}"[Driver specific options]:opt=value: " \ | |
| 1276 | + "($help)*--subnet=[Subnet in CIDR format that represents a network segment]:IP/mask: " \ | |
| 1277 | + "($help -)1:Network Name: " && ret=0 | |
| 1278 | + ;; | |
| 1279 | + (disconnect) | |
| 1280 | + _arguments $(__docker_arguments) \ | |
| 1281 | + $opts_help \ | |
| 1282 | + "($help -)1:network:__docker_complete_networks" \ | |
| 1283 | + "($help -)2:containers:__docker_complete_containers" && ret=0 | |
| 1284 | + ;; | |
| 1285 | + (inspect) | |
| 1286 | + _arguments $(__docker_arguments) \ | |
| 1287 | + $opts_help \ | |
| 1288 | + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ | |
| 1289 | + "($help)--verbose[Show detailed information]" \ | |
| 1290 | + "($help -)*:network:__docker_complete_networks" && ret=0 | |
| 1291 | + ;; | |
| 1292 | + (ls) | |
| 1293 | + _arguments $(__docker_arguments) \ | |
| 1294 | + $opts_help \ | |
| 1295 | + "($help)--no-trunc[Do not truncate the output]" \ | |
| 1296 | + "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_network_complete_ls_filters" \ | |
| 1297 | + "($help)--format=[Format the output using the given Go template]:template: " \ | |
| 1298 | + "($help -q --quiet)"{-q,--quiet}"[Only display network IDs]" && ret=0 | |
| 1299 | + ;; | |
| 1300 | + (prune) | |
| 1301 | + _arguments $(__docker_arguments) \ | |
| 1302 | + $opts_help \ | |
| 1303 | + "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ | |
| 1304 | + "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 | |
| 1305 | + ;; | |
| 1306 | + (rm) | |
| 1307 | + _arguments $(__docker_arguments) \ | |
| 1308 | + $opts_help \ | |
| 1309 | + "($help -)*:network:__docker_complete_networks" && ret=0 | |
| 1310 | + ;; | |
| 1311 | + (help) | |
| 1312 | + _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 | |
| 1313 | + ;; | |
| 1314 | + esac | |
| 1315 | + | |
| 1316 | + return ret | |
| 1317 | +} | |
| 1318 | + | |
| 1319 | +# EO network | |
| 1320 | + | |
| 1321 | +# BO node | |
| 1322 | + | |
| 1323 | +__docker_node_complete_ls_filters() { | |
| 1324 | + [[ $PREFIX = -* ]] && return 1 | |
| 1325 | + integer ret=1 | |
| 1326 | + | |
| 1327 | + if compset -P '*='; then | |
| 1328 | + case "${${words[-1]%=*}#*=}" in | |
| 1329 | + (id) | |
| 1330 | + __docker_complete_nodes_ids && ret=0 | |
| 1331 | + ;; | |
| 1332 | + (membership) | |
| 1333 | + membership_opts=('accepted' 'pending' 'rejected') | |
| 1334 | + _describe -t membership-opts "membership options" membership_opts && ret=0 | |
| 1335 | + ;; | |
| 1336 | + (name) | |
| 1337 | + __docker_complete_nodes_names && ret=0 | |
| 1338 | + ;; | |
| 1339 | + (role) | |
| 1340 | + role_opts=('manager' 'worker') | |
| 1341 | + _describe -t role-opts "role options" role_opts && ret=0 | |
| 1342 | + ;; | |
| 1343 | + *) | |
| 1344 | + _message 'value' && ret=0 | |
| 1345 | + ;; | |
| 1346 | + esac | |
| 1347 | + else | |
| 1348 | + opts=('id' 'label' 'membership' 'name' 'node.label' 'role') | |
| 1349 | + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 | |
| 1350 | + fi | |
| 1351 | + | |
| 1352 | + return ret | |
| 1353 | +} | |
| 1354 | + | |
| 1355 | +__docker_node_complete_ps_filters() { | |
| 1356 | + [[ $PREFIX = -* ]] && return 1 | |
| 1357 | + integer ret=1 | |
| 1358 | + | |
| 1359 | + if compset -P '*='; then | |
| 1360 | + case "${${words[-1]%=*}#*=}" in | |
| 1361 | + (desired-state) | |
| 1362 | + state_opts=('accepted' 'running' 'shutdown') | |
| 1363 | + _describe -t state-opts "desired state options" state_opts && ret=0 | |
| 1364 | + ;; | |
| 1365 | + *) | |
| 1366 | + _message 'value' && ret=0 | |
| 1367 | + ;; | |
| 1368 | + esac | |
| 1369 | + else | |
| 1370 | + opts=('desired-state' 'id' 'label' 'name') | |
| 1371 | + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 | |
| 1372 | + fi | |
| 1373 | + | |
| 1374 | + return ret | |
| 1375 | +} | |
| 1376 | + | |
| 1377 | +__docker_nodes() { | |
| 1378 | + [[ $PREFIX = -* ]] && return 1 | |
| 1379 | + integer ret=1 | |
| 1380 | + local line s | |
| 1381 | + declare -a lines nodes args | |
| 1382 | + | |
| 1383 | + type=$1; shift | |
| 1384 | + filter=$1; shift | |
| 1385 | + [[ $filter != "none" ]] && args=("-f $filter") | |
| 1386 | + | |
| 1387 | + lines=(${(f)${:-"$(_call_program commands docker $docker_options node ls $args)"$'\n'}}) | |
| 1388 | + # Parse header line to find columns | |
| 1389 | + local i=1 j=1 k header=${lines[1]} | |
| 1390 | + declare -A begin end | |
| 1391 | + while (( j < ${#header} - 1 )); do | |
| 1392 | + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) | |
| 1393 | + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) | |
| 1394 | + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) | |
| 1395 | + begin[${header[$i,$((j-1))]}]=$i | |
| 1396 | + end[${header[$i,$((j-1))]}]=$k | |
| 1397 | + done | |
| 1398 | + end[${header[$i,$((j-1))]}]=-1 | |
| 1399 | + lines=(${lines[2,-1]}) | |
| 1400 | + | |
| 1401 | + # Node ID | |
| 1402 | + if [[ $type = (ids|all) ]]; then | |
| 1403 | + for line in $lines; do | |
| 1404 | + s="${line[${begin[ID]},${end[ID]}]%% ##}" | |
| 1405 | + nodes=($nodes $s) | |
| 1406 | + done | |
| 1407 | + fi | |
| 1408 | + | |
| 1409 | + # Names | |
| 1410 | + if [[ $type = (names|all) ]]; then | |
| 1411 | + for line in $lines; do | |
| 1412 | + s="${line[${begin[HOSTNAME]},${end[HOSTNAME]}]%% ##}" | |
| 1413 | + nodes=($nodes $s) | |
| 1414 | + done | |
| 1415 | + fi | |
| 1416 | + | |
| 1417 | + _describe -t nodes-list "nodes" nodes "$@" && ret=0 | |
| 1418 | + return ret | |
| 1419 | +} | |
| 1420 | + | |
| 1421 | +__docker_complete_nodes() { | |
| 1422 | + [[ $PREFIX = -* ]] && return 1 | |
| 1423 | + __docker_nodes all none "$@" | |
| 1424 | +} | |
| 1425 | + | |
| 1426 | +__docker_complete_nodes_ids() { | |
| 1427 | + [[ $PREFIX = -* ]] && return 1 | |
| 1428 | + __docker_nodes ids none "$@" | |
| 1429 | +} | |
| 1430 | + | |
| 1431 | +__docker_complete_nodes_names() { | |
| 1432 | + [[ $PREFIX = -* ]] && return 1 | |
| 1433 | + __docker_nodes names none "$@" | |
| 1434 | +} | |
| 1435 | + | |
| 1436 | +__docker_complete_pending_nodes() { | |
| 1437 | + [[ $PREFIX = -* ]] && return 1 | |
| 1438 | + __docker_nodes all "membership=pending" "$@" | |
| 1439 | +} | |
| 1440 | + | |
| 1441 | +__docker_complete_manager_nodes() { | |
| 1442 | + [[ $PREFIX = -* ]] && return 1 | |
| 1443 | + __docker_nodes all "role=manager" "$@" | |
| 1444 | +} | |
| 1445 | + | |
| 1446 | +__docker_complete_worker_nodes() { | |
| 1447 | + [[ $PREFIX = -* ]] && return 1 | |
| 1448 | + __docker_nodes all "role=worker" "$@" | |
| 1449 | +} | |
| 1450 | + | |
| 1451 | +__docker_node_commands() { | |
| 1452 | + local -a _docker_node_subcommands | |
| 1453 | + _docker_node_subcommands=( | |
| 1454 | + "demote:Demote a node as manager in the swarm" | |
| 1455 | + "inspect:Display detailed information on one or more nodes" | |
| 1456 | + "ls:List nodes in the swarm" | |
| 1457 | + "promote:Promote a node as manager in the swarm" | |
| 1458 | + "rm:Remove one or more nodes from the swarm" | |
| 1459 | + "ps:List tasks running on one or more nodes, defaults to current node" | |
| 1460 | + "update:Update a node" | |
| 1461 | + ) | |
| 1462 | + _describe -t docker-node-commands "docker node command" _docker_node_subcommands | |
| 1463 | +} | |
| 1464 | + | |
| 1465 | +__docker_node_subcommand() { | |
| 1466 | + local -a _command_args opts_help | |
| 1467 | + local expl help="--help" | |
| 1468 | + integer ret=1 | |
| 1469 | + | |
| 1470 | + opts_help=("(: -)--help[Print usage]") | |
| 1471 | + | |
| 1472 | + case "$words[1]" in | |
| 1473 | + (rm|remove) | |
| 1474 | + _arguments $(__docker_arguments) \ | |
| 1475 | + $opts_help \ | |
| 1476 | + "($help -f --force)"{-f,--force}"[Force remove a node from the swarm]" \ | |
| 1477 | + "($help -)*:node:__docker_complete_pending_nodes" && ret=0 | |
| 1478 | + ;; | |
| 1479 | + (demote) | |
| 1480 | + _arguments $(__docker_arguments) \ | |
| 1481 | + $opts_help \ | |
| 1482 | + "($help -)*:node:__docker_complete_manager_nodes" && ret=0 | |
| 1483 | + ;; | |
| 1484 | + (inspect) | |
| 1485 | + _arguments $(__docker_arguments) \ | |
| 1486 | + $opts_help \ | |
| 1487 | + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ | |
| 1488 | + "($help)--pretty[Print the information in a human friendly format]" \ | |
| 1489 | + "($help -)*:node:__docker_complete_nodes" && ret=0 | |
| 1490 | + ;; | |
| 1491 | + (ls|list) | |
| 1492 | + _arguments $(__docker_arguments) \ | |
| 1493 | + $opts_help \ | |
| 1494 | + "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ls_filters" \ | |
| 1495 | + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 | |
| 1496 | + ;; | |
| 1497 | + (promote) | |
| 1498 | + _arguments $(__docker_arguments) \ | |
| 1499 | + $opts_help \ | |
| 1500 | + "($help -)*:node:__docker_complete_worker_nodes" && ret=0 | |
| 1501 | + ;; | |
| 1502 | + (ps) | |
| 1503 | + _arguments $(__docker_arguments) \ | |
| 1504 | + $opts_help \ | |
| 1505 | + "($help -a --all)"{-a,--all}"[Display all instances]" \ | |
| 1506 | + "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ps_filters" \ | |
| 1507 | + "($help)--format=[Format the output using the given go template]:template: " \ | |
| 1508 | + "($help)--no-resolve[Do not map IDs to Names]" \ | |
| 1509 | + "($help)--no-trunc[Do not truncate output]" \ | |
| 1510 | + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \ | |
| 1511 | + "($help -)*:node:__docker_complete_nodes" && ret=0 | |
| 1512 | + ;; | |
| 1513 | + (update) | |
| 1514 | + _arguments $(__docker_arguments) \ | |
| 1515 | + $opts_help \ | |
| 1516 | + "($help)--availability=[Availability of the node]:availability:(active pause drain)" \ | |
| 1517 | + "($help)*--label-add=[Add or update a node label]:key=value: " \ | |
| 1518 | + "($help)*--label-rm=[Remove a node label if exists]:label: " \ | |
| 1519 | + "($help)--role=[Role of the node]:role:(manager worker)" \ | |
| 1520 | + "($help -)1:node:__docker_complete_nodes" && ret=0 | |
| 1521 | + ;; | |
| 1522 | + (help) | |
| 1523 | + _arguments $(__docker_arguments) ":subcommand:__docker_node_commands" && ret=0 | |
| 1524 | + ;; | |
| 1525 | + esac | |
| 1526 | + | |
| 1527 | + return ret | |
| 1528 | +} | |
| 1529 | + | |
| 1530 | +# EO node | |
| 1531 | + | |
| 1532 | +# BO plugin | |
| 1533 | + | |
| 1534 | +__docker_plugin_complete_ls_filters() { | |
| 1535 | + [[ $PREFIX = -* ]] && return 1 | |
| 1536 | + integer ret=1 | |
| 1537 | + | |
| 1538 | + if compset -P '*='; then | |
| 1539 | + case "${${words[-1]%=*}#*=}" in | |
| 1540 | + (capability) | |
| 1541 | + opts=('authz' 'ipamdriver' 'logdriver' 'metricscollector' 'networkdriver' 'volumedriver') | |
| 1542 | + _describe -t capability-opts "capability options" opts && ret=0 | |
| 1543 | + ;; | |
| 1544 | + (enabled) | |
| 1545 | + opts=('false' 'true') | |
| 1546 | + _describe -t enabled-opts "enabled options" opts && ret=0 | |
| 1547 | + ;; | |
| 1548 | + *) | |
| 1549 | + _message 'value' && ret=0 | |
| 1550 | + ;; | |
| 1551 | + esac | |
| 1552 | + else | |
| 1553 | + opts=('capability' 'enabled') | |
| 1554 | + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 | |
| 1555 | + fi | |
| 1556 | + | |
| 1557 | + return ret | |
| 1558 | +} | |
| 1559 | + | |
| 1560 | +__docker_plugins() { | |
| 1561 | + [[ $PREFIX = -* ]] && return 1 | |
| 1562 | + integer ret=1 | |
| 1563 | + local line s | |
| 1564 | + declare -a lines plugins args | |
| 1565 | + | |
| 1566 | + filter=$1; shift | |
| 1567 | + [[ $filter != "none" ]] && args=("-f $filter") | |
| 1568 | + | |
| 1569 | + lines=(${(f)${:-"$(_call_program commands docker $docker_options plugin ls $args)"$'\n'}}) | |
| 1570 | + | |
| 1571 | + # Parse header line to find columns | |
| 1572 | + local i=1 j=1 k header=${lines[1]} | |
| 1573 | + declare -A begin end | |
| 1574 | + while (( j < ${#header} - 1 )); do | |
| 1575 | + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) | |
| 1576 | + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) | |
| 1577 | + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) | |
| 1578 | + begin[${header[$i,$((j-1))]}]=$i | |
| 1579 | + end[${header[$i,$((j-1))]}]=$k | |
| 1580 | + done | |
| 1581 | + end[${header[$i,$((j-1))]}]=-1 | |
| 1582 | + lines=(${lines[2,-1]}) | |
| 1583 | + | |
| 1584 | + # Name | |
| 1585 | + for line in $lines; do | |
| 1586 | + s="${line[${begin[NAME]},${end[NAME]}]%% ##}" | |
| 1587 | + s="$s:${(l:7:: :::)${${line[${begin[TAG]},${end[TAG]}]}%% ##}}" | |
| 1588 | + plugins=($plugins $s) | |
| 1589 | + done | |
| 1590 | + | |
| 1591 | + _describe -t plugins-list "plugins" plugins "$@" && ret=0 | |
| 1592 | + return ret | |
| 1593 | +} | |
| 1594 | + | |
| 1595 | +__docker_complete_plugins() { | |
| 1596 | + [[ $PREFIX = -* ]] && return 1 | |
| 1597 | + __docker_plugins none "$@" | |
| 1598 | +} | |
| 1599 | + | |
| 1600 | +__docker_complete_enabled_plugins() { | |
| 1601 | + [[ $PREFIX = -* ]] && return 1 | |
| 1602 | + __docker_plugins enabled=true "$@" | |
| 1603 | +} | |
| 1604 | + | |
| 1605 | +__docker_complete_disabled_plugins() { | |
| 1606 | + [[ $PREFIX = -* ]] && return 1 | |
| 1607 | + __docker_plugins enabled=false "$@" | |
| 1608 | +} | |
| 1609 | + | |
| 1610 | +__docker_plugin_commands() { | |
| 1611 | + local -a _docker_plugin_subcommands | |
| 1612 | + _docker_plugin_subcommands=( | |
| 1613 | + "disable:Disable a plugin" | |
| 1614 | + "enable:Enable a plugin" | |
| 1615 | + "inspect:Return low-level information about a plugin" | |
| 1616 | + "install:Install a plugin" | |
| 1617 | + "ls:List plugins" | |
| 1618 | + "push:Push a plugin" | |
| 1619 | + "rm:Remove a plugin" | |
| 1620 | + "set:Change settings for a plugin" | |
| 1621 | + "upgrade:Upgrade an existing plugin" | |
| 1622 | + ) | |
| 1623 | + _describe -t docker-plugin-commands "docker plugin command" _docker_plugin_subcommands | |
| 1624 | +} | |
| 1625 | + | |
| 1626 | +__docker_plugin_subcommand() { | |
| 1627 | + local -a _command_args opts_help | |
| 1628 | + local expl help="--help" | |
| 1629 | + integer ret=1 | |
| 1630 | + | |
| 1631 | + opts_help=("(: -)--help[Print usage]") | |
| 1632 | + | |
| 1633 | + case "$words[1]" in | |
| 1634 | + (disable) | |
| 1635 | + _arguments $(__docker_arguments) \ | |
| 1636 | + $opts_help \ | |
| 1637 | + "($help -f --force)"{-f,--force}"[Force the disable of an active plugin]" \ | |
| 1638 | + "($help -)1:plugin:__docker_complete_enabled_plugins" && ret=0 | |
| 1639 | + ;; | |
| 1640 | + (enable) | |
| 1641 | + _arguments $(__docker_arguments) \ | |
| 1642 | + $opts_help \ | |
| 1643 | + "($help)--timeout=[HTTP client timeout (in seconds)]:timeout: " \ | |
| 1644 | + "($help -)1:plugin:__docker_complete_disabled_plugins" && ret=0 | |
| 1645 | + ;; | |
| 1646 | + (inspect) | |
| 1647 | + _arguments $(__docker_arguments) \ | |
| 1648 | + $opts_help \ | |
| 1649 | + "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \ | |
| 1650 | + "($help -)*:plugin:__docker_complete_plugins" && ret=0 | |
| 1651 | + ;; | |
| 1652 | + (install) | |
| 1653 | + _arguments $(__docker_arguments) \ | |
| 1654 | + $opts_help \ | |
| 1655 | + "($help)--alias=[Local name for plugin]:alias: " \ | |
| 1656 | + "($help)--disable[Do not enable the plugin on install]" \ | |
| 1657 | + "($help)--disable-content-trust[Skip image verification (default true)]" \ | |
| 1658 | + "($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \ | |
| 1659 | + "($help -)1:plugin:__docker_complete_plugins" \ | |
| 1660 | + "($help -)*:key=value: " && ret=0 | |
| 1661 | + ;; | |
| 1662 | + (ls|list) | |
| 1663 | + _arguments $(__docker_arguments) \ | |
| 1664 | + $opts_help \ | |
| 1665 | + "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_plugin_complete_ls_filters" \ | |
| 1666 | + "($help --format)--format=[Format the output using the given Go template]:template: " \ | |
| 1667 | + "($help)--no-trunc[Don't truncate output]" \ | |
| 1668 | + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 | |
| 1669 | + ;; | |
| 1670 | + (push) | |
| 1671 | + _arguments $(__docker_arguments) \ | |
| 1672 | + $opts_help \ | |
| 1673 | + "($help)--disable-content-trust[Skip image verification (default true)]" \ | |
| 1674 | + "($help -)1:plugin:__docker_complete_plugins" && ret=0 | |
| 1675 | + ;; | |
| 1676 | + (rm|remove) | |
| 1677 | + _arguments $(__docker_arguments) \ | |
| 1678 | + $opts_help \ | |
| 1679 | + "($help -f --force)"{-f,--force}"[Force the removal of an active plugin]" \ | |
| 1680 | + "($help -)*:plugin:__docker_complete_plugins" && ret=0 | |
| 1681 | + ;; | |
| 1682 | + (set) | |
| 1683 | + _arguments $(__docker_arguments) \ | |
| 1684 | + $opts_help \ | |
| 1685 | + "($help -)1:plugin:__docker_complete_plugins" \ | |
| 1686 | + "($help -)*:key=value: " && ret=0 | |
| 1687 | + ;; | |
| 1688 | + (upgrade) | |
| 1689 | + _arguments $(__docker_arguments) \ | |
| 1690 | + $opts_help \ | |
| 1691 | + "($help)--disable-content-trust[Skip image verification (default true)]" \ | |
| 1692 | + "($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \ | |
| 1693 | + "($help)--skip-remote-check[Do not check if specified remote plugin matches existing plugin image]" \ | |
| 1694 | + "($help -)1:plugin:__docker_complete_plugins" \ | |
| 1695 | + "($help -):remote: " && ret=0 | |
| 1696 | + ;; | |
| 1697 | + (help) | |
| 1698 | + _arguments $(__docker_arguments) ":subcommand:__docker_plugin_commands" && ret=0 | |
| 1699 | + ;; | |
| 1700 | + esac | |
| 1701 | + | |
| 1702 | + return ret | |
| 1703 | +} | |
| 1704 | + | |
| 1705 | +# EO plugin | |
| 1706 | + | |
| 1707 | +# BO secret | |
| 1708 | + | |
| 1709 | +__docker_secrets() { | |
| 1710 | + [[ $PREFIX = -* ]] && return 1 | |
| 1711 | + integer ret=1 | |
| 1712 | + local line s | |
| 1713 | + declare -a lines secrets | |
| 1714 | + | |
| 1715 | + type=$1; shift | |
| 1716 | + | |
| 1717 | + lines=(${(f)${:-"$(_call_program commands docker $docker_options secret ls)"$'\n'}}) | |
| 1718 | + | |
| 1719 | + # Parse header line to find columns | |
| 1720 | + local i=1 j=1 k header=${lines[1]} | |
| 1721 | + declare -A begin end | |
| 1722 | + while (( j < ${#header} - 1 )); do | |
| 1723 | + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) | |
| 1724 | + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) | |
| 1725 | + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) | |
| 1726 | + begin[${header[$i,$((j-1))]}]=$i | |
| 1727 | + end[${header[$i,$((j-1))]}]=$k | |
| 1728 | + done | |
| 1729 | + end[${header[$i,$((j-1))]}]=-1 | |
| 1730 | + lines=(${lines[2,-1]}) | |
| 1731 | + | |
| 1732 | + # ID | |
| 1733 | + if [[ $type = (ids|all) ]]; then | |
| 1734 | + for line in $lines; do | |
| 1735 | + s="${line[${begin[ID]},${end[ID]}]%% ##}" | |
| 1736 | + secrets=($secrets $s) | |
| 1737 | + done | |
| 1738 | + fi | |
| 1739 | + | |
| 1740 | + # Names | |
| 1741 | + if [[ $type = (names|all) ]]; then | |
| 1742 | + for line in $lines; do | |
| 1743 | + s="${line[${begin[NAME]},${end[NAME]}]%% ##}" | |
| 1744 | + secrets=($secrets $s) | |
| 1745 | + done | |
| 1746 | + fi | |
| 1747 | + | |
| 1748 | + _describe -t secrets-list "secrets" secrets "$@" && ret=0 | |
| 1749 | + return ret | |
| 1750 | +} | |
| 1751 | + | |
| 1752 | +__docker_complete_secrets() { | |
| 1753 | + [[ $PREFIX = -* ]] && return 1 | |
| 1754 | + __docker_secrets all "$@" | |
| 1755 | +} | |
| 1756 | + | |
| 1757 | +__docker_secret_commands() { | |
| 1758 | + local -a _docker_secret_subcommands | |
| 1759 | + _docker_secret_subcommands=( | |
| 1760 | + "create:Create a secret using stdin as content" | |
| 1761 | + "inspect:Display detailed information on one or more secrets" | |
| 1762 | + "ls:List secrets" | |
| 1763 | + "rm:Remove one or more secrets" | |
| 1764 | + ) | |
| 1765 | + _describe -t docker-secret-commands "docker secret command" _docker_secret_subcommands | |
| 1766 | +} | |
| 1767 | + | |
| 1768 | +__docker_secret_subcommand() { | |
| 1769 | + local -a _command_args opts_help | |
| 1770 | + local expl help="--help" | |
| 1771 | + integer ret=1 | |
| 1772 | + | |
| 1773 | + opts_help=("(: -)--help[Print usage]") | |
| 1774 | + | |
| 1775 | + case "$words[1]" in | |
| 1776 | + (create) | |
| 1777 | + _arguments $(__docker_arguments) -A '-*' \ | |
| 1778 | + $opts_help \ | |
| 1779 | + "($help)*"{-l=,--label=}"[Secret labels]:label: " \ | |
| 1780 | + "($help -):secret: " && ret=0 | |
| 1781 | + ;; | |
| 1782 | + (inspect) | |
| 1783 | + _arguments $(__docker_arguments) \ | |
| 1784 | + $opts_help \ | |
| 1785 | + "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \ | |
| 1786 | + "($help -)*:secret:__docker_complete_secrets" && ret=0 | |
| 1787 | + ;; | |
| 1788 | + (ls|list) | |
| 1789 | + _arguments $(__docker_arguments) \ | |
| 1790 | + $opts_help \ | |
| 1791 | + "($help)--format=[Format the output using the given go template]:template: " \ | |
| 1792 | + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 | |
| 1793 | + ;; | |
| 1794 | + (rm|remove) | |
| 1795 | + _arguments $(__docker_arguments) \ | |
| 1796 | + $opts_help \ | |
| 1797 | + "($help -)*:secret:__docker_complete_secrets" && ret=0 | |
| 1798 | + ;; | |
| 1799 | + (help) | |
| 1800 | + _arguments $(__docker_arguments) ":subcommand:__docker_secret_commands" && ret=0 | |
| 1801 | + ;; | |
| 1802 | + esac | |
| 1803 | + | |
| 1804 | + return ret | |
| 1805 | +} | |
| 1806 | + | |
| 1807 | +# EO secret | |
| 1808 | + | |
| 1809 | +# BO service | |
| 1810 | + | |
| 1811 | +__docker_service_complete_ls_filters() { | |
| 1812 | + [[ $PREFIX = -* ]] && return 1 | |
| 1813 | + integer ret=1 | |
| 1814 | + | |
| 1815 | + if compset -P '*='; then | |
| 1816 | + case "${${words[-1]%=*}#*=}" in | |
| 1817 | + (id) | |
| 1818 | + __docker_complete_services_ids && ret=0 | |
| 1819 | + ;; | |
| 1820 | + (mode) | |
| 1821 | + opts=('global' 'replicated') | |
| 1822 | + _describe -t mode-opts "mode options" opts && ret=0 | |
| 1823 | + ;; | |
| 1824 | + (name) | |
| 1825 | + __docker_complete_services_names && ret=0 | |
| 1826 | + ;; | |
| 1827 | + *) | |
| 1828 | + _message 'value' && ret=0 | |
| 1829 | + ;; | |
| 1830 | + esac | |
| 1831 | + else | |
| 1832 | + opts=('id' 'label' 'mode' 'name') | |
| 1833 | + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 | |
| 1834 | + fi | |
| 1835 | + | |
| 1836 | + return ret | |
| 1837 | +} | |
| 1838 | + | |
| 1839 | +__docker_service_complete_ps_filters() { | |
| 1840 | + [[ $PREFIX = -* ]] && return 1 | |
| 1841 | + integer ret=1 | |
| 1842 | + | |
| 1843 | + if compset -P '*='; then | |
| 1844 | + case "${${words[-1]%=*}#*=}" in | |
| 1845 | + (desired-state) | |
| 1846 | + state_opts=('accepted' 'running' 'shutdown') | |
| 1847 | + _describe -t state-opts "desired state options" state_opts && ret=0 | |
| 1848 | + ;; | |
| 1849 | + *) | |
| 1850 | + _message 'value' && ret=0 | |
| 1851 | + ;; | |
| 1852 | + esac | |
| 1853 | + else | |
| 1854 | + opts=('desired-state' 'id' 'label' 'name') | |
| 1855 | + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 | |
| 1856 | + fi | |
| 1857 | + | |
| 1858 | + return ret | |
| 1859 | +} | |
| 1860 | + | |
| 1861 | +__docker_service_complete_placement_pref() { | |
| 1862 | + [[ $PREFIX = -* ]] && return 1 | |
| 1863 | + integer ret=1 | |
| 1864 | + | |
| 1865 | + if compset -P '*='; then | |
| 1866 | + case "${${words[-1]%=*}#*=}" in | |
| 1867 | + (spread) | |
| 1868 | + opts=('engine.labels' 'node.labels') | |
| 1869 | + _describe -t spread-opts "spread options" opts -qS "." && ret=0 | |
| 1870 | + ;; | |
| 1871 | + *) | |
| 1872 | + _message 'value' && ret=0 | |
| 1873 | + ;; | |
| 1874 | + esac | |
| 1875 | + else | |
| 1876 | + opts=('spread') | |
| 1877 | + _describe -t pref-opts "placement pref options" opts -qS "=" && ret=0 | |
| 1878 | + fi | |
| 1879 | + | |
| 1880 | + return ret | |
| 1881 | +} | |
| 1882 | + | |
| 1883 | +__docker_services() { | |
| 1884 | + [[ $PREFIX = -* ]] && return 1 | |
| 1885 | + integer ret=1 | |
| 1886 | + local line s | |
| 1887 | + declare -a lines services | |
| 1888 | + | |
| 1889 | + type=$1; shift | |
| 1890 | + | |
| 1891 | + lines=(${(f)${:-"$(_call_program commands docker $docker_options service ls)"$'\n'}}) | |
| 1892 | + | |
| 1893 | + # Parse header line to find columns | |
| 1894 | + local i=1 j=1 k header=${lines[1]} | |
| 1895 | + declare -A begin end | |
| 1896 | + while (( j < ${#header} - 1 )); do | |
| 1897 | + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) | |
| 1898 | + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) | |
| 1899 | + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) | |
| 1900 | + begin[${header[$i,$((j-1))]}]=$i | |
| 1901 | + end[${header[$i,$((j-1))]}]=$k | |
| 1902 | + done | |
| 1903 | + end[${header[$i,$((j-1))]}]=-1 | |
| 1904 | + lines=(${lines[2,-1]}) | |
| 1905 | + | |
| 1906 | + # Service ID | |
| 1907 | + if [[ $type = (ids|all) ]]; then | |
| 1908 | + for line in $lines; do | |
| 1909 | + s="${line[${begin[ID]},${end[ID]}]%% ##}" | |
| 1910 | + s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" | |
| 1911 | + services=($services $s) | |
| 1912 | + done | |
| 1913 | + fi | |
| 1914 | + | |
| 1915 | + # Names | |
| 1916 | + if [[ $type = (names|all) ]]; then | |
| 1917 | + for line in $lines; do | |
| 1918 | + s="${line[${begin[NAME]},${end[NAME]}]%% ##}" | |
| 1919 | + s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" | |
| 1920 | + services=($services $s) | |
| 1921 | + done | |
| 1922 | + fi | |
| 1923 | + | |
| 1924 | + _describe -t services-list "services" services "$@" && ret=0 | |
| 1925 | + return ret | |
| 1926 | +} | |
| 1927 | + | |
| 1928 | +__docker_complete_services() { | |
| 1929 | + [[ $PREFIX = -* ]] && return 1 | |
| 1930 | + __docker_services all "$@" | |
| 1931 | +} | |
| 1932 | + | |
| 1933 | +__docker_complete_services_ids() { | |
| 1934 | + [[ $PREFIX = -* ]] && return 1 | |
| 1935 | + __docker_services ids "$@" | |
| 1936 | +} | |
| 1937 | + | |
| 1938 | +__docker_complete_services_names() { | |
| 1939 | + [[ $PREFIX = -* ]] && return 1 | |
| 1940 | + __docker_services names "$@" | |
| 1941 | +} | |
| 1942 | + | |
| 1943 | +__docker_service_commands() { | |
| 1944 | + local -a _docker_service_subcommands | |
| 1945 | + _docker_service_subcommands=( | |
| 1946 | + "create:Create a new service" | |
| 1947 | + "inspect:Display detailed information on one or more services" | |
| 1948 | + "logs:Fetch the logs of a service or task" | |
| 1949 | + "ls:List services" | |
| 1950 | + "rm:Remove one or more services" | |
| 1951 | + "rollback:Revert changes to a service's configuration" | |
| 1952 | + "scale:Scale one or multiple replicated services" | |
| 1953 | + "ps:List the tasks of a service" | |
| 1954 | + "update:Update a service" | |
| 1955 | + ) | |
| 1956 | + _describe -t docker-service-commands "docker service command" _docker_service_subcommands | |
| 1957 | +} | |
| 1958 | + | |
| 1959 | +__docker_service_subcommand() { | |
| 1960 | + local -a _command_args opts_help opts_create_update | |
| 1961 | + local expl help="--help" | |
| 1962 | + integer ret=1 | |
| 1963 | + | |
| 1964 | + opts_help=("(: -)--help[Print usage]") | |
| 1965 | + opts_create_update=( | |
| 1966 | + "($help)*--cap-add=[Add Linux capabilities]:capability: " | |
| 1967 | + "($help)*--cap-drop=[Drop Linux capabilities]:capability: " | |
| 1968 | + "($help)*--constraint=[Placement constraints]:constraint: " | |
| 1969 | + "($help)--endpoint-mode=[Placement constraints]:mode:(dnsrr vip)" | |
| 1970 | + "($help)*"{-e=,--env=}"[Set environment variables]:env: " | |
| 1971 | + "($help)--health-cmd=[Command to run to check health]:command: " | |
| 1972 | + "($help)--health-interval=[Time between running the check]:time: " | |
| 1973 | + "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" | |
| 1974 | + "($help)--health-timeout=[Maximum time to allow one check to run]:time: " | |
| 1975 | + "($help)--hostname=[Service container hostname]:hostname: " \ | |
| 1976 | + "($help)--isolation=[Service container isolation mode]:isolation:(default process hyperv)" \ | |
| 1977 | + "($help)*--label=[Service labels]:label: " | |
| 1978 | + "($help)--limit-cpu=[Limit CPUs]:value: " | |
| 1979 | + "($help)--limit-memory=[Limit Memory]:value: " | |
| 1980 | + "($help)--limit-pids[Limit maximum number of processes (default 0 = unlimited)]" | |
| 1981 | + "($help)--log-driver=[Logging driver for service]:logging driver:__docker_complete_log_drivers" | |
| 1982 | + "($help)*--log-opt=[Logging driver options]:log driver options:__docker_complete_log_options" | |
| 1983 | + "($help)*--mount=[Attach a filesystem mount to the service]:mount: " | |
| 1984 | + "($help)*--network=[Network attachments]:network: " | |
| 1985 | + "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" | |
| 1986 | + "($help)--read-only[Mount the container's root filesystem as read only]" | |
| 1987 | + "($help)--replicas=[Number of tasks]:replicas: " | |
| 1988 | + "($help)--reserve-cpu=[Reserve CPUs]:value: " | |
| 1989 | + "($help)--reserve-memory=[Reserve Memory]:value: " | |
| 1990 | + "($help)--restart-condition=[Restart when condition is met]:mode:(any none on-failure)" | |
| 1991 | + "($help)--restart-delay=[Delay between restart attempts]:delay: " | |
| 1992 | + "($help)--restart-max-attempts=[Maximum number of restarts before giving up]:max-attempts: " | |
| 1993 | + "($help)--restart-window=[Window used to evaluate the restart policy]:duration: " | |
| 1994 | + "($help)--rollback-delay=[Delay between task rollbacks]:duration: " | |
| 1995 | + "($help)--rollback-failure-action=[Action on rollback failure]:action:(continue pause)" | |
| 1996 | + "($help)--rollback-max-failure-ratio=[Failure rate to tolerate during a rollback]:failure rate: " | |
| 1997 | + "($help)--rollback-monitor=[Duration after each task rollback to monitor for failure]:duration: " | |
| 1998 | + "($help)--rollback-parallelism=[Maximum number of tasks rolled back simultaneously]:number: " | |
| 1999 | + "($help)*--secret=[Specify secrets to expose to the service]:secret:__docker_complete_secrets" | |
| 2000 | + "($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: " | |
| 2001 | + "($help)--stop-signal=[Signal to stop the container]:signal:_signals" | |
| 2002 | + "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-TTY]" | |
| 2003 | + "($help)--update-delay=[Delay between updates]:delay: " | |
| 2004 | + "($help)--update-failure-action=[Action on update failure]:mode:(continue pause rollback)" | |
| 2005 | + "($help)--update-max-failure-ratio=[Failure rate to tolerate during an update]:fraction: " | |
| 2006 | + "($help)--update-monitor=[Duration after each task update to monitor for failure]:window: " | |
| 2007 | + "($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: " | |
| 2008 | + "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" | |
| 2009 | + "($help)--with-registry-auth[Send registry authentication details to swarm agents]" | |
| 2010 | + "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" | |
| 2011 | + ) | |
| 2012 | + | |
| 2013 | + case "$words[1]" in | |
| 2014 | + (create) | |
| 2015 | + _arguments $(__docker_arguments) \ | |
| 2016 | + $opts_help \ | |
| 2017 | + $opts_create_update \ | |
| 2018 | + "($help)*--container-label=[Container labels]:label: " \ | |
| 2019 | + "($help)*--dns=[Set custom DNS servers]:DNS: " \ | |
| 2020 | + "($help)*--dns-option=[Set DNS options]:DNS option: " \ | |
| 2021 | + "($help)*--dns-search=[Set custom DNS search domains]:DNS search: " \ | |
| 2022 | + "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \ | |
| 2023 | + "($help)*--group=[Set one or more supplementary user groups for the container]:group: _groups " \ | |
| 2024 | + "($help)--mode=[Service Mode]:mode:(global replicated)" \ | |
| 2025 | + "($help)--name=[Service name]:name: " \ | |
| 2026 | + "($help)*--placement-pref=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \ | |
| 2027 | + "($help)*"{-p=,--publish=}"[Publish a port as a node port]:port: " \ | |
| 2028 | + "($help -): :__docker_complete_images" \ | |
| 2029 | + "($help -):command: _command_names -e" \ | |
| 2030 | + "($help -)*::arguments: _normal" && ret=0 | |
| 2031 | + ;; | |
| 2032 | + (inspect) | |
| 2033 | + _arguments $(__docker_arguments) \ | |
| 2034 | + $opts_help \ | |
| 2035 | + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ | |
| 2036 | + "($help)--pretty[Print the information in a human friendly format]" \ | |
| 2037 | + "($help -)*:service:__docker_complete_services" && ret=0 | |
| 2038 | + ;; | |
| 2039 | + (logs) | |
| 2040 | + _arguments $(__docker_arguments) \ | |
| 2041 | + $opts_help \ | |
| 2042 | + "($help -f --follow)"{-f,--follow}"[Follow log output]" \ | |
| 2043 | + "($help)--no-resolve[Do not map IDs to Names]" \ | |
| 2044 | + "($help)--no-task-ids[Do not include task IDs]" \ | |
| 2045 | + "($help)--no-trunc[Do not truncate output]" \ | |
| 2046 | + "($help)--since=[Show logs since timestamp]:timestamp: " \ | |
| 2047 | + "($help -n --tail)"{-n=,--tail=}"[Number of lines to show from the end of the logs]:lines:(1 10 20 50 all)" \ | |
| 2048 | + "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \ | |
| 2049 | + "($help -)1:service:__docker_complete_services" && ret=0 | |
| 2050 | + ;; | |
| 2051 | + (ls|list) | |
| 2052 | + _arguments $(__docker_arguments) \ | |
| 2053 | + $opts_help \ | |
| 2054 | + "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_service_complete_ls_filters" \ | |
| 2055 | + "($help)--format=[Format the output using the given Go template]:template: " \ | |
| 2056 | + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 | |
| 2057 | + ;; | |
| 2058 | + (rm|remove) | |
| 2059 | + _arguments $(__docker_arguments) \ | |
| 2060 | + $opts_help \ | |
| 2061 | + "($help -)*:service:__docker_complete_services" && ret=0 | |
| 2062 | + ;; | |
| 2063 | + (rollback) | |
| 2064 | + _arguments $(__docker_arguments) \ | |
| 2065 | + $opts_help \ | |
| 2066 | + "($help -d --detach)"{-d=false,--detach=false}"[Disable detached mode]" \ | |
| 2067 | + "($help -q --quiet)"{-q,--quiet}"[Suppress progress output]" \ | |
| 2068 | + "($help -)*:service:__docker_complete_services" && ret=0 | |
| 2069 | + ;; | |
| 2070 | + (scale) | |
| 2071 | + _arguments $(__docker_arguments) \ | |
| 2072 | + $opts_help \ | |
| 2073 | + "($help -d --detach)"{-d=false,--detach=false}"[Disable detached mode]" \ | |
| 2074 | + "($help -)*:service:->values" && ret=0 | |
| 2075 | + case $state in | |
| 2076 | + (values) | |
| 2077 | + if compset -P '*='; then | |
| 2078 | + _message 'replicas' && ret=0 | |
| 2079 | + else | |
| 2080 | + __docker_complete_services -qS "=" | |
| 2081 | + fi | |
| 2082 | + ;; | |
| 2083 | + esac | |
| 2084 | + ;; | |
| 2085 | + (ps) | |
| 2086 | + _arguments $(__docker_arguments) \ | |
| 2087 | + $opts_help \ | |
| 2088 | + "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_service_complete_ps_filters" \ | |
| 2089 | + "($help)--format=[Format the output using the given go template]:template: " \ | |
| 2090 | + "($help)--no-resolve[Do not map IDs to Names]" \ | |
| 2091 | + "($help)--no-trunc[Do not truncate output]" \ | |
| 2092 | + "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \ | |
| 2093 | + "($help -)*:service:__docker_complete_services" && ret=0 | |
| 2094 | + ;; | |
| 2095 | + (update) | |
| 2096 | + _arguments $(__docker_arguments) \ | |
| 2097 | + $opts_help \ | |
| 2098 | + $opts_create_update \ | |
| 2099 | + "($help)--arg=[Service command args]:arguments: _normal" \ | |
| 2100 | + "($help)*--container-label-add=[Add or update container labels]:label: " \ | |
| 2101 | + "($help)*--container-label-rm=[Remove a container label by its key]:label: " \ | |
| 2102 | + "($help)*--dns-add=[Add or update custom DNS servers]:DNS: " \ | |
| 2103 | + "($help)*--dns-rm=[Remove custom DNS servers]:DNS: " \ | |
| 2104 | + "($help)*--dns-option-add=[Add or update DNS options]:DNS option: " \ | |
| 2105 | + "($help)*--dns-option-rm=[Remove DNS options]:DNS option: " \ | |
| 2106 | + "($help)*--dns-search-add=[Add or update custom DNS search domains]:DNS search: " \ | |
| 2107 | + "($help)*--dns-search-rm=[Remove DNS search domains]:DNS search: " \ | |
| 2108 | + "($help)--force[Force update]" \ | |
| 2109 | + "($help)*--group-add=[Add additional supplementary user groups to the container]:group:_groups" \ | |
| 2110 | + "($help)*--group-rm=[Remove previously added supplementary user groups from the container]:group:_groups" \ | |
| 2111 | + "($help)--image=[Service image tag]:image:__docker_complete_repositories" \ | |
| 2112 | + "($help)*--placement-pref-add=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \ | |
| 2113 | + "($help)*--placement-pref-rm=[Remove a placement preference]:pref:__docker_service_complete_placement_pref" \ | |
| 2114 | + "($help)*--publish-add=[Add or update a port]:port: " \ | |
| 2115 | + "($help)*--publish-rm=[Remove a port(target-port mandatory)]:port: " \ | |
| 2116 | + "($help)--rollback[Rollback to previous specification]" \ | |
| 2117 | + "($help -)1:service:__docker_complete_services" && ret=0 | |
| 2118 | + ;; | |
| 2119 | + (help) | |
| 2120 | + _arguments $(__docker_arguments) ":subcommand:__docker_service_commands" && ret=0 | |
| 2121 | + ;; | |
| 2122 | + esac | |
| 2123 | + | |
| 2124 | + return ret | |
| 2125 | +} | |
| 2126 | + | |
| 2127 | +# EO service | |
| 2128 | + | |
| 2129 | +# BO stack | |
| 2130 | + | |
| 2131 | +__docker_stack_complete_ps_filters() { | |
| 2132 | + [[ $PREFIX = -* ]] && return 1 | |
| 2133 | + integer ret=1 | |
| 2134 | + | |
| 2135 | + if compset -P '*='; then | |
| 2136 | + case "${${words[-1]%=*}#*=}" in | |
| 2137 | + (desired-state) | |
| 2138 | + state_opts=('accepted' 'running' 'shutdown') | |
| 2139 | + _describe -t state-opts "desired state options" state_opts && ret=0 | |
| 2140 | + ;; | |
| 2141 | + *) | |
| 2142 | + _message 'value' && ret=0 | |
| 2143 | + ;; | |
| 2144 | + esac | |
| 2145 | + else | |
| 2146 | + opts=('desired-state' 'id' 'name') | |
| 2147 | + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 | |
| 2148 | + fi | |
| 2149 | + | |
| 2150 | + return ret | |
| 2151 | +} | |
| 2152 | + | |
| 2153 | +__docker_stack_complete_services_filters() { | |
| 2154 | + [[ $PREFIX = -* ]] && return 1 | |
| 2155 | + integer ret=1 | |
| 2156 | + | |
| 2157 | + if compset -P '*='; then | |
| 2158 | + case "${${words[-1]%=*}#*=}" in | |
| 2159 | + *) | |
| 2160 | + _message 'value' && ret=0 | |
| 2161 | + ;; | |
| 2162 | + esac | |
| 2163 | + else | |
| 2164 | + opts=('id' 'label' 'name') | |
| 2165 | + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 | |
| 2166 | + fi | |
| 2167 | + | |
| 2168 | + return ret | |
| 2169 | +} | |
| 2170 | + | |
| 2171 | +__docker_stacks() { | |
| 2172 | + [[ $PREFIX = -* ]] && return 1 | |
| 2173 | + integer ret=1 | |
| 2174 | + local line s | |
| 2175 | + declare -a lines stacks | |
| 2176 | + | |
| 2177 | + lines=(${(f)${:-"$(_call_program commands docker $docker_options stack ls)"$'\n'}}) | |
| 2178 | + | |
| 2179 | + # Parse header line to find columns | |
| 2180 | + local i=1 j=1 k header=${lines[1]} | |
| 2181 | + declare -A begin end | |
| 2182 | + while (( j < ${#header} - 1 )); do | |
| 2183 | + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) | |
| 2184 | + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) | |
| 2185 | + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) | |
| 2186 | + begin[${header[$i,$((j-1))]}]=$i | |
| 2187 | + end[${header[$i,$((j-1))]}]=$k | |
| 2188 | + done | |
| 2189 | + end[${header[$i,$((j-1))]}]=-1 | |
| 2190 | + lines=(${lines[2,-1]}) | |
| 2191 | + | |
| 2192 | + # Service NAME | |
| 2193 | + for line in $lines; do | |
| 2194 | + s="${line[${begin[NAME]},${end[NAME]}]%% ##}" | |
| 2195 | + stacks=($stacks $s) | |
| 2196 | + done | |
| 2197 | + | |
| 2198 | + _describe -t stacks-list "stacks" stacks "$@" && ret=0 | |
| 2199 | + return ret | |
| 2200 | +} | |
| 2201 | + | |
| 2202 | +__docker_complete_stacks() { | |
| 2203 | + [[ $PREFIX = -* ]] && return 1 | |
| 2204 | + __docker_stacks "$@" | |
| 2205 | +} | |
| 2206 | + | |
| 2207 | +__docker_stack_commands() { | |
| 2208 | + local -a _docker_stack_subcommands | |
| 2209 | + _docker_stack_subcommands=( | |
| 2210 | + "deploy:Deploy a new stack or update an existing stack" | |
| 2211 | + "ls:List stacks" | |
| 2212 | + "ps:List the tasks in the stack" | |
| 2213 | + "rm:Remove the stack" | |
| 2214 | + "services:List the services in the stack" | |
| 2215 | + ) | |
| 2216 | + _describe -t docker-stack-commands "docker stack command" _docker_stack_subcommands | |
| 2217 | +} | |
| 2218 | + | |
| 2219 | +__docker_stack_subcommand() { | |
| 2220 | + local -a _command_args opts_help | |
| 2221 | + local expl help="--help" | |
| 2222 | + integer ret=1 | |
| 2223 | + | |
| 2224 | + opts_help=("(: -)--help[Print usage]") | |
| 2225 | + | |
| 2226 | + case "$words[1]" in | |
| 2227 | + (deploy|up) | |
| 2228 | + _arguments $(__docker_arguments) \ | |
| 2229 | + $opts_help \ | |
| 2230 | + "($help -c --compose-file)"{-c=,--compose-file=}"[Path to a Compose file, or '-' to read from stdin]:compose file:_files -g \"*.(yml|yaml)\"" \ | |
| 2231 | + "($help)--with-registry-auth[Send registry authentication details to Swarm agents]" \ | |
| 2232 | + "($help -):stack:__docker_complete_stacks" && ret=0 | |
| 2233 | + ;; | |
| 2234 | + (ls|list) | |
| 2235 | + _arguments $(__docker_arguments) \ | |
| 2236 | + $opts_help && ret=0 | |
| 2237 | + ;; | |
| 2238 | + (ps) | |
| 2239 | + _arguments $(__docker_arguments) \ | |
| 2240 | + $opts_help \ | |
| 2241 | + "($help -a --all)"{-a,--all}"[Display all tasks]" \ | |
| 2242 | + "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_ps_filters" \ | |
| 2243 | + "($help)--format=[Format the output using the given go template]:template: " \ | |
| 2244 | + "($help)--no-resolve[Do not map IDs to Names]" \ | |
| 2245 | + "($help)--no-trunc[Do not truncate output]" \ | |
| 2246 | + "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \ | |
| 2247 | + "($help -):stack:__docker_complete_stacks" && ret=0 | |
| 2248 | + ;; | |
| 2249 | + (rm|remove|down) | |
| 2250 | + _arguments $(__docker_arguments) \ | |
| 2251 | + $opts_help \ | |
| 2252 | + "($help -):stack:__docker_complete_stacks" && ret=0 | |
| 2253 | + ;; | |
| 2254 | + (services) | |
| 2255 | + _arguments $(__docker_arguments) \ | |
| 2256 | + $opts_help \ | |
| 2257 | + "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_services_filters" \ | |
| 2258 | + "($help)--format=[Format the output using the given Go template]:template: " \ | |
| 2259 | + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \ | |
| 2260 | + "($help -):stack:__docker_complete_stacks" && ret=0 | |
| 2261 | + ;; | |
| 2262 | + (help) | |
| 2263 | + _arguments $(__docker_arguments) ":subcommand:__docker_stack_commands" && ret=0 | |
| 2264 | + ;; | |
| 2265 | + esac | |
| 2266 | + | |
| 2267 | + return ret | |
| 2268 | +} | |
| 2269 | + | |
| 2270 | +# EO stack | |
| 2271 | + | |
| 2272 | +# BO swarm | |
| 2273 | + | |
| 2274 | +__docker_swarm_commands() { | |
| 2275 | + local -a _docker_swarm_subcommands | |
| 2276 | + _docker_swarm_subcommands=( | |
| 2277 | + "init:Initialize a swarm" | |
| 2278 | + "join:Join a swarm as a node and/or manager" | |
| 2279 | + "join-token:Manage join tokens" | |
| 2280 | + "leave:Leave a swarm" | |
| 2281 | + "unlock:Unlock swarm" | |
| 2282 | + "unlock-key:Manage the unlock key" | |
| 2283 | + "update:Update the swarm" | |
| 2284 | + ) | |
| 2285 | + _describe -t docker-swarm-commands "docker swarm command" _docker_swarm_subcommands | |
| 2286 | +} | |
| 2287 | + | |
| 2288 | +__docker_swarm_subcommand() { | |
| 2289 | + local -a _command_args opts_help | |
| 2290 | + local expl help="--help" | |
| 2291 | + integer ret=1 | |
| 2292 | + | |
| 2293 | + opts_help=("(: -)--help[Print usage]") | |
| 2294 | + | |
| 2295 | + case "$words[1]" in | |
| 2296 | + (init) | |
| 2297 | + _arguments $(__docker_arguments) \ | |
| 2298 | + $opts_help \ | |
| 2299 | + "($help)--advertise-addr=[Advertised address]:ip\:port: " \ | |
| 2300 | + "($help)--data-path-addr=[Data path IP or interface]:ip " \ | |
| 2301 | + "($help)--data-path-port=[Data Path Port]:port " \ | |
| 2302 | + "($help)--default-addr-pool=[Default address pool]" \ | |
| 2303 | + "($help)--default-addr-pool-mask-length=[Default address pool subnet mask length]" \ | |
| 2304 | + "($help)--autolock[Enable manager autolocking]" \ | |
| 2305 | + "($help)--availability=[Availability of the node]:availability:(active drain pause)" \ | |
| 2306 | + "($help)--cert-expiry=[Validity period for node certificates]:duration: " \ | |
| 2307 | + "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \ | |
| 2308 | + "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ | |
| 2309 | + "($help)--force-new-cluster[Force create a new cluster from current state]" \ | |
| 2310 | + "($help)--listen-addr=[Listen address]:ip\:port: " \ | |
| 2311 | + "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ | |
| 2312 | + "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ | |
| 2313 | + "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 | |
| 2314 | + ;; | |
| 2315 | + (join) | |
| 2316 | + _arguments $(__docker_arguments) -A '-*' \ | |
| 2317 | + $opts_help \ | |
| 2318 | + "($help)--advertise-addr=[Advertised address]:ip\:port: " \ | |
| 2319 | + "($help)--data-path-addr=[Data path IP or interface]:ip " \ | |
| 2320 | + "($help)--availability=[Availability of the node]:availability:(active drain pause)" \ | |
| 2321 | + "($help)--listen-addr=[Listen address]:ip\:port: " \ | |
| 2322 | + "($help)--token=[Token for entry into the swarm]:secret: " \ | |
| 2323 | + "($help -):host\:port: " && ret=0 | |
| 2324 | + ;; | |
| 2325 | + (join-token) | |
| 2326 | + _arguments $(__docker_arguments) \ | |
| 2327 | + $opts_help \ | |
| 2328 | + "($help -q --quiet)"{-q,--quiet}"[Only display token]" \ | |
| 2329 | + "($help)--rotate[Rotate join token]" \ | |
| 2330 | + "($help -):role:(manager worker)" && ret=0 | |
| 2331 | + ;; | |
| 2332 | + (leave) | |
| 2333 | + _arguments $(__docker_arguments) \ | |
| 2334 | + $opts_help \ | |
| 2335 | + "($help -f --force)"{-f,--force}"[Force this node to leave the swarm, ignoring warnings]" && ret=0 | |
| 2336 | + ;; | |
| 2337 | + (unlock) | |
| 2338 | + _arguments $(__docker_arguments) \ | |
| 2339 | + $opts_help && ret=0 | |
| 2340 | + ;; | |
| 2341 | + (unlock-key) | |
| 2342 | + _arguments $(__docker_arguments) \ | |
| 2343 | + $opts_help \ | |
| 2344 | + "($help -q --quiet)"{-q,--quiet}"[Only display token]" \ | |
| 2345 | + "($help)--rotate[Rotate unlock token]" && ret=0 | |
| 2346 | + ;; | |
| 2347 | + (update) | |
| 2348 | + _arguments $(__docker_arguments) \ | |
| 2349 | + $opts_help \ | |
| 2350 | + "($help)--autolock[Enable manager autolocking]" \ | |
| 2351 | + "($help)--cert-expiry=[Validity period for node certificates]:duration: " \ | |
| 2352 | + "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \ | |
| 2353 | + "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ | |
| 2354 | + "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ | |
| 2355 | + "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ | |
| 2356 | + "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 | |
| 2357 | + ;; | |
| 2358 | + (help) | |
| 2359 | + _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 | |
| 2360 | + ;; | |
| 2361 | + esac | |
| 2362 | + | |
| 2363 | + return ret | |
| 2364 | +} | |
| 2365 | + | |
| 2366 | +# EO swarm | |
| 2367 | + | |
| 2368 | +# BO system | |
| 2369 | + | |
| 2370 | +__docker_system_commands() { | |
| 2371 | + local -a _docker_system_subcommands | |
| 2372 | + _docker_system_subcommands=( | |
| 2373 | + "df:Show docker filesystem usage" | |
| 2374 | + "events:Get real time events from the server" | |
| 2375 | + "info:Display system-wide information" | |
| 2376 | + "prune:Remove unused data" | |
| 2377 | + ) | |
| 2378 | + _describe -t docker-system-commands "docker system command" _docker_system_subcommands | |
| 2379 | +} | |
| 2380 | + | |
| 2381 | +__docker_system_subcommand() { | |
| 2382 | + local -a _command_args opts_help | |
| 2383 | + local expl help="--help" | |
| 2384 | + integer ret=1 | |
| 2385 | + | |
| 2386 | + opts_help=("(: -)--help[Print usage]") | |
| 2387 | + | |
| 2388 | + case "$words[1]" in | |
| 2389 | + (df) | |
| 2390 | + _arguments $(__docker_arguments) \ | |
| 2391 | + $opts_help \ | |
| 2392 | + "($help -v --verbose)"{-v,--verbose}"[Show detailed information on space usage]" && ret=0 | |
| 2393 | + ;; | |
| 2394 | + (events) | |
| 2395 | + _arguments $(__docker_arguments) \ | |
| 2396 | + $opts_help \ | |
| 2397 | + "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_events_filter" \ | |
| 2398 | + "($help)--since=[Events created since this timestamp]:timestamp: " \ | |
| 2399 | + "($help)--until=[Events created until this timestamp]:timestamp: " \ | |
| 2400 | + "($help)--format=[Format the output using the given go template]:template: " && ret=0 | |
| 2401 | + ;; | |
| 2402 | + (info) | |
| 2403 | + _arguments $(__docker_arguments) \ | |
| 2404 | + $opts_help \ | |
| 2405 | + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 | |
| 2406 | + ;; | |
| 2407 | + (prune) | |
| 2408 | + _arguments $(__docker_arguments) \ | |
| 2409 | + $opts_help \ | |
| 2410 | + "($help -a --all)"{-a,--all}"[Remove all unused data, not just dangling ones]" \ | |
| 2411 | + "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ | |
| 2412 | + "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" \ | |
| 2413 | + "($help)--volumes=[Remove all unused volumes]" && ret=0 | |
| 2414 | + ;; | |
| 2415 | + (help) | |
| 2416 | + _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 | |
| 2417 | + ;; | |
| 2418 | + esac | |
| 2419 | + | |
| 2420 | + return ret | |
| 2421 | +} | |
| 2422 | + | |
| 2423 | +# EO system | |
| 2424 | + | |
| 2425 | +# BO volume | |
| 2426 | + | |
| 2427 | +__docker_volume_complete_ls_filters() { | |
| 2428 | + [[ $PREFIX = -* ]] && return 1 | |
| 2429 | + integer ret=1 | |
| 2430 | + | |
| 2431 | + if compset -P '*='; then | |
| 2432 | + case "${${words[-1]%=*}#*=}" in | |
| 2433 | + (dangling) | |
| 2434 | + dangling_opts=('true' 'false') | |
| 2435 | + _describe -t dangling-filter-opts "Dangling Filter Options" dangling_opts && ret=0 | |
| 2436 | + ;; | |
| 2437 | + (driver) | |
| 2438 | + __docker_complete_info_plugins Volume && ret=0 | |
| 2439 | + ;; | |
| 2440 | + (name) | |
| 2441 | + __docker_complete_volumes && ret=0 | |
| 2442 | + ;; | |
| 2443 | + *) | |
| 2444 | + _message 'value' && ret=0 | |
| 2445 | + ;; | |
| 2446 | + esac | |
| 2447 | + else | |
| 2448 | + opts=('dangling' 'driver' 'label' 'name') | |
| 2449 | + _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 | |
| 2450 | + fi | |
| 2451 | + | |
| 2452 | + return ret | |
| 2453 | +} | |
| 2454 | + | |
| 2455 | +__docker_complete_volumes() { | |
| 2456 | + [[ $PREFIX = -* ]] && return 1 | |
| 2457 | + integer ret=1 | |
| 2458 | + declare -a lines volumes | |
| 2459 | + | |
| 2460 | + lines=(${(f)${:-"$(_call_program commands docker $docker_options volume ls)"$'\n'}}) | |
| 2461 | + | |
| 2462 | + # Parse header line to find columns | |
| 2463 | + local i=1 j=1 k header=${lines[1]} | |
| 2464 | + declare -A begin end | |
| 2465 | + while (( j < ${#header} - 1 )); do | |
| 2466 | + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) | |
| 2467 | + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) | |
| 2468 | + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) | |
| 2469 | + begin[${header[$i,$((j-1))]}]=$i | |
| 2470 | + end[${header[$i,$((j-1))]}]=$k | |
| 2471 | + done | |
| 2472 | + end[${header[$i,$((j-1))]}]=-1 | |
| 2473 | + lines=(${lines[2,-1]}) | |
| 2474 | + | |
| 2475 | + # Names | |
| 2476 | + local line s | |
| 2477 | + for line in $lines; do | |
| 2478 | + s="${line[${begin[VOLUME NAME]},${end[VOLUME NAME]}]%% ##}" | |
| 2479 | + s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" | |
| 2480 | + volumes=($volumes $s) | |
| 2481 | + done | |
| 2482 | + | |
| 2483 | + _describe -t volumes-list "volumes" volumes && ret=0 | |
| 2484 | + return ret | |
| 2485 | +} | |
| 2486 | + | |
| 2487 | +__docker_volume_commands() { | |
| 2488 | + local -a _docker_volume_subcommands | |
| 2489 | + _docker_volume_subcommands=( | |
| 2490 | + "create:Create a volume" | |
| 2491 | + "inspect:Display detailed information on one or more volumes" | |
| 2492 | + "ls:List volumes" | |
| 2493 | + "prune:Remove all unused volumes" | |
| 2494 | + "rm:Remove one or more volumes" | |
| 2495 | + ) | |
| 2496 | + _describe -t docker-volume-commands "docker volume command" _docker_volume_subcommands | |
| 2497 | +} | |
| 2498 | + | |
| 2499 | +__docker_volume_subcommand() { | |
| 2500 | + local -a _command_args opts_help | |
| 2501 | + local expl help="--help" | |
| 2502 | + integer ret=1 | |
| 2503 | + | |
| 2504 | + opts_help=("(: -)--help[Print usage]") | |
| 2505 | + | |
| 2506 | + case "$words[1]" in | |
| 2507 | + (create) | |
| 2508 | + _arguments $(__docker_arguments) -A '-*' \ | |
| 2509 | + $opts_help \ | |
| 2510 | + "($help -d --driver)"{-d=,--driver=}"[Volume driver name]:Driver name:(local)" \ | |
| 2511 | + "($help)*--label=[Set metadata for a volume]:label=value: " \ | |
| 2512 | + "($help)*"{-o=,--opt=}"[Driver specific options]:Driver option: " \ | |
| 2513 | + "($help -)1:Volume name: " && ret=0 | |
| 2514 | + ;; | |
| 2515 | + (inspect) | |
| 2516 | + _arguments $(__docker_arguments) \ | |
| 2517 | + $opts_help \ | |
| 2518 | + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ | |
| 2519 | + "($help -)1:volume:__docker_complete_volumes" && ret=0 | |
| 2520 | + ;; | |
| 2521 | + (ls) | |
| 2522 | + _arguments $(__docker_arguments) \ | |
| 2523 | + $opts_help \ | |
| 2524 | + "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_volume_complete_ls_filters" \ | |
| 2525 | + "($help)--format=[Format the output using the given Go template]:template: " \ | |
| 2526 | + "($help -q --quiet)"{-q,--quiet}"[Only display volume names]" && ret=0 | |
| 2527 | + ;; | |
| 2528 | + (prune) | |
| 2529 | + _arguments $(__docker_arguments) \ | |
| 2530 | + $opts_help \ | |
| 2531 | + "($help -a --all)"{-a,--all}"[Remove all unused local volumes, not just anonymous ones]" \ | |
| 2532 | + "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ | |
| 2533 | + "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 | |
| 2534 | + ;; | |
| 2535 | + (rm) | |
| 2536 | + _arguments $(__docker_arguments) \ | |
| 2537 | + $opts_help \ | |
| 2538 | + "($help -f --force)"{-f,--force}"[Force the removal of one or more volumes]" \ | |
| 2539 | + "($help -):volume:__docker_complete_volumes" && ret=0 | |
| 2540 | + ;; | |
| 2541 | + (help) | |
| 2542 | + _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 | |
| 2543 | + ;; | |
| 2544 | + esac | |
| 2545 | + | |
| 2546 | + return ret | |
| 2547 | +} | |
| 2548 | + | |
| 2549 | +# EO volume | |
| 2550 | + | |
| 2551 | +# BO context | |
| 2552 | + | |
| 2553 | +__docker_complete_contexts() { | |
| 2554 | + [[ $PREFIX = -* ]] && return 1 | |
| 2555 | + integer ret=1 | |
| 2556 | + declare -a contexts | |
| 2557 | + | |
| 2558 | + contexts=(${(f)${:-"$(_call_program commands docker $docker_options context ls -q)"$'\n'}}) | |
| 2559 | + | |
| 2560 | + _describe -t context-list "context" contexts && ret=0 | |
| 2561 | + return ret | |
| 2562 | +} | |
| 2563 | + | |
| 2564 | +__docker_context_commands() { | |
| 2565 | + local -a _docker_context_subcommands | |
| 2566 | + _docker_context_subcommands=( | |
| 2567 | + "create:Create new context" | |
| 2568 | + "inspect:Display detailed information on one or more contexts" | |
| 2569 | + "list:List available contexts" | |
| 2570 | + "rm:Remove one or more contexts" | |
| 2571 | + "show:Print the current context" | |
| 2572 | + "update:Update a context" | |
| 2573 | + "use:Set the default context" | |
| 2574 | + ) | |
| 2575 | + _describe -t docker-context-commands "docker context command" _docker_context_subcommands | |
| 2576 | +} | |
| 2577 | + | |
| 2578 | +__docker_context_subcommand() { | |
| 2579 | + local -a _command_args opts_help | |
| 2580 | + local expl help="--help" | |
| 2581 | + integer ret=1 | |
| 2582 | + | |
| 2583 | + opts_help=("(: -)--help[Print usage]") | |
| 2584 | + | |
| 2585 | + case "$words[1]" in | |
| 2586 | + (create) | |
| 2587 | + _arguments $(__docker_arguments) \ | |
| 2588 | + $opts_help \ | |
| 2589 | + "($help)--description=[Description of the context]:description:" \ | |
| 2590 | + "($help)--docker=[Set the docker endpoint]:docker:" \ | |
| 2591 | + "($help)--from=[Create context from a named context]:from:__docker_complete_contexts" \ | |
| 2592 | + "($help -):name: " && ret=0 | |
| 2593 | + ;; | |
| 2594 | + (use) | |
| 2595 | + _arguments $(__docker_arguments) \ | |
| 2596 | + $opts_help \ | |
| 2597 | + "($help -)1:context:__docker_complete_contexts" && ret=0 | |
| 2598 | + ;; | |
| 2599 | + (inspect) | |
| 2600 | + _arguments $(__docker_arguments) \ | |
| 2601 | + $opts_help \ | |
| 2602 | + "($help -)1:context:__docker_complete_contexts" && ret=0 | |
| 2603 | + ;; | |
| 2604 | + (rm) | |
| 2605 | + _arguments $(__docker_arguments) \ | |
| 2606 | + $opts_help \ | |
| 2607 | + "($help -)1:context:__docker_complete_contexts" && ret=0 | |
| 2608 | + ;; | |
| 2609 | + (update) | |
| 2610 | + _arguments $(__docker_arguments) \ | |
| 2611 | + $opts_help \ | |
| 2612 | + "($help)--description=[Description of the context]:description:" \ | |
| 2613 | + "($help)--docker=[Set the docker endpoint]:docker:" \ | |
| 2614 | + "($help -):name:" && ret=0 | |
| 2615 | + ;; | |
| 2616 | + esac | |
| 2617 | + | |
| 2618 | + return ret | |
| 2619 | +} | |
| 2620 | + | |
| 2621 | +# EO context | |
| 2622 | + | |
| 2623 | +__docker_caching_policy() { | |
| 2624 | + oldp=( "$1"(Nmh+1) ) # 1 hour | |
| 2625 | + (( $#oldp )) | |
| 2626 | +} | |
| 2627 | + | |
| 2628 | +__docker_commands() { | |
| 2629 | + local cache_policy | |
| 2630 | + integer force_invalidation=0 | |
| 2631 | + | |
| 2632 | + zstyle -s ":completion:${curcontext}:" cache-policy cache_policy | |
| 2633 | + if [[ -z "$cache_policy" ]]; then | |
| 2634 | + zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy | |
| 2635 | + fi | |
| 2636 | + | |
| 2637 | + if ( (( ! ${+_docker_hide_legacy_commands} )) || _cache_invalid docker_hide_legacy_commands ) \ | |
| 2638 | + && ! _retrieve_cache docker_hide_legacy_commands; | |
| 2639 | + then | |
| 2640 | + _docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}" | |
| 2641 | + _store_cache docker_hide_legacy_commands _docker_hide_legacy_commands | |
| 2642 | + fi | |
| 2643 | + | |
| 2644 | + if [[ "${_docker_hide_legacy_commands}" != "${DOCKER_HIDE_LEGACY_COMMANDS}" ]]; then | |
| 2645 | + force_invalidation=1 | |
| 2646 | + _docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}" | |
| 2647 | + _store_cache docker_hide_legacy_commands _docker_hide_legacy_commands | |
| 2648 | + fi | |
| 2649 | + | |
| 2650 | + if ( [[ ${+_docker_subcommands} -eq 0 ]] || _cache_invalid docker_subcommands ) \ | |
| 2651 | + && ! _retrieve_cache docker_subcommands || [[ ${force_invalidation} -eq 1 ]]; | |
| 2652 | + then | |
| 2653 | + local -a lines | |
| 2654 | + lines=(${(f)"$(_call_program commands docker 2>&1)"}) | |
| 2655 | + _docker_subcommands=(${${${(M)${lines[$((${lines[(i)*Commands:]} + 1)),-1]}:# *}## #}/\*# ##/:}) | |
| 2656 | + _docker_subcommands=($_docker_subcommands 'daemon:Enable daemon mode' 'help:Show help for a command') | |
| 2657 | + (( $#_docker_subcommands > 2 )) && _store_cache docker_subcommands _docker_subcommands | |
| 2658 | + fi | |
| 2659 | + _describe -t docker-commands "docker command" _docker_subcommands | |
| 2660 | +} | |
| 2661 | + | |
| 2662 | +__docker_subcommand() { | |
| 2663 | + local -a _command_args opts_help | |
| 2664 | + local expl help="--help" | |
| 2665 | + integer ret=1 | |
| 2666 | + | |
| 2667 | + opts_help=("(: -)--help[Print usage]") | |
| 2668 | + | |
| 2669 | + case "$words[1]" in | |
| 2670 | + (attach|commit|cp|create|diff|exec|export|kill|logs|pause|unpause|port|rename|restart|rm|run|start|stats|stop|top|update|wait) | |
| 2671 | + __docker_container_subcommand && ret=0 | |
| 2672 | + ;; | |
| 2673 | + (build|history|import|load|pull|push|save|tag) | |
| 2674 | + __docker_image_subcommand && ret=0 | |
| 2675 | + ;; | |
| 2676 | + (checkpoint) | |
| 2677 | + local curcontext="$curcontext" state | |
| 2678 | + _arguments $(__docker_arguments) \ | |
| 2679 | + $opts_help \ | |
| 2680 | + "($help -): :->command" \ | |
| 2681 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 2682 | + | |
| 2683 | + case $state in | |
| 2684 | + (command) | |
| 2685 | + __docker_checkpoint_commands && ret=0 | |
| 2686 | + ;; | |
| 2687 | + (option-or-argument) | |
| 2688 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 2689 | + __docker_checkpoint_subcommand && ret=0 | |
| 2690 | + ;; | |
| 2691 | + esac | |
| 2692 | + ;; | |
| 2693 | + (container) | |
| 2694 | + local curcontext="$curcontext" state | |
| 2695 | + _arguments $(__docker_arguments) \ | |
| 2696 | + $opts_help \ | |
| 2697 | + "($help -): :->command" \ | |
| 2698 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 2699 | + | |
| 2700 | + case $state in | |
| 2701 | + (command) | |
| 2702 | + __docker_container_commands && ret=0 | |
| 2703 | + ;; | |
| 2704 | + (option-or-argument) | |
| 2705 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 2706 | + __docker_container_subcommand && ret=0 | |
| 2707 | + ;; | |
| 2708 | + esac | |
| 2709 | + ;; | |
| 2710 | + (context) | |
| 2711 | + local curcontext="$curcontext" state | |
| 2712 | + _arguments $(__docker_arguments) \ | |
| 2713 | + $opts_help \ | |
| 2714 | + "($help -): :->command" \ | |
| 2715 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 2716 | + | |
| 2717 | + case $state in | |
| 2718 | + (command) | |
| 2719 | + __docker_context_commands && ret=0 | |
| 2720 | + ;; | |
| 2721 | + (option-or-argument) | |
| 2722 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 2723 | + __docker_context_subcommand && ret=0 | |
| 2724 | + ;; | |
| 2725 | + esac | |
| 2726 | + ;; | |
| 2727 | + (daemon) | |
| 2728 | + _arguments $(__docker_arguments) \ | |
| 2729 | + $opts_help \ | |
| 2730 | + "($help)*--add-runtime=[Register an additional OCI compatible runtime]:runtime:__docker_complete_runtimes" \ | |
| 2731 | + "($help)*--allow-nondistributable-artifacts=[Push nondistributable artifacts to specified registries]:registry: " \ | |
| 2732 | + "($help)--api-cors-header=[CORS headers in the Engine API]:CORS headers: " \ | |
| 2733 | + "($help)*--authorization-plugin=[Authorization plugins to load]" \ | |
| 2734 | + "($help -b --bridge)"{-b=,--bridge=}"[Attach containers to a network bridge]:bridge:_net_interfaces" \ | |
| 2735 | + "($help)--bip=[Network bridge IP]:IP address: " \ | |
| 2736 | + "($help)--cgroup-parent=[Parent cgroup for all containers]:cgroup: " \ | |
| 2737 | + "($help)--config-file=[Path to daemon configuration file]:Config File:_files" \ | |
| 2738 | + "($help)--containerd=[Path to containerd socket]:socket:_files -g \"*.sock\"" \ | |
| 2739 | + "($help)--containerd-namespace=[Containerd namespace to use]:containerd namespace:" \ | |
| 2740 | + "($help)--containerd-plugins-namespace=[Containerd namespace to use for plugins]:containerd namespace:" \ | |
| 2741 | + "($help)--data-root=[Root directory of persisted Docker data]:path:_directories" \ | |
| 2742 | + "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ | |
| 2743 | + "($help)--default-gateway[Container default gateway IPv4 address]:IPv4 address: " \ | |
| 2744 | + "($help)--default-gateway-v6[Container default gateway IPv6 address]:IPv6 address: " \ | |
| 2745 | + "($help)--default-shm-size=[Default shm size for containers]:size:" \ | |
| 2746 | + "($help)*--default-ulimit=[Default ulimits for containers]:ulimit: " \ | |
| 2747 | + "($help)*--dns=[DNS server to use]:DNS: " \ | |
| 2748 | + "($help)*--dns-opt=[DNS options to use]:DNS option: " \ | |
| 2749 | + "($help)*--dns-search=[DNS search domains to use]:DNS search: " \ | |
| 2750 | + "($help)*--exec-opt=[Runtime execution options]:runtime execution options: " \ | |
| 2751 | + "($help)--exec-root=[Root directory for execution state files]:path:_directories" \ | |
| 2752 | + "($help)--experimental[Enable experimental features]" \ | |
| 2753 | + "($help)--fixed-cidr=[IPv4 subnet for fixed IPs]:IPv4 subnet: " \ | |
| 2754 | + "($help)--fixed-cidr-v6=[IPv6 subnet for fixed IPs]:IPv6 subnet: " \ | |
| 2755 | + "($help -G --group)"{-G=,--group=}"[Group for the unix socket]:group:_groups" \ | |
| 2756 | + "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ | |
| 2757 | + "($help)--icc[Enable inter-container communication]" \ | |
| 2758 | + "($help)--init[Run an init inside containers to forward signals and reap processes]" \ | |
| 2759 | + "($help)--init-path=[Path to the docker-init binary]:docker-init binary:_files" \ | |
| 2760 | + "($help)*--insecure-registry=[Enable insecure registry communication]:registry: " \ | |
| 2761 | + "($help)--ip=[Default IP when binding container ports]" \ | |
| 2762 | + "($help)--ip-forward[Enable net.ipv4.ip_forward]" \ | |
| 2763 | + "($help)--ip-masq[Enable IP masquerading]" \ | |
| 2764 | + "($help)--iptables[Enable addition of iptables rules]" \ | |
| 2765 | + "($help)--ipv6[Enable IPv6 networking]" \ | |
| 2766 | + "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ | |
| 2767 | + "($help)*--label=[Key=value labels]:label: " \ | |
| 2768 | + "($help)--live-restore[Enable live restore of docker when containers are still running]" \ | |
| 2769 | + "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" \ | |
| 2770 | + "($help)*--log-opt=[Default log driver options for containers]:log driver options:__docker_complete_log_options" \ | |
| 2771 | + "($help)--max-concurrent-downloads[Set the max concurrent downloads]" \ | |
| 2772 | + "($help)--max-concurrent-uploads[Set the max concurrent uploads]" \ | |
| 2773 | + "($help)--max-download-attempts[Set the max download attempts for each pull]" \ | |
| 2774 | + "($help)--mtu=[Network MTU]:mtu:(0 576 1420 1500 9000)" \ | |
| 2775 | + "($help)--oom-score-adjust=[Set the oom_score_adj for the daemon]:oom-score:(-500)" \ | |
| 2776 | + "($help -p --pidfile)"{-p=,--pidfile=}"[Path to use for daemon PID file]:PID file:_files" \ | |
| 2777 | + "($help)--raw-logs[Full timestamps without ANSI coloring]" \ | |
| 2778 | + "($help)*--registry-mirror=[Preferred registry mirror]:registry mirror: " \ | |
| 2779 | + "($help)--seccomp-profile=[Path to seccomp profile]:path:_files -g \"*.json\"" \ | |
| 2780 | + "($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(btrfs devicemapper overlay2 vfs zfs)" \ | |
| 2781 | + "($help)--selinux-enabled[Enable selinux support]" \ | |
| 2782 | + "($help)--shutdown-timeout=[Set the shutdown timeout value in seconds]:time: " \ | |
| 2783 | + "($help)*--storage-opt=[Storage driver options]:storage driver options: " \ | |
| 2784 | + "($help)--tls[Use TLS]" \ | |
| 2785 | + "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g \"*.(pem|crt)\"" \ | |
| 2786 | + "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g \"*.(pem|crt)\"" \ | |
| 2787 | + "($help)--tlskey=[Path to TLS key file]:Key file:_files -g \"*.(pem|key)\"" \ | |
| 2788 | + "($help)--tlsverify[Use TLS and verify the remote]" \ | |
| 2789 | + "($help)--userns-remap=[User/Group setting for user namespaces]:user\:group:->users-groups" \ | |
| 2790 | + "($help)--userland-proxy[Use userland proxy for loopback traffic]" \ | |
| 2791 | + "($help)--userland-proxy-path=[Path to the userland proxy binary]:binary:_files" \ | |
| 2792 | + "($help)--validate[Validate daemon configuration and exit]" && ret=0 | |
| 2793 | + | |
| 2794 | + case $state in | |
| 2795 | + (users-groups) | |
| 2796 | + if compset -P '*:'; then | |
| 2797 | + _groups && ret=0 | |
| 2798 | + else | |
| 2799 | + _describe -t userns-default "default Docker user management" '(default)' && ret=0 | |
| 2800 | + _users && ret=0 | |
| 2801 | + fi | |
| 2802 | + ;; | |
| 2803 | + esac | |
| 2804 | + ;; | |
| 2805 | + (events|info) | |
| 2806 | + __docker_system_subcommand && ret=0 | |
| 2807 | + ;; | |
| 2808 | + (image) | |
| 2809 | + local curcontext="$curcontext" state | |
| 2810 | + _arguments $(__docker_arguments) \ | |
| 2811 | + $opts_help \ | |
| 2812 | + "($help -): :->command" \ | |
| 2813 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 2814 | + | |
| 2815 | + case $state in | |
| 2816 | + (command) | |
| 2817 | + __docker_image_commands && ret=0 | |
| 2818 | + ;; | |
| 2819 | + (option-or-argument) | |
| 2820 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 2821 | + __docker_image_subcommand && ret=0 | |
| 2822 | + ;; | |
| 2823 | + esac | |
| 2824 | + ;; | |
| 2825 | + (images) | |
| 2826 | + words[1]='ls' | |
| 2827 | + __docker_image_subcommand && ret=0 | |
| 2828 | + ;; | |
| 2829 | + (inspect) | |
| 2830 | + local state | |
| 2831 | + _arguments $(__docker_arguments) \ | |
| 2832 | + $opts_help \ | |
| 2833 | + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ | |
| 2834 | + "($help -s --size)"{-s,--size}"[Display total file sizes if the type is container]" \ | |
| 2835 | + "($help)--type=[Return JSON for specified type]:type:(container image network node plugin service volume)" \ | |
| 2836 | + "($help -)*: :->values" && ret=0 | |
| 2837 | + | |
| 2838 | + case $state in | |
| 2839 | + (values) | |
| 2840 | + if [[ ${words[(r)--type=container]} == --type=container ]]; then | |
| 2841 | + __docker_complete_containers && ret=0 | |
| 2842 | + elif [[ ${words[(r)--type=image]} == --type=image ]]; then | |
| 2843 | + __docker_complete_images && ret=0 | |
| 2844 | + elif [[ ${words[(r)--type=network]} == --type=network ]]; then | |
| 2845 | + __docker_complete_networks && ret=0 | |
| 2846 | + elif [[ ${words[(r)--type=node]} == --type=node ]]; then | |
| 2847 | + __docker_complete_nodes && ret=0 | |
| 2848 | + elif [[ ${words[(r)--type=plugin]} == --type=plugin ]]; then | |
| 2849 | + __docker_complete_plugins && ret=0 | |
| 2850 | + elif [[ ${words[(r)--type=service]} == --type=secrets ]]; then | |
| 2851 | + __docker_complete_secrets && ret=0 | |
| 2852 | + elif [[ ${words[(r)--type=service]} == --type=service ]]; then | |
| 2853 | + __docker_complete_services && ret=0 | |
| 2854 | + elif [[ ${words[(r)--type=volume]} == --type=volume ]]; then | |
| 2855 | + __docker_complete_volumes && ret=0 | |
| 2856 | + else | |
| 2857 | + __docker_complete_containers | |
| 2858 | + __docker_complete_images | |
| 2859 | + __docker_complete_networks | |
| 2860 | + __docker_complete_nodes | |
| 2861 | + __docker_complete_plugins | |
| 2862 | + __docker_complete_secrets | |
| 2863 | + __docker_complete_services | |
| 2864 | + __docker_complete_volumes && ret=0 | |
| 2865 | + fi | |
| 2866 | + ;; | |
| 2867 | + esac | |
| 2868 | + ;; | |
| 2869 | + (login) | |
| 2870 | + _arguments $(__docker_arguments) -A '-*' \ | |
| 2871 | + $opts_help \ | |
| 2872 | + "($help -p --password)"{-p=,--password=}"[Password]:password: " \ | |
| 2873 | + "($help)--password-stdin[Read password from stdin]" \ | |
| 2874 | + "($help -u --username)"{-u=,--username=}"[Username]:username: " \ | |
| 2875 | + "($help -)1:server: " && ret=0 | |
| 2876 | + ;; | |
| 2877 | + (logout) | |
| 2878 | + _arguments $(__docker_arguments) -A '-*' \ | |
| 2879 | + $opts_help \ | |
| 2880 | + "($help -)1:server: " && ret=0 | |
| 2881 | + ;; | |
| 2882 | + (network) | |
| 2883 | + local curcontext="$curcontext" state | |
| 2884 | + _arguments $(__docker_arguments) \ | |
| 2885 | + $opts_help \ | |
| 2886 | + "($help -): :->command" \ | |
| 2887 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 2888 | + | |
| 2889 | + case $state in | |
| 2890 | + (command) | |
| 2891 | + __docker_network_commands && ret=0 | |
| 2892 | + ;; | |
| 2893 | + (option-or-argument) | |
| 2894 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 2895 | + __docker_network_subcommand && ret=0 | |
| 2896 | + ;; | |
| 2897 | + esac | |
| 2898 | + ;; | |
| 2899 | + (node) | |
| 2900 | + local curcontext="$curcontext" state | |
| 2901 | + _arguments $(__docker_arguments) \ | |
| 2902 | + $opts_help \ | |
| 2903 | + "($help -): :->command" \ | |
| 2904 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 2905 | + | |
| 2906 | + case $state in | |
| 2907 | + (command) | |
| 2908 | + __docker_node_commands && ret=0 | |
| 2909 | + ;; | |
| 2910 | + (option-or-argument) | |
| 2911 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 2912 | + __docker_node_subcommand && ret=0 | |
| 2913 | + ;; | |
| 2914 | + esac | |
| 2915 | + ;; | |
| 2916 | + (plugin) | |
| 2917 | + local curcontext="$curcontext" state | |
| 2918 | + _arguments $(__docker_arguments) \ | |
| 2919 | + $opts_help \ | |
| 2920 | + "($help -): :->command" \ | |
| 2921 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 2922 | + | |
| 2923 | + case $state in | |
| 2924 | + (command) | |
| 2925 | + __docker_plugin_commands && ret=0 | |
| 2926 | + ;; | |
| 2927 | + (option-or-argument) | |
| 2928 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 2929 | + __docker_plugin_subcommand && ret=0 | |
| 2930 | + ;; | |
| 2931 | + esac | |
| 2932 | + ;; | |
| 2933 | + (ps) | |
| 2934 | + words[1]='ls' | |
| 2935 | + __docker_container_subcommand && ret=0 | |
| 2936 | + ;; | |
| 2937 | + (rmi) | |
| 2938 | + words[1]='rm' | |
| 2939 | + __docker_image_subcommand && ret=0 | |
| 2940 | + ;; | |
| 2941 | + (search) | |
| 2942 | + _arguments $(__docker_arguments) -A '-*' \ | |
| 2943 | + $opts_help \ | |
| 2944 | + "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_search_filters" \ | |
| 2945 | + "($help)--limit=[Maximum returned search results]:limit:(1 5 10 25 50)" \ | |
| 2946 | + "($help)--no-trunc[Do not truncate output]" \ | |
| 2947 | + "($help -):term: " && ret=0 | |
| 2948 | + ;; | |
| 2949 | + (secret) | |
| 2950 | + local curcontext="$curcontext" state | |
| 2951 | + _arguments $(__docker_arguments) \ | |
| 2952 | + $opts_help \ | |
| 2953 | + "($help -): :->command" \ | |
| 2954 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 2955 | + | |
| 2956 | + case $state in | |
| 2957 | + (command) | |
| 2958 | + __docker_secret_commands && ret=0 | |
| 2959 | + ;; | |
| 2960 | + (option-or-argument) | |
| 2961 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 2962 | + __docker_secret_subcommand && ret=0 | |
| 2963 | + ;; | |
| 2964 | + esac | |
| 2965 | + ;; | |
| 2966 | + (service) | |
| 2967 | + local curcontext="$curcontext" state | |
| 2968 | + _arguments $(__docker_arguments) \ | |
| 2969 | + $opts_help \ | |
| 2970 | + "($help -): :->command" \ | |
| 2971 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 2972 | + | |
| 2973 | + case $state in | |
| 2974 | + (command) | |
| 2975 | + __docker_service_commands && ret=0 | |
| 2976 | + ;; | |
| 2977 | + (option-or-argument) | |
| 2978 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 2979 | + __docker_service_subcommand && ret=0 | |
| 2980 | + ;; | |
| 2981 | + esac | |
| 2982 | + ;; | |
| 2983 | + (stack) | |
| 2984 | + local curcontext="$curcontext" state | |
| 2985 | + _arguments $(__docker_arguments) \ | |
| 2986 | + $opts_help \ | |
| 2987 | + "($help -): :->command" \ | |
| 2988 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 2989 | + | |
| 2990 | + case $state in | |
| 2991 | + (command) | |
| 2992 | + __docker_stack_commands && ret=0 | |
| 2993 | + ;; | |
| 2994 | + (option-or-argument) | |
| 2995 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 2996 | + __docker_stack_subcommand && ret=0 | |
| 2997 | + ;; | |
| 2998 | + esac | |
| 2999 | + ;; | |
| 3000 | + (swarm) | |
| 3001 | + local curcontext="$curcontext" state | |
| 3002 | + _arguments $(__docker_arguments) \ | |
| 3003 | + $opts_help \ | |
| 3004 | + "($help -): :->command" \ | |
| 3005 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 3006 | + | |
| 3007 | + case $state in | |
| 3008 | + (command) | |
| 3009 | + __docker_swarm_commands && ret=0 | |
| 3010 | + ;; | |
| 3011 | + (option-or-argument) | |
| 3012 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 3013 | + __docker_swarm_subcommand && ret=0 | |
| 3014 | + ;; | |
| 3015 | + esac | |
| 3016 | + ;; | |
| 3017 | + (system) | |
| 3018 | + local curcontext="$curcontext" state | |
| 3019 | + _arguments $(__docker_arguments) \ | |
| 3020 | + $opts_help \ | |
| 3021 | + "($help -): :->command" \ | |
| 3022 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 3023 | + | |
| 3024 | + case $state in | |
| 3025 | + (command) | |
| 3026 | + __docker_system_commands && ret=0 | |
| 3027 | + ;; | |
| 3028 | + (option-or-argument) | |
| 3029 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 3030 | + __docker_system_subcommand && ret=0 | |
| 3031 | + ;; | |
| 3032 | + esac | |
| 3033 | + ;; | |
| 3034 | + (version) | |
| 3035 | + _arguments $(__docker_arguments) \ | |
| 3036 | + $opts_help \ | |
| 3037 | + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 | |
| 3038 | + ;; | |
| 3039 | + (volume) | |
| 3040 | + local curcontext="$curcontext" state | |
| 3041 | + _arguments $(__docker_arguments) \ | |
| 3042 | + $opts_help \ | |
| 3043 | + "($help -): :->command" \ | |
| 3044 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 3045 | + | |
| 3046 | + case $state in | |
| 3047 | + (command) | |
| 3048 | + __docker_volume_commands && ret=0 | |
| 3049 | + ;; | |
| 3050 | + (option-or-argument) | |
| 3051 | + curcontext=${curcontext%:*:*}:docker-${words[-1]}: | |
| 3052 | + __docker_volume_subcommand && ret=0 | |
| 3053 | + ;; | |
| 3054 | + esac | |
| 3055 | + ;; | |
| 3056 | + (help) | |
| 3057 | + _arguments $(__docker_arguments) ":subcommand:__docker_commands" && ret=0 | |
| 3058 | + ;; | |
| 3059 | + esac | |
| 3060 | + | |
| 3061 | + return ret | |
| 3062 | +} | |
| 3063 | + | |
| 3064 | +_docker() { | |
| 3065 | + # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`. | |
| 3066 | + # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`. | |
| 3067 | + if [[ $service != docker ]]; then | |
| 3068 | + _call_function - _$service | |
| 3069 | + return | |
| 3070 | + fi | |
| 3071 | + | |
| 3072 | + local curcontext="$curcontext" state line help="-h --help" | |
| 3073 | + integer ret=1 | |
| 3074 | + typeset -A opt_args | |
| 3075 | + | |
| 3076 | + _arguments $(__docker_arguments) -C \ | |
| 3077 | + "(: -)"{-h,--help}"[Print usage]" \ | |
| 3078 | + "($help)--config[Location of client config files]:path:_directories" \ | |
| 3079 | + "($help -c --context)"{-c=,--context=}"[Execute the command in a docker context]:context:__docker_complete_contexts" \ | |
| 3080 | + "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ | |
| 3081 | + "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ | |
| 3082 | + "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ | |
| 3083 | + "($help)--tls[Use TLS]" \ | |
| 3084 | + "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g "*.(pem|crt)"" \ | |
| 3085 | + "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g "*.(pem|crt)"" \ | |
| 3086 | + "($help)--tlskey=[Path to TLS key file]:Key file:_files -g "*.(pem|key)"" \ | |
| 3087 | + "($help)--tlsverify[Use TLS and verify the remote]" \ | |
| 3088 | + "($help)--userland-proxy[Use userland proxy for loopback traffic]" \ | |
| 3089 | + "($help -v --version)"{-v,--version}"[Print version information and quit]" \ | |
| 3090 | + "($help -): :->command" \ | |
| 3091 | + "($help -)*:: :->option-or-argument" && ret=0 | |
| 3092 | + | |
| 3093 | + local host=${opt_args[-H]}${opt_args[--host]} | |
| 3094 | + local config=${opt_args[--config]} | |
| 3095 | + local context=${opt_args[-c]}${opt_args[--context]} | |
| 3096 | + local docker_options="${host:+--host $host} ${config:+--config $config} ${context:+--context $context} " | |
| 3097 | + | |
| 3098 | + case $state in | |
| 3099 | + (command) | |
| 3100 | + __docker_commands && ret=0 | |
| 3101 | + ;; | |
| 3102 | + (option-or-argument) | |
| 3103 | + curcontext=${curcontext%:*:*}:docker-$words[1]: | |
| 3104 | + __docker_subcommand && ret=0 | |
| 3105 | + ;; | |
| 3106 | + esac | |
| 3107 | + | |
| 3108 | + return ret | |
| 3109 | +} | |
| 3110 | + | |
| 3111 | +_dockerd() { | |
| 3112 | + integer ret=1 | |
| 3113 | + words[1]='daemon' | |
| 3114 | + __docker_subcommand && ret=0 | |
| 3115 | + return ret | |
| 3116 | +} | |
| 3117 | + | |
| 3118 | +_docker "$@" | |
| 3119 | + | |
| 3120 | +# Local Variables: | |
| 3121 | +# mode: Shell-Script | |
| 3122 | +# sh-indentation: 4 | |
| 3123 | +# indent-tabs-mode: nil | |
| 3124 | +# sh-basic-offset: 4 | |
| 3125 | +# End: | |
| 3126 | +# vim: ft=zsh sw=4 ts=4 et |
+66-0.oh-my-zsh/plugins/docker/docker.plugin.zsh
| @@ -0,0 +1,66 @@ | ||
| 1 | +alias dbl='docker build' | |
| 2 | +alias dcin='docker container inspect' | |
| 3 | +alias dcls='docker container ls' | |
| 4 | +alias dclsa='docker container ls -a' | |
| 5 | +alias dib='docker image build' | |
| 6 | +alias dii='docker image inspect' | |
| 7 | +alias dils='docker image ls' | |
| 8 | +alias dipu='docker image push' | |
| 9 | +alias dipru='docker image prune -a' | |
| 10 | +alias dirm='docker image rm' | |
| 11 | +alias dit='docker image tag' | |
| 12 | +alias dlo='docker container logs' | |
| 13 | +alias dnc='docker network create' | |
| 14 | +alias dncn='docker network connect' | |
| 15 | +alias dndcn='docker network disconnect' | |
| 16 | +alias dni='docker network inspect' | |
| 17 | +alias dnls='docker network ls' | |
| 18 | +alias dnrm='docker network rm' | |
| 19 | +alias dpo='docker container port' | |
| 20 | +alias dps='docker ps' | |
| 21 | +alias dpsa='docker ps -a' | |
| 22 | +alias dpu='docker pull' | |
| 23 | +alias dr='docker container run' | |
| 24 | +alias drit='docker container run -it' | |
| 25 | +alias drm='docker container rm' | |
| 26 | +alias 'drm!'='docker container rm -f' | |
| 27 | +alias dst='docker container start' | |
| 28 | +alias drs='docker container restart' | |
| 29 | +alias dsta='docker stop $(docker ps -q)' | |
| 30 | +alias dstp='docker container stop' | |
| 31 | +alias dsts='docker stats' | |
| 32 | +alias dtop='docker top' | |
| 33 | +alias dvi='docker volume inspect' | |
| 34 | +alias dvls='docker volume ls' | |
| 35 | +alias dvprune='docker volume prune' | |
| 36 | +alias dxc='docker container exec' | |
| 37 | +alias dxcit='docker container exec -it' | |
| 38 | + | |
| 39 | +if (( ! $+commands[docker] )); then | |
| 40 | + return | |
| 41 | +fi | |
| 42 | + | |
| 43 | +# Standardized $0 handling | |
| 44 | +# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html | |
| 45 | +0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" | |
| 46 | +0="${${(M)0:#/*}:-$PWD/$0}" | |
| 47 | + | |
| 48 | +# If the completion file doesn't exist yet, we need to autoload it and | |
| 49 | +# bind it to `docker`. Otherwise, compinit will have already done that. | |
| 50 | +if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then | |
| 51 | + typeset -g -A _comps | |
| 52 | + autoload -Uz _docker | |
| 53 | + _comps[docker]=_docker | |
| 54 | +fi | |
| 55 | + | |
| 56 | +{ | |
| 57 | + # `docker completion` is only available from 23.0.0 on | |
| 58 | + # docker version returns `Docker version 24.0.2, build cb74dfcd85` | |
| 59 | + # with `s:,:` remove the comma after the version, and select third word of it | |
| 60 | + if zstyle -t ':omz:plugins:docker' legacy-completion || \ | |
| 61 | + ! is-at-least 23.0.0 ${${(s:,:z)"$(command docker --version)"}[3]}; then | |
| 62 | + command cp "${0:h}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker" | |
| 63 | + else | |
| 64 | + command docker completion zsh | tee "$ZSH_CACHE_DIR/completions/_docker" > /dev/null | |
| 65 | + fi | |
| 66 | +} &| |
+9-0.oh-my-zsh/plugins/doctl/README.md
| @@ -0,0 +1,9 @@ | ||
| 1 | +# Doctl | |
| 2 | + | |
| 3 | +This plugin provides completion for [Doctl](https://github.com/digitalocean/doctl). | |
| 4 | + | |
| 5 | +To use it add doctl to the plugins array in your zshrc file. | |
| 6 | + | |
| 7 | +```bash | |
| 8 | +plugins=(... doctl) | |
| 9 | +``` |
+17-0.oh-my-zsh/plugins/doctl/doctl.plugin.zsh
| @@ -0,0 +1,17 @@ | ||
| 1 | +# Autocompletion for doctl, the command line tool for DigitalOcean service | |
| 2 | +# | |
| 3 | +# doctl project: https://github.com/digitalocean/doctl | |
| 4 | +# | |
| 5 | +# Author: https://github.com/HalisCz | |
| 6 | + | |
| 7 | +if (( ! $+commands[doctl] )); then | |
| 8 | + return | |
| 9 | +fi | |
| 10 | + | |
| 11 | +if [[ ! -f "$ZSH_CACHE_DIR/completions/_doctl" ]]; then | |
| 12 | + typeset -g -A _comps | |
| 13 | + autoload -Uz _doctl | |
| 14 | + _comps[doctl]=_doctl | |
| 15 | +fi | |
| 16 | + | |
| 17 | +doctl completion zsh >| "$ZSH_CACHE_DIR/completions/_doctl" &| |
+92-0.oh-my-zsh/plugins/dotenv/README.md
| @@ -0,0 +1,92 @@ | ||
| 1 | +# dotenv | |
| 2 | + | |
| 3 | +Automatically load your project ENV variables from `.env` file when you `cd` into project root directory. | |
| 4 | + | |
| 5 | +Storing configuration in the environment is one of the tenets of a [twelve-factor app](https://www.12factor.net). Anything that is likely to change between deployment environments, such as resource handles for databases or credentials for external services, should be extracted from the code into environment variables. | |
| 6 | + | |
| 7 | +To use it, add `dotenv` to the plugins array in your zshrc file: | |
| 8 | + | |
| 9 | +```sh | |
| 10 | +plugins=(... dotenv) | |
| 11 | +``` | |
| 12 | + | |
| 13 | +## Usage | |
| 14 | + | |
| 15 | +Create `.env` file inside your project root directory and put your ENV variables there. | |
| 16 | + | |
| 17 | +For example: | |
| 18 | + | |
| 19 | +```sh | |
| 20 | +export AWS_S3_TOKEN=d84a83539134f28f412c652b09f9f98eff96c9a | |
| 21 | +export SECRET_KEY=7c6c72d959416d5aa368a409362ec6e2ac90d7f | |
| 22 | +export MONGO_URI=mongodb://127.0.0.1:27017 | |
| 23 | +export PORT=3001 | |
| 24 | +``` | |
| 25 | + | |
| 26 | +`export` is optional. This format works as well: | |
| 27 | + | |
| 28 | +```sh | |
| 29 | +AWS_S3_TOKEN=d84a83539134f28f412c652b09f9f98eff96c9a | |
| 30 | +SECRET_KEY=7c6c72d959416d5aa368a409362ec6e2ac90d7f | |
| 31 | +MONGO_URI=mongodb://127.0.0.1:27017 | |
| 32 | +PORT=3001 | |
| 33 | +``` | |
| 34 | + | |
| 35 | +You can even mix both formats, although it's probably a bad idea. | |
| 36 | + | |
| 37 | +## Settings | |
| 38 | + | |
| 39 | +### ZSH_DOTENV_FILE | |
| 40 | + | |
| 41 | +You can also modify the name of the file to be loaded with the variable `ZSH_DOTENV_FILE`. | |
| 42 | +If the variable isn't set, the plugin will default to use `.env`. | |
| 43 | +For example, this will make the plugin look for files named `.dotenv` and load them: | |
| 44 | + | |
| 45 | +```zsh | |
| 46 | +# in ~/.zshrc, before Oh My Zsh is sourced: | |
| 47 | +ZSH_DOTENV_FILE=.dotenv | |
| 48 | +``` | |
| 49 | + | |
| 50 | +### ZSH_DOTENV_PROMPT | |
| 51 | + | |
| 52 | +Set `ZSH_DOTENV_PROMPT=false` in your zshrc file if you don't want the confirmation message. | |
| 53 | +You can also choose the `Always` option when prompted to always allow sourcing the .env file | |
| 54 | +in that directory. See the next section for more details. | |
| 55 | + | |
| 56 | +### ZSH_DOTENV_ALLOWED_LIST, ZSH_DOTENV_DISALLOWED_LIST | |
| 57 | + | |
| 58 | +The default behavior of the plugin is to always ask whether to source a dotenv file. There's | |
| 59 | +a **Y**es, **N**o, **A**lways and N**e**ver option. If you choose Always, the directory of the .env file | |
| 60 | +will be added to an allowed list; if you choose Never, it will be added to a disallowed list. | |
| 61 | +If a directory is found in either of those lists, the plugin won't ask for confirmation and will | |
| 62 | +instead either source the .env file or proceed without action respectively. | |
| 63 | + | |
| 64 | +The allowed and disallowed lists are saved by default in `$ZSH_CACHE_DIR/dotenv-allowed.list` and | |
| 65 | +`$ZSH_CACHE_DIR/dotenv-disallowed.list` respectively. If you want to change that location, | |
| 66 | +change the `$ZSH_DOTENV_ALLOWED_LIST` and `$ZSH_DOTENV_DISALLOWED_LIST` variables, like so: | |
| 67 | + | |
| 68 | +```zsh | |
| 69 | +# in ~/.zshrc, before Oh My Zsh is sourced: | |
| 70 | +ZSH_DOTENV_ALLOWED_LIST=/path/to/dotenv/allowed/list | |
| 71 | +ZSH_DOTENV_DISALLOWED_LIST=/path/to/dotenv/disallowed/list | |
| 72 | +``` | |
| 73 | + | |
| 74 | +The file is just a list of directories, separated by a newline character. If you want | |
| 75 | +to change your decision, just edit the file and remove the line for the directory you want to | |
| 76 | +change. | |
| 77 | + | |
| 78 | +NOTE: if a directory is found in both the allowed and disallowed lists, the disallowed list | |
| 79 | +takes preference, _i.e._ the .env file will never be sourced. | |
| 80 | + | |
| 81 | +## Version Control | |
| 82 | + | |
| 83 | +**It's strongly recommended to add `.env` file to `.gitignore`**, because usually it contains sensitive information such as your credentials, secret keys, passwords etc. You don't want to commit this file, it's supposed to be local only. | |
| 84 | + | |
| 85 | +## Disclaimer | |
| 86 | + | |
| 87 | +This plugin only sources the `.env` file. Nothing less, nothing more. It doesn't do any checks. It's designed to be the fastest and simplest option. You're responsible for the `.env` file content. You can put some code (or weird symbols) there, but do it on your own risk. `dotenv` is the basic tool, yet it does the job. | |
| 88 | + | |
| 89 | +If you need more advanced and feature-rich ENV management, check out these awesome projects: | |
| 90 | + | |
| 91 | +* [direnv](https://github.com/direnv/direnv) | |
| 92 | +* [zsh-autoenv](https://github.com/Tarrasch/zsh-autoenv) |
+67-0.oh-my-zsh/plugins/dotenv/dotenv.plugin.zsh
| @@ -0,0 +1,67 @@ | ||
| 1 | +## Settings | |
| 2 | + | |
| 3 | +# Filename of the dotenv file to look for | |
| 4 | +: ${ZSH_DOTENV_FILE:=.env} | |
| 5 | + | |
| 6 | +# Path to the file containing allowed paths | |
| 7 | +: ${ZSH_DOTENV_ALLOWED_LIST:="${ZSH_CACHE_DIR:-$ZSH/cache}/dotenv-allowed.list"} | |
| 8 | +: ${ZSH_DOTENV_DISALLOWED_LIST:="${ZSH_CACHE_DIR:-$ZSH/cache}/dotenv-disallowed.list"} | |
| 9 | + | |
| 10 | + | |
| 11 | +## Functions | |
| 12 | + | |
| 13 | +source_env() { | |
| 14 | + if [[ ! -f "$ZSH_DOTENV_FILE" ]]; then | |
| 15 | + return | |
| 16 | + fi | |
| 17 | + | |
| 18 | + if [[ "$ZSH_DOTENV_PROMPT" != false ]]; then | |
| 19 | + local confirmation dirpath="${PWD:A}" | |
| 20 | + | |
| 21 | + # make sure there is an (dis-)allowed file | |
| 22 | + touch "$ZSH_DOTENV_ALLOWED_LIST" | |
| 23 | + touch "$ZSH_DOTENV_DISALLOWED_LIST" | |
| 24 | + | |
| 25 | + # early return if disallowed | |
| 26 | + if command grep -Fx -q "$dirpath" "$ZSH_DOTENV_DISALLOWED_LIST" &>/dev/null; then | |
| 27 | + return | |
| 28 | + fi | |
| 29 | + | |
| 30 | + # check if current directory's .env file is allowed or ask for confirmation | |
| 31 | + if ! command grep -Fx -q "$dirpath" "$ZSH_DOTENV_ALLOWED_LIST" &>/dev/null; then | |
| 32 | + # get cursor column and print new line before prompt if not at line beginning | |
| 33 | + local column | |
| 34 | + echo -ne "\e[6n" > /dev/tty | |
| 35 | + read -t 1 -s -d R column < /dev/tty | |
| 36 | + column="${column##*\[*;}" | |
| 37 | + [[ $column -eq 1 ]] || echo | |
| 38 | + | |
| 39 | + # print same-line prompt and output newline character if necessary | |
| 40 | + echo -n "dotenv: found '$ZSH_DOTENV_FILE' file. Source it? ([Y]es/[n]o/[a]lways/n[e]ver) " | |
| 41 | + read -k 1 confirmation | |
| 42 | + [[ "$confirmation" = $'\n' ]] || echo | |
| 43 | + | |
| 44 | + # check input | |
| 45 | + case "$confirmation" in | |
| 46 | + [nN]) return ;; | |
| 47 | + [aA]) echo "$dirpath" >> "$ZSH_DOTENV_ALLOWED_LIST" ;; | |
| 48 | + [eE]) echo "$dirpath" >> "$ZSH_DOTENV_DISALLOWED_LIST"; return ;; | |
| 49 | + *) ;; # interpret anything else as a yes | |
| 50 | + esac | |
| 51 | + fi | |
| 52 | + fi | |
| 53 | + | |
| 54 | + # test .env syntax | |
| 55 | + zsh -fn $ZSH_DOTENV_FILE || { | |
| 56 | + echo "dotenv: error when sourcing '$ZSH_DOTENV_FILE' file" >&2 | |
| 57 | + return 1 | |
| 58 | + } | |
| 59 | + | |
| 60 | + setopt localoptions allexport | |
| 61 | + source $ZSH_DOTENV_FILE | |
| 62 | +} | |
| 63 | + | |
| 64 | +autoload -U add-zsh-hook | |
| 65 | +add-zsh-hook chpwd source_env | |
| 66 | + | |
| 67 | +source_env |
+25-0.oh-my-zsh/plugins/dotnet/README.md
| @@ -0,0 +1,25 @@ | ||
| 1 | +# .NET Core CLI plugin | |
| 2 | + | |
| 3 | +This plugin provides completion and useful aliases for [.NET Core CLI](https://dotnet.microsoft.com/). | |
| 4 | + | |
| 5 | +To use it, add `dotnet` to the plugins array in your zshrc file. | |
| 6 | + | |
| 7 | +``` | |
| 8 | +plugins=(... dotnet) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Aliases | |
| 12 | + | |
| 13 | +| Alias | Command | Description | | |
| 14 | +|-------|------------------|-------------------------------------------------------------------| | |
| 15 | +| dn | dotnet new | Create a new .NET project or file. | | |
| 16 | +| dr | dotnet run | Build and run a .NET project output. | | |
| 17 | +| dt | dotnet test | Run unit tests using the test runner specified in a .NET project. | | |
| 18 | +| dw | dotnet watch | Watch for source file changes and restart the dotnet command. | | |
| 19 | +| dwr | dotnet watch run | Watch for source file changes and restart the `run` command. | | |
| 20 | +| dwt | dotnet watch test| Watch for source file changes and restart the `test` command. | | |
| 21 | +| ds | dotnet sln | Modify Visual Studio solution files. | | |
| 22 | +| da | dotnet add | Add a package or reference to a .NET project. | | |
| 23 | +| dp | dotnet pack | Create a NuGet package. | | |
| 24 | +| dng | dotnet nuget | Provides additional NuGet commands. | | |
| 25 | +| db | dotnet build | Build a .NET project | |
+26-0.oh-my-zsh/plugins/dotnet/dotnet.plugin.zsh
| @@ -0,0 +1,26 @@ | ||
| 1 | +# This scripts is copied from (MIT License): | |
| 2 | +# https://raw.githubusercontent.com/dotnet/sdk/main/scripts/register-completions.zsh | |
| 3 | + | |
| 4 | +#compdef dotnet | |
| 5 | +_dotnet_completion() { | |
| 6 | + local -a completions=("${(@f)$(dotnet complete "${words}")}") | |
| 7 | + compadd -a completions | |
| 8 | + _files | |
| 9 | +} | |
| 10 | + | |
| 11 | +compdef _dotnet_completion dotnet | |
| 12 | + | |
| 13 | +# Aliases bellow are here for backwards compatibility | |
| 14 | +# added by Shaun Tabone (https://github.com/xontab) | |
| 15 | + | |
| 16 | +alias dn='dotnet new' | |
| 17 | +alias dr='dotnet run' | |
| 18 | +alias dt='dotnet test' | |
| 19 | +alias dw='dotnet watch' | |
| 20 | +alias dwr='dotnet watch run' | |
| 21 | +alias dwt='dotnet watch test' | |
| 22 | +alias ds='dotnet sln' | |
| 23 | +alias da='dotnet add' | |
| 24 | +alias dp='dotnet pack' | |
| 25 | +alias dng='dotnet nuget' | |
| 26 | +alias db='dotnet build' |
+19-0.oh-my-zsh/plugins/droplr/README.md
| @@ -0,0 +1,19 @@ | ||
| 1 | +# droplr | |
| 2 | + | |
| 3 | +Use [Droplr](https://droplr.com/) from the command line to upload files and shorten | |
| 4 | +links. It needs to have [Droplr.app](https://droplr.com/apps) installed and logged | |
| 5 | +in. MacOS only. | |
| 6 | + | |
| 7 | +To use it, add `droplr` to the `$plugins` variable in your zshrc file: | |
| 8 | + | |
| 9 | +```zsh | |
| 10 | +plugins=(... droplr) | |
| 11 | +``` | |
| 12 | + | |
| 13 | +Author: [Fabio Fernandes](https://github.com/fabiofl) | |
| 14 | + | |
| 15 | +## Examples | |
| 16 | + | |
| 17 | +- Upload a file: `droplr ./path/to/file/` | |
| 18 | + | |
| 19 | +- Shorten a link: `droplr https://example.com` |
+15-0.oh-my-zsh/plugins/droplr/droplr.plugin.zsh
| @@ -0,0 +1,15 @@ | ||
| 1 | +# Only compatible with MacOS | |
| 2 | +[[ "$OSTYPE" == darwin* ]] || return | |
| 3 | + | |
| 4 | +droplr() { | |
| 5 | + if [[ $# -eq 0 ]]; then | |
| 6 | + echo You need to specify a parameter. >&2 | |
| 7 | + return 1 | |
| 8 | + fi | |
| 9 | + | |
| 10 | + if [[ "$1" =~ ^https?:// ]]; then | |
| 11 | + osascript -e 'tell app "Droplr" to shorten "'"$1"'"' | |
| 12 | + else | |
| 13 | + open -ga /Applications/Droplr.app "$1" | |
| 14 | + fi | |
| 15 | +} |
+66-0.oh-my-zsh/plugins/drush/README.md
| @@ -0,0 +1,66 @@ | ||
| 1 | +# Drush | |
| 2 | + | |
| 3 | +This plugin adds aliases and functions for [Drush](https://www.drush.org), a command-line shell | |
| 4 | +and Unix scripting interface for Drupal. It also adds completion for the `drush` command. | |
| 5 | + | |
| 6 | +To enable it, add `drush` to the plugins array in zshrc file: | |
| 7 | + | |
| 8 | +```zsh | |
| 9 | +plugins=(... drush) | |
| 10 | +``` | |
| 11 | + | |
| 12 | +## Aliases | |
| 13 | + | |
| 14 | +| Alias | Command | Description | | |
| 15 | +| ------- | ----------------------------------------------------------- | -------------------------------------------------------------------- | | |
| 16 | +| `dr` | `drush` | Display drush help | | |
| 17 | +| `drca` | `drush cc all` | _(Deprecated in Drush 8)_ Clear all drupal caches | | |
| 18 | +| `drcb` | `drush cc block` | _(Deprecated in Drush 8)_ Clear block cache | | |
| 19 | +| `drcex` | `drush config:export -y` | Export Drupal configuration to a directory | | |
| 20 | +| `drcg` | `drush cc registry` | _(Deprecated in Drush 8)_ Clear registry cache | | |
| 21 | +| `drcim` | `drush config:import -y` | Import config from a config directory | | |
| 22 | +| `drcj` | `drush cc css-js` | Clear css-js cache | | |
| 23 | +| `drcm` | `drush cc menu` | Clear menu cache | | |
| 24 | +| `drcml` | `drush cc module-list` | Clear module-list cache | | |
| 25 | +| `drcr` | `drush core-cron` | Run all cron hooks in all active modules for specified site | | |
| 26 | +| `drct` | `drush cc theme-registry` | Clear theme-registry cache | | |
| 27 | +| `drcv` | `drush cc views` | Clear views cache _(make sure that the views module is enabled)_ | | |
| 28 | +| `drdmp` | `drush drush sql-dump --ordered-dump --result-file=dumpsql` | Backup database in a new dump.sql file | | |
| 29 | +| `drf` | `drush features` | Display features status | | |
| 30 | +| `drfr` | `drush features-revert -y` | Revert a feature module on your site | | |
| 31 | +| `drfra` | `drush features-revert-all` | Revert all enabled feature module on your site | | |
| 32 | +| `drfu` | `drush features-update -y` | Update a feature module on your site | | |
| 33 | +| `drif` | `drush image-flush --all` | Flush all derived images | | |
| 34 | +| `drpm` | `drush pm-list --type=module` | Show a list of available modules | | |
| 35 | +| `drst` | `drush core-status` | Provides a birds-eye view of the current Drupal installation, if any | | |
| 36 | +| `druli` | `drush user:login` | Display a one time login link for user ID 1, or another user | | |
| 37 | +| `drup` | `drush updatedb` | Apply any database updates required (as with running update.php) | | |
| 38 | +| `drups` | `drush updatedb-status` | List any pending database updates | | |
| 39 | +| `drv` | `drush version` | Show drush version | | |
| 40 | +| `drvd` | `drush variable-del` | Delete a variable | | |
| 41 | +| `drvg` | `drush variable-get` | Get a list of some or all site variables and values | | |
| 42 | +| `drvs` | `drush variable-set` | Set a variable | | |
| 43 | +| `drws` | `drush watchdog:show` | Show watchdog messages | | |
| 44 | +| `drwse` | `drush watchdog:show --extended` | Show watchdog messages with extended information | | |
| 45 | +| `drwst` | `drush watchdog:tail` | Tail watchdog messages | | |
| 46 | + | |
| 47 | +## Functions | |
| 48 | + | |
| 49 | +- `dren`: download and enable one or more extensions (modules or themes). Must be | |
| 50 | + invoked with one or more parameters, e.g.: `dren devel` or `dren devel module_filter views`. | |
| 51 | + | |
| 52 | +- `drf`: edit drushrc, site alias, and Drupal settings.php files. | |
| 53 | + Can be invoked with one or without parameters, e.g.: `drf 1`. | |
| 54 | + | |
| 55 | +- `dris`: disable one or more extensions (modules or themes). Must be invoked with | |
| 56 | + one or more parameters, e.g.: `dris devel` or `dris devel module_filter views`. | |
| 57 | + | |
| 58 | +- `drpu`: uninstall one or more modules. Must be invoked with one or more | |
| 59 | + parameters, e.g.: `drpu devel` or `drpu devel module_filter views`. | |
| 60 | + | |
| 61 | +- `drnew`: creates a brand new drupal website. Note: as soon as the installation | |
| 62 | + is complete, `drush` will print a username and a random password into the terminal: | |
| 63 | + | |
| 64 | + ```text | |
| 65 | + Installation complete. User name: admin User password: cf7t8yqNEm | |
| 66 | + ``` |
+50-0.oh-my-zsh/plugins/drush/drush.complete.sh
| @@ -0,0 +1,50 @@ | ||
| 1 | +# BASH completion script for Drush. | |
| 2 | +# | |
| 3 | +# Place this in your /etc/bash_completion.d/ directory or source it from your | |
| 4 | +# ~/.bash_completion or ~/.bash_profile files. Alternatively, source | |
| 5 | +# examples/example.bashrc instead, as it will automatically find and source | |
| 6 | +# this file. | |
| 7 | +# | |
| 8 | +# If you're using ZSH instead of BASH, add the following to your ~/.zshrc file | |
| 9 | +# and source it. | |
| 10 | +# | |
| 11 | +# autoload bashcompinit | |
| 12 | +# bashcompinit | |
| 13 | +# source /path/to/your/drush.complete.sh | |
| 14 | + | |
| 15 | +# Ensure drush is available. | |
| 16 | +which drush > /dev/null || alias drush &> /dev/null || return | |
| 17 | + | |
| 18 | +__drush_ps1() { | |
| 19 | + f="${TMPDIR:-/tmp/}/drush-env-${USER}/drush-drupal-site-$$" | |
| 20 | + if [ -f $f ] | |
| 21 | + then | |
| 22 | + __DRUPAL_SITE=$(cat "$f") | |
| 23 | + else | |
| 24 | + __DRUPAL_SITE="$DRUPAL_SITE" | |
| 25 | + fi | |
| 26 | + | |
| 27 | + # Set DRUSH_PS1_SHOWCOLORHINTS to a non-empty value and define a | |
| 28 | + # __drush_ps1_colorize_alias() function for color hints in your Drush PS1 | |
| 29 | + # prompt. See example.prompt.sh for an example implementation. | |
| 30 | + if [ -n "${__DRUPAL_SITE-}" ] && [ -n "${DRUSH_PS1_SHOWCOLORHINTS-}" ]; then | |
| 31 | + __drush_ps1_colorize_alias | |
| 32 | + fi | |
| 33 | + | |
| 34 | + [[ -n "$__DRUPAL_SITE" ]] && printf "${1:- (%s)}" "$__DRUPAL_SITE" | |
| 35 | +} | |
| 36 | + | |
| 37 | +# Completion function, uses the "drush complete" command to retrieve | |
| 38 | +# completions for a specific command line COMP_WORDS. | |
| 39 | +_drush_completion() { | |
| 40 | + # Set IFS to newline (locally), since we only use newline separators, and | |
| 41 | + # need to retain spaces (or not) after completions. | |
| 42 | + local IFS=$'\n' | |
| 43 | + # The '< /dev/null' is a work around for a bug in php libedit stdin handling. | |
| 44 | + # Note that libedit in place of libreadline in some distributions. See: | |
| 45 | + # https://bugs.launchpad.net/ubuntu/+source/php5/+bug/322214 | |
| 46 | + COMPREPLY=( $(drush --early=includes/complete.inc "${COMP_WORDS[@]}" < /dev/null 2> /dev/null) ) | |
| 47 | +} | |
| 48 | + | |
| 49 | +# Register our completion function. We include common short aliases for Drush. | |
| 50 | +complete -o bashdefault -o default -o nospace -F _drush_completion d dr drush drush5 drush6 drush7 drush8 drush.php |
+107-0.oh-my-zsh/plugins/drush/drush.plugin.zsh
| @@ -0,0 +1,107 @@ | ||
| 1 | +# Functions | |
| 2 | +function dren() { | |
| 3 | + drush en "$@" -y | |
| 4 | +} | |
| 5 | + | |
| 6 | +function dris() { | |
| 7 | + drush pm-disable "$@" -y | |
| 8 | +} | |
| 9 | + | |
| 10 | +function drpu() { | |
| 11 | + drush pm-uninstall "$@" -y | |
| 12 | +} | |
| 13 | + | |
| 14 | +function drf() { | |
| 15 | + if [[ -z "$1" ]] then | |
| 16 | + drush core-config | |
| 17 | + else | |
| 18 | + drush core-config --choice=$1 | |
| 19 | + fi | |
| 20 | +} | |
| 21 | + | |
| 22 | +function drfi() { | |
| 23 | + case "$1" in | |
| 24 | + fields) drush field-info fields ;; | |
| 25 | + types) drush field-info types ;; | |
| 26 | + *) drush field-info ;; | |
| 27 | + esac | |
| 28 | +} | |
| 29 | + | |
| 30 | +function drnew() { | |
| 31 | + ( | |
| 32 | + cd | |
| 33 | + echo "Website's name: " | |
| 34 | + read WEBSITE_NAME | |
| 35 | + | |
| 36 | + HOST=http://$(hostname -i)/ | |
| 37 | + | |
| 38 | + if [[ $WEBSITE_NAME == "" ]] then | |
| 39 | + MINUTES=$(date +%M:%S) | |
| 40 | + WEBSITE_NAME="Drupal-$MINUTES" | |
| 41 | + echo "Your website will be named: $WEBSITE_NAME" | |
| 42 | + fi | |
| 43 | + | |
| 44 | + drush dl drupal --drupal-project-rename=$WEBSITE_NAME | |
| 45 | + | |
| 46 | + echo "Type your localhost directory: (Leave empty for /var/www/html/)" | |
| 47 | + read DIRECTORY | |
| 48 | + | |
| 49 | + if [[ $DIRECTORY == "" ]] then | |
| 50 | + DIRECTORY="/var/www/html/" | |
| 51 | + fi | |
| 52 | + | |
| 53 | + echo "Moving to $DIRECTORY$WEBSITE_NAME" | |
| 54 | + sudo mv $WEBSITE_NAME $DIRECTORY | |
| 55 | + cd $DIRECTORY$WEBSITE_NAME | |
| 56 | + | |
| 57 | + echo "Database's user: " | |
| 58 | + read DATABASE_USR | |
| 59 | + echo "Database's password: " | |
| 60 | + read -s DATABASE_PWD | |
| 61 | + echo "Database's name for your project: " | |
| 62 | + read DATABASE | |
| 63 | + | |
| 64 | + DB_URL="mysql://$DATABASE_USR:$DATABASE_PWD@localhost/$DATABASE" | |
| 65 | + drush site-install standard --db-url=$DB_URL --site-name=$WEBSITE_NAME | |
| 66 | + | |
| 67 | + open_command $HOST$WEBSITE_NAME | |
| 68 | + echo "Done" | |
| 69 | + ) | |
| 70 | +} | |
| 71 | + | |
| 72 | +# Aliases | |
| 73 | +alias dr="drush" | |
| 74 | +alias drca="drush cc all" # Deprecated for Drush 8 | |
| 75 | +alias drcb="drush cc block" # Deprecated for Drush 8 | |
| 76 | +alias drcex="drush config:export -y" | |
| 77 | +alias drcg="drush cc registry" # Deprecated for Drush 8 | |
| 78 | +alias drcim="drush config:import -y" | |
| 79 | +alias drcj="drush cc css-js" | |
| 80 | +alias drcm="drush cc menu" | |
| 81 | +alias drcml="drush cc module-list" | |
| 82 | +alias drcr="drush core-cron" | |
| 83 | +alias drct="drush cc theme-registry" | |
| 84 | +alias drcv="drush cc views" | |
| 85 | +alias drdmp="drush sql-dump --ordered-dump --result-file=dump.sql" | |
| 86 | +alias drf="drush features" | |
| 87 | +alias drfr="drush features-revert -y" | |
| 88 | +alias drfra="drush features-revert-all" | |
| 89 | +alias drfu="drush features-update -y" | |
| 90 | +alias drif="drush image-flush --all" | |
| 91 | +alias drpm="drush pm-list --type=module" | |
| 92 | +alias drst="drush core-status" | |
| 93 | +alias druli="drush user:login" | |
| 94 | +alias drup="drush updatedb" | |
| 95 | +alias drups="drush updatedb-status" | |
| 96 | +alias drv="drush version" | |
| 97 | +alias drvd="drush variable-del" | |
| 98 | +alias drvg="drush variable-get" | |
| 99 | +alias drvs="drush variable-set" | |
| 100 | +alias drws="drush watchdog:show" | |
| 101 | +alias drwse="drush watchdog:show --extended" | |
| 102 | +alias drwst="drush watchdog:tail" | |
| 103 | + | |
| 104 | +# Enable drush autocomplete support | |
| 105 | +autoload bashcompinit | |
| 106 | +bashcompinit | |
| 107 | +source $(dirname $0)/drush.complete.sh |
+11-0.oh-my-zsh/plugins/eecms/README.md
| @@ -0,0 +1,11 @@ | ||
| 1 | +# eecms plugin | |
| 2 | + | |
| 3 | +This plugin adds auto-completion of console commands for [`eecms`](https://github.com/ExpressionEngine/ExpressionEngine). | |
| 4 | + | |
| 5 | +To use it, add `eecms` to the plugins array of your `.zshrc` file: | |
| 6 | +``` | |
| 7 | +plugins=(... eecms) | |
| 8 | +``` | |
| 9 | + | |
| 10 | +It also adds the alias `eecms` which finds the eecms file in the current project | |
| 11 | +and runs it with php. |
+20-0.oh-my-zsh/plugins/eecms/eecms.plugin.zsh
| @@ -0,0 +1,20 @@ | ||
| 1 | +# ExpressionEngine CMS basic command completion | |
| 2 | + | |
| 3 | +_eecms_console () { | |
| 4 | + echo "php $(find . -maxdepth 3 -mindepth 1 -name 'eecms' -type f | head -n 1)" | |
| 5 | +} | |
| 6 | + | |
| 7 | +_eecms_get_command_list () { | |
| 8 | + `_eecms_console` | sed "/Available commands/,/^/d" | sed "s/[[:space:]].*//g" | |
| 9 | +} | |
| 10 | + | |
| 11 | +_eecms () { | |
| 12 | + compadd `_eecms_get_command_list` | |
| 13 | +} | |
| 14 | + | |
| 15 | +compdef _eecms '`_eecms_console`' | |
| 16 | +compdef _eecms 'system/ee/eecms' | |
| 17 | +compdef _eecms eecms | |
| 18 | + | |
| 19 | +#Alias | |
| 20 | +alias eecms='`_eecms_console`' |
+30-0.oh-my-zsh/plugins/emacs/README.md
| @@ -0,0 +1,30 @@ | ||
| 1 | +# Emacs plugin | |
| 2 | + | |
| 3 | +This plugin utilizes the Emacs daemon capability, allowing the user to quickly open frames, whether they are opened in a terminal via a ssh connection, or X frames opened on the same host. The plugin also provides some aliases for such operations. | |
| 4 | + | |
| 5 | +- You don't have the cost of starting Emacs all the time anymore | |
| 6 | +- Opening a file is as fast as Emacs does not have anything else to do. | |
| 7 | +- You can share opened buffered across opened frames. | |
| 8 | +- Configuration changes made at runtime are applied to all frames. | |
| 9 | + | |
| 10 | +**NOTE:** requires Emacs 24 and newer. | |
| 11 | + | |
| 12 | +To use it, add emacs to the plugins array in your zshrc file: | |
| 13 | + | |
| 14 | +```zsh | |
| 15 | +plugins=(... emacs) | |
| 16 | +``` | |
| 17 | + | |
| 18 | +## Aliases | |
| 19 | + | |
| 20 | +The plugin uses a custom launcher (which we'll call here `$EMACS_LAUNCHER`) that is just a wrapper around [`emacsclient`](https://www.emacswiki.org/emacs/EmacsClient). | |
| 21 | + | |
| 22 | +| Alias | Command | Description | | |
| 23 | +|--------|----------------------------------------------------|----------------------------------------------------------------| | |
| 24 | +| emacs | `$EMACS_LAUNCHER --no-wait` | Opens a temporary emacsclient frame | | |
| 25 | +| e | `emacs` | Same as emacs alias | | |
| 26 | +| te | `$EMACS_LAUNCHER -nw` | Open terminal emacsclient | | |
| 27 | +| eeval | `$EMACS_LAUNCHER --eval` | Same as `M-x eval` but from outside Emacs | | |
| 28 | +| eframe | `emacsclient --alternate-editor="" --create-frame` | Create new X frame | | |
| 29 | +| efile | - | Print the path to the file open in the current buffer | | |
| 30 | +| ecd | - | Print the directory of the file open in the current buffer | |
+68-0.oh-my-zsh/plugins/emacs/emacs.plugin.zsh
| @@ -0,0 +1,68 @@ | ||
| 1 | +# Emacs 23 daemon capability is a killing feature. | |
| 2 | +# One emacs process handles all your frames whether | |
| 3 | +# you use a frame opened in a terminal via a ssh connection or X frames | |
| 4 | +# opened on the same host. | |
| 5 | + | |
| 6 | +# Benefits are multiple | |
| 7 | +# - You don't have the cost of starting Emacs all the time anymore | |
| 8 | +# - Opening a file is as fast as Emacs does not have anything else to do. | |
| 9 | +# - You can share opened buffered across opened frames. | |
| 10 | +# - Configuration changes made at runtime are applied to all frames. | |
| 11 | + | |
| 12 | +# Require emacs version to be minimum 24 | |
| 13 | +autoload -Uz is-at-least | |
| 14 | +is-at-least 24 "${${(Az)"$(emacsclient --version 2>/dev/null)"}[2]}" || return 0 | |
| 15 | + | |
| 16 | +# Handle $0 according to the standard: | |
| 17 | +# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html | |
| 18 | +0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" | |
| 19 | +0="${${(M)0:#/*}:-$PWD/$0}" | |
| 20 | + | |
| 21 | +# Path to custom emacsclient launcher | |
| 22 | +export EMACS_PLUGIN_LAUNCHER="${0:A:h}/emacsclient.sh" | |
| 23 | + | |
| 24 | +# set EDITOR if not already defined. | |
| 25 | +export EDITOR="${EDITOR:-${EMACS_PLUGIN_LAUNCHER}}" | |
| 26 | + | |
| 27 | +alias emacs="$EMACS_PLUGIN_LAUNCHER --no-wait" | |
| 28 | +alias e=emacs | |
| 29 | +# open terminal emacsclient | |
| 30 | +alias te="$EMACS_PLUGIN_LAUNCHER -nw" | |
| 31 | + | |
| 32 | +# same than M-x eval but from outside Emacs. | |
| 33 | +alias eeval="$EMACS_PLUGIN_LAUNCHER --eval" | |
| 34 | +# create a new X frame | |
| 35 | +alias eframe='emacsclient --alternate-editor="" --create-frame' | |
| 36 | + | |
| 37 | +# Emacs ANSI Term tracking | |
| 38 | +if [[ -n "$INSIDE_EMACS" ]] && [[ "$INSIDE_EMACS" != "vterm" ]]; then | |
| 39 | + chpwd_emacs() { print -P "\033AnSiTc %d"; } | |
| 40 | + print -P "\033AnSiTc %d" # Track current working directory | |
| 41 | + print -P "\033AnSiTu %n" # Track username | |
| 42 | + | |
| 43 | + # add chpwd hook | |
| 44 | + autoload -Uz add-zsh-hook | |
| 45 | + add-zsh-hook chpwd chpwd_emacs | |
| 46 | +fi | |
| 47 | + | |
| 48 | +# Write to standard output the path to the file | |
| 49 | +# opened in the current buffer. | |
| 50 | +function efile { | |
| 51 | + local cmd="(buffer-file-name (window-buffer))" | |
| 52 | + local file="$("$EMACS_PLUGIN_LAUNCHER" --eval "$cmd" | tr -d \")" | |
| 53 | + | |
| 54 | + if [[ -z "$file" ]]; then | |
| 55 | + echo "Can't deduce current buffer filename." >&2 | |
| 56 | + return 1 | |
| 57 | + fi | |
| 58 | + | |
| 59 | + echo "$file" | |
| 60 | +} | |
| 61 | + | |
| 62 | +# Write to standard output the directory of the file | |
| 63 | +# opened in the current buffer | |
| 64 | +function ecd { | |
| 65 | + local file | |
| 66 | + file="$(efile)" || return $? | |
| 67 | + echo "${file:h}" | |
| 68 | +} |
+38-0.oh-my-zsh/plugins/emacs/emacsclient.sh
| @@ -0,0 +1,38 @@ | ||
| 1 | +#!/bin/sh | |
| 2 | + | |
| 3 | +emacsfun() { | |
| 4 | + local cmd frames | |
| 5 | + | |
| 6 | + # Build the Emacs Lisp command to check for suitable frames | |
| 7 | + # See https://www.gnu.org/software/emacs/manual/html_node/elisp/Frames.html#index-framep | |
| 8 | + case "$*" in | |
| 9 | + *-t*|*--tty*|*-nw*) cmd="(memq 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are tty frames | |
| 10 | + *) cmd="(delete 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are graphical terminals (x, w32, ns) | |
| 11 | + esac | |
| 12 | + | |
| 13 | + # Check if there are suitable frames | |
| 14 | + frames="$(emacsclient -a '' -n -e "$cmd" 2>/dev/null |sed 's/.*\x07//g' )" | |
| 15 | + | |
| 16 | + # Only create another X frame if there isn't one present | |
| 17 | + if [ -z "$frames" -o "$frames" = nil ]; then | |
| 18 | + emacsclient --alternate-editor="" --create-frame "$@" | |
| 19 | + return $? | |
| 20 | + fi | |
| 21 | + | |
| 22 | + emacsclient --alternate-editor="" "$@" | |
| 23 | +} | |
| 24 | + | |
| 25 | +# Adapted from https://github.com/davidshepherd7/emacs-read-stdin/blob/master/emacs-read-stdin.sh | |
| 26 | +# If the second argument is - then write stdin to a tempfile and open the | |
| 27 | +# tempfile. (first argument will be `--no-wait` passed in by the plugin.zsh) | |
| 28 | +if [ $# -ge 2 -a "$2" = "-" ]; then | |
| 29 | + # Create a tempfile to hold stdin | |
| 30 | + tempfile="$(mktemp --tmpdir emacs-stdin-$USERNAME.XXXXXXX 2>/dev/null \ | |
| 31 | + || mktemp -t emacs-stdin-$USERNAME)" # support BSD mktemp | |
| 32 | + # Redirect stdin to the tempfile | |
| 33 | + cat - > "$tempfile" | |
| 34 | + # Reset $2 to the tempfile so that "$@" works as expected | |
| 35 | + set -- "$1" "$tempfile" "${@:3}" | |
| 36 | +fi | |
| 37 | + | |
| 38 | +emacsfun "$@" |
+33-0.oh-my-zsh/plugins/ember-cli/README.md
| @@ -0,0 +1,33 @@ | ||
| 1 | +# Ember CLI | |
| 2 | + | |
| 3 | +This plugin adds completion and aliases for using [`ember-cli`](https://cli.emberjs.com/). | |
| 4 | + | |
| 5 | +To use it, add `ember-cli` to the plugins array in your zshrc file: | |
| 6 | + | |
| 7 | +```zsh | |
| 8 | +plugins=(... ember-cli) | |
| 9 | +``` | |
| 10 | + | |
| 11 | +## Aliases | |
| 12 | + | |
| 13 | +| Alias | Command | | |
| 14 | +| ----- | -------------------- | | |
| 15 | +| `ea` | `ember addon` | | |
| 16 | +| `eb` | `ember build` | | |
| 17 | +| `ed` | `ember destroy` | | |
| 18 | +| `eg` | `ember generate` | | |
| 19 | +| `eh` | `ember help` | | |
| 20 | +| `ei` | `ember install` | | |
| 21 | +| `ein` | `ember init` | | |
| 22 | +| `es` | `ember serve` | | |
| 23 | +| `et` | `ember test` | | |
| 24 | +| `ets` | `ember test --serve` | | |
| 25 | +| `eu` | `ember update` | | |
| 26 | +| `ev` | `ember version` | | |
| 27 | + | |
| 28 | +## Maintainers | |
| 29 | + | |
| 30 | +- [BilalBudhani](https://github.com/BilalBudhani) | |
| 31 | +- [eubenesa](https://github.com/eubenesa) | |
| 32 | +- [scottkidder](https://github.com/scottkidder) | |
| 33 | +- [t-sauer](https://www.github.com/t-sauer) |
+189-0.oh-my-zsh/plugins/ember-cli/_ember-cli
| @@ -0,0 +1,189 @@ | ||
| 1 | +#compdef ember | |
| 2 | + | |
| 3 | +local curcontext="$curcontext" state line ret=1 | |
| 4 | + | |
| 5 | +_arguments -C -A "--version" -A "--help" \ | |
| 6 | + '(- 1 *)--help' \ | |
| 7 | + '(- 1 *)--version' \ | |
| 8 | + '1: :->cmds' \ | |
| 9 | + '*:: :->args' && ret=0 | |
| 10 | + | |
| 11 | +case $state in | |
| 12 | + cmds) | |
| 13 | + _values "ember command" \ | |
| 14 | + "addon[Generates a new folder structure for building an addon, complete with test harness]" \ | |
| 15 | + "asset-sizes[Shows the sizes of your asset files]" \ | |
| 16 | + "build[Builds your app and places it into the output path (dist/ by default)]" \ | |
| 17 | + "destroy[Destroys code generated by generate command]" \ | |
| 18 | + "generate[Generates new code from blueprints]" \ | |
| 19 | + "help[Outputs the usage instructions for all commands or the provided command]" \ | |
| 20 | + "init[Creates a new ember-cli project in the current folder]" \ | |
| 21 | + "install[Installs an ember-cli addon from npm]" \ | |
| 22 | + "new[Creates a new directory and runs ember init in it]" \ | |
| 23 | + "serve[Builds and serves your app, rebuilding on file changes]" \ | |
| 24 | + "test[Runs your app's test suite]" \ | |
| 25 | + "version[outputs ember-cli version]" | |
| 26 | + ret=0 | |
| 27 | + ;; | |
| 28 | + args) | |
| 29 | + case $line[1] in | |
| 30 | + help) | |
| 31 | + _values 'commands' \ | |
| 32 | + 'addon' \ | |
| 33 | + 'asset-sizes' \ | |
| 34 | + 'build' \ | |
| 35 | + 'destroy' \ | |
| 36 | + 'generate' \ | |
| 37 | + 'help' \ | |
| 38 | + 'init' \ | |
| 39 | + 'install' \ | |
| 40 | + 'new' \ | |
| 41 | + 'serve' \ | |
| 42 | + 'test' \ | |
| 43 | + 'vesion' && ret=0 | |
| 44 | + ;; | |
| 45 | + addon) | |
| 46 | + _arguments \ | |
| 47 | + '(--blueprint)--blueprint=-' \ | |
| 48 | + '(--directory)--directory=-' \ | |
| 49 | + '(--dry-run)--dry-run' \ | |
| 50 | + '(--skip-bower)--skip-bower' \ | |
| 51 | + '(--skip-git)--skip-git' \ | |
| 52 | + '(--skip-npm)--skip-npm' \ | |
| 53 | + '(--verbose)--verbose' | |
| 54 | + ;; | |
| 55 | + asset-sizes) | |
| 56 | + _arguments \ | |
| 57 | + '(--output-path)--output-path=-' | |
| 58 | + ;; | |
| 59 | + build) | |
| 60 | + _arguments \ | |
| 61 | + '(--environment)--environment=-' \ | |
| 62 | + '(--output-path)--output-path=-' \ | |
| 63 | + '(--output-path)--suppress-sizes' \ | |
| 64 | + '(--watch)--watch' \ | |
| 65 | + '(--watcher)--watcher=-' \ | |
| 66 | + '(-dev)-dev' \ | |
| 67 | + '(-prod)-prod' | |
| 68 | + ;; | |
| 69 | + destroy|generate) | |
| 70 | + _values 'arguments' \ | |
| 71 | + '(--classic)--classic' \ | |
| 72 | + '(--dry-run)--dry-run' \ | |
| 73 | + '(--dummy)--dummy' \ | |
| 74 | + '(--in-repo-addon)--in-repo-addon-=' \ | |
| 75 | + '(--pod)--pod' \ | |
| 76 | + '(--verbose)--verbose' && ret=0 | |
| 77 | + _values 'blueprints' \ | |
| 78 | + 'acceptance-test' \ | |
| 79 | + 'adapter' \ | |
| 80 | + 'adapter-test' \ | |
| 81 | + 'component' \ | |
| 82 | + 'component-addon' \ | |
| 83 | + 'component-test' \ | |
| 84 | + 'controller' \ | |
| 85 | + 'controller-test' \ | |
| 86 | + 'helper' \ | |
| 87 | + 'helper-addon' \ | |
| 88 | + 'helper-test' \ | |
| 89 | + 'initializer' \ | |
| 90 | + 'initializer-addon' \ | |
| 91 | + 'initializer-test' \ | |
| 92 | + 'instance-initializer' \ | |
| 93 | + 'instance-initializer-addon' \ | |
| 94 | + 'instance-initializer-test' \ | |
| 95 | + 'mixin' \ | |
| 96 | + 'mixin-test' \ | |
| 97 | + 'model' \ | |
| 98 | + 'model-test' \ | |
| 99 | + 'resource' \ | |
| 100 | + 'route' \ | |
| 101 | + 'route-addon' \ | |
| 102 | + 'route-test' \ | |
| 103 | + 'serializer' \ | |
| 104 | + 'serializer-test' \ | |
| 105 | + 'service' \ | |
| 106 | + 'service-test' \ | |
| 107 | + 'template' \ | |
| 108 | + 'test-helper' \ | |
| 109 | + 'transform' \ | |
| 110 | + 'transform-test' \ | |
| 111 | + 'util' \ | |
| 112 | + 'util-test' \ | |
| 113 | + 'view' \ | |
| 114 | + 'view-test' \ | |
| 115 | + 'addon' \ | |
| 116 | + 'addon-import' \ | |
| 117 | + 'app' \ | |
| 118 | + 'blueprint' \ | |
| 119 | + 'http-mock' \ | |
| 120 | + 'http-proxy' \ | |
| 121 | + 'in-repo-addon' \ | |
| 122 | + 'lib' \ | |
| 123 | + 'server' \ | |
| 124 | + 'vendor-shim' && ret=0 | |
| 125 | + ;; | |
| 126 | + init) | |
| 127 | + _arguments \ | |
| 128 | + '(--blueprint)--blueprint=-' \ | |
| 129 | + '(--name)--name=-' \ | |
| 130 | + '(--dry-run)--dry-run' \ | |
| 131 | + '(--skip-bower)--skip-bower' \ | |
| 132 | + '(--skip-npm)--skip-npm' \ | |
| 133 | + '(--verbose)--verbose' | |
| 134 | + ;; | |
| 135 | + install) | |
| 136 | + _arguments \ | |
| 137 | + '(--save-dev)--save-dev' \ | |
| 138 | + '(--save)--save' | |
| 139 | + ;; | |
| 140 | + new) | |
| 141 | + _arguments \ | |
| 142 | + '(--blueprint)--blueprint=-' \ | |
| 143 | + '(--directory)--directory=-' \ | |
| 144 | + '(--dry-run)--dry-run' \ | |
| 145 | + '(--skip-bower)--skip-bower' \ | |
| 146 | + '(--skip-git)--skip-git' \ | |
| 147 | + '(--skip-npm)--skip-npm' \ | |
| 148 | + '(--verbose)--verbose' | |
| 149 | + ;; | |
| 150 | + serve) | |
| 151 | + _arguments \ | |
| 152 | + '(--port)--port=-[To use a port different than 4200. Pass 0 to automatically pick an available port.]' \ | |
| 153 | + '(--host)--host=-[Listens on all interfaces by default]' \ | |
| 154 | + '(--proxy)--proxy=-' \ | |
| 155 | + '(--secure-proxy)--secure-proxy[Set to false to proxy self-signed SSL certificates]' \ | |
| 156 | + '(--transparent-proxy)--transparent-proxy[Set to false to omit x-forwarded-* headers when proxying]' \ | |
| 157 | + '(--watcher)--watcher=-' \ | |
| 158 | + '(--live-reload)--live-reload' \ | |
| 159 | + '(--live-reload-host)--live-reload-host=-[Defaults to host]' \ | |
| 160 | + '(--live-reload-base-url)--live-reload-base-url=-[Defaults to baseURL]' \ | |
| 161 | + '(--live-reload-port)--live-reload-port=-[Defaults to port number within \[49152...65535\]]' \ | |
| 162 | + '(--environment)--environment=-' \ | |
| 163 | + '(--output-path)--output-path=-' \ | |
| 164 | + '(--ssl)--ssl' \ | |
| 165 | + '(--ssl-key)--ssl-key=-' \ | |
| 166 | + '(--ssl-cert)--ssl-cert=-' | |
| 167 | + ;; | |
| 168 | + test) | |
| 169 | + _arguments \ | |
| 170 | + '(--environment)--environment=-' \ | |
| 171 | + '(--config-file)--config-file=-' \ | |
| 172 | + '(--server)--server' \ | |
| 173 | + '(--host)--host=-' \ | |
| 174 | + '(--test-port)--test-port=-[The test port to use when running with --server.]' \ | |
| 175 | + '(--filter)--filter=-[A string to filter tests to run]' \ | |
| 176 | + '(--module)--module=-[The name of a test module to run]' \ | |
| 177 | + '(--watcher)--watcher=-' \ | |
| 178 | + '(--launch)--launch=-[A comma separated list of browsers to launch for tests.]' \ | |
| 179 | + '(--reporter)--reporter=-[Test reporter to use \[tap|dot|xunit\] (default: tap)]' \ | |
| 180 | + '(--silent)--silent[Suppress any output except for the test report]' \ | |
| 181 | + '(--test-page)--test-page=-[Test page to invoke]' \ | |
| 182 | + '(--path)--path=-[Reuse an existing build at given path.]' \ | |
| 183 | + '(--query)--query=-[A query string to append to the test page URL.]' | |
| 184 | + ;; | |
| 185 | + esac | |
| 186 | + ;; | |
| 187 | +esac | |
| 188 | + | |
| 189 | +return ret |
+12-0.oh-my-zsh/plugins/ember-cli/ember-cli.plugin.zsh
| @@ -0,0 +1,12 @@ | ||
| 1 | +alias ea='ember addon' | |
| 2 | +alias eb='ember build' | |
| 3 | +alias ed='ember destroy' | |
| 4 | +alias eg='ember generate' | |
| 5 | +alias eh='ember help' | |
| 6 | +alias ei='ember install' | |
| 7 | +alias ein='ember init' | |
| 8 | +alias es='ember serve' | |
| 9 | +alias et='ember test' | |
| 10 | +alias ets='ember test --serve' | |
| 11 | +alias eu='ember update' | |
| 12 | +alias ev='ember version' |
+14-0.oh-my-zsh/plugins/emoji-clock/README.md
| @@ -0,0 +1,14 @@ | ||
| 1 | +# emoji-clock | |
| 2 | + | |
| 3 | +The plugin displays current time as an emoji symbol with half hour accuracy. | |
| 4 | + | |
| 5 | +To use it, add `emoji-clock` to the plugins array of your zshrc file: | |
| 6 | +``` | |
| 7 | +plugins=(... emoji-clock) | |
| 8 | +``` | |
| 9 | + | |
| 10 | +## Features | |
| 11 | + | |
| 12 | +| Function | Description | | |
| 13 | +|-------------------|----------------------------------------------------------------------| | |
| 14 | +| `emoji-clock` | Displays current time in clock emoji symbol with half hour accuracy | |
+33-0.oh-my-zsh/plugins/emoji-clock/emoji-clock.plugin.zsh
| @@ -0,0 +1,33 @@ | ||
| 1 | +# ------------------------------------------------------------------------------ | |
| 2 | +# FILE: emoji-clock.plugin.zsh | |
| 3 | +# DESCRIPTION: The current time with half hour accuracy as an emoji symbol. | |
| 4 | +# Inspired by Andre Torrez' "Put A Burger In Your Shell" | |
| 5 | +# https://notes.torrez.org/2013/04/put-a-burger-in-your-shell.html | |
| 6 | +# AUTHOR: Alexis Hildebrandt (afh[at]surryhill.net) | |
| 7 | +# VERSION: 1.0.0 | |
| 8 | +# ----------------------------------------------------------------------------- | |
| 9 | + | |
| 10 | +function emoji-clock() { | |
| 11 | + # Add 15 minutes to the current time and save the value as $minutes. | |
| 12 | + (( minutes = $(date '+%M') + 15 )) | |
| 13 | + (( hour = $(date '+%I') + minutes / 60 )) | |
| 14 | + # make sure minutes and hours don't exceed 60 nor 12 respectively | |
| 15 | + (( minutes %= 60 )); (( hour %= 12 )) | |
| 16 | + | |
| 17 | + case $hour in | |
| 18 | + 0) clock="๐"; [ $minutes -ge 30 ] && clock="๐ง";; | |
| 19 | + 1) clock="๐"; [ $minutes -ge 30 ] && clock="๐";; | |
| 20 | + 2) clock="๐"; [ $minutes -ge 30 ] && clock="๐";; | |
| 21 | + 3) clock="๐"; [ $minutes -ge 30 ] && clock="๐";; | |
| 22 | + 4) clock="๐"; [ $minutes -ge 30 ] && clock="๐";; | |
| 23 | + 5) clock="๐"; [ $minutes -ge 30 ] && clock="๐ ";; | |
| 24 | + 6) clock="๐"; [ $minutes -ge 30 ] && clock="๐ก";; | |
| 25 | + 7) clock="๐"; [ $minutes -ge 30 ] && clock="๐ข";; | |
| 26 | + 8) clock="๐"; [ $minutes -ge 30 ] && clock="๐ฃ";; | |
| 27 | + 9) clock="๐"; [ $minutes -ge 30 ] && clock="๐ค";; | |
| 28 | + 10) clock="๐"; [ $minutes -ge 30 ] && clock="๐ฅ";; | |
| 29 | + 11) clock="๐"; [ $minutes -ge 30 ] && clock="๐ฆ";; | |
| 30 | + *) clock="โ";; | |
| 31 | + esac | |
| 32 | + echo $clock | |
| 33 | +} |
+127-0.oh-my-zsh/plugins/emoji/README.md
| @@ -0,0 +1,127 @@ | ||
| 1 | +# emoji plugin | |
| 2 | + | |
| 3 | +Support for conveniently working with Unicode emoji in Zsh. | |
| 4 | + | |
| 5 | +## Features | |
| 6 | + | |
| 7 | +This plugin provides support for working with Unicode emoji characters in `zsh` using human-readable identifiers. It provides global variables which map emoji names to the actual characters, country names to their flags, and some named groupings of emoji. It also provides associated functions for displaying them. | |
| 8 | + | |
| 9 | +#### Variables | |
| 10 | + | |
| 11 | +Variable | Description | |
| 12 | +----------------- | -------------------------------- | |
| 13 | + $emoji | Maps emoji names to characters (except flags) | |
| 14 | + $emoji_flags | Maps country names to flag characters (using region indicators) | |
| 15 | + $emoji_groups | Named groups of emoji. Keys are group names; values are whitespace-separated lists of character names | |
| 16 | + | |
| 17 | +You may define new emoji groups at run time by modifying `$emoji_groups`. The special group name `all` is reserved for use by the plugin. You should not modify `$emoji` or `$emoji_flags`. | |
| 18 | + | |
| 19 | +#### Functions | |
| 20 | + | |
| 21 | +Function | Description | |
| 22 | +---------------- | ------------------------------- | |
| 23 | + random_emoji | Prints a random emoji character | |
| 24 | + display_emoji | Displays emoji, along with their names | |
| 25 | + | |
| 26 | +## Usage and Examples | |
| 27 | + | |
| 28 | +To output a specific emoji, use: | |
| 29 | +``` | |
| 30 | +$> echo $emoji[<name>] | |
| 31 | +``` | |
| 32 | +E.g.: | |
| 33 | +``` | |
| 34 | +$> echo $emoji[mouse_face] | |
| 35 | +``` | |
| 36 | + | |
| 37 | +To output a random emoji, use: | |
| 38 | +``` | |
| 39 | +$> random_emoji | |
| 40 | +``` | |
| 41 | +To output a random emoji from a particular group, use: | |
| 42 | +``` | |
| 43 | +$> random_emoji <group> | |
| 44 | +``` | |
| 45 | +E.g.: | |
| 46 | +``` | |
| 47 | +$> random_emoji fruits | |
| 48 | +$> random_emoji animals | |
| 49 | +$> random_emoji vehicles | |
| 50 | +$> random_emoji faces | |
| 51 | +``` | |
| 52 | + | |
| 53 | +The defined group names can be found with `echo ${(k)emoji_groups}`. | |
| 54 | + | |
| 55 | +To list all available emoji with their names, use: | |
| 56 | +``` | |
| 57 | +$> display_emoji | |
| 58 | +$> display_emoji faces | |
| 59 | +$> display_emoji people | |
| 60 | +``` | |
| 61 | + | |
| 62 | +To use emoji in a prompt: | |
| 63 | +``` | |
| 64 | +PROMPT="$emoji[penguin] > "" | |
| 65 | +PROMPT='$(random_emoji fruits) > ' | |
| 66 | +surfer=$emoji[surfer] | |
| 67 | +PROMPT="$surfer > " | |
| 68 | +``` | |
| 69 | + | |
| 70 | +## Technical Details | |
| 71 | + | |
| 72 | +The emoji names and codes are sourced from Unicode Technical Report \#51, which provides information on emoji support in Unicode. It can be found at https://www.unicode.org/reports/tr51/index.html. | |
| 73 | + | |
| 74 | +The group definitions are added by this OMZ plugin. They are not based on external definitions. | |
| 75 | + | |
| 76 | +The values in the `$emoji*` maps are the emoji characters themselves, not escape sequences or other forms that require interpretation. They can be used in any context and do not require escape sequence support from commands like `echo` or `print`. | |
| 77 | + | |
| 78 | +The emoji in the main `$emoji` map are standalone character sequences which can all be output on their own, without worrying about combining characters. The values may actually be multi-code-point sequences, instead of a single code point, and may include combining characters in those sequences. But they're arranged so their effects do not extend beyond that sequence. | |
| 79 | + | |
| 80 | +The exception to this is the skin tone / hair style variation selectors. These are included in the main `$emoji` map because they can be displayed on their own, as well as used as combining characters. (If they follow a character that is not one of the emoji characters they combine with, they are displayed as color swatches.) | |
| 81 | + | |
| 82 | + | |
| 83 | +## Experimental Features | |
| 84 | + | |
| 85 | +This defines some additional variables and functions, but these are experimental and subject to change at any time. You shouldn't rely on them being available. They're mostly for the use of emoji plugin developers to help decide what to include in future revisions. | |
| 86 | + | |
| 87 | +Variables: | |
| 88 | + | |
| 89 | +Variable | Description | |
| 90 | +----------------- | -------------------------------- | |
| 91 | + $emoji_skintone | Skin tone modifiers (from Unicode 8.0) | |
| 92 | + | |
| 93 | + | |
| 94 | +#### Skin Tone Variation Selection | |
| 95 | + | |
| 96 | +This includes experimental support for the skin tone Variation Selectors introduced with Unicode 8.0, which let you select different skin tones for emoji involving humans. | |
| 97 | + | |
| 98 | +NOTE: This really is experimental. The skin tone selectors are a relatively new feature and may not be supported by all systems. And the support in this plugin is a work in progress. It may not work in all places. In fact, I haven't gotten it to work anywhere yet. -apjanke | |
| 99 | + | |
| 100 | +The "variation selectors" are combining characters which change the appearance of the preceding character. A variation selector character can be output immediately following a human emoji to change its skin tone color. You can also output a variation selector on its own to display a color swatch of that skin tone. | |
| 101 | + | |
| 102 | +The `$emoji_skintone` associative array maps skin tone IDs to the variation selector characters. To use one, output it immediately following a smiley or other human emoji. | |
| 103 | + | |
| 104 | +``` | |
| 105 | +echo $emoji[waving_hand]$emoji_skintone[5] | |
| 106 | +``` | |
| 107 | + | |
| 108 | +Note that `$emoji_skintone` is an associative array, and its keys are the *names* of "Fitzpatrick Skin Type" groups, not linear indexes into a normal array. The names are `1_2`, `3`, `4`, `5`, and `6`. (Types 1 and 2 are combined into a single color.) See the [Diversity section in Unicode TR 51](https://www.unicode.org/reports/tr51/index.html#Diversity) for details. | |
| 109 | + | |
| 110 | +#### Gemoji support | |
| 111 | + | |
| 112 | +The [gemoji project](https://github.com/github/gemoji) seems to be the de facto main source for short names and other emoji-related metadata that isn't included in the official Unicode reports. So, our list of emojis incorporates some of their aliases to make your life more convenient: | |
| 113 | + | |
| 114 | +``` | |
| 115 | +echo $emoji[grinning_face_with_smiling_eyes] | |
| 116 | +echo $emoji[smile] | |
| 117 | +``` | |
| 118 | + | |
| 119 | +These two commands yield the same emoji (๐). The first name is the official one, in the Unicode reference, and the second one is the alias that was in Gemoji's database. | |
| 120 | + | |
| 121 | +## TODO | |
| 122 | + | |
| 123 | +These are things that could be enhanced in future revisions of the plugin. | |
| 124 | + | |
| 125 | +* Incorporate CLDR data for ordering and groupings | |
| 126 | +* Short :bracket: style names (from gemoji) | |
| 127 | +* ZWJ combining function? |
+7274-0.oh-my-zsh/plugins/emoji/emoji-char-definitions.zsh
| @@ -0,0 +1,7274 @@ | ||
| 1 | + | |
| 2 | +# emoji-char-definitions.zsh - Emoji definitions for oh-my-zsh emoji plugin | |
| 3 | +# | |
| 4 | +# This file is auto-generated by update_emoji.py. Do not edit it manually. | |
| 5 | +# | |
| 6 | +# This contains the definition for: | |
| 7 | +# $emoji - which maps character names to Unicode characters | |
| 8 | +# $emoji_flags - maps country names to Unicode flag characters using region | |
| 9 | +# indicators | |
| 10 | +# $emoji_mod - maps modifier components to Unicode characters | |
| 11 | +# $emoji_groups - a single associative array to avoid cluttering up the | |
| 12 | +# global namespace, and to allow adding additional group | |
| 13 | +# definitions at run time. The keys are the group names, and | |
| 14 | +# the values are whitespace-separated lists of emoji | |
| 15 | +# character names. | |
| 16 | + | |
| 17 | +# Main emoji | |
| 18 | +typeset -gAH emoji | |
| 19 | +# National flags | |
| 20 | +typeset -gAH emoji_flags | |
| 21 | +# Combining modifiers | |
| 22 | +typeset -gAH emoji_mod | |
| 23 | +# Emoji groups | |
| 24 | +typeset -gAH emoji_groups | |
| 25 | +emoji[grinning_face]=$'\U1F600' | |
| 26 | +emoji[grinning]=$'\U1F600' | |
| 27 | +emoji[grinning_face_with_big_eyes]=$'\U1F603' | |
| 28 | +emoji[smiley]=$'\U1F603' | |
| 29 | +emoji[grinning_face_with_smiling_eyes]=$'\U1F604' | |
| 30 | +emoji[smile]=$'\U1F604' | |
| 31 | +emoji[beaming_face_with_smiling_eyes]=$'\U1F601' | |
| 32 | +emoji[grin]=$'\U1F601' | |
| 33 | +emoji[grinning_squinting_face]=$'\U1F606' | |
| 34 | +emoji[laughing]=$'\U1F606' | |
| 35 | +emoji[satisfied]=$'\U1F606' | |
| 36 | +emoji[grinning_face_with_sweat]=$'\U1F605' | |
| 37 | +emoji[sweat_smile]=$'\U1F605' | |
| 38 | +emoji[rolling_on_the_floor_laughing]=$'\U1F923' | |
| 39 | +emoji[rofl]=$'\U1F923' | |
| 40 | +emoji[face_with_tears_of_joy]=$'\U1F602' | |
| 41 | +emoji[joy]=$'\U1F602' | |
| 42 | +emoji[slightly_smiling_face]=$'\U1F642' | |
| 43 | +emoji[upside_down_face]=$'\U1F643' | |
| 44 | +emoji[winking_face]=$'\U1F609' | |
| 45 | +emoji[wink]=$'\U1F609' | |
| 46 | +emoji[smiling_face_with_smiling_eyes]=$'\U1F60A' | |
| 47 | +emoji[blush]=$'\U1F60A' | |
| 48 | +emoji[smiling_face_with_halo]=$'\U1F607' | |
| 49 | +emoji[innocent]=$'\U1F607' | |
| 50 | +emoji[smiling_face_with_hearts]=$'\U1F970' | |
| 51 | +emoji[smiling_face_with_three_hearts]=$'\U1F970' | |
| 52 | +emoji[smiling_face_with_heart_eyes]=$'\U1F60D' | |
| 53 | +emoji[heart_eyes]=$'\U1F60D' | |
| 54 | +emoji[star_struck]=$'\U1F929' | |
| 55 | +emoji[face_blowing_a_kiss]=$'\U1F618' | |
| 56 | +emoji[kissing_heart]=$'\U1F618' | |
| 57 | +emoji[kissing_face]=$'\U1F617' | |
| 58 | +emoji[kissing]=$'\U1F617' | |
| 59 | +emoji[smiling_face]=$'\U263A\UFE0F' | |
| 60 | +emoji[relaxed]=$'\U263A\UFE0F' | |
| 61 | +emoji[smiling_face_unqualified]=$'\U263A' | |
| 62 | +emoji[kissing_face_with_closed_eyes]=$'\U1F61A' | |
| 63 | +emoji[kissing_closed_eyes]=$'\U1F61A' | |
| 64 | +emoji[kissing_face_with_smiling_eyes]=$'\U1F619' | |
| 65 | +emoji[kissing_smiling_eyes]=$'\U1F619' | |
| 66 | +emoji[face_savoring_food]=$'\U1F60B' | |
| 67 | +emoji[yum]=$'\U1F60B' | |
| 68 | +emoji[face_with_tongue]=$'\U1F61B' | |
| 69 | +emoji[stuck_out_tongue]=$'\U1F61B' | |
| 70 | +emoji[winking_face_with_tongue]=$'\U1F61C' | |
| 71 | +emoji[stuck_out_tongue_winking_eye]=$'\U1F61C' | |
| 72 | +emoji[zany_face]=$'\U1F92A' | |
| 73 | +emoji[squinting_face_with_tongue]=$'\U1F61D' | |
| 74 | +emoji[stuck_out_tongue_closed_eyes]=$'\U1F61D' | |
| 75 | +emoji[money_mouth_face]=$'\U1F911' | |
| 76 | +emoji[hugging_face]=$'\U1F917' | |
| 77 | +emoji[hugs]=$'\U1F917' | |
| 78 | +emoji[face_with_hand_over_mouth]=$'\U1F92D' | |
| 79 | +emoji[hand_over_mouth]=$'\U1F92D' | |
| 80 | +emoji[shushing_face]=$'\U1F92B' | |
| 81 | +emoji[thinking_face]=$'\U1F914' | |
| 82 | +emoji[thinking]=$'\U1F914' | |
| 83 | +emoji[zipper_mouth_face]=$'\U1F910' | |
| 84 | +emoji[face_with_raised_eyebrow]=$'\U1F928' | |
| 85 | +emoji[raised_eyebrow]=$'\U1F928' | |
| 86 | +emoji[neutral_face]=$'\U1F610' | |
| 87 | +emoji[expressionless_face]=$'\U1F611' | |
| 88 | +emoji[expressionless]=$'\U1F611' | |
| 89 | +emoji[face_without_mouth]=$'\U1F636' | |
| 90 | +emoji[no_mouth]=$'\U1F636' | |
| 91 | +emoji[smirking_face]=$'\U1F60F' | |
| 92 | +emoji[smirk]=$'\U1F60F' | |
| 93 | +emoji[unamused_face]=$'\U1F612' | |
| 94 | +emoji[unamused]=$'\U1F612' | |
| 95 | +emoji[face_with_rolling_eyes]=$'\U1F644' | |
| 96 | +emoji[roll_eyes]=$'\U1F644' | |
| 97 | +emoji[grimacing_face]=$'\U1F62C' | |
| 98 | +emoji[grimacing]=$'\U1F62C' | |
| 99 | +emoji[lying_face]=$'\U1F925' | |
| 100 | +emoji[relieved_face]=$'\U1F60C' | |
| 101 | +emoji[relieved]=$'\U1F60C' | |
| 102 | +emoji[pensive_face]=$'\U1F614' | |
| 103 | +emoji[pensive]=$'\U1F614' | |
| 104 | +emoji[sleepy_face]=$'\U1F62A' | |
| 105 | +emoji[sleepy]=$'\U1F62A' | |
| 106 | +emoji[drooling_face]=$'\U1F924' | |
| 107 | +emoji[sleeping_face]=$'\U1F634' | |
| 108 | +emoji[sleeping]=$'\U1F634' | |
| 109 | +emoji[face_with_medical_mask]=$'\U1F637' | |
| 110 | +emoji[mask]=$'\U1F637' | |
| 111 | +emoji[face_with_thermometer]=$'\U1F912' | |
| 112 | +emoji[face_with_head_bandage]=$'\U1F915' | |
| 113 | +emoji[nauseated_face]=$'\U1F922' | |
| 114 | +emoji[face_vomiting]=$'\U1F92E' | |
| 115 | +emoji[vomiting_face]=$'\U1F92E' | |
| 116 | +emoji[sneezing_face]=$'\U1F927' | |
| 117 | +emoji[hot_face]=$'\U1F975' | |
| 118 | +emoji[cold_face]=$'\U1F976' | |
| 119 | +emoji[woozy_face]=$'\U1F974' | |
| 120 | +emoji[dizzy_face]=$'\U1F635' | |
| 121 | +emoji[exploding_head]=$'\U1F92F' | |
| 122 | +emoji[cowboy_hat_face]=$'\U1F920' | |
| 123 | +emoji[partying_face]=$'\U1F973' | |
| 124 | +emoji[smiling_face_with_sunglasses]=$'\U1F60E' | |
| 125 | +emoji[nerd_face]=$'\U1F913' | |
| 126 | +emoji[face_with_monocle]=$'\U1F9D0' | |
| 127 | +emoji[monocle_face]=$'\U1F9D0' | |
| 128 | +emoji[confused_face]=$'\U1F615' | |
| 129 | +emoji[confused]=$'\U1F615' | |
| 130 | +emoji[worried_face]=$'\U1F61F' | |
| 131 | +emoji[worried]=$'\U1F61F' | |
| 132 | +emoji[slightly_frowning_face]=$'\U1F641' | |
| 133 | +emoji[slightly_frowning_face_1]=$'\U2639\UFE0F' | |
| 134 | +emoji[frowning_face_unqualified]=$'\U2639' | |
| 135 | +emoji[frowning_face]=$'\U2639' | |
| 136 | +emoji[face_with_open_mouth]=$'\U1F62E' | |
| 137 | +emoji[open_mouth]=$'\U1F62E' | |
| 138 | +emoji[hushed_face]=$'\U1F62F' | |
| 139 | +emoji[hushed]=$'\U1F62F' | |
| 140 | +emoji[astonished_face]=$'\U1F632' | |
| 141 | +emoji[astonished]=$'\U1F632' | |
| 142 | +emoji[flushed_face]=$'\U1F633' | |
| 143 | +emoji[flushed]=$'\U1F633' | |
| 144 | +emoji[pleading_face]=$'\U1F97A' | |
| 145 | +emoji[frowning_face_with_open_mouth]=$'\U1F626' | |
| 146 | +emoji[frowning]=$'\U1F626' | |
| 147 | +emoji[anguished_face]=$'\U1F627' | |
| 148 | +emoji[anguished]=$'\U1F627' | |
| 149 | +emoji[fearful_face]=$'\U1F628' | |
| 150 | +emoji[fearful]=$'\U1F628' | |
| 151 | +emoji[anxious_face_with_sweat]=$'\U1F630' | |
| 152 | +emoji[cold_sweat]=$'\U1F630' | |
| 153 | +emoji[sad_but_relieved_face]=$'\U1F625' | |
| 154 | +emoji[disappointed_relieved]=$'\U1F625' | |
| 155 | +emoji[crying_face]=$'\U1F622' | |
| 156 | +emoji[cry]=$'\U1F622' | |
| 157 | +emoji[loudly_crying_face]=$'\U1F62D' | |
| 158 | +emoji[sob]=$'\U1F62D' | |
| 159 | +emoji[face_screaming_in_fear]=$'\U1F631' | |
| 160 | +emoji[scream]=$'\U1F631' | |
| 161 | +emoji[confounded_face]=$'\U1F616' | |
| 162 | +emoji[confounded]=$'\U1F616' | |
| 163 | +emoji[persevering_face]=$'\U1F623' | |
| 164 | +emoji[persevere]=$'\U1F623' | |
| 165 | +emoji[disappointed_face]=$'\U1F61E' | |
| 166 | +emoji[disappointed]=$'\U1F61E' | |
| 167 | +emoji[downcast_face_with_sweat]=$'\U1F613' | |
| 168 | +emoji[sweat]=$'\U1F613' | |
| 169 | +emoji[weary_face]=$'\U1F629' | |
| 170 | +emoji[weary]=$'\U1F629' | |
| 171 | +emoji[tired_face]=$'\U1F62B' | |
| 172 | +emoji[yawning_face]=$'\U1F971' | |
| 173 | +emoji[face_with_steam_from_nose]=$'\U1F624' | |
| 174 | +emoji[triumph]=$'\U1F624' | |
| 175 | +emoji[pouting_face]=$'\U1F621' | |
| 176 | +emoji[rage]=$'\U1F621' | |
| 177 | +emoji[pout]=$'\U1F621' | |
| 178 | +emoji[angry_face]=$'\U1F620' | |
| 179 | +emoji[angry]=$'\U1F620' | |
| 180 | +emoji[face_with_symbols_on_mouth]=$'\U1F92C' | |
| 181 | +emoji[cursing_face]=$'\U1F92C' | |
| 182 | +emoji[smiling_face_with_horns]=$'\U1F608' | |
| 183 | +emoji[smiling_imp]=$'\U1F608' | |
| 184 | +emoji[angry_face_with_horns]=$'\U1F47F' | |
| 185 | +emoji[imp]=$'\U1F47F' | |
| 186 | +emoji[skull]=$'\U1F480' | |
| 187 | +emoji[skull_and_crossbones]=$'\U2620\UFE0F' | |
| 188 | +emoji[skull_and_crossbones_unqualified]=$'\U2620' | |
| 189 | +emoji[pile_of_poo]=$'\U1F4A9' | |
| 190 | +emoji[hankey]=$'\U1F4A9' | |
| 191 | +emoji[poop]=$'\U1F4A9' | |
| 192 | +emoji[shit]=$'\U1F4A9' | |
| 193 | +emoji[clown_face]=$'\U1F921' | |
| 194 | +emoji[ogre]=$'\U1F479' | |
| 195 | +emoji[japanese_ogre]=$'\U1F479' | |
| 196 | +emoji[goblin]=$'\U1F47A' | |
| 197 | +emoji[japanese_goblin]=$'\U1F47A' | |
| 198 | +emoji[ghost]=$'\U1F47B' | |
| 199 | +emoji[alien]=$'\U1F47D' | |
| 200 | +emoji[alien_monster]=$'\U1F47E' | |
| 201 | +emoji[space_invader]=$'\U1F47E' | |
| 202 | +emoji[robot]=$'\U1F916' | |
| 203 | +emoji[grinning_cat]=$'\U1F63A' | |
| 204 | +emoji[smiley_cat]=$'\U1F63A' | |
| 205 | +emoji[grinning_cat_with_smiling_eyes]=$'\U1F638' | |
| 206 | +emoji[smile_cat]=$'\U1F638' | |
| 207 | +emoji[cat_with_tears_of_joy]=$'\U1F639' | |
| 208 | +emoji[joy_cat]=$'\U1F639' | |
| 209 | +emoji[smiling_cat_with_heart_eyes]=$'\U1F63B' | |
| 210 | +emoji[heart_eyes_cat]=$'\U1F63B' | |
| 211 | +emoji[cat_with_wry_smile]=$'\U1F63C' | |
| 212 | +emoji[smirk_cat]=$'\U1F63C' | |
| 213 | +emoji[kissing_cat]=$'\U1F63D' | |
| 214 | +emoji[weary_cat]=$'\U1F640' | |
| 215 | +emoji[scream_cat]=$'\U1F640' | |
| 216 | +emoji[crying_cat]=$'\U1F63F' | |
| 217 | +emoji[crying_cat_face]=$'\U1F63F' | |
| 218 | +emoji[pouting_cat]=$'\U1F63E' | |
| 219 | +emoji[see_no_evil_monkey]=$'\U1F648' | |
| 220 | +emoji[see_no_evil]=$'\U1F648' | |
| 221 | +emoji[hear_no_evil_monkey]=$'\U1F649' | |
| 222 | +emoji[hear_no_evil]=$'\U1F649' | |
| 223 | +emoji[speak_no_evil_monkey]=$'\U1F64A' | |
| 224 | +emoji[speak_no_evil]=$'\U1F64A' | |
| 225 | +emoji[kiss_mark]=$'\U1F48B' | |
| 226 | +emoji[love_letter]=$'\U1F48C' | |
| 227 | +emoji[heart_with_arrow]=$'\U1F498' | |
| 228 | +emoji[cupid]=$'\U1F498' | |
| 229 | +emoji[heart_with_ribbon]=$'\U1F49D' | |
| 230 | +emoji[gift_heart]=$'\U1F49D' | |
| 231 | +emoji[sparkling_heart]=$'\U1F496' | |
| 232 | +emoji[growing_heart]=$'\U1F497' | |
| 233 | +emoji[heartpulse]=$'\U1F497' | |
| 234 | +emoji[beating_heart]=$'\U1F493' | |
| 235 | +emoji[heartbeat]=$'\U1F493' | |
| 236 | +emoji[revolving_hearts]=$'\U1F49E' | |
| 237 | +emoji[two_hearts]=$'\U1F495' | |
| 238 | +emoji[heart_decoration]=$'\U1F49F' | |
| 239 | +emoji[heart_exclamation]=$'\U2763\UFE0F' | |
| 240 | +emoji[heavy_heart_exclamation]=$'\U2763\UFE0F' | |
| 241 | +emoji[heart_exclamation_unqualified]=$'\U2763' | |
| 242 | +emoji[broken_heart]=$'\U1F494' | |
| 243 | +emoji[red_heart]=$'\U2764\UFE0F' | |
| 244 | +emoji[heart]=$'\U2764\UFE0F' | |
| 245 | +emoji[red_heart_unqualified]=$'\U2764' | |
| 246 | +emoji[orange_heart]=$'\U1F9E1' | |
| 247 | +emoji[yellow_heart]=$'\U1F49B' | |
| 248 | +emoji[green_heart]=$'\U1F49A' | |
| 249 | +emoji[blue_heart]=$'\U1F499' | |
| 250 | +emoji[purple_heart]=$'\U1F49C' | |
| 251 | +emoji[brown_heart]=$'\U1F90E' | |
| 252 | +emoji[black_heart]=$'\U1F5A4' | |
| 253 | +emoji[white_heart]=$'\U1F90D' | |
| 254 | +emoji[hundred_points]=$'\U1F4AF' | |
| 255 | +emoji[100]=$'\U1F4AF' | |
| 256 | +emoji[anger_symbol]=$'\U1F4A2' | |
| 257 | +emoji[anger]=$'\U1F4A2' | |
| 258 | +emoji[collision]=$'\U1F4A5' | |
| 259 | +emoji[boom]=$'\U1F4A5' | |
| 260 | +emoji[dizzy]=$'\U1F4AB' | |
| 261 | +emoji[sweat_droplets]=$'\U1F4A6' | |
| 262 | +emoji[sweat_drops]=$'\U1F4A6' | |
| 263 | +emoji[dashing_away]=$'\U1F4A8' | |
| 264 | +emoji[dash]=$'\U1F4A8' | |
| 265 | +emoji[hole]=$'\U1F573\UFE0F' | |
| 266 | +emoji[hole_unqualified]=$'\U1F573' | |
| 267 | +emoji[bomb]=$'\U1F4A3' | |
| 268 | +emoji[speech_balloon]=$'\U1F4AC' | |
| 269 | +emoji[eye_in_speech_bubble]=$'\U1F441\UFE0F\U200D\U1F5E8\UFE0F' | |
| 270 | +emoji[eye_speech_bubble]=$'\U1F441\UFE0F\U200D\U1F5E8\UFE0F' | |
| 271 | +emoji[eye_in_speech_bubble_unqualified]=$'\U1F441\U200D\U1F5E8\UFE0F' | |
| 272 | +emoji[eye_in_speech_bubble_unqualified_1]=$'\U1F441\UFE0F\U200D\U1F5E8' | |
| 273 | +emoji[eye_in_speech_bubble_unqualified_2]=$'\U1F441\U200D\U1F5E8' | |
| 274 | +emoji[left_speech_bubble]=$'\U1F5E8\UFE0F' | |
| 275 | +emoji[left_speech_bubble_unqualified]=$'\U1F5E8' | |
| 276 | +emoji[right_anger_bubble]=$'\U1F5EF\UFE0F' | |
| 277 | +emoji[right_anger_bubble_unqualified]=$'\U1F5EF' | |
| 278 | +emoji[thought_balloon]=$'\U1F4AD' | |
| 279 | +emoji[zzz]=$'\U1F4A4' | |
| 280 | +emoji[waving_hand]=$'\U1F44B' | |
| 281 | +emoji[wave]=$'\U1F44B' | |
| 282 | +emoji[waving_hand_light_skin_tone]=$'\U1F44B\U1F3FB' | |
| 283 | +emoji[waving_hand_medium_light_skin_tone]=$'\U1F44B\U1F3FC' | |
| 284 | +emoji[waving_hand_medium_skin_tone]=$'\U1F44B\U1F3FD' | |
| 285 | +emoji[waving_hand_medium_dark_skin_tone]=$'\U1F44B\U1F3FE' | |
| 286 | +emoji[waving_hand_dark_skin_tone]=$'\U1F44B\U1F3FF' | |
| 287 | +emoji[raised_back_of_hand]=$'\U1F91A' | |
| 288 | +emoji[raised_back_of_hand_light_skin_tone]=$'\U1F91A\U1F3FB' | |
| 289 | +emoji[raised_back_of_hand_medium_light_skin_tone]=$'\U1F91A\U1F3FC' | |
| 290 | +emoji[raised_back_of_hand_medium_skin_tone]=$'\U1F91A\U1F3FD' | |
| 291 | +emoji[raised_back_of_hand_medium_dark_skin_tone]=$'\U1F91A\U1F3FE' | |
| 292 | +emoji[raised_back_of_hand_dark_skin_tone]=$'\U1F91A\U1F3FF' | |
| 293 | +emoji[hand_with_fingers_splayed]=$'\U1F590\UFE0F' | |
| 294 | +emoji[hand_with_fingers_splayed_unqualified]=$'\U1F590' | |
| 295 | +emoji[raised_hand_with_fingers_splayed]=$'\U1F590' | |
| 296 | +emoji[hand_with_fingers_splayed_light_skin_tone]=$'\U1F590\U1F3FB' | |
| 297 | +emoji[hand_with_fingers_splayed_medium_light_skin_tone]=$'\U1F590\U1F3FC' | |
| 298 | +emoji[hand_with_fingers_splayed_medium_skin_tone]=$'\U1F590\U1F3FD' | |
| 299 | +emoji[hand_with_fingers_splayed_medium_dark_skin_tone]=$'\U1F590\U1F3FE' | |
| 300 | +emoji[hand_with_fingers_splayed_dark_skin_tone]=$'\U1F590\U1F3FF' | |
| 301 | +emoji[raised_hand]=$'\U270B' | |
| 302 | +emoji[hand]=$'\U270B' | |
| 303 | +emoji[raised_hand_light_skin_tone]=$'\U270B\U1F3FB' | |
| 304 | +emoji[raised_hand_medium_light_skin_tone]=$'\U270B\U1F3FC' | |
| 305 | +emoji[raised_hand_medium_skin_tone]=$'\U270B\U1F3FD' | |
| 306 | +emoji[raised_hand_medium_dark_skin_tone]=$'\U270B\U1F3FE' | |
| 307 | +emoji[raised_hand_dark_skin_tone]=$'\U270B\U1F3FF' | |
| 308 | +emoji[vulcan_salute]=$'\U1F596' | |
| 309 | +emoji[vulcan_salute_light_skin_tone]=$'\U1F596\U1F3FB' | |
| 310 | +emoji[vulcan_salute_medium_light_skin_tone]=$'\U1F596\U1F3FC' | |
| 311 | +emoji[vulcan_salute_medium_skin_tone]=$'\U1F596\U1F3FD' | |
| 312 | +emoji[vulcan_salute_medium_dark_skin_tone]=$'\U1F596\U1F3FE' | |
| 313 | +emoji[vulcan_salute_dark_skin_tone]=$'\U1F596\U1F3FF' | |
| 314 | +emoji[OK_hand]=$'\U1F44C' | |
| 315 | +emoji[ok_hand]=$'\U1F44C' | |
| 316 | +emoji[OK_hand_light_skin_tone]=$'\U1F44C\U1F3FB' | |
| 317 | +emoji[OK_hand_medium_light_skin_tone]=$'\U1F44C\U1F3FC' | |
| 318 | +emoji[OK_hand_medium_skin_tone]=$'\U1F44C\U1F3FD' | |
| 319 | +emoji[OK_hand_medium_dark_skin_tone]=$'\U1F44C\U1F3FE' | |
| 320 | +emoji[OK_hand_dark_skin_tone]=$'\U1F44C\U1F3FF' | |
| 321 | +emoji[pinching_hand]=$'\U1F90F' | |
| 322 | +emoji[pinching_hand_light_skin_tone]=$'\U1F90F\U1F3FB' | |
| 323 | +emoji[pinching_hand_medium_light_skin_tone]=$'\U1F90F\U1F3FC' | |
| 324 | +emoji[pinching_hand_medium_skin_tone]=$'\U1F90F\U1F3FD' | |
| 325 | +emoji[pinching_hand_medium_dark_skin_tone]=$'\U1F90F\U1F3FE' | |
| 326 | +emoji[pinching_hand_dark_skin_tone]=$'\U1F90F\U1F3FF' | |
| 327 | +emoji[victory_hand]=$'\U270C\UFE0F' | |
| 328 | +emoji[v]=$'\U270C\UFE0F' | |
| 329 | +emoji[victory_hand_unqualified]=$'\U270C' | |
| 330 | +emoji[victory_hand_light_skin_tone]=$'\U270C\U1F3FB' | |
| 331 | +emoji[victory_hand_medium_light_skin_tone]=$'\U270C\U1F3FC' | |
| 332 | +emoji[victory_hand_medium_skin_tone]=$'\U270C\U1F3FD' | |
| 333 | +emoji[victory_hand_medium_dark_skin_tone]=$'\U270C\U1F3FE' | |
| 334 | +emoji[victory_hand_dark_skin_tone]=$'\U270C\U1F3FF' | |
| 335 | +emoji[crossed_fingers]=$'\U1F91E' | |
| 336 | +emoji[crossed_fingers_light_skin_tone]=$'\U1F91E\U1F3FB' | |
| 337 | +emoji[crossed_fingers_medium_light_skin_tone]=$'\U1F91E\U1F3FC' | |
| 338 | +emoji[crossed_fingers_medium_skin_tone]=$'\U1F91E\U1F3FD' | |
| 339 | +emoji[crossed_fingers_medium_dark_skin_tone]=$'\U1F91E\U1F3FE' | |
| 340 | +emoji[crossed_fingers_dark_skin_tone]=$'\U1F91E\U1F3FF' | |
| 341 | +emoji[love_you_gesture]=$'\U1F91F' | |
| 342 | +emoji[love_you_gesture_light_skin_tone]=$'\U1F91F\U1F3FB' | |
| 343 | +emoji[love_you_gesture_medium_light_skin_tone]=$'\U1F91F\U1F3FC' | |
| 344 | +emoji[love_you_gesture_medium_skin_tone]=$'\U1F91F\U1F3FD' | |
| 345 | +emoji[love_you_gesture_medium_dark_skin_tone]=$'\U1F91F\U1F3FE' | |
| 346 | +emoji[love_you_gesture_dark_skin_tone]=$'\U1F91F\U1F3FF' | |
| 347 | +emoji[sign_of_the_horns]=$'\U1F918' | |
| 348 | +emoji[metal]=$'\U1F918' | |
| 349 | +emoji[sign_of_the_horns_light_skin_tone]=$'\U1F918\U1F3FB' | |
| 350 | +emoji[sign_of_the_horns_medium_light_skin_tone]=$'\U1F918\U1F3FC' | |
| 351 | +emoji[sign_of_the_horns_medium_skin_tone]=$'\U1F918\U1F3FD' | |
| 352 | +emoji[sign_of_the_horns_medium_dark_skin_tone]=$'\U1F918\U1F3FE' | |
| 353 | +emoji[sign_of_the_horns_dark_skin_tone]=$'\U1F918\U1F3FF' | |
| 354 | +emoji[call_me_hand]=$'\U1F919' | |
| 355 | +emoji[call_me_hand_light_skin_tone]=$'\U1F919\U1F3FB' | |
| 356 | +emoji[call_me_hand_medium_light_skin_tone]=$'\U1F919\U1F3FC' | |
| 357 | +emoji[call_me_hand_medium_skin_tone]=$'\U1F919\U1F3FD' | |
| 358 | +emoji[call_me_hand_medium_dark_skin_tone]=$'\U1F919\U1F3FE' | |
| 359 | +emoji[call_me_hand_dark_skin_tone]=$'\U1F919\U1F3FF' | |
| 360 | +emoji[backhand_index_pointing_left]=$'\U1F448' | |
| 361 | +emoji[point_left]=$'\U1F448' | |
| 362 | +emoji[backhand_index_pointing_left_light_skin_tone]=$'\U1F448\U1F3FB' | |
| 363 | +emoji[backhand_index_pointing_left_medium_light_skin_tone]=$'\U1F448\U1F3FC' | |
| 364 | +emoji[backhand_index_pointing_left_medium_skin_tone]=$'\U1F448\U1F3FD' | |
| 365 | +emoji[backhand_index_pointing_left_medium_dark_skin_tone]=$'\U1F448\U1F3FE' | |
| 366 | +emoji[backhand_index_pointing_left_dark_skin_tone]=$'\U1F448\U1F3FF' | |
| 367 | +emoji[backhand_index_pointing_right]=$'\U1F449' | |
| 368 | +emoji[point_right]=$'\U1F449' | |
| 369 | +emoji[backhand_index_pointing_right_light_skin_tone]=$'\U1F449\U1F3FB' | |
| 370 | +emoji[backhand_index_pointing_right_medium_light_skin_tone]=$'\U1F449\U1F3FC' | |
| 371 | +emoji[backhand_index_pointing_right_medium_skin_tone]=$'\U1F449\U1F3FD' | |
| 372 | +emoji[backhand_index_pointing_right_medium_dark_skin_tone]=$'\U1F449\U1F3FE' | |
| 373 | +emoji[backhand_index_pointing_right_dark_skin_tone]=$'\U1F449\U1F3FF' | |
| 374 | +emoji[backhand_index_pointing_up]=$'\U1F446' | |
| 375 | +emoji[point_up_2]=$'\U1F446' | |
| 376 | +emoji[backhand_index_pointing_up_light_skin_tone]=$'\U1F446\U1F3FB' | |
| 377 | +emoji[backhand_index_pointing_up_medium_light_skin_tone]=$'\U1F446\U1F3FC' | |
| 378 | +emoji[backhand_index_pointing_up_medium_skin_tone]=$'\U1F446\U1F3FD' | |
| 379 | +emoji[backhand_index_pointing_up_medium_dark_skin_tone]=$'\U1F446\U1F3FE' | |
| 380 | +emoji[backhand_index_pointing_up_dark_skin_tone]=$'\U1F446\U1F3FF' | |
| 381 | +emoji[middle_finger]=$'\U1F595' | |
| 382 | +emoji[fu]=$'\U1F595' | |
| 383 | +emoji[middle_finger_light_skin_tone]=$'\U1F595\U1F3FB' | |
| 384 | +emoji[middle_finger_medium_light_skin_tone]=$'\U1F595\U1F3FC' | |
| 385 | +emoji[middle_finger_medium_skin_tone]=$'\U1F595\U1F3FD' | |
| 386 | +emoji[middle_finger_medium_dark_skin_tone]=$'\U1F595\U1F3FE' | |
| 387 | +emoji[middle_finger_dark_skin_tone]=$'\U1F595\U1F3FF' | |
| 388 | +emoji[backhand_index_pointing_down]=$'\U1F447' | |
| 389 | +emoji[point_down]=$'\U1F447' | |
| 390 | +emoji[backhand_index_pointing_down_light_skin_tone]=$'\U1F447\U1F3FB' | |
| 391 | +emoji[backhand_index_pointing_down_medium_light_skin_tone]=$'\U1F447\U1F3FC' | |
| 392 | +emoji[backhand_index_pointing_down_medium_skin_tone]=$'\U1F447\U1F3FD' | |
| 393 | +emoji[backhand_index_pointing_down_medium_dark_skin_tone]=$'\U1F447\U1F3FE' | |
| 394 | +emoji[backhand_index_pointing_down_dark_skin_tone]=$'\U1F447\U1F3FF' | |
| 395 | +emoji[index_pointing_up]=$'\U261D\UFE0F' | |
| 396 | +emoji[point_up]=$'\U261D\UFE0F' | |
| 397 | +emoji[index_pointing_up_unqualified]=$'\U261D' | |
| 398 | +emoji[index_pointing_up_light_skin_tone]=$'\U261D\U1F3FB' | |
| 399 | +emoji[index_pointing_up_medium_light_skin_tone]=$'\U261D\U1F3FC' | |
| 400 | +emoji[index_pointing_up_medium_skin_tone]=$'\U261D\U1F3FD' | |
| 401 | +emoji[index_pointing_up_medium_dark_skin_tone]=$'\U261D\U1F3FE' | |
| 402 | +emoji[index_pointing_up_dark_skin_tone]=$'\U261D\U1F3FF' | |
| 403 | +emoji[thumbs_up]=$'\U1F44D' | |
| 404 | +emoji[+1]=$'\U1F44D' | |
| 405 | +emoji[thumbsup]=$'\U1F44D' | |
| 406 | +emoji[thumbs_up_light_skin_tone]=$'\U1F44D\U1F3FB' | |
| 407 | +emoji[thumbs_up_medium_light_skin_tone]=$'\U1F44D\U1F3FC' | |
| 408 | +emoji[thumbs_up_medium_skin_tone]=$'\U1F44D\U1F3FD' | |
| 409 | +emoji[thumbs_up_medium_dark_skin_tone]=$'\U1F44D\U1F3FE' | |
| 410 | +emoji[thumbs_up_dark_skin_tone]=$'\U1F44D\U1F3FF' | |
| 411 | +emoji[thumbs_down]=$'\U1F44E' | |
| 412 | +emoji[-1]=$'\U1F44E' | |
| 413 | +emoji[thumbsdown]=$'\U1F44E' | |
| 414 | +emoji[thumbs_down_light_skin_tone]=$'\U1F44E\U1F3FB' | |
| 415 | +emoji[thumbs_down_medium_light_skin_tone]=$'\U1F44E\U1F3FC' | |
| 416 | +emoji[thumbs_down_medium_skin_tone]=$'\U1F44E\U1F3FD' | |
| 417 | +emoji[thumbs_down_medium_dark_skin_tone]=$'\U1F44E\U1F3FE' | |
| 418 | +emoji[thumbs_down_dark_skin_tone]=$'\U1F44E\U1F3FF' | |
| 419 | +emoji[raised_fist]=$'\U270A' | |
| 420 | +emoji[fist_raised]=$'\U270A' | |
| 421 | +emoji[fist]=$'\U270A' | |
| 422 | +emoji[raised_fist_light_skin_tone]=$'\U270A\U1F3FB' | |
| 423 | +emoji[raised_fist_medium_light_skin_tone]=$'\U270A\U1F3FC' | |
| 424 | +emoji[raised_fist_medium_skin_tone]=$'\U270A\U1F3FD' | |
| 425 | +emoji[raised_fist_medium_dark_skin_tone]=$'\U270A\U1F3FE' | |
| 426 | +emoji[raised_fist_dark_skin_tone]=$'\U270A\U1F3FF' | |
| 427 | +emoji[oncoming_fist]=$'\U1F44A' | |
| 428 | +emoji[fist_oncoming]=$'\U1F44A' | |
| 429 | +emoji[facepunch]=$'\U1F44A' | |
| 430 | +emoji[punch]=$'\U1F44A' | |
| 431 | +emoji[oncoming_fist_light_skin_tone]=$'\U1F44A\U1F3FB' | |
| 432 | +emoji[oncoming_fist_medium_light_skin_tone]=$'\U1F44A\U1F3FC' | |
| 433 | +emoji[oncoming_fist_medium_skin_tone]=$'\U1F44A\U1F3FD' | |
| 434 | +emoji[oncoming_fist_medium_dark_skin_tone]=$'\U1F44A\U1F3FE' | |
| 435 | +emoji[oncoming_fist_dark_skin_tone]=$'\U1F44A\U1F3FF' | |
| 436 | +emoji[left_facing_fist]=$'\U1F91B' | |
| 437 | +emoji[fist_left]=$'\U1F91B' | |
| 438 | +emoji[left_facing_fist_light_skin_tone]=$'\U1F91B\U1F3FB' | |
| 439 | +emoji[left_facing_fist_medium_light_skin_tone]=$'\U1F91B\U1F3FC' | |
| 440 | +emoji[left_facing_fist_medium_skin_tone]=$'\U1F91B\U1F3FD' | |
| 441 | +emoji[left_facing_fist_medium_dark_skin_tone]=$'\U1F91B\U1F3FE' | |
| 442 | +emoji[left_facing_fist_dark_skin_tone]=$'\U1F91B\U1F3FF' | |
| 443 | +emoji[right_facing_fist]=$'\U1F91C' | |
| 444 | +emoji[fist_right]=$'\U1F91C' | |
| 445 | +emoji[right_facing_fist_light_skin_tone]=$'\U1F91C\U1F3FB' | |
| 446 | +emoji[right_facing_fist_medium_light_skin_tone]=$'\U1F91C\U1F3FC' | |
| 447 | +emoji[right_facing_fist_medium_skin_tone]=$'\U1F91C\U1F3FD' | |
| 448 | +emoji[right_facing_fist_medium_dark_skin_tone]=$'\U1F91C\U1F3FE' | |
| 449 | +emoji[right_facing_fist_dark_skin_tone]=$'\U1F91C\U1F3FF' | |
| 450 | +emoji[clapping_hands]=$'\U1F44F' | |
| 451 | +emoji[clap]=$'\U1F44F' | |
| 452 | +emoji[clapping_hands_light_skin_tone]=$'\U1F44F\U1F3FB' | |
| 453 | +emoji[clapping_hands_medium_light_skin_tone]=$'\U1F44F\U1F3FC' | |
| 454 | +emoji[clapping_hands_medium_skin_tone]=$'\U1F44F\U1F3FD' | |
| 455 | +emoji[clapping_hands_medium_dark_skin_tone]=$'\U1F44F\U1F3FE' | |
| 456 | +emoji[clapping_hands_dark_skin_tone]=$'\U1F44F\U1F3FF' | |
| 457 | +emoji[raising_hands]=$'\U1F64C' | |
| 458 | +emoji[raised_hands]=$'\U1F64C' | |
| 459 | +emoji[raising_hands_light_skin_tone]=$'\U1F64C\U1F3FB' | |
| 460 | +emoji[raising_hands_medium_light_skin_tone]=$'\U1F64C\U1F3FC' | |
| 461 | +emoji[raising_hands_medium_skin_tone]=$'\U1F64C\U1F3FD' | |
| 462 | +emoji[raising_hands_medium_dark_skin_tone]=$'\U1F64C\U1F3FE' | |
| 463 | +emoji[raising_hands_dark_skin_tone]=$'\U1F64C\U1F3FF' | |
| 464 | +emoji[open_hands]=$'\U1F450' | |
| 465 | +emoji[open_hands_light_skin_tone]=$'\U1F450\U1F3FB' | |
| 466 | +emoji[open_hands_medium_light_skin_tone]=$'\U1F450\U1F3FC' | |
| 467 | +emoji[open_hands_medium_skin_tone]=$'\U1F450\U1F3FD' | |
| 468 | +emoji[open_hands_medium_dark_skin_tone]=$'\U1F450\U1F3FE' | |
| 469 | +emoji[open_hands_dark_skin_tone]=$'\U1F450\U1F3FF' | |
| 470 | +emoji[palms_up_together]=$'\U1F932' | |
| 471 | +emoji[palms_up_together_light_skin_tone]=$'\U1F932\U1F3FB' | |
| 472 | +emoji[palms_up_together_medium_light_skin_tone]=$'\U1F932\U1F3FC' | |
| 473 | +emoji[palms_up_together_medium_skin_tone]=$'\U1F932\U1F3FD' | |
| 474 | +emoji[palms_up_together_medium_dark_skin_tone]=$'\U1F932\U1F3FE' | |
| 475 | +emoji[palms_up_together_dark_skin_tone]=$'\U1F932\U1F3FF' | |
| 476 | +emoji[handshake]=$'\U1F91D' | |
| 477 | +emoji[folded_hands]=$'\U1F64F' | |
| 478 | +emoji[pray]=$'\U1F64F' | |
| 479 | +emoji[folded_hands_light_skin_tone]=$'\U1F64F\U1F3FB' | |
| 480 | +emoji[folded_hands_medium_light_skin_tone]=$'\U1F64F\U1F3FC' | |
| 481 | +emoji[folded_hands_medium_skin_tone]=$'\U1F64F\U1F3FD' | |
| 482 | +emoji[folded_hands_medium_dark_skin_tone]=$'\U1F64F\U1F3FE' | |
| 483 | +emoji[folded_hands_dark_skin_tone]=$'\U1F64F\U1F3FF' | |
| 484 | +emoji[writing_hand]=$'\U270D\UFE0F' | |
| 485 | +emoji[writing_hand_unqualified]=$'\U270D' | |
| 486 | +emoji[writing_hand_light_skin_tone]=$'\U270D\U1F3FB' | |
| 487 | +emoji[writing_hand_medium_light_skin_tone]=$'\U270D\U1F3FC' | |
| 488 | +emoji[writing_hand_medium_skin_tone]=$'\U270D\U1F3FD' | |
| 489 | +emoji[writing_hand_medium_dark_skin_tone]=$'\U270D\U1F3FE' | |
| 490 | +emoji[writing_hand_dark_skin_tone]=$'\U270D\U1F3FF' | |
| 491 | +emoji[nail_polish]=$'\U1F485' | |
| 492 | +emoji[nail_care]=$'\U1F485' | |
| 493 | +emoji[nail_polish_light_skin_tone]=$'\U1F485\U1F3FB' | |
| 494 | +emoji[nail_polish_medium_light_skin_tone]=$'\U1F485\U1F3FC' | |
| 495 | +emoji[nail_polish_medium_skin_tone]=$'\U1F485\U1F3FD' | |
| 496 | +emoji[nail_polish_medium_dark_skin_tone]=$'\U1F485\U1F3FE' | |
| 497 | +emoji[nail_polish_dark_skin_tone]=$'\U1F485\U1F3FF' | |
| 498 | +emoji[selfie]=$'\U1F933' | |
| 499 | +emoji[selfie_light_skin_tone]=$'\U1F933\U1F3FB' | |
| 500 | +emoji[selfie_medium_light_skin_tone]=$'\U1F933\U1F3FC' | |
| 501 | +emoji[selfie_medium_skin_tone]=$'\U1F933\U1F3FD' | |
| 502 | +emoji[selfie_medium_dark_skin_tone]=$'\U1F933\U1F3FE' | |
| 503 | +emoji[selfie_dark_skin_tone]=$'\U1F933\U1F3FF' | |
| 504 | +emoji[flexed_biceps]=$'\U1F4AA' | |
| 505 | +emoji[muscle]=$'\U1F4AA' | |
| 506 | +emoji[flexed_biceps_light_skin_tone]=$'\U1F4AA\U1F3FB' | |
| 507 | +emoji[flexed_biceps_medium_light_skin_tone]=$'\U1F4AA\U1F3FC' | |
| 508 | +emoji[flexed_biceps_medium_skin_tone]=$'\U1F4AA\U1F3FD' | |
| 509 | +emoji[flexed_biceps_medium_dark_skin_tone]=$'\U1F4AA\U1F3FE' | |
| 510 | +emoji[flexed_biceps_dark_skin_tone]=$'\U1F4AA\U1F3FF' | |
| 511 | +emoji[mechanical_arm]=$'\U1F9BE' | |
| 512 | +emoji[mechanical_leg]=$'\U1F9BF' | |
| 513 | +emoji[mechanical_leg_1]=$'\U1F9B5' | |
| 514 | +emoji[leg]=$'\U1F9B5' | |
| 515 | +emoji[leg_light_skin_tone]=$'\U1F9B5\U1F3FB' | |
| 516 | +emoji[leg_medium_light_skin_tone]=$'\U1F9B5\U1F3FC' | |
| 517 | +emoji[leg_medium_skin_tone]=$'\U1F9B5\U1F3FD' | |
| 518 | +emoji[leg_medium_dark_skin_tone]=$'\U1F9B5\U1F3FE' | |
| 519 | +emoji[leg_dark_skin_tone]=$'\U1F9B5\U1F3FF' | |
| 520 | +emoji[foot]=$'\U1F9B6' | |
| 521 | +emoji[foot_light_skin_tone]=$'\U1F9B6\U1F3FB' | |
| 522 | +emoji[foot_medium_light_skin_tone]=$'\U1F9B6\U1F3FC' | |
| 523 | +emoji[foot_medium_skin_tone]=$'\U1F9B6\U1F3FD' | |
| 524 | +emoji[foot_medium_dark_skin_tone]=$'\U1F9B6\U1F3FE' | |
| 525 | +emoji[foot_dark_skin_tone]=$'\U1F9B6\U1F3FF' | |
| 526 | +emoji[ear]=$'\U1F442' | |
| 527 | +emoji[ear_light_skin_tone]=$'\U1F442\U1F3FB' | |
| 528 | +emoji[ear_medium_light_skin_tone]=$'\U1F442\U1F3FC' | |
| 529 | +emoji[ear_medium_skin_tone]=$'\U1F442\U1F3FD' | |
| 530 | +emoji[ear_medium_dark_skin_tone]=$'\U1F442\U1F3FE' | |
| 531 | +emoji[ear_dark_skin_tone]=$'\U1F442\U1F3FF' | |
| 532 | +emoji[ear_with_hearing_aid]=$'\U1F9BB' | |
| 533 | +emoji[ear_with_hearing_aid_light_skin_tone]=$'\U1F9BB\U1F3FB' | |
| 534 | +emoji[ear_with_hearing_aid_medium_light_skin_tone]=$'\U1F9BB\U1F3FC' | |
| 535 | +emoji[ear_with_hearing_aid_medium_skin_tone]=$'\U1F9BB\U1F3FD' | |
| 536 | +emoji[ear_with_hearing_aid_medium_dark_skin_tone]=$'\U1F9BB\U1F3FE' | |
| 537 | +emoji[ear_with_hearing_aid_dark_skin_tone]=$'\U1F9BB\U1F3FF' | |
| 538 | +emoji[nose]=$'\U1F443' | |
| 539 | +emoji[nose_light_skin_tone]=$'\U1F443\U1F3FB' | |
| 540 | +emoji[nose_medium_light_skin_tone]=$'\U1F443\U1F3FC' | |
| 541 | +emoji[nose_medium_skin_tone]=$'\U1F443\U1F3FD' | |
| 542 | +emoji[nose_medium_dark_skin_tone]=$'\U1F443\U1F3FE' | |
| 543 | +emoji[nose_dark_skin_tone]=$'\U1F443\U1F3FF' | |
| 544 | +emoji[brain]=$'\U1F9E0' | |
| 545 | +emoji[tooth]=$'\U1F9B7' | |
| 546 | +emoji[bone]=$'\U1F9B4' | |
| 547 | +emoji[eyes]=$'\U1F440' | |
| 548 | +emoji[eyes_1]=$'\U1F441\UFE0F' | |
| 549 | +emoji[eye_unqualified]=$'\U1F441' | |
| 550 | +emoji[eye]=$'\U1F441' | |
| 551 | +emoji[tongue]=$'\U1F445' | |
| 552 | +emoji[mouth]=$'\U1F444' | |
| 553 | +emoji[lips]=$'\U1F444' | |
| 554 | +emoji[baby]=$'\U1F476' | |
| 555 | +emoji[baby_light_skin_tone]=$'\U1F476\U1F3FB' | |
| 556 | +emoji[baby_medium_light_skin_tone]=$'\U1F476\U1F3FC' | |
| 557 | +emoji[baby_medium_skin_tone]=$'\U1F476\U1F3FD' | |
| 558 | +emoji[baby_medium_dark_skin_tone]=$'\U1F476\U1F3FE' | |
| 559 | +emoji[baby_dark_skin_tone]=$'\U1F476\U1F3FF' | |
| 560 | +emoji[child]=$'\U1F9D2' | |
| 561 | +emoji[child_light_skin_tone]=$'\U1F9D2\U1F3FB' | |
| 562 | +emoji[child_medium_light_skin_tone]=$'\U1F9D2\U1F3FC' | |
| 563 | +emoji[child_medium_skin_tone]=$'\U1F9D2\U1F3FD' | |
| 564 | +emoji[child_medium_dark_skin_tone]=$'\U1F9D2\U1F3FE' | |
| 565 | +emoji[child_dark_skin_tone]=$'\U1F9D2\U1F3FF' | |
| 566 | +emoji[boy]=$'\U1F466' | |
| 567 | +emoji[boy_light_skin_tone]=$'\U1F466\U1F3FB' | |
| 568 | +emoji[boy_medium_light_skin_tone]=$'\U1F466\U1F3FC' | |
| 569 | +emoji[boy_medium_skin_tone]=$'\U1F466\U1F3FD' | |
| 570 | +emoji[boy_medium_dark_skin_tone]=$'\U1F466\U1F3FE' | |
| 571 | +emoji[boy_dark_skin_tone]=$'\U1F466\U1F3FF' | |
| 572 | +emoji[girl]=$'\U1F467' | |
| 573 | +emoji[girl_light_skin_tone]=$'\U1F467\U1F3FB' | |
| 574 | +emoji[girl_medium_light_skin_tone]=$'\U1F467\U1F3FC' | |
| 575 | +emoji[girl_medium_skin_tone]=$'\U1F467\U1F3FD' | |
| 576 | +emoji[girl_medium_dark_skin_tone]=$'\U1F467\U1F3FE' | |
| 577 | +emoji[girl_dark_skin_tone]=$'\U1F467\U1F3FF' | |
| 578 | +emoji[person]=$'\U1F9D1' | |
| 579 | +emoji[adult]=$'\U1F9D1' | |
| 580 | +emoji[person_light_skin_tone]=$'\U1F9D1\U1F3FB' | |
| 581 | +emoji[person_medium_light_skin_tone]=$'\U1F9D1\U1F3FC' | |
| 582 | +emoji[person_medium_skin_tone]=$'\U1F9D1\U1F3FD' | |
| 583 | +emoji[person_medium_dark_skin_tone]=$'\U1F9D1\U1F3FE' | |
| 584 | +emoji[person_dark_skin_tone]=$'\U1F9D1\U1F3FF' | |
| 585 | +emoji[person_blond_hair]=$'\U1F471' | |
| 586 | +emoji[blond_haired_person]=$'\U1F471' | |
| 587 | +emoji[person_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB' | |
| 588 | +emoji[person_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC' | |
| 589 | +emoji[person_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD' | |
| 590 | +emoji[person_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE' | |
| 591 | +emoji[person_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF' | |
| 592 | +emoji[man]=$'\U1F468' | |
| 593 | +emoji[man_light_skin_tone]=$'\U1F468\U1F3FB' | |
| 594 | +emoji[man_medium_light_skin_tone]=$'\U1F468\U1F3FC' | |
| 595 | +emoji[man_medium_skin_tone]=$'\U1F468\U1F3FD' | |
| 596 | +emoji[man_medium_dark_skin_tone]=$'\U1F468\U1F3FE' | |
| 597 | +emoji[man_dark_skin_tone]=$'\U1F468\U1F3FF' | |
| 598 | +emoji[man_beard]=$'\U1F9D4' | |
| 599 | +emoji[bearded_person]=$'\U1F9D4' | |
| 600 | +emoji[man_light_skin_tone_beard]=$'\U1F9D4\U1F3FB' | |
| 601 | +emoji[man_medium_light_skin_tone_beard]=$'\U1F9D4\U1F3FC' | |
| 602 | +emoji[man_medium_skin_tone_beard]=$'\U1F9D4\U1F3FD' | |
| 603 | +emoji[man_medium_dark_skin_tone_beard]=$'\U1F9D4\U1F3FE' | |
| 604 | +emoji[man_dark_skin_tone_beard]=$'\U1F9D4\U1F3FF' | |
| 605 | +emoji[man_blond_hair]=$'\U1F471\U200D\U2642\UFE0F' | |
| 606 | +emoji[man_blond_hair_minimally]=$'\U1F471\U200D\U2642' | |
| 607 | +emoji[blond_haired_man]=$'\U1F471\U200D\U2642' | |
| 608 | +emoji[man_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB\U200D\U2642\UFE0F' | |
| 609 | +emoji[man_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FB\U200D\U2642' | |
| 610 | +emoji[man_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC\U200D\U2642\UFE0F' | |
| 611 | +emoji[man_medium_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FC\U200D\U2642' | |
| 612 | +emoji[man_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD\U200D\U2642\UFE0F' | |
| 613 | +emoji[man_medium_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FD\U200D\U2642' | |
| 614 | +emoji[man_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE\U200D\U2642\UFE0F' | |
| 615 | +emoji[man_medium_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FE\U200D\U2642' | |
| 616 | +emoji[man_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF\U200D\U2642\UFE0F' | |
| 617 | +emoji[man_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FF\U200D\U2642' | |
| 618 | +emoji[man_red_hair]=$'\U1F468\U200D\U1F9B0' | |
| 619 | +emoji[red_haired_man]=$'\U1F468\U200D\U1F9B0' | |
| 620 | +emoji[man_light_skin_tone_red_hair]=$'\U1F468\U1F3FB\U200D\U1F9B0' | |
| 621 | +emoji[man_medium_light_skin_tone_red_hair]=$'\U1F468\U1F3FC\U200D\U1F9B0' | |
| 622 | +emoji[man_medium_skin_tone_red_hair]=$'\U1F468\U1F3FD\U200D\U1F9B0' | |
| 623 | +emoji[man_medium_dark_skin_tone_red_hair]=$'\U1F468\U1F3FE\U200D\U1F9B0' | |
| 624 | +emoji[man_dark_skin_tone_red_hair]=$'\U1F468\U1F3FF\U200D\U1F9B0' | |
| 625 | +emoji[man_curly_hair]=$'\U1F468\U200D\U1F9B1' | |
| 626 | +emoji[curly_haired_man]=$'\U1F468\U200D\U1F9B1' | |
| 627 | +emoji[man_light_skin_tone_curly_hair]=$'\U1F468\U1F3FB\U200D\U1F9B1' | |
| 628 | +emoji[man_medium_light_skin_tone_curly_hair]=$'\U1F468\U1F3FC\U200D\U1F9B1' | |
| 629 | +emoji[man_medium_skin_tone_curly_hair]=$'\U1F468\U1F3FD\U200D\U1F9B1' | |
| 630 | +emoji[man_medium_dark_skin_tone_curly_hair]=$'\U1F468\U1F3FE\U200D\U1F9B1' | |
| 631 | +emoji[man_dark_skin_tone_curly_hair]=$'\U1F468\U1F3FF\U200D\U1F9B1' | |
| 632 | +emoji[man_white_hair]=$'\U1F468\U200D\U1F9B3' | |
| 633 | +emoji[white_haired_man]=$'\U1F468\U200D\U1F9B3' | |
| 634 | +emoji[man_light_skin_tone_white_hair]=$'\U1F468\U1F3FB\U200D\U1F9B3' | |
| 635 | +emoji[man_medium_light_skin_tone_white_hair]=$'\U1F468\U1F3FC\U200D\U1F9B3' | |
| 636 | +emoji[man_medium_skin_tone_white_hair]=$'\U1F468\U1F3FD\U200D\U1F9B3' | |
| 637 | +emoji[man_medium_dark_skin_tone_white_hair]=$'\U1F468\U1F3FE\U200D\U1F9B3' | |
| 638 | +emoji[man_dark_skin_tone_white_hair]=$'\U1F468\U1F3FF\U200D\U1F9B3' | |
| 639 | +emoji[man_bald]=$'\U1F468\U200D\U1F9B2' | |
| 640 | +emoji[bald_man]=$'\U1F468\U200D\U1F9B2' | |
| 641 | +emoji[man_light_skin_tone_bald]=$'\U1F468\U1F3FB\U200D\U1F9B2' | |
| 642 | +emoji[man_medium_light_skin_tone_bald]=$'\U1F468\U1F3FC\U200D\U1F9B2' | |
| 643 | +emoji[man_medium_skin_tone_bald]=$'\U1F468\U1F3FD\U200D\U1F9B2' | |
| 644 | +emoji[man_medium_dark_skin_tone_bald]=$'\U1F468\U1F3FE\U200D\U1F9B2' | |
| 645 | +emoji[man_dark_skin_tone_bald]=$'\U1F468\U1F3FF\U200D\U1F9B2' | |
| 646 | +emoji[woman]=$'\U1F469' | |
| 647 | +emoji[woman_light_skin_tone]=$'\U1F469\U1F3FB' | |
| 648 | +emoji[woman_medium_light_skin_tone]=$'\U1F469\U1F3FC' | |
| 649 | +emoji[woman_medium_skin_tone]=$'\U1F469\U1F3FD' | |
| 650 | +emoji[woman_medium_dark_skin_tone]=$'\U1F469\U1F3FE' | |
| 651 | +emoji[woman_dark_skin_tone]=$'\U1F469\U1F3FF' | |
| 652 | +emoji[woman_blond_hair]=$'\U1F471\U200D\U2640\UFE0F' | |
| 653 | +emoji[woman_blond_hair_minimally]=$'\U1F471\U200D\U2640' | |
| 654 | +emoji[blond_haired_woman]=$'\U1F471\U200D\U2640' | |
| 655 | +emoji[blonde_woman]=$'\U1F471\U200D\U2640' | |
| 656 | +emoji[woman_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB\U200D\U2640\UFE0F' | |
| 657 | +emoji[woman_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FB\U200D\U2640' | |
| 658 | +emoji[woman_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC\U200D\U2640\UFE0F' | |
| 659 | +emoji[woman_medium_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FC\U200D\U2640' | |
| 660 | +emoji[woman_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD\U200D\U2640\UFE0F' | |
| 661 | +emoji[woman_medium_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FD\U200D\U2640' | |
| 662 | +emoji[woman_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE\U200D\U2640\UFE0F' | |
| 663 | +emoji[woman_medium_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FE\U200D\U2640' | |
| 664 | +emoji[woman_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF\U200D\U2640\UFE0F' | |
| 665 | +emoji[woman_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FF\U200D\U2640' | |
| 666 | +emoji[woman_red_hair]=$'\U1F469\U200D\U1F9B0' | |
| 667 | +emoji[red_haired_woman]=$'\U1F469\U200D\U1F9B0' | |
| 668 | +emoji[woman_light_skin_tone_red_hair]=$'\U1F469\U1F3FB\U200D\U1F9B0' | |
| 669 | +emoji[woman_medium_light_skin_tone_red_hair]=$'\U1F469\U1F3FC\U200D\U1F9B0' | |
| 670 | +emoji[woman_medium_skin_tone_red_hair]=$'\U1F469\U1F3FD\U200D\U1F9B0' | |
| 671 | +emoji[woman_medium_dark_skin_tone_red_hair]=$'\U1F469\U1F3FE\U200D\U1F9B0' | |
| 672 | +emoji[woman_dark_skin_tone_red_hair]=$'\U1F469\U1F3FF\U200D\U1F9B0' | |
| 673 | +emoji[woman_curly_hair]=$'\U1F469\U200D\U1F9B1' | |
| 674 | +emoji[curly_haired_woman]=$'\U1F469\U200D\U1F9B1' | |
| 675 | +emoji[woman_light_skin_tone_curly_hair]=$'\U1F469\U1F3FB\U200D\U1F9B1' | |
| 676 | +emoji[woman_medium_light_skin_tone_curly_hair]=$'\U1F469\U1F3FC\U200D\U1F9B1' | |
| 677 | +emoji[woman_medium_skin_tone_curly_hair]=$'\U1F469\U1F3FD\U200D\U1F9B1' | |
| 678 | +emoji[woman_medium_dark_skin_tone_curly_hair]=$'\U1F469\U1F3FE\U200D\U1F9B1' | |
| 679 | +emoji[woman_dark_skin_tone_curly_hair]=$'\U1F469\U1F3FF\U200D\U1F9B1' | |
| 680 | +emoji[woman_white_hair]=$'\U1F469\U200D\U1F9B3' | |
| 681 | +emoji[white_haired_woman]=$'\U1F469\U200D\U1F9B3' | |
| 682 | +emoji[woman_light_skin_tone_white_hair]=$'\U1F469\U1F3FB\U200D\U1F9B3' | |
| 683 | +emoji[woman_medium_light_skin_tone_white_hair]=$'\U1F469\U1F3FC\U200D\U1F9B3' | |
| 684 | +emoji[woman_medium_skin_tone_white_hair]=$'\U1F469\U1F3FD\U200D\U1F9B3' | |
| 685 | +emoji[woman_medium_dark_skin_tone_white_hair]=$'\U1F469\U1F3FE\U200D\U1F9B3' | |
| 686 | +emoji[woman_dark_skin_tone_white_hair]=$'\U1F469\U1F3FF\U200D\U1F9B3' | |
| 687 | +emoji[woman_bald]=$'\U1F469\U200D\U1F9B2' | |
| 688 | +emoji[bald_woman]=$'\U1F469\U200D\U1F9B2' | |
| 689 | +emoji[woman_light_skin_tone_bald]=$'\U1F469\U1F3FB\U200D\U1F9B2' | |
| 690 | +emoji[woman_medium_light_skin_tone_bald]=$'\U1F469\U1F3FC\U200D\U1F9B2' | |
| 691 | +emoji[woman_medium_skin_tone_bald]=$'\U1F469\U1F3FD\U200D\U1F9B2' | |
| 692 | +emoji[woman_medium_dark_skin_tone_bald]=$'\U1F469\U1F3FE\U200D\U1F9B2' | |
| 693 | +emoji[woman_dark_skin_tone_bald]=$'\U1F469\U1F3FF\U200D\U1F9B2' | |
| 694 | +emoji[older_person]=$'\U1F9D3' | |
| 695 | +emoji[older_adult]=$'\U1F9D3' | |
| 696 | +emoji[older_person_light_skin_tone]=$'\U1F9D3\U1F3FB' | |
| 697 | +emoji[older_person_medium_light_skin_tone]=$'\U1F9D3\U1F3FC' | |
| 698 | +emoji[older_person_medium_skin_tone]=$'\U1F9D3\U1F3FD' | |
| 699 | +emoji[older_person_medium_dark_skin_tone]=$'\U1F9D3\U1F3FE' | |
| 700 | +emoji[older_person_dark_skin_tone]=$'\U1F9D3\U1F3FF' | |
| 701 | +emoji[old_man]=$'\U1F474' | |
| 702 | +emoji[older_man]=$'\U1F474' | |
| 703 | +emoji[old_man_light_skin_tone]=$'\U1F474\U1F3FB' | |
| 704 | +emoji[old_man_medium_light_skin_tone]=$'\U1F474\U1F3FC' | |
| 705 | +emoji[old_man_medium_skin_tone]=$'\U1F474\U1F3FD' | |
| 706 | +emoji[old_man_medium_dark_skin_tone]=$'\U1F474\U1F3FE' | |
| 707 | +emoji[old_man_dark_skin_tone]=$'\U1F474\U1F3FF' | |
| 708 | +emoji[old_woman]=$'\U1F475' | |
| 709 | +emoji[older_woman]=$'\U1F475' | |
| 710 | +emoji[old_woman_light_skin_tone]=$'\U1F475\U1F3FB' | |
| 711 | +emoji[old_woman_medium_light_skin_tone]=$'\U1F475\U1F3FC' | |
| 712 | +emoji[old_woman_medium_skin_tone]=$'\U1F475\U1F3FD' | |
| 713 | +emoji[old_woman_medium_dark_skin_tone]=$'\U1F475\U1F3FE' | |
| 714 | +emoji[old_woman_dark_skin_tone]=$'\U1F475\U1F3FF' | |
| 715 | +emoji[person_frowning]=$'\U1F64D' | |
| 716 | +emoji[frowning_person]=$'\U1F64D' | |
| 717 | +emoji[person_frowning_light_skin_tone]=$'\U1F64D\U1F3FB' | |
| 718 | +emoji[person_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC' | |
| 719 | +emoji[person_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD' | |
| 720 | +emoji[person_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE' | |
| 721 | +emoji[person_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF' | |
| 722 | +emoji[man_frowning]=$'\U1F64D\U200D\U2642\UFE0F' | |
| 723 | +emoji[man_frowning_minimally]=$'\U1F64D\U200D\U2642' | |
| 724 | +emoji[frowning_man]=$'\U1F64D\U200D\U2642' | |
| 725 | +emoji[man_frowning_light_skin_tone]=$'\U1F64D\U1F3FB\U200D\U2642\UFE0F' | |
| 726 | +emoji[man_frowning_light_skin_tone_minimally]=$'\U1F64D\U1F3FB\U200D\U2642' | |
| 727 | +emoji[man_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC\U200D\U2642\UFE0F' | |
| 728 | +emoji[man_frowning_medium_light_skin_tone_minimally]=$'\U1F64D\U1F3FC\U200D\U2642' | |
| 729 | +emoji[man_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD\U200D\U2642\UFE0F' | |
| 730 | +emoji[man_frowning_medium_skin_tone_minimally]=$'\U1F64D\U1F3FD\U200D\U2642' | |
| 731 | +emoji[man_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE\U200D\U2642\UFE0F' | |
| 732 | +emoji[man_frowning_medium_dark_skin_tone_minimally]=$'\U1F64D\U1F3FE\U200D\U2642' | |
| 733 | +emoji[man_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF\U200D\U2642\UFE0F' | |
| 734 | +emoji[man_frowning_dark_skin_tone_minimally]=$'\U1F64D\U1F3FF\U200D\U2642' | |
| 735 | +emoji[woman_frowning]=$'\U1F64D\U200D\U2640\UFE0F' | |
| 736 | +emoji[woman_frowning_minimally]=$'\U1F64D\U200D\U2640' | |
| 737 | +emoji[frowning_woman]=$'\U1F64D\U200D\U2640' | |
| 738 | +emoji[woman_frowning_light_skin_tone]=$'\U1F64D\U1F3FB\U200D\U2640\UFE0F' | |
| 739 | +emoji[woman_frowning_light_skin_tone_minimally]=$'\U1F64D\U1F3FB\U200D\U2640' | |
| 740 | +emoji[woman_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC\U200D\U2640\UFE0F' | |
| 741 | +emoji[woman_frowning_medium_light_skin_tone_minimally]=$'\U1F64D\U1F3FC\U200D\U2640' | |
| 742 | +emoji[woman_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD\U200D\U2640\UFE0F' | |
| 743 | +emoji[woman_frowning_medium_skin_tone_minimally]=$'\U1F64D\U1F3FD\U200D\U2640' | |
| 744 | +emoji[woman_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE\U200D\U2640\UFE0F' | |
| 745 | +emoji[woman_frowning_medium_dark_skin_tone_minimally]=$'\U1F64D\U1F3FE\U200D\U2640' | |
| 746 | +emoji[woman_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF\U200D\U2640\UFE0F' | |
| 747 | +emoji[woman_frowning_dark_skin_tone_minimally]=$'\U1F64D\U1F3FF\U200D\U2640' | |
| 748 | +emoji[person_pouting]=$'\U1F64E' | |
| 749 | +emoji[person_pouting_light_skin_tone]=$'\U1F64E\U1F3FB' | |
| 750 | +emoji[person_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC' | |
| 751 | +emoji[person_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD' | |
| 752 | +emoji[person_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE' | |
| 753 | +emoji[person_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF' | |
| 754 | +emoji[man_pouting]=$'\U1F64E\U200D\U2642\UFE0F' | |
| 755 | +emoji[man_pouting_minimally]=$'\U1F64E\U200D\U2642' | |
| 756 | +emoji[pouting_man]=$'\U1F64E\U200D\U2642' | |
| 757 | +emoji[man_pouting_light_skin_tone]=$'\U1F64E\U1F3FB\U200D\U2642\UFE0F' | |
| 758 | +emoji[man_pouting_light_skin_tone_minimally]=$'\U1F64E\U1F3FB\U200D\U2642' | |
| 759 | +emoji[man_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC\U200D\U2642\UFE0F' | |
| 760 | +emoji[man_pouting_medium_light_skin_tone_minimally]=$'\U1F64E\U1F3FC\U200D\U2642' | |
| 761 | +emoji[man_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD\U200D\U2642\UFE0F' | |
| 762 | +emoji[man_pouting_medium_skin_tone_minimally]=$'\U1F64E\U1F3FD\U200D\U2642' | |
| 763 | +emoji[man_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE\U200D\U2642\UFE0F' | |
| 764 | +emoji[man_pouting_medium_dark_skin_tone_minimally]=$'\U1F64E\U1F3FE\U200D\U2642' | |
| 765 | +emoji[man_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF\U200D\U2642\UFE0F' | |
| 766 | +emoji[man_pouting_dark_skin_tone_minimally]=$'\U1F64E\U1F3FF\U200D\U2642' | |
| 767 | +emoji[woman_pouting]=$'\U1F64E\U200D\U2640\UFE0F' | |
| 768 | +emoji[woman_pouting_minimally]=$'\U1F64E\U200D\U2640' | |
| 769 | +emoji[pouting_woman]=$'\U1F64E\U200D\U2640' | |
| 770 | +emoji[woman_pouting_light_skin_tone]=$'\U1F64E\U1F3FB\U200D\U2640\UFE0F' | |
| 771 | +emoji[woman_pouting_light_skin_tone_minimally]=$'\U1F64E\U1F3FB\U200D\U2640' | |
| 772 | +emoji[woman_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC\U200D\U2640\UFE0F' | |
| 773 | +emoji[woman_pouting_medium_light_skin_tone_minimally]=$'\U1F64E\U1F3FC\U200D\U2640' | |
| 774 | +emoji[woman_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD\U200D\U2640\UFE0F' | |
| 775 | +emoji[woman_pouting_medium_skin_tone_minimally]=$'\U1F64E\U1F3FD\U200D\U2640' | |
| 776 | +emoji[woman_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE\U200D\U2640\UFE0F' | |
| 777 | +emoji[woman_pouting_medium_dark_skin_tone_minimally]=$'\U1F64E\U1F3FE\U200D\U2640' | |
| 778 | +emoji[woman_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF\U200D\U2640\UFE0F' | |
| 779 | +emoji[woman_pouting_dark_skin_tone_minimally]=$'\U1F64E\U1F3FF\U200D\U2640' | |
| 780 | +emoji[person_gesturing_NO]=$'\U1F645' | |
| 781 | +emoji[no_good]=$'\U1F645' | |
| 782 | +emoji[person_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB' | |
| 783 | +emoji[person_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC' | |
| 784 | +emoji[person_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD' | |
| 785 | +emoji[person_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE' | |
| 786 | +emoji[person_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF' | |
| 787 | +emoji[man_gesturing_NO]=$'\U1F645\U200D\U2642\UFE0F' | |
| 788 | +emoji[man_gesturing_NO_minimally]=$'\U1F645\U200D\U2642' | |
| 789 | +emoji[no_good_man]=$'\U1F645\U200D\U2642' | |
| 790 | +emoji[ng_man]=$'\U1F645\U200D\U2642' | |
| 791 | +emoji[man_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB\U200D\U2642\UFE0F' | |
| 792 | +emoji[man_gesturing_NO_light_skin_tone_minimally]=$'\U1F645\U1F3FB\U200D\U2642' | |
| 793 | +emoji[man_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC\U200D\U2642\UFE0F' | |
| 794 | +emoji[man_gesturing_NO_medium_light_skin_tone_minimally]=$'\U1F645\U1F3FC\U200D\U2642' | |
| 795 | +emoji[man_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD\U200D\U2642\UFE0F' | |
| 796 | +emoji[man_gesturing_NO_medium_skin_tone_minimally]=$'\U1F645\U1F3FD\U200D\U2642' | |
| 797 | +emoji[man_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE\U200D\U2642\UFE0F' | |
| 798 | +emoji[man_gesturing_NO_medium_dark_skin_tone_minimally]=$'\U1F645\U1F3FE\U200D\U2642' | |
| 799 | +emoji[man_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF\U200D\U2642\UFE0F' | |
| 800 | +emoji[man_gesturing_NO_dark_skin_tone_minimally]=$'\U1F645\U1F3FF\U200D\U2642' | |
| 801 | +emoji[woman_gesturing_NO]=$'\U1F645\U200D\U2640\UFE0F' | |
| 802 | +emoji[woman_gesturing_NO_minimally]=$'\U1F645\U200D\U2640' | |
| 803 | +emoji[no_good_woman]=$'\U1F645\U200D\U2640' | |
| 804 | +emoji[ng_woman]=$'\U1F645\U200D\U2640' | |
| 805 | +emoji[woman_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB\U200D\U2640\UFE0F' | |
| 806 | +emoji[woman_gesturing_NO_light_skin_tone_minimally]=$'\U1F645\U1F3FB\U200D\U2640' | |
| 807 | +emoji[woman_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC\U200D\U2640\UFE0F' | |
| 808 | +emoji[woman_gesturing_NO_medium_light_skin_tone_minimally]=$'\U1F645\U1F3FC\U200D\U2640' | |
| 809 | +emoji[woman_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD\U200D\U2640\UFE0F' | |
| 810 | +emoji[woman_gesturing_NO_medium_skin_tone_minimally]=$'\U1F645\U1F3FD\U200D\U2640' | |
| 811 | +emoji[woman_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE\U200D\U2640\UFE0F' | |
| 812 | +emoji[woman_gesturing_NO_medium_dark_skin_tone_minimally]=$'\U1F645\U1F3FE\U200D\U2640' | |
| 813 | +emoji[woman_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF\U200D\U2640\UFE0F' | |
| 814 | +emoji[woman_gesturing_NO_dark_skin_tone_minimally]=$'\U1F645\U1F3FF\U200D\U2640' | |
| 815 | +emoji[person_gesturing_OK]=$'\U1F646' | |
| 816 | +emoji[ok_person]=$'\U1F646' | |
| 817 | +emoji[person_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB' | |
| 818 | +emoji[person_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC' | |
| 819 | +emoji[person_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD' | |
| 820 | +emoji[person_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE' | |
| 821 | +emoji[person_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF' | |
| 822 | +emoji[man_gesturing_OK]=$'\U1F646\U200D\U2642\UFE0F' | |
| 823 | +emoji[man_gesturing_OK_minimally]=$'\U1F646\U200D\U2642' | |
| 824 | +emoji[ok_man]=$'\U1F646\U200D\U2642' | |
| 825 | +emoji[man_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB\U200D\U2642\UFE0F' | |
| 826 | +emoji[man_gesturing_OK_light_skin_tone_minimally]=$'\U1F646\U1F3FB\U200D\U2642' | |
| 827 | +emoji[man_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC\U200D\U2642\UFE0F' | |
| 828 | +emoji[man_gesturing_OK_medium_light_skin_tone_minimally]=$'\U1F646\U1F3FC\U200D\U2642' | |
| 829 | +emoji[man_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD\U200D\U2642\UFE0F' | |
| 830 | +emoji[man_gesturing_OK_medium_skin_tone_minimally]=$'\U1F646\U1F3FD\U200D\U2642' | |
| 831 | +emoji[man_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE\U200D\U2642\UFE0F' | |
| 832 | +emoji[man_gesturing_OK_medium_dark_skin_tone_minimally]=$'\U1F646\U1F3FE\U200D\U2642' | |
| 833 | +emoji[man_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF\U200D\U2642\UFE0F' | |
| 834 | +emoji[man_gesturing_OK_dark_skin_tone_minimally]=$'\U1F646\U1F3FF\U200D\U2642' | |
| 835 | +emoji[woman_gesturing_OK]=$'\U1F646\U200D\U2640\UFE0F' | |
| 836 | +emoji[woman_gesturing_OK_minimally]=$'\U1F646\U200D\U2640' | |
| 837 | +emoji[ok_woman]=$'\U1F646\U200D\U2640' | |
| 838 | +emoji[woman_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB\U200D\U2640\UFE0F' | |
| 839 | +emoji[woman_gesturing_OK_light_skin_tone_minimally]=$'\U1F646\U1F3FB\U200D\U2640' | |
| 840 | +emoji[woman_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC\U200D\U2640\UFE0F' | |
| 841 | +emoji[woman_gesturing_OK_medium_light_skin_tone_minimally]=$'\U1F646\U1F3FC\U200D\U2640' | |
| 842 | +emoji[woman_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD\U200D\U2640\UFE0F' | |
| 843 | +emoji[woman_gesturing_OK_medium_skin_tone_minimally]=$'\U1F646\U1F3FD\U200D\U2640' | |
| 844 | +emoji[woman_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE\U200D\U2640\UFE0F' | |
| 845 | +emoji[woman_gesturing_OK_medium_dark_skin_tone_minimally]=$'\U1F646\U1F3FE\U200D\U2640' | |
| 846 | +emoji[woman_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF\U200D\U2640\UFE0F' | |
| 847 | +emoji[woman_gesturing_OK_dark_skin_tone_minimally]=$'\U1F646\U1F3FF\U200D\U2640' | |
| 848 | +emoji[person_tipping_hand]=$'\U1F481' | |
| 849 | +emoji[tipping_hand_person]=$'\U1F481' | |
| 850 | +emoji[information_desk_person]=$'\U1F481' | |
| 851 | +emoji[person_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB' | |
| 852 | +emoji[person_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC' | |
| 853 | +emoji[person_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD' | |
| 854 | +emoji[person_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE' | |
| 855 | +emoji[person_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF' | |
| 856 | +emoji[man_tipping_hand]=$'\U1F481\U200D\U2642\UFE0F' | |
| 857 | +emoji[man_tipping_hand_minimally]=$'\U1F481\U200D\U2642' | |
| 858 | +emoji[tipping_hand_man]=$'\U1F481\U200D\U2642' | |
| 859 | +emoji[sassy_man]=$'\U1F481\U200D\U2642' | |
| 860 | +emoji[man_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB\U200D\U2642\UFE0F' | |
| 861 | +emoji[man_tipping_hand_light_skin_tone_minimally]=$'\U1F481\U1F3FB\U200D\U2642' | |
| 862 | +emoji[man_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC\U200D\U2642\UFE0F' | |
| 863 | +emoji[man_tipping_hand_medium_light_skin_tone_minimally]=$'\U1F481\U1F3FC\U200D\U2642' | |
| 864 | +emoji[man_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD\U200D\U2642\UFE0F' | |
| 865 | +emoji[man_tipping_hand_medium_skin_tone_minimally]=$'\U1F481\U1F3FD\U200D\U2642' | |
| 866 | +emoji[man_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE\U200D\U2642\UFE0F' | |
| 867 | +emoji[man_tipping_hand_medium_dark_skin_tone_minimally]=$'\U1F481\U1F3FE\U200D\U2642' | |
| 868 | +emoji[man_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF\U200D\U2642\UFE0F' | |
| 869 | +emoji[man_tipping_hand_dark_skin_tone_minimally]=$'\U1F481\U1F3FF\U200D\U2642' | |
| 870 | +emoji[woman_tipping_hand]=$'\U1F481\U200D\U2640\UFE0F' | |
| 871 | +emoji[woman_tipping_hand_minimally]=$'\U1F481\U200D\U2640' | |
| 872 | +emoji[tipping_hand_woman]=$'\U1F481\U200D\U2640' | |
| 873 | +emoji[sassy_woman]=$'\U1F481\U200D\U2640' | |
| 874 | +emoji[woman_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB\U200D\U2640\UFE0F' | |
| 875 | +emoji[woman_tipping_hand_light_skin_tone_minimally]=$'\U1F481\U1F3FB\U200D\U2640' | |
| 876 | +emoji[woman_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC\U200D\U2640\UFE0F' | |
| 877 | +emoji[woman_tipping_hand_medium_light_skin_tone_minimally]=$'\U1F481\U1F3FC\U200D\U2640' | |
| 878 | +emoji[woman_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD\U200D\U2640\UFE0F' | |
| 879 | +emoji[woman_tipping_hand_medium_skin_tone_minimally]=$'\U1F481\U1F3FD\U200D\U2640' | |
| 880 | +emoji[woman_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE\U200D\U2640\UFE0F' | |
| 881 | +emoji[woman_tipping_hand_medium_dark_skin_tone_minimally]=$'\U1F481\U1F3FE\U200D\U2640' | |
| 882 | +emoji[woman_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF\U200D\U2640\UFE0F' | |
| 883 | +emoji[woman_tipping_hand_dark_skin_tone_minimally]=$'\U1F481\U1F3FF\U200D\U2640' | |
| 884 | +emoji[person_raising_hand]=$'\U1F64B' | |
| 885 | +emoji[raising_hand]=$'\U1F64B' | |
| 886 | +emoji[person_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB' | |
| 887 | +emoji[person_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC' | |
| 888 | +emoji[person_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD' | |
| 889 | +emoji[person_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE' | |
| 890 | +emoji[person_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF' | |
| 891 | +emoji[man_raising_hand]=$'\U1F64B\U200D\U2642\UFE0F' | |
| 892 | +emoji[man_raising_hand_minimally]=$'\U1F64B\U200D\U2642' | |
| 893 | +emoji[raising_hand_man]=$'\U1F64B\U200D\U2642' | |
| 894 | +emoji[man_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB\U200D\U2642\UFE0F' | |
| 895 | +emoji[man_raising_hand_light_skin_tone_minimally]=$'\U1F64B\U1F3FB\U200D\U2642' | |
| 896 | +emoji[man_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC\U200D\U2642\UFE0F' | |
| 897 | +emoji[man_raising_hand_medium_light_skin_tone_minimally]=$'\U1F64B\U1F3FC\U200D\U2642' | |
| 898 | +emoji[man_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD\U200D\U2642\UFE0F' | |
| 899 | +emoji[man_raising_hand_medium_skin_tone_minimally]=$'\U1F64B\U1F3FD\U200D\U2642' | |
| 900 | +emoji[man_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE\U200D\U2642\UFE0F' | |
| 901 | +emoji[man_raising_hand_medium_dark_skin_tone_minimally]=$'\U1F64B\U1F3FE\U200D\U2642' | |
| 902 | +emoji[man_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF\U200D\U2642\UFE0F' | |
| 903 | +emoji[man_raising_hand_dark_skin_tone_minimally]=$'\U1F64B\U1F3FF\U200D\U2642' | |
| 904 | +emoji[woman_raising_hand]=$'\U1F64B\U200D\U2640\UFE0F' | |
| 905 | +emoji[woman_raising_hand_minimally]=$'\U1F64B\U200D\U2640' | |
| 906 | +emoji[raising_hand_woman]=$'\U1F64B\U200D\U2640' | |
| 907 | +emoji[woman_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB\U200D\U2640\UFE0F' | |
| 908 | +emoji[woman_raising_hand_light_skin_tone_minimally]=$'\U1F64B\U1F3FB\U200D\U2640' | |
| 909 | +emoji[woman_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC\U200D\U2640\UFE0F' | |
| 910 | +emoji[woman_raising_hand_medium_light_skin_tone_minimally]=$'\U1F64B\U1F3FC\U200D\U2640' | |
| 911 | +emoji[woman_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD\U200D\U2640\UFE0F' | |
| 912 | +emoji[woman_raising_hand_medium_skin_tone_minimally]=$'\U1F64B\U1F3FD\U200D\U2640' | |
| 913 | +emoji[woman_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE\U200D\U2640\UFE0F' | |
| 914 | +emoji[woman_raising_hand_medium_dark_skin_tone_minimally]=$'\U1F64B\U1F3FE\U200D\U2640' | |
| 915 | +emoji[woman_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF\U200D\U2640\UFE0F' | |
| 916 | +emoji[woman_raising_hand_dark_skin_tone_minimally]=$'\U1F64B\U1F3FF\U200D\U2640' | |
| 917 | +emoji[deaf_person]=$'\U1F9CF' | |
| 918 | +emoji[deaf_person_light_skin_tone]=$'\U1F9CF\U1F3FB' | |
| 919 | +emoji[deaf_person_medium_light_skin_tone]=$'\U1F9CF\U1F3FC' | |
| 920 | +emoji[deaf_person_medium_skin_tone]=$'\U1F9CF\U1F3FD' | |
| 921 | +emoji[deaf_person_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE' | |
| 922 | +emoji[deaf_person_dark_skin_tone]=$'\U1F9CF\U1F3FF' | |
| 923 | +emoji[deaf_man]=$'\U1F9CF\U200D\U2642\UFE0F' | |
| 924 | +emoji[deaf_man_minimally]=$'\U1F9CF\U200D\U2642' | |
| 925 | +emoji[deaf_man_light_skin_tone]=$'\U1F9CF\U1F3FB\U200D\U2642\UFE0F' | |
| 926 | +emoji[deaf_man_light_skin_tone_minimally]=$'\U1F9CF\U1F3FB\U200D\U2642' | |
| 927 | +emoji[deaf_man_medium_light_skin_tone]=$'\U1F9CF\U1F3FC\U200D\U2642\UFE0F' | |
| 928 | +emoji[deaf_man_medium_light_skin_tone_minimally]=$'\U1F9CF\U1F3FC\U200D\U2642' | |
| 929 | +emoji[deaf_man_medium_skin_tone]=$'\U1F9CF\U1F3FD\U200D\U2642\UFE0F' | |
| 930 | +emoji[deaf_man_medium_skin_tone_minimally]=$'\U1F9CF\U1F3FD\U200D\U2642' | |
| 931 | +emoji[deaf_man_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE\U200D\U2642\UFE0F' | |
| 932 | +emoji[deaf_man_medium_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FE\U200D\U2642' | |
| 933 | +emoji[deaf_man_dark_skin_tone]=$'\U1F9CF\U1F3FF\U200D\U2642\UFE0F' | |
| 934 | +emoji[deaf_man_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FF\U200D\U2642' | |
| 935 | +emoji[deaf_woman]=$'\U1F9CF\U200D\U2640\UFE0F' | |
| 936 | +emoji[deaf_woman_minimally]=$'\U1F9CF\U200D\U2640' | |
| 937 | +emoji[deaf_woman_light_skin_tone]=$'\U1F9CF\U1F3FB\U200D\U2640\UFE0F' | |
| 938 | +emoji[deaf_woman_light_skin_tone_minimally]=$'\U1F9CF\U1F3FB\U200D\U2640' | |
| 939 | +emoji[deaf_woman_medium_light_skin_tone]=$'\U1F9CF\U1F3FC\U200D\U2640\UFE0F' | |
| 940 | +emoji[deaf_woman_medium_light_skin_tone_minimally]=$'\U1F9CF\U1F3FC\U200D\U2640' | |
| 941 | +emoji[deaf_woman_medium_skin_tone]=$'\U1F9CF\U1F3FD\U200D\U2640\UFE0F' | |
| 942 | +emoji[deaf_woman_medium_skin_tone_minimally]=$'\U1F9CF\U1F3FD\U200D\U2640' | |
| 943 | +emoji[deaf_woman_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE\U200D\U2640\UFE0F' | |
| 944 | +emoji[deaf_woman_medium_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FE\U200D\U2640' | |
| 945 | +emoji[deaf_woman_dark_skin_tone]=$'\U1F9CF\U1F3FF\U200D\U2640\UFE0F' | |
| 946 | +emoji[deaf_woman_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FF\U200D\U2640' | |
| 947 | +emoji[person_bowing]=$'\U1F647' | |
| 948 | +emoji[bow]=$'\U1F647' | |
| 949 | +emoji[person_bowing_light_skin_tone]=$'\U1F647\U1F3FB' | |
| 950 | +emoji[person_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC' | |
| 951 | +emoji[person_bowing_medium_skin_tone]=$'\U1F647\U1F3FD' | |
| 952 | +emoji[person_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE' | |
| 953 | +emoji[person_bowing_dark_skin_tone]=$'\U1F647\U1F3FF' | |
| 954 | +emoji[man_bowing]=$'\U1F647\U200D\U2642\UFE0F' | |
| 955 | +emoji[man_bowing_minimally]=$'\U1F647\U200D\U2642' | |
| 956 | +emoji[bowing_man]=$'\U1F647\U200D\U2642' | |
| 957 | +emoji[man_bowing_light_skin_tone]=$'\U1F647\U1F3FB\U200D\U2642\UFE0F' | |
| 958 | +emoji[man_bowing_light_skin_tone_minimally]=$'\U1F647\U1F3FB\U200D\U2642' | |
| 959 | +emoji[man_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC\U200D\U2642\UFE0F' | |
| 960 | +emoji[man_bowing_medium_light_skin_tone_minimally]=$'\U1F647\U1F3FC\U200D\U2642' | |
| 961 | +emoji[man_bowing_medium_skin_tone]=$'\U1F647\U1F3FD\U200D\U2642\UFE0F' | |
| 962 | +emoji[man_bowing_medium_skin_tone_minimally]=$'\U1F647\U1F3FD\U200D\U2642' | |
| 963 | +emoji[man_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE\U200D\U2642\UFE0F' | |
| 964 | +emoji[man_bowing_medium_dark_skin_tone_minimally]=$'\U1F647\U1F3FE\U200D\U2642' | |
| 965 | +emoji[man_bowing_dark_skin_tone]=$'\U1F647\U1F3FF\U200D\U2642\UFE0F' | |
| 966 | +emoji[man_bowing_dark_skin_tone_minimally]=$'\U1F647\U1F3FF\U200D\U2642' | |
| 967 | +emoji[woman_bowing]=$'\U1F647\U200D\U2640\UFE0F' | |
| 968 | +emoji[woman_bowing_minimally]=$'\U1F647\U200D\U2640' | |
| 969 | +emoji[bowing_woman]=$'\U1F647\U200D\U2640' | |
| 970 | +emoji[woman_bowing_light_skin_tone]=$'\U1F647\U1F3FB\U200D\U2640\UFE0F' | |
| 971 | +emoji[woman_bowing_light_skin_tone_minimally]=$'\U1F647\U1F3FB\U200D\U2640' | |
| 972 | +emoji[woman_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC\U200D\U2640\UFE0F' | |
| 973 | +emoji[woman_bowing_medium_light_skin_tone_minimally]=$'\U1F647\U1F3FC\U200D\U2640' | |
| 974 | +emoji[woman_bowing_medium_skin_tone]=$'\U1F647\U1F3FD\U200D\U2640\UFE0F' | |
| 975 | +emoji[woman_bowing_medium_skin_tone_minimally]=$'\U1F647\U1F3FD\U200D\U2640' | |
| 976 | +emoji[woman_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE\U200D\U2640\UFE0F' | |
| 977 | +emoji[woman_bowing_medium_dark_skin_tone_minimally]=$'\U1F647\U1F3FE\U200D\U2640' | |
| 978 | +emoji[woman_bowing_dark_skin_tone]=$'\U1F647\U1F3FF\U200D\U2640\UFE0F' | |
| 979 | +emoji[woman_bowing_dark_skin_tone_minimally]=$'\U1F647\U1F3FF\U200D\U2640' | |
| 980 | +emoji[person_facepalming]=$'\U1F926' | |
| 981 | +emoji[facepalm]=$'\U1F926' | |
| 982 | +emoji[person_facepalming_light_skin_tone]=$'\U1F926\U1F3FB' | |
| 983 | +emoji[person_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC' | |
| 984 | +emoji[person_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD' | |
| 985 | +emoji[person_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE' | |
| 986 | +emoji[person_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF' | |
| 987 | +emoji[man_facepalming]=$'\U1F926\U200D\U2642\UFE0F' | |
| 988 | +emoji[man_facepalming_minimally]=$'\U1F926\U200D\U2642' | |
| 989 | +emoji[man_facepalming_light_skin_tone]=$'\U1F926\U1F3FB\U200D\U2642\UFE0F' | |
| 990 | +emoji[man_facepalming_light_skin_tone_minimally]=$'\U1F926\U1F3FB\U200D\U2642' | |
| 991 | +emoji[man_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC\U200D\U2642\UFE0F' | |
| 992 | +emoji[man_facepalming_medium_light_skin_tone_minimally]=$'\U1F926\U1F3FC\U200D\U2642' | |
| 993 | +emoji[man_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD\U200D\U2642\UFE0F' | |
| 994 | +emoji[man_facepalming_medium_skin_tone_minimally]=$'\U1F926\U1F3FD\U200D\U2642' | |
| 995 | +emoji[man_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE\U200D\U2642\UFE0F' | |
| 996 | +emoji[man_facepalming_medium_dark_skin_tone_minimally]=$'\U1F926\U1F3FE\U200D\U2642' | |
| 997 | +emoji[man_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF\U200D\U2642\UFE0F' | |
| 998 | +emoji[man_facepalming_dark_skin_tone_minimally]=$'\U1F926\U1F3FF\U200D\U2642' | |
| 999 | +emoji[woman_facepalming]=$'\U1F926\U200D\U2640\UFE0F' | |
| 1000 | +emoji[woman_facepalming_minimally]=$'\U1F926\U200D\U2640' | |
| 1001 | +emoji[woman_facepalming_light_skin_tone]=$'\U1F926\U1F3FB\U200D\U2640\UFE0F' | |
| 1002 | +emoji[woman_facepalming_light_skin_tone_minimally]=$'\U1F926\U1F3FB\U200D\U2640' | |
| 1003 | +emoji[woman_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC\U200D\U2640\UFE0F' | |
| 1004 | +emoji[woman_facepalming_medium_light_skin_tone_minimally]=$'\U1F926\U1F3FC\U200D\U2640' | |
| 1005 | +emoji[woman_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD\U200D\U2640\UFE0F' | |
| 1006 | +emoji[woman_facepalming_medium_skin_tone_minimally]=$'\U1F926\U1F3FD\U200D\U2640' | |
| 1007 | +emoji[woman_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE\U200D\U2640\UFE0F' | |
| 1008 | +emoji[woman_facepalming_medium_dark_skin_tone_minimally]=$'\U1F926\U1F3FE\U200D\U2640' | |
| 1009 | +emoji[woman_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF\U200D\U2640\UFE0F' | |
| 1010 | +emoji[woman_facepalming_dark_skin_tone_minimally]=$'\U1F926\U1F3FF\U200D\U2640' | |
| 1011 | +emoji[person_shrugging]=$'\U1F937' | |
| 1012 | +emoji[shrug]=$'\U1F937' | |
| 1013 | +emoji[person_shrugging_light_skin_tone]=$'\U1F937\U1F3FB' | |
| 1014 | +emoji[person_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC' | |
| 1015 | +emoji[person_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD' | |
| 1016 | +emoji[person_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE' | |
| 1017 | +emoji[person_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF' | |
| 1018 | +emoji[man_shrugging]=$'\U1F937\U200D\U2642\UFE0F' | |
| 1019 | +emoji[man_shrugging_minimally]=$'\U1F937\U200D\U2642' | |
| 1020 | +emoji[man_shrugging_light_skin_tone]=$'\U1F937\U1F3FB\U200D\U2642\UFE0F' | |
| 1021 | +emoji[man_shrugging_light_skin_tone_minimally]=$'\U1F937\U1F3FB\U200D\U2642' | |
| 1022 | +emoji[man_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC\U200D\U2642\UFE0F' | |
| 1023 | +emoji[man_shrugging_medium_light_skin_tone_minimally]=$'\U1F937\U1F3FC\U200D\U2642' | |
| 1024 | +emoji[man_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD\U200D\U2642\UFE0F' | |
| 1025 | +emoji[man_shrugging_medium_skin_tone_minimally]=$'\U1F937\U1F3FD\U200D\U2642' | |
| 1026 | +emoji[man_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE\U200D\U2642\UFE0F' | |
| 1027 | +emoji[man_shrugging_medium_dark_skin_tone_minimally]=$'\U1F937\U1F3FE\U200D\U2642' | |
| 1028 | +emoji[man_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF\U200D\U2642\UFE0F' | |
| 1029 | +emoji[man_shrugging_dark_skin_tone_minimally]=$'\U1F937\U1F3FF\U200D\U2642' | |
| 1030 | +emoji[woman_shrugging]=$'\U1F937\U200D\U2640\UFE0F' | |
| 1031 | +emoji[woman_shrugging_minimally]=$'\U1F937\U200D\U2640' | |
| 1032 | +emoji[woman_shrugging_light_skin_tone]=$'\U1F937\U1F3FB\U200D\U2640\UFE0F' | |
| 1033 | +emoji[woman_shrugging_light_skin_tone_minimally]=$'\U1F937\U1F3FB\U200D\U2640' | |
| 1034 | +emoji[woman_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC\U200D\U2640\UFE0F' | |
| 1035 | +emoji[woman_shrugging_medium_light_skin_tone_minimally]=$'\U1F937\U1F3FC\U200D\U2640' | |
| 1036 | +emoji[woman_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD\U200D\U2640\UFE0F' | |
| 1037 | +emoji[woman_shrugging_medium_skin_tone_minimally]=$'\U1F937\U1F3FD\U200D\U2640' | |
| 1038 | +emoji[woman_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE\U200D\U2640\UFE0F' | |
| 1039 | +emoji[woman_shrugging_medium_dark_skin_tone_minimally]=$'\U1F937\U1F3FE\U200D\U2640' | |
| 1040 | +emoji[woman_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF\U200D\U2640\UFE0F' | |
| 1041 | +emoji[woman_shrugging_dark_skin_tone_minimally]=$'\U1F937\U1F3FF\U200D\U2640' | |
| 1042 | +emoji[man_health_worker]=$'\U1F468\U200D\U2695\UFE0F' | |
| 1043 | +emoji[man_health_worker_minimally]=$'\U1F468\U200D\U2695' | |
| 1044 | +emoji[man_health_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2695\UFE0F' | |
| 1045 | +emoji[man_health_worker_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2695' | |
| 1046 | +emoji[man_health_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2695\UFE0F' | |
| 1047 | +emoji[man_health_worker_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2695' | |
| 1048 | +emoji[man_health_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2695\UFE0F' | |
| 1049 | +emoji[man_health_worker_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2695' | |
| 1050 | +emoji[man_health_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2695\UFE0F' | |
| 1051 | +emoji[man_health_worker_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2695' | |
| 1052 | +emoji[man_health_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2695\UFE0F' | |
| 1053 | +emoji[man_health_worker_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2695' | |
| 1054 | +emoji[woman_health_worker]=$'\U1F469\U200D\U2695\UFE0F' | |
| 1055 | +emoji[woman_health_worker_minimally]=$'\U1F469\U200D\U2695' | |
| 1056 | +emoji[woman_health_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2695\UFE0F' | |
| 1057 | +emoji[woman_health_worker_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2695' | |
| 1058 | +emoji[woman_health_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2695\UFE0F' | |
| 1059 | +emoji[woman_health_worker_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2695' | |
| 1060 | +emoji[woman_health_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2695\UFE0F' | |
| 1061 | +emoji[woman_health_worker_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2695' | |
| 1062 | +emoji[woman_health_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2695\UFE0F' | |
| 1063 | +emoji[woman_health_worker_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2695' | |
| 1064 | +emoji[woman_health_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2695\UFE0F' | |
| 1065 | +emoji[woman_health_worker_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2695' | |
| 1066 | +emoji[man_student]=$'\U1F468\U200D\U1F393' | |
| 1067 | +emoji[man_student_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F393' | |
| 1068 | +emoji[man_student_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F393' | |
| 1069 | +emoji[man_student_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F393' | |
| 1070 | +emoji[man_student_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F393' | |
| 1071 | +emoji[man_student_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F393' | |
| 1072 | +emoji[woman_student]=$'\U1F469\U200D\U1F393' | |
| 1073 | +emoji[woman_student_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F393' | |
| 1074 | +emoji[woman_student_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F393' | |
| 1075 | +emoji[woman_student_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F393' | |
| 1076 | +emoji[woman_student_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F393' | |
| 1077 | +emoji[woman_student_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F393' | |
| 1078 | +emoji[man_teacher]=$'\U1F468\U200D\U1F3EB' | |
| 1079 | +emoji[man_teacher_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3EB' | |
| 1080 | +emoji[man_teacher_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3EB' | |
| 1081 | +emoji[man_teacher_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3EB' | |
| 1082 | +emoji[man_teacher_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3EB' | |
| 1083 | +emoji[man_teacher_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3EB' | |
| 1084 | +emoji[woman_teacher]=$'\U1F469\U200D\U1F3EB' | |
| 1085 | +emoji[woman_teacher_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3EB' | |
| 1086 | +emoji[woman_teacher_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3EB' | |
| 1087 | +emoji[woman_teacher_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3EB' | |
| 1088 | +emoji[woman_teacher_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3EB' | |
| 1089 | +emoji[woman_teacher_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3EB' | |
| 1090 | +emoji[man_judge]=$'\U1F468\U200D\U2696\UFE0F' | |
| 1091 | +emoji[man_judge_minimally]=$'\U1F468\U200D\U2696' | |
| 1092 | +emoji[man_judge_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2696\UFE0F' | |
| 1093 | +emoji[man_judge_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2696' | |
| 1094 | +emoji[man_judge_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2696\UFE0F' | |
| 1095 | +emoji[man_judge_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2696' | |
| 1096 | +emoji[man_judge_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2696\UFE0F' | |
| 1097 | +emoji[man_judge_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2696' | |
| 1098 | +emoji[man_judge_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2696\UFE0F' | |
| 1099 | +emoji[man_judge_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2696' | |
| 1100 | +emoji[man_judge_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2696\UFE0F' | |
| 1101 | +emoji[man_judge_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2696' | |
| 1102 | +emoji[woman_judge]=$'\U1F469\U200D\U2696\UFE0F' | |
| 1103 | +emoji[woman_judge_minimally]=$'\U1F469\U200D\U2696' | |
| 1104 | +emoji[woman_judge_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2696\UFE0F' | |
| 1105 | +emoji[woman_judge_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2696' | |
| 1106 | +emoji[woman_judge_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2696\UFE0F' | |
| 1107 | +emoji[woman_judge_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2696' | |
| 1108 | +emoji[woman_judge_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2696\UFE0F' | |
| 1109 | +emoji[woman_judge_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2696' | |
| 1110 | +emoji[woman_judge_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2696\UFE0F' | |
| 1111 | +emoji[woman_judge_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2696' | |
| 1112 | +emoji[woman_judge_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2696\UFE0F' | |
| 1113 | +emoji[woman_judge_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2696' | |
| 1114 | +emoji[man_farmer]=$'\U1F468\U200D\U1F33E' | |
| 1115 | +emoji[man_farmer_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F33E' | |
| 1116 | +emoji[man_farmer_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F33E' | |
| 1117 | +emoji[man_farmer_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F33E' | |
| 1118 | +emoji[man_farmer_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F33E' | |
| 1119 | +emoji[man_farmer_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F33E' | |
| 1120 | +emoji[woman_farmer]=$'\U1F469\U200D\U1F33E' | |
| 1121 | +emoji[woman_farmer_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F33E' | |
| 1122 | +emoji[woman_farmer_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F33E' | |
| 1123 | +emoji[woman_farmer_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F33E' | |
| 1124 | +emoji[woman_farmer_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F33E' | |
| 1125 | +emoji[woman_farmer_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F33E' | |
| 1126 | +emoji[man_cook]=$'\U1F468\U200D\U1F373' | |
| 1127 | +emoji[man_cook_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F373' | |
| 1128 | +emoji[man_cook_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F373' | |
| 1129 | +emoji[man_cook_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F373' | |
| 1130 | +emoji[man_cook_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F373' | |
| 1131 | +emoji[man_cook_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F373' | |
| 1132 | +emoji[woman_cook]=$'\U1F469\U200D\U1F373' | |
| 1133 | +emoji[woman_cook_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F373' | |
| 1134 | +emoji[woman_cook_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F373' | |
| 1135 | +emoji[woman_cook_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F373' | |
| 1136 | +emoji[woman_cook_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F373' | |
| 1137 | +emoji[woman_cook_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F373' | |
| 1138 | +emoji[man_mechanic]=$'\U1F468\U200D\U1F527' | |
| 1139 | +emoji[man_mechanic_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F527' | |
| 1140 | +emoji[man_mechanic_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F527' | |
| 1141 | +emoji[man_mechanic_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F527' | |
| 1142 | +emoji[man_mechanic_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F527' | |
| 1143 | +emoji[man_mechanic_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F527' | |
| 1144 | +emoji[woman_mechanic]=$'\U1F469\U200D\U1F527' | |
| 1145 | +emoji[woman_mechanic_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F527' | |
| 1146 | +emoji[woman_mechanic_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F527' | |
| 1147 | +emoji[woman_mechanic_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F527' | |
| 1148 | +emoji[woman_mechanic_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F527' | |
| 1149 | +emoji[woman_mechanic_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F527' | |
| 1150 | +emoji[man_factory_worker]=$'\U1F468\U200D\U1F3ED' | |
| 1151 | +emoji[man_factory_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3ED' | |
| 1152 | +emoji[man_factory_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3ED' | |
| 1153 | +emoji[man_factory_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3ED' | |
| 1154 | +emoji[man_factory_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3ED' | |
| 1155 | +emoji[man_factory_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3ED' | |
| 1156 | +emoji[woman_factory_worker]=$'\U1F469\U200D\U1F3ED' | |
| 1157 | +emoji[woman_factory_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3ED' | |
| 1158 | +emoji[woman_factory_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3ED' | |
| 1159 | +emoji[woman_factory_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3ED' | |
| 1160 | +emoji[woman_factory_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3ED' | |
| 1161 | +emoji[woman_factory_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3ED' | |
| 1162 | +emoji[man_office_worker]=$'\U1F468\U200D\U1F4BC' | |
| 1163 | +emoji[man_office_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F4BC' | |
| 1164 | +emoji[man_office_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F4BC' | |
| 1165 | +emoji[man_office_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F4BC' | |
| 1166 | +emoji[man_office_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F4BC' | |
| 1167 | +emoji[man_office_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F4BC' | |
| 1168 | +emoji[woman_office_worker]=$'\U1F469\U200D\U1F4BC' | |
| 1169 | +emoji[woman_office_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F4BC' | |
| 1170 | +emoji[woman_office_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F4BC' | |
| 1171 | +emoji[woman_office_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F4BC' | |
| 1172 | +emoji[woman_office_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F4BC' | |
| 1173 | +emoji[woman_office_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F4BC' | |
| 1174 | +emoji[man_scientist]=$'\U1F468\U200D\U1F52C' | |
| 1175 | +emoji[man_scientist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F52C' | |
| 1176 | +emoji[man_scientist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F52C' | |
| 1177 | +emoji[man_scientist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F52C' | |
| 1178 | +emoji[man_scientist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F52C' | |
| 1179 | +emoji[man_scientist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F52C' | |
| 1180 | +emoji[woman_scientist]=$'\U1F469\U200D\U1F52C' | |
| 1181 | +emoji[woman_scientist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F52C' | |
| 1182 | +emoji[woman_scientist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F52C' | |
| 1183 | +emoji[woman_scientist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F52C' | |
| 1184 | +emoji[woman_scientist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F52C' | |
| 1185 | +emoji[woman_scientist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F52C' | |
| 1186 | +emoji[man_technologist]=$'\U1F468\U200D\U1F4BB' | |
| 1187 | +emoji[man_technologist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F4BB' | |
| 1188 | +emoji[man_technologist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F4BB' | |
| 1189 | +emoji[man_technologist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F4BB' | |
| 1190 | +emoji[man_technologist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F4BB' | |
| 1191 | +emoji[man_technologist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F4BB' | |
| 1192 | +emoji[woman_technologist]=$'\U1F469\U200D\U1F4BB' | |
| 1193 | +emoji[woman_technologist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F4BB' | |
| 1194 | +emoji[woman_technologist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F4BB' | |
| 1195 | +emoji[woman_technologist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F4BB' | |
| 1196 | +emoji[woman_technologist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F4BB' | |
| 1197 | +emoji[woman_technologist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F4BB' | |
| 1198 | +emoji[man_singer]=$'\U1F468\U200D\U1F3A4' | |
| 1199 | +emoji[man_singer_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3A4' | |
| 1200 | +emoji[man_singer_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3A4' | |
| 1201 | +emoji[man_singer_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3A4' | |
| 1202 | +emoji[man_singer_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3A4' | |
| 1203 | +emoji[man_singer_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3A4' | |
| 1204 | +emoji[woman_singer]=$'\U1F469\U200D\U1F3A4' | |
| 1205 | +emoji[woman_singer_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3A4' | |
| 1206 | +emoji[woman_singer_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3A4' | |
| 1207 | +emoji[woman_singer_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3A4' | |
| 1208 | +emoji[woman_singer_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3A4' | |
| 1209 | +emoji[woman_singer_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3A4' | |
| 1210 | +emoji[man_artist]=$'\U1F468\U200D\U1F3A8' | |
| 1211 | +emoji[man_artist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3A8' | |
| 1212 | +emoji[man_artist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3A8' | |
| 1213 | +emoji[man_artist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3A8' | |
| 1214 | +emoji[man_artist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3A8' | |
| 1215 | +emoji[man_artist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3A8' | |
| 1216 | +emoji[woman_artist]=$'\U1F469\U200D\U1F3A8' | |
| 1217 | +emoji[woman_artist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3A8' | |
| 1218 | +emoji[woman_artist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3A8' | |
| 1219 | +emoji[woman_artist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3A8' | |
| 1220 | +emoji[woman_artist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3A8' | |
| 1221 | +emoji[woman_artist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3A8' | |
| 1222 | +emoji[man_pilot]=$'\U1F468\U200D\U2708\UFE0F' | |
| 1223 | +emoji[man_pilot_minimally]=$'\U1F468\U200D\U2708' | |
| 1224 | +emoji[man_pilot_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2708\UFE0F' | |
| 1225 | +emoji[man_pilot_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2708' | |
| 1226 | +emoji[man_pilot_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2708\UFE0F' | |
| 1227 | +emoji[man_pilot_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2708' | |
| 1228 | +emoji[man_pilot_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2708\UFE0F' | |
| 1229 | +emoji[man_pilot_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2708' | |
| 1230 | +emoji[man_pilot_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2708\UFE0F' | |
| 1231 | +emoji[man_pilot_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2708' | |
| 1232 | +emoji[man_pilot_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2708\UFE0F' | |
| 1233 | +emoji[man_pilot_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2708' | |
| 1234 | +emoji[woman_pilot]=$'\U1F469\U200D\U2708\UFE0F' | |
| 1235 | +emoji[woman_pilot_minimally]=$'\U1F469\U200D\U2708' | |
| 1236 | +emoji[woman_pilot_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2708\UFE0F' | |
| 1237 | +emoji[woman_pilot_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2708' | |
| 1238 | +emoji[woman_pilot_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2708\UFE0F' | |
| 1239 | +emoji[woman_pilot_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2708' | |
| 1240 | +emoji[woman_pilot_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2708\UFE0F' | |
| 1241 | +emoji[woman_pilot_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2708' | |
| 1242 | +emoji[woman_pilot_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2708\UFE0F' | |
| 1243 | +emoji[woman_pilot_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2708' | |
| 1244 | +emoji[woman_pilot_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2708\UFE0F' | |
| 1245 | +emoji[woman_pilot_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2708' | |
| 1246 | +emoji[man_astronaut]=$'\U1F468\U200D\U1F680' | |
| 1247 | +emoji[man_astronaut_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F680' | |
| 1248 | +emoji[man_astronaut_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F680' | |
| 1249 | +emoji[man_astronaut_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F680' | |
| 1250 | +emoji[man_astronaut_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F680' | |
| 1251 | +emoji[man_astronaut_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F680' | |
| 1252 | +emoji[woman_astronaut]=$'\U1F469\U200D\U1F680' | |
| 1253 | +emoji[woman_astronaut_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F680' | |
| 1254 | +emoji[woman_astronaut_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F680' | |
| 1255 | +emoji[woman_astronaut_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F680' | |
| 1256 | +emoji[woman_astronaut_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F680' | |
| 1257 | +emoji[woman_astronaut_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F680' | |
| 1258 | +emoji[man_firefighter]=$'\U1F468\U200D\U1F692' | |
| 1259 | +emoji[man_firefighter_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F692' | |
| 1260 | +emoji[man_firefighter_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F692' | |
| 1261 | +emoji[man_firefighter_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F692' | |
| 1262 | +emoji[man_firefighter_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F692' | |
| 1263 | +emoji[man_firefighter_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F692' | |
| 1264 | +emoji[woman_firefighter]=$'\U1F469\U200D\U1F692' | |
| 1265 | +emoji[woman_firefighter_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F692' | |
| 1266 | +emoji[woman_firefighter_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F692' | |
| 1267 | +emoji[woman_firefighter_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F692' | |
| 1268 | +emoji[woman_firefighter_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F692' | |
| 1269 | +emoji[woman_firefighter_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F692' | |
| 1270 | +emoji[police_officer]=$'\U1F46E' | |
| 1271 | +emoji[cop]=$'\U1F46E' | |
| 1272 | +emoji[police_officer_light_skin_tone]=$'\U1F46E\U1F3FB' | |
| 1273 | +emoji[police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC' | |
| 1274 | +emoji[police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD' | |
| 1275 | +emoji[police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE' | |
| 1276 | +emoji[police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF' | |
| 1277 | +emoji[man_police_officer]=$'\U1F46E\U200D\U2642\UFE0F' | |
| 1278 | +emoji[man_police_officer_minimally]=$'\U1F46E\U200D\U2642' | |
| 1279 | +emoji[policeman]=$'\U1F46E\U200D\U2642' | |
| 1280 | +emoji[man_police_officer_light_skin_tone]=$'\U1F46E\U1F3FB\U200D\U2642\UFE0F' | |
| 1281 | +emoji[man_police_officer_light_skin_tone_minimally]=$'\U1F46E\U1F3FB\U200D\U2642' | |
| 1282 | +emoji[man_police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC\U200D\U2642\UFE0F' | |
| 1283 | +emoji[man_police_officer_medium_light_skin_tone_minimally]=$'\U1F46E\U1F3FC\U200D\U2642' | |
| 1284 | +emoji[man_police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD\U200D\U2642\UFE0F' | |
| 1285 | +emoji[man_police_officer_medium_skin_tone_minimally]=$'\U1F46E\U1F3FD\U200D\U2642' | |
| 1286 | +emoji[man_police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE\U200D\U2642\UFE0F' | |
| 1287 | +emoji[man_police_officer_medium_dark_skin_tone_minimally]=$'\U1F46E\U1F3FE\U200D\U2642' | |
| 1288 | +emoji[man_police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF\U200D\U2642\UFE0F' | |
| 1289 | +emoji[man_police_officer_dark_skin_tone_minimally]=$'\U1F46E\U1F3FF\U200D\U2642' | |
| 1290 | +emoji[woman_police_officer]=$'\U1F46E\U200D\U2640\UFE0F' | |
| 1291 | +emoji[woman_police_officer_minimally]=$'\U1F46E\U200D\U2640' | |
| 1292 | +emoji[policewoman]=$'\U1F46E\U200D\U2640' | |
| 1293 | +emoji[woman_police_officer_light_skin_tone]=$'\U1F46E\U1F3FB\U200D\U2640\UFE0F' | |
| 1294 | +emoji[woman_police_officer_light_skin_tone_minimally]=$'\U1F46E\U1F3FB\U200D\U2640' | |
| 1295 | +emoji[woman_police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC\U200D\U2640\UFE0F' | |
| 1296 | +emoji[woman_police_officer_medium_light_skin_tone_minimally]=$'\U1F46E\U1F3FC\U200D\U2640' | |
| 1297 | +emoji[woman_police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD\U200D\U2640\UFE0F' | |
| 1298 | +emoji[woman_police_officer_medium_skin_tone_minimally]=$'\U1F46E\U1F3FD\U200D\U2640' | |
| 1299 | +emoji[woman_police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE\U200D\U2640\UFE0F' | |
| 1300 | +emoji[woman_police_officer_medium_dark_skin_tone_minimally]=$'\U1F46E\U1F3FE\U200D\U2640' | |
| 1301 | +emoji[woman_police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF\U200D\U2640\UFE0F' | |
| 1302 | +emoji[woman_police_officer_dark_skin_tone_minimally]=$'\U1F46E\U1F3FF\U200D\U2640' | |
| 1303 | +emoji[detective]=$'\U1F575\UFE0F' | |
| 1304 | +emoji[detective_unqualified]=$'\U1F575' | |
| 1305 | +emoji[detective_light_skin_tone]=$'\U1F575\U1F3FB' | |
| 1306 | +emoji[detective_medium_light_skin_tone]=$'\U1F575\U1F3FC' | |
| 1307 | +emoji[detective_medium_skin_tone]=$'\U1F575\U1F3FD' | |
| 1308 | +emoji[detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE' | |
| 1309 | +emoji[detective_dark_skin_tone]=$'\U1F575\U1F3FF' | |
| 1310 | +emoji[man_detective]=$'\U1F575\UFE0F\U200D\U2642\UFE0F' | |
| 1311 | +emoji[male_detective]=$'\U1F575\UFE0F\U200D\U2642\UFE0F' | |
| 1312 | +emoji[man_detective_unqualified]=$'\U1F575\U200D\U2642\UFE0F' | |
| 1313 | +emoji[man_detective_unqualified_1]=$'\U1F575\UFE0F\U200D\U2642' | |
| 1314 | +emoji[man_detective_unqualified_2]=$'\U1F575\U200D\U2642' | |
| 1315 | +emoji[man_detective_light_skin_tone]=$'\U1F575\U1F3FB\U200D\U2642\UFE0F' | |
| 1316 | +emoji[man_detective_light_skin_tone_minimally]=$'\U1F575\U1F3FB\U200D\U2642' | |
| 1317 | +emoji[man_detective_medium_light_skin_tone]=$'\U1F575\U1F3FC\U200D\U2642\UFE0F' | |
| 1318 | +emoji[man_detective_medium_light_skin_tone_minimally]=$'\U1F575\U1F3FC\U200D\U2642' | |
| 1319 | +emoji[man_detective_medium_skin_tone]=$'\U1F575\U1F3FD\U200D\U2642\UFE0F' | |
| 1320 | +emoji[man_detective_medium_skin_tone_minimally]=$'\U1F575\U1F3FD\U200D\U2642' | |
| 1321 | +emoji[man_detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE\U200D\U2642\UFE0F' | |
| 1322 | +emoji[man_detective_medium_dark_skin_tone_minimally]=$'\U1F575\U1F3FE\U200D\U2642' | |
| 1323 | +emoji[man_detective_dark_skin_tone]=$'\U1F575\U1F3FF\U200D\U2642\UFE0F' | |
| 1324 | +emoji[man_detective_dark_skin_tone_minimally]=$'\U1F575\U1F3FF\U200D\U2642' | |
| 1325 | +emoji[woman_detective]=$'\U1F575\UFE0F\U200D\U2640\UFE0F' | |
| 1326 | +emoji[female_detective]=$'\U1F575\UFE0F\U200D\U2640\UFE0F' | |
| 1327 | +emoji[woman_detective_unqualified]=$'\U1F575\U200D\U2640\UFE0F' | |
| 1328 | +emoji[woman_detective_unqualified_1]=$'\U1F575\UFE0F\U200D\U2640' | |
| 1329 | +emoji[woman_detective_unqualified_2]=$'\U1F575\U200D\U2640' | |
| 1330 | +emoji[woman_detective_light_skin_tone]=$'\U1F575\U1F3FB\U200D\U2640\UFE0F' | |
| 1331 | +emoji[woman_detective_light_skin_tone_minimally]=$'\U1F575\U1F3FB\U200D\U2640' | |
| 1332 | +emoji[woman_detective_medium_light_skin_tone]=$'\U1F575\U1F3FC\U200D\U2640\UFE0F' | |
| 1333 | +emoji[woman_detective_medium_light_skin_tone_minimally]=$'\U1F575\U1F3FC\U200D\U2640' | |
| 1334 | +emoji[woman_detective_medium_skin_tone]=$'\U1F575\U1F3FD\U200D\U2640\UFE0F' | |
| 1335 | +emoji[woman_detective_medium_skin_tone_minimally]=$'\U1F575\U1F3FD\U200D\U2640' | |
| 1336 | +emoji[woman_detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE\U200D\U2640\UFE0F' | |
| 1337 | +emoji[woman_detective_medium_dark_skin_tone_minimally]=$'\U1F575\U1F3FE\U200D\U2640' | |
| 1338 | +emoji[woman_detective_dark_skin_tone]=$'\U1F575\U1F3FF\U200D\U2640\UFE0F' | |
| 1339 | +emoji[woman_detective_dark_skin_tone_minimally]=$'\U1F575\U1F3FF\U200D\U2640' | |
| 1340 | +emoji[guard]=$'\U1F482' | |
| 1341 | +emoji[guard_light_skin_tone]=$'\U1F482\U1F3FB' | |
| 1342 | +emoji[guard_medium_light_skin_tone]=$'\U1F482\U1F3FC' | |
| 1343 | +emoji[guard_medium_skin_tone]=$'\U1F482\U1F3FD' | |
| 1344 | +emoji[guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE' | |
| 1345 | +emoji[guard_dark_skin_tone]=$'\U1F482\U1F3FF' | |
| 1346 | +emoji[man_guard]=$'\U1F482\U200D\U2642\UFE0F' | |
| 1347 | +emoji[man_guard_minimally]=$'\U1F482\U200D\U2642' | |
| 1348 | +emoji[guardsman]=$'\U1F482\U200D\U2642' | |
| 1349 | +emoji[man_guard_light_skin_tone]=$'\U1F482\U1F3FB\U200D\U2642\UFE0F' | |
| 1350 | +emoji[man_guard_light_skin_tone_minimally]=$'\U1F482\U1F3FB\U200D\U2642' | |
| 1351 | +emoji[man_guard_medium_light_skin_tone]=$'\U1F482\U1F3FC\U200D\U2642\UFE0F' | |
| 1352 | +emoji[man_guard_medium_light_skin_tone_minimally]=$'\U1F482\U1F3FC\U200D\U2642' | |
| 1353 | +emoji[man_guard_medium_skin_tone]=$'\U1F482\U1F3FD\U200D\U2642\UFE0F' | |
| 1354 | +emoji[man_guard_medium_skin_tone_minimally]=$'\U1F482\U1F3FD\U200D\U2642' | |
| 1355 | +emoji[man_guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE\U200D\U2642\UFE0F' | |
| 1356 | +emoji[man_guard_medium_dark_skin_tone_minimally]=$'\U1F482\U1F3FE\U200D\U2642' | |
| 1357 | +emoji[man_guard_dark_skin_tone]=$'\U1F482\U1F3FF\U200D\U2642\UFE0F' | |
| 1358 | +emoji[man_guard_dark_skin_tone_minimally]=$'\U1F482\U1F3FF\U200D\U2642' | |
| 1359 | +emoji[woman_guard]=$'\U1F482\U200D\U2640\UFE0F' | |
| 1360 | +emoji[woman_guard_minimally]=$'\U1F482\U200D\U2640' | |
| 1361 | +emoji[guardswoman]=$'\U1F482\U200D\U2640' | |
| 1362 | +emoji[woman_guard_light_skin_tone]=$'\U1F482\U1F3FB\U200D\U2640\UFE0F' | |
| 1363 | +emoji[woman_guard_light_skin_tone_minimally]=$'\U1F482\U1F3FB\U200D\U2640' | |
| 1364 | +emoji[woman_guard_medium_light_skin_tone]=$'\U1F482\U1F3FC\U200D\U2640\UFE0F' | |
| 1365 | +emoji[woman_guard_medium_light_skin_tone_minimally]=$'\U1F482\U1F3FC\U200D\U2640' | |
| 1366 | +emoji[woman_guard_medium_skin_tone]=$'\U1F482\U1F3FD\U200D\U2640\UFE0F' | |
| 1367 | +emoji[woman_guard_medium_skin_tone_minimally]=$'\U1F482\U1F3FD\U200D\U2640' | |
| 1368 | +emoji[woman_guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE\U200D\U2640\UFE0F' | |
| 1369 | +emoji[woman_guard_medium_dark_skin_tone_minimally]=$'\U1F482\U1F3FE\U200D\U2640' | |
| 1370 | +emoji[woman_guard_dark_skin_tone]=$'\U1F482\U1F3FF\U200D\U2640\UFE0F' | |
| 1371 | +emoji[woman_guard_dark_skin_tone_minimally]=$'\U1F482\U1F3FF\U200D\U2640' | |
| 1372 | +emoji[construction_worker]=$'\U1F477' | |
| 1373 | +emoji[construction_worker_light_skin_tone]=$'\U1F477\U1F3FB' | |
| 1374 | +emoji[construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC' | |
| 1375 | +emoji[construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD' | |
| 1376 | +emoji[construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE' | |
| 1377 | +emoji[construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF' | |
| 1378 | +emoji[man_construction_worker]=$'\U1F477\U200D\U2642\UFE0F' | |
| 1379 | +emoji[man_construction_worker_minimally]=$'\U1F477\U200D\U2642' | |
| 1380 | +emoji[construction_worker_man]=$'\U1F477\U200D\U2642' | |
| 1381 | +emoji[man_construction_worker_light_skin_tone]=$'\U1F477\U1F3FB\U200D\U2642\UFE0F' | |
| 1382 | +emoji[man_construction_worker_light_skin_tone_minimally]=$'\U1F477\U1F3FB\U200D\U2642' | |
| 1383 | +emoji[man_construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC\U200D\U2642\UFE0F' | |
| 1384 | +emoji[man_construction_worker_medium_light_skin_tone_minimally]=$'\U1F477\U1F3FC\U200D\U2642' | |
| 1385 | +emoji[man_construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD\U200D\U2642\UFE0F' | |
| 1386 | +emoji[man_construction_worker_medium_skin_tone_minimally]=$'\U1F477\U1F3FD\U200D\U2642' | |
| 1387 | +emoji[man_construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE\U200D\U2642\UFE0F' | |
| 1388 | +emoji[man_construction_worker_medium_dark_skin_tone_minimally]=$'\U1F477\U1F3FE\U200D\U2642' | |
| 1389 | +emoji[man_construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF\U200D\U2642\UFE0F' | |
| 1390 | +emoji[man_construction_worker_dark_skin_tone_minimally]=$'\U1F477\U1F3FF\U200D\U2642' | |
| 1391 | +emoji[woman_construction_worker]=$'\U1F477\U200D\U2640\UFE0F' | |
| 1392 | +emoji[woman_construction_worker_minimally]=$'\U1F477\U200D\U2640' | |
| 1393 | +emoji[construction_worker_woman]=$'\U1F477\U200D\U2640' | |
| 1394 | +emoji[woman_construction_worker_light_skin_tone]=$'\U1F477\U1F3FB\U200D\U2640\UFE0F' | |
| 1395 | +emoji[woman_construction_worker_light_skin_tone_minimally]=$'\U1F477\U1F3FB\U200D\U2640' | |
| 1396 | +emoji[woman_construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC\U200D\U2640\UFE0F' | |
| 1397 | +emoji[woman_construction_worker_medium_light_skin_tone_minimally]=$'\U1F477\U1F3FC\U200D\U2640' | |
| 1398 | +emoji[woman_construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD\U200D\U2640\UFE0F' | |
| 1399 | +emoji[woman_construction_worker_medium_skin_tone_minimally]=$'\U1F477\U1F3FD\U200D\U2640' | |
| 1400 | +emoji[woman_construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE\U200D\U2640\UFE0F' | |
| 1401 | +emoji[woman_construction_worker_medium_dark_skin_tone_minimally]=$'\U1F477\U1F3FE\U200D\U2640' | |
| 1402 | +emoji[woman_construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF\U200D\U2640\UFE0F' | |
| 1403 | +emoji[woman_construction_worker_dark_skin_tone_minimally]=$'\U1F477\U1F3FF\U200D\U2640' | |
| 1404 | +emoji[prince]=$'\U1F934' | |
| 1405 | +emoji[prince_light_skin_tone]=$'\U1F934\U1F3FB' | |
| 1406 | +emoji[prince_medium_light_skin_tone]=$'\U1F934\U1F3FC' | |
| 1407 | +emoji[prince_medium_skin_tone]=$'\U1F934\U1F3FD' | |
| 1408 | +emoji[prince_medium_dark_skin_tone]=$'\U1F934\U1F3FE' | |
| 1409 | +emoji[prince_dark_skin_tone]=$'\U1F934\U1F3FF' | |
| 1410 | +emoji[princess]=$'\U1F478' | |
| 1411 | +emoji[princess_light_skin_tone]=$'\U1F478\U1F3FB' | |
| 1412 | +emoji[princess_medium_light_skin_tone]=$'\U1F478\U1F3FC' | |
| 1413 | +emoji[princess_medium_skin_tone]=$'\U1F478\U1F3FD' | |
| 1414 | +emoji[princess_medium_dark_skin_tone]=$'\U1F478\U1F3FE' | |
| 1415 | +emoji[princess_dark_skin_tone]=$'\U1F478\U1F3FF' | |
| 1416 | +emoji[person_wearing_turban]=$'\U1F473' | |
| 1417 | +emoji[person_with_turban]=$'\U1F473' | |
| 1418 | +emoji[person_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB' | |
| 1419 | +emoji[person_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC' | |
| 1420 | +emoji[person_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD' | |
| 1421 | +emoji[person_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE' | |
| 1422 | +emoji[person_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF' | |
| 1423 | +emoji[man_wearing_turban]=$'\U1F473\U200D\U2642\UFE0F' | |
| 1424 | +emoji[man_wearing_turban_minimally]=$'\U1F473\U200D\U2642' | |
| 1425 | +emoji[man_with_turban]=$'\U1F473\U200D\U2642' | |
| 1426 | +emoji[man_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB\U200D\U2642\UFE0F' | |
| 1427 | +emoji[man_wearing_turban_light_skin_tone_minimally]=$'\U1F473\U1F3FB\U200D\U2642' | |
| 1428 | +emoji[man_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC\U200D\U2642\UFE0F' | |
| 1429 | +emoji[man_wearing_turban_medium_light_skin_tone_minimally]=$'\U1F473\U1F3FC\U200D\U2642' | |
| 1430 | +emoji[man_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD\U200D\U2642\UFE0F' | |
| 1431 | +emoji[man_wearing_turban_medium_skin_tone_minimally]=$'\U1F473\U1F3FD\U200D\U2642' | |
| 1432 | +emoji[man_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE\U200D\U2642\UFE0F' | |
| 1433 | +emoji[man_wearing_turban_medium_dark_skin_tone_minimally]=$'\U1F473\U1F3FE\U200D\U2642' | |
| 1434 | +emoji[man_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF\U200D\U2642\UFE0F' | |
| 1435 | +emoji[man_wearing_turban_dark_skin_tone_minimally]=$'\U1F473\U1F3FF\U200D\U2642' | |
| 1436 | +emoji[woman_wearing_turban]=$'\U1F473\U200D\U2640\UFE0F' | |
| 1437 | +emoji[woman_wearing_turban_minimally]=$'\U1F473\U200D\U2640' | |
| 1438 | +emoji[woman_with_turban]=$'\U1F473\U200D\U2640' | |
| 1439 | +emoji[woman_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB\U200D\U2640\UFE0F' | |
| 1440 | +emoji[woman_wearing_turban_light_skin_tone_minimally]=$'\U1F473\U1F3FB\U200D\U2640' | |
| 1441 | +emoji[woman_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC\U200D\U2640\UFE0F' | |
| 1442 | +emoji[woman_wearing_turban_medium_light_skin_tone_minimally]=$'\U1F473\U1F3FC\U200D\U2640' | |
| 1443 | +emoji[woman_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD\U200D\U2640\UFE0F' | |
| 1444 | +emoji[woman_wearing_turban_medium_skin_tone_minimally]=$'\U1F473\U1F3FD\U200D\U2640' | |
| 1445 | +emoji[woman_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE\U200D\U2640\UFE0F' | |
| 1446 | +emoji[woman_wearing_turban_medium_dark_skin_tone_minimally]=$'\U1F473\U1F3FE\U200D\U2640' | |
| 1447 | +emoji[woman_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF\U200D\U2640\UFE0F' | |
| 1448 | +emoji[woman_wearing_turban_dark_skin_tone_minimally]=$'\U1F473\U1F3FF\U200D\U2640' | |
| 1449 | +emoji[man_with_Chinese_cap]=$'\U1F472' | |
| 1450 | +emoji[man_with_gua_pi_mao]=$'\U1F472' | |
| 1451 | +emoji[man_with_Chinese_cap_light_skin_tone]=$'\U1F472\U1F3FB' | |
| 1452 | +emoji[man_with_Chinese_cap_medium_light_skin_tone]=$'\U1F472\U1F3FC' | |
| 1453 | +emoji[man_with_Chinese_cap_medium_skin_tone]=$'\U1F472\U1F3FD' | |
| 1454 | +emoji[man_with_Chinese_cap_medium_dark_skin_tone]=$'\U1F472\U1F3FE' | |
| 1455 | +emoji[man_with_Chinese_cap_dark_skin_tone]=$'\U1F472\U1F3FF' | |
| 1456 | +emoji[woman_with_headscarf]=$'\U1F9D5' | |
| 1457 | +emoji[woman_with_headscarf_light_skin_tone]=$'\U1F9D5\U1F3FB' | |
| 1458 | +emoji[woman_with_headscarf_medium_light_skin_tone]=$'\U1F9D5\U1F3FC' | |
| 1459 | +emoji[woman_with_headscarf_medium_skin_tone]=$'\U1F9D5\U1F3FD' | |
| 1460 | +emoji[woman_with_headscarf_medium_dark_skin_tone]=$'\U1F9D5\U1F3FE' | |
| 1461 | +emoji[woman_with_headscarf_dark_skin_tone]=$'\U1F9D5\U1F3FF' | |
| 1462 | +emoji[man_in_tuxedo]=$'\U1F935' | |
| 1463 | +emoji[man_in_tuxedo_light_skin_tone]=$'\U1F935\U1F3FB' | |
| 1464 | +emoji[man_in_tuxedo_medium_light_skin_tone]=$'\U1F935\U1F3FC' | |
| 1465 | +emoji[man_in_tuxedo_medium_skin_tone]=$'\U1F935\U1F3FD' | |
| 1466 | +emoji[man_in_tuxedo_medium_dark_skin_tone]=$'\U1F935\U1F3FE' | |
| 1467 | +emoji[man_in_tuxedo_dark_skin_tone]=$'\U1F935\U1F3FF' | |
| 1468 | +emoji[bride_with_veil]=$'\U1F470' | |
| 1469 | +emoji[bride_with_veil_light_skin_tone]=$'\U1F470\U1F3FB' | |
| 1470 | +emoji[bride_with_veil_medium_light_skin_tone]=$'\U1F470\U1F3FC' | |
| 1471 | +emoji[bride_with_veil_medium_skin_tone]=$'\U1F470\U1F3FD' | |
| 1472 | +emoji[bride_with_veil_medium_dark_skin_tone]=$'\U1F470\U1F3FE' | |
| 1473 | +emoji[bride_with_veil_dark_skin_tone]=$'\U1F470\U1F3FF' | |
| 1474 | +emoji[pregnant_woman]=$'\U1F930' | |
| 1475 | +emoji[pregnant_woman_light_skin_tone]=$'\U1F930\U1F3FB' | |
| 1476 | +emoji[pregnant_woman_medium_light_skin_tone]=$'\U1F930\U1F3FC' | |
| 1477 | +emoji[pregnant_woman_medium_skin_tone]=$'\U1F930\U1F3FD' | |
| 1478 | +emoji[pregnant_woman_medium_dark_skin_tone]=$'\U1F930\U1F3FE' | |
| 1479 | +emoji[pregnant_woman_dark_skin_tone]=$'\U1F930\U1F3FF' | |
| 1480 | +emoji[breast_feeding]=$'\U1F931' | |
| 1481 | +emoji[breast_feeding_light_skin_tone]=$'\U1F931\U1F3FB' | |
| 1482 | +emoji[breast_feeding_medium_light_skin_tone]=$'\U1F931\U1F3FC' | |
| 1483 | +emoji[breast_feeding_medium_skin_tone]=$'\U1F931\U1F3FD' | |
| 1484 | +emoji[breast_feeding_medium_dark_skin_tone]=$'\U1F931\U1F3FE' | |
| 1485 | +emoji[breast_feeding_dark_skin_tone]=$'\U1F931\U1F3FF' | |
| 1486 | +emoji[baby_angel]=$'\U1F47C' | |
| 1487 | +emoji[angel]=$'\U1F47C' | |
| 1488 | +emoji[baby_angel_light_skin_tone]=$'\U1F47C\U1F3FB' | |
| 1489 | +emoji[baby_angel_medium_light_skin_tone]=$'\U1F47C\U1F3FC' | |
| 1490 | +emoji[baby_angel_medium_skin_tone]=$'\U1F47C\U1F3FD' | |
| 1491 | +emoji[baby_angel_medium_dark_skin_tone]=$'\U1F47C\U1F3FE' | |
| 1492 | +emoji[baby_angel_dark_skin_tone]=$'\U1F47C\U1F3FF' | |
| 1493 | +emoji[Santa_Claus]=$'\U1F385' | |
| 1494 | +emoji[santa]=$'\U1F385' | |
| 1495 | +emoji[Santa_Claus_light_skin_tone]=$'\U1F385\U1F3FB' | |
| 1496 | +emoji[Santa_Claus_medium_light_skin_tone]=$'\U1F385\U1F3FC' | |
| 1497 | +emoji[Santa_Claus_medium_skin_tone]=$'\U1F385\U1F3FD' | |
| 1498 | +emoji[Santa_Claus_medium_dark_skin_tone]=$'\U1F385\U1F3FE' | |
| 1499 | +emoji[Santa_Claus_dark_skin_tone]=$'\U1F385\U1F3FF' | |
| 1500 | +emoji[Mrs_Claus]=$'\U1F936' | |
| 1501 | +emoji[mrs_claus]=$'\U1F936' | |
| 1502 | +emoji[Mrs_Claus_light_skin_tone]=$'\U1F936\U1F3FB' | |
| 1503 | +emoji[Mrs_Claus_medium_light_skin_tone]=$'\U1F936\U1F3FC' | |
| 1504 | +emoji[Mrs_Claus_medium_skin_tone]=$'\U1F936\U1F3FD' | |
| 1505 | +emoji[Mrs_Claus_medium_dark_skin_tone]=$'\U1F936\U1F3FE' | |
| 1506 | +emoji[Mrs_Claus_dark_skin_tone]=$'\U1F936\U1F3FF' | |
| 1507 | +emoji[superhero]=$'\U1F9B8' | |
| 1508 | +emoji[superhero_light_skin_tone]=$'\U1F9B8\U1F3FB' | |
| 1509 | +emoji[superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC' | |
| 1510 | +emoji[superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD' | |
| 1511 | +emoji[superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE' | |
| 1512 | +emoji[superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF' | |
| 1513 | +emoji[man_superhero]=$'\U1F9B8\U200D\U2642\UFE0F' | |
| 1514 | +emoji[man_superhero_minimally]=$'\U1F9B8\U200D\U2642' | |
| 1515 | +emoji[superhero_man]=$'\U1F9B8\U200D\U2642' | |
| 1516 | +emoji[man_superhero_light_skin_tone]=$'\U1F9B8\U1F3FB\U200D\U2642\UFE0F' | |
| 1517 | +emoji[man_superhero_light_skin_tone_minimally]=$'\U1F9B8\U1F3FB\U200D\U2642' | |
| 1518 | +emoji[man_superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC\U200D\U2642\UFE0F' | |
| 1519 | +emoji[man_superhero_medium_light_skin_tone_minimally]=$'\U1F9B8\U1F3FC\U200D\U2642' | |
| 1520 | +emoji[man_superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD\U200D\U2642\UFE0F' | |
| 1521 | +emoji[man_superhero_medium_skin_tone_minimally]=$'\U1F9B8\U1F3FD\U200D\U2642' | |
| 1522 | +emoji[man_superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE\U200D\U2642\UFE0F' | |
| 1523 | +emoji[man_superhero_medium_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FE\U200D\U2642' | |
| 1524 | +emoji[man_superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF\U200D\U2642\UFE0F' | |
| 1525 | +emoji[man_superhero_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FF\U200D\U2642' | |
| 1526 | +emoji[woman_superhero]=$'\U1F9B8\U200D\U2640\UFE0F' | |
| 1527 | +emoji[woman_superhero_minimally]=$'\U1F9B8\U200D\U2640' | |
| 1528 | +emoji[superhero_woman]=$'\U1F9B8\U200D\U2640' | |
| 1529 | +emoji[woman_superhero_light_skin_tone]=$'\U1F9B8\U1F3FB\U200D\U2640\UFE0F' | |
| 1530 | +emoji[woman_superhero_light_skin_tone_minimally]=$'\U1F9B8\U1F3FB\U200D\U2640' | |
| 1531 | +emoji[woman_superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC\U200D\U2640\UFE0F' | |
| 1532 | +emoji[woman_superhero_medium_light_skin_tone_minimally]=$'\U1F9B8\U1F3FC\U200D\U2640' | |
| 1533 | +emoji[woman_superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD\U200D\U2640\UFE0F' | |
| 1534 | +emoji[woman_superhero_medium_skin_tone_minimally]=$'\U1F9B8\U1F3FD\U200D\U2640' | |
| 1535 | +emoji[woman_superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE\U200D\U2640\UFE0F' | |
| 1536 | +emoji[woman_superhero_medium_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FE\U200D\U2640' | |
| 1537 | +emoji[woman_superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF\U200D\U2640\UFE0F' | |
| 1538 | +emoji[woman_superhero_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FF\U200D\U2640' | |
| 1539 | +emoji[supervillain]=$'\U1F9B9' | |
| 1540 | +emoji[supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB' | |
| 1541 | +emoji[supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC' | |
| 1542 | +emoji[supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD' | |
| 1543 | +emoji[supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE' | |
| 1544 | +emoji[supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF' | |
| 1545 | +emoji[man_supervillain]=$'\U1F9B9\U200D\U2642\UFE0F' | |
| 1546 | +emoji[man_supervillain_minimally]=$'\U1F9B9\U200D\U2642' | |
| 1547 | +emoji[supervillain_man]=$'\U1F9B9\U200D\U2642' | |
| 1548 | +emoji[man_supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB\U200D\U2642\UFE0F' | |
| 1549 | +emoji[man_supervillain_light_skin_tone_minimally]=$'\U1F9B9\U1F3FB\U200D\U2642' | |
| 1550 | +emoji[man_supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC\U200D\U2642\UFE0F' | |
| 1551 | +emoji[man_supervillain_medium_light_skin_tone_minimally]=$'\U1F9B9\U1F3FC\U200D\U2642' | |
| 1552 | +emoji[man_supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD\U200D\U2642\UFE0F' | |
| 1553 | +emoji[man_supervillain_medium_skin_tone_minimally]=$'\U1F9B9\U1F3FD\U200D\U2642' | |
| 1554 | +emoji[man_supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE\U200D\U2642\UFE0F' | |
| 1555 | +emoji[man_supervillain_medium_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FE\U200D\U2642' | |
| 1556 | +emoji[man_supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF\U200D\U2642\UFE0F' | |
| 1557 | +emoji[man_supervillain_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FF\U200D\U2642' | |
| 1558 | +emoji[woman_supervillain]=$'\U1F9B9\U200D\U2640\UFE0F' | |
| 1559 | +emoji[woman_supervillain_minimally]=$'\U1F9B9\U200D\U2640' | |
| 1560 | +emoji[supervillain_woman]=$'\U1F9B9\U200D\U2640' | |
| 1561 | +emoji[woman_supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB\U200D\U2640\UFE0F' | |
| 1562 | +emoji[woman_supervillain_light_skin_tone_minimally]=$'\U1F9B9\U1F3FB\U200D\U2640' | |
| 1563 | +emoji[woman_supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC\U200D\U2640\UFE0F' | |
| 1564 | +emoji[woman_supervillain_medium_light_skin_tone_minimally]=$'\U1F9B9\U1F3FC\U200D\U2640' | |
| 1565 | +emoji[woman_supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD\U200D\U2640\UFE0F' | |
| 1566 | +emoji[woman_supervillain_medium_skin_tone_minimally]=$'\U1F9B9\U1F3FD\U200D\U2640' | |
| 1567 | +emoji[woman_supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE\U200D\U2640\UFE0F' | |
| 1568 | +emoji[woman_supervillain_medium_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FE\U200D\U2640' | |
| 1569 | +emoji[woman_supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF\U200D\U2640\UFE0F' | |
| 1570 | +emoji[woman_supervillain_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FF\U200D\U2640' | |
| 1571 | +emoji[mage]=$'\U1F9D9' | |
| 1572 | +emoji[mage_light_skin_tone]=$'\U1F9D9\U1F3FB' | |
| 1573 | +emoji[mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC' | |
| 1574 | +emoji[mage_medium_skin_tone]=$'\U1F9D9\U1F3FD' | |
| 1575 | +emoji[mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE' | |
| 1576 | +emoji[mage_dark_skin_tone]=$'\U1F9D9\U1F3FF' | |
| 1577 | +emoji[man_mage]=$'\U1F9D9\U200D\U2642\UFE0F' | |
| 1578 | +emoji[man_mage_minimally]=$'\U1F9D9\U200D\U2642' | |
| 1579 | +emoji[mage_man]=$'\U1F9D9\U200D\U2642' | |
| 1580 | +emoji[man_mage_light_skin_tone]=$'\U1F9D9\U1F3FB\U200D\U2642\UFE0F' | |
| 1581 | +emoji[man_mage_light_skin_tone_minimally]=$'\U1F9D9\U1F3FB\U200D\U2642' | |
| 1582 | +emoji[man_mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC\U200D\U2642\UFE0F' | |
| 1583 | +emoji[man_mage_medium_light_skin_tone_minimally]=$'\U1F9D9\U1F3FC\U200D\U2642' | |
| 1584 | +emoji[man_mage_medium_skin_tone]=$'\U1F9D9\U1F3FD\U200D\U2642\UFE0F' | |
| 1585 | +emoji[man_mage_medium_skin_tone_minimally]=$'\U1F9D9\U1F3FD\U200D\U2642' | |
| 1586 | +emoji[man_mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE\U200D\U2642\UFE0F' | |
| 1587 | +emoji[man_mage_medium_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FE\U200D\U2642' | |
| 1588 | +emoji[man_mage_dark_skin_tone]=$'\U1F9D9\U1F3FF\U200D\U2642\UFE0F' | |
| 1589 | +emoji[man_mage_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FF\U200D\U2642' | |
| 1590 | +emoji[woman_mage]=$'\U1F9D9\U200D\U2640\UFE0F' | |
| 1591 | +emoji[woman_mage_minimally]=$'\U1F9D9\U200D\U2640' | |
| 1592 | +emoji[mage_woman]=$'\U1F9D9\U200D\U2640' | |
| 1593 | +emoji[woman_mage_light_skin_tone]=$'\U1F9D9\U1F3FB\U200D\U2640\UFE0F' | |
| 1594 | +emoji[woman_mage_light_skin_tone_minimally]=$'\U1F9D9\U1F3FB\U200D\U2640' | |
| 1595 | +emoji[woman_mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC\U200D\U2640\UFE0F' | |
| 1596 | +emoji[woman_mage_medium_light_skin_tone_minimally]=$'\U1F9D9\U1F3FC\U200D\U2640' | |
| 1597 | +emoji[woman_mage_medium_skin_tone]=$'\U1F9D9\U1F3FD\U200D\U2640\UFE0F' | |
| 1598 | +emoji[woman_mage_medium_skin_tone_minimally]=$'\U1F9D9\U1F3FD\U200D\U2640' | |
| 1599 | +emoji[woman_mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE\U200D\U2640\UFE0F' | |
| 1600 | +emoji[woman_mage_medium_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FE\U200D\U2640' | |
| 1601 | +emoji[woman_mage_dark_skin_tone]=$'\U1F9D9\U1F3FF\U200D\U2640\UFE0F' | |
| 1602 | +emoji[woman_mage_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FF\U200D\U2640' | |
| 1603 | +emoji[fairy]=$'\U1F9DA' | |
| 1604 | +emoji[fairy_light_skin_tone]=$'\U1F9DA\U1F3FB' | |
| 1605 | +emoji[fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC' | |
| 1606 | +emoji[fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD' | |
| 1607 | +emoji[fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE' | |
| 1608 | +emoji[fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF' | |
| 1609 | +emoji[man_fairy]=$'\U1F9DA\U200D\U2642\UFE0F' | |
| 1610 | +emoji[man_fairy_minimally]=$'\U1F9DA\U200D\U2642' | |
| 1611 | +emoji[fairy_man]=$'\U1F9DA\U200D\U2642' | |
| 1612 | +emoji[man_fairy_light_skin_tone]=$'\U1F9DA\U1F3FB\U200D\U2642\UFE0F' | |
| 1613 | +emoji[man_fairy_light_skin_tone_minimally]=$'\U1F9DA\U1F3FB\U200D\U2642' | |
| 1614 | +emoji[man_fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC\U200D\U2642\UFE0F' | |
| 1615 | +emoji[man_fairy_medium_light_skin_tone_minimally]=$'\U1F9DA\U1F3FC\U200D\U2642' | |
| 1616 | +emoji[man_fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD\U200D\U2642\UFE0F' | |
| 1617 | +emoji[man_fairy_medium_skin_tone_minimally]=$'\U1F9DA\U1F3FD\U200D\U2642' | |
| 1618 | +emoji[man_fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE\U200D\U2642\UFE0F' | |
| 1619 | +emoji[man_fairy_medium_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FE\U200D\U2642' | |
| 1620 | +emoji[man_fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF\U200D\U2642\UFE0F' | |
| 1621 | +emoji[man_fairy_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FF\U200D\U2642' | |
| 1622 | +emoji[woman_fairy]=$'\U1F9DA\U200D\U2640\UFE0F' | |
| 1623 | +emoji[woman_fairy_minimally]=$'\U1F9DA\U200D\U2640' | |
| 1624 | +emoji[fairy_woman]=$'\U1F9DA\U200D\U2640' | |
| 1625 | +emoji[woman_fairy_light_skin_tone]=$'\U1F9DA\U1F3FB\U200D\U2640\UFE0F' | |
| 1626 | +emoji[woman_fairy_light_skin_tone_minimally]=$'\U1F9DA\U1F3FB\U200D\U2640' | |
| 1627 | +emoji[woman_fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC\U200D\U2640\UFE0F' | |
| 1628 | +emoji[woman_fairy_medium_light_skin_tone_minimally]=$'\U1F9DA\U1F3FC\U200D\U2640' | |
| 1629 | +emoji[woman_fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD\U200D\U2640\UFE0F' | |
| 1630 | +emoji[woman_fairy_medium_skin_tone_minimally]=$'\U1F9DA\U1F3FD\U200D\U2640' | |
| 1631 | +emoji[woman_fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE\U200D\U2640\UFE0F' | |
| 1632 | +emoji[woman_fairy_medium_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FE\U200D\U2640' | |
| 1633 | +emoji[woman_fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF\U200D\U2640\UFE0F' | |
| 1634 | +emoji[woman_fairy_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FF\U200D\U2640' | |
| 1635 | +emoji[vampire]=$'\U1F9DB' | |
| 1636 | +emoji[vampire_light_skin_tone]=$'\U1F9DB\U1F3FB' | |
| 1637 | +emoji[vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC' | |
| 1638 | +emoji[vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD' | |
| 1639 | +emoji[vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE' | |
| 1640 | +emoji[vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF' | |
| 1641 | +emoji[man_vampire]=$'\U1F9DB\U200D\U2642\UFE0F' | |
| 1642 | +emoji[man_vampire_minimally]=$'\U1F9DB\U200D\U2642' | |
| 1643 | +emoji[vampire_man]=$'\U1F9DB\U200D\U2642' | |
| 1644 | +emoji[man_vampire_light_skin_tone]=$'\U1F9DB\U1F3FB\U200D\U2642\UFE0F' | |
| 1645 | +emoji[man_vampire_light_skin_tone_minimally]=$'\U1F9DB\U1F3FB\U200D\U2642' | |
| 1646 | +emoji[man_vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC\U200D\U2642\UFE0F' | |
| 1647 | +emoji[man_vampire_medium_light_skin_tone_minimally]=$'\U1F9DB\U1F3FC\U200D\U2642' | |
| 1648 | +emoji[man_vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD\U200D\U2642\UFE0F' | |
| 1649 | +emoji[man_vampire_medium_skin_tone_minimally]=$'\U1F9DB\U1F3FD\U200D\U2642' | |
| 1650 | +emoji[man_vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE\U200D\U2642\UFE0F' | |
| 1651 | +emoji[man_vampire_medium_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FE\U200D\U2642' | |
| 1652 | +emoji[man_vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF\U200D\U2642\UFE0F' | |
| 1653 | +emoji[man_vampire_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FF\U200D\U2642' | |
| 1654 | +emoji[woman_vampire]=$'\U1F9DB\U200D\U2640\UFE0F' | |
| 1655 | +emoji[woman_vampire_minimally]=$'\U1F9DB\U200D\U2640' | |
| 1656 | +emoji[vampire_woman]=$'\U1F9DB\U200D\U2640' | |
| 1657 | +emoji[woman_vampire_light_skin_tone]=$'\U1F9DB\U1F3FB\U200D\U2640\UFE0F' | |
| 1658 | +emoji[woman_vampire_light_skin_tone_minimally]=$'\U1F9DB\U1F3FB\U200D\U2640' | |
| 1659 | +emoji[woman_vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC\U200D\U2640\UFE0F' | |
| 1660 | +emoji[woman_vampire_medium_light_skin_tone_minimally]=$'\U1F9DB\U1F3FC\U200D\U2640' | |
| 1661 | +emoji[woman_vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD\U200D\U2640\UFE0F' | |
| 1662 | +emoji[woman_vampire_medium_skin_tone_minimally]=$'\U1F9DB\U1F3FD\U200D\U2640' | |
| 1663 | +emoji[woman_vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE\U200D\U2640\UFE0F' | |
| 1664 | +emoji[woman_vampire_medium_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FE\U200D\U2640' | |
| 1665 | +emoji[woman_vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF\U200D\U2640\UFE0F' | |
| 1666 | +emoji[woman_vampire_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FF\U200D\U2640' | |
| 1667 | +emoji[merperson]=$'\U1F9DC' | |
| 1668 | +emoji[merperson_light_skin_tone]=$'\U1F9DC\U1F3FB' | |
| 1669 | +emoji[merperson_medium_light_skin_tone]=$'\U1F9DC\U1F3FC' | |
| 1670 | +emoji[merperson_medium_skin_tone]=$'\U1F9DC\U1F3FD' | |
| 1671 | +emoji[merperson_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE' | |
| 1672 | +emoji[merperson_dark_skin_tone]=$'\U1F9DC\U1F3FF' | |
| 1673 | +emoji[merman]=$'\U1F9DC\U200D\U2642\UFE0F' | |
| 1674 | +emoji[merman_minimally]=$'\U1F9DC\U200D\U2642' | |
| 1675 | +emoji[merman_light_skin_tone]=$'\U1F9DC\U1F3FB\U200D\U2642\UFE0F' | |
| 1676 | +emoji[merman_light_skin_tone_minimally]=$'\U1F9DC\U1F3FB\U200D\U2642' | |
| 1677 | +emoji[merman_medium_light_skin_tone]=$'\U1F9DC\U1F3FC\U200D\U2642\UFE0F' | |
| 1678 | +emoji[merman_medium_light_skin_tone_minimally]=$'\U1F9DC\U1F3FC\U200D\U2642' | |
| 1679 | +emoji[merman_medium_skin_tone]=$'\U1F9DC\U1F3FD\U200D\U2642\UFE0F' | |
| 1680 | +emoji[merman_medium_skin_tone_minimally]=$'\U1F9DC\U1F3FD\U200D\U2642' | |
| 1681 | +emoji[merman_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE\U200D\U2642\UFE0F' | |
| 1682 | +emoji[merman_medium_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FE\U200D\U2642' | |
| 1683 | +emoji[merman_dark_skin_tone]=$'\U1F9DC\U1F3FF\U200D\U2642\UFE0F' | |
| 1684 | +emoji[merman_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FF\U200D\U2642' | |
| 1685 | +emoji[mermaid]=$'\U1F9DC\U200D\U2640\UFE0F' | |
| 1686 | +emoji[mermaid_minimally]=$'\U1F9DC\U200D\U2640' | |
| 1687 | +emoji[mermaid_light_skin_tone]=$'\U1F9DC\U1F3FB\U200D\U2640\UFE0F' | |
| 1688 | +emoji[mermaid_light_skin_tone_minimally]=$'\U1F9DC\U1F3FB\U200D\U2640' | |
| 1689 | +emoji[mermaid_medium_light_skin_tone]=$'\U1F9DC\U1F3FC\U200D\U2640\UFE0F' | |
| 1690 | +emoji[mermaid_medium_light_skin_tone_minimally]=$'\U1F9DC\U1F3FC\U200D\U2640' | |
| 1691 | +emoji[mermaid_medium_skin_tone]=$'\U1F9DC\U1F3FD\U200D\U2640\UFE0F' | |
| 1692 | +emoji[mermaid_medium_skin_tone_minimally]=$'\U1F9DC\U1F3FD\U200D\U2640' | |
| 1693 | +emoji[mermaid_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE\U200D\U2640\UFE0F' | |
| 1694 | +emoji[mermaid_medium_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FE\U200D\U2640' | |
| 1695 | +emoji[mermaid_dark_skin_tone]=$'\U1F9DC\U1F3FF\U200D\U2640\UFE0F' | |
| 1696 | +emoji[mermaid_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FF\U200D\U2640' | |
| 1697 | +emoji[elf]=$'\U1F9DD' | |
| 1698 | +emoji[elf_light_skin_tone]=$'\U1F9DD\U1F3FB' | |
| 1699 | +emoji[elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC' | |
| 1700 | +emoji[elf_medium_skin_tone]=$'\U1F9DD\U1F3FD' | |
| 1701 | +emoji[elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE' | |
| 1702 | +emoji[elf_dark_skin_tone]=$'\U1F9DD\U1F3FF' | |
| 1703 | +emoji[man_elf]=$'\U1F9DD\U200D\U2642\UFE0F' | |
| 1704 | +emoji[man_elf_minimally]=$'\U1F9DD\U200D\U2642' | |
| 1705 | +emoji[elf_man]=$'\U1F9DD\U200D\U2642' | |
| 1706 | +emoji[man_elf_light_skin_tone]=$'\U1F9DD\U1F3FB\U200D\U2642\UFE0F' | |
| 1707 | +emoji[man_elf_light_skin_tone_minimally]=$'\U1F9DD\U1F3FB\U200D\U2642' | |
| 1708 | +emoji[man_elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC\U200D\U2642\UFE0F' | |
| 1709 | +emoji[man_elf_medium_light_skin_tone_minimally]=$'\U1F9DD\U1F3FC\U200D\U2642' | |
| 1710 | +emoji[man_elf_medium_skin_tone]=$'\U1F9DD\U1F3FD\U200D\U2642\UFE0F' | |
| 1711 | +emoji[man_elf_medium_skin_tone_minimally]=$'\U1F9DD\U1F3FD\U200D\U2642' | |
| 1712 | +emoji[man_elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE\U200D\U2642\UFE0F' | |
| 1713 | +emoji[man_elf_medium_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FE\U200D\U2642' | |
| 1714 | +emoji[man_elf_dark_skin_tone]=$'\U1F9DD\U1F3FF\U200D\U2642\UFE0F' | |
| 1715 | +emoji[man_elf_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FF\U200D\U2642' | |
| 1716 | +emoji[woman_elf]=$'\U1F9DD\U200D\U2640\UFE0F' | |
| 1717 | +emoji[woman_elf_minimally]=$'\U1F9DD\U200D\U2640' | |
| 1718 | +emoji[elf_woman]=$'\U1F9DD\U200D\U2640' | |
| 1719 | +emoji[woman_elf_light_skin_tone]=$'\U1F9DD\U1F3FB\U200D\U2640\UFE0F' | |
| 1720 | +emoji[woman_elf_light_skin_tone_minimally]=$'\U1F9DD\U1F3FB\U200D\U2640' | |
| 1721 | +emoji[woman_elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC\U200D\U2640\UFE0F' | |
| 1722 | +emoji[woman_elf_medium_light_skin_tone_minimally]=$'\U1F9DD\U1F3FC\U200D\U2640' | |
| 1723 | +emoji[woman_elf_medium_skin_tone]=$'\U1F9DD\U1F3FD\U200D\U2640\UFE0F' | |
| 1724 | +emoji[woman_elf_medium_skin_tone_minimally]=$'\U1F9DD\U1F3FD\U200D\U2640' | |
| 1725 | +emoji[woman_elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE\U200D\U2640\UFE0F' | |
| 1726 | +emoji[woman_elf_medium_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FE\U200D\U2640' | |
| 1727 | +emoji[woman_elf_dark_skin_tone]=$'\U1F9DD\U1F3FF\U200D\U2640\UFE0F' | |
| 1728 | +emoji[woman_elf_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FF\U200D\U2640' | |
| 1729 | +emoji[genie]=$'\U1F9DE' | |
| 1730 | +emoji[man_genie]=$'\U1F9DE\U200D\U2642\UFE0F' | |
| 1731 | +emoji[man_genie_minimally]=$'\U1F9DE\U200D\U2642' | |
| 1732 | +emoji[genie_man]=$'\U1F9DE\U200D\U2642' | |
| 1733 | +emoji[woman_genie]=$'\U1F9DE\U200D\U2640\UFE0F' | |
| 1734 | +emoji[woman_genie_minimally]=$'\U1F9DE\U200D\U2640' | |
| 1735 | +emoji[genie_woman]=$'\U1F9DE\U200D\U2640' | |
| 1736 | +emoji[zombie]=$'\U1F9DF' | |
| 1737 | +emoji[man_zombie]=$'\U1F9DF\U200D\U2642\UFE0F' | |
| 1738 | +emoji[man_zombie_minimally]=$'\U1F9DF\U200D\U2642' | |
| 1739 | +emoji[zombie_man]=$'\U1F9DF\U200D\U2642' | |
| 1740 | +emoji[woman_zombie]=$'\U1F9DF\U200D\U2640\UFE0F' | |
| 1741 | +emoji[woman_zombie_minimally]=$'\U1F9DF\U200D\U2640' | |
| 1742 | +emoji[zombie_woman]=$'\U1F9DF\U200D\U2640' | |
| 1743 | +emoji[person_getting_massage]=$'\U1F486' | |
| 1744 | +emoji[massage]=$'\U1F486' | |
| 1745 | +emoji[person_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB' | |
| 1746 | +emoji[person_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC' | |
| 1747 | +emoji[person_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD' | |
| 1748 | +emoji[person_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE' | |
| 1749 | +emoji[person_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF' | |
| 1750 | +emoji[man_getting_massage]=$'\U1F486\U200D\U2642\UFE0F' | |
| 1751 | +emoji[man_getting_massage_minimally]=$'\U1F486\U200D\U2642' | |
| 1752 | +emoji[massage_man]=$'\U1F486\U200D\U2642' | |
| 1753 | +emoji[man_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB\U200D\U2642\UFE0F' | |
| 1754 | +emoji[man_getting_massage_light_skin_tone_minimally]=$'\U1F486\U1F3FB\U200D\U2642' | |
| 1755 | +emoji[man_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC\U200D\U2642\UFE0F' | |
| 1756 | +emoji[man_getting_massage_medium_light_skin_tone_minimally]=$'\U1F486\U1F3FC\U200D\U2642' | |
| 1757 | +emoji[man_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD\U200D\U2642\UFE0F' | |
| 1758 | +emoji[man_getting_massage_medium_skin_tone_minimally]=$'\U1F486\U1F3FD\U200D\U2642' | |
| 1759 | +emoji[man_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE\U200D\U2642\UFE0F' | |
| 1760 | +emoji[man_getting_massage_medium_dark_skin_tone_minimally]=$'\U1F486\U1F3FE\U200D\U2642' | |
| 1761 | +emoji[man_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF\U200D\U2642\UFE0F' | |
| 1762 | +emoji[man_getting_massage_dark_skin_tone_minimally]=$'\U1F486\U1F3FF\U200D\U2642' | |
| 1763 | +emoji[woman_getting_massage]=$'\U1F486\U200D\U2640\UFE0F' | |
| 1764 | +emoji[woman_getting_massage_minimally]=$'\U1F486\U200D\U2640' | |
| 1765 | +emoji[massage_woman]=$'\U1F486\U200D\U2640' | |
| 1766 | +emoji[woman_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB\U200D\U2640\UFE0F' | |
| 1767 | +emoji[woman_getting_massage_light_skin_tone_minimally]=$'\U1F486\U1F3FB\U200D\U2640' | |
| 1768 | +emoji[woman_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC\U200D\U2640\UFE0F' | |
| 1769 | +emoji[woman_getting_massage_medium_light_skin_tone_minimally]=$'\U1F486\U1F3FC\U200D\U2640' | |
| 1770 | +emoji[woman_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD\U200D\U2640\UFE0F' | |
| 1771 | +emoji[woman_getting_massage_medium_skin_tone_minimally]=$'\U1F486\U1F3FD\U200D\U2640' | |
| 1772 | +emoji[woman_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE\U200D\U2640\UFE0F' | |
| 1773 | +emoji[woman_getting_massage_medium_dark_skin_tone_minimally]=$'\U1F486\U1F3FE\U200D\U2640' | |
| 1774 | +emoji[woman_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF\U200D\U2640\UFE0F' | |
| 1775 | +emoji[woman_getting_massage_dark_skin_tone_minimally]=$'\U1F486\U1F3FF\U200D\U2640' | |
| 1776 | +emoji[person_getting_haircut]=$'\U1F487' | |
| 1777 | +emoji[haircut]=$'\U1F487' | |
| 1778 | +emoji[person_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB' | |
| 1779 | +emoji[person_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC' | |
| 1780 | +emoji[person_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD' | |
| 1781 | +emoji[person_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE' | |
| 1782 | +emoji[person_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF' | |
| 1783 | +emoji[man_getting_haircut]=$'\U1F487\U200D\U2642\UFE0F' | |
| 1784 | +emoji[man_getting_haircut_minimally]=$'\U1F487\U200D\U2642' | |
| 1785 | +emoji[haircut_man]=$'\U1F487\U200D\U2642' | |
| 1786 | +emoji[man_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB\U200D\U2642\UFE0F' | |
| 1787 | +emoji[man_getting_haircut_light_skin_tone_minimally]=$'\U1F487\U1F3FB\U200D\U2642' | |
| 1788 | +emoji[man_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC\U200D\U2642\UFE0F' | |
| 1789 | +emoji[man_getting_haircut_medium_light_skin_tone_minimally]=$'\U1F487\U1F3FC\U200D\U2642' | |
| 1790 | +emoji[man_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD\U200D\U2642\UFE0F' | |
| 1791 | +emoji[man_getting_haircut_medium_skin_tone_minimally]=$'\U1F487\U1F3FD\U200D\U2642' | |
| 1792 | +emoji[man_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE\U200D\U2642\UFE0F' | |
| 1793 | +emoji[man_getting_haircut_medium_dark_skin_tone_minimally]=$'\U1F487\U1F3FE\U200D\U2642' | |
| 1794 | +emoji[man_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF\U200D\U2642\UFE0F' | |
| 1795 | +emoji[man_getting_haircut_dark_skin_tone_minimally]=$'\U1F487\U1F3FF\U200D\U2642' | |
| 1796 | +emoji[woman_getting_haircut]=$'\U1F487\U200D\U2640\UFE0F' | |
| 1797 | +emoji[woman_getting_haircut_minimally]=$'\U1F487\U200D\U2640' | |
| 1798 | +emoji[haircut_woman]=$'\U1F487\U200D\U2640' | |
| 1799 | +emoji[woman_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB\U200D\U2640\UFE0F' | |
| 1800 | +emoji[woman_getting_haircut_light_skin_tone_minimally]=$'\U1F487\U1F3FB\U200D\U2640' | |
| 1801 | +emoji[woman_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC\U200D\U2640\UFE0F' | |
| 1802 | +emoji[woman_getting_haircut_medium_light_skin_tone_minimally]=$'\U1F487\U1F3FC\U200D\U2640' | |
| 1803 | +emoji[woman_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD\U200D\U2640\UFE0F' | |
| 1804 | +emoji[woman_getting_haircut_medium_skin_tone_minimally]=$'\U1F487\U1F3FD\U200D\U2640' | |
| 1805 | +emoji[woman_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE\U200D\U2640\UFE0F' | |
| 1806 | +emoji[woman_getting_haircut_medium_dark_skin_tone_minimally]=$'\U1F487\U1F3FE\U200D\U2640' | |
| 1807 | +emoji[woman_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF\U200D\U2640\UFE0F' | |
| 1808 | +emoji[woman_getting_haircut_dark_skin_tone_minimally]=$'\U1F487\U1F3FF\U200D\U2640' | |
| 1809 | +emoji[person_walking]=$'\U1F6B6' | |
| 1810 | +emoji[walking]=$'\U1F6B6' | |
| 1811 | +emoji[person_walking_light_skin_tone]=$'\U1F6B6\U1F3FB' | |
| 1812 | +emoji[person_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC' | |
| 1813 | +emoji[person_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD' | |
| 1814 | +emoji[person_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE' | |
| 1815 | +emoji[person_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF' | |
| 1816 | +emoji[man_walking]=$'\U1F6B6\U200D\U2642\UFE0F' | |
| 1817 | +emoji[man_walking_minimally]=$'\U1F6B6\U200D\U2642' | |
| 1818 | +emoji[walking_man]=$'\U1F6B6\U200D\U2642' | |
| 1819 | +emoji[man_walking_light_skin_tone]=$'\U1F6B6\U1F3FB\U200D\U2642\UFE0F' | |
| 1820 | +emoji[man_walking_light_skin_tone_minimally]=$'\U1F6B6\U1F3FB\U200D\U2642' | |
| 1821 | +emoji[man_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC\U200D\U2642\UFE0F' | |
| 1822 | +emoji[man_walking_medium_light_skin_tone_minimally]=$'\U1F6B6\U1F3FC\U200D\U2642' | |
| 1823 | +emoji[man_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD\U200D\U2642\UFE0F' | |
| 1824 | +emoji[man_walking_medium_skin_tone_minimally]=$'\U1F6B6\U1F3FD\U200D\U2642' | |
| 1825 | +emoji[man_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE\U200D\U2642\UFE0F' | |
| 1826 | +emoji[man_walking_medium_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FE\U200D\U2642' | |
| 1827 | +emoji[man_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF\U200D\U2642\UFE0F' | |
| 1828 | +emoji[man_walking_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FF\U200D\U2642' | |
| 1829 | +emoji[woman_walking]=$'\U1F6B6\U200D\U2640\UFE0F' | |
| 1830 | +emoji[woman_walking_minimally]=$'\U1F6B6\U200D\U2640' | |
| 1831 | +emoji[walking_woman]=$'\U1F6B6\U200D\U2640' | |
| 1832 | +emoji[woman_walking_light_skin_tone]=$'\U1F6B6\U1F3FB\U200D\U2640\UFE0F' | |
| 1833 | +emoji[woman_walking_light_skin_tone_minimally]=$'\U1F6B6\U1F3FB\U200D\U2640' | |
| 1834 | +emoji[woman_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC\U200D\U2640\UFE0F' | |
| 1835 | +emoji[woman_walking_medium_light_skin_tone_minimally]=$'\U1F6B6\U1F3FC\U200D\U2640' | |
| 1836 | +emoji[woman_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD\U200D\U2640\UFE0F' | |
| 1837 | +emoji[woman_walking_medium_skin_tone_minimally]=$'\U1F6B6\U1F3FD\U200D\U2640' | |
| 1838 | +emoji[woman_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE\U200D\U2640\UFE0F' | |
| 1839 | +emoji[woman_walking_medium_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FE\U200D\U2640' | |
| 1840 | +emoji[woman_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF\U200D\U2640\UFE0F' | |
| 1841 | +emoji[woman_walking_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FF\U200D\U2640' | |
| 1842 | +emoji[person_standing]=$'\U1F9CD' | |
| 1843 | +emoji[standing_person]=$'\U1F9CD' | |
| 1844 | +emoji[person_standing_light_skin_tone]=$'\U1F9CD\U1F3FB' | |
| 1845 | +emoji[person_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC' | |
| 1846 | +emoji[person_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD' | |
| 1847 | +emoji[person_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE' | |
| 1848 | +emoji[person_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF' | |
| 1849 | +emoji[man_standing]=$'\U1F9CD\U200D\U2642\UFE0F' | |
| 1850 | +emoji[man_standing_minimally]=$'\U1F9CD\U200D\U2642' | |
| 1851 | +emoji[standing_man]=$'\U1F9CD\U200D\U2642' | |
| 1852 | +emoji[man_standing_light_skin_tone]=$'\U1F9CD\U1F3FB\U200D\U2642\UFE0F' | |
| 1853 | +emoji[man_standing_light_skin_tone_minimally]=$'\U1F9CD\U1F3FB\U200D\U2642' | |
| 1854 | +emoji[man_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC\U200D\U2642\UFE0F' | |
| 1855 | +emoji[man_standing_medium_light_skin_tone_minimally]=$'\U1F9CD\U1F3FC\U200D\U2642' | |
| 1856 | +emoji[man_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD\U200D\U2642\UFE0F' | |
| 1857 | +emoji[man_standing_medium_skin_tone_minimally]=$'\U1F9CD\U1F3FD\U200D\U2642' | |
| 1858 | +emoji[man_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE\U200D\U2642\UFE0F' | |
| 1859 | +emoji[man_standing_medium_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FE\U200D\U2642' | |
| 1860 | +emoji[man_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF\U200D\U2642\UFE0F' | |
| 1861 | +emoji[man_standing_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FF\U200D\U2642' | |
| 1862 | +emoji[woman_standing]=$'\U1F9CD\U200D\U2640\UFE0F' | |
| 1863 | +emoji[woman_standing_minimally]=$'\U1F9CD\U200D\U2640' | |
| 1864 | +emoji[standing_woman]=$'\U1F9CD\U200D\U2640' | |
| 1865 | +emoji[woman_standing_light_skin_tone]=$'\U1F9CD\U1F3FB\U200D\U2640\UFE0F' | |
| 1866 | +emoji[woman_standing_light_skin_tone_minimally]=$'\U1F9CD\U1F3FB\U200D\U2640' | |
| 1867 | +emoji[woman_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC\U200D\U2640\UFE0F' | |
| 1868 | +emoji[woman_standing_medium_light_skin_tone_minimally]=$'\U1F9CD\U1F3FC\U200D\U2640' | |
| 1869 | +emoji[woman_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD\U200D\U2640\UFE0F' | |
| 1870 | +emoji[woman_standing_medium_skin_tone_minimally]=$'\U1F9CD\U1F3FD\U200D\U2640' | |
| 1871 | +emoji[woman_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE\U200D\U2640\UFE0F' | |
| 1872 | +emoji[woman_standing_medium_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FE\U200D\U2640' | |
| 1873 | +emoji[woman_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF\U200D\U2640\UFE0F' | |
| 1874 | +emoji[woman_standing_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FF\U200D\U2640' | |
| 1875 | +emoji[person_kneeling]=$'\U1F9CE' | |
| 1876 | +emoji[kneeling_person]=$'\U1F9CE' | |
| 1877 | +emoji[person_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB' | |
| 1878 | +emoji[person_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC' | |
| 1879 | +emoji[person_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD' | |
| 1880 | +emoji[person_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE' | |
| 1881 | +emoji[person_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF' | |
| 1882 | +emoji[man_kneeling]=$'\U1F9CE\U200D\U2642\UFE0F' | |
| 1883 | +emoji[man_kneeling_minimally]=$'\U1F9CE\U200D\U2642' | |
| 1884 | +emoji[kneeling_man]=$'\U1F9CE\U200D\U2642' | |
| 1885 | +emoji[man_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB\U200D\U2642\UFE0F' | |
| 1886 | +emoji[man_kneeling_light_skin_tone_minimally]=$'\U1F9CE\U1F3FB\U200D\U2642' | |
| 1887 | +emoji[man_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC\U200D\U2642\UFE0F' | |
| 1888 | +emoji[man_kneeling_medium_light_skin_tone_minimally]=$'\U1F9CE\U1F3FC\U200D\U2642' | |
| 1889 | +emoji[man_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD\U200D\U2642\UFE0F' | |
| 1890 | +emoji[man_kneeling_medium_skin_tone_minimally]=$'\U1F9CE\U1F3FD\U200D\U2642' | |
| 1891 | +emoji[man_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE\U200D\U2642\UFE0F' | |
| 1892 | +emoji[man_kneeling_medium_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FE\U200D\U2642' | |
| 1893 | +emoji[man_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF\U200D\U2642\UFE0F' | |
| 1894 | +emoji[man_kneeling_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FF\U200D\U2642' | |
| 1895 | +emoji[woman_kneeling]=$'\U1F9CE\U200D\U2640\UFE0F' | |
| 1896 | +emoji[woman_kneeling_minimally]=$'\U1F9CE\U200D\U2640' | |
| 1897 | +emoji[kneeling_woman]=$'\U1F9CE\U200D\U2640' | |
| 1898 | +emoji[woman_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB\U200D\U2640\UFE0F' | |
| 1899 | +emoji[woman_kneeling_light_skin_tone_minimally]=$'\U1F9CE\U1F3FB\U200D\U2640' | |
| 1900 | +emoji[woman_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC\U200D\U2640\UFE0F' | |
| 1901 | +emoji[woman_kneeling_medium_light_skin_tone_minimally]=$'\U1F9CE\U1F3FC\U200D\U2640' | |
| 1902 | +emoji[woman_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD\U200D\U2640\UFE0F' | |
| 1903 | +emoji[woman_kneeling_medium_skin_tone_minimally]=$'\U1F9CE\U1F3FD\U200D\U2640' | |
| 1904 | +emoji[woman_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE\U200D\U2640\UFE0F' | |
| 1905 | +emoji[woman_kneeling_medium_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FE\U200D\U2640' | |
| 1906 | +emoji[woman_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF\U200D\U2640\UFE0F' | |
| 1907 | +emoji[woman_kneeling_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FF\U200D\U2640' | |
| 1908 | +emoji[man_with_probing_cane]=$'\U1F468\U200D\U1F9AF' | |
| 1909 | +emoji[man_with_probing_cane_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9AF' | |
| 1910 | +emoji[man_with_probing_cane_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9AF' | |
| 1911 | +emoji[man_with_probing_cane_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9AF' | |
| 1912 | +emoji[man_with_probing_cane_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9AF' | |
| 1913 | +emoji[man_with_probing_cane_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9AF' | |
| 1914 | +emoji[woman_with_probing_cane]=$'\U1F469\U200D\U1F9AF' | |
| 1915 | +emoji[woman_with_probing_cane_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9AF' | |
| 1916 | +emoji[woman_with_probing_cane_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9AF' | |
| 1917 | +emoji[woman_with_probing_cane_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9AF' | |
| 1918 | +emoji[woman_with_probing_cane_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9AF' | |
| 1919 | +emoji[woman_with_probing_cane_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9AF' | |
| 1920 | +emoji[man_in_motorized_wheelchair]=$'\U1F468\U200D\U1F9BC' | |
| 1921 | +emoji[man_in_motorized_wheelchair_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9BC' | |
| 1922 | +emoji[man_in_motorized_wheelchair_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9BC' | |
| 1923 | +emoji[man_in_motorized_wheelchair_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9BC' | |
| 1924 | +emoji[man_in_motorized_wheelchair_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9BC' | |
| 1925 | +emoji[man_in_motorized_wheelchair_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9BC' | |
| 1926 | +emoji[woman_in_motorized_wheelchair]=$'\U1F469\U200D\U1F9BC' | |
| 1927 | +emoji[woman_in_motorized_wheelchair_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9BC' | |
| 1928 | +emoji[woman_in_motorized_wheelchair_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9BC' | |
| 1929 | +emoji[woman_in_motorized_wheelchair_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9BC' | |
| 1930 | +emoji[woman_in_motorized_wheelchair_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9BC' | |
| 1931 | +emoji[woman_in_motorized_wheelchair_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9BC' | |
| 1932 | +emoji[man_in_manual_wheelchair]=$'\U1F468\U200D\U1F9BD' | |
| 1933 | +emoji[man_in_manual_wheelchair_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9BD' | |
| 1934 | +emoji[man_in_manual_wheelchair_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9BD' | |
| 1935 | +emoji[man_in_manual_wheelchair_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9BD' | |
| 1936 | +emoji[man_in_manual_wheelchair_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9BD' | |
| 1937 | +emoji[man_in_manual_wheelchair_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9BD' | |
| 1938 | +emoji[woman_in_manual_wheelchair]=$'\U1F469\U200D\U1F9BD' | |
| 1939 | +emoji[woman_in_manual_wheelchair_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9BD' | |
| 1940 | +emoji[woman_in_manual_wheelchair_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9BD' | |
| 1941 | +emoji[woman_in_manual_wheelchair_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9BD' | |
| 1942 | +emoji[woman_in_manual_wheelchair_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9BD' | |
| 1943 | +emoji[woman_in_manual_wheelchair_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9BD' | |
| 1944 | +emoji[person_running]=$'\U1F3C3' | |
| 1945 | +emoji[runner]=$'\U1F3C3' | |
| 1946 | +emoji[running]=$'\U1F3C3' | |
| 1947 | +emoji[person_running_light_skin_tone]=$'\U1F3C3\U1F3FB' | |
| 1948 | +emoji[person_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC' | |
| 1949 | +emoji[person_running_medium_skin_tone]=$'\U1F3C3\U1F3FD' | |
| 1950 | +emoji[person_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE' | |
| 1951 | +emoji[person_running_dark_skin_tone]=$'\U1F3C3\U1F3FF' | |
| 1952 | +emoji[man_running]=$'\U1F3C3\U200D\U2642\UFE0F' | |
| 1953 | +emoji[man_running_minimally]=$'\U1F3C3\U200D\U2642' | |
| 1954 | +emoji[running_man]=$'\U1F3C3\U200D\U2642' | |
| 1955 | +emoji[man_running_light_skin_tone]=$'\U1F3C3\U1F3FB\U200D\U2642\UFE0F' | |
| 1956 | +emoji[man_running_light_skin_tone_minimally]=$'\U1F3C3\U1F3FB\U200D\U2642' | |
| 1957 | +emoji[man_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC\U200D\U2642\UFE0F' | |
| 1958 | +emoji[man_running_medium_light_skin_tone_minimally]=$'\U1F3C3\U1F3FC\U200D\U2642' | |
| 1959 | +emoji[man_running_medium_skin_tone]=$'\U1F3C3\U1F3FD\U200D\U2642\UFE0F' | |
| 1960 | +emoji[man_running_medium_skin_tone_minimally]=$'\U1F3C3\U1F3FD\U200D\U2642' | |
| 1961 | +emoji[man_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE\U200D\U2642\UFE0F' | |
| 1962 | +emoji[man_running_medium_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FE\U200D\U2642' | |
| 1963 | +emoji[man_running_dark_skin_tone]=$'\U1F3C3\U1F3FF\U200D\U2642\UFE0F' | |
| 1964 | +emoji[man_running_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FF\U200D\U2642' | |
| 1965 | +emoji[woman_running]=$'\U1F3C3\U200D\U2640\UFE0F' | |
| 1966 | +emoji[woman_running_minimally]=$'\U1F3C3\U200D\U2640' | |
| 1967 | +emoji[running_woman]=$'\U1F3C3\U200D\U2640' | |
| 1968 | +emoji[woman_running_light_skin_tone]=$'\U1F3C3\U1F3FB\U200D\U2640\UFE0F' | |
| 1969 | +emoji[woman_running_light_skin_tone_minimally]=$'\U1F3C3\U1F3FB\U200D\U2640' | |
| 1970 | +emoji[woman_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC\U200D\U2640\UFE0F' | |
| 1971 | +emoji[woman_running_medium_light_skin_tone_minimally]=$'\U1F3C3\U1F3FC\U200D\U2640' | |
| 1972 | +emoji[woman_running_medium_skin_tone]=$'\U1F3C3\U1F3FD\U200D\U2640\UFE0F' | |
| 1973 | +emoji[woman_running_medium_skin_tone_minimally]=$'\U1F3C3\U1F3FD\U200D\U2640' | |
| 1974 | +emoji[woman_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE\U200D\U2640\UFE0F' | |
| 1975 | +emoji[woman_running_medium_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FE\U200D\U2640' | |
| 1976 | +emoji[woman_running_dark_skin_tone]=$'\U1F3C3\U1F3FF\U200D\U2640\UFE0F' | |
| 1977 | +emoji[woman_running_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FF\U200D\U2640' | |
| 1978 | +emoji[woman_dancing]=$'\U1F483' | |
| 1979 | +emoji[dancer]=$'\U1F483' | |
| 1980 | +emoji[woman_dancing_light_skin_tone]=$'\U1F483\U1F3FB' | |
| 1981 | +emoji[woman_dancing_medium_light_skin_tone]=$'\U1F483\U1F3FC' | |
| 1982 | +emoji[woman_dancing_medium_skin_tone]=$'\U1F483\U1F3FD' | |
| 1983 | +emoji[woman_dancing_medium_dark_skin_tone]=$'\U1F483\U1F3FE' | |
| 1984 | +emoji[woman_dancing_dark_skin_tone]=$'\U1F483\U1F3FF' | |
| 1985 | +emoji[woman_dancing_dark_skin_tone_1]=$'\U1F57A' | |
| 1986 | +emoji[man_dancing]=$'\U1F57A' | |
| 1987 | +emoji[man_dancing_light_skin_tone]=$'\U1F57A\U1F3FB' | |
| 1988 | +emoji[man_dancing_medium_light_skin_tone]=$'\U1F57A\U1F3FC' | |
| 1989 | +emoji[man_dancing_medium_skin_tone]=$'\U1F57A\U1F3FD' | |
| 1990 | +emoji[man_dancing_medium_dark_skin_tone]=$'\U1F57A\U1F3FE' | |
| 1991 | +emoji[man_dancing_dark_skin_tone]=$'\U1F57A\U1F3FF' | |
| 1992 | +emoji[man_in_suit_levitating]=$'\U1F574\UFE0F' | |
| 1993 | +emoji[man_in_suit_levitating_unqualified]=$'\U1F574' | |
| 1994 | +emoji[business_suit_levitating]=$'\U1F574' | |
| 1995 | +emoji[man_in_suit_levitating_light_skin_tone]=$'\U1F574\U1F3FB' | |
| 1996 | +emoji[man_in_suit_levitating_medium_light_skin_tone]=$'\U1F574\U1F3FC' | |
| 1997 | +emoji[man_in_suit_levitating_medium_skin_tone]=$'\U1F574\U1F3FD' | |
| 1998 | +emoji[man_in_suit_levitating_medium_dark_skin_tone]=$'\U1F574\U1F3FE' | |
| 1999 | +emoji[man_in_suit_levitating_dark_skin_tone]=$'\U1F574\U1F3FF' | |
| 2000 | +emoji[people_with_bunny_ears]=$'\U1F46F' | |
| 2001 | +emoji[dancers]=$'\U1F46F' | |
| 2002 | +emoji[men_with_bunny_ears]=$'\U1F46F\U200D\U2642\UFE0F' | |
| 2003 | +emoji[men_with_bunny_ears_minimally]=$'\U1F46F\U200D\U2642' | |
| 2004 | +emoji[dancing_men]=$'\U1F46F\U200D\U2642' | |
| 2005 | +emoji[women_with_bunny_ears]=$'\U1F46F\U200D\U2640\UFE0F' | |
| 2006 | +emoji[women_with_bunny_ears_minimally]=$'\U1F46F\U200D\U2640' | |
| 2007 | +emoji[dancing_women]=$'\U1F46F\U200D\U2640' | |
| 2008 | +emoji[person_in_steamy_room]=$'\U1F9D6' | |
| 2009 | +emoji[sauna_person]=$'\U1F9D6' | |
| 2010 | +emoji[person_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB' | |
| 2011 | +emoji[person_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC' | |
| 2012 | +emoji[person_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD' | |
| 2013 | +emoji[person_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE' | |
| 2014 | +emoji[person_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF' | |
| 2015 | +emoji[man_in_steamy_room]=$'\U1F9D6\U200D\U2642\UFE0F' | |
| 2016 | +emoji[man_in_steamy_room_minimally]=$'\U1F9D6\U200D\U2642' | |
| 2017 | +emoji[sauna_man]=$'\U1F9D6\U200D\U2642' | |
| 2018 | +emoji[man_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB\U200D\U2642\UFE0F' | |
| 2019 | +emoji[man_in_steamy_room_light_skin_tone_minimally]=$'\U1F9D6\U1F3FB\U200D\U2642' | |
| 2020 | +emoji[man_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC\U200D\U2642\UFE0F' | |
| 2021 | +emoji[man_in_steamy_room_medium_light_skin_tone_minimally]=$'\U1F9D6\U1F3FC\U200D\U2642' | |
| 2022 | +emoji[man_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD\U200D\U2642\UFE0F' | |
| 2023 | +emoji[man_in_steamy_room_medium_skin_tone_minimally]=$'\U1F9D6\U1F3FD\U200D\U2642' | |
| 2024 | +emoji[man_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE\U200D\U2642\UFE0F' | |
| 2025 | +emoji[man_in_steamy_room_medium_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FE\U200D\U2642' | |
| 2026 | +emoji[man_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF\U200D\U2642\UFE0F' | |
| 2027 | +emoji[man_in_steamy_room_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FF\U200D\U2642' | |
| 2028 | +emoji[woman_in_steamy_room]=$'\U1F9D6\U200D\U2640\UFE0F' | |
| 2029 | +emoji[woman_in_steamy_room_minimally]=$'\U1F9D6\U200D\U2640' | |
| 2030 | +emoji[sauna_woman]=$'\U1F9D6\U200D\U2640' | |
| 2031 | +emoji[woman_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB\U200D\U2640\UFE0F' | |
| 2032 | +emoji[woman_in_steamy_room_light_skin_tone_minimally]=$'\U1F9D6\U1F3FB\U200D\U2640' | |
| 2033 | +emoji[woman_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC\U200D\U2640\UFE0F' | |
| 2034 | +emoji[woman_in_steamy_room_medium_light_skin_tone_minimally]=$'\U1F9D6\U1F3FC\U200D\U2640' | |
| 2035 | +emoji[woman_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD\U200D\U2640\UFE0F' | |
| 2036 | +emoji[woman_in_steamy_room_medium_skin_tone_minimally]=$'\U1F9D6\U1F3FD\U200D\U2640' | |
| 2037 | +emoji[woman_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE\U200D\U2640\UFE0F' | |
| 2038 | +emoji[woman_in_steamy_room_medium_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FE\U200D\U2640' | |
| 2039 | +emoji[woman_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF\U200D\U2640\UFE0F' | |
| 2040 | +emoji[woman_in_steamy_room_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FF\U200D\U2640' | |
| 2041 | +emoji[person_climbing]=$'\U1F9D7' | |
| 2042 | +emoji[climbing]=$'\U1F9D7' | |
| 2043 | +emoji[person_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB' | |
| 2044 | +emoji[person_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC' | |
| 2045 | +emoji[person_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD' | |
| 2046 | +emoji[person_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE' | |
| 2047 | +emoji[person_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF' | |
| 2048 | +emoji[man_climbing]=$'\U1F9D7\U200D\U2642\UFE0F' | |
| 2049 | +emoji[man_climbing_minimally]=$'\U1F9D7\U200D\U2642' | |
| 2050 | +emoji[climbing_man]=$'\U1F9D7\U200D\U2642' | |
| 2051 | +emoji[man_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB\U200D\U2642\UFE0F' | |
| 2052 | +emoji[man_climbing_light_skin_tone_minimally]=$'\U1F9D7\U1F3FB\U200D\U2642' | |
| 2053 | +emoji[man_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC\U200D\U2642\UFE0F' | |
| 2054 | +emoji[man_climbing_medium_light_skin_tone_minimally]=$'\U1F9D7\U1F3FC\U200D\U2642' | |
| 2055 | +emoji[man_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD\U200D\U2642\UFE0F' | |
| 2056 | +emoji[man_climbing_medium_skin_tone_minimally]=$'\U1F9D7\U1F3FD\U200D\U2642' | |
| 2057 | +emoji[man_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE\U200D\U2642\UFE0F' | |
| 2058 | +emoji[man_climbing_medium_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FE\U200D\U2642' | |
| 2059 | +emoji[man_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF\U200D\U2642\UFE0F' | |
| 2060 | +emoji[man_climbing_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FF\U200D\U2642' | |
| 2061 | +emoji[woman_climbing]=$'\U1F9D7\U200D\U2640\UFE0F' | |
| 2062 | +emoji[woman_climbing_minimally]=$'\U1F9D7\U200D\U2640' | |
| 2063 | +emoji[climbing_woman]=$'\U1F9D7\U200D\U2640' | |
| 2064 | +emoji[woman_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB\U200D\U2640\UFE0F' | |
| 2065 | +emoji[woman_climbing_light_skin_tone_minimally]=$'\U1F9D7\U1F3FB\U200D\U2640' | |
| 2066 | +emoji[woman_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC\U200D\U2640\UFE0F' | |
| 2067 | +emoji[woman_climbing_medium_light_skin_tone_minimally]=$'\U1F9D7\U1F3FC\U200D\U2640' | |
| 2068 | +emoji[woman_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD\U200D\U2640\UFE0F' | |
| 2069 | +emoji[woman_climbing_medium_skin_tone_minimally]=$'\U1F9D7\U1F3FD\U200D\U2640' | |
| 2070 | +emoji[woman_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE\U200D\U2640\UFE0F' | |
| 2071 | +emoji[woman_climbing_medium_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FE\U200D\U2640' | |
| 2072 | +emoji[woman_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF\U200D\U2640\UFE0F' | |
| 2073 | +emoji[woman_climbing_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FF\U200D\U2640' | |
| 2074 | +emoji[person_fencing]=$'\U1F93A' | |
| 2075 | +emoji[horse_racing]=$'\U1F3C7' | |
| 2076 | +emoji[horse_racing_light_skin_tone]=$'\U1F3C7\U1F3FB' | |
| 2077 | +emoji[horse_racing_medium_light_skin_tone]=$'\U1F3C7\U1F3FC' | |
| 2078 | +emoji[horse_racing_medium_skin_tone]=$'\U1F3C7\U1F3FD' | |
| 2079 | +emoji[horse_racing_medium_dark_skin_tone]=$'\U1F3C7\U1F3FE' | |
| 2080 | +emoji[horse_racing_dark_skin_tone]=$'\U1F3C7\U1F3FF' | |
| 2081 | +emoji[skier]=$'\U26F7\UFE0F' | |
| 2082 | +emoji[skier_unqualified]=$'\U26F7' | |
| 2083 | +emoji[snowboarder]=$'\U1F3C2' | |
| 2084 | +emoji[snowboarder_light_skin_tone]=$'\U1F3C2\U1F3FB' | |
| 2085 | +emoji[snowboarder_medium_light_skin_tone]=$'\U1F3C2\U1F3FC' | |
| 2086 | +emoji[snowboarder_medium_skin_tone]=$'\U1F3C2\U1F3FD' | |
| 2087 | +emoji[snowboarder_medium_dark_skin_tone]=$'\U1F3C2\U1F3FE' | |
| 2088 | +emoji[snowboarder_dark_skin_tone]=$'\U1F3C2\U1F3FF' | |
| 2089 | +emoji[person_golfing]=$'\U1F3CC\UFE0F' | |
| 2090 | +emoji[person_golfing_unqualified]=$'\U1F3CC' | |
| 2091 | +emoji[golfing]=$'\U1F3CC' | |
| 2092 | +emoji[person_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB' | |
| 2093 | +emoji[person_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC' | |
| 2094 | +emoji[person_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD' | |
| 2095 | +emoji[person_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE' | |
| 2096 | +emoji[person_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF' | |
| 2097 | +emoji[man_golfing]=$'\U1F3CC\UFE0F\U200D\U2642\UFE0F' | |
| 2098 | +emoji[golfing_man]=$'\U1F3CC\UFE0F\U200D\U2642\UFE0F' | |
| 2099 | +emoji[man_golfing_unqualified]=$'\U1F3CC\U200D\U2642\UFE0F' | |
| 2100 | +emoji[man_golfing_unqualified_1]=$'\U1F3CC\UFE0F\U200D\U2642' | |
| 2101 | +emoji[man_golfing_unqualified_2]=$'\U1F3CC\U200D\U2642' | |
| 2102 | +emoji[man_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB\U200D\U2642\UFE0F' | |
| 2103 | +emoji[man_golfing_light_skin_tone_minimally]=$'\U1F3CC\U1F3FB\U200D\U2642' | |
| 2104 | +emoji[man_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC\U200D\U2642\UFE0F' | |
| 2105 | +emoji[man_golfing_medium_light_skin_tone_minimally]=$'\U1F3CC\U1F3FC\U200D\U2642' | |
| 2106 | +emoji[man_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD\U200D\U2642\UFE0F' | |
| 2107 | +emoji[man_golfing_medium_skin_tone_minimally]=$'\U1F3CC\U1F3FD\U200D\U2642' | |
| 2108 | +emoji[man_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE\U200D\U2642\UFE0F' | |
| 2109 | +emoji[man_golfing_medium_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FE\U200D\U2642' | |
| 2110 | +emoji[man_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF\U200D\U2642\UFE0F' | |
| 2111 | +emoji[man_golfing_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FF\U200D\U2642' | |
| 2112 | +emoji[woman_golfing]=$'\U1F3CC\UFE0F\U200D\U2640\UFE0F' | |
| 2113 | +emoji[golfing_woman]=$'\U1F3CC\UFE0F\U200D\U2640\UFE0F' | |
| 2114 | +emoji[woman_golfing_unqualified]=$'\U1F3CC\U200D\U2640\UFE0F' | |
| 2115 | +emoji[woman_golfing_unqualified_1]=$'\U1F3CC\UFE0F\U200D\U2640' | |
| 2116 | +emoji[woman_golfing_unqualified_2]=$'\U1F3CC\U200D\U2640' | |
| 2117 | +emoji[woman_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB\U200D\U2640\UFE0F' | |
| 2118 | +emoji[woman_golfing_light_skin_tone_minimally]=$'\U1F3CC\U1F3FB\U200D\U2640' | |
| 2119 | +emoji[woman_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC\U200D\U2640\UFE0F' | |
| 2120 | +emoji[woman_golfing_medium_light_skin_tone_minimally]=$'\U1F3CC\U1F3FC\U200D\U2640' | |
| 2121 | +emoji[woman_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD\U200D\U2640\UFE0F' | |
| 2122 | +emoji[woman_golfing_medium_skin_tone_minimally]=$'\U1F3CC\U1F3FD\U200D\U2640' | |
| 2123 | +emoji[woman_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE\U200D\U2640\UFE0F' | |
| 2124 | +emoji[woman_golfing_medium_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FE\U200D\U2640' | |
| 2125 | +emoji[woman_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF\U200D\U2640\UFE0F' | |
| 2126 | +emoji[woman_golfing_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FF\U200D\U2640' | |
| 2127 | +emoji[person_surfing]=$'\U1F3C4' | |
| 2128 | +emoji[surfer]=$'\U1F3C4' | |
| 2129 | +emoji[person_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB' | |
| 2130 | +emoji[person_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC' | |
| 2131 | +emoji[person_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD' | |
| 2132 | +emoji[person_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE' | |
| 2133 | +emoji[person_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF' | |
| 2134 | +emoji[man_surfing]=$'\U1F3C4\U200D\U2642\UFE0F' | |
| 2135 | +emoji[man_surfing_minimally]=$'\U1F3C4\U200D\U2642' | |
| 2136 | +emoji[surfing_man]=$'\U1F3C4\U200D\U2642' | |
| 2137 | +emoji[man_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB\U200D\U2642\UFE0F' | |
| 2138 | +emoji[man_surfing_light_skin_tone_minimally]=$'\U1F3C4\U1F3FB\U200D\U2642' | |
| 2139 | +emoji[man_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC\U200D\U2642\UFE0F' | |
| 2140 | +emoji[man_surfing_medium_light_skin_tone_minimally]=$'\U1F3C4\U1F3FC\U200D\U2642' | |
| 2141 | +emoji[man_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD\U200D\U2642\UFE0F' | |
| 2142 | +emoji[man_surfing_medium_skin_tone_minimally]=$'\U1F3C4\U1F3FD\U200D\U2642' | |
| 2143 | +emoji[man_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE\U200D\U2642\UFE0F' | |
| 2144 | +emoji[man_surfing_medium_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FE\U200D\U2642' | |
| 2145 | +emoji[man_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF\U200D\U2642\UFE0F' | |
| 2146 | +emoji[man_surfing_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FF\U200D\U2642' | |
| 2147 | +emoji[woman_surfing]=$'\U1F3C4\U200D\U2640\UFE0F' | |
| 2148 | +emoji[woman_surfing_minimally]=$'\U1F3C4\U200D\U2640' | |
| 2149 | +emoji[surfing_woman]=$'\U1F3C4\U200D\U2640' | |
| 2150 | +emoji[woman_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB\U200D\U2640\UFE0F' | |
| 2151 | +emoji[woman_surfing_light_skin_tone_minimally]=$'\U1F3C4\U1F3FB\U200D\U2640' | |
| 2152 | +emoji[woman_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC\U200D\U2640\UFE0F' | |
| 2153 | +emoji[woman_surfing_medium_light_skin_tone_minimally]=$'\U1F3C4\U1F3FC\U200D\U2640' | |
| 2154 | +emoji[woman_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD\U200D\U2640\UFE0F' | |
| 2155 | +emoji[woman_surfing_medium_skin_tone_minimally]=$'\U1F3C4\U1F3FD\U200D\U2640' | |
| 2156 | +emoji[woman_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE\U200D\U2640\UFE0F' | |
| 2157 | +emoji[woman_surfing_medium_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FE\U200D\U2640' | |
| 2158 | +emoji[woman_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF\U200D\U2640\UFE0F' | |
| 2159 | +emoji[woman_surfing_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FF\U200D\U2640' | |
| 2160 | +emoji[person_rowing_boat]=$'\U1F6A3' | |
| 2161 | +emoji[rowboat]=$'\U1F6A3' | |
| 2162 | +emoji[person_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB' | |
| 2163 | +emoji[person_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC' | |
| 2164 | +emoji[person_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD' | |
| 2165 | +emoji[person_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE' | |
| 2166 | +emoji[person_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF' | |
| 2167 | +emoji[man_rowing_boat]=$'\U1F6A3\U200D\U2642\UFE0F' | |
| 2168 | +emoji[man_rowing_boat_minimally]=$'\U1F6A3\U200D\U2642' | |
| 2169 | +emoji[rowing_man]=$'\U1F6A3\U200D\U2642' | |
| 2170 | +emoji[man_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB\U200D\U2642\UFE0F' | |
| 2171 | +emoji[man_rowing_boat_light_skin_tone_minimally]=$'\U1F6A3\U1F3FB\U200D\U2642' | |
| 2172 | +emoji[man_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC\U200D\U2642\UFE0F' | |
| 2173 | +emoji[man_rowing_boat_medium_light_skin_tone_minimally]=$'\U1F6A3\U1F3FC\U200D\U2642' | |
| 2174 | +emoji[man_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD\U200D\U2642\UFE0F' | |
| 2175 | +emoji[man_rowing_boat_medium_skin_tone_minimally]=$'\U1F6A3\U1F3FD\U200D\U2642' | |
| 2176 | +emoji[man_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE\U200D\U2642\UFE0F' | |
| 2177 | +emoji[man_rowing_boat_medium_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FE\U200D\U2642' | |
| 2178 | +emoji[man_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF\U200D\U2642\UFE0F' | |
| 2179 | +emoji[man_rowing_boat_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FF\U200D\U2642' | |
| 2180 | +emoji[woman_rowing_boat]=$'\U1F6A3\U200D\U2640\UFE0F' | |
| 2181 | +emoji[woman_rowing_boat_minimally]=$'\U1F6A3\U200D\U2640' | |
| 2182 | +emoji[rowing_woman]=$'\U1F6A3\U200D\U2640' | |
| 2183 | +emoji[woman_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB\U200D\U2640\UFE0F' | |
| 2184 | +emoji[woman_rowing_boat_light_skin_tone_minimally]=$'\U1F6A3\U1F3FB\U200D\U2640' | |
| 2185 | +emoji[woman_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC\U200D\U2640\UFE0F' | |
| 2186 | +emoji[woman_rowing_boat_medium_light_skin_tone_minimally]=$'\U1F6A3\U1F3FC\U200D\U2640' | |
| 2187 | +emoji[woman_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD\U200D\U2640\UFE0F' | |
| 2188 | +emoji[woman_rowing_boat_medium_skin_tone_minimally]=$'\U1F6A3\U1F3FD\U200D\U2640' | |
| 2189 | +emoji[woman_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE\U200D\U2640\UFE0F' | |
| 2190 | +emoji[woman_rowing_boat_medium_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FE\U200D\U2640' | |
| 2191 | +emoji[woman_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF\U200D\U2640\UFE0F' | |
| 2192 | +emoji[woman_rowing_boat_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FF\U200D\U2640' | |
| 2193 | +emoji[person_swimming]=$'\U1F3CA' | |
| 2194 | +emoji[swimmer]=$'\U1F3CA' | |
| 2195 | +emoji[person_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB' | |
| 2196 | +emoji[person_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC' | |
| 2197 | +emoji[person_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD' | |
| 2198 | +emoji[person_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE' | |
| 2199 | +emoji[person_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF' | |
| 2200 | +emoji[man_swimming]=$'\U1F3CA\U200D\U2642\UFE0F' | |
| 2201 | +emoji[man_swimming_minimally]=$'\U1F3CA\U200D\U2642' | |
| 2202 | +emoji[swimming_man]=$'\U1F3CA\U200D\U2642' | |
| 2203 | +emoji[man_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB\U200D\U2642\UFE0F' | |
| 2204 | +emoji[man_swimming_light_skin_tone_minimally]=$'\U1F3CA\U1F3FB\U200D\U2642' | |
| 2205 | +emoji[man_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC\U200D\U2642\UFE0F' | |
| 2206 | +emoji[man_swimming_medium_light_skin_tone_minimally]=$'\U1F3CA\U1F3FC\U200D\U2642' | |
| 2207 | +emoji[man_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD\U200D\U2642\UFE0F' | |
| 2208 | +emoji[man_swimming_medium_skin_tone_minimally]=$'\U1F3CA\U1F3FD\U200D\U2642' | |
| 2209 | +emoji[man_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE\U200D\U2642\UFE0F' | |
| 2210 | +emoji[man_swimming_medium_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FE\U200D\U2642' | |
| 2211 | +emoji[man_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF\U200D\U2642\UFE0F' | |
| 2212 | +emoji[man_swimming_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FF\U200D\U2642' | |
| 2213 | +emoji[woman_swimming]=$'\U1F3CA\U200D\U2640\UFE0F' | |
| 2214 | +emoji[woman_swimming_minimally]=$'\U1F3CA\U200D\U2640' | |
| 2215 | +emoji[swimming_woman]=$'\U1F3CA\U200D\U2640' | |
| 2216 | +emoji[woman_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB\U200D\U2640\UFE0F' | |
| 2217 | +emoji[woman_swimming_light_skin_tone_minimally]=$'\U1F3CA\U1F3FB\U200D\U2640' | |
| 2218 | +emoji[woman_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC\U200D\U2640\UFE0F' | |
| 2219 | +emoji[woman_swimming_medium_light_skin_tone_minimally]=$'\U1F3CA\U1F3FC\U200D\U2640' | |
| 2220 | +emoji[woman_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD\U200D\U2640\UFE0F' | |
| 2221 | +emoji[woman_swimming_medium_skin_tone_minimally]=$'\U1F3CA\U1F3FD\U200D\U2640' | |
| 2222 | +emoji[woman_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE\U200D\U2640\UFE0F' | |
| 2223 | +emoji[woman_swimming_medium_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FE\U200D\U2640' | |
| 2224 | +emoji[woman_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF\U200D\U2640\UFE0F' | |
| 2225 | +emoji[woman_swimming_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FF\U200D\U2640' | |
| 2226 | +emoji[person_bouncing_ball]=$'\U26F9\UFE0F' | |
| 2227 | +emoji[person_bouncing_ball_unqualified]=$'\U26F9' | |
| 2228 | +emoji[bouncing_ball_person]=$'\U26F9' | |
| 2229 | +emoji[person_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB' | |
| 2230 | +emoji[person_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC' | |
| 2231 | +emoji[person_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD' | |
| 2232 | +emoji[person_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE' | |
| 2233 | +emoji[person_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF' | |
| 2234 | +emoji[man_bouncing_ball]=$'\U26F9\UFE0F\U200D\U2642\UFE0F' | |
| 2235 | +emoji[bouncing_ball_man]=$'\U26F9\UFE0F\U200D\U2642\UFE0F' | |
| 2236 | +emoji[basketball_man]=$'\U26F9\UFE0F\U200D\U2642\UFE0F' | |
| 2237 | +emoji[man_bouncing_ball_unqualified]=$'\U26F9\U200D\U2642\UFE0F' | |
| 2238 | +emoji[man_bouncing_ball_unqualified_1]=$'\U26F9\UFE0F\U200D\U2642' | |
| 2239 | +emoji[man_bouncing_ball_unqualified_2]=$'\U26F9\U200D\U2642' | |
| 2240 | +emoji[man_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB\U200D\U2642\UFE0F' | |
| 2241 | +emoji[man_bouncing_ball_light_skin_tone_minimally]=$'\U26F9\U1F3FB\U200D\U2642' | |
| 2242 | +emoji[man_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC\U200D\U2642\UFE0F' | |
| 2243 | +emoji[man_bouncing_ball_medium_light_skin_tone_minimally]=$'\U26F9\U1F3FC\U200D\U2642' | |
| 2244 | +emoji[man_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD\U200D\U2642\UFE0F' | |
| 2245 | +emoji[man_bouncing_ball_medium_skin_tone_minimally]=$'\U26F9\U1F3FD\U200D\U2642' | |
| 2246 | +emoji[man_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE\U200D\U2642\UFE0F' | |
| 2247 | +emoji[man_bouncing_ball_medium_dark_skin_tone_minimally]=$'\U26F9\U1F3FE\U200D\U2642' | |
| 2248 | +emoji[man_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF\U200D\U2642\UFE0F' | |
| 2249 | +emoji[man_bouncing_ball_dark_skin_tone_minimally]=$'\U26F9\U1F3FF\U200D\U2642' | |
| 2250 | +emoji[woman_bouncing_ball]=$'\U26F9\UFE0F\U200D\U2640\UFE0F' | |
| 2251 | +emoji[bouncing_ball_woman]=$'\U26F9\UFE0F\U200D\U2640\UFE0F' | |
| 2252 | +emoji[basketball_woman]=$'\U26F9\UFE0F\U200D\U2640\UFE0F' | |
| 2253 | +emoji[woman_bouncing_ball_unqualified]=$'\U26F9\U200D\U2640\UFE0F' | |
| 2254 | +emoji[woman_bouncing_ball_unqualified_1]=$'\U26F9\UFE0F\U200D\U2640' | |
| 2255 | +emoji[woman_bouncing_ball_unqualified_2]=$'\U26F9\U200D\U2640' | |
| 2256 | +emoji[woman_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB\U200D\U2640\UFE0F' | |
| 2257 | +emoji[woman_bouncing_ball_light_skin_tone_minimally]=$'\U26F9\U1F3FB\U200D\U2640' | |
| 2258 | +emoji[woman_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC\U200D\U2640\UFE0F' | |
| 2259 | +emoji[woman_bouncing_ball_medium_light_skin_tone_minimally]=$'\U26F9\U1F3FC\U200D\U2640' | |
| 2260 | +emoji[woman_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD\U200D\U2640\UFE0F' | |
| 2261 | +emoji[woman_bouncing_ball_medium_skin_tone_minimally]=$'\U26F9\U1F3FD\U200D\U2640' | |
| 2262 | +emoji[woman_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE\U200D\U2640\UFE0F' | |
| 2263 | +emoji[woman_bouncing_ball_medium_dark_skin_tone_minimally]=$'\U26F9\U1F3FE\U200D\U2640' | |
| 2264 | +emoji[woman_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF\U200D\U2640\UFE0F' | |
| 2265 | +emoji[woman_bouncing_ball_dark_skin_tone_minimally]=$'\U26F9\U1F3FF\U200D\U2640' | |
| 2266 | +emoji[person_lifting_weights]=$'\U1F3CB\UFE0F' | |
| 2267 | +emoji[person_lifting_weights_unqualified]=$'\U1F3CB' | |
| 2268 | +emoji[weight_lifting]=$'\U1F3CB' | |
| 2269 | +emoji[person_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB' | |
| 2270 | +emoji[person_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC' | |
| 2271 | +emoji[person_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD' | |
| 2272 | +emoji[person_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE' | |
| 2273 | +emoji[person_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF' | |
| 2274 | +emoji[man_lifting_weights]=$'\U1F3CB\UFE0F\U200D\U2642\UFE0F' | |
| 2275 | +emoji[weight_lifting_man]=$'\U1F3CB\UFE0F\U200D\U2642\UFE0F' | |
| 2276 | +emoji[man_lifting_weights_unqualified]=$'\U1F3CB\U200D\U2642\UFE0F' | |
| 2277 | +emoji[man_lifting_weights_unqualified_1]=$'\U1F3CB\UFE0F\U200D\U2642' | |
| 2278 | +emoji[man_lifting_weights_unqualified_2]=$'\U1F3CB\U200D\U2642' | |
| 2279 | +emoji[man_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB\U200D\U2642\UFE0F' | |
| 2280 | +emoji[man_lifting_weights_light_skin_tone_minimally]=$'\U1F3CB\U1F3FB\U200D\U2642' | |
| 2281 | +emoji[man_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC\U200D\U2642\UFE0F' | |
| 2282 | +emoji[man_lifting_weights_medium_light_skin_tone_minimally]=$'\U1F3CB\U1F3FC\U200D\U2642' | |
| 2283 | +emoji[man_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD\U200D\U2642\UFE0F' | |
| 2284 | +emoji[man_lifting_weights_medium_skin_tone_minimally]=$'\U1F3CB\U1F3FD\U200D\U2642' | |
| 2285 | +emoji[man_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE\U200D\U2642\UFE0F' | |
| 2286 | +emoji[man_lifting_weights_medium_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FE\U200D\U2642' | |
| 2287 | +emoji[man_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF\U200D\U2642\UFE0F' | |
| 2288 | +emoji[man_lifting_weights_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FF\U200D\U2642' | |
| 2289 | +emoji[woman_lifting_weights]=$'\U1F3CB\UFE0F\U200D\U2640\UFE0F' | |
| 2290 | +emoji[weight_lifting_woman]=$'\U1F3CB\UFE0F\U200D\U2640\UFE0F' | |
| 2291 | +emoji[woman_lifting_weights_unqualified]=$'\U1F3CB\U200D\U2640\UFE0F' | |
| 2292 | +emoji[woman_lifting_weights_unqualified_1]=$'\U1F3CB\UFE0F\U200D\U2640' | |
| 2293 | +emoji[woman_lifting_weights_unqualified_2]=$'\U1F3CB\U200D\U2640' | |
| 2294 | +emoji[woman_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB\U200D\U2640\UFE0F' | |
| 2295 | +emoji[woman_lifting_weights_light_skin_tone_minimally]=$'\U1F3CB\U1F3FB\U200D\U2640' | |
| 2296 | +emoji[woman_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC\U200D\U2640\UFE0F' | |
| 2297 | +emoji[woman_lifting_weights_medium_light_skin_tone_minimally]=$'\U1F3CB\U1F3FC\U200D\U2640' | |
| 2298 | +emoji[woman_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD\U200D\U2640\UFE0F' | |
| 2299 | +emoji[woman_lifting_weights_medium_skin_tone_minimally]=$'\U1F3CB\U1F3FD\U200D\U2640' | |
| 2300 | +emoji[woman_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE\U200D\U2640\UFE0F' | |
| 2301 | +emoji[woman_lifting_weights_medium_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FE\U200D\U2640' | |
| 2302 | +emoji[woman_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF\U200D\U2640\UFE0F' | |
| 2303 | +emoji[woman_lifting_weights_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FF\U200D\U2640' | |
| 2304 | +emoji[person_biking]=$'\U1F6B4' | |
| 2305 | +emoji[bicyclist]=$'\U1F6B4' | |
| 2306 | +emoji[person_biking_light_skin_tone]=$'\U1F6B4\U1F3FB' | |
| 2307 | +emoji[person_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC' | |
| 2308 | +emoji[person_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD' | |
| 2309 | +emoji[person_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE' | |
| 2310 | +emoji[person_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF' | |
| 2311 | +emoji[man_biking]=$'\U1F6B4\U200D\U2642\UFE0F' | |
| 2312 | +emoji[man_biking_minimally]=$'\U1F6B4\U200D\U2642' | |
| 2313 | +emoji[biking_man]=$'\U1F6B4\U200D\U2642' | |
| 2314 | +emoji[man_biking_light_skin_tone]=$'\U1F6B4\U1F3FB\U200D\U2642\UFE0F' | |
| 2315 | +emoji[man_biking_light_skin_tone_minimally]=$'\U1F6B4\U1F3FB\U200D\U2642' | |
| 2316 | +emoji[man_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC\U200D\U2642\UFE0F' | |
| 2317 | +emoji[man_biking_medium_light_skin_tone_minimally]=$'\U1F6B4\U1F3FC\U200D\U2642' | |
| 2318 | +emoji[man_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD\U200D\U2642\UFE0F' | |
| 2319 | +emoji[man_biking_medium_skin_tone_minimally]=$'\U1F6B4\U1F3FD\U200D\U2642' | |
| 2320 | +emoji[man_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE\U200D\U2642\UFE0F' | |
| 2321 | +emoji[man_biking_medium_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FE\U200D\U2642' | |
| 2322 | +emoji[man_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF\U200D\U2642\UFE0F' | |
| 2323 | +emoji[man_biking_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FF\U200D\U2642' | |
| 2324 | +emoji[woman_biking]=$'\U1F6B4\U200D\U2640\UFE0F' | |
| 2325 | +emoji[woman_biking_minimally]=$'\U1F6B4\U200D\U2640' | |
| 2326 | +emoji[biking_woman]=$'\U1F6B4\U200D\U2640' | |
| 2327 | +emoji[woman_biking_light_skin_tone]=$'\U1F6B4\U1F3FB\U200D\U2640\UFE0F' | |
| 2328 | +emoji[woman_biking_light_skin_tone_minimally]=$'\U1F6B4\U1F3FB\U200D\U2640' | |
| 2329 | +emoji[woman_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC\U200D\U2640\UFE0F' | |
| 2330 | +emoji[woman_biking_medium_light_skin_tone_minimally]=$'\U1F6B4\U1F3FC\U200D\U2640' | |
| 2331 | +emoji[woman_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD\U200D\U2640\UFE0F' | |
| 2332 | +emoji[woman_biking_medium_skin_tone_minimally]=$'\U1F6B4\U1F3FD\U200D\U2640' | |
| 2333 | +emoji[woman_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE\U200D\U2640\UFE0F' | |
| 2334 | +emoji[woman_biking_medium_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FE\U200D\U2640' | |
| 2335 | +emoji[woman_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF\U200D\U2640\UFE0F' | |
| 2336 | +emoji[woman_biking_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FF\U200D\U2640' | |
| 2337 | +emoji[person_mountain_biking]=$'\U1F6B5' | |
| 2338 | +emoji[mountain_bicyclist]=$'\U1F6B5' | |
| 2339 | +emoji[person_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB' | |
| 2340 | +emoji[person_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC' | |
| 2341 | +emoji[person_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD' | |
| 2342 | +emoji[person_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE' | |
| 2343 | +emoji[person_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF' | |
| 2344 | +emoji[man_mountain_biking]=$'\U1F6B5\U200D\U2642\UFE0F' | |
| 2345 | +emoji[man_mountain_biking_minimally]=$'\U1F6B5\U200D\U2642' | |
| 2346 | +emoji[mountain_biking_man]=$'\U1F6B5\U200D\U2642' | |
| 2347 | +emoji[man_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB\U200D\U2642\UFE0F' | |
| 2348 | +emoji[man_mountain_biking_light_skin_tone_minimally]=$'\U1F6B5\U1F3FB\U200D\U2642' | |
| 2349 | +emoji[man_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC\U200D\U2642\UFE0F' | |
| 2350 | +emoji[man_mountain_biking_medium_light_skin_tone_minimally]=$'\U1F6B5\U1F3FC\U200D\U2642' | |
| 2351 | +emoji[man_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD\U200D\U2642\UFE0F' | |
| 2352 | +emoji[man_mountain_biking_medium_skin_tone_minimally]=$'\U1F6B5\U1F3FD\U200D\U2642' | |
| 2353 | +emoji[man_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE\U200D\U2642\UFE0F' | |
| 2354 | +emoji[man_mountain_biking_medium_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FE\U200D\U2642' | |
| 2355 | +emoji[man_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF\U200D\U2642\UFE0F' | |
| 2356 | +emoji[man_mountain_biking_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FF\U200D\U2642' | |
| 2357 | +emoji[woman_mountain_biking]=$'\U1F6B5\U200D\U2640\UFE0F' | |
| 2358 | +emoji[woman_mountain_biking_minimally]=$'\U1F6B5\U200D\U2640' | |
| 2359 | +emoji[mountain_biking_woman]=$'\U1F6B5\U200D\U2640' | |
| 2360 | +emoji[woman_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB\U200D\U2640\UFE0F' | |
| 2361 | +emoji[woman_mountain_biking_light_skin_tone_minimally]=$'\U1F6B5\U1F3FB\U200D\U2640' | |
| 2362 | +emoji[woman_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC\U200D\U2640\UFE0F' | |
| 2363 | +emoji[woman_mountain_biking_medium_light_skin_tone_minimally]=$'\U1F6B5\U1F3FC\U200D\U2640' | |
| 2364 | +emoji[woman_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD\U200D\U2640\UFE0F' | |
| 2365 | +emoji[woman_mountain_biking_medium_skin_tone_minimally]=$'\U1F6B5\U1F3FD\U200D\U2640' | |
| 2366 | +emoji[woman_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE\U200D\U2640\UFE0F' | |
| 2367 | +emoji[woman_mountain_biking_medium_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FE\U200D\U2640' | |
| 2368 | +emoji[woman_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF\U200D\U2640\UFE0F' | |
| 2369 | +emoji[woman_mountain_biking_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FF\U200D\U2640' | |
| 2370 | +emoji[person_cartwheeling]=$'\U1F938' | |
| 2371 | +emoji[cartwheeling]=$'\U1F938' | |
| 2372 | +emoji[person_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB' | |
| 2373 | +emoji[person_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC' | |
| 2374 | +emoji[person_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD' | |
| 2375 | +emoji[person_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE' | |
| 2376 | +emoji[person_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF' | |
| 2377 | +emoji[man_cartwheeling]=$'\U1F938\U200D\U2642\UFE0F' | |
| 2378 | +emoji[man_cartwheeling_minimally]=$'\U1F938\U200D\U2642' | |
| 2379 | +emoji[man_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB\U200D\U2642\UFE0F' | |
| 2380 | +emoji[man_cartwheeling_light_skin_tone_minimally]=$'\U1F938\U1F3FB\U200D\U2642' | |
| 2381 | +emoji[man_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC\U200D\U2642\UFE0F' | |
| 2382 | +emoji[man_cartwheeling_medium_light_skin_tone_minimally]=$'\U1F938\U1F3FC\U200D\U2642' | |
| 2383 | +emoji[man_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD\U200D\U2642\UFE0F' | |
| 2384 | +emoji[man_cartwheeling_medium_skin_tone_minimally]=$'\U1F938\U1F3FD\U200D\U2642' | |
| 2385 | +emoji[man_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE\U200D\U2642\UFE0F' | |
| 2386 | +emoji[man_cartwheeling_medium_dark_skin_tone_minimally]=$'\U1F938\U1F3FE\U200D\U2642' | |
| 2387 | +emoji[man_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF\U200D\U2642\UFE0F' | |
| 2388 | +emoji[man_cartwheeling_dark_skin_tone_minimally]=$'\U1F938\U1F3FF\U200D\U2642' | |
| 2389 | +emoji[woman_cartwheeling]=$'\U1F938\U200D\U2640\UFE0F' | |
| 2390 | +emoji[woman_cartwheeling_minimally]=$'\U1F938\U200D\U2640' | |
| 2391 | +emoji[woman_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB\U200D\U2640\UFE0F' | |
| 2392 | +emoji[woman_cartwheeling_light_skin_tone_minimally]=$'\U1F938\U1F3FB\U200D\U2640' | |
| 2393 | +emoji[woman_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC\U200D\U2640\UFE0F' | |
| 2394 | +emoji[woman_cartwheeling_medium_light_skin_tone_minimally]=$'\U1F938\U1F3FC\U200D\U2640' | |
| 2395 | +emoji[woman_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD\U200D\U2640\UFE0F' | |
| 2396 | +emoji[woman_cartwheeling_medium_skin_tone_minimally]=$'\U1F938\U1F3FD\U200D\U2640' | |
| 2397 | +emoji[woman_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE\U200D\U2640\UFE0F' | |
| 2398 | +emoji[woman_cartwheeling_medium_dark_skin_tone_minimally]=$'\U1F938\U1F3FE\U200D\U2640' | |
| 2399 | +emoji[woman_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF\U200D\U2640\UFE0F' | |
| 2400 | +emoji[woman_cartwheeling_dark_skin_tone_minimally]=$'\U1F938\U1F3FF\U200D\U2640' | |
| 2401 | +emoji[people_wrestling]=$'\U1F93C' | |
| 2402 | +emoji[wrestling]=$'\U1F93C' | |
| 2403 | +emoji[men_wrestling]=$'\U1F93C\U200D\U2642\UFE0F' | |
| 2404 | +emoji[men_wrestling_minimally]=$'\U1F93C\U200D\U2642' | |
| 2405 | +emoji[women_wrestling]=$'\U1F93C\U200D\U2640\UFE0F' | |
| 2406 | +emoji[women_wrestling_minimally]=$'\U1F93C\U200D\U2640' | |
| 2407 | +emoji[person_playing_water_polo]=$'\U1F93D' | |
| 2408 | +emoji[water_polo]=$'\U1F93D' | |
| 2409 | +emoji[person_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB' | |
| 2410 | +emoji[person_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC' | |
| 2411 | +emoji[person_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD' | |
| 2412 | +emoji[person_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE' | |
| 2413 | +emoji[person_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF' | |
| 2414 | +emoji[man_playing_water_polo]=$'\U1F93D\U200D\U2642\UFE0F' | |
| 2415 | +emoji[man_playing_water_polo_minimally]=$'\U1F93D\U200D\U2642' | |
| 2416 | +emoji[man_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB\U200D\U2642\UFE0F' | |
| 2417 | +emoji[man_playing_water_polo_light_skin_tone_minimally]=$'\U1F93D\U1F3FB\U200D\U2642' | |
| 2418 | +emoji[man_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC\U200D\U2642\UFE0F' | |
| 2419 | +emoji[man_playing_water_polo_medium_light_skin_tone_minimally]=$'\U1F93D\U1F3FC\U200D\U2642' | |
| 2420 | +emoji[man_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD\U200D\U2642\UFE0F' | |
| 2421 | +emoji[man_playing_water_polo_medium_skin_tone_minimally]=$'\U1F93D\U1F3FD\U200D\U2642' | |
| 2422 | +emoji[man_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE\U200D\U2642\UFE0F' | |
| 2423 | +emoji[man_playing_water_polo_medium_dark_skin_tone_minimally]=$'\U1F93D\U1F3FE\U200D\U2642' | |
| 2424 | +emoji[man_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF\U200D\U2642\UFE0F' | |
| 2425 | +emoji[man_playing_water_polo_dark_skin_tone_minimally]=$'\U1F93D\U1F3FF\U200D\U2642' | |
| 2426 | +emoji[woman_playing_water_polo]=$'\U1F93D\U200D\U2640\UFE0F' | |
| 2427 | +emoji[woman_playing_water_polo_minimally]=$'\U1F93D\U200D\U2640' | |
| 2428 | +emoji[woman_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB\U200D\U2640\UFE0F' | |
| 2429 | +emoji[woman_playing_water_polo_light_skin_tone_minimally]=$'\U1F93D\U1F3FB\U200D\U2640' | |
| 2430 | +emoji[woman_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC\U200D\U2640\UFE0F' | |
| 2431 | +emoji[woman_playing_water_polo_medium_light_skin_tone_minimally]=$'\U1F93D\U1F3FC\U200D\U2640' | |
| 2432 | +emoji[woman_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD\U200D\U2640\UFE0F' | |
| 2433 | +emoji[woman_playing_water_polo_medium_skin_tone_minimally]=$'\U1F93D\U1F3FD\U200D\U2640' | |
| 2434 | +emoji[woman_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE\U200D\U2640\UFE0F' | |
| 2435 | +emoji[woman_playing_water_polo_medium_dark_skin_tone_minimally]=$'\U1F93D\U1F3FE\U200D\U2640' | |
| 2436 | +emoji[woman_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF\U200D\U2640\UFE0F' | |
| 2437 | +emoji[woman_playing_water_polo_dark_skin_tone_minimally]=$'\U1F93D\U1F3FF\U200D\U2640' | |
| 2438 | +emoji[person_playing_handball]=$'\U1F93E' | |
| 2439 | +emoji[handball_person]=$'\U1F93E' | |
| 2440 | +emoji[person_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB' | |
| 2441 | +emoji[person_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC' | |
| 2442 | +emoji[person_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD' | |
| 2443 | +emoji[person_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE' | |
| 2444 | +emoji[person_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF' | |
| 2445 | +emoji[man_playing_handball]=$'\U1F93E\U200D\U2642\UFE0F' | |
| 2446 | +emoji[man_playing_handball_minimally]=$'\U1F93E\U200D\U2642' | |
| 2447 | +emoji[man_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB\U200D\U2642\UFE0F' | |
| 2448 | +emoji[man_playing_handball_light_skin_tone_minimally]=$'\U1F93E\U1F3FB\U200D\U2642' | |
| 2449 | +emoji[man_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC\U200D\U2642\UFE0F' | |
| 2450 | +emoji[man_playing_handball_medium_light_skin_tone_minimally]=$'\U1F93E\U1F3FC\U200D\U2642' | |
| 2451 | +emoji[man_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD\U200D\U2642\UFE0F' | |
| 2452 | +emoji[man_playing_handball_medium_skin_tone_minimally]=$'\U1F93E\U1F3FD\U200D\U2642' | |
| 2453 | +emoji[man_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE\U200D\U2642\UFE0F' | |
| 2454 | +emoji[man_playing_handball_medium_dark_skin_tone_minimally]=$'\U1F93E\U1F3FE\U200D\U2642' | |
| 2455 | +emoji[man_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF\U200D\U2642\UFE0F' | |
| 2456 | +emoji[man_playing_handball_dark_skin_tone_minimally]=$'\U1F93E\U1F3FF\U200D\U2642' | |
| 2457 | +emoji[woman_playing_handball]=$'\U1F93E\U200D\U2640\UFE0F' | |
| 2458 | +emoji[woman_playing_handball_minimally]=$'\U1F93E\U200D\U2640' | |
| 2459 | +emoji[woman_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB\U200D\U2640\UFE0F' | |
| 2460 | +emoji[woman_playing_handball_light_skin_tone_minimally]=$'\U1F93E\U1F3FB\U200D\U2640' | |
| 2461 | +emoji[woman_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC\U200D\U2640\UFE0F' | |
| 2462 | +emoji[woman_playing_handball_medium_light_skin_tone_minimally]=$'\U1F93E\U1F3FC\U200D\U2640' | |
| 2463 | +emoji[woman_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD\U200D\U2640\UFE0F' | |
| 2464 | +emoji[woman_playing_handball_medium_skin_tone_minimally]=$'\U1F93E\U1F3FD\U200D\U2640' | |
| 2465 | +emoji[woman_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE\U200D\U2640\UFE0F' | |
| 2466 | +emoji[woman_playing_handball_medium_dark_skin_tone_minimally]=$'\U1F93E\U1F3FE\U200D\U2640' | |
| 2467 | +emoji[woman_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF\U200D\U2640\UFE0F' | |
| 2468 | +emoji[woman_playing_handball_dark_skin_tone_minimally]=$'\U1F93E\U1F3FF\U200D\U2640' | |
| 2469 | +emoji[person_juggling]=$'\U1F939' | |
| 2470 | +emoji[juggling_person]=$'\U1F939' | |
| 2471 | +emoji[person_juggling_light_skin_tone]=$'\U1F939\U1F3FB' | |
| 2472 | +emoji[person_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC' | |
| 2473 | +emoji[person_juggling_medium_skin_tone]=$'\U1F939\U1F3FD' | |
| 2474 | +emoji[person_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE' | |
| 2475 | +emoji[person_juggling_dark_skin_tone]=$'\U1F939\U1F3FF' | |
| 2476 | +emoji[man_juggling]=$'\U1F939\U200D\U2642\UFE0F' | |
| 2477 | +emoji[man_juggling_minimally]=$'\U1F939\U200D\U2642' | |
| 2478 | +emoji[man_juggling_light_skin_tone]=$'\U1F939\U1F3FB\U200D\U2642\UFE0F' | |
| 2479 | +emoji[man_juggling_light_skin_tone_minimally]=$'\U1F939\U1F3FB\U200D\U2642' | |
| 2480 | +emoji[man_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC\U200D\U2642\UFE0F' | |
| 2481 | +emoji[man_juggling_medium_light_skin_tone_minimally]=$'\U1F939\U1F3FC\U200D\U2642' | |
| 2482 | +emoji[man_juggling_medium_skin_tone]=$'\U1F939\U1F3FD\U200D\U2642\UFE0F' | |
| 2483 | +emoji[man_juggling_medium_skin_tone_minimally]=$'\U1F939\U1F3FD\U200D\U2642' | |
| 2484 | +emoji[man_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE\U200D\U2642\UFE0F' | |
| 2485 | +emoji[man_juggling_medium_dark_skin_tone_minimally]=$'\U1F939\U1F3FE\U200D\U2642' | |
| 2486 | +emoji[man_juggling_dark_skin_tone]=$'\U1F939\U1F3FF\U200D\U2642\UFE0F' | |
| 2487 | +emoji[man_juggling_dark_skin_tone_minimally]=$'\U1F939\U1F3FF\U200D\U2642' | |
| 2488 | +emoji[woman_juggling]=$'\U1F939\U200D\U2640\UFE0F' | |
| 2489 | +emoji[woman_juggling_minimally]=$'\U1F939\U200D\U2640' | |
| 2490 | +emoji[woman_juggling_light_skin_tone]=$'\U1F939\U1F3FB\U200D\U2640\UFE0F' | |
| 2491 | +emoji[woman_juggling_light_skin_tone_minimally]=$'\U1F939\U1F3FB\U200D\U2640' | |
| 2492 | +emoji[woman_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC\U200D\U2640\UFE0F' | |
| 2493 | +emoji[woman_juggling_medium_light_skin_tone_minimally]=$'\U1F939\U1F3FC\U200D\U2640' | |
| 2494 | +emoji[woman_juggling_medium_skin_tone]=$'\U1F939\U1F3FD\U200D\U2640\UFE0F' | |
| 2495 | +emoji[woman_juggling_medium_skin_tone_minimally]=$'\U1F939\U1F3FD\U200D\U2640' | |
| 2496 | +emoji[woman_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE\U200D\U2640\UFE0F' | |
| 2497 | +emoji[woman_juggling_medium_dark_skin_tone_minimally]=$'\U1F939\U1F3FE\U200D\U2640' | |
| 2498 | +emoji[woman_juggling_dark_skin_tone]=$'\U1F939\U1F3FF\U200D\U2640\UFE0F' | |
| 2499 | +emoji[woman_juggling_dark_skin_tone_minimally]=$'\U1F939\U1F3FF\U200D\U2640' | |
| 2500 | +emoji[person_in_lotus_position]=$'\U1F9D8' | |
| 2501 | +emoji[lotus_position]=$'\U1F9D8' | |
| 2502 | +emoji[person_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB' | |
| 2503 | +emoji[person_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC' | |
| 2504 | +emoji[person_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD' | |
| 2505 | +emoji[person_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE' | |
| 2506 | +emoji[person_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF' | |
| 2507 | +emoji[man_in_lotus_position]=$'\U1F9D8\U200D\U2642\UFE0F' | |
| 2508 | +emoji[man_in_lotus_position_minimally]=$'\U1F9D8\U200D\U2642' | |
| 2509 | +emoji[lotus_position_man]=$'\U1F9D8\U200D\U2642' | |
| 2510 | +emoji[man_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB\U200D\U2642\UFE0F' | |
| 2511 | +emoji[man_in_lotus_position_light_skin_tone_minimally]=$'\U1F9D8\U1F3FB\U200D\U2642' | |
| 2512 | +emoji[man_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC\U200D\U2642\UFE0F' | |
| 2513 | +emoji[man_in_lotus_position_medium_light_skin_tone_minimally]=$'\U1F9D8\U1F3FC\U200D\U2642' | |
| 2514 | +emoji[man_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD\U200D\U2642\UFE0F' | |
| 2515 | +emoji[man_in_lotus_position_medium_skin_tone_minimally]=$'\U1F9D8\U1F3FD\U200D\U2642' | |
| 2516 | +emoji[man_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE\U200D\U2642\UFE0F' | |
| 2517 | +emoji[man_in_lotus_position_medium_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FE\U200D\U2642' | |
| 2518 | +emoji[man_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF\U200D\U2642\UFE0F' | |
| 2519 | +emoji[man_in_lotus_position_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FF\U200D\U2642' | |
| 2520 | +emoji[woman_in_lotus_position]=$'\U1F9D8\U200D\U2640\UFE0F' | |
| 2521 | +emoji[woman_in_lotus_position_minimally]=$'\U1F9D8\U200D\U2640' | |
| 2522 | +emoji[lotus_position_woman]=$'\U1F9D8\U200D\U2640' | |
| 2523 | +emoji[woman_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB\U200D\U2640\UFE0F' | |
| 2524 | +emoji[woman_in_lotus_position_light_skin_tone_minimally]=$'\U1F9D8\U1F3FB\U200D\U2640' | |
| 2525 | +emoji[woman_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC\U200D\U2640\UFE0F' | |
| 2526 | +emoji[woman_in_lotus_position_medium_light_skin_tone_minimally]=$'\U1F9D8\U1F3FC\U200D\U2640' | |
| 2527 | +emoji[woman_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD\U200D\U2640\UFE0F' | |
| 2528 | +emoji[woman_in_lotus_position_medium_skin_tone_minimally]=$'\U1F9D8\U1F3FD\U200D\U2640' | |
| 2529 | +emoji[woman_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE\U200D\U2640\UFE0F' | |
| 2530 | +emoji[woman_in_lotus_position_medium_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FE\U200D\U2640' | |
| 2531 | +emoji[woman_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF\U200D\U2640\UFE0F' | |
| 2532 | +emoji[woman_in_lotus_position_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FF\U200D\U2640' | |
| 2533 | +emoji[person_taking_bath]=$'\U1F6C0' | |
| 2534 | +emoji[bath]=$'\U1F6C0' | |
| 2535 | +emoji[person_taking_bath_light_skin_tone]=$'\U1F6C0\U1F3FB' | |
| 2536 | +emoji[person_taking_bath_medium_light_skin_tone]=$'\U1F6C0\U1F3FC' | |
| 2537 | +emoji[person_taking_bath_medium_skin_tone]=$'\U1F6C0\U1F3FD' | |
| 2538 | +emoji[person_taking_bath_medium_dark_skin_tone]=$'\U1F6C0\U1F3FE' | |
| 2539 | +emoji[person_taking_bath_dark_skin_tone]=$'\U1F6C0\U1F3FF' | |
| 2540 | +emoji[person_in_bed]=$'\U1F6CC' | |
| 2541 | +emoji[sleeping_bed]=$'\U1F6CC' | |
| 2542 | +emoji[person_in_bed_light_skin_tone]=$'\U1F6CC\U1F3FB' | |
| 2543 | +emoji[person_in_bed_medium_light_skin_tone]=$'\U1F6CC\U1F3FC' | |
| 2544 | +emoji[person_in_bed_medium_skin_tone]=$'\U1F6CC\U1F3FD' | |
| 2545 | +emoji[person_in_bed_medium_dark_skin_tone]=$'\U1F6CC\U1F3FE' | |
| 2546 | +emoji[person_in_bed_dark_skin_tone]=$'\U1F6CC\U1F3FF' | |
| 2547 | +emoji[people_holding_hands]=$'\U1F9D1\U200D\U1F91D\U200D\U1F9D1' | |
| 2548 | +emoji[people_holding_hands_light_skin_tone]=$'\U1F9D1\U1F3FB\U200D\U1F91D\U200D\U1F9D1\U1F3FB' | |
| 2549 | +emoji[people_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FC\U200D\U1F91D\U200D\U1F9D1\U1F3FB' | |
| 2550 | +emoji[people_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F9D1\U1F3FC\U200D\U1F91D\U200D\U1F9D1\U1F3FC' | |
| 2551 | +emoji[people_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FB' | |
| 2552 | +emoji[people_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FC' | |
| 2553 | +emoji[people_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FD' | |
| 2554 | +emoji[people_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FB' | |
| 2555 | +emoji[people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FC' | |
| 2556 | +emoji[people_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FD' | |
| 2557 | +emoji[people_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FE' | |
| 2558 | +emoji[people_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FB' | |
| 2559 | +emoji[people_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FC' | |
| 2560 | +emoji[people_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FD' | |
| 2561 | +emoji[people_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FE' | |
| 2562 | +emoji[people_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FF' | |
| 2563 | +emoji[women_holding_hands]=$'\U1F46D' | |
| 2564 | +emoji[two_women_holding_hands]=$'\U1F46D' | |
| 2565 | +emoji[women_holding_hands_light_skin_tone]=$'\U1F46D\U1F3FB' | |
| 2566 | +emoji[women_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F469\U1F3FB' | |
| 2567 | +emoji[women_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46D\U1F3FC' | |
| 2568 | +emoji[women_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F469\U1F3FB' | |
| 2569 | +emoji[women_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F469\U1F3FC' | |
| 2570 | +emoji[women_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46D\U1F3FD' | |
| 2571 | +emoji[women_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FB' | |
| 2572 | +emoji[women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FC' | |
| 2573 | +emoji[women_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FD' | |
| 2574 | +emoji[women_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46D\U1F3FE' | |
| 2575 | +emoji[women_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FB' | |
| 2576 | +emoji[women_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FC' | |
| 2577 | +emoji[women_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FD' | |
| 2578 | +emoji[women_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FE' | |
| 2579 | +emoji[women_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46D\U1F3FF' | |
| 2580 | +emoji[woman_and_man_holding_hands]=$'\U1F46B' | |
| 2581 | +emoji[couple]=$'\U1F46B' | |
| 2582 | +emoji[woman_and_man_holding_hands_light_skin_tone]=$'\U1F46B\U1F3FB' | |
| 2583 | +emoji[woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FC' | |
| 2584 | +emoji[woman_and_man_holding_hands_light_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FD' | |
| 2585 | +emoji[woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FE' | |
| 2586 | +emoji[woman_and_man_holding_hands_light_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FF' | |
| 2587 | +emoji[woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FB' | |
| 2588 | +emoji[woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46B\U1F3FC' | |
| 2589 | +emoji[woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FD' | |
| 2590 | +emoji[woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FE' | |
| 2591 | +emoji[woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FF' | |
| 2592 | +emoji[woman_and_man_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FB' | |
| 2593 | +emoji[woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FC' | |
| 2594 | +emoji[woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46B\U1F3FD' | |
| 2595 | +emoji[woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FE' | |
| 2596 | +emoji[woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FF' | |
| 2597 | +emoji[woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FB' | |
| 2598 | +emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FC' | |
| 2599 | +emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FD' | |
| 2600 | +emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46B\U1F3FE' | |
| 2601 | +emoji[woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FF' | |
| 2602 | +emoji[woman_and_man_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FB' | |
| 2603 | +emoji[woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FC' | |
| 2604 | +emoji[woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FD' | |
| 2605 | +emoji[woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FE' | |
| 2606 | +emoji[woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46B\U1F3FF' | |
| 2607 | +emoji[men_holding_hands]=$'\U1F46C' | |
| 2608 | +emoji[two_men_holding_hands]=$'\U1F46C' | |
| 2609 | +emoji[men_holding_hands_light_skin_tone]=$'\U1F46C\U1F3FB' | |
| 2610 | +emoji[men_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FB' | |
| 2611 | +emoji[men_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46C\U1F3FC' | |
| 2612 | +emoji[men_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FB' | |
| 2613 | +emoji[men_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FC' | |
| 2614 | +emoji[men_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46C\U1F3FD' | |
| 2615 | +emoji[men_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FB' | |
| 2616 | +emoji[men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FC' | |
| 2617 | +emoji[men_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FD' | |
| 2618 | +emoji[men_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46C\U1F3FE' | |
| 2619 | +emoji[men_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FB' | |
| 2620 | +emoji[men_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FC' | |
| 2621 | +emoji[men_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FD' | |
| 2622 | +emoji[men_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FE' | |
| 2623 | +emoji[men_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46C\U1F3FF' | |
| 2624 | +emoji[kiss]=$'\U1F48F' | |
| 2625 | +emoji[couplekiss]=$'\U1F48F' | |
| 2626 | +emoji[kiss_woman_man]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468' | |
| 2627 | +emoji[couplekiss_man_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468' | |
| 2628 | +emoji[kiss_woman_man_minimally]=$'\U1F469\U200D\U2764\U200D\U1F48B\U200D\U1F468' | |
| 2629 | +emoji[kiss_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468' | |
| 2630 | +emoji[couplekiss_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468' | |
| 2631 | +emoji[kiss_man_man_minimally]=$'\U1F468\U200D\U2764\U200D\U1F48B\U200D\U1F468' | |
| 2632 | +emoji[kiss_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F469' | |
| 2633 | +emoji[couplekiss_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F469' | |
| 2634 | +emoji[kiss_woman_woman_minimally]=$'\U1F469\U200D\U2764\U200D\U1F48B\U200D\U1F469' | |
| 2635 | +emoji[couple_with_heart]=$'\U1F491' | |
| 2636 | +emoji[couple_with_heart_woman_man]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F468' | |
| 2637 | +emoji[couple_with_heart_woman_man_minimally]=$'\U1F469\U200D\U2764\U200D\U1F468' | |
| 2638 | +emoji[couple_with_heart_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F468' | |
| 2639 | +emoji[couple_with_heart_man_man_minimally]=$'\U1F468\U200D\U2764\U200D\U1F468' | |
| 2640 | +emoji[couple_with_heart_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F469' | |
| 2641 | +emoji[couple_with_heart_woman_woman_minimally]=$'\U1F469\U200D\U2764\U200D\U1F469' | |
| 2642 | +emoji[family]=$'\U1F46A' | |
| 2643 | +emoji[family_man_woman_boy]=$'\U1F468\U200D\U1F469\U200D\U1F466' | |
| 2644 | +emoji[family_man_woman_girl]=$'\U1F468\U200D\U1F469\U200D\U1F467' | |
| 2645 | +emoji[family_man_woman_girl_boy]=$'\U1F468\U200D\U1F469\U200D\U1F467\U200D\U1F466' | |
| 2646 | +emoji[family_man_woman_boy_boy]=$'\U1F468\U200D\U1F469\U200D\U1F466\U200D\U1F466' | |
| 2647 | +emoji[family_man_woman_girl_girl]=$'\U1F468\U200D\U1F469\U200D\U1F467\U200D\U1F467' | |
| 2648 | +emoji[family_man_man_boy]=$'\U1F468\U200D\U1F468\U200D\U1F466' | |
| 2649 | +emoji[family_man_man_girl]=$'\U1F468\U200D\U1F468\U200D\U1F467' | |
| 2650 | +emoji[family_man_man_girl_boy]=$'\U1F468\U200D\U1F468\U200D\U1F467\U200D\U1F466' | |
| 2651 | +emoji[family_man_man_boy_boy]=$'\U1F468\U200D\U1F468\U200D\U1F466\U200D\U1F466' | |
| 2652 | +emoji[family_man_man_girl_girl]=$'\U1F468\U200D\U1F468\U200D\U1F467\U200D\U1F467' | |
| 2653 | +emoji[family_woman_woman_boy]=$'\U1F469\U200D\U1F469\U200D\U1F466' | |
| 2654 | +emoji[family_woman_woman_girl]=$'\U1F469\U200D\U1F469\U200D\U1F467' | |
| 2655 | +emoji[family_woman_woman_girl_boy]=$'\U1F469\U200D\U1F469\U200D\U1F467\U200D\U1F466' | |
| 2656 | +emoji[family_woman_woman_boy_boy]=$'\U1F469\U200D\U1F469\U200D\U1F466\U200D\U1F466' | |
| 2657 | +emoji[family_woman_woman_girl_girl]=$'\U1F469\U200D\U1F469\U200D\U1F467\U200D\U1F467' | |
| 2658 | +emoji[family_man_boy]=$'\U1F468\U200D\U1F466' | |
| 2659 | +emoji[family_man_boy_boy]=$'\U1F468\U200D\U1F466\U200D\U1F466' | |
| 2660 | +emoji[family_man_girl]=$'\U1F468\U200D\U1F467' | |
| 2661 | +emoji[family_man_girl_boy]=$'\U1F468\U200D\U1F467\U200D\U1F466' | |
| 2662 | +emoji[family_man_girl_girl]=$'\U1F468\U200D\U1F467\U200D\U1F467' | |
| 2663 | +emoji[family_woman_boy]=$'\U1F469\U200D\U1F466' | |
| 2664 | +emoji[family_woman_boy_boy]=$'\U1F469\U200D\U1F466\U200D\U1F466' | |
| 2665 | +emoji[family_woman_girl]=$'\U1F469\U200D\U1F467' | |
| 2666 | +emoji[family_woman_girl_boy]=$'\U1F469\U200D\U1F467\U200D\U1F466' | |
| 2667 | +emoji[family_woman_girl_girl]=$'\U1F469\U200D\U1F467\U200D\U1F467' | |
| 2668 | +emoji[speaking_head]=$'\U1F5E3\UFE0F' | |
| 2669 | +emoji[speaking_head_unqualified]=$'\U1F5E3' | |
| 2670 | +emoji[bust_in_silhouette]=$'\U1F464' | |
| 2671 | +emoji[busts_in_silhouette]=$'\U1F465' | |
| 2672 | +emoji[footprints]=$'\U1F463' | |
| 2673 | +emoji_mod[light_skin_tone]=$'\U1F3FB' | |
| 2674 | +emoji_mod[medium_light_skin_tone]=$'\U1F3FC' | |
| 2675 | +emoji_mod[medium_skin_tone]=$'\U1F3FD' | |
| 2676 | +emoji_mod[medium_dark_skin_tone]=$'\U1F3FE' | |
| 2677 | +emoji_mod[medium_dark_skin_tone_1]=$'\U1F3FF' | |
| 2678 | +emoji_mod[red_hair]=$'\U1F9B0' | |
| 2679 | +emoji_mod[curly_hair]=$'\U1F9B1' | |
| 2680 | +emoji_mod[white_hair]=$'\U1F9B3' | |
| 2681 | +emoji_mod[bald]=$'\U1F9B2' | |
| 2682 | +emoji[monkey_face]=$'\U1F435' | |
| 2683 | +emoji[monkey_face_1]=$'\U1F412' | |
| 2684 | +emoji[monkey]=$'\U1F412' | |
| 2685 | +emoji[gorilla]=$'\U1F98D' | |
| 2686 | +emoji[orangutan]=$'\U1F9A7' | |
| 2687 | +emoji[dog_face]=$'\U1F436' | |
| 2688 | +emoji[dog]=$'\U1F436' | |
| 2689 | +emoji[dog_face_1]=$'\U1F415' | |
| 2690 | +emoji[dog2]=$'\U1F415' | |
| 2691 | +emoji[guide_dog]=$'\U1F9AE' | |
| 2692 | +emoji[service_dog]=$'\U1F415\U200D\U1F9BA' | |
| 2693 | +emoji[poodle]=$'\U1F429' | |
| 2694 | +emoji[wolf]=$'\U1F43A' | |
| 2695 | +emoji[fox]=$'\U1F98A' | |
| 2696 | +emoji[fox_face]=$'\U1F98A' | |
| 2697 | +emoji[raccoon]=$'\U1F99D' | |
| 2698 | +emoji[cat_face]=$'\U1F431' | |
| 2699 | +emoji[cat]=$'\U1F431' | |
| 2700 | +emoji[cat_face_1]=$'\U1F408' | |
| 2701 | +emoji[cat2]=$'\U1F408' | |
| 2702 | +emoji[lion]=$'\U1F981' | |
| 2703 | +emoji[tiger_face]=$'\U1F42F' | |
| 2704 | +emoji[tiger]=$'\U1F42F' | |
| 2705 | +emoji[tiger_face_1]=$'\U1F405' | |
| 2706 | +emoji[tiger2]=$'\U1F405' | |
| 2707 | +emoji[leopard]=$'\U1F406' | |
| 2708 | +emoji[horse_face]=$'\U1F434' | |
| 2709 | +emoji[horse]=$'\U1F434' | |
| 2710 | +emoji[horse_face_1]=$'\U1F40E' | |
| 2711 | +emoji[racehorse]=$'\U1F40E' | |
| 2712 | +emoji[unicorn]=$'\U1F984' | |
| 2713 | +emoji[zebra]=$'\U1F993' | |
| 2714 | +emoji[deer]=$'\U1F98C' | |
| 2715 | +emoji[cow_face]=$'\U1F42E' | |
| 2716 | +emoji[ox]=$'\U1F402' | |
| 2717 | +emoji[water_buffalo]=$'\U1F403' | |
| 2718 | +emoji[cow]=$'\U1F404' | |
| 2719 | +emoji[cow2]=$'\U1F404' | |
| 2720 | +emoji[pig_face]=$'\U1F437' | |
| 2721 | +emoji[pig]=$'\U1F437' | |
| 2722 | +emoji[pig_face_1]=$'\U1F416' | |
| 2723 | +emoji[pig2]=$'\U1F416' | |
| 2724 | +emoji[boar]=$'\U1F417' | |
| 2725 | +emoji[pig_nose]=$'\U1F43D' | |
| 2726 | +emoji[ram]=$'\U1F40F' | |
| 2727 | +emoji[ewe]=$'\U1F411' | |
| 2728 | +emoji[sheep]=$'\U1F411' | |
| 2729 | +emoji[goat]=$'\U1F410' | |
| 2730 | +emoji[camel]=$'\U1F42A' | |
| 2731 | +emoji[dromedary_camel]=$'\U1F42A' | |
| 2732 | +emoji[two_hump_camel]=$'\U1F42B' | |
| 2733 | +emoji[llama]=$'\U1F999' | |
| 2734 | +emoji[giraffe]=$'\U1F992' | |
| 2735 | +emoji[elephant]=$'\U1F418' | |
| 2736 | +emoji[rhinoceros]=$'\U1F98F' | |
| 2737 | +emoji[hippopotamus]=$'\U1F99B' | |
| 2738 | +emoji[mouse_face]=$'\U1F42D' | |
| 2739 | +emoji[mouse]=$'\U1F42D' | |
| 2740 | +emoji[mouse_face_1]=$'\U1F401' | |
| 2741 | +emoji[mouse2]=$'\U1F401' | |
| 2742 | +emoji[rat]=$'\U1F400' | |
| 2743 | +emoji[hamster]=$'\U1F439' | |
| 2744 | +emoji[rabbit_face]=$'\U1F430' | |
| 2745 | +emoji[rabbit]=$'\U1F430' | |
| 2746 | +emoji[rabbit_face_1]=$'\U1F407' | |
| 2747 | +emoji[rabbit2]=$'\U1F407' | |
| 2748 | +emoji[chipmunk]=$'\U1F43F\UFE0F' | |
| 2749 | +emoji[chipmunk_unqualified]=$'\U1F43F' | |
| 2750 | +emoji[hedgehog]=$'\U1F994' | |
| 2751 | +emoji[bat]=$'\U1F987' | |
| 2752 | +emoji[bear]=$'\U1F43B' | |
| 2753 | +emoji[koala]=$'\U1F428' | |
| 2754 | +emoji[panda]=$'\U1F43C' | |
| 2755 | +emoji[panda_face]=$'\U1F43C' | |
| 2756 | +emoji[sloth]=$'\U1F9A5' | |
| 2757 | +emoji[otter]=$'\U1F9A6' | |
| 2758 | +emoji[skunk]=$'\U1F9A8' | |
| 2759 | +emoji[kangaroo]=$'\U1F998' | |
| 2760 | +emoji[badger]=$'\U1F9A1' | |
| 2761 | +emoji[paw_prints]=$'\U1F43E' | |
| 2762 | +emoji[feet]=$'\U1F43E' | |
| 2763 | +emoji[turkey]=$'\U1F983' | |
| 2764 | +emoji[chicken]=$'\U1F414' | |
| 2765 | +emoji[rooster]=$'\U1F413' | |
| 2766 | +emoji[hatching_chick]=$'\U1F423' | |
| 2767 | +emoji[baby_chick]=$'\U1F424' | |
| 2768 | +emoji[front_facing_baby_chick]=$'\U1F425' | |
| 2769 | +emoji[hatched_chick]=$'\U1F425' | |
| 2770 | +emoji[bird]=$'\U1F426' | |
| 2771 | +emoji[penguin]=$'\U1F427' | |
| 2772 | +emoji[dove]=$'\U1F54A\UFE0F' | |
| 2773 | +emoji[dove_unqualified]=$'\U1F54A' | |
| 2774 | +emoji[eagle]=$'\U1F985' | |
| 2775 | +emoji[duck]=$'\U1F986' | |
| 2776 | +emoji[swan]=$'\U1F9A2' | |
| 2777 | +emoji[owl]=$'\U1F989' | |
| 2778 | +emoji[flamingo]=$'\U1F9A9' | |
| 2779 | +emoji[peacock]=$'\U1F99A' | |
| 2780 | +emoji[parrot]=$'\U1F99C' | |
| 2781 | +emoji[frog]=$'\U1F438' | |
| 2782 | +emoji[crocodile]=$'\U1F40A' | |
| 2783 | +emoji[turtle]=$'\U1F422' | |
| 2784 | +emoji[lizard]=$'\U1F98E' | |
| 2785 | +emoji[snake]=$'\U1F40D' | |
| 2786 | +emoji[dragon_face]=$'\U1F432' | |
| 2787 | +emoji[dragon_face_1]=$'\U1F409' | |
| 2788 | +emoji[dragon]=$'\U1F409' | |
| 2789 | +emoji[sauropod]=$'\U1F995' | |
| 2790 | +emoji[T_Rex]=$'\U1F996' | |
| 2791 | +emoji[t-rex]=$'\U1F996' | |
| 2792 | +emoji[spouting_whale]=$'\U1F433' | |
| 2793 | +emoji[whale]=$'\U1F433' | |
| 2794 | +emoji[spouting_whale_1]=$'\U1F40B' | |
| 2795 | +emoji[whale2]=$'\U1F40B' | |
| 2796 | +emoji[dolphin]=$'\U1F42C' | |
| 2797 | +emoji[flipper]=$'\U1F42C' | |
| 2798 | +emoji[fish]=$'\U1F41F' | |
| 2799 | +emoji[tropical_fish]=$'\U1F420' | |
| 2800 | +emoji[blowfish]=$'\U1F421' | |
| 2801 | +emoji[shark]=$'\U1F988' | |
| 2802 | +emoji[octopus]=$'\U1F419' | |
| 2803 | +emoji[spiral_shell]=$'\U1F41A' | |
| 2804 | +emoji[shell]=$'\U1F41A' | |
| 2805 | +emoji[snail]=$'\U1F40C' | |
| 2806 | +emoji[butterfly]=$'\U1F98B' | |
| 2807 | +emoji[bug]=$'\U1F41B' | |
| 2808 | +emoji[ant]=$'\U1F41C' | |
| 2809 | +emoji[honeybee]=$'\U1F41D' | |
| 2810 | +emoji[bee]=$'\U1F41D' | |
| 2811 | +emoji[lady_beetle]=$'\U1F41E' | |
| 2812 | +emoji[beetle]=$'\U1F41E' | |
| 2813 | +emoji[cricket]=$'\U1F997' | |
| 2814 | +emoji[spider]=$'\U1F577\UFE0F' | |
| 2815 | +emoji[spider_unqualified]=$'\U1F577' | |
| 2816 | +emoji[spider_web]=$'\U1F578\UFE0F' | |
| 2817 | +emoji[spider_web_unqualified]=$'\U1F578' | |
| 2818 | +emoji[scorpion]=$'\U1F982' | |
| 2819 | +emoji[mosquito]=$'\U1F99F' | |
| 2820 | +emoji[microbe]=$'\U1F9A0' | |
| 2821 | +emoji[bouquet]=$'\U1F490' | |
| 2822 | +emoji[cherry_blossom]=$'\U1F338' | |
| 2823 | +emoji[white_flower]=$'\U1F4AE' | |
| 2824 | +emoji[rosette]=$'\U1F3F5\UFE0F' | |
| 2825 | +emoji[rosette_unqualified]=$'\U1F3F5' | |
| 2826 | +emoji[rosette_unqualified_1]=$'\U1F339' | |
| 2827 | +emoji[rose]=$'\U1F339' | |
| 2828 | +emoji[wilted_flower]=$'\U1F940' | |
| 2829 | +emoji[hibiscus]=$'\U1F33A' | |
| 2830 | +emoji[sunflower]=$'\U1F33B' | |
| 2831 | +emoji[blossom]=$'\U1F33C' | |
| 2832 | +emoji[tulip]=$'\U1F337' | |
| 2833 | +emoji[seedling]=$'\U1F331' | |
| 2834 | +emoji[evergreen_tree]=$'\U1F332' | |
| 2835 | +emoji[deciduous_tree]=$'\U1F333' | |
| 2836 | +emoji[palm_tree]=$'\U1F334' | |
| 2837 | +emoji[cactus]=$'\U1F335' | |
| 2838 | +emoji[sheaf_of_rice]=$'\U1F33E' | |
| 2839 | +emoji[ear_of_rice]=$'\U1F33E' | |
| 2840 | +emoji[herb]=$'\U1F33F' | |
| 2841 | +emoji[shamrock]=$'\U2618\UFE0F' | |
| 2842 | +emoji[shamrock_unqualified]=$'\U2618' | |
| 2843 | +emoji[four_leaf_clover]=$'\U1F340' | |
| 2844 | +emoji[maple_leaf]=$'\U1F341' | |
| 2845 | +emoji[fallen_leaf]=$'\U1F342' | |
| 2846 | +emoji[leaf_fluttering_in_wind]=$'\U1F343' | |
| 2847 | +emoji[leaves]=$'\U1F343' | |
| 2848 | +emoji[grapes]=$'\U1F347' | |
| 2849 | +emoji[melon]=$'\U1F348' | |
| 2850 | +emoji[watermelon]=$'\U1F349' | |
| 2851 | +emoji[tangerine]=$'\U1F34A' | |
| 2852 | +emoji[orange]=$'\U1F34A' | |
| 2853 | +emoji[mandarin]=$'\U1F34A' | |
| 2854 | +emoji[lemon]=$'\U1F34B' | |
| 2855 | +emoji[banana]=$'\U1F34C' | |
| 2856 | +emoji[pineapple]=$'\U1F34D' | |
| 2857 | +emoji[mango]=$'\U1F96D' | |
| 2858 | +emoji[red_apple]=$'\U1F34E' | |
| 2859 | +emoji[apple]=$'\U1F34E' | |
| 2860 | +emoji[green_apple]=$'\U1F34F' | |
| 2861 | +emoji[pear]=$'\U1F350' | |
| 2862 | +emoji[peach]=$'\U1F351' | |
| 2863 | +emoji[cherries]=$'\U1F352' | |
| 2864 | +emoji[strawberry]=$'\U1F353' | |
| 2865 | +emoji[kiwi_fruit]=$'\U1F95D' | |
| 2866 | +emoji[tomato]=$'\U1F345' | |
| 2867 | +emoji[coconut]=$'\U1F965' | |
| 2868 | +emoji[avocado]=$'\U1F951' | |
| 2869 | +emoji[eggplant]=$'\U1F346' | |
| 2870 | +emoji[potato]=$'\U1F954' | |
| 2871 | +emoji[carrot]=$'\U1F955' | |
| 2872 | +emoji[ear_of_corn]=$'\U1F33D' | |
| 2873 | +emoji[corn]=$'\U1F33D' | |
| 2874 | +emoji[hot_pepper]=$'\U1F336\UFE0F' | |
| 2875 | +emoji[hot_pepper_unqualified]=$'\U1F336' | |
| 2876 | +emoji[cucumber]=$'\U1F952' | |
| 2877 | +emoji[leafy_green]=$'\U1F96C' | |
| 2878 | +emoji[broccoli]=$'\U1F966' | |
| 2879 | +emoji[garlic]=$'\U1F9C4' | |
| 2880 | +emoji[onion]=$'\U1F9C5' | |
| 2881 | +emoji[mushroom]=$'\U1F344' | |
| 2882 | +emoji[peanuts]=$'\U1F95C' | |
| 2883 | +emoji[chestnut]=$'\U1F330' | |
| 2884 | +emoji[bread]=$'\U1F35E' | |
| 2885 | +emoji[croissant]=$'\U1F950' | |
| 2886 | +emoji[baguette_bread]=$'\U1F956' | |
| 2887 | +emoji[pretzel]=$'\U1F968' | |
| 2888 | +emoji[bagel]=$'\U1F96F' | |
| 2889 | +emoji[pancakes]=$'\U1F95E' | |
| 2890 | +emoji[waffle]=$'\U1F9C7' | |
| 2891 | +emoji[cheese_wedge]=$'\U1F9C0' | |
| 2892 | +emoji[cheese]=$'\U1F9C0' | |
| 2893 | +emoji[meat_on_bone]=$'\U1F356' | |
| 2894 | +emoji[poultry_leg]=$'\U1F357' | |
| 2895 | +emoji[cut_of_meat]=$'\U1F969' | |
| 2896 | +emoji[bacon]=$'\U1F953' | |
| 2897 | +emoji[hamburger]=$'\U1F354' | |
| 2898 | +emoji[french_fries]=$'\U1F35F' | |
| 2899 | +emoji[fries]=$'\U1F35F' | |
| 2900 | +emoji[pizza]=$'\U1F355' | |
| 2901 | +emoji[hot_dog]=$'\U1F32D' | |
| 2902 | +emoji[hotdog]=$'\U1F32D' | |
| 2903 | +emoji[sandwich]=$'\U1F96A' | |
| 2904 | +emoji[taco]=$'\U1F32E' | |
| 2905 | +emoji[burrito]=$'\U1F32F' | |
| 2906 | +emoji[stuffed_flatbread]=$'\U1F959' | |
| 2907 | +emoji[falafel]=$'\U1F9C6' | |
| 2908 | +emoji[egg]=$'\U1F95A' | |
| 2909 | +emoji[cooking]=$'\U1F373' | |
| 2910 | +emoji[fried_egg]=$'\U1F373' | |
| 2911 | +emoji[shallow_pan_of_food]=$'\U1F958' | |
| 2912 | +emoji[pot_of_food]=$'\U1F372' | |
| 2913 | +emoji[stew]=$'\U1F372' | |
| 2914 | +emoji[bowl_with_spoon]=$'\U1F963' | |
| 2915 | +emoji[green_salad]=$'\U1F957' | |
| 2916 | +emoji[popcorn]=$'\U1F37F' | |
| 2917 | +emoji[butter]=$'\U1F9C8' | |
| 2918 | +emoji[salt]=$'\U1F9C2' | |
| 2919 | +emoji[canned_food]=$'\U1F96B' | |
| 2920 | +emoji[bento_box]=$'\U1F371' | |
| 2921 | +emoji[bento]=$'\U1F371' | |
| 2922 | +emoji[rice_cracker]=$'\U1F358' | |
| 2923 | +emoji[rice_ball]=$'\U1F359' | |
| 2924 | +emoji[cooked_rice]=$'\U1F35A' | |
| 2925 | +emoji[rice]=$'\U1F35A' | |
| 2926 | +emoji[curry_rice]=$'\U1F35B' | |
| 2927 | +emoji[curry]=$'\U1F35B' | |
| 2928 | +emoji[steaming_bowl]=$'\U1F35C' | |
| 2929 | +emoji[ramen]=$'\U1F35C' | |
| 2930 | +emoji[spaghetti]=$'\U1F35D' | |
| 2931 | +emoji[roasted_sweet_potato]=$'\U1F360' | |
| 2932 | +emoji[sweet_potato]=$'\U1F360' | |
| 2933 | +emoji[oden]=$'\U1F362' | |
| 2934 | +emoji[sushi]=$'\U1F363' | |
| 2935 | +emoji[fried_shrimp]=$'\U1F364' | |
| 2936 | +emoji[fish_cake_with_swirl]=$'\U1F365' | |
| 2937 | +emoji[fish_cake]=$'\U1F365' | |
| 2938 | +emoji[moon_cake]=$'\U1F96E' | |
| 2939 | +emoji[dango]=$'\U1F361' | |
| 2940 | +emoji[dumpling]=$'\U1F95F' | |
| 2941 | +emoji[fortune_cookie]=$'\U1F960' | |
| 2942 | +emoji[takeout_box]=$'\U1F961' | |
| 2943 | +emoji[crab]=$'\U1F980' | |
| 2944 | +emoji[lobster]=$'\U1F99E' | |
| 2945 | +emoji[shrimp]=$'\U1F990' | |
| 2946 | +emoji[squid]=$'\U1F991' | |
| 2947 | +emoji[oyster]=$'\U1F9AA' | |
| 2948 | +emoji[soft_ice_cream]=$'\U1F366' | |
| 2949 | +emoji[icecream]=$'\U1F366' | |
| 2950 | +emoji[shaved_ice]=$'\U1F367' | |
| 2951 | +emoji[ice_cream]=$'\U1F368' | |
| 2952 | +emoji[doughnut]=$'\U1F369' | |
| 2953 | +emoji[cookie]=$'\U1F36A' | |
| 2954 | +emoji[birthday_cake]=$'\U1F382' | |
| 2955 | +emoji[birthday]=$'\U1F382' | |
| 2956 | +emoji[shortcake]=$'\U1F370' | |
| 2957 | +emoji[cake]=$'\U1F370' | |
| 2958 | +emoji[cupcake]=$'\U1F9C1' | |
| 2959 | +emoji[pie]=$'\U1F967' | |
| 2960 | +emoji[chocolate_bar]=$'\U1F36B' | |
| 2961 | +emoji[candy]=$'\U1F36C' | |
| 2962 | +emoji[lollipop]=$'\U1F36D' | |
| 2963 | +emoji[custard]=$'\U1F36E' | |
| 2964 | +emoji[honey_pot]=$'\U1F36F' | |
| 2965 | +emoji[baby_bottle]=$'\U1F37C' | |
| 2966 | +emoji[glass_of_milk]=$'\U1F95B' | |
| 2967 | +emoji[milk_glass]=$'\U1F95B' | |
| 2968 | +emoji[hot_beverage]=$'\U2615' | |
| 2969 | +emoji[coffee]=$'\U2615' | |
| 2970 | +emoji[teacup_without_handle]=$'\U1F375' | |
| 2971 | +emoji[tea]=$'\U1F375' | |
| 2972 | +emoji[sake]=$'\U1F376' | |
| 2973 | +emoji[bottle_with_popping_cork]=$'\U1F37E' | |
| 2974 | +emoji[champagne]=$'\U1F37E' | |
| 2975 | +emoji[wine_glass]=$'\U1F377' | |
| 2976 | +emoji[cocktail_glass]=$'\U1F378' | |
| 2977 | +emoji[cocktail]=$'\U1F378' | |
| 2978 | +emoji[tropical_drink]=$'\U1F379' | |
| 2979 | +emoji[beer_mug]=$'\U1F37A' | |
| 2980 | +emoji[beer]=$'\U1F37A' | |
| 2981 | +emoji[clinking_beer_mugs]=$'\U1F37B' | |
| 2982 | +emoji[beers]=$'\U1F37B' | |
| 2983 | +emoji[clinking_glasses]=$'\U1F942' | |
| 2984 | +emoji[tumbler_glass]=$'\U1F943' | |
| 2985 | +emoji[cup_with_straw]=$'\U1F964' | |
| 2986 | +emoji[beverage_box]=$'\U1F9C3' | |
| 2987 | +emoji[mate]=$'\U1F9C9' | |
| 2988 | +emoji[ice_cube]=$'\U1F9CA' | |
| 2989 | +emoji[chopsticks]=$'\U1F962' | |
| 2990 | +emoji[fork_and_knife_with_plate]=$'\U1F37D\UFE0F' | |
| 2991 | +emoji[fork_and_knife_with_plate_unqualified]=$'\U1F37D' | |
| 2992 | +emoji[plate_with_cutlery]=$'\U1F37D' | |
| 2993 | +emoji[fork_and_knife_with_plate_unqualified_1]=$'\U1F374' | |
| 2994 | +emoji[fork_and_knife]=$'\U1F374' | |
| 2995 | +emoji[spoon]=$'\U1F944' | |
| 2996 | +emoji[kitchen_knife]=$'\U1F52A' | |
| 2997 | +emoji[hocho]=$'\U1F52A' | |
| 2998 | +emoji[knife]=$'\U1F52A' | |
| 2999 | +emoji[amphora]=$'\U1F3FA' | |
| 3000 | +emoji[globe_showing_Europe_Africa]=$'\U1F30D' | |
| 3001 | +emoji[earth_africa]=$'\U1F30D' | |
| 3002 | +emoji[globe_showing_Americas]=$'\U1F30E' | |
| 3003 | +emoji[earth_americas]=$'\U1F30E' | |
| 3004 | +emoji[globe_showing_Asia_Australia]=$'\U1F30F' | |
| 3005 | +emoji[earth_asia]=$'\U1F30F' | |
| 3006 | +emoji[globe_with_meridians]=$'\U1F310' | |
| 3007 | +emoji[world_map]=$'\U1F5FA\UFE0F' | |
| 3008 | +emoji[world_map_unqualified]=$'\U1F5FA' | |
| 3009 | +emoji[map_of_Japan]=$'\U1F5FE' | |
| 3010 | +emoji[japan]=$'\U1F5FE' | |
| 3011 | +emoji[compass]=$'\U1F9ED' | |
| 3012 | +emoji[snow_capped_mountain]=$'\U1F3D4\UFE0F' | |
| 3013 | +emoji[snow_capped_mountain_unqualified]=$'\U1F3D4' | |
| 3014 | +emoji[mountain_snow]=$'\U1F3D4' | |
| 3015 | +emoji[snow_capped_mountain_unqualified_1]=$'\U26F0\UFE0F' | |
| 3016 | +emoji[snow_capped_mountain_unqualified_2]=$'\U26F0' | |
| 3017 | +emoji[mountain]=$'\U26F0' | |
| 3018 | +emoji[volcano]=$'\U1F30B' | |
| 3019 | +emoji[mount_fuji]=$'\U1F5FB' | |
| 3020 | +emoji[camping]=$'\U1F3D5\UFE0F' | |
| 3021 | +emoji[camping_unqualified]=$'\U1F3D5' | |
| 3022 | +emoji[beach_with_umbrella]=$'\U1F3D6\UFE0F' | |
| 3023 | +emoji[beach_with_umbrella_unqualified]=$'\U1F3D6' | |
| 3024 | +emoji[beach_umbrella]=$'\U1F3D6' | |
| 3025 | +emoji[desert]=$'\U1F3DC\UFE0F' | |
| 3026 | +emoji[desert_unqualified]=$'\U1F3DC' | |
| 3027 | +emoji[desert_island]=$'\U1F3DD\UFE0F' | |
| 3028 | +emoji[desert_island_unqualified]=$'\U1F3DD' | |
| 3029 | +emoji[national_park]=$'\U1F3DE\UFE0F' | |
| 3030 | +emoji[national_park_unqualified]=$'\U1F3DE' | |
| 3031 | +emoji[stadium]=$'\U1F3DF\UFE0F' | |
| 3032 | +emoji[stadium_unqualified]=$'\U1F3DF' | |
| 3033 | +emoji[classical_building]=$'\U1F3DB\UFE0F' | |
| 3034 | +emoji[classical_building_unqualified]=$'\U1F3DB' | |
| 3035 | +emoji[building_construction]=$'\U1F3D7\UFE0F' | |
| 3036 | +emoji[building_construction_unqualified]=$'\U1F3D7' | |
| 3037 | +emoji[brick]=$'\U1F9F1' | |
| 3038 | +emoji[bricks]=$'\U1F9F1' | |
| 3039 | +emoji[houses]=$'\U1F3D8\UFE0F' | |
| 3040 | +emoji[houses_unqualified]=$'\U1F3D8' | |
| 3041 | +emoji[derelict_house]=$'\U1F3DA\UFE0F' | |
| 3042 | +emoji[derelict_house_unqualified]=$'\U1F3DA' | |
| 3043 | +emoji[derelict_house_unqualified_1]=$'\U1F3E0' | |
| 3044 | +emoji[house]=$'\U1F3E0' | |
| 3045 | +emoji[house_with_garden]=$'\U1F3E1' | |
| 3046 | +emoji[office_building]=$'\U1F3E2' | |
| 3047 | +emoji[office]=$'\U1F3E2' | |
| 3048 | +emoji[Japanese_post_office]=$'\U1F3E3' | |
| 3049 | +emoji[post_office]=$'\U1F3E3' | |
| 3050 | +emoji[Japanese_post_office_1]=$'\U1F3E4' | |
| 3051 | +emoji[european_post_office]=$'\U1F3E4' | |
| 3052 | +emoji[hospital]=$'\U1F3E5' | |
| 3053 | +emoji[bank]=$'\U1F3E6' | |
| 3054 | +emoji[hotel]=$'\U1F3E8' | |
| 3055 | +emoji[love_hotel]=$'\U1F3E9' | |
| 3056 | +emoji[convenience_store]=$'\U1F3EA' | |
| 3057 | +emoji[school]=$'\U1F3EB' | |
| 3058 | +emoji[department_store]=$'\U1F3EC' | |
| 3059 | +emoji[factory]=$'\U1F3ED' | |
| 3060 | +emoji[Japanese_castle]=$'\U1F3EF' | |
| 3061 | +emoji[japanese_castle]=$'\U1F3EF' | |
| 3062 | +emoji[Japanese_castle_1]=$'\U1F3F0' | |
| 3063 | +emoji[european_castle]=$'\U1F3F0' | |
| 3064 | +emoji[wedding]=$'\U1F492' | |
| 3065 | +emoji[Tokyo_tower]=$'\U1F5FC' | |
| 3066 | +emoji[tokyo_tower]=$'\U1F5FC' | |
| 3067 | +emoji[Statue_of_Liberty]=$'\U1F5FD' | |
| 3068 | +emoji[statue_of_liberty]=$'\U1F5FD' | |
| 3069 | +emoji[church]=$'\U26EA' | |
| 3070 | +emoji[mosque]=$'\U1F54C' | |
| 3071 | +emoji[hindu_temple]=$'\U1F6D5' | |
| 3072 | +emoji[synagogue]=$'\U1F54D' | |
| 3073 | +emoji[shinto_shrine]=$'\U26E9\UFE0F' | |
| 3074 | +emoji[shinto_shrine_unqualified]=$'\U26E9' | |
| 3075 | +emoji[kaaba]=$'\U1F54B' | |
| 3076 | +emoji[fountain]=$'\U26F2' | |
| 3077 | +emoji[tent]=$'\U26FA' | |
| 3078 | +emoji[foggy]=$'\U1F301' | |
| 3079 | +emoji[night_with_stars]=$'\U1F303' | |
| 3080 | +emoji[cityscape]=$'\U1F3D9\UFE0F' | |
| 3081 | +emoji[cityscape_unqualified]=$'\U1F3D9' | |
| 3082 | +emoji[sunrise_over_mountains]=$'\U1F304' | |
| 3083 | +emoji[sunrise_over_mountains_1]=$'\U1F305' | |
| 3084 | +emoji[sunrise]=$'\U1F305' | |
| 3085 | +emoji[cityscape_at_dusk]=$'\U1F306' | |
| 3086 | +emoji[city_sunset]=$'\U1F306' | |
| 3087 | +emoji[sunset]=$'\U1F307' | |
| 3088 | +emoji[city_sunrise]=$'\U1F307' | |
| 3089 | +emoji[bridge_at_night]=$'\U1F309' | |
| 3090 | +emoji[hot_springs]=$'\U2668\UFE0F' | |
| 3091 | +emoji[hotsprings]=$'\U2668\UFE0F' | |
| 3092 | +emoji[hot_springs_unqualified]=$'\U2668' | |
| 3093 | +emoji[carousel_horse]=$'\U1F3A0' | |
| 3094 | +emoji[ferris_wheel]=$'\U1F3A1' | |
| 3095 | +emoji[roller_coaster]=$'\U1F3A2' | |
| 3096 | +emoji[barber_pole]=$'\U1F488' | |
| 3097 | +emoji[barber]=$'\U1F488' | |
| 3098 | +emoji[circus_tent]=$'\U1F3AA' | |
| 3099 | +emoji[locomotive]=$'\U1F682' | |
| 3100 | +emoji[steam_locomotive]=$'\U1F682' | |
| 3101 | +emoji[railway_car]=$'\U1F683' | |
| 3102 | +emoji[high_speed_train]=$'\U1F684' | |
| 3103 | +emoji[bullettrain_side]=$'\U1F684' | |
| 3104 | +emoji[bullet_train]=$'\U1F685' | |
| 3105 | +emoji[bullettrain_front]=$'\U1F685' | |
| 3106 | +emoji[bullet_train_1]=$'\U1F686' | |
| 3107 | +emoji[train2]=$'\U1F686' | |
| 3108 | +emoji[metro]=$'\U1F687' | |
| 3109 | +emoji[light_rail]=$'\U1F688' | |
| 3110 | +emoji[station]=$'\U1F689' | |
| 3111 | +emoji[tram]=$'\U1F68A' | |
| 3112 | +emoji[monorail]=$'\U1F69D' | |
| 3113 | +emoji[mountain_railway]=$'\U1F69E' | |
| 3114 | +emoji[tram_car]=$'\U1F68B' | |
| 3115 | +emoji[train]=$'\U1F68B' | |
| 3116 | +emoji[bus]=$'\U1F68C' | |
| 3117 | +emoji[oncoming_bus]=$'\U1F68D' | |
| 3118 | +emoji[trolleybus]=$'\U1F68E' | |
| 3119 | +emoji[minibus]=$'\U1F690' | |
| 3120 | +emoji[ambulance]=$'\U1F691' | |
| 3121 | +emoji[fire_engine]=$'\U1F692' | |
| 3122 | +emoji[police_car]=$'\U1F693' | |
| 3123 | +emoji[oncoming_police_car]=$'\U1F694' | |
| 3124 | +emoji[taxi]=$'\U1F695' | |
| 3125 | +emoji[oncoming_taxi]=$'\U1F696' | |
| 3126 | +emoji[automobile]=$'\U1F697' | |
| 3127 | +emoji[car]=$'\U1F697' | |
| 3128 | +emoji[red_car]=$'\U1F697' | |
| 3129 | +emoji[oncoming_automobile]=$'\U1F698' | |
| 3130 | +emoji[sport_utility_vehicle]=$'\U1F699' | |
| 3131 | +emoji[blue_car]=$'\U1F699' | |
| 3132 | +emoji[delivery_truck]=$'\U1F69A' | |
| 3133 | +emoji[truck]=$'\U1F69A' | |
| 3134 | +emoji[articulated_lorry]=$'\U1F69B' | |
| 3135 | +emoji[tractor]=$'\U1F69C' | |
| 3136 | +emoji[racing_car]=$'\U1F3CE\UFE0F' | |
| 3137 | +emoji[racing_car_unqualified]=$'\U1F3CE' | |
| 3138 | +emoji[motorcycle]=$'\U1F3CD\UFE0F' | |
| 3139 | +emoji[motorcycle_unqualified]=$'\U1F3CD' | |
| 3140 | +emoji[motor_scooter]=$'\U1F6F5' | |
| 3141 | +emoji[manual_wheelchair]=$'\U1F9BD' | |
| 3142 | +emoji[motorized_wheelchair]=$'\U1F9BC' | |
| 3143 | +emoji[auto_rickshaw]=$'\U1F6FA' | |
| 3144 | +emoji[bicycle]=$'\U1F6B2' | |
| 3145 | +emoji[bike]=$'\U1F6B2' | |
| 3146 | +emoji[kick_scooter]=$'\U1F6F4' | |
| 3147 | +emoji[skateboard]=$'\U1F6F9' | |
| 3148 | +emoji[bus_stop]=$'\U1F68F' | |
| 3149 | +emoji[busstop]=$'\U1F68F' | |
| 3150 | +emoji[motorway]=$'\U1F6E3\UFE0F' | |
| 3151 | +emoji[motorway_unqualified]=$'\U1F6E3' | |
| 3152 | +emoji[railway_track]=$'\U1F6E4\UFE0F' | |
| 3153 | +emoji[railway_track_unqualified]=$'\U1F6E4' | |
| 3154 | +emoji[oil_drum]=$'\U1F6E2\UFE0F' | |
| 3155 | +emoji[oil_drum_unqualified]=$'\U1F6E2' | |
| 3156 | +emoji[fuel_pump]=$'\U26FD' | |
| 3157 | +emoji[fuelpump]=$'\U26FD' | |
| 3158 | +emoji[police_car_light]=$'\U1F6A8' | |
| 3159 | +emoji[rotating_light]=$'\U1F6A8' | |
| 3160 | +emoji[horizontal_traffic_light]=$'\U1F6A5' | |
| 3161 | +emoji[traffic_light]=$'\U1F6A5' | |
| 3162 | +emoji[vertical_traffic_light]=$'\U1F6A6' | |
| 3163 | +emoji[stop_sign]=$'\U1F6D1' | |
| 3164 | +emoji[construction]=$'\U1F6A7' | |
| 3165 | +emoji[anchor]=$'\U2693' | |
| 3166 | +emoji[sailboat]=$'\U26F5' | |
| 3167 | +emoji[boat]=$'\U26F5' | |
| 3168 | +emoji[canoe]=$'\U1F6F6' | |
| 3169 | +emoji[speedboat]=$'\U1F6A4' | |
| 3170 | +emoji[passenger_ship]=$'\U1F6F3\UFE0F' | |
| 3171 | +emoji[passenger_ship_unqualified]=$'\U1F6F3' | |
| 3172 | +emoji[ferry]=$'\U26F4\UFE0F' | |
| 3173 | +emoji[ferry_unqualified]=$'\U26F4' | |
| 3174 | +emoji[motor_boat]=$'\U1F6E5\UFE0F' | |
| 3175 | +emoji[motor_boat_unqualified]=$'\U1F6E5' | |
| 3176 | +emoji[ship]=$'\U1F6A2' | |
| 3177 | +emoji[airplane]=$'\U2708\UFE0F' | |
| 3178 | +emoji[airplane_unqualified]=$'\U2708' | |
| 3179 | +emoji[small_airplane]=$'\U1F6E9\UFE0F' | |
| 3180 | +emoji[small_airplane_unqualified]=$'\U1F6E9' | |
| 3181 | +emoji[airplane_departure]=$'\U1F6EB' | |
| 3182 | +emoji[flight_departure]=$'\U1F6EB' | |
| 3183 | +emoji[airplane_arrival]=$'\U1F6EC' | |
| 3184 | +emoji[flight_arrival]=$'\U1F6EC' | |
| 3185 | +emoji[parachute]=$'\U1FA82' | |
| 3186 | +emoji[seat]=$'\U1F4BA' | |
| 3187 | +emoji[helicopter]=$'\U1F681' | |
| 3188 | +emoji[suspension_railway]=$'\U1F69F' | |
| 3189 | +emoji[mountain_cableway]=$'\U1F6A0' | |
| 3190 | +emoji[aerial_tramway]=$'\U1F6A1' | |
| 3191 | +emoji[satellite]=$'\U1F6F0\UFE0F' | |
| 3192 | +emoji[satellite_unqualified]=$'\U1F6F0' | |
| 3193 | +emoji[artificial_satellite]=$'\U1F6F0' | |
| 3194 | +emoji[rocket]=$'\U1F680' | |
| 3195 | +emoji[flying_saucer]=$'\U1F6F8' | |
| 3196 | +emoji[bellhop_bell]=$'\U1F6CE\UFE0F' | |
| 3197 | +emoji[bellhop_bell_unqualified]=$'\U1F6CE' | |
| 3198 | +emoji[luggage]=$'\U1F9F3' | |
| 3199 | +emoji[hourglass_done]=$'\U231B' | |
| 3200 | +emoji[hourglass]=$'\U231B' | |
| 3201 | +emoji[hourglass_not_done]=$'\U23F3' | |
| 3202 | +emoji[hourglass_flowing_sand]=$'\U23F3' | |
| 3203 | +emoji[watch]=$'\U231A' | |
| 3204 | +emoji[alarm_clock]=$'\U23F0' | |
| 3205 | +emoji[stopwatch]=$'\U23F1\UFE0F' | |
| 3206 | +emoji[stopwatch_unqualified]=$'\U23F1' | |
| 3207 | +emoji[timer_clock]=$'\U23F2\UFE0F' | |
| 3208 | +emoji[timer_clock_unqualified]=$'\U23F2' | |
| 3209 | +emoji[mantelpiece_clock]=$'\U1F570\UFE0F' | |
| 3210 | +emoji[mantelpiece_clock_unqualified]=$'\U1F570' | |
| 3211 | +emoji[twelve_o_clock]=$'\U1F55B' | |
| 3212 | +emoji[clock12]=$'\U1F55B' | |
| 3213 | +emoji[twelve_thirty]=$'\U1F567' | |
| 3214 | +emoji[clock1230]=$'\U1F567' | |
| 3215 | +emoji[one_o_clock]=$'\U1F550' | |
| 3216 | +emoji[clock1]=$'\U1F550' | |
| 3217 | +emoji[one_thirty]=$'\U1F55C' | |
| 3218 | +emoji[clock130]=$'\U1F55C' | |
| 3219 | +emoji[two_o_clock]=$'\U1F551' | |
| 3220 | +emoji[clock2]=$'\U1F551' | |
| 3221 | +emoji[two_thirty]=$'\U1F55D' | |
| 3222 | +emoji[clock230]=$'\U1F55D' | |
| 3223 | +emoji[three_o_clock]=$'\U1F552' | |
| 3224 | +emoji[clock3]=$'\U1F552' | |
| 3225 | +emoji[three_thirty]=$'\U1F55E' | |
| 3226 | +emoji[clock330]=$'\U1F55E' | |
| 3227 | +emoji[four_o_clock]=$'\U1F553' | |
| 3228 | +emoji[clock4]=$'\U1F553' | |
| 3229 | +emoji[four_thirty]=$'\U1F55F' | |
| 3230 | +emoji[clock430]=$'\U1F55F' | |
| 3231 | +emoji[five_o_clock]=$'\U1F554' | |
| 3232 | +emoji[clock5]=$'\U1F554' | |
| 3233 | +emoji[five_thirty]=$'\U1F560' | |
| 3234 | +emoji[clock530]=$'\U1F560' | |
| 3235 | +emoji[six_o_clock]=$'\U1F555' | |
| 3236 | +emoji[clock6]=$'\U1F555' | |
| 3237 | +emoji[six_thirty]=$'\U1F561' | |
| 3238 | +emoji[clock630]=$'\U1F561' | |
| 3239 | +emoji[seven_o_clock]=$'\U1F556' | |
| 3240 | +emoji[clock7]=$'\U1F556' | |
| 3241 | +emoji[seven_thirty]=$'\U1F562' | |
| 3242 | +emoji[clock730]=$'\U1F562' | |
| 3243 | +emoji[eight_o_clock]=$'\U1F557' | |
| 3244 | +emoji[clock8]=$'\U1F557' | |
| 3245 | +emoji[eight_thirty]=$'\U1F563' | |
| 3246 | +emoji[clock830]=$'\U1F563' | |
| 3247 | +emoji[nine_o_clock]=$'\U1F558' | |
| 3248 | +emoji[clock9]=$'\U1F558' | |
| 3249 | +emoji[nine_thirty]=$'\U1F564' | |
| 3250 | +emoji[clock930]=$'\U1F564' | |
| 3251 | +emoji[ten_o_clock]=$'\U1F559' | |
| 3252 | +emoji[clock10]=$'\U1F559' | |
| 3253 | +emoji[ten_thirty]=$'\U1F565' | |
| 3254 | +emoji[clock1030]=$'\U1F565' | |
| 3255 | +emoji[eleven_o_clock]=$'\U1F55A' | |
| 3256 | +emoji[clock11]=$'\U1F55A' | |
| 3257 | +emoji[eleven_thirty]=$'\U1F566' | |
| 3258 | +emoji[clock1130]=$'\U1F566' | |
| 3259 | +emoji[new_moon]=$'\U1F311' | |
| 3260 | +emoji[waxing_crescent_moon]=$'\U1F312' | |
| 3261 | +emoji[first_quarter_moon]=$'\U1F313' | |
| 3262 | +emoji[waxing_gibbous_moon]=$'\U1F314' | |
| 3263 | +emoji[moon]=$'\U1F314' | |
| 3264 | +emoji[full_moon]=$'\U1F315' | |
| 3265 | +emoji[waning_gibbous_moon]=$'\U1F316' | |
| 3266 | +emoji[last_quarter_moon]=$'\U1F317' | |
| 3267 | +emoji[waning_crescent_moon]=$'\U1F318' | |
| 3268 | +emoji[waning_crescent_moon_1]=$'\U1F319' | |
| 3269 | +emoji[crescent_moon]=$'\U1F319' | |
| 3270 | +emoji[new_moon_face]=$'\U1F31A' | |
| 3271 | +emoji[new_moon_with_face]=$'\U1F31A' | |
| 3272 | +emoji[first_quarter_moon_face]=$'\U1F31B' | |
| 3273 | +emoji[first_quarter_moon_with_face]=$'\U1F31B' | |
| 3274 | +emoji[last_quarter_moon_face]=$'\U1F31C' | |
| 3275 | +emoji[last_quarter_moon_with_face]=$'\U1F31C' | |
| 3276 | +emoji[thermometer]=$'\U1F321\UFE0F' | |
| 3277 | +emoji[thermometer_unqualified]=$'\U1F321' | |
| 3278 | +emoji[sun]=$'\U2600\UFE0F' | |
| 3279 | +emoji[sunny]=$'\U2600\UFE0F' | |
| 3280 | +emoji[sun_unqualified]=$'\U2600' | |
| 3281 | +emoji[full_moon_face]=$'\U1F31D' | |
| 3282 | +emoji[full_moon_with_face]=$'\U1F31D' | |
| 3283 | +emoji[sun_with_face]=$'\U1F31E' | |
| 3284 | +emoji[ringed_planet]=$'\U1FA90' | |
| 3285 | +emoji[star]=$'\U2B50' | |
| 3286 | +emoji[glowing_star]=$'\U1F31F' | |
| 3287 | +emoji[star2]=$'\U1F31F' | |
| 3288 | +emoji[shooting_star]=$'\U1F320' | |
| 3289 | +emoji[stars]=$'\U1F320' | |
| 3290 | +emoji[milky_way]=$'\U1F30C' | |
| 3291 | +emoji[cloud]=$'\U2601\UFE0F' | |
| 3292 | +emoji[cloud_unqualified]=$'\U2601' | |
| 3293 | +emoji[sun_behind_cloud]=$'\U26C5' | |
| 3294 | +emoji[partly_sunny]=$'\U26C5' | |
| 3295 | +emoji[cloud_with_lightning_and_rain]=$'\U26C8\UFE0F' | |
| 3296 | +emoji[cloud_with_lightning_and_rain_unqualified]=$'\U26C8' | |
| 3297 | +emoji[sun_behind_small_cloud]=$'\U1F324\UFE0F' | |
| 3298 | +emoji[sun_behind_small_cloud_unqualified]=$'\U1F324' | |
| 3299 | +emoji[sun_behind_large_cloud]=$'\U1F325\UFE0F' | |
| 3300 | +emoji[sun_behind_large_cloud_unqualified]=$'\U1F325' | |
| 3301 | +emoji[sun_behind_rain_cloud]=$'\U1F326\UFE0F' | |
| 3302 | +emoji[sun_behind_rain_cloud_unqualified]=$'\U1F326' | |
| 3303 | +emoji[cloud_with_rain]=$'\U1F327\UFE0F' | |
| 3304 | +emoji[cloud_with_rain_unqualified]=$'\U1F327' | |
| 3305 | +emoji[cloud_with_snow]=$'\U1F328\UFE0F' | |
| 3306 | +emoji[cloud_with_snow_unqualified]=$'\U1F328' | |
| 3307 | +emoji[cloud_with_lightning]=$'\U1F329\UFE0F' | |
| 3308 | +emoji[cloud_with_lightning_unqualified]=$'\U1F329' | |
| 3309 | +emoji[tornado]=$'\U1F32A\UFE0F' | |
| 3310 | +emoji[tornado_unqualified]=$'\U1F32A' | |
| 3311 | +emoji[fog]=$'\U1F32B\UFE0F' | |
| 3312 | +emoji[fog_unqualified]=$'\U1F32B' | |
| 3313 | +emoji[wind_face]=$'\U1F32C\UFE0F' | |
| 3314 | +emoji[wind_face_unqualified]=$'\U1F32C' | |
| 3315 | +emoji[cyclone]=$'\U1F300' | |
| 3316 | +emoji[rainbow]=$'\U1F308' | |
| 3317 | +emoji[closed_umbrella]=$'\U1F302' | |
| 3318 | +emoji[closed_umbrella_1]=$'\U2602\UFE0F' | |
| 3319 | +emoji[open_umbrella]=$'\U2602\UFE0F' | |
| 3320 | +emoji[umbrella_unqualified]=$'\U2602' | |
| 3321 | +emoji[umbrella_with_rain_drops]=$'\U2614' | |
| 3322 | +emoji[umbrella]=$'\U2614' | |
| 3323 | +emoji[umbrella_on_ground]=$'\U26F1\UFE0F' | |
| 3324 | +emoji[umbrella_on_ground_unqualified]=$'\U26F1' | |
| 3325 | +emoji[parasol_on_ground]=$'\U26F1' | |
| 3326 | +emoji[high_voltage]=$'\U26A1' | |
| 3327 | +emoji[zap]=$'\U26A1' | |
| 3328 | +emoji[snowflake]=$'\U2744\UFE0F' | |
| 3329 | +emoji[snowflake_unqualified]=$'\U2744' | |
| 3330 | +emoji[snowman]=$'\U2603\UFE0F' | |
| 3331 | +emoji[snowman_with_snow]=$'\U2603\UFE0F' | |
| 3332 | +emoji[snowman_unqualified]=$'\U2603' | |
| 3333 | +emoji[snowman_without_snow]=$'\U26C4' | |
| 3334 | +emoji[comet]=$'\U2604\UFE0F' | |
| 3335 | +emoji[comet_unqualified]=$'\U2604' | |
| 3336 | +emoji[fire]=$'\U1F525' | |
| 3337 | +emoji[droplet]=$'\U1F4A7' | |
| 3338 | +emoji[water_wave]=$'\U1F30A' | |
| 3339 | +emoji[ocean]=$'\U1F30A' | |
| 3340 | +emoji[jack_o_lantern]=$'\U1F383' | |
| 3341 | +emoji[Christmas_tree]=$'\U1F384' | |
| 3342 | +emoji[christmas_tree]=$'\U1F384' | |
| 3343 | +emoji[fireworks]=$'\U1F386' | |
| 3344 | +emoji[sparkler]=$'\U1F387' | |
| 3345 | +emoji[firecracker]=$'\U1F9E8' | |
| 3346 | +emoji[sparkles]=$'\U2728' | |
| 3347 | +emoji[balloon]=$'\U1F388' | |
| 3348 | +emoji[party_popper]=$'\U1F389' | |
| 3349 | +emoji[tada]=$'\U1F389' | |
| 3350 | +emoji[confetti_ball]=$'\U1F38A' | |
| 3351 | +emoji[tanabata_tree]=$'\U1F38B' | |
| 3352 | +emoji[pine_decoration]=$'\U1F38D' | |
| 3353 | +emoji[bamboo]=$'\U1F38D' | |
| 3354 | +emoji[Japanese_dolls]=$'\U1F38E' | |
| 3355 | +emoji[dolls]=$'\U1F38E' | |
| 3356 | +emoji[carp_streamer]=$'\U1F38F' | |
| 3357 | +emoji[flags]=$'\U1F38F' | |
| 3358 | +emoji[wind_chime]=$'\U1F390' | |
| 3359 | +emoji[moon_viewing_ceremony]=$'\U1F391' | |
| 3360 | +emoji[rice_scene]=$'\U1F391' | |
| 3361 | +emoji[red_envelope]=$'\U1F9E7' | |
| 3362 | +emoji[ribbon]=$'\U1F380' | |
| 3363 | +emoji[wrapped_gift]=$'\U1F381' | |
| 3364 | +emoji[gift]=$'\U1F381' | |
| 3365 | +emoji[reminder_ribbon]=$'\U1F397\UFE0F' | |
| 3366 | +emoji[reminder_ribbon_unqualified]=$'\U1F397' | |
| 3367 | +emoji[admission_tickets]=$'\U1F39F\UFE0F' | |
| 3368 | +emoji[admission_tickets_unqualified]=$'\U1F39F' | |
| 3369 | +emoji[tickets]=$'\U1F39F' | |
| 3370 | +emoji[admission_tickets_unqualified_1]=$'\U1F3AB' | |
| 3371 | +emoji[ticket]=$'\U1F3AB' | |
| 3372 | +emoji[military_medal]=$'\U1F396\UFE0F' | |
| 3373 | +emoji[military_medal_unqualified]=$'\U1F396' | |
| 3374 | +emoji[medal_military]=$'\U1F396' | |
| 3375 | +emoji[trophy]=$'\U1F3C6' | |
| 3376 | +emoji[sports_medal]=$'\U1F3C5' | |
| 3377 | +emoji[medal_sports]=$'\U1F3C5' | |
| 3378 | +emoji[1st_place_medal]=$'\U1F947' | |
| 3379 | +emoji[2nd_place_medal]=$'\U1F948' | |
| 3380 | +emoji[3rd_place_medal]=$'\U1F949' | |
| 3381 | +emoji[soccer_ball]=$'\U26BD' | |
| 3382 | +emoji[soccer]=$'\U26BD' | |
| 3383 | +emoji[baseball]=$'\U26BE' | |
| 3384 | +emoji[softball]=$'\U1F94E' | |
| 3385 | +emoji[basketball]=$'\U1F3C0' | |
| 3386 | +emoji[volleyball]=$'\U1F3D0' | |
| 3387 | +emoji[american_football]=$'\U1F3C8' | |
| 3388 | +emoji[football]=$'\U1F3C8' | |
| 3389 | +emoji[rugby_football]=$'\U1F3C9' | |
| 3390 | +emoji[tennis]=$'\U1F3BE' | |
| 3391 | +emoji[flying_disc]=$'\U1F94F' | |
| 3392 | +emoji[bowling]=$'\U1F3B3' | |
| 3393 | +emoji[cricket_game]=$'\U1F3CF' | |
| 3394 | +emoji[field_hockey]=$'\U1F3D1' | |
| 3395 | +emoji[ice_hockey]=$'\U1F3D2' | |
| 3396 | +emoji[lacrosse]=$'\U1F94D' | |
| 3397 | +emoji[ping_pong]=$'\U1F3D3' | |
| 3398 | +emoji[badminton]=$'\U1F3F8' | |
| 3399 | +emoji[boxing_glove]=$'\U1F94A' | |
| 3400 | +emoji[martial_arts_uniform]=$'\U1F94B' | |
| 3401 | +emoji[goal_net]=$'\U1F945' | |
| 3402 | +emoji[flag_in_hole]=$'\U26F3' | |
| 3403 | +emoji[golf]=$'\U26F3' | |
| 3404 | +emoji[ice_skate]=$'\U26F8\UFE0F' | |
| 3405 | +emoji[ice_skate_unqualified]=$'\U26F8' | |
| 3406 | +emoji[fishing_pole]=$'\U1F3A3' | |
| 3407 | +emoji[fishing_pole_and_fish]=$'\U1F3A3' | |
| 3408 | +emoji[diving_mask]=$'\U1F93F' | |
| 3409 | +emoji[running_shirt]=$'\U1F3BD' | |
| 3410 | +emoji[running_shirt_with_sash]=$'\U1F3BD' | |
| 3411 | +emoji[skis]=$'\U1F3BF' | |
| 3412 | +emoji[ski]=$'\U1F3BF' | |
| 3413 | +emoji[sled]=$'\U1F6F7' | |
| 3414 | +emoji[curling_stone]=$'\U1F94C' | |
| 3415 | +emoji[direct_hit]=$'\U1F3AF' | |
| 3416 | +emoji[dart]=$'\U1F3AF' | |
| 3417 | +emoji[yo_yo]=$'\U1FA80' | |
| 3418 | +emoji[kite]=$'\U1FA81' | |
| 3419 | +emoji[pool_8_ball]=$'\U1F3B1' | |
| 3420 | +emoji[8ball]=$'\U1F3B1' | |
| 3421 | +emoji[crystal_ball]=$'\U1F52E' | |
| 3422 | +emoji[nazar_amulet]=$'\U1F9FF' | |
| 3423 | +emoji[video_game]=$'\U1F3AE' | |
| 3424 | +emoji[joystick]=$'\U1F579\UFE0F' | |
| 3425 | +emoji[joystick_unqualified]=$'\U1F579' | |
| 3426 | +emoji[slot_machine]=$'\U1F3B0' | |
| 3427 | +emoji[game_die]=$'\U1F3B2' | |
| 3428 | +emoji[puzzle_piece]=$'\U1F9E9' | |
| 3429 | +emoji[jigsaw]=$'\U1F9E9' | |
| 3430 | +emoji[teddy_bear]=$'\U1F9F8' | |
| 3431 | +emoji[spade_suit]=$'\U2660\UFE0F' | |
| 3432 | +emoji[spades]=$'\U2660\UFE0F' | |
| 3433 | +emoji[spade_suit_unqualified]=$'\U2660' | |
| 3434 | +emoji[heart_suit]=$'\U2665\UFE0F' | |
| 3435 | +emoji[hearts]=$'\U2665\UFE0F' | |
| 3436 | +emoji[heart_suit_unqualified]=$'\U2665' | |
| 3437 | +emoji[diamond_suit]=$'\U2666\UFE0F' | |
| 3438 | +emoji[diamonds]=$'\U2666\UFE0F' | |
| 3439 | +emoji[diamond_suit_unqualified]=$'\U2666' | |
| 3440 | +emoji[club_suit]=$'\U2663\UFE0F' | |
| 3441 | +emoji[clubs]=$'\U2663\UFE0F' | |
| 3442 | +emoji[club_suit_unqualified]=$'\U2663' | |
| 3443 | +emoji[chess_pawn]=$'\U265F\UFE0F' | |
| 3444 | +emoji[chess_pawn_unqualified]=$'\U265F' | |
| 3445 | +emoji[joker]=$'\U1F0CF' | |
| 3446 | +emoji[black_joker]=$'\U1F0CF' | |
| 3447 | +emoji[mahjong_red_dragon]=$'\U1F004' | |
| 3448 | +emoji[mahjong]=$'\U1F004' | |
| 3449 | +emoji[flower_playing_cards]=$'\U1F3B4' | |
| 3450 | +emoji[performing_arts]=$'\U1F3AD' | |
| 3451 | +emoji[framed_picture]=$'\U1F5BC\UFE0F' | |
| 3452 | +emoji[framed_picture_unqualified]=$'\U1F5BC' | |
| 3453 | +emoji[artist_palette]=$'\U1F3A8' | |
| 3454 | +emoji[art]=$'\U1F3A8' | |
| 3455 | +emoji[thread]=$'\U1F9F5' | |
| 3456 | +emoji[yarn]=$'\U1F9F6' | |
| 3457 | +emoji[glasses]=$'\U1F453' | |
| 3458 | +emoji[eyeglasses]=$'\U1F453' | |
| 3459 | +emoji[sunglasses]=$'\U1F576\UFE0F' | |
| 3460 | +emoji[sunglasses_unqualified]=$'\U1F576' | |
| 3461 | +emoji[dark_sunglasses]=$'\U1F576' | |
| 3462 | +emoji[goggles]=$'\U1F97D' | |
| 3463 | +emoji[lab_coat]=$'\U1F97C' | |
| 3464 | +emoji[safety_vest]=$'\U1F9BA' | |
| 3465 | +emoji[necktie]=$'\U1F454' | |
| 3466 | +emoji[t_shirt]=$'\U1F455' | |
| 3467 | +emoji[shirt]=$'\U1F455' | |
| 3468 | +emoji[tshirt]=$'\U1F455' | |
| 3469 | +emoji[jeans]=$'\U1F456' | |
| 3470 | +emoji[scarf]=$'\U1F9E3' | |
| 3471 | +emoji[gloves]=$'\U1F9E4' | |
| 3472 | +emoji[coat]=$'\U1F9E5' | |
| 3473 | +emoji[socks]=$'\U1F9E6' | |
| 3474 | +emoji[dress]=$'\U1F457' | |
| 3475 | +emoji[kimono]=$'\U1F458' | |
| 3476 | +emoji[sari]=$'\U1F97B' | |
| 3477 | +emoji[one_piece_swimsuit]=$'\U1FA71' | |
| 3478 | +emoji[swim_brief]=$'\U1FA72' | |
| 3479 | +emoji[shorts]=$'\U1FA73' | |
| 3480 | +emoji[bikini]=$'\U1F459' | |
| 3481 | +emoji[woman_s_clothes]=$'\U1F45A' | |
| 3482 | +emoji[womans_clothes]=$'\U1F45A' | |
| 3483 | +emoji[purse]=$'\U1F45B' | |
| 3484 | +emoji[handbag]=$'\U1F45C' | |
| 3485 | +emoji[clutch_bag]=$'\U1F45D' | |
| 3486 | +emoji[pouch]=$'\U1F45D' | |
| 3487 | +emoji[shopping_bags]=$'\U1F6CD\UFE0F' | |
| 3488 | +emoji[shopping_bags_unqualified]=$'\U1F6CD' | |
| 3489 | +emoji[shopping]=$'\U1F6CD' | |
| 3490 | +emoji[backpack]=$'\U1F392' | |
| 3491 | +emoji[school_satchel]=$'\U1F392' | |
| 3492 | +emoji[man_s_shoe]=$'\U1F45E' | |
| 3493 | +emoji[mans_shoe]=$'\U1F45E' | |
| 3494 | +emoji[shoe]=$'\U1F45E' | |
| 3495 | +emoji[running_shoe]=$'\U1F45F' | |
| 3496 | +emoji[athletic_shoe]=$'\U1F45F' | |
| 3497 | +emoji[hiking_boot]=$'\U1F97E' | |
| 3498 | +emoji[flat_shoe]=$'\U1F97F' | |
| 3499 | +emoji[high_heeled_shoe]=$'\U1F460' | |
| 3500 | +emoji[high_heel]=$'\U1F460' | |
| 3501 | +emoji[woman_s_sandal]=$'\U1F461' | |
| 3502 | +emoji[sandal]=$'\U1F461' | |
| 3503 | +emoji[ballet_shoes]=$'\U1FA70' | |
| 3504 | +emoji[woman_s_boot]=$'\U1F462' | |
| 3505 | +emoji[boot]=$'\U1F462' | |
| 3506 | +emoji[crown]=$'\U1F451' | |
| 3507 | +emoji[woman_s_hat]=$'\U1F452' | |
| 3508 | +emoji[womans_hat]=$'\U1F452' | |
| 3509 | +emoji[top_hat]=$'\U1F3A9' | |
| 3510 | +emoji[tophat]=$'\U1F3A9' | |
| 3511 | +emoji[graduation_cap]=$'\U1F393' | |
| 3512 | +emoji[mortar_board]=$'\U1F393' | |
| 3513 | +emoji[billed_cap]=$'\U1F9E2' | |
| 3514 | +emoji[rescue_worker_s_helmet]=$'\U26D1\UFE0F' | |
| 3515 | +emoji[rescue_worker_s_helmet_unqualified]=$'\U26D1' | |
| 3516 | +emoji[rescue_worker_helmet]=$'\U26D1' | |
| 3517 | +emoji[prayer_beads]=$'\U1F4FF' | |
| 3518 | +emoji[lipstick]=$'\U1F484' | |
| 3519 | +emoji[ring]=$'\U1F48D' | |
| 3520 | +emoji[gem_stone]=$'\U1F48E' | |
| 3521 | +emoji[gem]=$'\U1F48E' | |
| 3522 | +emoji[muted_speaker]=$'\U1F507' | |
| 3523 | +emoji[mute]=$'\U1F507' | |
| 3524 | +emoji[speaker_low_volume]=$'\U1F508' | |
| 3525 | +emoji[speaker]=$'\U1F508' | |
| 3526 | +emoji[speaker_medium_volume]=$'\U1F509' | |
| 3527 | +emoji[sound]=$'\U1F509' | |
| 3528 | +emoji[speaker_high_volume]=$'\U1F50A' | |
| 3529 | +emoji[loud_sound]=$'\U1F50A' | |
| 3530 | +emoji[loudspeaker]=$'\U1F4E2' | |
| 3531 | +emoji[megaphone]=$'\U1F4E3' | |
| 3532 | +emoji[mega]=$'\U1F4E3' | |
| 3533 | +emoji[postal_horn]=$'\U1F4EF' | |
| 3534 | +emoji[bell]=$'\U1F514' | |
| 3535 | +emoji[bell_with_slash]=$'\U1F515' | |
| 3536 | +emoji[no_bell]=$'\U1F515' | |
| 3537 | +emoji[musical_score]=$'\U1F3BC' | |
| 3538 | +emoji[musical_note]=$'\U1F3B5' | |
| 3539 | +emoji[musical_notes]=$'\U1F3B6' | |
| 3540 | +emoji[notes]=$'\U1F3B6' | |
| 3541 | +emoji[studio_microphone]=$'\U1F399\UFE0F' | |
| 3542 | +emoji[studio_microphone_unqualified]=$'\U1F399' | |
| 3543 | +emoji[level_slider]=$'\U1F39A\UFE0F' | |
| 3544 | +emoji[level_slider_unqualified]=$'\U1F39A' | |
| 3545 | +emoji[control_knobs]=$'\U1F39B\UFE0F' | |
| 3546 | +emoji[control_knobs_unqualified]=$'\U1F39B' | |
| 3547 | +emoji[microphone]=$'\U1F3A4' | |
| 3548 | +emoji[headphone]=$'\U1F3A7' | |
| 3549 | +emoji[headphones]=$'\U1F3A7' | |
| 3550 | +emoji[radio]=$'\U1F4FB' | |
| 3551 | +emoji[saxophone]=$'\U1F3B7' | |
| 3552 | +emoji[guitar]=$'\U1F3B8' | |
| 3553 | +emoji[musical_keyboard]=$'\U1F3B9' | |
| 3554 | +emoji[trumpet]=$'\U1F3BA' | |
| 3555 | +emoji[violin]=$'\U1F3BB' | |
| 3556 | +emoji[banjo]=$'\U1FA95' | |
| 3557 | +emoji[drum]=$'\U1F941' | |
| 3558 | +emoji[mobile_phone]=$'\U1F4F1' | |
| 3559 | +emoji[iphone]=$'\U1F4F1' | |
| 3560 | +emoji[mobile_phone_with_arrow]=$'\U1F4F2' | |
| 3561 | +emoji[calling]=$'\U1F4F2' | |
| 3562 | +emoji[telephone]=$'\U260E\UFE0F' | |
| 3563 | +emoji[phone]=$'\U260E\UFE0F' | |
| 3564 | +emoji[telephone_unqualified]=$'\U260E' | |
| 3565 | +emoji[telephone_receiver]=$'\U1F4DE' | |
| 3566 | +emoji[pager]=$'\U1F4DF' | |
| 3567 | +emoji[fax_machine]=$'\U1F4E0' | |
| 3568 | +emoji[fax]=$'\U1F4E0' | |
| 3569 | +emoji[battery]=$'\U1F50B' | |
| 3570 | +emoji[electric_plug]=$'\U1F50C' | |
| 3571 | +emoji[laptop_computer]=$'\U1F4BB' | |
| 3572 | +emoji[computer]=$'\U1F4BB' | |
| 3573 | +emoji[desktop_computer]=$'\U1F5A5\UFE0F' | |
| 3574 | +emoji[desktop_computer_unqualified]=$'\U1F5A5' | |
| 3575 | +emoji[printer]=$'\U1F5A8\UFE0F' | |
| 3576 | +emoji[printer_unqualified]=$'\U1F5A8' | |
| 3577 | +emoji[keyboard]=$'\U2328\UFE0F' | |
| 3578 | +emoji[keyboard_unqualified]=$'\U2328' | |
| 3579 | +emoji[computer_mouse]=$'\U1F5B1\UFE0F' | |
| 3580 | +emoji[computer_mouse_unqualified]=$'\U1F5B1' | |
| 3581 | +emoji[trackball]=$'\U1F5B2\UFE0F' | |
| 3582 | +emoji[trackball_unqualified]=$'\U1F5B2' | |
| 3583 | +emoji[computer_disk]=$'\U1F4BD' | |
| 3584 | +emoji[minidisc]=$'\U1F4BD' | |
| 3585 | +emoji[floppy_disk]=$'\U1F4BE' | |
| 3586 | +emoji[optical_disk]=$'\U1F4BF' | |
| 3587 | +emoji[cd]=$'\U1F4BF' | |
| 3588 | +emoji[dvd]=$'\U1F4C0' | |
| 3589 | +emoji[abacus]=$'\U1F9EE' | |
| 3590 | +emoji[movie_camera]=$'\U1F3A5' | |
| 3591 | +emoji[film_frames]=$'\U1F39E\UFE0F' | |
| 3592 | +emoji[film_frames_unqualified]=$'\U1F39E' | |
| 3593 | +emoji[film_strip]=$'\U1F39E' | |
| 3594 | +emoji[film_projector]=$'\U1F4FD\UFE0F' | |
| 3595 | +emoji[film_projector_unqualified]=$'\U1F4FD' | |
| 3596 | +emoji[clapper_board]=$'\U1F3AC' | |
| 3597 | +emoji[clapper]=$'\U1F3AC' | |
| 3598 | +emoji[television]=$'\U1F4FA' | |
| 3599 | +emoji[tv]=$'\U1F4FA' | |
| 3600 | +emoji[camera]=$'\U1F4F7' | |
| 3601 | +emoji[camera_with_flash]=$'\U1F4F8' | |
| 3602 | +emoji[camera_flash]=$'\U1F4F8' | |
| 3603 | +emoji[video_camera]=$'\U1F4F9' | |
| 3604 | +emoji[videocassette]=$'\U1F4FC' | |
| 3605 | +emoji[vhs]=$'\U1F4FC' | |
| 3606 | +emoji[magnifying_glass_tilted_left]=$'\U1F50D' | |
| 3607 | +emoji[mag]=$'\U1F50D' | |
| 3608 | +emoji[magnifying_glass_tilted_right]=$'\U1F50E' | |
| 3609 | +emoji[mag_right]=$'\U1F50E' | |
| 3610 | +emoji[candle]=$'\U1F56F\UFE0F' | |
| 3611 | +emoji[candle_unqualified]=$'\U1F56F' | |
| 3612 | +emoji[light_bulb]=$'\U1F4A1' | |
| 3613 | +emoji[bulb]=$'\U1F4A1' | |
| 3614 | +emoji[flashlight]=$'\U1F526' | |
| 3615 | +emoji[red_paper_lantern]=$'\U1F3EE' | |
| 3616 | +emoji[izakaya_lantern]=$'\U1F3EE' | |
| 3617 | +emoji[lantern]=$'\U1F3EE' | |
| 3618 | +emoji[diya_lamp]=$'\U1FA94' | |
| 3619 | +emoji[notebook_with_decorative_cover]=$'\U1F4D4' | |
| 3620 | +emoji[closed_book]=$'\U1F4D5' | |
| 3621 | +emoji[open_book]=$'\U1F4D6' | |
| 3622 | +emoji[book]=$'\U1F4D6' | |
| 3623 | +emoji[green_book]=$'\U1F4D7' | |
| 3624 | +emoji[blue_book]=$'\U1F4D8' | |
| 3625 | +emoji[orange_book]=$'\U1F4D9' | |
| 3626 | +emoji[books]=$'\U1F4DA' | |
| 3627 | +emoji[notebook]=$'\U1F4D3' | |
| 3628 | +emoji[ledger]=$'\U1F4D2' | |
| 3629 | +emoji[page_with_curl]=$'\U1F4C3' | |
| 3630 | +emoji[scroll]=$'\U1F4DC' | |
| 3631 | +emoji[page_facing_up]=$'\U1F4C4' | |
| 3632 | +emoji[newspaper]=$'\U1F4F0' | |
| 3633 | +emoji[rolled_up_newspaper]=$'\U1F5DE\UFE0F' | |
| 3634 | +emoji[rolled_up_newspaper_unqualified]=$'\U1F5DE' | |
| 3635 | +emoji[newspaper_roll]=$'\U1F5DE' | |
| 3636 | +emoji[bookmark_tabs]=$'\U1F4D1' | |
| 3637 | +emoji[bookmark_tabs_1]=$'\U1F516' | |
| 3638 | +emoji[bookmark]=$'\U1F516' | |
| 3639 | +emoji[label]=$'\U1F3F7\UFE0F' | |
| 3640 | +emoji[label_unqualified]=$'\U1F3F7' | |
| 3641 | +emoji[money_bag]=$'\U1F4B0' | |
| 3642 | +emoji[moneybag]=$'\U1F4B0' | |
| 3643 | +emoji[yen_banknote]=$'\U1F4B4' | |
| 3644 | +emoji[yen]=$'\U1F4B4' | |
| 3645 | +emoji[dollar_banknote]=$'\U1F4B5' | |
| 3646 | +emoji[dollar]=$'\U1F4B5' | |
| 3647 | +emoji[euro_banknote]=$'\U1F4B6' | |
| 3648 | +emoji[euro]=$'\U1F4B6' | |
| 3649 | +emoji[pound_banknote]=$'\U1F4B7' | |
| 3650 | +emoji[pound]=$'\U1F4B7' | |
| 3651 | +emoji[money_with_wings]=$'\U1F4B8' | |
| 3652 | +emoji[credit_card]=$'\U1F4B3' | |
| 3653 | +emoji[receipt]=$'\U1F9FE' | |
| 3654 | +emoji[chart_increasing_with_yen]=$'\U1F4B9' | |
| 3655 | +emoji[chart]=$'\U1F4B9' | |
| 3656 | +emoji[currency_exchange]=$'\U1F4B1' | |
| 3657 | +emoji[heavy_dollar_sign]=$'\U1F4B2' | |
| 3658 | +emoji[envelope]=$'\U2709\UFE0F' | |
| 3659 | +emoji[email]=$'\U2709\UFE0F' | |
| 3660 | +emoji[envelope_unqualified]=$'\U2709' | |
| 3661 | +emoji[e_mail]=$'\U1F4E7' | |
| 3662 | +emoji[e-mail]=$'\U1F4E7' | |
| 3663 | +emoji[incoming_envelope]=$'\U1F4E8' | |
| 3664 | +emoji[envelope_with_arrow]=$'\U1F4E9' | |
| 3665 | +emoji[outbox_tray]=$'\U1F4E4' | |
| 3666 | +emoji[inbox_tray]=$'\U1F4E5' | |
| 3667 | +emoji[package]=$'\U1F4E6' | |
| 3668 | +emoji[closed_mailbox_with_raised_flag]=$'\U1F4EB' | |
| 3669 | +emoji[mailbox]=$'\U1F4EB' | |
| 3670 | +emoji[closed_mailbox_with_lowered_flag]=$'\U1F4EA' | |
| 3671 | +emoji[mailbox_closed]=$'\U1F4EA' | |
| 3672 | +emoji[open_mailbox_with_raised_flag]=$'\U1F4EC' | |
| 3673 | +emoji[mailbox_with_mail]=$'\U1F4EC' | |
| 3674 | +emoji[open_mailbox_with_lowered_flag]=$'\U1F4ED' | |
| 3675 | +emoji[mailbox_with_no_mail]=$'\U1F4ED' | |
| 3676 | +emoji[postbox]=$'\U1F4EE' | |
| 3677 | +emoji[ballot_box_with_ballot]=$'\U1F5F3\UFE0F' | |
| 3678 | +emoji[ballot_box_with_ballot_unqualified]=$'\U1F5F3' | |
| 3679 | +emoji[ballot_box]=$'\U1F5F3' | |
| 3680 | +emoji[pencil]=$'\U270F\UFE0F' | |
| 3681 | +emoji[pencil2]=$'\U270F\UFE0F' | |
| 3682 | +emoji[pencil_unqualified]=$'\U270F' | |
| 3683 | +emoji[black_nib]=$'\U2712\UFE0F' | |
| 3684 | +emoji[black_nib_unqualified]=$'\U2712' | |
| 3685 | +emoji[fountain_pen]=$'\U1F58B\UFE0F' | |
| 3686 | +emoji[fountain_pen_unqualified]=$'\U1F58B' | |
| 3687 | +emoji[fountain_pen_unqualified_1]=$'\U1F58A\UFE0F' | |
| 3688 | +emoji[fountain_pen_unqualified_2]=$'\U1F58A' | |
| 3689 | +emoji[pen]=$'\U1F58A' | |
| 3690 | +emoji[paintbrush]=$'\U1F58C\UFE0F' | |
| 3691 | +emoji[paintbrush_unqualified]=$'\U1F58C' | |
| 3692 | +emoji[crayon]=$'\U1F58D\UFE0F' | |
| 3693 | +emoji[crayon_unqualified]=$'\U1F58D' | |
| 3694 | +emoji[memo]=$'\U1F4DD' | |
| 3695 | +emoji[briefcase]=$'\U1F4BC' | |
| 3696 | +emoji[file_folder]=$'\U1F4C1' | |
| 3697 | +emoji[open_file_folder]=$'\U1F4C2' | |
| 3698 | +emoji[card_index_dividers]=$'\U1F5C2\UFE0F' | |
| 3699 | +emoji[card_index_dividers_unqualified]=$'\U1F5C2' | |
| 3700 | +emoji[calendar]=$'\U1F4C5' | |
| 3701 | +emoji[date]=$'\U1F4C5' | |
| 3702 | +emoji[tear_off_calendar]=$'\U1F4C6' | |
| 3703 | +emoji[spiral_notepad]=$'\U1F5D2\UFE0F' | |
| 3704 | +emoji[spiral_notepad_unqualified]=$'\U1F5D2' | |
| 3705 | +emoji[spiral_calendar]=$'\U1F5D3\UFE0F' | |
| 3706 | +emoji[spiral_calendar_unqualified]=$'\U1F5D3' | |
| 3707 | +emoji[card_index]=$'\U1F4C7' | |
| 3708 | +emoji[chart_increasing]=$'\U1F4C8' | |
| 3709 | +emoji[chart_with_upwards_trend]=$'\U1F4C8' | |
| 3710 | +emoji[chart_decreasing]=$'\U1F4C9' | |
| 3711 | +emoji[chart_with_downwards_trend]=$'\U1F4C9' | |
| 3712 | +emoji[bar_chart]=$'\U1F4CA' | |
| 3713 | +emoji[clipboard]=$'\U1F4CB' | |
| 3714 | +emoji[pushpin]=$'\U1F4CC' | |
| 3715 | +emoji[round_pushpin]=$'\U1F4CD' | |
| 3716 | +emoji[paperclip]=$'\U1F4CE' | |
| 3717 | +emoji[linked_paperclips]=$'\U1F587\UFE0F' | |
| 3718 | +emoji[linked_paperclips_unqualified]=$'\U1F587' | |
| 3719 | +emoji[paperclips]=$'\U1F587' | |
| 3720 | +emoji[straight_ruler]=$'\U1F4CF' | |
| 3721 | +emoji[triangular_ruler]=$'\U1F4D0' | |
| 3722 | +emoji[scissors]=$'\U2702\UFE0F' | |
| 3723 | +emoji[scissors_unqualified]=$'\U2702' | |
| 3724 | +emoji[card_file_box]=$'\U1F5C3\UFE0F' | |
| 3725 | +emoji[card_file_box_unqualified]=$'\U1F5C3' | |
| 3726 | +emoji[file_cabinet]=$'\U1F5C4\UFE0F' | |
| 3727 | +emoji[file_cabinet_unqualified]=$'\U1F5C4' | |
| 3728 | +emoji[wastebasket]=$'\U1F5D1\UFE0F' | |
| 3729 | +emoji[wastebasket_unqualified]=$'\U1F5D1' | |
| 3730 | +emoji[locked]=$'\U1F512' | |
| 3731 | +emoji[lock]=$'\U1F512' | |
| 3732 | +emoji[unlocked]=$'\U1F513' | |
| 3733 | +emoji[unlock]=$'\U1F513' | |
| 3734 | +emoji[locked_with_pen]=$'\U1F50F' | |
| 3735 | +emoji[lock_with_ink_pen]=$'\U1F50F' | |
| 3736 | +emoji[locked_with_key]=$'\U1F510' | |
| 3737 | +emoji[closed_lock_with_key]=$'\U1F510' | |
| 3738 | +emoji[locked_with_key_1]=$'\U1F511' | |
| 3739 | +emoji[key]=$'\U1F511' | |
| 3740 | +emoji[old_key]=$'\U1F5DD\UFE0F' | |
| 3741 | +emoji[old_key_unqualified]=$'\U1F5DD' | |
| 3742 | +emoji[hammer]=$'\U1F528' | |
| 3743 | +emoji[axe]=$'\U1FA93' | |
| 3744 | +emoji[pick]=$'\U26CF\UFE0F' | |
| 3745 | +emoji[pick_unqualified]=$'\U26CF' | |
| 3746 | +emoji[hammer_and_pick]=$'\U2692\UFE0F' | |
| 3747 | +emoji[hammer_and_pick_unqualified]=$'\U2692' | |
| 3748 | +emoji[hammer_and_wrench]=$'\U1F6E0\UFE0F' | |
| 3749 | +emoji[hammer_and_wrench_unqualified]=$'\U1F6E0' | |
| 3750 | +emoji[dagger]=$'\U1F5E1\UFE0F' | |
| 3751 | +emoji[dagger_unqualified]=$'\U1F5E1' | |
| 3752 | +emoji[crossed_swords]=$'\U2694\UFE0F' | |
| 3753 | +emoji[crossed_swords_unqualified]=$'\U2694' | |
| 3754 | +emoji[pistol]=$'\U1F52B' | |
| 3755 | +emoji[gun]=$'\U1F52B' | |
| 3756 | +emoji[bow_and_arrow]=$'\U1F3F9' | |
| 3757 | +emoji[shield]=$'\U1F6E1\UFE0F' | |
| 3758 | +emoji[shield_unqualified]=$'\U1F6E1' | |
| 3759 | +emoji[wrench]=$'\U1F527' | |
| 3760 | +emoji[nut_and_bolt]=$'\U1F529' | |
| 3761 | +emoji[gear]=$'\U2699\UFE0F' | |
| 3762 | +emoji[gear_unqualified]=$'\U2699' | |
| 3763 | +emoji[clamp]=$'\U1F5DC\UFE0F' | |
| 3764 | +emoji[clamp_unqualified]=$'\U1F5DC' | |
| 3765 | +emoji[balance_scale]=$'\U2696\UFE0F' | |
| 3766 | +emoji[balance_scale_unqualified]=$'\U2696' | |
| 3767 | +emoji[probing_cane]=$'\U1F9AF' | |
| 3768 | +emoji[link]=$'\U1F517' | |
| 3769 | +emoji[chains]=$'\U26D3\UFE0F' | |
| 3770 | +emoji[chains_unqualified]=$'\U26D3' | |
| 3771 | +emoji[toolbox]=$'\U1F9F0' | |
| 3772 | +emoji[magnet]=$'\U1F9F2' | |
| 3773 | +emoji[alembic]=$'\U2697\UFE0F' | |
| 3774 | +emoji[alembic_unqualified]=$'\U2697' | |
| 3775 | +emoji[test_tube]=$'\U1F9EA' | |
| 3776 | +emoji[petri_dish]=$'\U1F9EB' | |
| 3777 | +emoji[dna]=$'\U1F9EC' | |
| 3778 | +emoji[microscope]=$'\U1F52C' | |
| 3779 | +emoji[telescope]=$'\U1F52D' | |
| 3780 | +emoji[satellite_antenna]=$'\U1F4E1' | |
| 3781 | +emoji[syringe]=$'\U1F489' | |
| 3782 | +emoji[drop_of_blood]=$'\U1FA78' | |
| 3783 | +emoji[pill]=$'\U1F48A' | |
| 3784 | +emoji[adhesive_bandage]=$'\U1FA79' | |
| 3785 | +emoji[stethoscope]=$'\U1FA7A' | |
| 3786 | +emoji[door]=$'\U1F6AA' | |
| 3787 | +emoji[bed]=$'\U1F6CF\UFE0F' | |
| 3788 | +emoji[bed_unqualified]=$'\U1F6CF' | |
| 3789 | +emoji[couch_and_lamp]=$'\U1F6CB\UFE0F' | |
| 3790 | +emoji[couch_and_lamp_unqualified]=$'\U1F6CB' | |
| 3791 | +emoji[chair]=$'\U1FA91' | |
| 3792 | +emoji[toilet]=$'\U1F6BD' | |
| 3793 | +emoji[shower]=$'\U1F6BF' | |
| 3794 | +emoji[bathtub]=$'\U1F6C1' | |
| 3795 | +emoji[razor]=$'\U1FA92' | |
| 3796 | +emoji[lotion_bottle]=$'\U1F9F4' | |
| 3797 | +emoji[safety_pin]=$'\U1F9F7' | |
| 3798 | +emoji[broom]=$'\U1F9F9' | |
| 3799 | +emoji[basket]=$'\U1F9FA' | |
| 3800 | +emoji[roll_of_paper]=$'\U1F9FB' | |
| 3801 | +emoji[soap]=$'\U1F9FC' | |
| 3802 | +emoji[sponge]=$'\U1F9FD' | |
| 3803 | +emoji[fire_extinguisher]=$'\U1F9EF' | |
| 3804 | +emoji[shopping_cart]=$'\U1F6D2' | |
| 3805 | +emoji[cigarette]=$'\U1F6AC' | |
| 3806 | +emoji[smoking]=$'\U1F6AC' | |
| 3807 | +emoji[coffin]=$'\U26B0\UFE0F' | |
| 3808 | +emoji[coffin_unqualified]=$'\U26B0' | |
| 3809 | +emoji[funeral_urn]=$'\U26B1\UFE0F' | |
| 3810 | +emoji[funeral_urn_unqualified]=$'\U26B1' | |
| 3811 | +emoji[moai]=$'\U1F5FF' | |
| 3812 | +emoji[moyai]=$'\U1F5FF' | |
| 3813 | +emoji[ATM_sign]=$'\U1F3E7' | |
| 3814 | +emoji[atm]=$'\U1F3E7' | |
| 3815 | +emoji[litter_in_bin_sign]=$'\U1F6AE' | |
| 3816 | +emoji[put_litter_in_its_place]=$'\U1F6AE' | |
| 3817 | +emoji[potable_water]=$'\U1F6B0' | |
| 3818 | +emoji[wheelchair_symbol]=$'\U267F' | |
| 3819 | +emoji[wheelchair]=$'\U267F' | |
| 3820 | +emoji[men_s_room]=$'\U1F6B9' | |
| 3821 | +emoji[mens]=$'\U1F6B9' | |
| 3822 | +emoji[women_s_room]=$'\U1F6BA' | |
| 3823 | +emoji[womens]=$'\U1F6BA' | |
| 3824 | +emoji[restroom]=$'\U1F6BB' | |
| 3825 | +emoji[baby_symbol]=$'\U1F6BC' | |
| 3826 | +emoji[water_closet]=$'\U1F6BE' | |
| 3827 | +emoji[wc]=$'\U1F6BE' | |
| 3828 | +emoji[passport_control]=$'\U1F6C2' | |
| 3829 | +emoji[customs]=$'\U1F6C3' | |
| 3830 | +emoji[baggage_claim]=$'\U1F6C4' | |
| 3831 | +emoji[left_luggage]=$'\U1F6C5' | |
| 3832 | +emoji[warning]=$'\U26A0\UFE0F' | |
| 3833 | +emoji[warning_unqualified]=$'\U26A0' | |
| 3834 | +emoji[children_crossing]=$'\U1F6B8' | |
| 3835 | +emoji[no_entry]=$'\U26D4' | |
| 3836 | +emoji[prohibited]=$'\U1F6AB' | |
| 3837 | +emoji[no_entry_sign]=$'\U1F6AB' | |
| 3838 | +emoji[no_bicycles]=$'\U1F6B3' | |
| 3839 | +emoji[no_smoking]=$'\U1F6AD' | |
| 3840 | +emoji[no_littering]=$'\U1F6AF' | |
| 3841 | +emoji[do_not_litter]=$'\U1F6AF' | |
| 3842 | +emoji[non_potable_water]=$'\U1F6B1' | |
| 3843 | +emoji[non-potable_water]=$'\U1F6B1' | |
| 3844 | +emoji[no_pedestrians]=$'\U1F6B7' | |
| 3845 | +emoji[no_mobile_phones]=$'\U1F4F5' | |
| 3846 | +emoji[no_one_under_eighteen]=$'\U1F51E' | |
| 3847 | +emoji[underage]=$'\U1F51E' | |
| 3848 | +emoji[radioactive]=$'\U2622\UFE0F' | |
| 3849 | +emoji[radioactive_unqualified]=$'\U2622' | |
| 3850 | +emoji[biohazard]=$'\U2623\UFE0F' | |
| 3851 | +emoji[biohazard_unqualified]=$'\U2623' | |
| 3852 | +emoji[up_arrow]=$'\U2B06\UFE0F' | |
| 3853 | +emoji[arrow_up]=$'\U2B06\UFE0F' | |
| 3854 | +emoji[up_arrow_unqualified]=$'\U2B06' | |
| 3855 | +emoji[up_right_arrow]=$'\U2197\UFE0F' | |
| 3856 | +emoji[arrow_upper_right]=$'\U2197\UFE0F' | |
| 3857 | +emoji[up_right_arrow_unqualified]=$'\U2197' | |
| 3858 | +emoji[up_right_arrow_unqualified_1]=$'\U27A1\UFE0F' | |
| 3859 | +emoji[arrow_right]=$'\U27A1\UFE0F' | |
| 3860 | +emoji[up_right_arrow_unqualified_2]=$'\U27A1' | |
| 3861 | +emoji[down_right_arrow]=$'\U2198\UFE0F' | |
| 3862 | +emoji[arrow_lower_right]=$'\U2198\UFE0F' | |
| 3863 | +emoji[down_right_arrow_unqualified]=$'\U2198' | |
| 3864 | +emoji[down_arrow]=$'\U2B07\UFE0F' | |
| 3865 | +emoji[arrow_down]=$'\U2B07\UFE0F' | |
| 3866 | +emoji[down_arrow_unqualified]=$'\U2B07' | |
| 3867 | +emoji[down_left_arrow]=$'\U2199\UFE0F' | |
| 3868 | +emoji[arrow_lower_left]=$'\U2199\UFE0F' | |
| 3869 | +emoji[down_left_arrow_unqualified]=$'\U2199' | |
| 3870 | +emoji[down_left_arrow_unqualified_1]=$'\U2B05\UFE0F' | |
| 3871 | +emoji[arrow_left]=$'\U2B05\UFE0F' | |
| 3872 | +emoji[down_left_arrow_unqualified_2]=$'\U2B05' | |
| 3873 | +emoji[up_left_arrow]=$'\U2196\UFE0F' | |
| 3874 | +emoji[arrow_upper_left]=$'\U2196\UFE0F' | |
| 3875 | +emoji[up_left_arrow_unqualified]=$'\U2196' | |
| 3876 | +emoji[up_down_arrow]=$'\U2195\UFE0F' | |
| 3877 | +emoji[arrow_up_down]=$'\U2195\UFE0F' | |
| 3878 | +emoji[up_down_arrow_unqualified]=$'\U2195' | |
| 3879 | +emoji[left_right_arrow]=$'\U2194\UFE0F' | |
| 3880 | +emoji[left_right_arrow_unqualified]=$'\U2194' | |
| 3881 | +emoji[right_arrow_curving_left]=$'\U21A9\UFE0F' | |
| 3882 | +emoji[leftwards_arrow_with_hook]=$'\U21A9\UFE0F' | |
| 3883 | +emoji[right_arrow_curving_left_unqualified]=$'\U21A9' | |
| 3884 | +emoji[left_arrow_curving_right]=$'\U21AA\UFE0F' | |
| 3885 | +emoji[arrow_right_hook]=$'\U21AA\UFE0F' | |
| 3886 | +emoji[left_arrow_curving_right_unqualified]=$'\U21AA' | |
| 3887 | +emoji[right_arrow_curving_up]=$'\U2934\UFE0F' | |
| 3888 | +emoji[arrow_heading_up]=$'\U2934\UFE0F' | |
| 3889 | +emoji[right_arrow_curving_up_unqualified]=$'\U2934' | |
| 3890 | +emoji[right_arrow_curving_down]=$'\U2935\UFE0F' | |
| 3891 | +emoji[arrow_heading_down]=$'\U2935\UFE0F' | |
| 3892 | +emoji[right_arrow_curving_down_unqualified]=$'\U2935' | |
| 3893 | +emoji[clockwise_vertical_arrows]=$'\U1F503' | |
| 3894 | +emoji[arrows_clockwise]=$'\U1F503' | |
| 3895 | +emoji[counterclockwise_arrows_button]=$'\U1F504' | |
| 3896 | +emoji[arrows_counterclockwise]=$'\U1F504' | |
| 3897 | +emoji[BACK_arrow]=$'\U1F519' | |
| 3898 | +emoji[back]=$'\U1F519' | |
| 3899 | +emoji[END_arrow]=$'\U1F51A' | |
| 3900 | +emoji[end]=$'\U1F51A' | |
| 3901 | +emoji[ON_arrow]=$'\U1F51B' | |
| 3902 | +emoji[on]=$'\U1F51B' | |
| 3903 | +emoji[SOON_arrow]=$'\U1F51C' | |
| 3904 | +emoji[soon]=$'\U1F51C' | |
| 3905 | +emoji[TOP_arrow]=$'\U1F51D' | |
| 3906 | +emoji[top]=$'\U1F51D' | |
| 3907 | +emoji[place_of_worship]=$'\U1F6D0' | |
| 3908 | +emoji[atom_symbol]=$'\U269B\UFE0F' | |
| 3909 | +emoji[atom_symbol_unqualified]=$'\U269B' | |
| 3910 | +emoji[atom_symbol_unqualified_1]=$'\U1F549\UFE0F' | |
| 3911 | +emoji[om_unqualified]=$'\U1F549' | |
| 3912 | +emoji[om]=$'\U1F549' | |
| 3913 | +emoji[star_of_David]=$'\U2721\UFE0F' | |
| 3914 | +emoji[star_of_david]=$'\U2721\UFE0F' | |
| 3915 | +emoji[star_of_David_unqualified]=$'\U2721' | |
| 3916 | +emoji[wheel_of_dharma]=$'\U2638\UFE0F' | |
| 3917 | +emoji[wheel_of_dharma_unqualified]=$'\U2638' | |
| 3918 | +emoji[yin_yang]=$'\U262F\UFE0F' | |
| 3919 | +emoji[yin_yang_unqualified]=$'\U262F' | |
| 3920 | +emoji[latin_cross]=$'\U271D\UFE0F' | |
| 3921 | +emoji[latin_cross_unqualified]=$'\U271D' | |
| 3922 | +emoji[orthodox_cross]=$'\U2626\UFE0F' | |
| 3923 | +emoji[orthodox_cross_unqualified]=$'\U2626' | |
| 3924 | +emoji[star_and_crescent]=$'\U262A\UFE0F' | |
| 3925 | +emoji[star_and_crescent_unqualified]=$'\U262A' | |
| 3926 | +emoji[peace_symbol]=$'\U262E\UFE0F' | |
| 3927 | +emoji[peace_symbol_unqualified]=$'\U262E' | |
| 3928 | +emoji[menorah]=$'\U1F54E' | |
| 3929 | +emoji[dotted_six_pointed_star]=$'\U1F52F' | |
| 3930 | +emoji[six_pointed_star]=$'\U1F52F' | |
| 3931 | +emoji[Aries]=$'\U2648' | |
| 3932 | +emoji[aries]=$'\U2648' | |
| 3933 | +emoji[Taurus]=$'\U2649' | |
| 3934 | +emoji[taurus]=$'\U2649' | |
| 3935 | +emoji[Gemini]=$'\U264A' | |
| 3936 | +emoji[gemini]=$'\U264A' | |
| 3937 | +emoji[Cancer]=$'\U264B' | |
| 3938 | +emoji[cancer]=$'\U264B' | |
| 3939 | +emoji[Leo]=$'\U264C' | |
| 3940 | +emoji[leo]=$'\U264C' | |
| 3941 | +emoji[Virgo]=$'\U264D' | |
| 3942 | +emoji[virgo]=$'\U264D' | |
| 3943 | +emoji[Libra]=$'\U264E' | |
| 3944 | +emoji[libra]=$'\U264E' | |
| 3945 | +emoji[Scorpio]=$'\U264F' | |
| 3946 | +emoji[scorpius]=$'\U264F' | |
| 3947 | +emoji[Sagittarius]=$'\U2650' | |
| 3948 | +emoji[sagittarius]=$'\U2650' | |
| 3949 | +emoji[Capricorn]=$'\U2651' | |
| 3950 | +emoji[capricorn]=$'\U2651' | |
| 3951 | +emoji[Aquarius]=$'\U2652' | |
| 3952 | +emoji[aquarius]=$'\U2652' | |
| 3953 | +emoji[Pisces]=$'\U2653' | |
| 3954 | +emoji[pisces]=$'\U2653' | |
| 3955 | +emoji[Ophiuchus]=$'\U26CE' | |
| 3956 | +emoji[ophiuchus]=$'\U26CE' | |
| 3957 | +emoji[shuffle_tracks_button]=$'\U1F500' | |
| 3958 | +emoji[twisted_rightwards_arrows]=$'\U1F500' | |
| 3959 | +emoji[repeat_button]=$'\U1F501' | |
| 3960 | +emoji[repeat]=$'\U1F501' | |
| 3961 | +emoji[repeat_single_button]=$'\U1F502' | |
| 3962 | +emoji[repeat_one]=$'\U1F502' | |
| 3963 | +emoji[play_button]=$'\U25B6\UFE0F' | |
| 3964 | +emoji[arrow_forward]=$'\U25B6\UFE0F' | |
| 3965 | +emoji[play_button_unqualified]=$'\U25B6' | |
| 3966 | +emoji[fast_forward_button]=$'\U23E9' | |
| 3967 | +emoji[fast_forward]=$'\U23E9' | |
| 3968 | +emoji[next_track_button]=$'\U23ED\UFE0F' | |
| 3969 | +emoji[next_track_button_unqualified]=$'\U23ED' | |
| 3970 | +emoji[play_or_pause_button]=$'\U23EF\UFE0F' | |
| 3971 | +emoji[play_or_pause_button_unqualified]=$'\U23EF' | |
| 3972 | +emoji[reverse_button]=$'\U25C0\UFE0F' | |
| 3973 | +emoji[arrow_backward]=$'\U25C0\UFE0F' | |
| 3974 | +emoji[reverse_button_unqualified]=$'\U25C0' | |
| 3975 | +emoji[fast_reverse_button]=$'\U23EA' | |
| 3976 | +emoji[rewind]=$'\U23EA' | |
| 3977 | +emoji[last_track_button]=$'\U23EE\UFE0F' | |
| 3978 | +emoji[last_track_button_unqualified]=$'\U23EE' | |
| 3979 | +emoji[previous_track_button]=$'\U23EE' | |
| 3980 | +emoji[upwards_button]=$'\U1F53C' | |
| 3981 | +emoji[arrow_up_small]=$'\U1F53C' | |
| 3982 | +emoji[fast_up_button]=$'\U23EB' | |
| 3983 | +emoji[arrow_double_up]=$'\U23EB' | |
| 3984 | +emoji[downwards_button]=$'\U1F53D' | |
| 3985 | +emoji[arrow_down_small]=$'\U1F53D' | |
| 3986 | +emoji[fast_down_button]=$'\U23EC' | |
| 3987 | +emoji[arrow_double_down]=$'\U23EC' | |
| 3988 | +emoji[pause_button]=$'\U23F8\UFE0F' | |
| 3989 | +emoji[pause_button_unqualified]=$'\U23F8' | |
| 3990 | +emoji[stop_button]=$'\U23F9\UFE0F' | |
| 3991 | +emoji[stop_button_unqualified]=$'\U23F9' | |
| 3992 | +emoji[record_button]=$'\U23FA\UFE0F' | |
| 3993 | +emoji[record_button_unqualified]=$'\U23FA' | |
| 3994 | +emoji[eject_button]=$'\U23CF\UFE0F' | |
| 3995 | +emoji[eject_button_unqualified]=$'\U23CF' | |
| 3996 | +emoji[cinema]=$'\U1F3A6' | |
| 3997 | +emoji[dim_button]=$'\U1F505' | |
| 3998 | +emoji[low_brightness]=$'\U1F505' | |
| 3999 | +emoji[bright_button]=$'\U1F506' | |
| 4000 | +emoji[high_brightness]=$'\U1F506' | |
| 4001 | +emoji[antenna_bars]=$'\U1F4F6' | |
| 4002 | +emoji[signal_strength]=$'\U1F4F6' | |
| 4003 | +emoji[vibration_mode]=$'\U1F4F3' | |
| 4004 | +emoji[mobile_phone_off]=$'\U1F4F4' | |
| 4005 | +emoji[female_sign]=$'\U2640\UFE0F' | |
| 4006 | +emoji[female_sign_unqualified]=$'\U2640' | |
| 4007 | +emoji[female_sign_unqualified_1]=$'\U2642\UFE0F' | |
| 4008 | +emoji[male_sign]=$'\U2642\UFE0F' | |
| 4009 | +emoji[female_sign_unqualified_2]=$'\U2642' | |
| 4010 | +emoji[medical_symbol]=$'\U2695\UFE0F' | |
| 4011 | +emoji[medical_symbol_unqualified]=$'\U2695' | |
| 4012 | +emoji[infinity]=$'\U267E\UFE0F' | |
| 4013 | +emoji[infinity_unqualified]=$'\U267E' | |
| 4014 | +emoji[recycling_symbol]=$'\U267B\UFE0F' | |
| 4015 | +emoji[recycle]=$'\U267B\UFE0F' | |
| 4016 | +emoji[recycling_symbol_unqualified]=$'\U267B' | |
| 4017 | +emoji[fleur_de_lis]=$'\U269C\UFE0F' | |
| 4018 | +emoji[fleur_de_lis_unqualified]=$'\U269C' | |
| 4019 | +emoji[trident_emblem]=$'\U1F531' | |
| 4020 | +emoji[trident]=$'\U1F531' | |
| 4021 | +emoji[name_badge]=$'\U1F4DB' | |
| 4022 | +emoji[Japanese_symbol_for_beginner]=$'\U1F530' | |
| 4023 | +emoji[beginner]=$'\U1F530' | |
| 4024 | +emoji[hollow_red_circle]=$'\U2B55' | |
| 4025 | +emoji[o]=$'\U2B55' | |
| 4026 | +emoji[check_mark_button]=$'\U2705' | |
| 4027 | +emoji[white_check_mark]=$'\U2705' | |
| 4028 | +emoji[check_box_with_check]=$'\U2611\UFE0F' | |
| 4029 | +emoji[ballot_box_with_check]=$'\U2611\UFE0F' | |
| 4030 | +emoji[check_box_with_check_unqualified]=$'\U2611' | |
| 4031 | +emoji[check_mark]=$'\U2714\UFE0F' | |
| 4032 | +emoji[heavy_check_mark]=$'\U2714\UFE0F' | |
| 4033 | +emoji[check_mark_unqualified]=$'\U2714' | |
| 4034 | +emoji[multiplication_sign]=$'\U2716\UFE0F' | |
| 4035 | +emoji[heavy_multiplication_x]=$'\U2716\UFE0F' | |
| 4036 | +emoji[multiplication_sign_unqualified]=$'\U2716' | |
| 4037 | +emoji[cross_mark]=$'\U274C' | |
| 4038 | +emoji[x]=$'\U274C' | |
| 4039 | +emoji[cross_mark_button]=$'\U274E' | |
| 4040 | +emoji[negative_squared_cross_mark]=$'\U274E' | |
| 4041 | +emoji[plus_sign]=$'\U2795' | |
| 4042 | +emoji[heavy_plus_sign]=$'\U2795' | |
| 4043 | +emoji[minus_sign]=$'\U2796' | |
| 4044 | +emoji[heavy_minus_sign]=$'\U2796' | |
| 4045 | +emoji[division_sign]=$'\U2797' | |
| 4046 | +emoji[heavy_division_sign]=$'\U2797' | |
| 4047 | +emoji[curly_loop]=$'\U27B0' | |
| 4048 | +emoji[double_curly_loop]=$'\U27BF' | |
| 4049 | +emoji[loop]=$'\U27BF' | |
| 4050 | +emoji[part_alternation_mark]=$'\U303D\UFE0F' | |
| 4051 | +emoji[part_alternation_mark_unqualified]=$'\U303D' | |
| 4052 | +emoji[eight_spoked_asterisk]=$'\U2733\UFE0F' | |
| 4053 | +emoji[eight_spoked_asterisk_unqualified]=$'\U2733' | |
| 4054 | +emoji[eight_pointed_star]=$'\U2734\UFE0F' | |
| 4055 | +emoji[eight_pointed_black_star]=$'\U2734\UFE0F' | |
| 4056 | +emoji[eight_pointed_star_unqualified]=$'\U2734' | |
| 4057 | +emoji[sparkle]=$'\U2747\UFE0F' | |
| 4058 | +emoji[sparkle_unqualified]=$'\U2747' | |
| 4059 | +emoji[double_exclamation_mark]=$'\U203C\UFE0F' | |
| 4060 | +emoji[bangbang]=$'\U203C\UFE0F' | |
| 4061 | +emoji[double_exclamation_mark_unqualified]=$'\U203C' | |
| 4062 | +emoji[exclamation_question_mark]=$'\U2049\UFE0F' | |
| 4063 | +emoji[interrobang]=$'\U2049\UFE0F' | |
| 4064 | +emoji[exclamation_question_mark_unqualified]=$'\U2049' | |
| 4065 | +emoji[exclamation_question_mark_unqualified_1]=$'\U2753' | |
| 4066 | +emoji[question]=$'\U2753' | |
| 4067 | +emoji[white_question_mark]=$'\U2754' | |
| 4068 | +emoji[grey_question]=$'\U2754' | |
| 4069 | +emoji[white_exclamation_mark]=$'\U2755' | |
| 4070 | +emoji[grey_exclamation]=$'\U2755' | |
| 4071 | +emoji[white_exclamation_mark_1]=$'\U2757' | |
| 4072 | +emoji[exclamation]=$'\U2757' | |
| 4073 | +emoji[heavy_exclamation_mark]=$'\U2757' | |
| 4074 | +emoji[wavy_dash]=$'\U3030\UFE0F' | |
| 4075 | +emoji[wavy_dash_unqualified]=$'\U3030' | |
| 4076 | +emoji[copyright]=$'\U00A9\UFE0F' | |
| 4077 | +emoji[copyright_unqualified]=$'\U00A9' | |
| 4078 | +emoji[registered]=$'\U00AE\UFE0F' | |
| 4079 | +emoji[registered_unqualified]=$'\U00AE' | |
| 4080 | +emoji[trade_mark]=$'\U2122\UFE0F' | |
| 4081 | +emoji[tm]=$'\U2122\UFE0F' | |
| 4082 | +emoji[trade_mark_unqualified]=$'\U2122' | |
| 4083 | +emoji[keycap_#]=$'\U0023\UFE0F\U20E3' | |
| 4084 | +emoji[hash]=$'\U0023\UFE0F\U20E3' | |
| 4085 | +emoji[keycap_#_unqualified]=$'\U0023\U20E3' | |
| 4086 | +emoji[keycap_*]=$'\U002A\UFE0F\U20E3' | |
| 4087 | +emoji[asterisk]=$'\U002A\UFE0F\U20E3' | |
| 4088 | +emoji[keycap_*_unqualified]=$'\U002A\U20E3' | |
| 4089 | +emoji[keycap_0]=$'\U0030\UFE0F\U20E3' | |
| 4090 | +emoji[zero]=$'\U0030\UFE0F\U20E3' | |
| 4091 | +emoji[keycap_0_unqualified]=$'\U0030\U20E3' | |
| 4092 | +emoji[keycap_1]=$'\U0031\UFE0F\U20E3' | |
| 4093 | +emoji[one]=$'\U0031\UFE0F\U20E3' | |
| 4094 | +emoji[keycap_1_unqualified]=$'\U0031\U20E3' | |
| 4095 | +emoji[keycap_2]=$'\U0032\UFE0F\U20E3' | |
| 4096 | +emoji[two]=$'\U0032\UFE0F\U20E3' | |
| 4097 | +emoji[keycap_2_unqualified]=$'\U0032\U20E3' | |
| 4098 | +emoji[keycap_3]=$'\U0033\UFE0F\U20E3' | |
| 4099 | +emoji[three]=$'\U0033\UFE0F\U20E3' | |
| 4100 | +emoji[keycap_3_unqualified]=$'\U0033\U20E3' | |
| 4101 | +emoji[keycap_4]=$'\U0034\UFE0F\U20E3' | |
| 4102 | +emoji[four]=$'\U0034\UFE0F\U20E3' | |
| 4103 | +emoji[keycap_4_unqualified]=$'\U0034\U20E3' | |
| 4104 | +emoji[keycap_5]=$'\U0035\UFE0F\U20E3' | |
| 4105 | +emoji[five]=$'\U0035\UFE0F\U20E3' | |
| 4106 | +emoji[keycap_5_unqualified]=$'\U0035\U20E3' | |
| 4107 | +emoji[keycap_6]=$'\U0036\UFE0F\U20E3' | |
| 4108 | +emoji[six]=$'\U0036\UFE0F\U20E3' | |
| 4109 | +emoji[keycap_6_unqualified]=$'\U0036\U20E3' | |
| 4110 | +emoji[keycap_7]=$'\U0037\UFE0F\U20E3' | |
| 4111 | +emoji[seven]=$'\U0037\UFE0F\U20E3' | |
| 4112 | +emoji[keycap_7_unqualified]=$'\U0037\U20E3' | |
| 4113 | +emoji[keycap_8]=$'\U0038\UFE0F\U20E3' | |
| 4114 | +emoji[eight]=$'\U0038\UFE0F\U20E3' | |
| 4115 | +emoji[keycap_8_unqualified]=$'\U0038\U20E3' | |
| 4116 | +emoji[keycap_9]=$'\U0039\UFE0F\U20E3' | |
| 4117 | +emoji[nine]=$'\U0039\UFE0F\U20E3' | |
| 4118 | +emoji[keycap_9_unqualified]=$'\U0039\U20E3' | |
| 4119 | +emoji[keycap_10]=$'\U1F51F' | |
| 4120 | +emoji[keycap_ten]=$'\U1F51F' | |
| 4121 | +emoji[input_latin_uppercase]=$'\U1F520' | |
| 4122 | +emoji[capital_abcd]=$'\U1F520' | |
| 4123 | +emoji[input_latin_lowercase]=$'\U1F521' | |
| 4124 | +emoji[abcd]=$'\U1F521' | |
| 4125 | +emoji[input_numbers]=$'\U1F522' | |
| 4126 | +emoji[1234]=$'\U1F522' | |
| 4127 | +emoji[input_symbols]=$'\U1F523' | |
| 4128 | +emoji[symbols]=$'\U1F523' | |
| 4129 | +emoji[input_latin_letters]=$'\U1F524' | |
| 4130 | +emoji[abc]=$'\U1F524' | |
| 4131 | +emoji[A_button_blood_type_]=$'\U1F170\UFE0F' | |
| 4132 | +emoji[a]=$'\U1F170\UFE0F' | |
| 4133 | +emoji[A_button_blood_type__unqualified]=$'\U1F170' | |
| 4134 | +emoji[AB_button_blood_type_]=$'\U1F18E' | |
| 4135 | +emoji[ab]=$'\U1F18E' | |
| 4136 | +emoji[AB_button_blood_type__1]=$'\U1F171\UFE0F' | |
| 4137 | +emoji[b]=$'\U1F171\UFE0F' | |
| 4138 | +emoji[B_button_blood_type__unqualified]=$'\U1F171' | |
| 4139 | +emoji[CL_button]=$'\U1F191' | |
| 4140 | +emoji[cl]=$'\U1F191' | |
| 4141 | +emoji[COOL_button]=$'\U1F192' | |
| 4142 | +emoji[cool]=$'\U1F192' | |
| 4143 | +emoji[FREE_button]=$'\U1F193' | |
| 4144 | +emoji[free]=$'\U1F193' | |
| 4145 | +emoji[information]=$'\U2139\UFE0F' | |
| 4146 | +emoji[information_source]=$'\U2139\UFE0F' | |
| 4147 | +emoji[information_unqualified]=$'\U2139' | |
| 4148 | +emoji[ID_button]=$'\U1F194' | |
| 4149 | +emoji[id]=$'\U1F194' | |
| 4150 | +emoji[circled_M]=$'\U24C2\UFE0F' | |
| 4151 | +emoji[m]=$'\U24C2\UFE0F' | |
| 4152 | +emoji[circled_M_unqualified]=$'\U24C2' | |
| 4153 | +emoji[NEW_button]=$'\U1F195' | |
| 4154 | +emoji[new]=$'\U1F195' | |
| 4155 | +emoji[NG_button]=$'\U1F196' | |
| 4156 | +emoji[ng]=$'\U1F196' | |
| 4157 | +emoji[O_button_blood_type_]=$'\U1F17E\UFE0F' | |
| 4158 | +emoji[o2]=$'\U1F17E\UFE0F' | |
| 4159 | +emoji[O_button_blood_type__unqualified]=$'\U1F17E' | |
| 4160 | +emoji[OK_button]=$'\U1F197' | |
| 4161 | +emoji[ok]=$'\U1F197' | |
| 4162 | +emoji[P_button]=$'\U1F17F\UFE0F' | |
| 4163 | +emoji[parking]=$'\U1F17F\UFE0F' | |
| 4164 | +emoji[P_button_unqualified]=$'\U1F17F' | |
| 4165 | +emoji[SOS_button]=$'\U1F198' | |
| 4166 | +emoji[sos]=$'\U1F198' | |
| 4167 | +emoji[UP_button]=$'\U1F199' | |
| 4168 | +emoji[up]=$'\U1F199' | |
| 4169 | +emoji[VS_button]=$'\U1F19A' | |
| 4170 | +emoji[vs]=$'\U1F19A' | |
| 4171 | +emoji[Japanese_here_button]=$'\U1F201' | |
| 4172 | +emoji[koko]=$'\U1F201' | |
| 4173 | +emoji[Japanese_service_charge_button]=$'\U1F202\UFE0F' | |
| 4174 | +emoji[sa]=$'\U1F202\UFE0F' | |
| 4175 | +emoji[Japanese_service_charge_button_unqualified]=$'\U1F202' | |
| 4176 | +emoji[Japanese_monthly_amount_button]=$'\U1F237\UFE0F' | |
| 4177 | +emoji[u6708]=$'\U1F237\UFE0F' | |
| 4178 | +emoji[Japanese_monthly_amount_button_unqualified]=$'\U1F237' | |
| 4179 | +emoji[Japanese_not_free_of_charge_button]=$'\U1F236' | |
| 4180 | +emoji[u6709]=$'\U1F236' | |
| 4181 | +emoji[Japanese_reserved_button]=$'\U1F22F' | |
| 4182 | +emoji[u6307]=$'\U1F22F' | |
| 4183 | +emoji[Japanese_bargain_button]=$'\U1F250' | |
| 4184 | +emoji[ideograph_advantage]=$'\U1F250' | |
| 4185 | +emoji[Japanese_discount_button]=$'\U1F239' | |
| 4186 | +emoji[u5272]=$'\U1F239' | |
| 4187 | +emoji[Japanese_free_of_charge_button]=$'\U1F21A' | |
| 4188 | +emoji[u7121]=$'\U1F21A' | |
| 4189 | +emoji[Japanese_prohibited_button]=$'\U1F232' | |
| 4190 | +emoji[u7981]=$'\U1F232' | |
| 4191 | +emoji[Japanese_acceptable_button]=$'\U1F251' | |
| 4192 | +emoji[accept]=$'\U1F251' | |
| 4193 | +emoji[Japanese_application_button]=$'\U1F238' | |
| 4194 | +emoji[u7533]=$'\U1F238' | |
| 4195 | +emoji[Japanese_passing_grade_button]=$'\U1F234' | |
| 4196 | +emoji[u5408]=$'\U1F234' | |
| 4197 | +emoji[Japanese_vacancy_button]=$'\U1F233' | |
| 4198 | +emoji[u7a7a]=$'\U1F233' | |
| 4199 | +emoji[Japanese_congratulations_button]=$'\U3297\UFE0F' | |
| 4200 | +emoji[congratulations]=$'\U3297\UFE0F' | |
| 4201 | +emoji[Japanese_congratulations_button_unqualified]=$'\U3297' | |
| 4202 | +emoji[Japanese_secret_button]=$'\U3299\UFE0F' | |
| 4203 | +emoji[secret]=$'\U3299\UFE0F' | |
| 4204 | +emoji[Japanese_secret_button_unqualified]=$'\U3299' | |
| 4205 | +emoji[Japanese_open_for_business_button]=$'\U1F23A' | |
| 4206 | +emoji[u55b6]=$'\U1F23A' | |
| 4207 | +emoji[Japanese_no_vacancy_button]=$'\U1F235' | |
| 4208 | +emoji[u6e80]=$'\U1F235' | |
| 4209 | +emoji[red_circle]=$'\U1F534' | |
| 4210 | +emoji[orange_circle]=$'\U1F7E0' | |
| 4211 | +emoji[yellow_circle]=$'\U1F7E1' | |
| 4212 | +emoji[green_circle]=$'\U1F7E2' | |
| 4213 | +emoji[blue_circle]=$'\U1F535' | |
| 4214 | +emoji[large_blue_circle]=$'\U1F535' | |
| 4215 | +emoji[purple_circle]=$'\U1F7E3' | |
| 4216 | +emoji[brown_circle]=$'\U1F7E4' | |
| 4217 | +emoji[black_circle]=$'\U26AB' | |
| 4218 | +emoji[white_circle]=$'\U26AA' | |
| 4219 | +emoji[red_square]=$'\U1F7E5' | |
| 4220 | +emoji[orange_square]=$'\U1F7E7' | |
| 4221 | +emoji[yellow_square]=$'\U1F7E8' | |
| 4222 | +emoji[green_square]=$'\U1F7E9' | |
| 4223 | +emoji[blue_square]=$'\U1F7E6' | |
| 4224 | +emoji[purple_square]=$'\U1F7EA' | |
| 4225 | +emoji[brown_square]=$'\U1F7EB' | |
| 4226 | +emoji[black_large_square]=$'\U2B1B' | |
| 4227 | +emoji[white_large_square]=$'\U2B1C' | |
| 4228 | +emoji[black_medium_square]=$'\U25FC\UFE0F' | |
| 4229 | +emoji[black_medium_square_unqualified]=$'\U25FC' | |
| 4230 | +emoji[white_medium_square]=$'\U25FB\UFE0F' | |
| 4231 | +emoji[white_medium_square_unqualified]=$'\U25FB' | |
| 4232 | +emoji[black_medium_small_square]=$'\U25FE' | |
| 4233 | +emoji[white_medium_small_square]=$'\U25FD' | |
| 4234 | +emoji[black_small_square]=$'\U25AA\UFE0F' | |
| 4235 | +emoji[black_small_square_unqualified]=$'\U25AA' | |
| 4236 | +emoji[white_small_square]=$'\U25AB\UFE0F' | |
| 4237 | +emoji[white_small_square_unqualified]=$'\U25AB' | |
| 4238 | +emoji[large_orange_diamond]=$'\U1F536' | |
| 4239 | +emoji[large_blue_diamond]=$'\U1F537' | |
| 4240 | +emoji[small_orange_diamond]=$'\U1F538' | |
| 4241 | +emoji[small_blue_diamond]=$'\U1F539' | |
| 4242 | +emoji[red_triangle_pointed_up]=$'\U1F53A' | |
| 4243 | +emoji[small_red_triangle]=$'\U1F53A' | |
| 4244 | +emoji[red_triangle_pointed_down]=$'\U1F53B' | |
| 4245 | +emoji[small_red_triangle_down]=$'\U1F53B' | |
| 4246 | +emoji[diamond_with_a_dot]=$'\U1F4A0' | |
| 4247 | +emoji[diamond_shape_with_a_dot_inside]=$'\U1F4A0' | |
| 4248 | +emoji[radio_button]=$'\U1F518' | |
| 4249 | +emoji[white_square_button]=$'\U1F533' | |
| 4250 | +emoji[black_square_button]=$'\U1F532' | |
| 4251 | +emoji_flags[chequered_flag]=$'\U1F3C1' | |
| 4252 | +emoji_flags[checkered_flag]=$'\U1F3C1' | |
| 4253 | +emoji_flags[triangular_flag]=$'\U1F6A9' | |
| 4254 | +emoji_flags[triangular_flag_on_post]=$'\U1F6A9' | |
| 4255 | +emoji_flags[crossed_flags]=$'\U1F38C' | |
| 4256 | +emoji_flags[black_flag]=$'\U1F3F4' | |
| 4257 | +emoji_flags[white_flag]=$'\U1F3F3\UFE0F' | |
| 4258 | +emoji_flags[white_flag_unqualified]=$'\U1F3F3' | |
| 4259 | +emoji_flags[rainbow_flag]=$'\U1F3F3\UFE0F\U200D\U1F308' | |
| 4260 | +emoji_flags[rainbow_flag_unqualified]=$'\U1F3F3\U200D\U1F308' | |
| 4261 | +emoji_flags[pirate_flag]=$'\U1F3F4\U200D\U2620\UFE0F' | |
| 4262 | +emoji_flags[pirate_flag_minimally]=$'\U1F3F4\U200D\U2620' | |
| 4263 | +emoji_flags[Ascension_Island]=$'\U1F1E6\U1F1E8' | |
| 4264 | +emoji_flags[ascension_island]=$'\U1F1E6\U1F1E8' | |
| 4265 | +emoji_flags[Andorra]=$'\U1F1E6\U1F1E9' | |
| 4266 | +emoji_flags[AD]=$'\U1F1E6\U1F1E9' | |
| 4267 | +emoji_flags[AND]=$'\U1F1E6\U1F1E9' | |
| 4268 | +emoji_flags[andorra]=$'\U1F1E6\U1F1E9' | |
| 4269 | +emoji_flags[United_Arab_Emirates]=$'\U1F1E6\U1F1EA' | |
| 4270 | +emoji_flags[AE]=$'\U1F1E6\U1F1EA' | |
| 4271 | +emoji_flags[ARE]=$'\U1F1E6\U1F1EA' | |
| 4272 | +emoji_flags[united_arab_emirates]=$'\U1F1E6\U1F1EA' | |
| 4273 | +emoji_flags[Afghanistan]=$'\U1F1E6\U1F1EB' | |
| 4274 | +emoji_flags[AF]=$'\U1F1E6\U1F1EB' | |
| 4275 | +emoji_flags[AFG]=$'\U1F1E6\U1F1EB' | |
| 4276 | +emoji_flags[afghanistan]=$'\U1F1E6\U1F1EB' | |
| 4277 | +emoji_flags[Antigua_and_Barbuda]=$'\U1F1E6\U1F1EC' | |
| 4278 | +emoji_flags[AG]=$'\U1F1E6\U1F1EC' | |
| 4279 | +emoji_flags[ATG]=$'\U1F1E6\U1F1EC' | |
| 4280 | +emoji_flags[antigua_barbuda]=$'\U1F1E6\U1F1EC' | |
| 4281 | +emoji_flags[Anguilla]=$'\U1F1E6\U1F1EE' | |
| 4282 | +emoji_flags[AI]=$'\U1F1E6\U1F1EE' | |
| 4283 | +emoji_flags[AIA]=$'\U1F1E6\U1F1EE' | |
| 4284 | +emoji_flags[anguilla]=$'\U1F1E6\U1F1EE' | |
| 4285 | +emoji_flags[Albania]=$'\U1F1E6\U1F1F1' | |
| 4286 | +emoji_flags[AL]=$'\U1F1E6\U1F1F1' | |
| 4287 | +emoji_flags[ALB]=$'\U1F1E6\U1F1F1' | |
| 4288 | +emoji_flags[albania]=$'\U1F1E6\U1F1F1' | |
| 4289 | +emoji_flags[Armenia]=$'\U1F1E6\U1F1F2' | |
| 4290 | +emoji_flags[AM]=$'\U1F1E6\U1F1F2' | |
| 4291 | +emoji_flags[ARM]=$'\U1F1E6\U1F1F2' | |
| 4292 | +emoji_flags[armenia]=$'\U1F1E6\U1F1F2' | |
| 4293 | +emoji_flags[Angola]=$'\U1F1E6\U1F1F4' | |
| 4294 | +emoji_flags[AO]=$'\U1F1E6\U1F1F4' | |
| 4295 | +emoji_flags[AGO]=$'\U1F1E6\U1F1F4' | |
| 4296 | +emoji_flags[angola]=$'\U1F1E6\U1F1F4' | |
| 4297 | +emoji_flags[Antarctica]=$'\U1F1E6\U1F1F6' | |
| 4298 | +emoji_flags[AQ]=$'\U1F1E6\U1F1F6' | |
| 4299 | +emoji_flags[ATA]=$'\U1F1E6\U1F1F6' | |
| 4300 | +emoji_flags[antarctica]=$'\U1F1E6\U1F1F6' | |
| 4301 | +emoji_flags[Argentina]=$'\U1F1E6\U1F1F7' | |
| 4302 | +emoji_flags[AR]=$'\U1F1E6\U1F1F7' | |
| 4303 | +emoji_flags[ARG]=$'\U1F1E6\U1F1F7' | |
| 4304 | +emoji_flags[argentina]=$'\U1F1E6\U1F1F7' | |
| 4305 | +emoji_flags[American_Samoa]=$'\U1F1E6\U1F1F8' | |
| 4306 | +emoji_flags[AS]=$'\U1F1E6\U1F1F8' | |
| 4307 | +emoji_flags[ASM]=$'\U1F1E6\U1F1F8' | |
| 4308 | +emoji_flags[american_samoa]=$'\U1F1E6\U1F1F8' | |
| 4309 | +emoji_flags[Austria]=$'\U1F1E6\U1F1F9' | |
| 4310 | +emoji_flags[AT]=$'\U1F1E6\U1F1F9' | |
| 4311 | +emoji_flags[AUT]=$'\U1F1E6\U1F1F9' | |
| 4312 | +emoji_flags[austria]=$'\U1F1E6\U1F1F9' | |
| 4313 | +emoji_flags[Australia]=$'\U1F1E6\U1F1FA' | |
| 4314 | +emoji_flags[AU]=$'\U1F1E6\U1F1FA' | |
| 4315 | +emoji_flags[AUS]=$'\U1F1E6\U1F1FA' | |
| 4316 | +emoji_flags[australia]=$'\U1F1E6\U1F1FA' | |
| 4317 | +emoji_flags[Aruba]=$'\U1F1E6\U1F1FC' | |
| 4318 | +emoji_flags[AW]=$'\U1F1E6\U1F1FC' | |
| 4319 | +emoji_flags[ABW]=$'\U1F1E6\U1F1FC' | |
| 4320 | +emoji_flags[aruba]=$'\U1F1E6\U1F1FC' | |
| 4321 | +emoji_flags[ร land_Islands]=$'\U1F1E6\U1F1FD' | |
| 4322 | +emoji_flags[AX]=$'\U1F1E6\U1F1FD' | |
| 4323 | +emoji_flags[ALA]=$'\U1F1E6\U1F1FD' | |
| 4324 | +emoji_flags[aland_islands]=$'\U1F1E6\U1F1FD' | |
| 4325 | +emoji_flags[Azerbaijan]=$'\U1F1E6\U1F1FF' | |
| 4326 | +emoji_flags[AZ]=$'\U1F1E6\U1F1FF' | |
| 4327 | +emoji_flags[AZE]=$'\U1F1E6\U1F1FF' | |
| 4328 | +emoji_flags[azerbaijan]=$'\U1F1E6\U1F1FF' | |
| 4329 | +emoji_flags[Bosnia_and_Herzegovina]=$'\U1F1E7\U1F1E6' | |
| 4330 | +emoji_flags[BA]=$'\U1F1E7\U1F1E6' | |
| 4331 | +emoji_flags[BIH]=$'\U1F1E7\U1F1E6' | |
| 4332 | +emoji_flags[bosnia_herzegovina]=$'\U1F1E7\U1F1E6' | |
| 4333 | +emoji_flags[Barbados]=$'\U1F1E7\U1F1E7' | |
| 4334 | +emoji_flags[BB]=$'\U1F1E7\U1F1E7' | |
| 4335 | +emoji_flags[BRB]=$'\U1F1E7\U1F1E7' | |
| 4336 | +emoji_flags[barbados]=$'\U1F1E7\U1F1E7' | |
| 4337 | +emoji_flags[Bangladesh]=$'\U1F1E7\U1F1E9' | |
| 4338 | +emoji_flags[BD]=$'\U1F1E7\U1F1E9' | |
| 4339 | +emoji_flags[BGD]=$'\U1F1E7\U1F1E9' | |
| 4340 | +emoji_flags[bangladesh]=$'\U1F1E7\U1F1E9' | |
| 4341 | +emoji_flags[Belgium]=$'\U1F1E7\U1F1EA' | |
| 4342 | +emoji_flags[BE]=$'\U1F1E7\U1F1EA' | |
| 4343 | +emoji_flags[BEL]=$'\U1F1E7\U1F1EA' | |
| 4344 | +emoji_flags[belgium]=$'\U1F1E7\U1F1EA' | |
| 4345 | +emoji_flags[Burkina_Faso]=$'\U1F1E7\U1F1EB' | |
| 4346 | +emoji_flags[BF]=$'\U1F1E7\U1F1EB' | |
| 4347 | +emoji_flags[BFA]=$'\U1F1E7\U1F1EB' | |
| 4348 | +emoji_flags[burkina_faso]=$'\U1F1E7\U1F1EB' | |
| 4349 | +emoji_flags[Bulgaria]=$'\U1F1E7\U1F1EC' | |
| 4350 | +emoji_flags[BG]=$'\U1F1E7\U1F1EC' | |
| 4351 | +emoji_flags[BGR]=$'\U1F1E7\U1F1EC' | |
| 4352 | +emoji_flags[bulgaria]=$'\U1F1E7\U1F1EC' | |
| 4353 | +emoji_flags[Bahrain]=$'\U1F1E7\U1F1ED' | |
| 4354 | +emoji_flags[BH]=$'\U1F1E7\U1F1ED' | |
| 4355 | +emoji_flags[BHR]=$'\U1F1E7\U1F1ED' | |
| 4356 | +emoji_flags[bahrain]=$'\U1F1E7\U1F1ED' | |
| 4357 | +emoji_flags[Burundi]=$'\U1F1E7\U1F1EE' | |
| 4358 | +emoji_flags[BI]=$'\U1F1E7\U1F1EE' | |
| 4359 | +emoji_flags[BDI]=$'\U1F1E7\U1F1EE' | |
| 4360 | +emoji_flags[burundi]=$'\U1F1E7\U1F1EE' | |
| 4361 | +emoji_flags[Benin]=$'\U1F1E7\U1F1EF' | |
| 4362 | +emoji_flags[BJ]=$'\U1F1E7\U1F1EF' | |
| 4363 | +emoji_flags[BEN]=$'\U1F1E7\U1F1EF' | |
| 4364 | +emoji_flags[benin]=$'\U1F1E7\U1F1EF' | |
| 4365 | +emoji_flags[St_Barthรฉlemy]=$'\U1F1E7\U1F1F1' | |
| 4366 | +emoji_flags[BL]=$'\U1F1E7\U1F1F1' | |
| 4367 | +emoji_flags[BLM]=$'\U1F1E7\U1F1F1' | |
| 4368 | +emoji_flags[st_barthelemy]=$'\U1F1E7\U1F1F1' | |
| 4369 | +emoji_flags[Bermuda]=$'\U1F1E7\U1F1F2' | |
| 4370 | +emoji_flags[BM]=$'\U1F1E7\U1F1F2' | |
| 4371 | +emoji_flags[BMU]=$'\U1F1E7\U1F1F2' | |
| 4372 | +emoji_flags[bermuda]=$'\U1F1E7\U1F1F2' | |
| 4373 | +emoji_flags[Brunei]=$'\U1F1E7\U1F1F3' | |
| 4374 | +emoji_flags[BN]=$'\U1F1E7\U1F1F3' | |
| 4375 | +emoji_flags[BRN]=$'\U1F1E7\U1F1F3' | |
| 4376 | +emoji_flags[brunei]=$'\U1F1E7\U1F1F3' | |
| 4377 | +emoji_flags[Bolivia]=$'\U1F1E7\U1F1F4' | |
| 4378 | +emoji_flags[BO]=$'\U1F1E7\U1F1F4' | |
| 4379 | +emoji_flags[BOL]=$'\U1F1E7\U1F1F4' | |
| 4380 | +emoji_flags[bolivia]=$'\U1F1E7\U1F1F4' | |
| 4381 | +emoji_flags[Caribbean_Netherlands]=$'\U1F1E7\U1F1F6' | |
| 4382 | +emoji_flags[BQ]=$'\U1F1E7\U1F1F6' | |
| 4383 | +emoji_flags[BES]=$'\U1F1E7\U1F1F6' | |
| 4384 | +emoji_flags[caribbean_netherlands]=$'\U1F1E7\U1F1F6' | |
| 4385 | +emoji_flags[Brazil]=$'\U1F1E7\U1F1F7' | |
| 4386 | +emoji_flags[BR]=$'\U1F1E7\U1F1F7' | |
| 4387 | +emoji_flags[BRA]=$'\U1F1E7\U1F1F7' | |
| 4388 | +emoji_flags[brazil]=$'\U1F1E7\U1F1F7' | |
| 4389 | +emoji_flags[Bahamas]=$'\U1F1E7\U1F1F8' | |
| 4390 | +emoji_flags[BS]=$'\U1F1E7\U1F1F8' | |
| 4391 | +emoji_flags[BHS]=$'\U1F1E7\U1F1F8' | |
| 4392 | +emoji_flags[bahamas]=$'\U1F1E7\U1F1F8' | |
| 4393 | +emoji_flags[Bhutan]=$'\U1F1E7\U1F1F9' | |
| 4394 | +emoji_flags[BT]=$'\U1F1E7\U1F1F9' | |
| 4395 | +emoji_flags[BTN]=$'\U1F1E7\U1F1F9' | |
| 4396 | +emoji_flags[bhutan]=$'\U1F1E7\U1F1F9' | |
| 4397 | +emoji_flags[Bouvet_Island]=$'\U1F1E7\U1F1FB' | |
| 4398 | +emoji_flags[BV]=$'\U1F1E7\U1F1FB' | |
| 4399 | +emoji_flags[BVT]=$'\U1F1E7\U1F1FB' | |
| 4400 | +emoji_flags[bouvet_island]=$'\U1F1E7\U1F1FB' | |
| 4401 | +emoji_flags[Botswana]=$'\U1F1E7\U1F1FC' | |
| 4402 | +emoji_flags[BW]=$'\U1F1E7\U1F1FC' | |
| 4403 | +emoji_flags[BWA]=$'\U1F1E7\U1F1FC' | |
| 4404 | +emoji_flags[botswana]=$'\U1F1E7\U1F1FC' | |
| 4405 | +emoji_flags[Belarus]=$'\U1F1E7\U1F1FE' | |
| 4406 | +emoji_flags[BY]=$'\U1F1E7\U1F1FE' | |
| 4407 | +emoji_flags[BLR]=$'\U1F1E7\U1F1FE' | |
| 4408 | +emoji_flags[belarus]=$'\U1F1E7\U1F1FE' | |
| 4409 | +emoji_flags[Belize]=$'\U1F1E7\U1F1FF' | |
| 4410 | +emoji_flags[BZ]=$'\U1F1E7\U1F1FF' | |
| 4411 | +emoji_flags[BLZ]=$'\U1F1E7\U1F1FF' | |
| 4412 | +emoji_flags[belize]=$'\U1F1E7\U1F1FF' | |
| 4413 | +emoji_flags[Canada]=$'\U1F1E8\U1F1E6' | |
| 4414 | +emoji_flags[CA]=$'\U1F1E8\U1F1E6' | |
| 4415 | +emoji_flags[CAN]=$'\U1F1E8\U1F1E6' | |
| 4416 | +emoji_flags[canada]=$'\U1F1E8\U1F1E6' | |
| 4417 | +emoji_flags[Cocos_Keeling_Islands]=$'\U1F1E8\U1F1E8' | |
| 4418 | +emoji_flags[CC]=$'\U1F1E8\U1F1E8' | |
| 4419 | +emoji_flags[CCK]=$'\U1F1E8\U1F1E8' | |
| 4420 | +emoji_flags[cocos_islands]=$'\U1F1E8\U1F1E8' | |
| 4421 | +emoji_flags[Congo__Kinshasa]=$'\U1F1E8\U1F1E9' | |
| 4422 | +emoji_flags[CD]=$'\U1F1E8\U1F1E9' | |
| 4423 | +emoji_flags[COD]=$'\U1F1E8\U1F1E9' | |
| 4424 | +emoji_flags[congo_kinshasa]=$'\U1F1E8\U1F1E9' | |
| 4425 | +emoji_flags[Central_African_Republic]=$'\U1F1E8\U1F1EB' | |
| 4426 | +emoji_flags[CF]=$'\U1F1E8\U1F1EB' | |
| 4427 | +emoji_flags[CAF]=$'\U1F1E8\U1F1EB' | |
| 4428 | +emoji_flags[central_african_republic]=$'\U1F1E8\U1F1EB' | |
| 4429 | +emoji_flags[Congo__Brazzaville]=$'\U1F1E8\U1F1EC' | |
| 4430 | +emoji_flags[CG]=$'\U1F1E8\U1F1EC' | |
| 4431 | +emoji_flags[COG]=$'\U1F1E8\U1F1EC' | |
| 4432 | +emoji_flags[congo_brazzaville]=$'\U1F1E8\U1F1EC' | |
| 4433 | +emoji_flags[Switzerland]=$'\U1F1E8\U1F1ED' | |
| 4434 | +emoji_flags[CH]=$'\U1F1E8\U1F1ED' | |
| 4435 | +emoji_flags[CHE]=$'\U1F1E8\U1F1ED' | |
| 4436 | +emoji_flags[switzerland]=$'\U1F1E8\U1F1ED' | |
| 4437 | +emoji_flags[Cรดte_d_Ivoire]=$'\U1F1E8\U1F1EE' | |
| 4438 | +emoji_flags[CI]=$'\U1F1E8\U1F1EE' | |
| 4439 | +emoji_flags[CIV]=$'\U1F1E8\U1F1EE' | |
| 4440 | +emoji_flags[cote_divoire]=$'\U1F1E8\U1F1EE' | |
| 4441 | +emoji_flags[Cook_Islands]=$'\U1F1E8\U1F1F0' | |
| 4442 | +emoji_flags[CK]=$'\U1F1E8\U1F1F0' | |
| 4443 | +emoji_flags[COK]=$'\U1F1E8\U1F1F0' | |
| 4444 | +emoji_flags[cook_islands]=$'\U1F1E8\U1F1F0' | |
| 4445 | +emoji_flags[Chile]=$'\U1F1E8\U1F1F1' | |
| 4446 | +emoji_flags[CL]=$'\U1F1E8\U1F1F1' | |
| 4447 | +emoji_flags[CHL]=$'\U1F1E8\U1F1F1' | |
| 4448 | +emoji_flags[chile]=$'\U1F1E8\U1F1F1' | |
| 4449 | +emoji_flags[Cameroon]=$'\U1F1E8\U1F1F2' | |
| 4450 | +emoji_flags[CM]=$'\U1F1E8\U1F1F2' | |
| 4451 | +emoji_flags[CMR]=$'\U1F1E8\U1F1F2' | |
| 4452 | +emoji_flags[cameroon]=$'\U1F1E8\U1F1F2' | |
| 4453 | +emoji_flags[China]=$'\U1F1E8\U1F1F3' | |
| 4454 | +emoji_flags[CN]=$'\U1F1E8\U1F1F3' | |
| 4455 | +emoji_flags[CHN]=$'\U1F1E8\U1F1F3' | |
| 4456 | +emoji_flags[cn]=$'\U1F1E8\U1F1F3' | |
| 4457 | +emoji_flags[Colombia]=$'\U1F1E8\U1F1F4' | |
| 4458 | +emoji_flags[CO]=$'\U1F1E8\U1F1F4' | |
| 4459 | +emoji_flags[COL]=$'\U1F1E8\U1F1F4' | |
| 4460 | +emoji_flags[colombia]=$'\U1F1E8\U1F1F4' | |
| 4461 | +emoji_flags[Clipperton_Island]=$'\U1F1E8\U1F1F5' | |
| 4462 | +emoji_flags[clipperton_island]=$'\U1F1E8\U1F1F5' | |
| 4463 | +emoji_flags[Costa_Rica]=$'\U1F1E8\U1F1F7' | |
| 4464 | +emoji_flags[CR]=$'\U1F1E8\U1F1F7' | |
| 4465 | +emoji_flags[CRI]=$'\U1F1E8\U1F1F7' | |
| 4466 | +emoji_flags[costa_rica]=$'\U1F1E8\U1F1F7' | |
| 4467 | +emoji_flags[Cuba]=$'\U1F1E8\U1F1FA' | |
| 4468 | +emoji_flags[CU]=$'\U1F1E8\U1F1FA' | |
| 4469 | +emoji_flags[CUB]=$'\U1F1E8\U1F1FA' | |
| 4470 | +emoji_flags[cuba]=$'\U1F1E8\U1F1FA' | |
| 4471 | +emoji_flags[Cape_Verde]=$'\U1F1E8\U1F1FB' | |
| 4472 | +emoji_flags[CV]=$'\U1F1E8\U1F1FB' | |
| 4473 | +emoji_flags[CPV]=$'\U1F1E8\U1F1FB' | |
| 4474 | +emoji_flags[cape_verde]=$'\U1F1E8\U1F1FB' | |
| 4475 | +emoji_flags[Curaรงao]=$'\U1F1E8\U1F1FC' | |
| 4476 | +emoji_flags[CW]=$'\U1F1E8\U1F1FC' | |
| 4477 | +emoji_flags[CUW]=$'\U1F1E8\U1F1FC' | |
| 4478 | +emoji_flags[curacao]=$'\U1F1E8\U1F1FC' | |
| 4479 | +emoji_flags[Christmas_Island]=$'\U1F1E8\U1F1FD' | |
| 4480 | +emoji_flags[CX]=$'\U1F1E8\U1F1FD' | |
| 4481 | +emoji_flags[CXR]=$'\U1F1E8\U1F1FD' | |
| 4482 | +emoji_flags[christmas_island]=$'\U1F1E8\U1F1FD' | |
| 4483 | +emoji_flags[Cyprus]=$'\U1F1E8\U1F1FE' | |
| 4484 | +emoji_flags[CY]=$'\U1F1E8\U1F1FE' | |
| 4485 | +emoji_flags[CYP]=$'\U1F1E8\U1F1FE' | |
| 4486 | +emoji_flags[cyprus]=$'\U1F1E8\U1F1FE' | |
| 4487 | +emoji_flags[Czechia]=$'\U1F1E8\U1F1FF' | |
| 4488 | +emoji_flags[CZ]=$'\U1F1E8\U1F1FF' | |
| 4489 | +emoji_flags[CZE]=$'\U1F1E8\U1F1FF' | |
| 4490 | +emoji_flags[czech_republic]=$'\U1F1E8\U1F1FF' | |
| 4491 | +emoji_flags[Germany]=$'\U1F1E9\U1F1EA' | |
| 4492 | +emoji_flags[DE]=$'\U1F1E9\U1F1EA' | |
| 4493 | +emoji_flags[DEU]=$'\U1F1E9\U1F1EA' | |
| 4494 | +emoji_flags[de]=$'\U1F1E9\U1F1EA' | |
| 4495 | +emoji_flags[Diego_Garcia]=$'\U1F1E9\U1F1EC' | |
| 4496 | +emoji_flags[diego_garcia]=$'\U1F1E9\U1F1EC' | |
| 4497 | +emoji_flags[Djibouti]=$'\U1F1E9\U1F1EF' | |
| 4498 | +emoji_flags[DJ]=$'\U1F1E9\U1F1EF' | |
| 4499 | +emoji_flags[DJI]=$'\U1F1E9\U1F1EF' | |
| 4500 | +emoji_flags[djibouti]=$'\U1F1E9\U1F1EF' | |
| 4501 | +emoji_flags[Denmark]=$'\U1F1E9\U1F1F0' | |
| 4502 | +emoji_flags[DK]=$'\U1F1E9\U1F1F0' | |
| 4503 | +emoji_flags[DNK]=$'\U1F1E9\U1F1F0' | |
| 4504 | +emoji_flags[denmark]=$'\U1F1E9\U1F1F0' | |
| 4505 | +emoji_flags[Dominica]=$'\U1F1E9\U1F1F2' | |
| 4506 | +emoji_flags[DM]=$'\U1F1E9\U1F1F2' | |
| 4507 | +emoji_flags[DMA]=$'\U1F1E9\U1F1F2' | |
| 4508 | +emoji_flags[dominica]=$'\U1F1E9\U1F1F2' | |
| 4509 | +emoji_flags[Dominican_Republic]=$'\U1F1E9\U1F1F4' | |
| 4510 | +emoji_flags[DO]=$'\U1F1E9\U1F1F4' | |
| 4511 | +emoji_flags[DOM]=$'\U1F1E9\U1F1F4' | |
| 4512 | +emoji_flags[dominican_republic]=$'\U1F1E9\U1F1F4' | |
| 4513 | +emoji_flags[Algeria]=$'\U1F1E9\U1F1FF' | |
| 4514 | +emoji_flags[DZ]=$'\U1F1E9\U1F1FF' | |
| 4515 | +emoji_flags[DZA]=$'\U1F1E9\U1F1FF' | |
| 4516 | +emoji_flags[algeria]=$'\U1F1E9\U1F1FF' | |
| 4517 | +emoji_flags[Ceuta_and_Melilla]=$'\U1F1EA\U1F1E6' | |
| 4518 | +emoji_flags[ceuta_melilla]=$'\U1F1EA\U1F1E6' | |
| 4519 | +emoji_flags[Ecuador]=$'\U1F1EA\U1F1E8' | |
| 4520 | +emoji_flags[EC]=$'\U1F1EA\U1F1E8' | |
| 4521 | +emoji_flags[ECU]=$'\U1F1EA\U1F1E8' | |
| 4522 | +emoji_flags[ecuador]=$'\U1F1EA\U1F1E8' | |
| 4523 | +emoji_flags[Estonia]=$'\U1F1EA\U1F1EA' | |
| 4524 | +emoji_flags[EE]=$'\U1F1EA\U1F1EA' | |
| 4525 | +emoji_flags[EST]=$'\U1F1EA\U1F1EA' | |
| 4526 | +emoji_flags[estonia]=$'\U1F1EA\U1F1EA' | |
| 4527 | +emoji_flags[Egypt]=$'\U1F1EA\U1F1EC' | |
| 4528 | +emoji_flags[EG]=$'\U1F1EA\U1F1EC' | |
| 4529 | +emoji_flags[EGY]=$'\U1F1EA\U1F1EC' | |
| 4530 | +emoji_flags[egypt]=$'\U1F1EA\U1F1EC' | |
| 4531 | +emoji_flags[Western_Sahara]=$'\U1F1EA\U1F1ED' | |
| 4532 | +emoji_flags[EH]=$'\U1F1EA\U1F1ED' | |
| 4533 | +emoji_flags[ESH]=$'\U1F1EA\U1F1ED' | |
| 4534 | +emoji_flags[western_sahara]=$'\U1F1EA\U1F1ED' | |
| 4535 | +emoji_flags[Eritrea]=$'\U1F1EA\U1F1F7' | |
| 4536 | +emoji_flags[ER]=$'\U1F1EA\U1F1F7' | |
| 4537 | +emoji_flags[ERI]=$'\U1F1EA\U1F1F7' | |
| 4538 | +emoji_flags[eritrea]=$'\U1F1EA\U1F1F7' | |
| 4539 | +emoji_flags[Spain]=$'\U1F1EA\U1F1F8' | |
| 4540 | +emoji_flags[ES]=$'\U1F1EA\U1F1F8' | |
| 4541 | +emoji_flags[ESP]=$'\U1F1EA\U1F1F8' | |
| 4542 | +emoji_flags[es]=$'\U1F1EA\U1F1F8' | |
| 4543 | +emoji_flags[Ethiopia]=$'\U1F1EA\U1F1F9' | |
| 4544 | +emoji_flags[ET]=$'\U1F1EA\U1F1F9' | |
| 4545 | +emoji_flags[ETH]=$'\U1F1EA\U1F1F9' | |
| 4546 | +emoji_flags[ethiopia]=$'\U1F1EA\U1F1F9' | |
| 4547 | +emoji_flags[European_Union]=$'\U1F1EA\U1F1FA' | |
| 4548 | +emoji_flags[eu]=$'\U1F1EA\U1F1FA' | |
| 4549 | +emoji_flags[european_union]=$'\U1F1EA\U1F1FA' | |
| 4550 | +emoji_flags[Finland]=$'\U1F1EB\U1F1EE' | |
| 4551 | +emoji_flags[FI]=$'\U1F1EB\U1F1EE' | |
| 4552 | +emoji_flags[FIN]=$'\U1F1EB\U1F1EE' | |
| 4553 | +emoji_flags[finland]=$'\U1F1EB\U1F1EE' | |
| 4554 | +emoji_flags[Fiji]=$'\U1F1EB\U1F1EF' | |
| 4555 | +emoji_flags[FJ]=$'\U1F1EB\U1F1EF' | |
| 4556 | +emoji_flags[FJI]=$'\U1F1EB\U1F1EF' | |
| 4557 | +emoji_flags[fiji]=$'\U1F1EB\U1F1EF' | |
| 4558 | +emoji_flags[Falkland_Islands]=$'\U1F1EB\U1F1F0' | |
| 4559 | +emoji_flags[FK]=$'\U1F1EB\U1F1F0' | |
| 4560 | +emoji_flags[FLK]=$'\U1F1EB\U1F1F0' | |
| 4561 | +emoji_flags[falkland_islands]=$'\U1F1EB\U1F1F0' | |
| 4562 | +emoji_flags[Micronesia]=$'\U1F1EB\U1F1F2' | |
| 4563 | +emoji_flags[FM]=$'\U1F1EB\U1F1F2' | |
| 4564 | +emoji_flags[FSM]=$'\U1F1EB\U1F1F2' | |
| 4565 | +emoji_flags[micronesia]=$'\U1F1EB\U1F1F2' | |
| 4566 | +emoji_flags[Faroe_Islands]=$'\U1F1EB\U1F1F4' | |
| 4567 | +emoji_flags[FO]=$'\U1F1EB\U1F1F4' | |
| 4568 | +emoji_flags[FRO]=$'\U1F1EB\U1F1F4' | |
| 4569 | +emoji_flags[faroe_islands]=$'\U1F1EB\U1F1F4' | |
| 4570 | +emoji_flags[France]=$'\U1F1EB\U1F1F7' | |
| 4571 | +emoji_flags[FR]=$'\U1F1EB\U1F1F7' | |
| 4572 | +emoji_flags[FRA]=$'\U1F1EB\U1F1F7' | |
| 4573 | +emoji_flags[fr]=$'\U1F1EB\U1F1F7' | |
| 4574 | +emoji_flags[Gabon]=$'\U1F1EC\U1F1E6' | |
| 4575 | +emoji_flags[GA]=$'\U1F1EC\U1F1E6' | |
| 4576 | +emoji_flags[GAB]=$'\U1F1EC\U1F1E6' | |
| 4577 | +emoji_flags[gabon]=$'\U1F1EC\U1F1E6' | |
| 4578 | +emoji_flags[United_Kingdom]=$'\U1F1EC\U1F1E7' | |
| 4579 | +emoji_flags[GB]=$'\U1F1EC\U1F1E7' | |
| 4580 | +emoji_flags[GBR]=$'\U1F1EC\U1F1E7' | |
| 4581 | +emoji_flags[gb]=$'\U1F1EC\U1F1E7' | |
| 4582 | +emoji_flags[uk]=$'\U1F1EC\U1F1E7' | |
| 4583 | +emoji_flags[Grenada]=$'\U1F1EC\U1F1E9' | |
| 4584 | +emoji_flags[GD]=$'\U1F1EC\U1F1E9' | |
| 4585 | +emoji_flags[GRD]=$'\U1F1EC\U1F1E9' | |
| 4586 | +emoji_flags[grenada]=$'\U1F1EC\U1F1E9' | |
| 4587 | +emoji_flags[Georgia]=$'\U1F1EC\U1F1EA' | |
| 4588 | +emoji_flags[GE]=$'\U1F1EC\U1F1EA' | |
| 4589 | +emoji_flags[GEO]=$'\U1F1EC\U1F1EA' | |
| 4590 | +emoji_flags[georgia]=$'\U1F1EC\U1F1EA' | |
| 4591 | +emoji_flags[French_Guiana]=$'\U1F1EC\U1F1EB' | |
| 4592 | +emoji_flags[GF]=$'\U1F1EC\U1F1EB' | |
| 4593 | +emoji_flags[GUF]=$'\U1F1EC\U1F1EB' | |
| 4594 | +emoji_flags[french_guiana]=$'\U1F1EC\U1F1EB' | |
| 4595 | +emoji_flags[Guernsey]=$'\U1F1EC\U1F1EC' | |
| 4596 | +emoji_flags[GG]=$'\U1F1EC\U1F1EC' | |
| 4597 | +emoji_flags[GGY]=$'\U1F1EC\U1F1EC' | |
| 4598 | +emoji_flags[guernsey]=$'\U1F1EC\U1F1EC' | |
| 4599 | +emoji_flags[Ghana]=$'\U1F1EC\U1F1ED' | |
| 4600 | +emoji_flags[GH]=$'\U1F1EC\U1F1ED' | |
| 4601 | +emoji_flags[GHA]=$'\U1F1EC\U1F1ED' | |
| 4602 | +emoji_flags[ghana]=$'\U1F1EC\U1F1ED' | |
| 4603 | +emoji_flags[Gibraltar]=$'\U1F1EC\U1F1EE' | |
| 4604 | +emoji_flags[GI]=$'\U1F1EC\U1F1EE' | |
| 4605 | +emoji_flags[GIB]=$'\U1F1EC\U1F1EE' | |
| 4606 | +emoji_flags[gibraltar]=$'\U1F1EC\U1F1EE' | |
| 4607 | +emoji_flags[Greenland]=$'\U1F1EC\U1F1F1' | |
| 4608 | +emoji_flags[GL]=$'\U1F1EC\U1F1F1' | |
| 4609 | +emoji_flags[GRL]=$'\U1F1EC\U1F1F1' | |
| 4610 | +emoji_flags[greenland]=$'\U1F1EC\U1F1F1' | |
| 4611 | +emoji_flags[Gambia]=$'\U1F1EC\U1F1F2' | |
| 4612 | +emoji_flags[GM]=$'\U1F1EC\U1F1F2' | |
| 4613 | +emoji_flags[GMB]=$'\U1F1EC\U1F1F2' | |
| 4614 | +emoji_flags[gambia]=$'\U1F1EC\U1F1F2' | |
| 4615 | +emoji_flags[Guinea]=$'\U1F1EC\U1F1F3' | |
| 4616 | +emoji_flags[GN]=$'\U1F1EC\U1F1F3' | |
| 4617 | +emoji_flags[GIN]=$'\U1F1EC\U1F1F3' | |
| 4618 | +emoji_flags[guinea]=$'\U1F1EC\U1F1F3' | |
| 4619 | +emoji_flags[Guadeloupe]=$'\U1F1EC\U1F1F5' | |
| 4620 | +emoji_flags[GP]=$'\U1F1EC\U1F1F5' | |
| 4621 | +emoji_flags[GLP]=$'\U1F1EC\U1F1F5' | |
| 4622 | +emoji_flags[guadeloupe]=$'\U1F1EC\U1F1F5' | |
| 4623 | +emoji_flags[Equatorial_Guinea]=$'\U1F1EC\U1F1F6' | |
| 4624 | +emoji_flags[GQ]=$'\U1F1EC\U1F1F6' | |
| 4625 | +emoji_flags[GNQ]=$'\U1F1EC\U1F1F6' | |
| 4626 | +emoji_flags[equatorial_guinea]=$'\U1F1EC\U1F1F6' | |
| 4627 | +emoji_flags[Greece]=$'\U1F1EC\U1F1F7' | |
| 4628 | +emoji_flags[GR]=$'\U1F1EC\U1F1F7' | |
| 4629 | +emoji_flags[GRC]=$'\U1F1EC\U1F1F7' | |
| 4630 | +emoji_flags[greece]=$'\U1F1EC\U1F1F7' | |
| 4631 | +emoji_flags[South_Georgia_and_South_Sandwich_Islands]=$'\U1F1EC\U1F1F8' | |
| 4632 | +emoji_flags[GS]=$'\U1F1EC\U1F1F8' | |
| 4633 | +emoji_flags[SGS]=$'\U1F1EC\U1F1F8' | |
| 4634 | +emoji_flags[south_georgia_south_sandwich_islands]=$'\U1F1EC\U1F1F8' | |
| 4635 | +emoji_flags[Guatemala]=$'\U1F1EC\U1F1F9' | |
| 4636 | +emoji_flags[GT]=$'\U1F1EC\U1F1F9' | |
| 4637 | +emoji_flags[GTM]=$'\U1F1EC\U1F1F9' | |
| 4638 | +emoji_flags[guatemala]=$'\U1F1EC\U1F1F9' | |
| 4639 | +emoji_flags[Guam]=$'\U1F1EC\U1F1FA' | |
| 4640 | +emoji_flags[GU]=$'\U1F1EC\U1F1FA' | |
| 4641 | +emoji_flags[GUM]=$'\U1F1EC\U1F1FA' | |
| 4642 | +emoji_flags[guam]=$'\U1F1EC\U1F1FA' | |
| 4643 | +emoji_flags[Guinea_Bissau]=$'\U1F1EC\U1F1FC' | |
| 4644 | +emoji_flags[GW]=$'\U1F1EC\U1F1FC' | |
| 4645 | +emoji_flags[GNB]=$'\U1F1EC\U1F1FC' | |
| 4646 | +emoji_flags[guinea_bissau]=$'\U1F1EC\U1F1FC' | |
| 4647 | +emoji_flags[Guyana]=$'\U1F1EC\U1F1FE' | |
| 4648 | +emoji_flags[GY]=$'\U1F1EC\U1F1FE' | |
| 4649 | +emoji_flags[GUY]=$'\U1F1EC\U1F1FE' | |
| 4650 | +emoji_flags[guyana]=$'\U1F1EC\U1F1FE' | |
| 4651 | +emoji_flags[Hong_Kong_SAR_China]=$'\U1F1ED\U1F1F0' | |
| 4652 | +emoji_flags[HK]=$'\U1F1ED\U1F1F0' | |
| 4653 | +emoji_flags[HKG]=$'\U1F1ED\U1F1F0' | |
| 4654 | +emoji_flags[hong_kong]=$'\U1F1ED\U1F1F0' | |
| 4655 | +emoji_flags[Heard_and_McDonald_Islands]=$'\U1F1ED\U1F1F2' | |
| 4656 | +emoji_flags[HM]=$'\U1F1ED\U1F1F2' | |
| 4657 | +emoji_flags[HMD]=$'\U1F1ED\U1F1F2' | |
| 4658 | +emoji_flags[heard_mcdonald_islands]=$'\U1F1ED\U1F1F2' | |
| 4659 | +emoji_flags[Honduras]=$'\U1F1ED\U1F1F3' | |
| 4660 | +emoji_flags[HN]=$'\U1F1ED\U1F1F3' | |
| 4661 | +emoji_flags[HND]=$'\U1F1ED\U1F1F3' | |
| 4662 | +emoji_flags[honduras]=$'\U1F1ED\U1F1F3' | |
| 4663 | +emoji_flags[Croatia]=$'\U1F1ED\U1F1F7' | |
| 4664 | +emoji_flags[HR]=$'\U1F1ED\U1F1F7' | |
| 4665 | +emoji_flags[HRV]=$'\U1F1ED\U1F1F7' | |
| 4666 | +emoji_flags[croatia]=$'\U1F1ED\U1F1F7' | |
| 4667 | +emoji_flags[Haiti]=$'\U1F1ED\U1F1F9' | |
| 4668 | +emoji_flags[HT]=$'\U1F1ED\U1F1F9' | |
| 4669 | +emoji_flags[HTI]=$'\U1F1ED\U1F1F9' | |
| 4670 | +emoji_flags[haiti]=$'\U1F1ED\U1F1F9' | |
| 4671 | +emoji_flags[Hungary]=$'\U1F1ED\U1F1FA' | |
| 4672 | +emoji_flags[HU]=$'\U1F1ED\U1F1FA' | |
| 4673 | +emoji_flags[HUN]=$'\U1F1ED\U1F1FA' | |
| 4674 | +emoji_flags[hungary]=$'\U1F1ED\U1F1FA' | |
| 4675 | +emoji_flags[Canary_Islands]=$'\U1F1EE\U1F1E8' | |
| 4676 | +emoji_flags[canary_islands]=$'\U1F1EE\U1F1E8' | |
| 4677 | +emoji_flags[Indonesia]=$'\U1F1EE\U1F1E9' | |
| 4678 | +emoji_flags[ID]=$'\U1F1EE\U1F1E9' | |
| 4679 | +emoji_flags[IDN]=$'\U1F1EE\U1F1E9' | |
| 4680 | +emoji_flags[indonesia]=$'\U1F1EE\U1F1E9' | |
| 4681 | +emoji_flags[Ireland]=$'\U1F1EE\U1F1EA' | |
| 4682 | +emoji_flags[IE]=$'\U1F1EE\U1F1EA' | |
| 4683 | +emoji_flags[IRL]=$'\U1F1EE\U1F1EA' | |
| 4684 | +emoji_flags[ireland]=$'\U1F1EE\U1F1EA' | |
| 4685 | +emoji_flags[Israel]=$'\U1F1EE\U1F1F1' | |
| 4686 | +emoji_flags[IL]=$'\U1F1EE\U1F1F1' | |
| 4687 | +emoji_flags[ISR]=$'\U1F1EE\U1F1F1' | |
| 4688 | +emoji_flags[israel]=$'\U1F1EE\U1F1F1' | |
| 4689 | +emoji_flags[Isle_of_Man]=$'\U1F1EE\U1F1F2' | |
| 4690 | +emoji_flags[IM]=$'\U1F1EE\U1F1F2' | |
| 4691 | +emoji_flags[IMN]=$'\U1F1EE\U1F1F2' | |
| 4692 | +emoji_flags[isle_of_man]=$'\U1F1EE\U1F1F2' | |
| 4693 | +emoji_flags[India]=$'\U1F1EE\U1F1F3' | |
| 4694 | +emoji_flags[IN]=$'\U1F1EE\U1F1F3' | |
| 4695 | +emoji_flags[IND]=$'\U1F1EE\U1F1F3' | |
| 4696 | +emoji_flags[india]=$'\U1F1EE\U1F1F3' | |
| 4697 | +emoji_flags[British_Indian_Ocean_Territory]=$'\U1F1EE\U1F1F4' | |
| 4698 | +emoji_flags[IO]=$'\U1F1EE\U1F1F4' | |
| 4699 | +emoji_flags[IOT]=$'\U1F1EE\U1F1F4' | |
| 4700 | +emoji_flags[british_indian_ocean_territory]=$'\U1F1EE\U1F1F4' | |
| 4701 | +emoji_flags[Iraq]=$'\U1F1EE\U1F1F6' | |
| 4702 | +emoji_flags[IQ]=$'\U1F1EE\U1F1F6' | |
| 4703 | +emoji_flags[IRQ]=$'\U1F1EE\U1F1F6' | |
| 4704 | +emoji_flags[iraq]=$'\U1F1EE\U1F1F6' | |
| 4705 | +emoji_flags[Iran]=$'\U1F1EE\U1F1F7' | |
| 4706 | +emoji_flags[IR]=$'\U1F1EE\U1F1F7' | |
| 4707 | +emoji_flags[IRN]=$'\U1F1EE\U1F1F7' | |
| 4708 | +emoji_flags[iran]=$'\U1F1EE\U1F1F7' | |
| 4709 | +emoji_flags[Iceland]=$'\U1F1EE\U1F1F8' | |
| 4710 | +emoji_flags[IS]=$'\U1F1EE\U1F1F8' | |
| 4711 | +emoji_flags[ISL]=$'\U1F1EE\U1F1F8' | |
| 4712 | +emoji_flags[iceland]=$'\U1F1EE\U1F1F8' | |
| 4713 | +emoji_flags[Italy]=$'\U1F1EE\U1F1F9' | |
| 4714 | +emoji_flags[IT]=$'\U1F1EE\U1F1F9' | |
| 4715 | +emoji_flags[ITA]=$'\U1F1EE\U1F1F9' | |
| 4716 | +emoji_flags[it]=$'\U1F1EE\U1F1F9' | |
| 4717 | +emoji_flags[Jersey]=$'\U1F1EF\U1F1EA' | |
| 4718 | +emoji_flags[JE]=$'\U1F1EF\U1F1EA' | |
| 4719 | +emoji_flags[JEY]=$'\U1F1EF\U1F1EA' | |
| 4720 | +emoji_flags[jersey]=$'\U1F1EF\U1F1EA' | |
| 4721 | +emoji_flags[Jamaica]=$'\U1F1EF\U1F1F2' | |
| 4722 | +emoji_flags[JM]=$'\U1F1EF\U1F1F2' | |
| 4723 | +emoji_flags[JAM]=$'\U1F1EF\U1F1F2' | |
| 4724 | +emoji_flags[jamaica]=$'\U1F1EF\U1F1F2' | |
| 4725 | +emoji_flags[Jordan]=$'\U1F1EF\U1F1F4' | |
| 4726 | +emoji_flags[JO]=$'\U1F1EF\U1F1F4' | |
| 4727 | +emoji_flags[JOR]=$'\U1F1EF\U1F1F4' | |
| 4728 | +emoji_flags[jordan]=$'\U1F1EF\U1F1F4' | |
| 4729 | +emoji_flags[Japan]=$'\U1F1EF\U1F1F5' | |
| 4730 | +emoji_flags[JP]=$'\U1F1EF\U1F1F5' | |
| 4731 | +emoji_flags[JPN]=$'\U1F1EF\U1F1F5' | |
| 4732 | +emoji_flags[jp]=$'\U1F1EF\U1F1F5' | |
| 4733 | +emoji_flags[Kenya]=$'\U1F1F0\U1F1EA' | |
| 4734 | +emoji_flags[KE]=$'\U1F1F0\U1F1EA' | |
| 4735 | +emoji_flags[KEN]=$'\U1F1F0\U1F1EA' | |
| 4736 | +emoji_flags[kenya]=$'\U1F1F0\U1F1EA' | |
| 4737 | +emoji_flags[Kyrgyzstan]=$'\U1F1F0\U1F1EC' | |
| 4738 | +emoji_flags[KG]=$'\U1F1F0\U1F1EC' | |
| 4739 | +emoji_flags[KGZ]=$'\U1F1F0\U1F1EC' | |
| 4740 | +emoji_flags[kyrgyzstan]=$'\U1F1F0\U1F1EC' | |
| 4741 | +emoji_flags[Cambodia]=$'\U1F1F0\U1F1ED' | |
| 4742 | +emoji_flags[KH]=$'\U1F1F0\U1F1ED' | |
| 4743 | +emoji_flags[KHM]=$'\U1F1F0\U1F1ED' | |
| 4744 | +emoji_flags[cambodia]=$'\U1F1F0\U1F1ED' | |
| 4745 | +emoji_flags[Kiribati]=$'\U1F1F0\U1F1EE' | |
| 4746 | +emoji_flags[KI]=$'\U1F1F0\U1F1EE' | |
| 4747 | +emoji_flags[KIR]=$'\U1F1F0\U1F1EE' | |
| 4748 | +emoji_flags[kiribati]=$'\U1F1F0\U1F1EE' | |
| 4749 | +emoji_flags[Comoros]=$'\U1F1F0\U1F1F2' | |
| 4750 | +emoji_flags[KM]=$'\U1F1F0\U1F1F2' | |
| 4751 | +emoji_flags[COM]=$'\U1F1F0\U1F1F2' | |
| 4752 | +emoji_flags[comoros]=$'\U1F1F0\U1F1F2' | |
| 4753 | +emoji_flags[St_Kitts_and_Nevis]=$'\U1F1F0\U1F1F3' | |
| 4754 | +emoji_flags[KN]=$'\U1F1F0\U1F1F3' | |
| 4755 | +emoji_flags[KNA]=$'\U1F1F0\U1F1F3' | |
| 4756 | +emoji_flags[st_kitts_nevis]=$'\U1F1F0\U1F1F3' | |
| 4757 | +emoji_flags[North_Korea]=$'\U1F1F0\U1F1F5' | |
| 4758 | +emoji_flags[KP]=$'\U1F1F0\U1F1F5' | |
| 4759 | +emoji_flags[PRK]=$'\U1F1F0\U1F1F5' | |
| 4760 | +emoji_flags[north_korea]=$'\U1F1F0\U1F1F5' | |
| 4761 | +emoji_flags[South_Korea]=$'\U1F1F0\U1F1F7' | |
| 4762 | +emoji_flags[KR]=$'\U1F1F0\U1F1F7' | |
| 4763 | +emoji_flags[KOR]=$'\U1F1F0\U1F1F7' | |
| 4764 | +emoji_flags[kr]=$'\U1F1F0\U1F1F7' | |
| 4765 | +emoji_flags[Kuwait]=$'\U1F1F0\U1F1FC' | |
| 4766 | +emoji_flags[KW]=$'\U1F1F0\U1F1FC' | |
| 4767 | +emoji_flags[KWT]=$'\U1F1F0\U1F1FC' | |
| 4768 | +emoji_flags[kuwait]=$'\U1F1F0\U1F1FC' | |
| 4769 | +emoji_flags[Cayman_Islands]=$'\U1F1F0\U1F1FE' | |
| 4770 | +emoji_flags[KY]=$'\U1F1F0\U1F1FE' | |
| 4771 | +emoji_flags[CYM]=$'\U1F1F0\U1F1FE' | |
| 4772 | +emoji_flags[cayman_islands]=$'\U1F1F0\U1F1FE' | |
| 4773 | +emoji_flags[Kazakhstan]=$'\U1F1F0\U1F1FF' | |
| 4774 | +emoji_flags[KZ]=$'\U1F1F0\U1F1FF' | |
| 4775 | +emoji_flags[KAZ]=$'\U1F1F0\U1F1FF' | |
| 4776 | +emoji_flags[kazakhstan]=$'\U1F1F0\U1F1FF' | |
| 4777 | +emoji_flags[Laos]=$'\U1F1F1\U1F1E6' | |
| 4778 | +emoji_flags[LA]=$'\U1F1F1\U1F1E6' | |
| 4779 | +emoji_flags[LAO]=$'\U1F1F1\U1F1E6' | |
| 4780 | +emoji_flags[laos]=$'\U1F1F1\U1F1E6' | |
| 4781 | +emoji_flags[Lebanon]=$'\U1F1F1\U1F1E7' | |
| 4782 | +emoji_flags[LB]=$'\U1F1F1\U1F1E7' | |
| 4783 | +emoji_flags[LBN]=$'\U1F1F1\U1F1E7' | |
| 4784 | +emoji_flags[lebanon]=$'\U1F1F1\U1F1E7' | |
| 4785 | +emoji_flags[St_Lucia]=$'\U1F1F1\U1F1E8' | |
| 4786 | +emoji_flags[LC]=$'\U1F1F1\U1F1E8' | |
| 4787 | +emoji_flags[LCA]=$'\U1F1F1\U1F1E8' | |
| 4788 | +emoji_flags[st_lucia]=$'\U1F1F1\U1F1E8' | |
| 4789 | +emoji_flags[Liechtenstein]=$'\U1F1F1\U1F1EE' | |
| 4790 | +emoji_flags[LI]=$'\U1F1F1\U1F1EE' | |
| 4791 | +emoji_flags[LIE]=$'\U1F1F1\U1F1EE' | |
| 4792 | +emoji_flags[liechtenstein]=$'\U1F1F1\U1F1EE' | |
| 4793 | +emoji_flags[Sri_Lanka]=$'\U1F1F1\U1F1F0' | |
| 4794 | +emoji_flags[LK]=$'\U1F1F1\U1F1F0' | |
| 4795 | +emoji_flags[LKA]=$'\U1F1F1\U1F1F0' | |
| 4796 | +emoji_flags[sri_lanka]=$'\U1F1F1\U1F1F0' | |
| 4797 | +emoji_flags[Liberia]=$'\U1F1F1\U1F1F7' | |
| 4798 | +emoji_flags[LR]=$'\U1F1F1\U1F1F7' | |
| 4799 | +emoji_flags[LBR]=$'\U1F1F1\U1F1F7' | |
| 4800 | +emoji_flags[liberia]=$'\U1F1F1\U1F1F7' | |
| 4801 | +emoji_flags[Lesotho]=$'\U1F1F1\U1F1F8' | |
| 4802 | +emoji_flags[LS]=$'\U1F1F1\U1F1F8' | |
| 4803 | +emoji_flags[LSO]=$'\U1F1F1\U1F1F8' | |
| 4804 | +emoji_flags[lesotho]=$'\U1F1F1\U1F1F8' | |
| 4805 | +emoji_flags[Lithuania]=$'\U1F1F1\U1F1F9' | |
| 4806 | +emoji_flags[LT]=$'\U1F1F1\U1F1F9' | |
| 4807 | +emoji_flags[LTU]=$'\U1F1F1\U1F1F9' | |
| 4808 | +emoji_flags[lithuania]=$'\U1F1F1\U1F1F9' | |
| 4809 | +emoji_flags[Luxembourg]=$'\U1F1F1\U1F1FA' | |
| 4810 | +emoji_flags[LU]=$'\U1F1F1\U1F1FA' | |
| 4811 | +emoji_flags[LUX]=$'\U1F1F1\U1F1FA' | |
| 4812 | +emoji_flags[luxembourg]=$'\U1F1F1\U1F1FA' | |
| 4813 | +emoji_flags[Latvia]=$'\U1F1F1\U1F1FB' | |
| 4814 | +emoji_flags[LV]=$'\U1F1F1\U1F1FB' | |
| 4815 | +emoji_flags[LVA]=$'\U1F1F1\U1F1FB' | |
| 4816 | +emoji_flags[latvia]=$'\U1F1F1\U1F1FB' | |
| 4817 | +emoji_flags[Libya]=$'\U1F1F1\U1F1FE' | |
| 4818 | +emoji_flags[LY]=$'\U1F1F1\U1F1FE' | |
| 4819 | +emoji_flags[LBY]=$'\U1F1F1\U1F1FE' | |
| 4820 | +emoji_flags[libya]=$'\U1F1F1\U1F1FE' | |
| 4821 | +emoji_flags[Morocco]=$'\U1F1F2\U1F1E6' | |
| 4822 | +emoji_flags[MA]=$'\U1F1F2\U1F1E6' | |
| 4823 | +emoji_flags[MAR]=$'\U1F1F2\U1F1E6' | |
| 4824 | +emoji_flags[morocco]=$'\U1F1F2\U1F1E6' | |
| 4825 | +emoji_flags[Monaco]=$'\U1F1F2\U1F1E8' | |
| 4826 | +emoji_flags[MC]=$'\U1F1F2\U1F1E8' | |
| 4827 | +emoji_flags[MCO]=$'\U1F1F2\U1F1E8' | |
| 4828 | +emoji_flags[monaco]=$'\U1F1F2\U1F1E8' | |
| 4829 | +emoji_flags[Moldova]=$'\U1F1F2\U1F1E9' | |
| 4830 | +emoji_flags[MD]=$'\U1F1F2\U1F1E9' | |
| 4831 | +emoji_flags[MDA]=$'\U1F1F2\U1F1E9' | |
| 4832 | +emoji_flags[moldova]=$'\U1F1F2\U1F1E9' | |
| 4833 | +emoji_flags[Montenegro]=$'\U1F1F2\U1F1EA' | |
| 4834 | +emoji_flags[ME]=$'\U1F1F2\U1F1EA' | |
| 4835 | +emoji_flags[MNE]=$'\U1F1F2\U1F1EA' | |
| 4836 | +emoji_flags[montenegro]=$'\U1F1F2\U1F1EA' | |
| 4837 | +emoji_flags[St_Martin]=$'\U1F1F2\U1F1EB' | |
| 4838 | +emoji_flags[MF]=$'\U1F1F2\U1F1EB' | |
| 4839 | +emoji_flags[MAF]=$'\U1F1F2\U1F1EB' | |
| 4840 | +emoji_flags[st_martin]=$'\U1F1F2\U1F1EB' | |
| 4841 | +emoji_flags[Madagascar]=$'\U1F1F2\U1F1EC' | |
| 4842 | +emoji_flags[MG]=$'\U1F1F2\U1F1EC' | |
| 4843 | +emoji_flags[MDG]=$'\U1F1F2\U1F1EC' | |
| 4844 | +emoji_flags[madagascar]=$'\U1F1F2\U1F1EC' | |
| 4845 | +emoji_flags[Marshall_Islands]=$'\U1F1F2\U1F1ED' | |
| 4846 | +emoji_flags[MH]=$'\U1F1F2\U1F1ED' | |
| 4847 | +emoji_flags[MHL]=$'\U1F1F2\U1F1ED' | |
| 4848 | +emoji_flags[marshall_islands]=$'\U1F1F2\U1F1ED' | |
| 4849 | +emoji_flags[Macedonia]=$'\U1F1F2\U1F1F0' | |
| 4850 | +emoji_flags[MK]=$'\U1F1F2\U1F1F0' | |
| 4851 | +emoji_flags[MKD]=$'\U1F1F2\U1F1F0' | |
| 4852 | +emoji_flags[macedonia]=$'\U1F1F2\U1F1F0' | |
| 4853 | +emoji_flags[Mali]=$'\U1F1F2\U1F1F1' | |
| 4854 | +emoji_flags[ML]=$'\U1F1F2\U1F1F1' | |
| 4855 | +emoji_flags[MLI]=$'\U1F1F2\U1F1F1' | |
| 4856 | +emoji_flags[mali]=$'\U1F1F2\U1F1F1' | |
| 4857 | +emoji_flags[Myanmar_Burma_]=$'\U1F1F2\U1F1F2' | |
| 4858 | +emoji_flags[MM]=$'\U1F1F2\U1F1F2' | |
| 4859 | +emoji_flags[MMR]=$'\U1F1F2\U1F1F2' | |
| 4860 | +emoji_flags[myanmar]=$'\U1F1F2\U1F1F2' | |
| 4861 | +emoji_flags[Mongolia]=$'\U1F1F2\U1F1F3' | |
| 4862 | +emoji_flags[MN]=$'\U1F1F2\U1F1F3' | |
| 4863 | +emoji_flags[MNG]=$'\U1F1F2\U1F1F3' | |
| 4864 | +emoji_flags[mongolia]=$'\U1F1F2\U1F1F3' | |
| 4865 | +emoji_flags[Macao_SAR_China]=$'\U1F1F2\U1F1F4' | |
| 4866 | +emoji_flags[MO]=$'\U1F1F2\U1F1F4' | |
| 4867 | +emoji_flags[MAC]=$'\U1F1F2\U1F1F4' | |
| 4868 | +emoji_flags[macau]=$'\U1F1F2\U1F1F4' | |
| 4869 | +emoji_flags[Northern_Mariana_Islands]=$'\U1F1F2\U1F1F5' | |
| 4870 | +emoji_flags[MP]=$'\U1F1F2\U1F1F5' | |
| 4871 | +emoji_flags[MNP]=$'\U1F1F2\U1F1F5' | |
| 4872 | +emoji_flags[northern_mariana_islands]=$'\U1F1F2\U1F1F5' | |
| 4873 | +emoji_flags[Martinique]=$'\U1F1F2\U1F1F6' | |
| 4874 | +emoji_flags[MQ]=$'\U1F1F2\U1F1F6' | |
| 4875 | +emoji_flags[MTQ]=$'\U1F1F2\U1F1F6' | |
| 4876 | +emoji_flags[martinique]=$'\U1F1F2\U1F1F6' | |
| 4877 | +emoji_flags[Mauritania]=$'\U1F1F2\U1F1F7' | |
| 4878 | +emoji_flags[MR]=$'\U1F1F2\U1F1F7' | |
| 4879 | +emoji_flags[MRT]=$'\U1F1F2\U1F1F7' | |
| 4880 | +emoji_flags[mauritania]=$'\U1F1F2\U1F1F7' | |
| 4881 | +emoji_flags[Montserrat]=$'\U1F1F2\U1F1F8' | |
| 4882 | +emoji_flags[MS]=$'\U1F1F2\U1F1F8' | |
| 4883 | +emoji_flags[MSR]=$'\U1F1F2\U1F1F8' | |
| 4884 | +emoji_flags[montserrat]=$'\U1F1F2\U1F1F8' | |
| 4885 | +emoji_flags[Malta]=$'\U1F1F2\U1F1F9' | |
| 4886 | +emoji_flags[MT]=$'\U1F1F2\U1F1F9' | |
| 4887 | +emoji_flags[MLT]=$'\U1F1F2\U1F1F9' | |
| 4888 | +emoji_flags[malta]=$'\U1F1F2\U1F1F9' | |
| 4889 | +emoji_flags[Mauritius]=$'\U1F1F2\U1F1FA' | |
| 4890 | +emoji_flags[MU]=$'\U1F1F2\U1F1FA' | |
| 4891 | +emoji_flags[MUS]=$'\U1F1F2\U1F1FA' | |
| 4892 | +emoji_flags[mauritius]=$'\U1F1F2\U1F1FA' | |
| 4893 | +emoji_flags[Maldives]=$'\U1F1F2\U1F1FB' | |
| 4894 | +emoji_flags[MV]=$'\U1F1F2\U1F1FB' | |
| 4895 | +emoji_flags[MDV]=$'\U1F1F2\U1F1FB' | |
| 4896 | +emoji_flags[maldives]=$'\U1F1F2\U1F1FB' | |
| 4897 | +emoji_flags[Malawi]=$'\U1F1F2\U1F1FC' | |
| 4898 | +emoji_flags[MW]=$'\U1F1F2\U1F1FC' | |
| 4899 | +emoji_flags[MWI]=$'\U1F1F2\U1F1FC' | |
| 4900 | +emoji_flags[malawi]=$'\U1F1F2\U1F1FC' | |
| 4901 | +emoji_flags[Mexico]=$'\U1F1F2\U1F1FD' | |
| 4902 | +emoji_flags[MX]=$'\U1F1F2\U1F1FD' | |
| 4903 | +emoji_flags[MEX]=$'\U1F1F2\U1F1FD' | |
| 4904 | +emoji_flags[mexico]=$'\U1F1F2\U1F1FD' | |
| 4905 | +emoji_flags[Malaysia]=$'\U1F1F2\U1F1FE' | |
| 4906 | +emoji_flags[MY]=$'\U1F1F2\U1F1FE' | |
| 4907 | +emoji_flags[MYS]=$'\U1F1F2\U1F1FE' | |
| 4908 | +emoji_flags[malaysia]=$'\U1F1F2\U1F1FE' | |
| 4909 | +emoji_flags[Mozambique]=$'\U1F1F2\U1F1FF' | |
| 4910 | +emoji_flags[MZ]=$'\U1F1F2\U1F1FF' | |
| 4911 | +emoji_flags[MOZ]=$'\U1F1F2\U1F1FF' | |
| 4912 | +emoji_flags[mozambique]=$'\U1F1F2\U1F1FF' | |
| 4913 | +emoji_flags[Namibia]=$'\U1F1F3\U1F1E6' | |
| 4914 | +emoji_flags[NA]=$'\U1F1F3\U1F1E6' | |
| 4915 | +emoji_flags[NAM]=$'\U1F1F3\U1F1E6' | |
| 4916 | +emoji_flags[namibia]=$'\U1F1F3\U1F1E6' | |
| 4917 | +emoji_flags[New_Caledonia]=$'\U1F1F3\U1F1E8' | |
| 4918 | +emoji_flags[NC]=$'\U1F1F3\U1F1E8' | |
| 4919 | +emoji_flags[NCL]=$'\U1F1F3\U1F1E8' | |
| 4920 | +emoji_flags[new_caledonia]=$'\U1F1F3\U1F1E8' | |
| 4921 | +emoji_flags[Niger]=$'\U1F1F3\U1F1EA' | |
| 4922 | +emoji_flags[NE]=$'\U1F1F3\U1F1EA' | |
| 4923 | +emoji_flags[NER]=$'\U1F1F3\U1F1EA' | |
| 4924 | +emoji_flags[niger]=$'\U1F1F3\U1F1EA' | |
| 4925 | +emoji_flags[Norfolk_Island]=$'\U1F1F3\U1F1EB' | |
| 4926 | +emoji_flags[NF]=$'\U1F1F3\U1F1EB' | |
| 4927 | +emoji_flags[NFK]=$'\U1F1F3\U1F1EB' | |
| 4928 | +emoji_flags[norfolk_island]=$'\U1F1F3\U1F1EB' | |
| 4929 | +emoji_flags[Nigeria]=$'\U1F1F3\U1F1EC' | |
| 4930 | +emoji_flags[NG]=$'\U1F1F3\U1F1EC' | |
| 4931 | +emoji_flags[NGA]=$'\U1F1F3\U1F1EC' | |
| 4932 | +emoji_flags[nigeria]=$'\U1F1F3\U1F1EC' | |
| 4933 | +emoji_flags[Nicaragua]=$'\U1F1F3\U1F1EE' | |
| 4934 | +emoji_flags[NI]=$'\U1F1F3\U1F1EE' | |
| 4935 | +emoji_flags[NIC]=$'\U1F1F3\U1F1EE' | |
| 4936 | +emoji_flags[nicaragua]=$'\U1F1F3\U1F1EE' | |
| 4937 | +emoji_flags[Netherlands]=$'\U1F1F3\U1F1F1' | |
| 4938 | +emoji_flags[NL]=$'\U1F1F3\U1F1F1' | |
| 4939 | +emoji_flags[NLD]=$'\U1F1F3\U1F1F1' | |
| 4940 | +emoji_flags[netherlands]=$'\U1F1F3\U1F1F1' | |
| 4941 | +emoji_flags[Norway]=$'\U1F1F3\U1F1F4' | |
| 4942 | +emoji_flags[NO]=$'\U1F1F3\U1F1F4' | |
| 4943 | +emoji_flags[NOR]=$'\U1F1F3\U1F1F4' | |
| 4944 | +emoji_flags[norway]=$'\U1F1F3\U1F1F4' | |
| 4945 | +emoji_flags[Nepal]=$'\U1F1F3\U1F1F5' | |
| 4946 | +emoji_flags[NP]=$'\U1F1F3\U1F1F5' | |
| 4947 | +emoji_flags[NPL]=$'\U1F1F3\U1F1F5' | |
| 4948 | +emoji_flags[nepal]=$'\U1F1F3\U1F1F5' | |
| 4949 | +emoji_flags[Nauru]=$'\U1F1F3\U1F1F7' | |
| 4950 | +emoji_flags[NR]=$'\U1F1F3\U1F1F7' | |
| 4951 | +emoji_flags[NRU]=$'\U1F1F3\U1F1F7' | |
| 4952 | +emoji_flags[nauru]=$'\U1F1F3\U1F1F7' | |
| 4953 | +emoji_flags[Niue]=$'\U1F1F3\U1F1FA' | |
| 4954 | +emoji_flags[NU]=$'\U1F1F3\U1F1FA' | |
| 4955 | +emoji_flags[NIU]=$'\U1F1F3\U1F1FA' | |
| 4956 | +emoji_flags[niue]=$'\U1F1F3\U1F1FA' | |
| 4957 | +emoji_flags[New_Zealand]=$'\U1F1F3\U1F1FF' | |
| 4958 | +emoji_flags[NZ]=$'\U1F1F3\U1F1FF' | |
| 4959 | +emoji_flags[NZL]=$'\U1F1F3\U1F1FF' | |
| 4960 | +emoji_flags[new_zealand]=$'\U1F1F3\U1F1FF' | |
| 4961 | +emoji_flags[Oman]=$'\U1F1F4\U1F1F2' | |
| 4962 | +emoji_flags[OM]=$'\U1F1F4\U1F1F2' | |
| 4963 | +emoji_flags[OMN]=$'\U1F1F4\U1F1F2' | |
| 4964 | +emoji_flags[oman]=$'\U1F1F4\U1F1F2' | |
| 4965 | +emoji_flags[Panama]=$'\U1F1F5\U1F1E6' | |
| 4966 | +emoji_flags[PA]=$'\U1F1F5\U1F1E6' | |
| 4967 | +emoji_flags[PAN]=$'\U1F1F5\U1F1E6' | |
| 4968 | +emoji_flags[panama]=$'\U1F1F5\U1F1E6' | |
| 4969 | +emoji_flags[Peru]=$'\U1F1F5\U1F1EA' | |
| 4970 | +emoji_flags[PE]=$'\U1F1F5\U1F1EA' | |
| 4971 | +emoji_flags[PER]=$'\U1F1F5\U1F1EA' | |
| 4972 | +emoji_flags[peru]=$'\U1F1F5\U1F1EA' | |
| 4973 | +emoji_flags[French_Polynesia]=$'\U1F1F5\U1F1EB' | |
| 4974 | +emoji_flags[PF]=$'\U1F1F5\U1F1EB' | |
| 4975 | +emoji_flags[PYF]=$'\U1F1F5\U1F1EB' | |
| 4976 | +emoji_flags[french_polynesia]=$'\U1F1F5\U1F1EB' | |
| 4977 | +emoji_flags[Papua_New_Guinea]=$'\U1F1F5\U1F1EC' | |
| 4978 | +emoji_flags[PG]=$'\U1F1F5\U1F1EC' | |
| 4979 | +emoji_flags[PNG]=$'\U1F1F5\U1F1EC' | |
| 4980 | +emoji_flags[papua_new_guinea]=$'\U1F1F5\U1F1EC' | |
| 4981 | +emoji_flags[Philippines]=$'\U1F1F5\U1F1ED' | |
| 4982 | +emoji_flags[PH]=$'\U1F1F5\U1F1ED' | |
| 4983 | +emoji_flags[PHL]=$'\U1F1F5\U1F1ED' | |
| 4984 | +emoji_flags[philippines]=$'\U1F1F5\U1F1ED' | |
| 4985 | +emoji_flags[Pakistan]=$'\U1F1F5\U1F1F0' | |
| 4986 | +emoji_flags[PK]=$'\U1F1F5\U1F1F0' | |
| 4987 | +emoji_flags[PAK]=$'\U1F1F5\U1F1F0' | |
| 4988 | +emoji_flags[pakistan]=$'\U1F1F5\U1F1F0' | |
| 4989 | +emoji_flags[Poland]=$'\U1F1F5\U1F1F1' | |
| 4990 | +emoji_flags[PL]=$'\U1F1F5\U1F1F1' | |
| 4991 | +emoji_flags[POL]=$'\U1F1F5\U1F1F1' | |
| 4992 | +emoji_flags[poland]=$'\U1F1F5\U1F1F1' | |
| 4993 | +emoji_flags[St_Pierre_and_Miquelon]=$'\U1F1F5\U1F1F2' | |
| 4994 | +emoji_flags[PM]=$'\U1F1F5\U1F1F2' | |
| 4995 | +emoji_flags[SPM]=$'\U1F1F5\U1F1F2' | |
| 4996 | +emoji_flags[st_pierre_miquelon]=$'\U1F1F5\U1F1F2' | |
| 4997 | +emoji_flags[Pitcairn_Islands]=$'\U1F1F5\U1F1F3' | |
| 4998 | +emoji_flags[PN]=$'\U1F1F5\U1F1F3' | |
| 4999 | +emoji_flags[PCN]=$'\U1F1F5\U1F1F3' | |
| 5000 | +emoji_flags[pitcairn_islands]=$'\U1F1F5\U1F1F3' | |
| 5001 | +emoji_flags[Puerto_Rico]=$'\U1F1F5\U1F1F7' | |
| 5002 | +emoji_flags[PR]=$'\U1F1F5\U1F1F7' | |
| 5003 | +emoji_flags[PRI]=$'\U1F1F5\U1F1F7' | |
| 5004 | +emoji_flags[puerto_rico]=$'\U1F1F5\U1F1F7' | |
| 5005 | +emoji_flags[Palestinian_Territories]=$'\U1F1F5\U1F1F8' | |
| 5006 | +emoji_flags[PS]=$'\U1F1F5\U1F1F8' | |
| 5007 | +emoji_flags[PSE]=$'\U1F1F5\U1F1F8' | |
| 5008 | +emoji_flags[palestinian_territories]=$'\U1F1F5\U1F1F8' | |
| 5009 | +emoji_flags[Portugal]=$'\U1F1F5\U1F1F9' | |
| 5010 | +emoji_flags[PT]=$'\U1F1F5\U1F1F9' | |
| 5011 | +emoji_flags[PRT]=$'\U1F1F5\U1F1F9' | |
| 5012 | +emoji_flags[portugal]=$'\U1F1F5\U1F1F9' | |
| 5013 | +emoji_flags[Palau]=$'\U1F1F5\U1F1FC' | |
| 5014 | +emoji_flags[PW]=$'\U1F1F5\U1F1FC' | |
| 5015 | +emoji_flags[PLW]=$'\U1F1F5\U1F1FC' | |
| 5016 | +emoji_flags[palau]=$'\U1F1F5\U1F1FC' | |
| 5017 | +emoji_flags[Paraguay]=$'\U1F1F5\U1F1FE' | |
| 5018 | +emoji_flags[PY]=$'\U1F1F5\U1F1FE' | |
| 5019 | +emoji_flags[PRY]=$'\U1F1F5\U1F1FE' | |
| 5020 | +emoji_flags[paraguay]=$'\U1F1F5\U1F1FE' | |
| 5021 | +emoji_flags[Qatar]=$'\U1F1F6\U1F1E6' | |
| 5022 | +emoji_flags[QA]=$'\U1F1F6\U1F1E6' | |
| 5023 | +emoji_flags[QAT]=$'\U1F1F6\U1F1E6' | |
| 5024 | +emoji_flags[qatar]=$'\U1F1F6\U1F1E6' | |
| 5025 | +emoji_flags[Rรฉunion]=$'\U1F1F7\U1F1EA' | |
| 5026 | +emoji_flags[RE]=$'\U1F1F7\U1F1EA' | |
| 5027 | +emoji_flags[REU]=$'\U1F1F7\U1F1EA' | |
| 5028 | +emoji_flags[reunion]=$'\U1F1F7\U1F1EA' | |
| 5029 | +emoji_flags[Romania]=$'\U1F1F7\U1F1F4' | |
| 5030 | +emoji_flags[RO]=$'\U1F1F7\U1F1F4' | |
| 5031 | +emoji_flags[ROU]=$'\U1F1F7\U1F1F4' | |
| 5032 | +emoji_flags[romania]=$'\U1F1F7\U1F1F4' | |
| 5033 | +emoji_flags[Serbia]=$'\U1F1F7\U1F1F8' | |
| 5034 | +emoji_flags[RS]=$'\U1F1F7\U1F1F8' | |
| 5035 | +emoji_flags[SRB]=$'\U1F1F7\U1F1F8' | |
| 5036 | +emoji_flags[serbia]=$'\U1F1F7\U1F1F8' | |
| 5037 | +emoji_flags[Russia]=$'\U1F1F7\U1F1FA' | |
| 5038 | +emoji_flags[RU]=$'\U1F1F7\U1F1FA' | |
| 5039 | +emoji_flags[RUS]=$'\U1F1F7\U1F1FA' | |
| 5040 | +emoji_flags[ru]=$'\U1F1F7\U1F1FA' | |
| 5041 | +emoji_flags[Rwanda]=$'\U1F1F7\U1F1FC' | |
| 5042 | +emoji_flags[RW]=$'\U1F1F7\U1F1FC' | |
| 5043 | +emoji_flags[RWA]=$'\U1F1F7\U1F1FC' | |
| 5044 | +emoji_flags[rwanda]=$'\U1F1F7\U1F1FC' | |
| 5045 | +emoji_flags[Saudi_Arabia]=$'\U1F1F8\U1F1E6' | |
| 5046 | +emoji_flags[SA]=$'\U1F1F8\U1F1E6' | |
| 5047 | +emoji_flags[SAU]=$'\U1F1F8\U1F1E6' | |
| 5048 | +emoji_flags[saudi_arabia]=$'\U1F1F8\U1F1E6' | |
| 5049 | +emoji_flags[Solomon_Islands]=$'\U1F1F8\U1F1E7' | |
| 5050 | +emoji_flags[SB]=$'\U1F1F8\U1F1E7' | |
| 5051 | +emoji_flags[SLB]=$'\U1F1F8\U1F1E7' | |
| 5052 | +emoji_flags[solomon_islands]=$'\U1F1F8\U1F1E7' | |
| 5053 | +emoji_flags[Seychelles]=$'\U1F1F8\U1F1E8' | |
| 5054 | +emoji_flags[SC]=$'\U1F1F8\U1F1E8' | |
| 5055 | +emoji_flags[SYC]=$'\U1F1F8\U1F1E8' | |
| 5056 | +emoji_flags[seychelles]=$'\U1F1F8\U1F1E8' | |
| 5057 | +emoji_flags[Sudan]=$'\U1F1F8\U1F1E9' | |
| 5058 | +emoji_flags[SD]=$'\U1F1F8\U1F1E9' | |
| 5059 | +emoji_flags[SDN]=$'\U1F1F8\U1F1E9' | |
| 5060 | +emoji_flags[sudan]=$'\U1F1F8\U1F1E9' | |
| 5061 | +emoji_flags[Sweden]=$'\U1F1F8\U1F1EA' | |
| 5062 | +emoji_flags[SE]=$'\U1F1F8\U1F1EA' | |
| 5063 | +emoji_flags[SWE]=$'\U1F1F8\U1F1EA' | |
| 5064 | +emoji_flags[sweden]=$'\U1F1F8\U1F1EA' | |
| 5065 | +emoji_flags[Singapore]=$'\U1F1F8\U1F1EC' | |
| 5066 | +emoji_flags[SG]=$'\U1F1F8\U1F1EC' | |
| 5067 | +emoji_flags[SGP]=$'\U1F1F8\U1F1EC' | |
| 5068 | +emoji_flags[singapore]=$'\U1F1F8\U1F1EC' | |
| 5069 | +emoji_flags[St_Helena]=$'\U1F1F8\U1F1ED' | |
| 5070 | +emoji_flags[SH]=$'\U1F1F8\U1F1ED' | |
| 5071 | +emoji_flags[SHN]=$'\U1F1F8\U1F1ED' | |
| 5072 | +emoji_flags[st_helena]=$'\U1F1F8\U1F1ED' | |
| 5073 | +emoji_flags[Slovenia]=$'\U1F1F8\U1F1EE' | |
| 5074 | +emoji_flags[SI]=$'\U1F1F8\U1F1EE' | |
| 5075 | +emoji_flags[SVN]=$'\U1F1F8\U1F1EE' | |
| 5076 | +emoji_flags[slovenia]=$'\U1F1F8\U1F1EE' | |
| 5077 | +emoji_flags[Svalbard_and_Jan_Mayen]=$'\U1F1F8\U1F1EF' | |
| 5078 | +emoji_flags[SJ]=$'\U1F1F8\U1F1EF' | |
| 5079 | +emoji_flags[SJM]=$'\U1F1F8\U1F1EF' | |
| 5080 | +emoji_flags[svalbard_jan_mayen]=$'\U1F1F8\U1F1EF' | |
| 5081 | +emoji_flags[Slovakia]=$'\U1F1F8\U1F1F0' | |
| 5082 | +emoji_flags[SK]=$'\U1F1F8\U1F1F0' | |
| 5083 | +emoji_flags[SVK]=$'\U1F1F8\U1F1F0' | |
| 5084 | +emoji_flags[slovakia]=$'\U1F1F8\U1F1F0' | |
| 5085 | +emoji_flags[Sierra_Leone]=$'\U1F1F8\U1F1F1' | |
| 5086 | +emoji_flags[SL]=$'\U1F1F8\U1F1F1' | |
| 5087 | +emoji_flags[SLE]=$'\U1F1F8\U1F1F1' | |
| 5088 | +emoji_flags[sierra_leone]=$'\U1F1F8\U1F1F1' | |
| 5089 | +emoji_flags[San_Marino]=$'\U1F1F8\U1F1F2' | |
| 5090 | +emoji_flags[SM]=$'\U1F1F8\U1F1F2' | |
| 5091 | +emoji_flags[SMR]=$'\U1F1F8\U1F1F2' | |
| 5092 | +emoji_flags[san_marino]=$'\U1F1F8\U1F1F2' | |
| 5093 | +emoji_flags[Senegal]=$'\U1F1F8\U1F1F3' | |
| 5094 | +emoji_flags[SN]=$'\U1F1F8\U1F1F3' | |
| 5095 | +emoji_flags[SEN]=$'\U1F1F8\U1F1F3' | |
| 5096 | +emoji_flags[senegal]=$'\U1F1F8\U1F1F3' | |
| 5097 | +emoji_flags[Somalia]=$'\U1F1F8\U1F1F4' | |
| 5098 | +emoji_flags[SO]=$'\U1F1F8\U1F1F4' | |
| 5099 | +emoji_flags[SOM]=$'\U1F1F8\U1F1F4' | |
| 5100 | +emoji_flags[somalia]=$'\U1F1F8\U1F1F4' | |
| 5101 | +emoji_flags[Suriname]=$'\U1F1F8\U1F1F7' | |
| 5102 | +emoji_flags[SR]=$'\U1F1F8\U1F1F7' | |
| 5103 | +emoji_flags[SUR]=$'\U1F1F8\U1F1F7' | |
| 5104 | +emoji_flags[suriname]=$'\U1F1F8\U1F1F7' | |
| 5105 | +emoji_flags[South_Sudan]=$'\U1F1F8\U1F1F8' | |
| 5106 | +emoji_flags[SS]=$'\U1F1F8\U1F1F8' | |
| 5107 | +emoji_flags[SSD]=$'\U1F1F8\U1F1F8' | |
| 5108 | +emoji_flags[south_sudan]=$'\U1F1F8\U1F1F8' | |
| 5109 | +emoji_flags[Sรฃo_Tomรฉ_and_Prรญncipe]=$'\U1F1F8\U1F1F9' | |
| 5110 | +emoji_flags[sao_tome_principe]=$'\U1F1F8\U1F1F9' | |
| 5111 | +emoji_flags[El_Salvador]=$'\U1F1F8\U1F1FB' | |
| 5112 | +emoji_flags[SV]=$'\U1F1F8\U1F1FB' | |
| 5113 | +emoji_flags[SLV]=$'\U1F1F8\U1F1FB' | |
| 5114 | +emoji_flags[el_salvador]=$'\U1F1F8\U1F1FB' | |
| 5115 | +emoji_flags[Sint_Maarten]=$'\U1F1F8\U1F1FD' | |
| 5116 | +emoji_flags[SX]=$'\U1F1F8\U1F1FD' | |
| 5117 | +emoji_flags[SXM]=$'\U1F1F8\U1F1FD' | |
| 5118 | +emoji_flags[sint_maarten]=$'\U1F1F8\U1F1FD' | |
| 5119 | +emoji_flags[Syria]=$'\U1F1F8\U1F1FE' | |
| 5120 | +emoji_flags[SY]=$'\U1F1F8\U1F1FE' | |
| 5121 | +emoji_flags[SYR]=$'\U1F1F8\U1F1FE' | |
| 5122 | +emoji_flags[syria]=$'\U1F1F8\U1F1FE' | |
| 5123 | +emoji_flags[Eswatini]=$'\U1F1F8\U1F1FF' | |
| 5124 | +emoji_flags[SZ]=$'\U1F1F8\U1F1FF' | |
| 5125 | +emoji_flags[SWZ]=$'\U1F1F8\U1F1FF' | |
| 5126 | +emoji_flags[swaziland]=$'\U1F1F8\U1F1FF' | |
| 5127 | +emoji_flags[Tristan_da_Cunha]=$'\U1F1F9\U1F1E6' | |
| 5128 | +emoji_flags[tristan_da_cunha]=$'\U1F1F9\U1F1E6' | |
| 5129 | +emoji_flags[Turks_and_Caicos_Islands]=$'\U1F1F9\U1F1E8' | |
| 5130 | +emoji_flags[TC]=$'\U1F1F9\U1F1E8' | |
| 5131 | +emoji_flags[TCA]=$'\U1F1F9\U1F1E8' | |
| 5132 | +emoji_flags[turks_caicos_islands]=$'\U1F1F9\U1F1E8' | |
| 5133 | +emoji_flags[Chad]=$'\U1F1F9\U1F1E9' | |
| 5134 | +emoji_flags[TD]=$'\U1F1F9\U1F1E9' | |
| 5135 | +emoji_flags[TCD]=$'\U1F1F9\U1F1E9' | |
| 5136 | +emoji_flags[chad]=$'\U1F1F9\U1F1E9' | |
| 5137 | +emoji_flags[French_Southern_Territories]=$'\U1F1F9\U1F1EB' | |
| 5138 | +emoji_flags[TF]=$'\U1F1F9\U1F1EB' | |
| 5139 | +emoji_flags[ATF]=$'\U1F1F9\U1F1EB' | |
| 5140 | +emoji_flags[french_southern_territories]=$'\U1F1F9\U1F1EB' | |
| 5141 | +emoji_flags[Togo]=$'\U1F1F9\U1F1EC' | |
| 5142 | +emoji_flags[TG]=$'\U1F1F9\U1F1EC' | |
| 5143 | +emoji_flags[TGO]=$'\U1F1F9\U1F1EC' | |
| 5144 | +emoji_flags[togo]=$'\U1F1F9\U1F1EC' | |
| 5145 | +emoji_flags[Thailand]=$'\U1F1F9\U1F1ED' | |
| 5146 | +emoji_flags[TH]=$'\U1F1F9\U1F1ED' | |
| 5147 | +emoji_flags[THA]=$'\U1F1F9\U1F1ED' | |
| 5148 | +emoji_flags[thailand]=$'\U1F1F9\U1F1ED' | |
| 5149 | +emoji_flags[Tajikistan]=$'\U1F1F9\U1F1EF' | |
| 5150 | +emoji_flags[TJ]=$'\U1F1F9\U1F1EF' | |
| 5151 | +emoji_flags[TJK]=$'\U1F1F9\U1F1EF' | |
| 5152 | +emoji_flags[tajikistan]=$'\U1F1F9\U1F1EF' | |
| 5153 | +emoji_flags[Tokelau]=$'\U1F1F9\U1F1F0' | |
| 5154 | +emoji_flags[TK]=$'\U1F1F9\U1F1F0' | |
| 5155 | +emoji_flags[TKL]=$'\U1F1F9\U1F1F0' | |
| 5156 | +emoji_flags[tokelau]=$'\U1F1F9\U1F1F0' | |
| 5157 | +emoji_flags[Timor_Leste]=$'\U1F1F9\U1F1F1' | |
| 5158 | +emoji_flags[TL]=$'\U1F1F9\U1F1F1' | |
| 5159 | +emoji_flags[TLS]=$'\U1F1F9\U1F1F1' | |
| 5160 | +emoji_flags[timor_leste]=$'\U1F1F9\U1F1F1' | |
| 5161 | +emoji_flags[Turkmenistan]=$'\U1F1F9\U1F1F2' | |
| 5162 | +emoji_flags[TM]=$'\U1F1F9\U1F1F2' | |
| 5163 | +emoji_flags[TKM]=$'\U1F1F9\U1F1F2' | |
| 5164 | +emoji_flags[turkmenistan]=$'\U1F1F9\U1F1F2' | |
| 5165 | +emoji_flags[Tunisia]=$'\U1F1F9\U1F1F3' | |
| 5166 | +emoji_flags[TN]=$'\U1F1F9\U1F1F3' | |
| 5167 | +emoji_flags[TUN]=$'\U1F1F9\U1F1F3' | |
| 5168 | +emoji_flags[tunisia]=$'\U1F1F9\U1F1F3' | |
| 5169 | +emoji_flags[Tonga]=$'\U1F1F9\U1F1F4' | |
| 5170 | +emoji_flags[TO]=$'\U1F1F9\U1F1F4' | |
| 5171 | +emoji_flags[TON]=$'\U1F1F9\U1F1F4' | |
| 5172 | +emoji_flags[tonga]=$'\U1F1F9\U1F1F4' | |
| 5173 | +emoji_flags[Turkey]=$'\U1F1F9\U1F1F7' | |
| 5174 | +emoji_flags[TR]=$'\U1F1F9\U1F1F7' | |
| 5175 | +emoji_flags[TUR]=$'\U1F1F9\U1F1F7' | |
| 5176 | +emoji_flags[tr]=$'\U1F1F9\U1F1F7' | |
| 5177 | +emoji_flags[Trinidad_and_Tobago]=$'\U1F1F9\U1F1F9' | |
| 5178 | +emoji_flags[TT]=$'\U1F1F9\U1F1F9' | |
| 5179 | +emoji_flags[TTO]=$'\U1F1F9\U1F1F9' | |
| 5180 | +emoji_flags[trinidad_tobago]=$'\U1F1F9\U1F1F9' | |
| 5181 | +emoji_flags[Tuvalu]=$'\U1F1F9\U1F1FB' | |
| 5182 | +emoji_flags[TV]=$'\U1F1F9\U1F1FB' | |
| 5183 | +emoji_flags[TUV]=$'\U1F1F9\U1F1FB' | |
| 5184 | +emoji_flags[tuvalu]=$'\U1F1F9\U1F1FB' | |
| 5185 | +emoji_flags[Taiwan]=$'\U1F1F9\U1F1FC' | |
| 5186 | +emoji_flags[TW]=$'\U1F1F9\U1F1FC' | |
| 5187 | +emoji_flags[TWN]=$'\U1F1F9\U1F1FC' | |
| 5188 | +emoji_flags[taiwan]=$'\U1F1F9\U1F1FC' | |
| 5189 | +emoji_flags[Tanzania]=$'\U1F1F9\U1F1FF' | |
| 5190 | +emoji_flags[TZ]=$'\U1F1F9\U1F1FF' | |
| 5191 | +emoji_flags[TZA]=$'\U1F1F9\U1F1FF' | |
| 5192 | +emoji_flags[tanzania]=$'\U1F1F9\U1F1FF' | |
| 5193 | +emoji_flags[Ukraine]=$'\U1F1FA\U1F1E6' | |
| 5194 | +emoji_flags[UA]=$'\U1F1FA\U1F1E6' | |
| 5195 | +emoji_flags[UKR]=$'\U1F1FA\U1F1E6' | |
| 5196 | +emoji_flags[ukraine]=$'\U1F1FA\U1F1E6' | |
| 5197 | +emoji_flags[Uganda]=$'\U1F1FA\U1F1EC' | |
| 5198 | +emoji_flags[UG]=$'\U1F1FA\U1F1EC' | |
| 5199 | +emoji_flags[UGA]=$'\U1F1FA\U1F1EC' | |
| 5200 | +emoji_flags[uganda]=$'\U1F1FA\U1F1EC' | |
| 5201 | +emoji_flags[U_S_Outlying_Islands]=$'\U1F1FA\U1F1F2' | |
| 5202 | +emoji_flags[us_outlying_islands]=$'\U1F1FA\U1F1F2' | |
| 5203 | +emoji_flags[United_Nations]=$'\U1F1FA\U1F1F3' | |
| 5204 | +emoji_flags[united_nations]=$'\U1F1FA\U1F1F3' | |
| 5205 | +emoji_flags[United_States]=$'\U1F1FA\U1F1F8' | |
| 5206 | +emoji_flags[US]=$'\U1F1FA\U1F1F8' | |
| 5207 | +emoji_flags[USA]=$'\U1F1FA\U1F1F8' | |
| 5208 | +emoji_flags[us]=$'\U1F1FA\U1F1F8' | |
| 5209 | +emoji_flags[Uruguay]=$'\U1F1FA\U1F1FE' | |
| 5210 | +emoji_flags[UY]=$'\U1F1FA\U1F1FE' | |
| 5211 | +emoji_flags[URY]=$'\U1F1FA\U1F1FE' | |
| 5212 | +emoji_flags[uruguay]=$'\U1F1FA\U1F1FE' | |
| 5213 | +emoji_flags[Uzbekistan]=$'\U1F1FA\U1F1FF' | |
| 5214 | +emoji_flags[UZ]=$'\U1F1FA\U1F1FF' | |
| 5215 | +emoji_flags[UZB]=$'\U1F1FA\U1F1FF' | |
| 5216 | +emoji_flags[uzbekistan]=$'\U1F1FA\U1F1FF' | |
| 5217 | +emoji_flags[Vatican_City]=$'\U1F1FB\U1F1E6' | |
| 5218 | +emoji_flags[VA]=$'\U1F1FB\U1F1E6' | |
| 5219 | +emoji_flags[VAT]=$'\U1F1FB\U1F1E6' | |
| 5220 | +emoji_flags[vatican_city]=$'\U1F1FB\U1F1E6' | |
| 5221 | +emoji_flags[St_Vincent_and_Grenadines]=$'\U1F1FB\U1F1E8' | |
| 5222 | +emoji_flags[VC]=$'\U1F1FB\U1F1E8' | |
| 5223 | +emoji_flags[VCT]=$'\U1F1FB\U1F1E8' | |
| 5224 | +emoji_flags[st_vincent_grenadines]=$'\U1F1FB\U1F1E8' | |
| 5225 | +emoji_flags[Venezuela]=$'\U1F1FB\U1F1EA' | |
| 5226 | +emoji_flags[VE]=$'\U1F1FB\U1F1EA' | |
| 5227 | +emoji_flags[VEN]=$'\U1F1FB\U1F1EA' | |
| 5228 | +emoji_flags[venezuela]=$'\U1F1FB\U1F1EA' | |
| 5229 | +emoji_flags[British_Virgin_Islands]=$'\U1F1FB\U1F1EC' | |
| 5230 | +emoji_flags[VG]=$'\U1F1FB\U1F1EC' | |
| 5231 | +emoji_flags[VGB]=$'\U1F1FB\U1F1EC' | |
| 5232 | +emoji_flags[british_virgin_islands]=$'\U1F1FB\U1F1EC' | |
| 5233 | +emoji_flags[U_S_Virgin_Islands]=$'\U1F1FB\U1F1EE' | |
| 5234 | +emoji_flags[VI]=$'\U1F1FB\U1F1EE' | |
| 5235 | +emoji_flags[VIR]=$'\U1F1FB\U1F1EE' | |
| 5236 | +emoji_flags[us_virgin_islands]=$'\U1F1FB\U1F1EE' | |
| 5237 | +emoji_flags[Vietnam]=$'\U1F1FB\U1F1F3' | |
| 5238 | +emoji_flags[VN]=$'\U1F1FB\U1F1F3' | |
| 5239 | +emoji_flags[VNM]=$'\U1F1FB\U1F1F3' | |
| 5240 | +emoji_flags[vietnam]=$'\U1F1FB\U1F1F3' | |
| 5241 | +emoji_flags[Vanuatu]=$'\U1F1FB\U1F1FA' | |
| 5242 | +emoji_flags[VU]=$'\U1F1FB\U1F1FA' | |
| 5243 | +emoji_flags[VUT]=$'\U1F1FB\U1F1FA' | |
| 5244 | +emoji_flags[vanuatu]=$'\U1F1FB\U1F1FA' | |
| 5245 | +emoji_flags[Wallis_and_Futuna]=$'\U1F1FC\U1F1EB' | |
| 5246 | +emoji_flags[WF]=$'\U1F1FC\U1F1EB' | |
| 5247 | +emoji_flags[WLF]=$'\U1F1FC\U1F1EB' | |
| 5248 | +emoji_flags[wallis_futuna]=$'\U1F1FC\U1F1EB' | |
| 5249 | +emoji_flags[Samoa]=$'\U1F1FC\U1F1F8' | |
| 5250 | +emoji_flags[WS]=$'\U1F1FC\U1F1F8' | |
| 5251 | +emoji_flags[WSM]=$'\U1F1FC\U1F1F8' | |
| 5252 | +emoji_flags[samoa]=$'\U1F1FC\U1F1F8' | |
| 5253 | +emoji_flags[Kosovo]=$'\U1F1FD\U1F1F0' | |
| 5254 | +emoji_flags[XK]=$'\U1F1FD\U1F1F0' | |
| 5255 | +emoji_flags[XKX]=$'\U1F1FD\U1F1F0' | |
| 5256 | +emoji_flags[kosovo]=$'\U1F1FD\U1F1F0' | |
| 5257 | +emoji_flags[Yemen]=$'\U1F1FE\U1F1EA' | |
| 5258 | +emoji_flags[YE]=$'\U1F1FE\U1F1EA' | |
| 5259 | +emoji_flags[YEM]=$'\U1F1FE\U1F1EA' | |
| 5260 | +emoji_flags[yemen]=$'\U1F1FE\U1F1EA' | |
| 5261 | +emoji_flags[Mayotte]=$'\U1F1FE\U1F1F9' | |
| 5262 | +emoji_flags[YT]=$'\U1F1FE\U1F1F9' | |
| 5263 | +emoji_flags[MYT]=$'\U1F1FE\U1F1F9' | |
| 5264 | +emoji_flags[mayotte]=$'\U1F1FE\U1F1F9' | |
| 5265 | +emoji_flags[South_Africa]=$'\U1F1FF\U1F1E6' | |
| 5266 | +emoji_flags[ZA]=$'\U1F1FF\U1F1E6' | |
| 5267 | +emoji_flags[ZAF]=$'\U1F1FF\U1F1E6' | |
| 5268 | +emoji_flags[south_africa]=$'\U1F1FF\U1F1E6' | |
| 5269 | +emoji_flags[Zambia]=$'\U1F1FF\U1F1F2' | |
| 5270 | +emoji_flags[ZM]=$'\U1F1FF\U1F1F2' | |
| 5271 | +emoji_flags[ZMB]=$'\U1F1FF\U1F1F2' | |
| 5272 | +emoji_flags[zambia]=$'\U1F1FF\U1F1F2' | |
| 5273 | +emoji_flags[Zimbabwe]=$'\U1F1FF\U1F1FC' | |
| 5274 | +emoji_flags[ZW]=$'\U1F1FF\U1F1FC' | |
| 5275 | +emoji_flags[ZWE]=$'\U1F1FF\U1F1FC' | |
| 5276 | +emoji_flags[zimbabwe]=$'\U1F1FF\U1F1FC' | |
| 5277 | +emoji_flags[England]=$'\U1F3F4\UE0067\UE0062\UE0065\UE006E\UE0067\UE007F' | |
| 5278 | +emoji_flags[england]=$'\U1F3F4\UE0067\UE0062\UE0065\UE006E\UE0067\UE007F' | |
| 5279 | +emoji_flags[Scotland]=$'\U1F3F4\UE0067\UE0062\UE0073\UE0063\UE0074\UE007F' | |
| 5280 | +emoji_flags[scotland]=$'\U1F3F4\UE0067\UE0062\UE0073\UE0063\UE0074\UE007F' | |
| 5281 | +emoji_flags[Wales]=$'\U1F3F4\UE0067\UE0062\UE0077\UE006C\UE0073\UE007F' | |
| 5282 | +emoji_flags[wales]=$'\U1F3F4\UE0067\UE0062\UE0077\UE006C\UE0073\UE007F' | |
| 5283 | + | |
| 5284 | +emoji_groups[fruits]=" | |
| 5285 | + grapes | |
| 5286 | + melon | |
| 5287 | + watermelon | |
| 5288 | + tangerine | |
| 5289 | + lemon | |
| 5290 | + banana | |
| 5291 | + pineapple | |
| 5292 | + mango | |
| 5293 | + red_apple | |
| 5294 | + green_apple | |
| 5295 | + pear | |
| 5296 | + peach | |
| 5297 | + cherries | |
| 5298 | + strawberry | |
| 5299 | + kiwi_fruit | |
| 5300 | + tomato | |
| 5301 | + coconut | |
| 5302 | +" | |
| 5303 | + | |
| 5304 | +emoji_groups[vehicles]=" | |
| 5305 | + locomotive | |
| 5306 | + railway_car | |
| 5307 | + high_speed_train | |
| 5308 | + bullet_train | |
| 5309 | + bullet_train_1 | |
| 5310 | + metro | |
| 5311 | + light_rail | |
| 5312 | + station | |
| 5313 | + tram | |
| 5314 | + monorail | |
| 5315 | + mountain_railway | |
| 5316 | + tram_car | |
| 5317 | + bus | |
| 5318 | + oncoming_bus | |
| 5319 | + trolleybus | |
| 5320 | + minibus | |
| 5321 | + ambulance | |
| 5322 | + fire_engine | |
| 5323 | + police_car | |
| 5324 | + oncoming_police_car | |
| 5325 | + taxi | |
| 5326 | + oncoming_taxi | |
| 5327 | + automobile | |
| 5328 | + oncoming_automobile | |
| 5329 | + sport_utility_vehicle | |
| 5330 | + delivery_truck | |
| 5331 | + articulated_lorry | |
| 5332 | + tractor | |
| 5333 | + racing_car | |
| 5334 | + motorcycle | |
| 5335 | + motor_scooter | |
| 5336 | + manual_wheelchair | |
| 5337 | + motorized_wheelchair | |
| 5338 | + auto_rickshaw | |
| 5339 | + bicycle | |
| 5340 | + kick_scooter | |
| 5341 | + skateboard | |
| 5342 | + bus_stop | |
| 5343 | + motorway | |
| 5344 | + railway_track | |
| 5345 | + oil_drum | |
| 5346 | + fuel_pump | |
| 5347 | + police_car_light | |
| 5348 | + horizontal_traffic_light | |
| 5349 | + vertical_traffic_light | |
| 5350 | + stop_sign | |
| 5351 | + construction | |
| 5352 | + anchor | |
| 5353 | + sailboat | |
| 5354 | + canoe | |
| 5355 | + speedboat | |
| 5356 | + passenger_ship | |
| 5357 | + ferry | |
| 5358 | + motor_boat | |
| 5359 | + ship | |
| 5360 | + airplane | |
| 5361 | + small_airplane | |
| 5362 | + airplane_departure | |
| 5363 | + airplane_arrival | |
| 5364 | + parachute | |
| 5365 | + seat | |
| 5366 | + helicopter | |
| 5367 | + suspension_railway | |
| 5368 | + mountain_cableway | |
| 5369 | + aerial_tramway | |
| 5370 | + satellite | |
| 5371 | + rocket | |
| 5372 | + flying_saucer | |
| 5373 | + ATM_sign | |
| 5374 | + litter_in_bin_sign | |
| 5375 | + potable_water | |
| 5376 | + wheelchair_symbol | |
| 5377 | + men_s_room | |
| 5378 | + women_s_room | |
| 5379 | + restroom | |
| 5380 | + baby_symbol | |
| 5381 | + water_closet | |
| 5382 | + passport_control | |
| 5383 | + customs | |
| 5384 | + baggage_claim | |
| 5385 | + left_luggage | |
| 5386 | +" | |
| 5387 | + | |
| 5388 | +emoji_groups[hands]=" | |
| 5389 | + waving_hand | |
| 5390 | + waving_hand_light_skin_tone | |
| 5391 | + waving_hand_medium_light_skin_tone | |
| 5392 | + waving_hand_medium_skin_tone | |
| 5393 | + waving_hand_medium_dark_skin_tone | |
| 5394 | + waving_hand_dark_skin_tone | |
| 5395 | + raised_back_of_hand | |
| 5396 | + raised_back_of_hand_light_skin_tone | |
| 5397 | + raised_back_of_hand_medium_light_skin_tone | |
| 5398 | + raised_back_of_hand_medium_skin_tone | |
| 5399 | + raised_back_of_hand_medium_dark_skin_tone | |
| 5400 | + raised_back_of_hand_dark_skin_tone | |
| 5401 | + hand_with_fingers_splayed | |
| 5402 | + hand_with_fingers_splayed_light_skin_tone | |
| 5403 | + hand_with_fingers_splayed_medium_light_skin_tone | |
| 5404 | + hand_with_fingers_splayed_medium_skin_tone | |
| 5405 | + hand_with_fingers_splayed_medium_dark_skin_tone | |
| 5406 | + hand_with_fingers_splayed_dark_skin_tone | |
| 5407 | + raised_hand | |
| 5408 | + raised_hand_light_skin_tone | |
| 5409 | + raised_hand_medium_light_skin_tone | |
| 5410 | + raised_hand_medium_skin_tone | |
| 5411 | + raised_hand_medium_dark_skin_tone | |
| 5412 | + raised_hand_dark_skin_tone | |
| 5413 | + vulcan_salute | |
| 5414 | + vulcan_salute_light_skin_tone | |
| 5415 | + vulcan_salute_medium_light_skin_tone | |
| 5416 | + vulcan_salute_medium_skin_tone | |
| 5417 | + vulcan_salute_medium_dark_skin_tone | |
| 5418 | + vulcan_salute_dark_skin_tone | |
| 5419 | + OK_hand | |
| 5420 | + OK_hand_light_skin_tone | |
| 5421 | + OK_hand_medium_light_skin_tone | |
| 5422 | + OK_hand_medium_skin_tone | |
| 5423 | + OK_hand_medium_dark_skin_tone | |
| 5424 | + OK_hand_dark_skin_tone | |
| 5425 | + pinching_hand | |
| 5426 | + pinching_hand_light_skin_tone | |
| 5427 | + pinching_hand_medium_light_skin_tone | |
| 5428 | + pinching_hand_medium_skin_tone | |
| 5429 | + pinching_hand_medium_dark_skin_tone | |
| 5430 | + pinching_hand_dark_skin_tone | |
| 5431 | + victory_hand | |
| 5432 | + victory_hand_light_skin_tone | |
| 5433 | + victory_hand_medium_light_skin_tone | |
| 5434 | + victory_hand_medium_skin_tone | |
| 5435 | + victory_hand_medium_dark_skin_tone | |
| 5436 | + victory_hand_dark_skin_tone | |
| 5437 | + crossed_fingers | |
| 5438 | + crossed_fingers_light_skin_tone | |
| 5439 | + crossed_fingers_medium_light_skin_tone | |
| 5440 | + crossed_fingers_medium_skin_tone | |
| 5441 | + crossed_fingers_medium_dark_skin_tone | |
| 5442 | + crossed_fingers_dark_skin_tone | |
| 5443 | + love_you_gesture | |
| 5444 | + love_you_gesture_light_skin_tone | |
| 5445 | + love_you_gesture_medium_light_skin_tone | |
| 5446 | + love_you_gesture_medium_skin_tone | |
| 5447 | + love_you_gesture_medium_dark_skin_tone | |
| 5448 | + love_you_gesture_dark_skin_tone | |
| 5449 | + sign_of_the_horns | |
| 5450 | + sign_of_the_horns_light_skin_tone | |
| 5451 | + sign_of_the_horns_medium_light_skin_tone | |
| 5452 | + sign_of_the_horns_medium_skin_tone | |
| 5453 | + sign_of_the_horns_medium_dark_skin_tone | |
| 5454 | + sign_of_the_horns_dark_skin_tone | |
| 5455 | + call_me_hand | |
| 5456 | + call_me_hand_light_skin_tone | |
| 5457 | + call_me_hand_medium_light_skin_tone | |
| 5458 | + call_me_hand_medium_skin_tone | |
| 5459 | + call_me_hand_medium_dark_skin_tone | |
| 5460 | + call_me_hand_dark_skin_tone | |
| 5461 | + backhand_index_pointing_left | |
| 5462 | + backhand_index_pointing_left_light_skin_tone | |
| 5463 | + backhand_index_pointing_left_medium_light_skin_tone | |
| 5464 | + backhand_index_pointing_left_medium_skin_tone | |
| 5465 | + backhand_index_pointing_left_medium_dark_skin_tone | |
| 5466 | + backhand_index_pointing_left_dark_skin_tone | |
| 5467 | + backhand_index_pointing_right | |
| 5468 | + backhand_index_pointing_right_light_skin_tone | |
| 5469 | + backhand_index_pointing_right_medium_light_skin_tone | |
| 5470 | + backhand_index_pointing_right_medium_skin_tone | |
| 5471 | + backhand_index_pointing_right_medium_dark_skin_tone | |
| 5472 | + backhand_index_pointing_right_dark_skin_tone | |
| 5473 | + backhand_index_pointing_up | |
| 5474 | + backhand_index_pointing_up_light_skin_tone | |
| 5475 | + backhand_index_pointing_up_medium_light_skin_tone | |
| 5476 | + backhand_index_pointing_up_medium_skin_tone | |
| 5477 | + backhand_index_pointing_up_medium_dark_skin_tone | |
| 5478 | + backhand_index_pointing_up_dark_skin_tone | |
| 5479 | + middle_finger | |
| 5480 | + middle_finger_light_skin_tone | |
| 5481 | + middle_finger_medium_light_skin_tone | |
| 5482 | + middle_finger_medium_skin_tone | |
| 5483 | + middle_finger_medium_dark_skin_tone | |
| 5484 | + middle_finger_dark_skin_tone | |
| 5485 | + backhand_index_pointing_down | |
| 5486 | + backhand_index_pointing_down_light_skin_tone | |
| 5487 | + backhand_index_pointing_down_medium_light_skin_tone | |
| 5488 | + backhand_index_pointing_down_medium_skin_tone | |
| 5489 | + backhand_index_pointing_down_medium_dark_skin_tone | |
| 5490 | + backhand_index_pointing_down_dark_skin_tone | |
| 5491 | + index_pointing_up | |
| 5492 | + index_pointing_up_light_skin_tone | |
| 5493 | + index_pointing_up_medium_light_skin_tone | |
| 5494 | + index_pointing_up_medium_skin_tone | |
| 5495 | + index_pointing_up_medium_dark_skin_tone | |
| 5496 | + index_pointing_up_dark_skin_tone | |
| 5497 | + thumbs_up | |
| 5498 | + thumbs_up_light_skin_tone | |
| 5499 | + thumbs_up_medium_light_skin_tone | |
| 5500 | + thumbs_up_medium_skin_tone | |
| 5501 | + thumbs_up_medium_dark_skin_tone | |
| 5502 | + thumbs_up_dark_skin_tone | |
| 5503 | + thumbs_down | |
| 5504 | + thumbs_down_light_skin_tone | |
| 5505 | + thumbs_down_medium_light_skin_tone | |
| 5506 | + thumbs_down_medium_skin_tone | |
| 5507 | + thumbs_down_medium_dark_skin_tone | |
| 5508 | + thumbs_down_dark_skin_tone | |
| 5509 | + raised_fist | |
| 5510 | + raised_fist_light_skin_tone | |
| 5511 | + raised_fist_medium_light_skin_tone | |
| 5512 | + raised_fist_medium_skin_tone | |
| 5513 | + raised_fist_medium_dark_skin_tone | |
| 5514 | + raised_fist_dark_skin_tone | |
| 5515 | + oncoming_fist | |
| 5516 | + oncoming_fist_light_skin_tone | |
| 5517 | + oncoming_fist_medium_light_skin_tone | |
| 5518 | + oncoming_fist_medium_skin_tone | |
| 5519 | + oncoming_fist_medium_dark_skin_tone | |
| 5520 | + oncoming_fist_dark_skin_tone | |
| 5521 | + left_facing_fist | |
| 5522 | + left_facing_fist_light_skin_tone | |
| 5523 | + left_facing_fist_medium_light_skin_tone | |
| 5524 | + left_facing_fist_medium_skin_tone | |
| 5525 | + left_facing_fist_medium_dark_skin_tone | |
| 5526 | + left_facing_fist_dark_skin_tone | |
| 5527 | + right_facing_fist | |
| 5528 | + right_facing_fist_light_skin_tone | |
| 5529 | + right_facing_fist_medium_light_skin_tone | |
| 5530 | + right_facing_fist_medium_skin_tone | |
| 5531 | + right_facing_fist_medium_dark_skin_tone | |
| 5532 | + right_facing_fist_dark_skin_tone | |
| 5533 | + writing_hand | |
| 5534 | + writing_hand_light_skin_tone | |
| 5535 | + writing_hand_medium_light_skin_tone | |
| 5536 | + writing_hand_medium_skin_tone | |
| 5537 | + writing_hand_medium_dark_skin_tone | |
| 5538 | + writing_hand_dark_skin_tone | |
| 5539 | + nail_polish | |
| 5540 | + nail_polish_light_skin_tone | |
| 5541 | + nail_polish_medium_light_skin_tone | |
| 5542 | + nail_polish_medium_skin_tone | |
| 5543 | + nail_polish_medium_dark_skin_tone | |
| 5544 | + nail_polish_dark_skin_tone | |
| 5545 | + selfie | |
| 5546 | + selfie_light_skin_tone | |
| 5547 | + selfie_medium_light_skin_tone | |
| 5548 | + selfie_medium_skin_tone | |
| 5549 | + selfie_medium_dark_skin_tone | |
| 5550 | + selfie_dark_skin_tone | |
| 5551 | +" | |
| 5552 | + | |
| 5553 | +emoji_groups[people]=" | |
| 5554 | + person_frowning | |
| 5555 | + person_frowning_light_skin_tone | |
| 5556 | + person_frowning_medium_light_skin_tone | |
| 5557 | + person_frowning_medium_skin_tone | |
| 5558 | + person_frowning_medium_dark_skin_tone | |
| 5559 | + person_frowning_dark_skin_tone | |
| 5560 | + man_frowning | |
| 5561 | + man_frowning_light_skin_tone | |
| 5562 | + man_frowning_medium_light_skin_tone | |
| 5563 | + man_frowning_medium_skin_tone | |
| 5564 | + man_frowning_medium_dark_skin_tone | |
| 5565 | + man_frowning_dark_skin_tone | |
| 5566 | + woman_frowning | |
| 5567 | + woman_frowning_light_skin_tone | |
| 5568 | + woman_frowning_medium_light_skin_tone | |
| 5569 | + woman_frowning_medium_skin_tone | |
| 5570 | + woman_frowning_medium_dark_skin_tone | |
| 5571 | + woman_frowning_dark_skin_tone | |
| 5572 | + person_pouting | |
| 5573 | + person_pouting_light_skin_tone | |
| 5574 | + person_pouting_medium_light_skin_tone | |
| 5575 | + person_pouting_medium_skin_tone | |
| 5576 | + person_pouting_medium_dark_skin_tone | |
| 5577 | + person_pouting_dark_skin_tone | |
| 5578 | + man_pouting | |
| 5579 | + man_pouting_light_skin_tone | |
| 5580 | + man_pouting_medium_light_skin_tone | |
| 5581 | + man_pouting_medium_skin_tone | |
| 5582 | + man_pouting_medium_dark_skin_tone | |
| 5583 | + man_pouting_dark_skin_tone | |
| 5584 | + woman_pouting | |
| 5585 | + woman_pouting_light_skin_tone | |
| 5586 | + woman_pouting_medium_light_skin_tone | |
| 5587 | + woman_pouting_medium_skin_tone | |
| 5588 | + woman_pouting_medium_dark_skin_tone | |
| 5589 | + woman_pouting_dark_skin_tone | |
| 5590 | + person_gesturing_NO | |
| 5591 | + person_gesturing_NO_light_skin_tone | |
| 5592 | + person_gesturing_NO_medium_light_skin_tone | |
| 5593 | + person_gesturing_NO_medium_skin_tone | |
| 5594 | + person_gesturing_NO_medium_dark_skin_tone | |
| 5595 | + person_gesturing_NO_dark_skin_tone | |
| 5596 | + man_gesturing_NO | |
| 5597 | + man_gesturing_NO_light_skin_tone | |
| 5598 | + man_gesturing_NO_medium_light_skin_tone | |
| 5599 | + man_gesturing_NO_medium_skin_tone | |
| 5600 | + man_gesturing_NO_medium_dark_skin_tone | |
| 5601 | + man_gesturing_NO_dark_skin_tone | |
| 5602 | + woman_gesturing_NO | |
| 5603 | + woman_gesturing_NO_light_skin_tone | |
| 5604 | + woman_gesturing_NO_medium_light_skin_tone | |
| 5605 | + woman_gesturing_NO_medium_skin_tone | |
| 5606 | + woman_gesturing_NO_medium_dark_skin_tone | |
| 5607 | + woman_gesturing_NO_dark_skin_tone | |
| 5608 | + person_gesturing_OK | |
| 5609 | + person_gesturing_OK_light_skin_tone | |
| 5610 | + person_gesturing_OK_medium_light_skin_tone | |
| 5611 | + person_gesturing_OK_medium_skin_tone | |
| 5612 | + person_gesturing_OK_medium_dark_skin_tone | |
| 5613 | + person_gesturing_OK_dark_skin_tone | |
| 5614 | + man_gesturing_OK | |
| 5615 | + man_gesturing_OK_light_skin_tone | |
| 5616 | + man_gesturing_OK_medium_light_skin_tone | |
| 5617 | + man_gesturing_OK_medium_skin_tone | |
| 5618 | + man_gesturing_OK_medium_dark_skin_tone | |
| 5619 | + man_gesturing_OK_dark_skin_tone | |
| 5620 | + woman_gesturing_OK | |
| 5621 | + woman_gesturing_OK_light_skin_tone | |
| 5622 | + woman_gesturing_OK_medium_light_skin_tone | |
| 5623 | + woman_gesturing_OK_medium_skin_tone | |
| 5624 | + woman_gesturing_OK_medium_dark_skin_tone | |
| 5625 | + woman_gesturing_OK_dark_skin_tone | |
| 5626 | + person_tipping_hand | |
| 5627 | + person_tipping_hand_light_skin_tone | |
| 5628 | + person_tipping_hand_medium_light_skin_tone | |
| 5629 | + person_tipping_hand_medium_skin_tone | |
| 5630 | + person_tipping_hand_medium_dark_skin_tone | |
| 5631 | + person_tipping_hand_dark_skin_tone | |
| 5632 | + man_tipping_hand | |
| 5633 | + man_tipping_hand_light_skin_tone | |
| 5634 | + man_tipping_hand_medium_light_skin_tone | |
| 5635 | + man_tipping_hand_medium_skin_tone | |
| 5636 | + man_tipping_hand_medium_dark_skin_tone | |
| 5637 | + man_tipping_hand_dark_skin_tone | |
| 5638 | + woman_tipping_hand | |
| 5639 | + woman_tipping_hand_light_skin_tone | |
| 5640 | + woman_tipping_hand_medium_light_skin_tone | |
| 5641 | + woman_tipping_hand_medium_skin_tone | |
| 5642 | + woman_tipping_hand_medium_dark_skin_tone | |
| 5643 | + woman_tipping_hand_dark_skin_tone | |
| 5644 | + person_raising_hand | |
| 5645 | + person_raising_hand_light_skin_tone | |
| 5646 | + person_raising_hand_medium_light_skin_tone | |
| 5647 | + person_raising_hand_medium_skin_tone | |
| 5648 | + person_raising_hand_medium_dark_skin_tone | |
| 5649 | + person_raising_hand_dark_skin_tone | |
| 5650 | + man_raising_hand | |
| 5651 | + man_raising_hand_light_skin_tone | |
| 5652 | + man_raising_hand_medium_light_skin_tone | |
| 5653 | + man_raising_hand_medium_skin_tone | |
| 5654 | + man_raising_hand_medium_dark_skin_tone | |
| 5655 | + man_raising_hand_dark_skin_tone | |
| 5656 | + woman_raising_hand | |
| 5657 | + woman_raising_hand_light_skin_tone | |
| 5658 | + woman_raising_hand_medium_light_skin_tone | |
| 5659 | + woman_raising_hand_medium_skin_tone | |
| 5660 | + woman_raising_hand_medium_dark_skin_tone | |
| 5661 | + woman_raising_hand_dark_skin_tone | |
| 5662 | + deaf_person | |
| 5663 | + deaf_person_light_skin_tone | |
| 5664 | + deaf_person_medium_light_skin_tone | |
| 5665 | + deaf_person_medium_skin_tone | |
| 5666 | + deaf_person_medium_dark_skin_tone | |
| 5667 | + deaf_person_dark_skin_tone | |
| 5668 | + deaf_man | |
| 5669 | + deaf_man_light_skin_tone | |
| 5670 | + deaf_man_medium_light_skin_tone | |
| 5671 | + deaf_man_medium_skin_tone | |
| 5672 | + deaf_man_medium_dark_skin_tone | |
| 5673 | + deaf_man_dark_skin_tone | |
| 5674 | + deaf_woman | |
| 5675 | + deaf_woman_light_skin_tone | |
| 5676 | + deaf_woman_medium_light_skin_tone | |
| 5677 | + deaf_woman_medium_skin_tone | |
| 5678 | + deaf_woman_medium_dark_skin_tone | |
| 5679 | + deaf_woman_dark_skin_tone | |
| 5680 | + person_bowing | |
| 5681 | + person_bowing_light_skin_tone | |
| 5682 | + person_bowing_medium_light_skin_tone | |
| 5683 | + person_bowing_medium_skin_tone | |
| 5684 | + person_bowing_medium_dark_skin_tone | |
| 5685 | + person_bowing_dark_skin_tone | |
| 5686 | + man_bowing | |
| 5687 | + man_bowing_light_skin_tone | |
| 5688 | + man_bowing_medium_light_skin_tone | |
| 5689 | + man_bowing_medium_skin_tone | |
| 5690 | + man_bowing_medium_dark_skin_tone | |
| 5691 | + man_bowing_dark_skin_tone | |
| 5692 | + woman_bowing | |
| 5693 | + woman_bowing_light_skin_tone | |
| 5694 | + woman_bowing_medium_light_skin_tone | |
| 5695 | + woman_bowing_medium_skin_tone | |
| 5696 | + woman_bowing_medium_dark_skin_tone | |
| 5697 | + woman_bowing_dark_skin_tone | |
| 5698 | + person_facepalming | |
| 5699 | + person_facepalming_light_skin_tone | |
| 5700 | + person_facepalming_medium_light_skin_tone | |
| 5701 | + person_facepalming_medium_skin_tone | |
| 5702 | + person_facepalming_medium_dark_skin_tone | |
| 5703 | + person_facepalming_dark_skin_tone | |
| 5704 | + man_facepalming | |
| 5705 | + man_facepalming_light_skin_tone | |
| 5706 | + man_facepalming_medium_light_skin_tone | |
| 5707 | + man_facepalming_medium_skin_tone | |
| 5708 | + man_facepalming_medium_dark_skin_tone | |
| 5709 | + man_facepalming_dark_skin_tone | |
| 5710 | + woman_facepalming | |
| 5711 | + woman_facepalming_light_skin_tone | |
| 5712 | + woman_facepalming_medium_light_skin_tone | |
| 5713 | + woman_facepalming_medium_skin_tone | |
| 5714 | + woman_facepalming_medium_dark_skin_tone | |
| 5715 | + woman_facepalming_dark_skin_tone | |
| 5716 | + person_shrugging | |
| 5717 | + person_shrugging_light_skin_tone | |
| 5718 | + person_shrugging_medium_light_skin_tone | |
| 5719 | + person_shrugging_medium_skin_tone | |
| 5720 | + person_shrugging_medium_dark_skin_tone | |
| 5721 | + person_shrugging_dark_skin_tone | |
| 5722 | + man_shrugging | |
| 5723 | + man_shrugging_light_skin_tone | |
| 5724 | + man_shrugging_medium_light_skin_tone | |
| 5725 | + man_shrugging_medium_skin_tone | |
| 5726 | + man_shrugging_medium_dark_skin_tone | |
| 5727 | + man_shrugging_dark_skin_tone | |
| 5728 | + woman_shrugging | |
| 5729 | + woman_shrugging_light_skin_tone | |
| 5730 | + woman_shrugging_medium_light_skin_tone | |
| 5731 | + woman_shrugging_medium_skin_tone | |
| 5732 | + woman_shrugging_medium_dark_skin_tone | |
| 5733 | + woman_shrugging_dark_skin_tone | |
| 5734 | + man_health_worker | |
| 5735 | + man_health_worker_light_skin_tone | |
| 5736 | + man_health_worker_medium_light_skin_tone | |
| 5737 | + man_health_worker_medium_skin_tone | |
| 5738 | + man_health_worker_medium_dark_skin_tone | |
| 5739 | + man_health_worker_dark_skin_tone | |
| 5740 | + woman_health_worker | |
| 5741 | + woman_health_worker_light_skin_tone | |
| 5742 | + woman_health_worker_medium_light_skin_tone | |
| 5743 | + woman_health_worker_medium_skin_tone | |
| 5744 | + woman_health_worker_medium_dark_skin_tone | |
| 5745 | + woman_health_worker_dark_skin_tone | |
| 5746 | + man_student | |
| 5747 | + man_student_light_skin_tone | |
| 5748 | + man_student_medium_light_skin_tone | |
| 5749 | + man_student_medium_skin_tone | |
| 5750 | + man_student_medium_dark_skin_tone | |
| 5751 | + man_student_dark_skin_tone | |
| 5752 | + woman_student | |
| 5753 | + woman_student_light_skin_tone | |
| 5754 | + woman_student_medium_light_skin_tone | |
| 5755 | + woman_student_medium_skin_tone | |
| 5756 | + woman_student_medium_dark_skin_tone | |
| 5757 | + woman_student_dark_skin_tone | |
| 5758 | + man_teacher | |
| 5759 | + man_teacher_light_skin_tone | |
| 5760 | + man_teacher_medium_light_skin_tone | |
| 5761 | + man_teacher_medium_skin_tone | |
| 5762 | + man_teacher_medium_dark_skin_tone | |
| 5763 | + man_teacher_dark_skin_tone | |
| 5764 | + woman_teacher | |
| 5765 | + woman_teacher_light_skin_tone | |
| 5766 | + woman_teacher_medium_light_skin_tone | |
| 5767 | + woman_teacher_medium_skin_tone | |
| 5768 | + woman_teacher_medium_dark_skin_tone | |
| 5769 | + woman_teacher_dark_skin_tone | |
| 5770 | + man_judge | |
| 5771 | + man_judge_light_skin_tone | |
| 5772 | + man_judge_medium_light_skin_tone | |
| 5773 | + man_judge_medium_skin_tone | |
| 5774 | + man_judge_medium_dark_skin_tone | |
| 5775 | + man_judge_dark_skin_tone | |
| 5776 | + woman_judge | |
| 5777 | + woman_judge_light_skin_tone | |
| 5778 | + woman_judge_medium_light_skin_tone | |
| 5779 | + woman_judge_medium_skin_tone | |
| 5780 | + woman_judge_medium_dark_skin_tone | |
| 5781 | + woman_judge_dark_skin_tone | |
| 5782 | + man_farmer | |
| 5783 | + man_farmer_light_skin_tone | |
| 5784 | + man_farmer_medium_light_skin_tone | |
| 5785 | + man_farmer_medium_skin_tone | |
| 5786 | + man_farmer_medium_dark_skin_tone | |
| 5787 | + man_farmer_dark_skin_tone | |
| 5788 | + woman_farmer | |
| 5789 | + woman_farmer_light_skin_tone | |
| 5790 | + woman_farmer_medium_light_skin_tone | |
| 5791 | + woman_farmer_medium_skin_tone | |
| 5792 | + woman_farmer_medium_dark_skin_tone | |
| 5793 | + woman_farmer_dark_skin_tone | |
| 5794 | + man_cook | |
| 5795 | + man_cook_light_skin_tone | |
| 5796 | + man_cook_medium_light_skin_tone | |
| 5797 | + man_cook_medium_skin_tone | |
| 5798 | + man_cook_medium_dark_skin_tone | |
| 5799 | + man_cook_dark_skin_tone | |
| 5800 | + woman_cook | |
| 5801 | + woman_cook_light_skin_tone | |
| 5802 | + woman_cook_medium_light_skin_tone | |
| 5803 | + woman_cook_medium_skin_tone | |
| 5804 | + woman_cook_medium_dark_skin_tone | |
| 5805 | + woman_cook_dark_skin_tone | |
| 5806 | + man_mechanic | |
| 5807 | + man_mechanic_light_skin_tone | |
| 5808 | + man_mechanic_medium_light_skin_tone | |
| 5809 | + man_mechanic_medium_skin_tone | |
| 5810 | + man_mechanic_medium_dark_skin_tone | |
| 5811 | + man_mechanic_dark_skin_tone | |
| 5812 | + woman_mechanic | |
| 5813 | + woman_mechanic_light_skin_tone | |
| 5814 | + woman_mechanic_medium_light_skin_tone | |
| 5815 | + woman_mechanic_medium_skin_tone | |
| 5816 | + woman_mechanic_medium_dark_skin_tone | |
| 5817 | + woman_mechanic_dark_skin_tone | |
| 5818 | + man_factory_worker | |
| 5819 | + man_factory_worker_light_skin_tone | |
| 5820 | + man_factory_worker_medium_light_skin_tone | |
| 5821 | + man_factory_worker_medium_skin_tone | |
| 5822 | + man_factory_worker_medium_dark_skin_tone | |
| 5823 | + man_factory_worker_dark_skin_tone | |
| 5824 | + woman_factory_worker | |
| 5825 | + woman_factory_worker_light_skin_tone | |
| 5826 | + woman_factory_worker_medium_light_skin_tone | |
| 5827 | + woman_factory_worker_medium_skin_tone | |
| 5828 | + woman_factory_worker_medium_dark_skin_tone | |
| 5829 | + woman_factory_worker_dark_skin_tone | |
| 5830 | + man_office_worker | |
| 5831 | + man_office_worker_light_skin_tone | |
| 5832 | + man_office_worker_medium_light_skin_tone | |
| 5833 | + man_office_worker_medium_skin_tone | |
| 5834 | + man_office_worker_medium_dark_skin_tone | |
| 5835 | + man_office_worker_dark_skin_tone | |
| 5836 | + woman_office_worker | |
| 5837 | + woman_office_worker_light_skin_tone | |
| 5838 | + woman_office_worker_medium_light_skin_tone | |
| 5839 | + woman_office_worker_medium_skin_tone | |
| 5840 | + woman_office_worker_medium_dark_skin_tone | |
| 5841 | + woman_office_worker_dark_skin_tone | |
| 5842 | + man_scientist | |
| 5843 | + man_scientist_light_skin_tone | |
| 5844 | + man_scientist_medium_light_skin_tone | |
| 5845 | + man_scientist_medium_skin_tone | |
| 5846 | + man_scientist_medium_dark_skin_tone | |
| 5847 | + man_scientist_dark_skin_tone | |
| 5848 | + woman_scientist | |
| 5849 | + woman_scientist_light_skin_tone | |
| 5850 | + woman_scientist_medium_light_skin_tone | |
| 5851 | + woman_scientist_medium_skin_tone | |
| 5852 | + woman_scientist_medium_dark_skin_tone | |
| 5853 | + woman_scientist_dark_skin_tone | |
| 5854 | + man_technologist | |
| 5855 | + man_technologist_light_skin_tone | |
| 5856 | + man_technologist_medium_light_skin_tone | |
| 5857 | + man_technologist_medium_skin_tone | |
| 5858 | + man_technologist_medium_dark_skin_tone | |
| 5859 | + man_technologist_dark_skin_tone | |
| 5860 | + woman_technologist | |
| 5861 | + woman_technologist_light_skin_tone | |
| 5862 | + woman_technologist_medium_light_skin_tone | |
| 5863 | + woman_technologist_medium_skin_tone | |
| 5864 | + woman_technologist_medium_dark_skin_tone | |
| 5865 | + woman_technologist_dark_skin_tone | |
| 5866 | + man_singer | |
| 5867 | + man_singer_light_skin_tone | |
| 5868 | + man_singer_medium_light_skin_tone | |
| 5869 | + man_singer_medium_skin_tone | |
| 5870 | + man_singer_medium_dark_skin_tone | |
| 5871 | + man_singer_dark_skin_tone | |
| 5872 | + woman_singer | |
| 5873 | + woman_singer_light_skin_tone | |
| 5874 | + woman_singer_medium_light_skin_tone | |
| 5875 | + woman_singer_medium_skin_tone | |
| 5876 | + woman_singer_medium_dark_skin_tone | |
| 5877 | + woman_singer_dark_skin_tone | |
| 5878 | + man_artist | |
| 5879 | + man_artist_light_skin_tone | |
| 5880 | + man_artist_medium_light_skin_tone | |
| 5881 | + man_artist_medium_skin_tone | |
| 5882 | + man_artist_medium_dark_skin_tone | |
| 5883 | + man_artist_dark_skin_tone | |
| 5884 | + woman_artist | |
| 5885 | + woman_artist_light_skin_tone | |
| 5886 | + woman_artist_medium_light_skin_tone | |
| 5887 | + woman_artist_medium_skin_tone | |
| 5888 | + woman_artist_medium_dark_skin_tone | |
| 5889 | + woman_artist_dark_skin_tone | |
| 5890 | + man_pilot | |
| 5891 | + man_pilot_light_skin_tone | |
| 5892 | + man_pilot_medium_light_skin_tone | |
| 5893 | + man_pilot_medium_skin_tone | |
| 5894 | + man_pilot_medium_dark_skin_tone | |
| 5895 | + man_pilot_dark_skin_tone | |
| 5896 | + woman_pilot | |
| 5897 | + woman_pilot_light_skin_tone | |
| 5898 | + woman_pilot_medium_light_skin_tone | |
| 5899 | + woman_pilot_medium_skin_tone | |
| 5900 | + woman_pilot_medium_dark_skin_tone | |
| 5901 | + woman_pilot_dark_skin_tone | |
| 5902 | + man_astronaut | |
| 5903 | + man_astronaut_light_skin_tone | |
| 5904 | + man_astronaut_medium_light_skin_tone | |
| 5905 | + man_astronaut_medium_skin_tone | |
| 5906 | + man_astronaut_medium_dark_skin_tone | |
| 5907 | + man_astronaut_dark_skin_tone | |
| 5908 | + woman_astronaut | |
| 5909 | + woman_astronaut_light_skin_tone | |
| 5910 | + woman_astronaut_medium_light_skin_tone | |
| 5911 | + woman_astronaut_medium_skin_tone | |
| 5912 | + woman_astronaut_medium_dark_skin_tone | |
| 5913 | + woman_astronaut_dark_skin_tone | |
| 5914 | + man_firefighter | |
| 5915 | + man_firefighter_light_skin_tone | |
| 5916 | + man_firefighter_medium_light_skin_tone | |
| 5917 | + man_firefighter_medium_skin_tone | |
| 5918 | + man_firefighter_medium_dark_skin_tone | |
| 5919 | + man_firefighter_dark_skin_tone | |
| 5920 | + woman_firefighter | |
| 5921 | + woman_firefighter_light_skin_tone | |
| 5922 | + woman_firefighter_medium_light_skin_tone | |
| 5923 | + woman_firefighter_medium_skin_tone | |
| 5924 | + woman_firefighter_medium_dark_skin_tone | |
| 5925 | + woman_firefighter_dark_skin_tone | |
| 5926 | + police_officer | |
| 5927 | + police_officer_light_skin_tone | |
| 5928 | + police_officer_medium_light_skin_tone | |
| 5929 | + police_officer_medium_skin_tone | |
| 5930 | + police_officer_medium_dark_skin_tone | |
| 5931 | + police_officer_dark_skin_tone | |
| 5932 | + man_police_officer | |
| 5933 | + man_police_officer_light_skin_tone | |
| 5934 | + man_police_officer_medium_light_skin_tone | |
| 5935 | + man_police_officer_medium_skin_tone | |
| 5936 | + man_police_officer_medium_dark_skin_tone | |
| 5937 | + man_police_officer_dark_skin_tone | |
| 5938 | + woman_police_officer | |
| 5939 | + woman_police_officer_light_skin_tone | |
| 5940 | + woman_police_officer_medium_light_skin_tone | |
| 5941 | + woman_police_officer_medium_skin_tone | |
| 5942 | + woman_police_officer_medium_dark_skin_tone | |
| 5943 | + woman_police_officer_dark_skin_tone | |
| 5944 | + detective | |
| 5945 | + detective_light_skin_tone | |
| 5946 | + detective_medium_light_skin_tone | |
| 5947 | + detective_medium_skin_tone | |
| 5948 | + detective_medium_dark_skin_tone | |
| 5949 | + detective_dark_skin_tone | |
| 5950 | + man_detective | |
| 5951 | + man_detective_light_skin_tone | |
| 5952 | + man_detective_medium_light_skin_tone | |
| 5953 | + man_detective_medium_skin_tone | |
| 5954 | + man_detective_medium_dark_skin_tone | |
| 5955 | + man_detective_dark_skin_tone | |
| 5956 | + woman_detective | |
| 5957 | + woman_detective_light_skin_tone | |
| 5958 | + woman_detective_medium_light_skin_tone | |
| 5959 | + woman_detective_medium_skin_tone | |
| 5960 | + woman_detective_medium_dark_skin_tone | |
| 5961 | + woman_detective_dark_skin_tone | |
| 5962 | + guard | |
| 5963 | + guard_light_skin_tone | |
| 5964 | + guard_medium_light_skin_tone | |
| 5965 | + guard_medium_skin_tone | |
| 5966 | + guard_medium_dark_skin_tone | |
| 5967 | + guard_dark_skin_tone | |
| 5968 | + man_guard | |
| 5969 | + man_guard_light_skin_tone | |
| 5970 | + man_guard_medium_light_skin_tone | |
| 5971 | + man_guard_medium_skin_tone | |
| 5972 | + man_guard_medium_dark_skin_tone | |
| 5973 | + man_guard_dark_skin_tone | |
| 5974 | + woman_guard | |
| 5975 | + woman_guard_light_skin_tone | |
| 5976 | + woman_guard_medium_light_skin_tone | |
| 5977 | + woman_guard_medium_skin_tone | |
| 5978 | + woman_guard_medium_dark_skin_tone | |
| 5979 | + woman_guard_dark_skin_tone | |
| 5980 | + construction_worker | |
| 5981 | + construction_worker_light_skin_tone | |
| 5982 | + construction_worker_medium_light_skin_tone | |
| 5983 | + construction_worker_medium_skin_tone | |
| 5984 | + construction_worker_medium_dark_skin_tone | |
| 5985 | + construction_worker_dark_skin_tone | |
| 5986 | + man_construction_worker | |
| 5987 | + man_construction_worker_light_skin_tone | |
| 5988 | + man_construction_worker_medium_light_skin_tone | |
| 5989 | + man_construction_worker_medium_skin_tone | |
| 5990 | + man_construction_worker_medium_dark_skin_tone | |
| 5991 | + man_construction_worker_dark_skin_tone | |
| 5992 | + woman_construction_worker | |
| 5993 | + woman_construction_worker_light_skin_tone | |
| 5994 | + woman_construction_worker_medium_light_skin_tone | |
| 5995 | + woman_construction_worker_medium_skin_tone | |
| 5996 | + woman_construction_worker_medium_dark_skin_tone | |
| 5997 | + woman_construction_worker_dark_skin_tone | |
| 5998 | + prince | |
| 5999 | + prince_light_skin_tone | |
| 6000 | + prince_medium_light_skin_tone | |
| 6001 | + prince_medium_skin_tone | |
| 6002 | + prince_medium_dark_skin_tone | |
| 6003 | + prince_dark_skin_tone | |
| 6004 | + princess | |
| 6005 | + princess_light_skin_tone | |
| 6006 | + princess_medium_light_skin_tone | |
| 6007 | + princess_medium_skin_tone | |
| 6008 | + princess_medium_dark_skin_tone | |
| 6009 | + princess_dark_skin_tone | |
| 6010 | + person_wearing_turban | |
| 6011 | + person_wearing_turban_light_skin_tone | |
| 6012 | + person_wearing_turban_medium_light_skin_tone | |
| 6013 | + person_wearing_turban_medium_skin_tone | |
| 6014 | + person_wearing_turban_medium_dark_skin_tone | |
| 6015 | + person_wearing_turban_dark_skin_tone | |
| 6016 | + man_wearing_turban | |
| 6017 | + man_wearing_turban_light_skin_tone | |
| 6018 | + man_wearing_turban_medium_light_skin_tone | |
| 6019 | + man_wearing_turban_medium_skin_tone | |
| 6020 | + man_wearing_turban_medium_dark_skin_tone | |
| 6021 | + man_wearing_turban_dark_skin_tone | |
| 6022 | + woman_wearing_turban | |
| 6023 | + woman_wearing_turban_light_skin_tone | |
| 6024 | + woman_wearing_turban_medium_light_skin_tone | |
| 6025 | + woman_wearing_turban_medium_skin_tone | |
| 6026 | + woman_wearing_turban_medium_dark_skin_tone | |
| 6027 | + woman_wearing_turban_dark_skin_tone | |
| 6028 | + man_with_Chinese_cap | |
| 6029 | + man_with_Chinese_cap_light_skin_tone | |
| 6030 | + man_with_Chinese_cap_medium_light_skin_tone | |
| 6031 | + man_with_Chinese_cap_medium_skin_tone | |
| 6032 | + man_with_Chinese_cap_medium_dark_skin_tone | |
| 6033 | + man_with_Chinese_cap_dark_skin_tone | |
| 6034 | + woman_with_headscarf | |
| 6035 | + woman_with_headscarf_light_skin_tone | |
| 6036 | + woman_with_headscarf_medium_light_skin_tone | |
| 6037 | + woman_with_headscarf_medium_skin_tone | |
| 6038 | + woman_with_headscarf_medium_dark_skin_tone | |
| 6039 | + woman_with_headscarf_dark_skin_tone | |
| 6040 | + man_in_tuxedo | |
| 6041 | + man_in_tuxedo_light_skin_tone | |
| 6042 | + man_in_tuxedo_medium_light_skin_tone | |
| 6043 | + man_in_tuxedo_medium_skin_tone | |
| 6044 | + man_in_tuxedo_medium_dark_skin_tone | |
| 6045 | + man_in_tuxedo_dark_skin_tone | |
| 6046 | + bride_with_veil | |
| 6047 | + bride_with_veil_light_skin_tone | |
| 6048 | + bride_with_veil_medium_light_skin_tone | |
| 6049 | + bride_with_veil_medium_skin_tone | |
| 6050 | + bride_with_veil_medium_dark_skin_tone | |
| 6051 | + bride_with_veil_dark_skin_tone | |
| 6052 | + pregnant_woman | |
| 6053 | + pregnant_woman_light_skin_tone | |
| 6054 | + pregnant_woman_medium_light_skin_tone | |
| 6055 | + pregnant_woman_medium_skin_tone | |
| 6056 | + pregnant_woman_medium_dark_skin_tone | |
| 6057 | + pregnant_woman_dark_skin_tone | |
| 6058 | + breast_feeding | |
| 6059 | + breast_feeding_light_skin_tone | |
| 6060 | + breast_feeding_medium_light_skin_tone | |
| 6061 | + breast_feeding_medium_skin_tone | |
| 6062 | + breast_feeding_medium_dark_skin_tone | |
| 6063 | + breast_feeding_dark_skin_tone | |
| 6064 | + baby_angel | |
| 6065 | + baby_angel_light_skin_tone | |
| 6066 | + baby_angel_medium_light_skin_tone | |
| 6067 | + baby_angel_medium_skin_tone | |
| 6068 | + baby_angel_medium_dark_skin_tone | |
| 6069 | + baby_angel_dark_skin_tone | |
| 6070 | + Santa_Claus | |
| 6071 | + Santa_Claus_light_skin_tone | |
| 6072 | + Santa_Claus_medium_light_skin_tone | |
| 6073 | + Santa_Claus_medium_skin_tone | |
| 6074 | + Santa_Claus_medium_dark_skin_tone | |
| 6075 | + Santa_Claus_dark_skin_tone | |
| 6076 | + Mrs_Claus | |
| 6077 | + Mrs_Claus_light_skin_tone | |
| 6078 | + Mrs_Claus_medium_light_skin_tone | |
| 6079 | + Mrs_Claus_medium_skin_tone | |
| 6080 | + Mrs_Claus_medium_dark_skin_tone | |
| 6081 | + Mrs_Claus_dark_skin_tone | |
| 6082 | + superhero | |
| 6083 | + superhero_light_skin_tone | |
| 6084 | + superhero_medium_light_skin_tone | |
| 6085 | + superhero_medium_skin_tone | |
| 6086 | + superhero_medium_dark_skin_tone | |
| 6087 | + superhero_dark_skin_tone | |
| 6088 | + man_superhero | |
| 6089 | + man_superhero_light_skin_tone | |
| 6090 | + man_superhero_medium_light_skin_tone | |
| 6091 | + man_superhero_medium_skin_tone | |
| 6092 | + man_superhero_medium_dark_skin_tone | |
| 6093 | + man_superhero_dark_skin_tone | |
| 6094 | + woman_superhero | |
| 6095 | + woman_superhero_light_skin_tone | |
| 6096 | + woman_superhero_medium_light_skin_tone | |
| 6097 | + woman_superhero_medium_skin_tone | |
| 6098 | + woman_superhero_medium_dark_skin_tone | |
| 6099 | + woman_superhero_dark_skin_tone | |
| 6100 | + supervillain | |
| 6101 | + supervillain_light_skin_tone | |
| 6102 | + supervillain_medium_light_skin_tone | |
| 6103 | + supervillain_medium_skin_tone | |
| 6104 | + supervillain_medium_dark_skin_tone | |
| 6105 | + supervillain_dark_skin_tone | |
| 6106 | + man_supervillain | |
| 6107 | + man_supervillain_light_skin_tone | |
| 6108 | + man_supervillain_medium_light_skin_tone | |
| 6109 | + man_supervillain_medium_skin_tone | |
| 6110 | + man_supervillain_medium_dark_skin_tone | |
| 6111 | + man_supervillain_dark_skin_tone | |
| 6112 | + woman_supervillain | |
| 6113 | + woman_supervillain_light_skin_tone | |
| 6114 | + woman_supervillain_medium_light_skin_tone | |
| 6115 | + woman_supervillain_medium_skin_tone | |
| 6116 | + woman_supervillain_medium_dark_skin_tone | |
| 6117 | + woman_supervillain_dark_skin_tone | |
| 6118 | + mage | |
| 6119 | + mage_light_skin_tone | |
| 6120 | + mage_medium_light_skin_tone | |
| 6121 | + mage_medium_skin_tone | |
| 6122 | + mage_medium_dark_skin_tone | |
| 6123 | + mage_dark_skin_tone | |
| 6124 | + man_mage | |
| 6125 | + man_mage_light_skin_tone | |
| 6126 | + man_mage_medium_light_skin_tone | |
| 6127 | + man_mage_medium_skin_tone | |
| 6128 | + man_mage_medium_dark_skin_tone | |
| 6129 | + man_mage_dark_skin_tone | |
| 6130 | + woman_mage | |
| 6131 | + woman_mage_light_skin_tone | |
| 6132 | + woman_mage_medium_light_skin_tone | |
| 6133 | + woman_mage_medium_skin_tone | |
| 6134 | + woman_mage_medium_dark_skin_tone | |
| 6135 | + woman_mage_dark_skin_tone | |
| 6136 | + fairy | |
| 6137 | + fairy_light_skin_tone | |
| 6138 | + fairy_medium_light_skin_tone | |
| 6139 | + fairy_medium_skin_tone | |
| 6140 | + fairy_medium_dark_skin_tone | |
| 6141 | + fairy_dark_skin_tone | |
| 6142 | + man_fairy | |
| 6143 | + man_fairy_light_skin_tone | |
| 6144 | + man_fairy_medium_light_skin_tone | |
| 6145 | + man_fairy_medium_skin_tone | |
| 6146 | + man_fairy_medium_dark_skin_tone | |
| 6147 | + man_fairy_dark_skin_tone | |
| 6148 | + woman_fairy | |
| 6149 | + woman_fairy_light_skin_tone | |
| 6150 | + woman_fairy_medium_light_skin_tone | |
| 6151 | + woman_fairy_medium_skin_tone | |
| 6152 | + woman_fairy_medium_dark_skin_tone | |
| 6153 | + woman_fairy_dark_skin_tone | |
| 6154 | + vampire | |
| 6155 | + vampire_light_skin_tone | |
| 6156 | + vampire_medium_light_skin_tone | |
| 6157 | + vampire_medium_skin_tone | |
| 6158 | + vampire_medium_dark_skin_tone | |
| 6159 | + vampire_dark_skin_tone | |
| 6160 | + man_vampire | |
| 6161 | + man_vampire_light_skin_tone | |
| 6162 | + man_vampire_medium_light_skin_tone | |
| 6163 | + man_vampire_medium_skin_tone | |
| 6164 | + man_vampire_medium_dark_skin_tone | |
| 6165 | + man_vampire_dark_skin_tone | |
| 6166 | + woman_vampire | |
| 6167 | + woman_vampire_light_skin_tone | |
| 6168 | + woman_vampire_medium_light_skin_tone | |
| 6169 | + woman_vampire_medium_skin_tone | |
| 6170 | + woman_vampire_medium_dark_skin_tone | |
| 6171 | + woman_vampire_dark_skin_tone | |
| 6172 | + merperson | |
| 6173 | + merperson_light_skin_tone | |
| 6174 | + merperson_medium_light_skin_tone | |
| 6175 | + merperson_medium_skin_tone | |
| 6176 | + merperson_medium_dark_skin_tone | |
| 6177 | + merperson_dark_skin_tone | |
| 6178 | + merman | |
| 6179 | + merman_light_skin_tone | |
| 6180 | + merman_medium_light_skin_tone | |
| 6181 | + merman_medium_skin_tone | |
| 6182 | + merman_medium_dark_skin_tone | |
| 6183 | + merman_dark_skin_tone | |
| 6184 | + mermaid | |
| 6185 | + mermaid_light_skin_tone | |
| 6186 | + mermaid_medium_light_skin_tone | |
| 6187 | + mermaid_medium_skin_tone | |
| 6188 | + mermaid_medium_dark_skin_tone | |
| 6189 | + mermaid_dark_skin_tone | |
| 6190 | + elf | |
| 6191 | + elf_light_skin_tone | |
| 6192 | + elf_medium_light_skin_tone | |
| 6193 | + elf_medium_skin_tone | |
| 6194 | + elf_medium_dark_skin_tone | |
| 6195 | + elf_dark_skin_tone | |
| 6196 | + man_elf | |
| 6197 | + man_elf_light_skin_tone | |
| 6198 | + man_elf_medium_light_skin_tone | |
| 6199 | + man_elf_medium_skin_tone | |
| 6200 | + man_elf_medium_dark_skin_tone | |
| 6201 | + man_elf_dark_skin_tone | |
| 6202 | + woman_elf | |
| 6203 | + woman_elf_light_skin_tone | |
| 6204 | + woman_elf_medium_light_skin_tone | |
| 6205 | + woman_elf_medium_skin_tone | |
| 6206 | + woman_elf_medium_dark_skin_tone | |
| 6207 | + woman_elf_dark_skin_tone | |
| 6208 | + genie | |
| 6209 | + man_genie | |
| 6210 | + woman_genie | |
| 6211 | + zombie | |
| 6212 | + man_zombie | |
| 6213 | + woman_zombie | |
| 6214 | + person_getting_massage | |
| 6215 | + person_getting_massage_light_skin_tone | |
| 6216 | + person_getting_massage_medium_light_skin_tone | |
| 6217 | + person_getting_massage_medium_skin_tone | |
| 6218 | + person_getting_massage_medium_dark_skin_tone | |
| 6219 | + person_getting_massage_dark_skin_tone | |
| 6220 | + man_getting_massage | |
| 6221 | + man_getting_massage_light_skin_tone | |
| 6222 | + man_getting_massage_medium_light_skin_tone | |
| 6223 | + man_getting_massage_medium_skin_tone | |
| 6224 | + man_getting_massage_medium_dark_skin_tone | |
| 6225 | + man_getting_massage_dark_skin_tone | |
| 6226 | + woman_getting_massage | |
| 6227 | + woman_getting_massage_light_skin_tone | |
| 6228 | + woman_getting_massage_medium_light_skin_tone | |
| 6229 | + woman_getting_massage_medium_skin_tone | |
| 6230 | + woman_getting_massage_medium_dark_skin_tone | |
| 6231 | + woman_getting_massage_dark_skin_tone | |
| 6232 | + person_getting_haircut | |
| 6233 | + person_getting_haircut_light_skin_tone | |
| 6234 | + person_getting_haircut_medium_light_skin_tone | |
| 6235 | + person_getting_haircut_medium_skin_tone | |
| 6236 | + person_getting_haircut_medium_dark_skin_tone | |
| 6237 | + person_getting_haircut_dark_skin_tone | |
| 6238 | + man_getting_haircut | |
| 6239 | + man_getting_haircut_light_skin_tone | |
| 6240 | + man_getting_haircut_medium_light_skin_tone | |
| 6241 | + man_getting_haircut_medium_skin_tone | |
| 6242 | + man_getting_haircut_medium_dark_skin_tone | |
| 6243 | + man_getting_haircut_dark_skin_tone | |
| 6244 | + woman_getting_haircut | |
| 6245 | + woman_getting_haircut_light_skin_tone | |
| 6246 | + woman_getting_haircut_medium_light_skin_tone | |
| 6247 | + woman_getting_haircut_medium_skin_tone | |
| 6248 | + woman_getting_haircut_medium_dark_skin_tone | |
| 6249 | + woman_getting_haircut_dark_skin_tone | |
| 6250 | + person_walking | |
| 6251 | + person_walking_light_skin_tone | |
| 6252 | + person_walking_medium_light_skin_tone | |
| 6253 | + person_walking_medium_skin_tone | |
| 6254 | + person_walking_medium_dark_skin_tone | |
| 6255 | + person_walking_dark_skin_tone | |
| 6256 | + man_walking | |
| 6257 | + man_walking_light_skin_tone | |
| 6258 | + man_walking_medium_light_skin_tone | |
| 6259 | + man_walking_medium_skin_tone | |
| 6260 | + man_walking_medium_dark_skin_tone | |
| 6261 | + man_walking_dark_skin_tone | |
| 6262 | + woman_walking | |
| 6263 | + woman_walking_light_skin_tone | |
| 6264 | + woman_walking_medium_light_skin_tone | |
| 6265 | + woman_walking_medium_skin_tone | |
| 6266 | + woman_walking_medium_dark_skin_tone | |
| 6267 | + woman_walking_dark_skin_tone | |
| 6268 | + person_standing | |
| 6269 | + person_standing_light_skin_tone | |
| 6270 | + person_standing_medium_light_skin_tone | |
| 6271 | + person_standing_medium_skin_tone | |
| 6272 | + person_standing_medium_dark_skin_tone | |
| 6273 | + person_standing_dark_skin_tone | |
| 6274 | + man_standing | |
| 6275 | + man_standing_light_skin_tone | |
| 6276 | + man_standing_medium_light_skin_tone | |
| 6277 | + man_standing_medium_skin_tone | |
| 6278 | + man_standing_medium_dark_skin_tone | |
| 6279 | + man_standing_dark_skin_tone | |
| 6280 | + woman_standing | |
| 6281 | + woman_standing_light_skin_tone | |
| 6282 | + woman_standing_medium_light_skin_tone | |
| 6283 | + woman_standing_medium_skin_tone | |
| 6284 | + woman_standing_medium_dark_skin_tone | |
| 6285 | + woman_standing_dark_skin_tone | |
| 6286 | + person_kneeling | |
| 6287 | + person_kneeling_light_skin_tone | |
| 6288 | + person_kneeling_medium_light_skin_tone | |
| 6289 | + person_kneeling_medium_skin_tone | |
| 6290 | + person_kneeling_medium_dark_skin_tone | |
| 6291 | + person_kneeling_dark_skin_tone | |
| 6292 | + man_kneeling | |
| 6293 | + man_kneeling_light_skin_tone | |
| 6294 | + man_kneeling_medium_light_skin_tone | |
| 6295 | + man_kneeling_medium_skin_tone | |
| 6296 | + man_kneeling_medium_dark_skin_tone | |
| 6297 | + man_kneeling_dark_skin_tone | |
| 6298 | + woman_kneeling | |
| 6299 | + woman_kneeling_light_skin_tone | |
| 6300 | + woman_kneeling_medium_light_skin_tone | |
| 6301 | + woman_kneeling_medium_skin_tone | |
| 6302 | + woman_kneeling_medium_dark_skin_tone | |
| 6303 | + woman_kneeling_dark_skin_tone | |
| 6304 | + man_with_probing_cane | |
| 6305 | + man_with_probing_cane_light_skin_tone | |
| 6306 | + man_with_probing_cane_medium_light_skin_tone | |
| 6307 | + man_with_probing_cane_medium_skin_tone | |
| 6308 | + man_with_probing_cane_medium_dark_skin_tone | |
| 6309 | + man_with_probing_cane_dark_skin_tone | |
| 6310 | + woman_with_probing_cane | |
| 6311 | + woman_with_probing_cane_light_skin_tone | |
| 6312 | + woman_with_probing_cane_medium_light_skin_tone | |
| 6313 | + woman_with_probing_cane_medium_skin_tone | |
| 6314 | + woman_with_probing_cane_medium_dark_skin_tone | |
| 6315 | + woman_with_probing_cane_dark_skin_tone | |
| 6316 | + man_in_motorized_wheelchair | |
| 6317 | + man_in_motorized_wheelchair_light_skin_tone | |
| 6318 | + man_in_motorized_wheelchair_medium_light_skin_tone | |
| 6319 | + man_in_motorized_wheelchair_medium_skin_tone | |
| 6320 | + man_in_motorized_wheelchair_medium_dark_skin_tone | |
| 6321 | + man_in_motorized_wheelchair_dark_skin_tone | |
| 6322 | + woman_in_motorized_wheelchair | |
| 6323 | + woman_in_motorized_wheelchair_light_skin_tone | |
| 6324 | + woman_in_motorized_wheelchair_medium_light_skin_tone | |
| 6325 | + woman_in_motorized_wheelchair_medium_skin_tone | |
| 6326 | + woman_in_motorized_wheelchair_medium_dark_skin_tone | |
| 6327 | + woman_in_motorized_wheelchair_dark_skin_tone | |
| 6328 | + man_in_manual_wheelchair | |
| 6329 | + man_in_manual_wheelchair_light_skin_tone | |
| 6330 | + man_in_manual_wheelchair_medium_light_skin_tone | |
| 6331 | + man_in_manual_wheelchair_medium_skin_tone | |
| 6332 | + man_in_manual_wheelchair_medium_dark_skin_tone | |
| 6333 | + man_in_manual_wheelchair_dark_skin_tone | |
| 6334 | + woman_in_manual_wheelchair | |
| 6335 | + woman_in_manual_wheelchair_light_skin_tone | |
| 6336 | + woman_in_manual_wheelchair_medium_light_skin_tone | |
| 6337 | + woman_in_manual_wheelchair_medium_skin_tone | |
| 6338 | + woman_in_manual_wheelchair_medium_dark_skin_tone | |
| 6339 | + woman_in_manual_wheelchair_dark_skin_tone | |
| 6340 | + person_running | |
| 6341 | + person_running_light_skin_tone | |
| 6342 | + person_running_medium_light_skin_tone | |
| 6343 | + person_running_medium_skin_tone | |
| 6344 | + person_running_medium_dark_skin_tone | |
| 6345 | + person_running_dark_skin_tone | |
| 6346 | + man_running | |
| 6347 | + man_running_light_skin_tone | |
| 6348 | + man_running_medium_light_skin_tone | |
| 6349 | + man_running_medium_skin_tone | |
| 6350 | + man_running_medium_dark_skin_tone | |
| 6351 | + man_running_dark_skin_tone | |
| 6352 | + woman_running | |
| 6353 | + woman_running_light_skin_tone | |
| 6354 | + woman_running_medium_light_skin_tone | |
| 6355 | + woman_running_medium_skin_tone | |
| 6356 | + woman_running_medium_dark_skin_tone | |
| 6357 | + woman_running_dark_skin_tone | |
| 6358 | + woman_dancing | |
| 6359 | + woman_dancing_light_skin_tone | |
| 6360 | + woman_dancing_medium_light_skin_tone | |
| 6361 | + woman_dancing_medium_skin_tone | |
| 6362 | + woman_dancing_medium_dark_skin_tone | |
| 6363 | + woman_dancing_dark_skin_tone | |
| 6364 | + woman_dancing_dark_skin_tone_1 | |
| 6365 | + man_dancing_light_skin_tone | |
| 6366 | + man_dancing_medium_light_skin_tone | |
| 6367 | + man_dancing_medium_skin_tone | |
| 6368 | + man_dancing_medium_dark_skin_tone | |
| 6369 | + man_dancing_dark_skin_tone | |
| 6370 | + man_in_suit_levitating | |
| 6371 | + man_in_suit_levitating_light_skin_tone | |
| 6372 | + man_in_suit_levitating_medium_light_skin_tone | |
| 6373 | + man_in_suit_levitating_medium_skin_tone | |
| 6374 | + man_in_suit_levitating_medium_dark_skin_tone | |
| 6375 | + man_in_suit_levitating_dark_skin_tone | |
| 6376 | + people_with_bunny_ears | |
| 6377 | + men_with_bunny_ears | |
| 6378 | + women_with_bunny_ears | |
| 6379 | + person_in_steamy_room | |
| 6380 | + person_in_steamy_room_light_skin_tone | |
| 6381 | + person_in_steamy_room_medium_light_skin_tone | |
| 6382 | + person_in_steamy_room_medium_skin_tone | |
| 6383 | + person_in_steamy_room_medium_dark_skin_tone | |
| 6384 | + person_in_steamy_room_dark_skin_tone | |
| 6385 | + man_in_steamy_room | |
| 6386 | + man_in_steamy_room_light_skin_tone | |
| 6387 | + man_in_steamy_room_medium_light_skin_tone | |
| 6388 | + man_in_steamy_room_medium_skin_tone | |
| 6389 | + man_in_steamy_room_medium_dark_skin_tone | |
| 6390 | + man_in_steamy_room_dark_skin_tone | |
| 6391 | + woman_in_steamy_room | |
| 6392 | + woman_in_steamy_room_light_skin_tone | |
| 6393 | + woman_in_steamy_room_medium_light_skin_tone | |
| 6394 | + woman_in_steamy_room_medium_skin_tone | |
| 6395 | + woman_in_steamy_room_medium_dark_skin_tone | |
| 6396 | + woman_in_steamy_room_dark_skin_tone | |
| 6397 | + person_climbing | |
| 6398 | + person_climbing_light_skin_tone | |
| 6399 | + person_climbing_medium_light_skin_tone | |
| 6400 | + person_climbing_medium_skin_tone | |
| 6401 | + person_climbing_medium_dark_skin_tone | |
| 6402 | + person_climbing_dark_skin_tone | |
| 6403 | + man_climbing | |
| 6404 | + man_climbing_light_skin_tone | |
| 6405 | + man_climbing_medium_light_skin_tone | |
| 6406 | + man_climbing_medium_skin_tone | |
| 6407 | + man_climbing_medium_dark_skin_tone | |
| 6408 | + man_climbing_dark_skin_tone | |
| 6409 | + woman_climbing | |
| 6410 | + woman_climbing_light_skin_tone | |
| 6411 | + woman_climbing_medium_light_skin_tone | |
| 6412 | + woman_climbing_medium_skin_tone | |
| 6413 | + woman_climbing_medium_dark_skin_tone | |
| 6414 | + woman_climbing_dark_skin_tone | |
| 6415 | + person_fencing | |
| 6416 | + horse_racing | |
| 6417 | + horse_racing_light_skin_tone | |
| 6418 | + horse_racing_medium_light_skin_tone | |
| 6419 | + horse_racing_medium_skin_tone | |
| 6420 | + horse_racing_medium_dark_skin_tone | |
| 6421 | + horse_racing_dark_skin_tone | |
| 6422 | + skier | |
| 6423 | + snowboarder | |
| 6424 | + snowboarder_light_skin_tone | |
| 6425 | + snowboarder_medium_light_skin_tone | |
| 6426 | + snowboarder_medium_skin_tone | |
| 6427 | + snowboarder_medium_dark_skin_tone | |
| 6428 | + snowboarder_dark_skin_tone | |
| 6429 | + person_golfing | |
| 6430 | + person_golfing_light_skin_tone | |
| 6431 | + person_golfing_medium_light_skin_tone | |
| 6432 | + person_golfing_medium_skin_tone | |
| 6433 | + person_golfing_medium_dark_skin_tone | |
| 6434 | + person_golfing_dark_skin_tone | |
| 6435 | + man_golfing | |
| 6436 | + man_golfing_light_skin_tone | |
| 6437 | + man_golfing_medium_light_skin_tone | |
| 6438 | + man_golfing_medium_skin_tone | |
| 6439 | + man_golfing_medium_dark_skin_tone | |
| 6440 | + man_golfing_dark_skin_tone | |
| 6441 | + woman_golfing | |
| 6442 | + woman_golfing_light_skin_tone | |
| 6443 | + woman_golfing_medium_light_skin_tone | |
| 6444 | + woman_golfing_medium_skin_tone | |
| 6445 | + woman_golfing_medium_dark_skin_tone | |
| 6446 | + woman_golfing_dark_skin_tone | |
| 6447 | + person_surfing | |
| 6448 | + person_surfing_light_skin_tone | |
| 6449 | + person_surfing_medium_light_skin_tone | |
| 6450 | + person_surfing_medium_skin_tone | |
| 6451 | + person_surfing_medium_dark_skin_tone | |
| 6452 | + person_surfing_dark_skin_tone | |
| 6453 | + man_surfing | |
| 6454 | + man_surfing_light_skin_tone | |
| 6455 | + man_surfing_medium_light_skin_tone | |
| 6456 | + man_surfing_medium_skin_tone | |
| 6457 | + man_surfing_medium_dark_skin_tone | |
| 6458 | + man_surfing_dark_skin_tone | |
| 6459 | + woman_surfing | |
| 6460 | + woman_surfing_light_skin_tone | |
| 6461 | + woman_surfing_medium_light_skin_tone | |
| 6462 | + woman_surfing_medium_skin_tone | |
| 6463 | + woman_surfing_medium_dark_skin_tone | |
| 6464 | + woman_surfing_dark_skin_tone | |
| 6465 | + person_rowing_boat | |
| 6466 | + person_rowing_boat_light_skin_tone | |
| 6467 | + person_rowing_boat_medium_light_skin_tone | |
| 6468 | + person_rowing_boat_medium_skin_tone | |
| 6469 | + person_rowing_boat_medium_dark_skin_tone | |
| 6470 | + person_rowing_boat_dark_skin_tone | |
| 6471 | + man_rowing_boat | |
| 6472 | + man_rowing_boat_light_skin_tone | |
| 6473 | + man_rowing_boat_medium_light_skin_tone | |
| 6474 | + man_rowing_boat_medium_skin_tone | |
| 6475 | + man_rowing_boat_medium_dark_skin_tone | |
| 6476 | + man_rowing_boat_dark_skin_tone | |
| 6477 | + woman_rowing_boat | |
| 6478 | + woman_rowing_boat_light_skin_tone | |
| 6479 | + woman_rowing_boat_medium_light_skin_tone | |
| 6480 | + woman_rowing_boat_medium_skin_tone | |
| 6481 | + woman_rowing_boat_medium_dark_skin_tone | |
| 6482 | + woman_rowing_boat_dark_skin_tone | |
| 6483 | + person_swimming | |
| 6484 | + person_swimming_light_skin_tone | |
| 6485 | + person_swimming_medium_light_skin_tone | |
| 6486 | + person_swimming_medium_skin_tone | |
| 6487 | + person_swimming_medium_dark_skin_tone | |
| 6488 | + person_swimming_dark_skin_tone | |
| 6489 | + man_swimming | |
| 6490 | + man_swimming_light_skin_tone | |
| 6491 | + man_swimming_medium_light_skin_tone | |
| 6492 | + man_swimming_medium_skin_tone | |
| 6493 | + man_swimming_medium_dark_skin_tone | |
| 6494 | + man_swimming_dark_skin_tone | |
| 6495 | + woman_swimming | |
| 6496 | + woman_swimming_light_skin_tone | |
| 6497 | + woman_swimming_medium_light_skin_tone | |
| 6498 | + woman_swimming_medium_skin_tone | |
| 6499 | + woman_swimming_medium_dark_skin_tone | |
| 6500 | + woman_swimming_dark_skin_tone | |
| 6501 | + person_bouncing_ball | |
| 6502 | + person_bouncing_ball_light_skin_tone | |
| 6503 | + person_bouncing_ball_medium_light_skin_tone | |
| 6504 | + person_bouncing_ball_medium_skin_tone | |
| 6505 | + person_bouncing_ball_medium_dark_skin_tone | |
| 6506 | + person_bouncing_ball_dark_skin_tone | |
| 6507 | + man_bouncing_ball | |
| 6508 | + man_bouncing_ball_light_skin_tone | |
| 6509 | + man_bouncing_ball_medium_light_skin_tone | |
| 6510 | + man_bouncing_ball_medium_skin_tone | |
| 6511 | + man_bouncing_ball_medium_dark_skin_tone | |
| 6512 | + man_bouncing_ball_dark_skin_tone | |
| 6513 | + woman_bouncing_ball | |
| 6514 | + woman_bouncing_ball_light_skin_tone | |
| 6515 | + woman_bouncing_ball_medium_light_skin_tone | |
| 6516 | + woman_bouncing_ball_medium_skin_tone | |
| 6517 | + woman_bouncing_ball_medium_dark_skin_tone | |
| 6518 | + woman_bouncing_ball_dark_skin_tone | |
| 6519 | + person_lifting_weights | |
| 6520 | + person_lifting_weights_light_skin_tone | |
| 6521 | + person_lifting_weights_medium_light_skin_tone | |
| 6522 | + person_lifting_weights_medium_skin_tone | |
| 6523 | + person_lifting_weights_medium_dark_skin_tone | |
| 6524 | + person_lifting_weights_dark_skin_tone | |
| 6525 | + man_lifting_weights | |
| 6526 | + man_lifting_weights_light_skin_tone | |
| 6527 | + man_lifting_weights_medium_light_skin_tone | |
| 6528 | + man_lifting_weights_medium_skin_tone | |
| 6529 | + man_lifting_weights_medium_dark_skin_tone | |
| 6530 | + man_lifting_weights_dark_skin_tone | |
| 6531 | + woman_lifting_weights | |
| 6532 | + woman_lifting_weights_light_skin_tone | |
| 6533 | + woman_lifting_weights_medium_light_skin_tone | |
| 6534 | + woman_lifting_weights_medium_skin_tone | |
| 6535 | + woman_lifting_weights_medium_dark_skin_tone | |
| 6536 | + woman_lifting_weights_dark_skin_tone | |
| 6537 | + person_biking | |
| 6538 | + person_biking_light_skin_tone | |
| 6539 | + person_biking_medium_light_skin_tone | |
| 6540 | + person_biking_medium_skin_tone | |
| 6541 | + person_biking_medium_dark_skin_tone | |
| 6542 | + person_biking_dark_skin_tone | |
| 6543 | + man_biking | |
| 6544 | + man_biking_light_skin_tone | |
| 6545 | + man_biking_medium_light_skin_tone | |
| 6546 | + man_biking_medium_skin_tone | |
| 6547 | + man_biking_medium_dark_skin_tone | |
| 6548 | + man_biking_dark_skin_tone | |
| 6549 | + woman_biking | |
| 6550 | + woman_biking_light_skin_tone | |
| 6551 | + woman_biking_medium_light_skin_tone | |
| 6552 | + woman_biking_medium_skin_tone | |
| 6553 | + woman_biking_medium_dark_skin_tone | |
| 6554 | + woman_biking_dark_skin_tone | |
| 6555 | + person_mountain_biking | |
| 6556 | + person_mountain_biking_light_skin_tone | |
| 6557 | + person_mountain_biking_medium_light_skin_tone | |
| 6558 | + person_mountain_biking_medium_skin_tone | |
| 6559 | + person_mountain_biking_medium_dark_skin_tone | |
| 6560 | + person_mountain_biking_dark_skin_tone | |
| 6561 | + man_mountain_biking | |
| 6562 | + man_mountain_biking_light_skin_tone | |
| 6563 | + man_mountain_biking_medium_light_skin_tone | |
| 6564 | + man_mountain_biking_medium_skin_tone | |
| 6565 | + man_mountain_biking_medium_dark_skin_tone | |
| 6566 | + man_mountain_biking_dark_skin_tone | |
| 6567 | + woman_mountain_biking | |
| 6568 | + woman_mountain_biking_light_skin_tone | |
| 6569 | + woman_mountain_biking_medium_light_skin_tone | |
| 6570 | + woman_mountain_biking_medium_skin_tone | |
| 6571 | + woman_mountain_biking_medium_dark_skin_tone | |
| 6572 | + woman_mountain_biking_dark_skin_tone | |
| 6573 | + person_cartwheeling | |
| 6574 | + person_cartwheeling_light_skin_tone | |
| 6575 | + person_cartwheeling_medium_light_skin_tone | |
| 6576 | + person_cartwheeling_medium_skin_tone | |
| 6577 | + person_cartwheeling_medium_dark_skin_tone | |
| 6578 | + person_cartwheeling_dark_skin_tone | |
| 6579 | + man_cartwheeling | |
| 6580 | + man_cartwheeling_light_skin_tone | |
| 6581 | + man_cartwheeling_medium_light_skin_tone | |
| 6582 | + man_cartwheeling_medium_skin_tone | |
| 6583 | + man_cartwheeling_medium_dark_skin_tone | |
| 6584 | + man_cartwheeling_dark_skin_tone | |
| 6585 | + woman_cartwheeling | |
| 6586 | + woman_cartwheeling_light_skin_tone | |
| 6587 | + woman_cartwheeling_medium_light_skin_tone | |
| 6588 | + woman_cartwheeling_medium_skin_tone | |
| 6589 | + woman_cartwheeling_medium_dark_skin_tone | |
| 6590 | + woman_cartwheeling_dark_skin_tone | |
| 6591 | + people_wrestling | |
| 6592 | + men_wrestling | |
| 6593 | + women_wrestling | |
| 6594 | + person_playing_water_polo | |
| 6595 | + person_playing_water_polo_light_skin_tone | |
| 6596 | + person_playing_water_polo_medium_light_skin_tone | |
| 6597 | + person_playing_water_polo_medium_skin_tone | |
| 6598 | + person_playing_water_polo_medium_dark_skin_tone | |
| 6599 | + person_playing_water_polo_dark_skin_tone | |
| 6600 | + man_playing_water_polo | |
| 6601 | + man_playing_water_polo_light_skin_tone | |
| 6602 | + man_playing_water_polo_medium_light_skin_tone | |
| 6603 | + man_playing_water_polo_medium_skin_tone | |
| 6604 | + man_playing_water_polo_medium_dark_skin_tone | |
| 6605 | + man_playing_water_polo_dark_skin_tone | |
| 6606 | + woman_playing_water_polo | |
| 6607 | + woman_playing_water_polo_light_skin_tone | |
| 6608 | + woman_playing_water_polo_medium_light_skin_tone | |
| 6609 | + woman_playing_water_polo_medium_skin_tone | |
| 6610 | + woman_playing_water_polo_medium_dark_skin_tone | |
| 6611 | + woman_playing_water_polo_dark_skin_tone | |
| 6612 | + person_playing_handball | |
| 6613 | + person_playing_handball_light_skin_tone | |
| 6614 | + person_playing_handball_medium_light_skin_tone | |
| 6615 | + person_playing_handball_medium_skin_tone | |
| 6616 | + person_playing_handball_medium_dark_skin_tone | |
| 6617 | + person_playing_handball_dark_skin_tone | |
| 6618 | + man_playing_handball | |
| 6619 | + man_playing_handball_light_skin_tone | |
| 6620 | + man_playing_handball_medium_light_skin_tone | |
| 6621 | + man_playing_handball_medium_skin_tone | |
| 6622 | + man_playing_handball_medium_dark_skin_tone | |
| 6623 | + man_playing_handball_dark_skin_tone | |
| 6624 | + woman_playing_handball | |
| 6625 | + woman_playing_handball_light_skin_tone | |
| 6626 | + woman_playing_handball_medium_light_skin_tone | |
| 6627 | + woman_playing_handball_medium_skin_tone | |
| 6628 | + woman_playing_handball_medium_dark_skin_tone | |
| 6629 | + woman_playing_handball_dark_skin_tone | |
| 6630 | + person_juggling | |
| 6631 | + person_juggling_light_skin_tone | |
| 6632 | + person_juggling_medium_light_skin_tone | |
| 6633 | + person_juggling_medium_skin_tone | |
| 6634 | + person_juggling_medium_dark_skin_tone | |
| 6635 | + person_juggling_dark_skin_tone | |
| 6636 | + man_juggling | |
| 6637 | + man_juggling_light_skin_tone | |
| 6638 | + man_juggling_medium_light_skin_tone | |
| 6639 | + man_juggling_medium_skin_tone | |
| 6640 | + man_juggling_medium_dark_skin_tone | |
| 6641 | + man_juggling_dark_skin_tone | |
| 6642 | + woman_juggling | |
| 6643 | + woman_juggling_light_skin_tone | |
| 6644 | + woman_juggling_medium_light_skin_tone | |
| 6645 | + woman_juggling_medium_skin_tone | |
| 6646 | + woman_juggling_medium_dark_skin_tone | |
| 6647 | + woman_juggling_dark_skin_tone | |
| 6648 | + person_in_lotus_position | |
| 6649 | + person_in_lotus_position_light_skin_tone | |
| 6650 | + person_in_lotus_position_medium_light_skin_tone | |
| 6651 | + person_in_lotus_position_medium_skin_tone | |
| 6652 | + person_in_lotus_position_medium_dark_skin_tone | |
| 6653 | + person_in_lotus_position_dark_skin_tone | |
| 6654 | + man_in_lotus_position | |
| 6655 | + man_in_lotus_position_light_skin_tone | |
| 6656 | + man_in_lotus_position_medium_light_skin_tone | |
| 6657 | + man_in_lotus_position_medium_skin_tone | |
| 6658 | + man_in_lotus_position_medium_dark_skin_tone | |
| 6659 | + man_in_lotus_position_dark_skin_tone | |
| 6660 | + woman_in_lotus_position | |
| 6661 | + woman_in_lotus_position_light_skin_tone | |
| 6662 | + woman_in_lotus_position_medium_light_skin_tone | |
| 6663 | + woman_in_lotus_position_medium_skin_tone | |
| 6664 | + woman_in_lotus_position_medium_dark_skin_tone | |
| 6665 | + woman_in_lotus_position_dark_skin_tone | |
| 6666 | + person_taking_bath | |
| 6667 | + person_taking_bath_light_skin_tone | |
| 6668 | + person_taking_bath_medium_light_skin_tone | |
| 6669 | + person_taking_bath_medium_skin_tone | |
| 6670 | + person_taking_bath_medium_dark_skin_tone | |
| 6671 | + person_taking_bath_dark_skin_tone | |
| 6672 | + person_in_bed | |
| 6673 | + person_in_bed_light_skin_tone | |
| 6674 | + person_in_bed_medium_light_skin_tone | |
| 6675 | + person_in_bed_medium_skin_tone | |
| 6676 | + person_in_bed_medium_dark_skin_tone | |
| 6677 | + person_in_bed_dark_skin_tone | |
| 6678 | + people_holding_hands | |
| 6679 | + people_holding_hands_light_skin_tone | |
| 6680 | + people_holding_hands_medium_light_skin_tone_light_skin_tone | |
| 6681 | + people_holding_hands_medium_light_skin_tone_light_skin_tone_1 | |
| 6682 | + people_holding_hands_medium_skin_tone_light_skin_tone | |
| 6683 | + people_holding_hands_medium_skin_tone_medium_light_skin_tone | |
| 6684 | + people_holding_hands_medium_skin_tone_medium_light_skin_tone_1 | |
| 6685 | + people_holding_hands_medium_dark_skin_tone_light_skin_tone | |
| 6686 | + people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone | |
| 6687 | + people_holding_hands_medium_dark_skin_tone_medium_skin_tone | |
| 6688 | + people_holding_hands_medium_dark_skin_tone_medium_skin_tone_1 | |
| 6689 | + people_holding_hands_dark_skin_tone_light_skin_tone | |
| 6690 | + people_holding_hands_dark_skin_tone_medium_light_skin_tone | |
| 6691 | + people_holding_hands_dark_skin_tone_medium_skin_tone | |
| 6692 | + people_holding_hands_dark_skin_tone_medium_dark_skin_tone | |
| 6693 | + people_holding_hands_dark_skin_tone_medium_dark_skin_tone_1 | |
| 6694 | + women_holding_hands | |
| 6695 | + women_holding_hands_light_skin_tone | |
| 6696 | + women_holding_hands_medium_light_skin_tone_light_skin_tone | |
| 6697 | + women_holding_hands_medium_light_skin_tone_light_skin_tone_1 | |
| 6698 | + women_holding_hands_medium_skin_tone_light_skin_tone | |
| 6699 | + women_holding_hands_medium_skin_tone_medium_light_skin_tone | |
| 6700 | + women_holding_hands_medium_skin_tone_medium_light_skin_tone_1 | |
| 6701 | + women_holding_hands_medium_dark_skin_tone_light_skin_tone | |
| 6702 | + women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone | |
| 6703 | + women_holding_hands_medium_dark_skin_tone_medium_skin_tone | |
| 6704 | + women_holding_hands_medium_dark_skin_tone_medium_skin_tone_1 | |
| 6705 | + women_holding_hands_dark_skin_tone_light_skin_tone | |
| 6706 | + women_holding_hands_dark_skin_tone_medium_light_skin_tone | |
| 6707 | + women_holding_hands_dark_skin_tone_medium_skin_tone | |
| 6708 | + women_holding_hands_dark_skin_tone_medium_dark_skin_tone | |
| 6709 | + women_holding_hands_dark_skin_tone_medium_dark_skin_tone_1 | |
| 6710 | + woman_and_man_holding_hands | |
| 6711 | + woman_and_man_holding_hands_light_skin_tone | |
| 6712 | + woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone | |
| 6713 | + woman_and_man_holding_hands_light_skin_tone_medium_skin_tone | |
| 6714 | + woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone | |
| 6715 | + woman_and_man_holding_hands_light_skin_tone_dark_skin_tone | |
| 6716 | + woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone | |
| 6717 | + woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone_1 | |
| 6718 | + woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone | |
| 6719 | + woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone | |
| 6720 | + woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone | |
| 6721 | + woman_and_man_holding_hands_medium_skin_tone_light_skin_tone | |
| 6722 | + woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone | |
| 6723 | + woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone_1 | |
| 6724 | + woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone | |
| 6725 | + woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone | |
| 6726 | + woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone | |
| 6727 | + woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone | |
| 6728 | + woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone | |
| 6729 | + woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone_1 | |
| 6730 | + woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone | |
| 6731 | + woman_and_man_holding_hands_dark_skin_tone_light_skin_tone | |
| 6732 | + woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone | |
| 6733 | + woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone | |
| 6734 | + woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone | |
| 6735 | + woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone_1 | |
| 6736 | + men_holding_hands | |
| 6737 | + men_holding_hands_light_skin_tone | |
| 6738 | + men_holding_hands_medium_light_skin_tone_light_skin_tone | |
| 6739 | + men_holding_hands_medium_light_skin_tone_light_skin_tone_1 | |
| 6740 | + men_holding_hands_medium_skin_tone_light_skin_tone | |
| 6741 | + men_holding_hands_medium_skin_tone_medium_light_skin_tone | |
| 6742 | + men_holding_hands_medium_skin_tone_medium_light_skin_tone_1 | |
| 6743 | + men_holding_hands_medium_dark_skin_tone_light_skin_tone | |
| 6744 | + men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone | |
| 6745 | + men_holding_hands_medium_dark_skin_tone_medium_skin_tone | |
| 6746 | + men_holding_hands_medium_dark_skin_tone_medium_skin_tone_1 | |
| 6747 | + men_holding_hands_dark_skin_tone_light_skin_tone | |
| 6748 | + men_holding_hands_dark_skin_tone_medium_light_skin_tone | |
| 6749 | + men_holding_hands_dark_skin_tone_medium_skin_tone | |
| 6750 | + men_holding_hands_dark_skin_tone_medium_dark_skin_tone | |
| 6751 | + men_holding_hands_dark_skin_tone_medium_dark_skin_tone_1 | |
| 6752 | + kiss | |
| 6753 | + kiss_woman_man | |
| 6754 | + kiss_man_man | |
| 6755 | + kiss_woman_woman | |
| 6756 | + couple_with_heart | |
| 6757 | + couple_with_heart_woman_man | |
| 6758 | + couple_with_heart_man_man | |
| 6759 | + couple_with_heart_woman_woman | |
| 6760 | + family | |
| 6761 | + family_man_woman_boy | |
| 6762 | + family_man_woman_girl | |
| 6763 | + family_man_woman_girl_boy | |
| 6764 | + family_man_woman_boy_boy | |
| 6765 | + family_man_woman_girl_girl | |
| 6766 | + family_man_man_boy | |
| 6767 | + family_man_man_girl | |
| 6768 | + family_man_man_girl_boy | |
| 6769 | + family_man_man_boy_boy | |
| 6770 | + family_man_man_girl_girl | |
| 6771 | + family_woman_woman_boy | |
| 6772 | + family_woman_woman_girl | |
| 6773 | + family_woman_woman_girl_boy | |
| 6774 | + family_woman_woman_boy_boy | |
| 6775 | + family_woman_woman_girl_girl | |
| 6776 | + family_man_boy | |
| 6777 | + family_man_boy_boy | |
| 6778 | + family_man_girl | |
| 6779 | + family_man_girl_boy | |
| 6780 | + family_man_girl_girl | |
| 6781 | + family_woman_boy | |
| 6782 | + family_woman_boy_boy | |
| 6783 | + family_woman_girl | |
| 6784 | + family_woman_girl_boy | |
| 6785 | + family_woman_girl_girl | |
| 6786 | + speaking_head | |
| 6787 | + bust_in_silhouette | |
| 6788 | + busts_in_silhouette | |
| 6789 | + footprints | |
| 6790 | +" | |
| 6791 | + | |
| 6792 | +emoji_groups[animals]=" | |
| 6793 | + monkey_face | |
| 6794 | + monkey_face_1 | |
| 6795 | + gorilla | |
| 6796 | + orangutan | |
| 6797 | + dog_face | |
| 6798 | + dog_face_1 | |
| 6799 | + guide_dog | |
| 6800 | + service_dog | |
| 6801 | + poodle | |
| 6802 | + wolf | |
| 6803 | + fox | |
| 6804 | + raccoon | |
| 6805 | + cat_face | |
| 6806 | + cat_face_1 | |
| 6807 | + lion | |
| 6808 | + tiger_face | |
| 6809 | + tiger_face_1 | |
| 6810 | + leopard | |
| 6811 | + horse_face | |
| 6812 | + horse_face_1 | |
| 6813 | + unicorn | |
| 6814 | + zebra | |
| 6815 | + deer | |
| 6816 | + cow_face | |
| 6817 | + ox | |
| 6818 | + water_buffalo | |
| 6819 | + cow | |
| 6820 | + pig_face | |
| 6821 | + pig_face_1 | |
| 6822 | + boar | |
| 6823 | + pig_nose | |
| 6824 | + ram | |
| 6825 | + ewe | |
| 6826 | + goat | |
| 6827 | + camel | |
| 6828 | + two_hump_camel | |
| 6829 | + llama | |
| 6830 | + giraffe | |
| 6831 | + elephant | |
| 6832 | + rhinoceros | |
| 6833 | + hippopotamus | |
| 6834 | + mouse_face | |
| 6835 | + mouse_face_1 | |
| 6836 | + rat | |
| 6837 | + hamster | |
| 6838 | + rabbit_face | |
| 6839 | + rabbit_face_1 | |
| 6840 | + chipmunk | |
| 6841 | + hedgehog | |
| 6842 | + bat | |
| 6843 | + bear | |
| 6844 | + koala | |
| 6845 | + panda | |
| 6846 | + sloth | |
| 6847 | + otter | |
| 6848 | + skunk | |
| 6849 | + kangaroo | |
| 6850 | + badger | |
| 6851 | + paw_prints | |
| 6852 | + turkey | |
| 6853 | + chicken | |
| 6854 | + rooster | |
| 6855 | + hatching_chick | |
| 6856 | + baby_chick | |
| 6857 | + front_facing_baby_chick | |
| 6858 | + bird | |
| 6859 | + penguin | |
| 6860 | + dove | |
| 6861 | + eagle | |
| 6862 | + duck | |
| 6863 | + swan | |
| 6864 | + owl | |
| 6865 | + flamingo | |
| 6866 | + peacock | |
| 6867 | + parrot | |
| 6868 | + frog | |
| 6869 | + crocodile | |
| 6870 | + turtle | |
| 6871 | + lizard | |
| 6872 | + snake | |
| 6873 | + dragon_face | |
| 6874 | + dragon_face_1 | |
| 6875 | + sauropod | |
| 6876 | + T_Rex | |
| 6877 | + spouting_whale | |
| 6878 | + spouting_whale_1 | |
| 6879 | + dolphin | |
| 6880 | + fish | |
| 6881 | + tropical_fish | |
| 6882 | + blowfish | |
| 6883 | + shark | |
| 6884 | + octopus | |
| 6885 | + spiral_shell | |
| 6886 | + snail | |
| 6887 | + butterfly | |
| 6888 | + bug | |
| 6889 | + ant | |
| 6890 | + honeybee | |
| 6891 | + lady_beetle | |
| 6892 | + cricket | |
| 6893 | + spider | |
| 6894 | + spider_web | |
| 6895 | + scorpion | |
| 6896 | + mosquito | |
| 6897 | + microbe | |
| 6898 | +" | |
| 6899 | + | |
| 6900 | +emoji_groups[faces]=" | |
| 6901 | + grinning_face | |
| 6902 | + grinning_face_with_big_eyes | |
| 6903 | + grinning_face_with_smiling_eyes | |
| 6904 | + beaming_face_with_smiling_eyes | |
| 6905 | + grinning_squinting_face | |
| 6906 | + grinning_face_with_sweat | |
| 6907 | + rolling_on_the_floor_laughing | |
| 6908 | + face_with_tears_of_joy | |
| 6909 | + slightly_smiling_face | |
| 6910 | + upside_down_face | |
| 6911 | + winking_face | |
| 6912 | + smiling_face_with_smiling_eyes | |
| 6913 | + smiling_face_with_halo | |
| 6914 | + smiling_face_with_hearts | |
| 6915 | + smiling_face_with_heart_eyes | |
| 6916 | + star_struck | |
| 6917 | + face_blowing_a_kiss | |
| 6918 | + kissing_face | |
| 6919 | + smiling_face | |
| 6920 | + kissing_face_with_closed_eyes | |
| 6921 | + kissing_face_with_smiling_eyes | |
| 6922 | + face_savoring_food | |
| 6923 | + face_with_tongue | |
| 6924 | + winking_face_with_tongue | |
| 6925 | + zany_face | |
| 6926 | + squinting_face_with_tongue | |
| 6927 | + money_mouth_face | |
| 6928 | + hugging_face | |
| 6929 | + face_with_hand_over_mouth | |
| 6930 | + shushing_face | |
| 6931 | + thinking_face | |
| 6932 | + zipper_mouth_face | |
| 6933 | + face_with_raised_eyebrow | |
| 6934 | + neutral_face | |
| 6935 | + expressionless_face | |
| 6936 | + face_without_mouth | |
| 6937 | + smirking_face | |
| 6938 | + unamused_face | |
| 6939 | + face_with_rolling_eyes | |
| 6940 | + grimacing_face | |
| 6941 | + lying_face | |
| 6942 | + relieved_face | |
| 6943 | + pensive_face | |
| 6944 | + sleepy_face | |
| 6945 | + drooling_face | |
| 6946 | + sleeping_face | |
| 6947 | + face_with_medical_mask | |
| 6948 | + face_with_thermometer | |
| 6949 | + face_with_head_bandage | |
| 6950 | + nauseated_face | |
| 6951 | + face_vomiting | |
| 6952 | + sneezing_face | |
| 6953 | + hot_face | |
| 6954 | + cold_face | |
| 6955 | + woozy_face | |
| 6956 | + dizzy_face | |
| 6957 | + exploding_head | |
| 6958 | + cowboy_hat_face | |
| 6959 | + partying_face | |
| 6960 | + smiling_face_with_sunglasses | |
| 6961 | + nerd_face | |
| 6962 | + face_with_monocle | |
| 6963 | + confused_face | |
| 6964 | + worried_face | |
| 6965 | + slightly_frowning_face | |
| 6966 | + slightly_frowning_face_1 | |
| 6967 | + face_with_open_mouth | |
| 6968 | + hushed_face | |
| 6969 | + astonished_face | |
| 6970 | + flushed_face | |
| 6971 | + pleading_face | |
| 6972 | + frowning_face_with_open_mouth | |
| 6973 | + anguished_face | |
| 6974 | + fearful_face | |
| 6975 | + anxious_face_with_sweat | |
| 6976 | + sad_but_relieved_face | |
| 6977 | + crying_face | |
| 6978 | + loudly_crying_face | |
| 6979 | + face_screaming_in_fear | |
| 6980 | + confounded_face | |
| 6981 | + persevering_face | |
| 6982 | + disappointed_face | |
| 6983 | + downcast_face_with_sweat | |
| 6984 | + weary_face | |
| 6985 | + tired_face | |
| 6986 | + yawning_face | |
| 6987 | + face_with_steam_from_nose | |
| 6988 | + pouting_face | |
| 6989 | + angry_face | |
| 6990 | + face_with_symbols_on_mouth | |
| 6991 | + smiling_face_with_horns | |
| 6992 | + angry_face_with_horns | |
| 6993 | + skull | |
| 6994 | + skull_and_crossbones | |
| 6995 | + pile_of_poo | |
| 6996 | + clown_face | |
| 6997 | + ogre | |
| 6998 | + goblin | |
| 6999 | + ghost | |
| 7000 | + alien | |
| 7001 | + alien_monster | |
| 7002 | + robot | |
| 7003 | +" | |
| 7004 | + | |
| 7005 | +emoji_groups[flags]=" | |
| 7006 | + chequered_flag | |
| 7007 | + triangular_flag | |
| 7008 | + crossed_flags | |
| 7009 | + black_flag | |
| 7010 | + white_flag | |
| 7011 | + rainbow_flag | |
| 7012 | + pirate_flag | |
| 7013 | + Ascension_Island | |
| 7014 | + Andorra | |
| 7015 | + United_Arab_Emirates | |
| 7016 | + Afghanistan | |
| 7017 | + Antigua_and_Barbuda | |
| 7018 | + Anguilla | |
| 7019 | + Albania | |
| 7020 | + Armenia | |
| 7021 | + Angola | |
| 7022 | + Antarctica | |
| 7023 | + Argentina | |
| 7024 | + American_Samoa | |
| 7025 | + Austria | |
| 7026 | + Australia | |
| 7027 | + Aruba | |
| 7028 | + ร land_Islands | |
| 7029 | + Azerbaijan | |
| 7030 | + Bosnia_and_Herzegovina | |
| 7031 | + Barbados | |
| 7032 | + Bangladesh | |
| 7033 | + Belgium | |
| 7034 | + Burkina_Faso | |
| 7035 | + Bulgaria | |
| 7036 | + Bahrain | |
| 7037 | + Burundi | |
| 7038 | + Benin | |
| 7039 | + St_Barthรฉlemy | |
| 7040 | + Bermuda | |
| 7041 | + Brunei | |
| 7042 | + Bolivia | |
| 7043 | + Caribbean_Netherlands | |
| 7044 | + Brazil | |
| 7045 | + Bahamas | |
| 7046 | + Bhutan | |
| 7047 | + Bouvet_Island | |
| 7048 | + Botswana | |
| 7049 | + Belarus | |
| 7050 | + Belize | |
| 7051 | + Canada | |
| 7052 | + Cocos_Keeling_Islands | |
| 7053 | + Congo__Kinshasa | |
| 7054 | + Central_African_Republic | |
| 7055 | + Congo__Brazzaville | |
| 7056 | + Switzerland | |
| 7057 | + Cรดte_d_Ivoire | |
| 7058 | + Cook_Islands | |
| 7059 | + Chile | |
| 7060 | + Cameroon | |
| 7061 | + China | |
| 7062 | + Colombia | |
| 7063 | + Clipperton_Island | |
| 7064 | + Costa_Rica | |
| 7065 | + Cuba | |
| 7066 | + Cape_Verde | |
| 7067 | + Curaรงao | |
| 7068 | + Christmas_Island | |
| 7069 | + Cyprus | |
| 7070 | + Czechia | |
| 7071 | + Germany | |
| 7072 | + Diego_Garcia | |
| 7073 | + Djibouti | |
| 7074 | + Denmark | |
| 7075 | + Dominica | |
| 7076 | + Dominican_Republic | |
| 7077 | + Algeria | |
| 7078 | + Ceuta_and_Melilla | |
| 7079 | + Ecuador | |
| 7080 | + Estonia | |
| 7081 | + Egypt | |
| 7082 | + Western_Sahara | |
| 7083 | + Eritrea | |
| 7084 | + Spain | |
| 7085 | + Ethiopia | |
| 7086 | + European_Union | |
| 7087 | + Finland | |
| 7088 | + Fiji | |
| 7089 | + Falkland_Islands | |
| 7090 | + Micronesia | |
| 7091 | + Faroe_Islands | |
| 7092 | + France | |
| 7093 | + Gabon | |
| 7094 | + United_Kingdom | |
| 7095 | + Grenada | |
| 7096 | + Georgia | |
| 7097 | + French_Guiana | |
| 7098 | + Guernsey | |
| 7099 | + Ghana | |
| 7100 | + Gibraltar | |
| 7101 | + Greenland | |
| 7102 | + Gambia | |
| 7103 | + Guinea | |
| 7104 | + Guadeloupe | |
| 7105 | + Equatorial_Guinea | |
| 7106 | + Greece | |
| 7107 | + South_Georgia_and_South_Sandwich_Islands | |
| 7108 | + Guatemala | |
| 7109 | + Guam | |
| 7110 | + Guinea_Bissau | |
| 7111 | + Guyana | |
| 7112 | + Hong_Kong_SAR_China | |
| 7113 | + Heard_and_McDonald_Islands | |
| 7114 | + Honduras | |
| 7115 | + Croatia | |
| 7116 | + Haiti | |
| 7117 | + Hungary | |
| 7118 | + Canary_Islands | |
| 7119 | + Indonesia | |
| 7120 | + Ireland | |
| 7121 | + Israel | |
| 7122 | + Isle_of_Man | |
| 7123 | + India | |
| 7124 | + British_Indian_Ocean_Territory | |
| 7125 | + Iraq | |
| 7126 | + Iran | |
| 7127 | + Iceland | |
| 7128 | + Italy | |
| 7129 | + Jersey | |
| 7130 | + Jamaica | |
| 7131 | + Jordan | |
| 7132 | + Japan | |
| 7133 | + Kenya | |
| 7134 | + Kyrgyzstan | |
| 7135 | + Cambodia | |
| 7136 | + Kiribati | |
| 7137 | + Comoros | |
| 7138 | + St_Kitts_and_Nevis | |
| 7139 | + North_Korea | |
| 7140 | + South_Korea | |
| 7141 | + Kuwait | |
| 7142 | + Cayman_Islands | |
| 7143 | + Kazakhstan | |
| 7144 | + Laos | |
| 7145 | + Lebanon | |
| 7146 | + St_Lucia | |
| 7147 | + Liechtenstein | |
| 7148 | + Sri_Lanka | |
| 7149 | + Liberia | |
| 7150 | + Lesotho | |
| 7151 | + Lithuania | |
| 7152 | + Luxembourg | |
| 7153 | + Latvia | |
| 7154 | + Libya | |
| 7155 | + Morocco | |
| 7156 | + Monaco | |
| 7157 | + Moldova | |
| 7158 | + Montenegro | |
| 7159 | + St_Martin | |
| 7160 | + Madagascar | |
| 7161 | + Marshall_Islands | |
| 7162 | + Macedonia | |
| 7163 | + Mali | |
| 7164 | + Myanmar_Burma_ | |
| 7165 | + Mongolia | |
| 7166 | + Macao_SAR_China | |
| 7167 | + Northern_Mariana_Islands | |
| 7168 | + Martinique | |
| 7169 | + Mauritania | |
| 7170 | + Montserrat | |
| 7171 | + Malta | |
| 7172 | + Mauritius | |
| 7173 | + Maldives | |
| 7174 | + Malawi | |
| 7175 | + Mexico | |
| 7176 | + Malaysia | |
| 7177 | + Mozambique | |
| 7178 | + Namibia | |
| 7179 | + New_Caledonia | |
| 7180 | + Niger | |
| 7181 | + Norfolk_Island | |
| 7182 | + Nigeria | |
| 7183 | + Nicaragua | |
| 7184 | + Netherlands | |
| 7185 | + Norway | |
| 7186 | + Nepal | |
| 7187 | + Nauru | |
| 7188 | + Niue | |
| 7189 | + New_Zealand | |
| 7190 | + Oman | |
| 7191 | + Panama | |
| 7192 | + Peru | |
| 7193 | + French_Polynesia | |
| 7194 | + Papua_New_Guinea | |
| 7195 | + Philippines | |
| 7196 | + Pakistan | |
| 7197 | + Poland | |
| 7198 | + St_Pierre_and_Miquelon | |
| 7199 | + Pitcairn_Islands | |
| 7200 | + Puerto_Rico | |
| 7201 | + Palestinian_Territories | |
| 7202 | + Portugal | |
| 7203 | + Palau | |
| 7204 | + Paraguay | |
| 7205 | + Qatar | |
| 7206 | + Rรฉunion | |
| 7207 | + Romania | |
| 7208 | + Serbia | |
| 7209 | + Russia | |
| 7210 | + Rwanda | |
| 7211 | + Saudi_Arabia | |
| 7212 | + Solomon_Islands | |
| 7213 | + Seychelles | |
| 7214 | + Sudan | |
| 7215 | + Sweden | |
| 7216 | + Singapore | |
| 7217 | + St_Helena | |
| 7218 | + Slovenia | |
| 7219 | + Svalbard_and_Jan_Mayen | |
| 7220 | + Slovakia | |
| 7221 | + Sierra_Leone | |
| 7222 | + San_Marino | |
| 7223 | + Senegal | |
| 7224 | + Somalia | |
| 7225 | + Suriname | |
| 7226 | + South_Sudan | |
| 7227 | + Sรฃo_Tomรฉ_and_Prรญncipe | |
| 7228 | + El_Salvador | |
| 7229 | + Sint_Maarten | |
| 7230 | + Syria | |
| 7231 | + Eswatini | |
| 7232 | + Tristan_da_Cunha | |
| 7233 | + Turks_and_Caicos_Islands | |
| 7234 | + Chad | |
| 7235 | + French_Southern_Territories | |
| 7236 | + Togo | |
| 7237 | + Thailand | |
| 7238 | + Tajikistan | |
| 7239 | + Tokelau | |
| 7240 | + Timor_Leste | |
| 7241 | + Turkmenistan | |
| 7242 | + Tunisia | |
| 7243 | + Tonga | |
| 7244 | + Turkey | |
| 7245 | + Trinidad_and_Tobago | |
| 7246 | + Tuvalu | |
| 7247 | + Taiwan | |
| 7248 | + Tanzania | |
| 7249 | + Ukraine | |
| 7250 | + Uganda | |
| 7251 | + U_S_Outlying_Islands | |
| 7252 | + United_Nations | |
| 7253 | + United_States | |
| 7254 | + Uruguay | |
| 7255 | + Uzbekistan | |
| 7256 | + Vatican_City | |
| 7257 | + St_Vincent_and_Grenadines | |
| 7258 | + Venezuela | |
| 7259 | + British_Virgin_Islands | |
| 7260 | + U_S_Virgin_Islands | |
| 7261 | + Vietnam | |
| 7262 | + Vanuatu | |
| 7263 | + Wallis_and_Futuna | |
| 7264 | + Samoa | |
| 7265 | + Kosovo | |
| 7266 | + Yemen | |
| 7267 | + Mayotte | |
| 7268 | + South_Africa | |
| 7269 | + Zambia | |
| 7270 | + Zimbabwe | |
| 7271 | + England | |
| 7272 | + Scotland | |
| 7273 | + Wales | |
| 7274 | +" |
+4122-0.oh-my-zsh/plugins/emoji/emoji-data.txt
| @@ -0,0 +1,4122 @@ | ||
| 1 | +# emoji-data.txt | |
| 2 | +# (Originally emoji-test.txt) | |
| 3 | +# (Retrieved from https://unicode.org/Public/emoji/12.0/emoji-test.txt) | |
| 4 | + | |
| 5 | +# Date: 2019-01-27, 15:43:01 GMT | |
| 6 | +# ยฉ 2019 Unicodeยฎ, Inc. | |
| 7 | +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. | |
| 8 | +# For terms of use, see http://www.unicode.org/terms_of_use.html | |
| 9 | +# | |
| 10 | +# Emoji Keyboard/Display Test Data for UTS #51 | |
| 11 | +# Version: 12.0 | |
| 12 | +# | |
| 13 | +# For documentation and usage, see http://www.unicode.org/reports/tr51 | |
| 14 | +# | |
| 15 | +# This file provides data for testing which emoji forms should be in keyboards and which should also be displayed/processed. | |
| 16 | +# Format: code points; status # emoji name | |
| 17 | +# Code points โ list of one or more hex code points, separated by spaces | |
| 18 | +# Status | |
| 19 | +# component โ an Emoji_Component, | |
| 20 | +# excluding Regional_Indicators, ASCII, and non-Emoji. | |
| 21 | +# fully-qualified โ a fully-qualified emoji (see ED-18 in UTS #51), | |
| 22 | +# excluding Emoji_Component | |
| 23 | +# minimally-qualified โ a minimally-qualified emoji (see ED-18a in UTS #51) | |
| 24 | +# unqualified โ a unqualified emoji (See ED-19 in UTS #51) | |
| 25 | +# Notes: | |
| 26 | +# โข This includes the emoji components that need emoji presentation (skin tone and hair) | |
| 27 | +# when isolated, but omits the components that need not have an emoji | |
| 28 | +# presentation when isolated. | |
| 29 | +# โข The RGI set is covered by the listed fully-qualified emoji. | |
| 30 | +# โข The listed minimally-qualified and unqualified cover all cases where an | |
| 31 | +# element of the RGI set is missing one or more emoji presentation selectors. | |
| 32 | +# โข The file is in CLDR order, not codepoint order. This is recommended (but not required!) for keyboard palettes. | |
| 33 | +# โข The groups and subgroups are illustrative. See the Emoji Order chart for more information. | |
| 34 | + | |
| 35 | + | |
| 36 | +# group: Smileys & Emotion | |
| 37 | + | |
| 38 | +# subgroup: face-smiling | |
| 39 | +1F600 ; fully-qualified # ๐ grinning face | |
| 40 | +1F603 ; fully-qualified # ๐ grinning face with big eyes | |
| 41 | +1F604 ; fully-qualified # ๐ grinning face with smiling eyes | |
| 42 | +1F601 ; fully-qualified # ๐ beaming face with smiling eyes | |
| 43 | +1F606 ; fully-qualified # ๐ grinning squinting face | |
| 44 | +1F605 ; fully-qualified # ๐ grinning face with sweat | |
| 45 | +1F923 ; fully-qualified # ๐คฃ rolling on the floor laughing | |
| 46 | +1F602 ; fully-qualified # ๐ face with tears of joy | |
| 47 | +1F642 ; fully-qualified # ๐ slightly smiling face | |
| 48 | +1F643 ; fully-qualified # ๐ upside-down face | |
| 49 | +1F609 ; fully-qualified # ๐ winking face | |
| 50 | +1F60A ; fully-qualified # ๐ smiling face with smiling eyes | |
| 51 | +1F607 ; fully-qualified # ๐ smiling face with halo | |
| 52 | + | |
| 53 | +# subgroup: face-affection | |
| 54 | +1F970 ; fully-qualified # ๐ฅฐ smiling face with hearts | |
| 55 | +1F60D ; fully-qualified # ๐ smiling face with heart-eyes | |
| 56 | +1F929 ; fully-qualified # ๐คฉ star-struck | |
| 57 | +1F618 ; fully-qualified # ๐ face blowing a kiss | |
| 58 | +1F617 ; fully-qualified # ๐ kissing face | |
| 59 | +263A FE0F ; fully-qualified # โบ๏ธ smiling face | |
| 60 | +263A ; unqualified # โบ smiling face | |
| 61 | +1F61A ; fully-qualified # ๐ kissing face with closed eyes | |
| 62 | +1F619 ; fully-qualified # ๐ kissing face with smiling eyes | |
| 63 | + | |
| 64 | +# subgroup: face-tongue | |
| 65 | +1F60B ; fully-qualified # ๐ face savoring food | |
| 66 | +1F61B ; fully-qualified # ๐ face with tongue | |
| 67 | +1F61C ; fully-qualified # ๐ winking face with tongue | |
| 68 | +1F92A ; fully-qualified # ๐คช zany face | |
| 69 | +1F61D ; fully-qualified # ๐ squinting face with tongue | |
| 70 | +1F911 ; fully-qualified # ๐ค money-mouth face | |
| 71 | + | |
| 72 | +# subgroup: face-hand | |
| 73 | +1F917 ; fully-qualified # ๐ค hugging face | |
| 74 | +1F92D ; fully-qualified # ๐คญ face with hand over mouth | |
| 75 | +1F92B ; fully-qualified # ๐คซ shushing face | |
| 76 | +1F914 ; fully-qualified # ๐ค thinking face | |
| 77 | + | |
| 78 | +# subgroup: face-neutral-skeptical | |
| 79 | +1F910 ; fully-qualified # ๐ค zipper-mouth face | |
| 80 | +1F928 ; fully-qualified # ๐คจ face with raised eyebrow | |
| 81 | +1F610 ; fully-qualified # ๐ neutral face | |
| 82 | +1F611 ; fully-qualified # ๐ expressionless face | |
| 83 | +1F636 ; fully-qualified # ๐ถ face without mouth | |
| 84 | +1F60F ; fully-qualified # ๐ smirking face | |
| 85 | +1F612 ; fully-qualified # ๐ unamused face | |
| 86 | +1F644 ; fully-qualified # ๐ face with rolling eyes | |
| 87 | +1F62C ; fully-qualified # ๐ฌ grimacing face | |
| 88 | +1F925 ; fully-qualified # ๐คฅ lying face | |
| 89 | + | |
| 90 | +# subgroup: face-sleepy | |
| 91 | +1F60C ; fully-qualified # ๐ relieved face | |
| 92 | +1F614 ; fully-qualified # ๐ pensive face | |
| 93 | +1F62A ; fully-qualified # ๐ช sleepy face | |
| 94 | +1F924 ; fully-qualified # ๐คค drooling face | |
| 95 | +1F634 ; fully-qualified # ๐ด sleeping face | |
| 96 | + | |
| 97 | +# subgroup: face-unwell | |
| 98 | +1F637 ; fully-qualified # ๐ท face with medical mask | |
| 99 | +1F912 ; fully-qualified # ๐ค face with thermometer | |
| 100 | +1F915 ; fully-qualified # ๐ค face with head-bandage | |
| 101 | +1F922 ; fully-qualified # ๐คข nauseated face | |
| 102 | +1F92E ; fully-qualified # ๐คฎ face vomiting | |
| 103 | +1F927 ; fully-qualified # ๐คง sneezing face | |
| 104 | +1F975 ; fully-qualified # ๐ฅต hot face | |
| 105 | +1F976 ; fully-qualified # ๐ฅถ cold face | |
| 106 | +1F974 ; fully-qualified # ๐ฅด woozy face | |
| 107 | +1F635 ; fully-qualified # ๐ต dizzy face | |
| 108 | +1F92F ; fully-qualified # ๐คฏ exploding head | |
| 109 | + | |
| 110 | +# subgroup: face-hat | |
| 111 | +1F920 ; fully-qualified # ๐ค cowboy hat face | |
| 112 | +1F973 ; fully-qualified # ๐ฅณ partying face | |
| 113 | + | |
| 114 | +# subgroup: face-glasses | |
| 115 | +1F60E ; fully-qualified # ๐ smiling face with sunglasses | |
| 116 | +1F913 ; fully-qualified # ๐ค nerd face | |
| 117 | +1F9D0 ; fully-qualified # ๐ง face with monocle | |
| 118 | + | |
| 119 | +# subgroup: face-concerned | |
| 120 | +1F615 ; fully-qualified # ๐ confused face | |
| 121 | +1F61F ; fully-qualified # ๐ worried face | |
| 122 | +1F641 ; fully-qualified # ๐ slightly frowning face | |
| 123 | +2639 FE0F ; fully-qualified # โน๏ธ frowning face | |
| 124 | +2639 ; unqualified # โน frowning face | |
| 125 | +1F62E ; fully-qualified # ๐ฎ face with open mouth | |
| 126 | +1F62F ; fully-qualified # ๐ฏ hushed face | |
| 127 | +1F632 ; fully-qualified # ๐ฒ astonished face | |
| 128 | +1F633 ; fully-qualified # ๐ณ flushed face | |
| 129 | +1F97A ; fully-qualified # ๐ฅบ pleading face | |
| 130 | +1F626 ; fully-qualified # ๐ฆ frowning face with open mouth | |
| 131 | +1F627 ; fully-qualified # ๐ง anguished face | |
| 132 | +1F628 ; fully-qualified # ๐จ fearful face | |
| 133 | +1F630 ; fully-qualified # ๐ฐ anxious face with sweat | |
| 134 | +1F625 ; fully-qualified # ๐ฅ sad but relieved face | |
| 135 | +1F622 ; fully-qualified # ๐ข crying face | |
| 136 | +1F62D ; fully-qualified # ๐ญ loudly crying face | |
| 137 | +1F631 ; fully-qualified # ๐ฑ face screaming in fear | |
| 138 | +1F616 ; fully-qualified # ๐ confounded face | |
| 139 | +1F623 ; fully-qualified # ๐ฃ persevering face | |
| 140 | +1F61E ; fully-qualified # ๐ disappointed face | |
| 141 | +1F613 ; fully-qualified # ๐ downcast face with sweat | |
| 142 | +1F629 ; fully-qualified # ๐ฉ weary face | |
| 143 | +1F62B ; fully-qualified # ๐ซ tired face | |
| 144 | +1F971 ; fully-qualified # ๐ฅฑ yawning face | |
| 145 | + | |
| 146 | +# subgroup: face-negative | |
| 147 | +1F624 ; fully-qualified # ๐ค face with steam from nose | |
| 148 | +1F621 ; fully-qualified # ๐ก pouting face | |
| 149 | +1F620 ; fully-qualified # ๐ angry face | |
| 150 | +1F92C ; fully-qualified # ๐คฌ face with symbols on mouth | |
| 151 | +1F608 ; fully-qualified # ๐ smiling face with horns | |
| 152 | +1F47F ; fully-qualified # ๐ฟ angry face with horns | |
| 153 | +1F480 ; fully-qualified # ๐ skull | |
| 154 | +2620 FE0F ; fully-qualified # โ ๏ธ skull and crossbones | |
| 155 | +2620 ; unqualified # โ skull and crossbones | |
| 156 | + | |
| 157 | +# subgroup: face-costume | |
| 158 | +1F4A9 ; fully-qualified # ๐ฉ pile of poo | |
| 159 | +1F921 ; fully-qualified # ๐คก clown face | |
| 160 | +1F479 ; fully-qualified # ๐น ogre | |
| 161 | +1F47A ; fully-qualified # ๐บ goblin | |
| 162 | +1F47B ; fully-qualified # ๐ป ghost | |
| 163 | +1F47D ; fully-qualified # ๐ฝ alien | |
| 164 | +1F47E ; fully-qualified # ๐พ alien monster | |
| 165 | +1F916 ; fully-qualified # ๐ค robot | |
| 166 | + | |
| 167 | +# subgroup: cat-face | |
| 168 | +1F63A ; fully-qualified # ๐บ grinning cat | |
| 169 | +1F638 ; fully-qualified # ๐ธ grinning cat with smiling eyes | |
| 170 | +1F639 ; fully-qualified # ๐น cat with tears of joy | |
| 171 | +1F63B ; fully-qualified # ๐ป smiling cat with heart-eyes | |
| 172 | +1F63C ; fully-qualified # ๐ผ cat with wry smile | |
| 173 | +1F63D ; fully-qualified # ๐ฝ kissing cat | |
| 174 | +1F640 ; fully-qualified # ๐ weary cat | |
| 175 | +1F63F ; fully-qualified # ๐ฟ crying cat | |
| 176 | +1F63E ; fully-qualified # ๐พ pouting cat | |
| 177 | + | |
| 178 | +# subgroup: monkey-face | |
| 179 | +1F648 ; fully-qualified # ๐ see-no-evil monkey | |
| 180 | +1F649 ; fully-qualified # ๐ hear-no-evil monkey | |
| 181 | +1F64A ; fully-qualified # ๐ speak-no-evil monkey | |
| 182 | + | |
| 183 | +# subgroup: emotion | |
| 184 | +1F48B ; fully-qualified # ๐ kiss mark | |
| 185 | +1F48C ; fully-qualified # ๐ love letter | |
| 186 | +1F498 ; fully-qualified # ๐ heart with arrow | |
| 187 | +1F49D ; fully-qualified # ๐ heart with ribbon | |
| 188 | +1F496 ; fully-qualified # ๐ sparkling heart | |
| 189 | +1F497 ; fully-qualified # ๐ growing heart | |
| 190 | +1F493 ; fully-qualified # ๐ beating heart | |
| 191 | +1F49E ; fully-qualified # ๐ revolving hearts | |
| 192 | +1F495 ; fully-qualified # ๐ two hearts | |
| 193 | +1F49F ; fully-qualified # ๐ heart decoration | |
| 194 | +2763 FE0F ; fully-qualified # โฃ๏ธ heart exclamation | |
| 195 | +2763 ; unqualified # โฃ heart exclamation | |
| 196 | +1F494 ; fully-qualified # ๐ broken heart | |
| 197 | +2764 FE0F ; fully-qualified # โค๏ธ red heart | |
| 198 | +2764 ; unqualified # โค red heart | |
| 199 | +1F9E1 ; fully-qualified # ๐งก orange heart | |
| 200 | +1F49B ; fully-qualified # ๐ yellow heart | |
| 201 | +1F49A ; fully-qualified # ๐ green heart | |
| 202 | +1F499 ; fully-qualified # ๐ blue heart | |
| 203 | +1F49C ; fully-qualified # ๐ purple heart | |
| 204 | +1F90E ; fully-qualified # ๐ค brown heart | |
| 205 | +1F5A4 ; fully-qualified # ๐ค black heart | |
| 206 | +1F90D ; fully-qualified # ๐ค white heart | |
| 207 | +1F4AF ; fully-qualified # ๐ฏ hundred points | |
| 208 | +1F4A2 ; fully-qualified # ๐ข anger symbol | |
| 209 | +1F4A5 ; fully-qualified # ๐ฅ collision | |
| 210 | +1F4AB ; fully-qualified # ๐ซ dizzy | |
| 211 | +1F4A6 ; fully-qualified # ๐ฆ sweat droplets | |
| 212 | +1F4A8 ; fully-qualified # ๐จ dashing away | |
| 213 | +1F573 FE0F ; fully-qualified # ๐ณ๏ธ hole | |
| 214 | +1F573 ; unqualified # ๐ณ hole | |
| 215 | +1F4A3 ; fully-qualified # ๐ฃ bomb | |
| 216 | +1F4AC ; fully-qualified # ๐ฌ speech balloon | |
| 217 | +1F441 FE0F 200D 1F5E8 FE0F ; fully-qualified # ๐๏ธโ๐จ๏ธ eye in speech bubble | |
| 218 | +1F441 200D 1F5E8 FE0F ; unqualified # ๐โ๐จ๏ธ eye in speech bubble | |
| 219 | +1F441 FE0F 200D 1F5E8 ; unqualified # ๐๏ธโ๐จ eye in speech bubble | |
| 220 | +1F441 200D 1F5E8 ; unqualified # ๐โ๐จ eye in speech bubble | |
| 221 | +1F5E8 FE0F ; fully-qualified # ๐จ๏ธ left speech bubble | |
| 222 | +1F5E8 ; unqualified # ๐จ left speech bubble | |
| 223 | +1F5EF FE0F ; fully-qualified # ๐ฏ๏ธ right anger bubble | |
| 224 | +1F5EF ; unqualified # ๐ฏ right anger bubble | |
| 225 | +1F4AD ; fully-qualified # ๐ญ thought balloon | |
| 226 | +1F4A4 ; fully-qualified # ๐ค zzz | |
| 227 | + | |
| 228 | +# Smileys & Emotion subtotal: 160 | |
| 229 | +# Smileys & Emotion subtotal: 160 w/o modifiers | |
| 230 | + | |
| 231 | +# group: People & Body | |
| 232 | + | |
| 233 | +# subgroup: hand-fingers-open | |
| 234 | +1F44B ; fully-qualified # ๐ waving hand | |
| 235 | +1F44B 1F3FB ; fully-qualified # ๐๐ป waving hand: light skin tone | |
| 236 | +1F44B 1F3FC ; fully-qualified # ๐๐ผ waving hand: medium-light skin tone | |
| 237 | +1F44B 1F3FD ; fully-qualified # ๐๐ฝ waving hand: medium skin tone | |
| 238 | +1F44B 1F3FE ; fully-qualified # ๐๐พ waving hand: medium-dark skin tone | |
| 239 | +1F44B 1F3FF ; fully-qualified # ๐๐ฟ waving hand: dark skin tone | |
| 240 | +1F91A ; fully-qualified # ๐ค raised back of hand | |
| 241 | +1F91A 1F3FB ; fully-qualified # ๐ค๐ป raised back of hand: light skin tone | |
| 242 | +1F91A 1F3FC ; fully-qualified # ๐ค๐ผ raised back of hand: medium-light skin tone | |
| 243 | +1F91A 1F3FD ; fully-qualified # ๐ค๐ฝ raised back of hand: medium skin tone | |
| 244 | +1F91A 1F3FE ; fully-qualified # ๐ค๐พ raised back of hand: medium-dark skin tone | |
| 245 | +1F91A 1F3FF ; fully-qualified # ๐ค๐ฟ raised back of hand: dark skin tone | |
| 246 | +1F590 FE0F ; fully-qualified # ๐๏ธ hand with fingers splayed | |
| 247 | +1F590 ; unqualified # ๐ hand with fingers splayed | |
| 248 | +1F590 1F3FB ; fully-qualified # ๐๐ป hand with fingers splayed: light skin tone | |
| 249 | +1F590 1F3FC ; fully-qualified # ๐๐ผ hand with fingers splayed: medium-light skin tone | |
| 250 | +1F590 1F3FD ; fully-qualified # ๐๐ฝ hand with fingers splayed: medium skin tone | |
| 251 | +1F590 1F3FE ; fully-qualified # ๐๐พ hand with fingers splayed: medium-dark skin tone | |
| 252 | +1F590 1F3FF ; fully-qualified # ๐๐ฟ hand with fingers splayed: dark skin tone | |
| 253 | +270B ; fully-qualified # โ raised hand | |
| 254 | +270B 1F3FB ; fully-qualified # โ๐ป raised hand: light skin tone | |
| 255 | +270B 1F3FC ; fully-qualified # โ๐ผ raised hand: medium-light skin tone | |
| 256 | +270B 1F3FD ; fully-qualified # โ๐ฝ raised hand: medium skin tone | |
| 257 | +270B 1F3FE ; fully-qualified # โ๐พ raised hand: medium-dark skin tone | |
| 258 | +270B 1F3FF ; fully-qualified # โ๐ฟ raised hand: dark skin tone | |
| 259 | +1F596 ; fully-qualified # ๐ vulcan salute | |
| 260 | +1F596 1F3FB ; fully-qualified # ๐๐ป vulcan salute: light skin tone | |
| 261 | +1F596 1F3FC ; fully-qualified # ๐๐ผ vulcan salute: medium-light skin tone | |
| 262 | +1F596 1F3FD ; fully-qualified # ๐๐ฝ vulcan salute: medium skin tone | |
| 263 | +1F596 1F3FE ; fully-qualified # ๐๐พ vulcan salute: medium-dark skin tone | |
| 264 | +1F596 1F3FF ; fully-qualified # ๐๐ฟ vulcan salute: dark skin tone | |
| 265 | + | |
| 266 | +# subgroup: hand-fingers-partial | |
| 267 | +1F44C ; fully-qualified # ๐ OK hand | |
| 268 | +1F44C 1F3FB ; fully-qualified # ๐๐ป OK hand: light skin tone | |
| 269 | +1F44C 1F3FC ; fully-qualified # ๐๐ผ OK hand: medium-light skin tone | |
| 270 | +1F44C 1F3FD ; fully-qualified # ๐๐ฝ OK hand: medium skin tone | |
| 271 | +1F44C 1F3FE ; fully-qualified # ๐๐พ OK hand: medium-dark skin tone | |
| 272 | +1F44C 1F3FF ; fully-qualified # ๐๐ฟ OK hand: dark skin tone | |
| 273 | +1F90F ; fully-qualified # ๐ค pinching hand | |
| 274 | +1F90F 1F3FB ; fully-qualified # ๐ค๐ป pinching hand: light skin tone | |
| 275 | +1F90F 1F3FC ; fully-qualified # ๐ค๐ผ pinching hand: medium-light skin tone | |
| 276 | +1F90F 1F3FD ; fully-qualified # ๐ค๐ฝ pinching hand: medium skin tone | |
| 277 | +1F90F 1F3FE ; fully-qualified # ๐ค๐พ pinching hand: medium-dark skin tone | |
| 278 | +1F90F 1F3FF ; fully-qualified # ๐ค๐ฟ pinching hand: dark skin tone | |
| 279 | +270C FE0F ; fully-qualified # โ๏ธ victory hand | |
| 280 | +270C ; unqualified # โ victory hand | |
| 281 | +270C 1F3FB ; fully-qualified # โ๐ป victory hand: light skin tone | |
| 282 | +270C 1F3FC ; fully-qualified # โ๐ผ victory hand: medium-light skin tone | |
| 283 | +270C 1F3FD ; fully-qualified # โ๐ฝ victory hand: medium skin tone | |
| 284 | +270C 1F3FE ; fully-qualified # โ๐พ victory hand: medium-dark skin tone | |
| 285 | +270C 1F3FF ; fully-qualified # โ๐ฟ victory hand: dark skin tone | |
| 286 | +1F91E ; fully-qualified # ๐ค crossed fingers | |
| 287 | +1F91E 1F3FB ; fully-qualified # ๐ค๐ป crossed fingers: light skin tone | |
| 288 | +1F91E 1F3FC ; fully-qualified # ๐ค๐ผ crossed fingers: medium-light skin tone | |
| 289 | +1F91E 1F3FD ; fully-qualified # ๐ค๐ฝ crossed fingers: medium skin tone | |
| 290 | +1F91E 1F3FE ; fully-qualified # ๐ค๐พ crossed fingers: medium-dark skin tone | |
| 291 | +1F91E 1F3FF ; fully-qualified # ๐ค๐ฟ crossed fingers: dark skin tone | |
| 292 | +1F91F ; fully-qualified # ๐ค love-you gesture | |
| 293 | +1F91F 1F3FB ; fully-qualified # ๐ค๐ป love-you gesture: light skin tone | |
| 294 | +1F91F 1F3FC ; fully-qualified # ๐ค๐ผ love-you gesture: medium-light skin tone | |
| 295 | +1F91F 1F3FD ; fully-qualified # ๐ค๐ฝ love-you gesture: medium skin tone | |
| 296 | +1F91F 1F3FE ; fully-qualified # ๐ค๐พ love-you gesture: medium-dark skin tone | |
| 297 | +1F91F 1F3FF ; fully-qualified # ๐ค๐ฟ love-you gesture: dark skin tone | |
| 298 | +1F918 ; fully-qualified # ๐ค sign of the horns | |
| 299 | +1F918 1F3FB ; fully-qualified # ๐ค๐ป sign of the horns: light skin tone | |
| 300 | +1F918 1F3FC ; fully-qualified # ๐ค๐ผ sign of the horns: medium-light skin tone | |
| 301 | +1F918 1F3FD ; fully-qualified # ๐ค๐ฝ sign of the horns: medium skin tone | |
| 302 | +1F918 1F3FE ; fully-qualified # ๐ค๐พ sign of the horns: medium-dark skin tone | |
| 303 | +1F918 1F3FF ; fully-qualified # ๐ค๐ฟ sign of the horns: dark skin tone | |
| 304 | +1F919 ; fully-qualified # ๐ค call me hand | |
| 305 | +1F919 1F3FB ; fully-qualified # ๐ค๐ป call me hand: light skin tone | |
| 306 | +1F919 1F3FC ; fully-qualified # ๐ค๐ผ call me hand: medium-light skin tone | |
| 307 | +1F919 1F3FD ; fully-qualified # ๐ค๐ฝ call me hand: medium skin tone | |
| 308 | +1F919 1F3FE ; fully-qualified # ๐ค๐พ call me hand: medium-dark skin tone | |
| 309 | +1F919 1F3FF ; fully-qualified # ๐ค๐ฟ call me hand: dark skin tone | |
| 310 | + | |
| 311 | +# subgroup: hand-single-finger | |
| 312 | +1F448 ; fully-qualified # ๐ backhand index pointing left | |
| 313 | +1F448 1F3FB ; fully-qualified # ๐๐ป backhand index pointing left: light skin tone | |
| 314 | +1F448 1F3FC ; fully-qualified # ๐๐ผ backhand index pointing left: medium-light skin tone | |
| 315 | +1F448 1F3FD ; fully-qualified # ๐๐ฝ backhand index pointing left: medium skin tone | |
| 316 | +1F448 1F3FE ; fully-qualified # ๐๐พ backhand index pointing left: medium-dark skin tone | |
| 317 | +1F448 1F3FF ; fully-qualified # ๐๐ฟ backhand index pointing left: dark skin tone | |
| 318 | +1F449 ; fully-qualified # ๐ backhand index pointing right | |
| 319 | +1F449 1F3FB ; fully-qualified # ๐๐ป backhand index pointing right: light skin tone | |
| 320 | +1F449 1F3FC ; fully-qualified # ๐๐ผ backhand index pointing right: medium-light skin tone | |
| 321 | +1F449 1F3FD ; fully-qualified # ๐๐ฝ backhand index pointing right: medium skin tone | |
| 322 | +1F449 1F3FE ; fully-qualified # ๐๐พ backhand index pointing right: medium-dark skin tone | |
| 323 | +1F449 1F3FF ; fully-qualified # ๐๐ฟ backhand index pointing right: dark skin tone | |
| 324 | +1F446 ; fully-qualified # ๐ backhand index pointing up | |
| 325 | +1F446 1F3FB ; fully-qualified # ๐๐ป backhand index pointing up: light skin tone | |
| 326 | +1F446 1F3FC ; fully-qualified # ๐๐ผ backhand index pointing up: medium-light skin tone | |
| 327 | +1F446 1F3FD ; fully-qualified # ๐๐ฝ backhand index pointing up: medium skin tone | |
| 328 | +1F446 1F3FE ; fully-qualified # ๐๐พ backhand index pointing up: medium-dark skin tone | |
| 329 | +1F446 1F3FF ; fully-qualified # ๐๐ฟ backhand index pointing up: dark skin tone | |
| 330 | +1F595 ; fully-qualified # ๐ middle finger | |
| 331 | +1F595 1F3FB ; fully-qualified # ๐๐ป middle finger: light skin tone | |
| 332 | +1F595 1F3FC ; fully-qualified # ๐๐ผ middle finger: medium-light skin tone | |
| 333 | +1F595 1F3FD ; fully-qualified # ๐๐ฝ middle finger: medium skin tone | |
| 334 | +1F595 1F3FE ; fully-qualified # ๐๐พ middle finger: medium-dark skin tone | |
| 335 | +1F595 1F3FF ; fully-qualified # ๐๐ฟ middle finger: dark skin tone | |
| 336 | +1F447 ; fully-qualified # ๐ backhand index pointing down | |
| 337 | +1F447 1F3FB ; fully-qualified # ๐๐ป backhand index pointing down: light skin tone | |
| 338 | +1F447 1F3FC ; fully-qualified # ๐๐ผ backhand index pointing down: medium-light skin tone | |
| 339 | +1F447 1F3FD ; fully-qualified # ๐๐ฝ backhand index pointing down: medium skin tone | |
| 340 | +1F447 1F3FE ; fully-qualified # ๐๐พ backhand index pointing down: medium-dark skin tone | |
| 341 | +1F447 1F3FF ; fully-qualified # ๐๐ฟ backhand index pointing down: dark skin tone | |
| 342 | +261D FE0F ; fully-qualified # โ๏ธ index pointing up | |
| 343 | +261D ; unqualified # โ index pointing up | |
| 344 | +261D 1F3FB ; fully-qualified # โ๐ป index pointing up: light skin tone | |
| 345 | +261D 1F3FC ; fully-qualified # โ๐ผ index pointing up: medium-light skin tone | |
| 346 | +261D 1F3FD ; fully-qualified # โ๐ฝ index pointing up: medium skin tone | |
| 347 | +261D 1F3FE ; fully-qualified # โ๐พ index pointing up: medium-dark skin tone | |
| 348 | +261D 1F3FF ; fully-qualified # โ๐ฟ index pointing up: dark skin tone | |
| 349 | + | |
| 350 | +# subgroup: hand-fingers-closed | |
| 351 | +1F44D ; fully-qualified # ๐ thumbs up | |
| 352 | +1F44D 1F3FB ; fully-qualified # ๐๐ป thumbs up: light skin tone | |
| 353 | +1F44D 1F3FC ; fully-qualified # ๐๐ผ thumbs up: medium-light skin tone | |
| 354 | +1F44D 1F3FD ; fully-qualified # ๐๐ฝ thumbs up: medium skin tone | |
| 355 | +1F44D 1F3FE ; fully-qualified # ๐๐พ thumbs up: medium-dark skin tone | |
| 356 | +1F44D 1F3FF ; fully-qualified # ๐๐ฟ thumbs up: dark skin tone | |
| 357 | +1F44E ; fully-qualified # ๐ thumbs down | |
| 358 | +1F44E 1F3FB ; fully-qualified # ๐๐ป thumbs down: light skin tone | |
| 359 | +1F44E 1F3FC ; fully-qualified # ๐๐ผ thumbs down: medium-light skin tone | |
| 360 | +1F44E 1F3FD ; fully-qualified # ๐๐ฝ thumbs down: medium skin tone | |
| 361 | +1F44E 1F3FE ; fully-qualified # ๐๐พ thumbs down: medium-dark skin tone | |
| 362 | +1F44E 1F3FF ; fully-qualified # ๐๐ฟ thumbs down: dark skin tone | |
| 363 | +270A ; fully-qualified # โ raised fist | |
| 364 | +270A 1F3FB ; fully-qualified # โ๐ป raised fist: light skin tone | |
| 365 | +270A 1F3FC ; fully-qualified # โ๐ผ raised fist: medium-light skin tone | |
| 366 | +270A 1F3FD ; fully-qualified # โ๐ฝ raised fist: medium skin tone | |
| 367 | +270A 1F3FE ; fully-qualified # โ๐พ raised fist: medium-dark skin tone | |
| 368 | +270A 1F3FF ; fully-qualified # โ๐ฟ raised fist: dark skin tone | |
| 369 | +1F44A ; fully-qualified # ๐ oncoming fist | |
| 370 | +1F44A 1F3FB ; fully-qualified # ๐๐ป oncoming fist: light skin tone | |
| 371 | +1F44A 1F3FC ; fully-qualified # ๐๐ผ oncoming fist: medium-light skin tone | |
| 372 | +1F44A 1F3FD ; fully-qualified # ๐๐ฝ oncoming fist: medium skin tone | |
| 373 | +1F44A 1F3FE ; fully-qualified # ๐๐พ oncoming fist: medium-dark skin tone | |
| 374 | +1F44A 1F3FF ; fully-qualified # ๐๐ฟ oncoming fist: dark skin tone | |
| 375 | +1F91B ; fully-qualified # ๐ค left-facing fist | |
| 376 | +1F91B 1F3FB ; fully-qualified # ๐ค๐ป left-facing fist: light skin tone | |
| 377 | +1F91B 1F3FC ; fully-qualified # ๐ค๐ผ left-facing fist: medium-light skin tone | |
| 378 | +1F91B 1F3FD ; fully-qualified # ๐ค๐ฝ left-facing fist: medium skin tone | |
| 379 | +1F91B 1F3FE ; fully-qualified # ๐ค๐พ left-facing fist: medium-dark skin tone | |
| 380 | +1F91B 1F3FF ; fully-qualified # ๐ค๐ฟ left-facing fist: dark skin tone | |
| 381 | +1F91C ; fully-qualified # ๐ค right-facing fist | |
| 382 | +1F91C 1F3FB ; fully-qualified # ๐ค๐ป right-facing fist: light skin tone | |
| 383 | +1F91C 1F3FC ; fully-qualified # ๐ค๐ผ right-facing fist: medium-light skin tone | |
| 384 | +1F91C 1F3FD ; fully-qualified # ๐ค๐ฝ right-facing fist: medium skin tone | |
| 385 | +1F91C 1F3FE ; fully-qualified # ๐ค๐พ right-facing fist: medium-dark skin tone | |
| 386 | +1F91C 1F3FF ; fully-qualified # ๐ค๐ฟ right-facing fist: dark skin tone | |
| 387 | + | |
| 388 | +# subgroup: hands | |
| 389 | +1F44F ; fully-qualified # ๐ clapping hands | |
| 390 | +1F44F 1F3FB ; fully-qualified # ๐๐ป clapping hands: light skin tone | |
| 391 | +1F44F 1F3FC ; fully-qualified # ๐๐ผ clapping hands: medium-light skin tone | |
| 392 | +1F44F 1F3FD ; fully-qualified # ๐๐ฝ clapping hands: medium skin tone | |
| 393 | +1F44F 1F3FE ; fully-qualified # ๐๐พ clapping hands: medium-dark skin tone | |
| 394 | +1F44F 1F3FF ; fully-qualified # ๐๐ฟ clapping hands: dark skin tone | |
| 395 | +1F64C ; fully-qualified # ๐ raising hands | |
| 396 | +1F64C 1F3FB ; fully-qualified # ๐๐ป raising hands: light skin tone | |
| 397 | +1F64C 1F3FC ; fully-qualified # ๐๐ผ raising hands: medium-light skin tone | |
| 398 | +1F64C 1F3FD ; fully-qualified # ๐๐ฝ raising hands: medium skin tone | |
| 399 | +1F64C 1F3FE ; fully-qualified # ๐๐พ raising hands: medium-dark skin tone | |
| 400 | +1F64C 1F3FF ; fully-qualified # ๐๐ฟ raising hands: dark skin tone | |
| 401 | +1F450 ; fully-qualified # ๐ open hands | |
| 402 | +1F450 1F3FB ; fully-qualified # ๐๐ป open hands: light skin tone | |
| 403 | +1F450 1F3FC ; fully-qualified # ๐๐ผ open hands: medium-light skin tone | |
| 404 | +1F450 1F3FD ; fully-qualified # ๐๐ฝ open hands: medium skin tone | |
| 405 | +1F450 1F3FE ; fully-qualified # ๐๐พ open hands: medium-dark skin tone | |
| 406 | +1F450 1F3FF ; fully-qualified # ๐๐ฟ open hands: dark skin tone | |
| 407 | +1F932 ; fully-qualified # ๐คฒ palms up together | |
| 408 | +1F932 1F3FB ; fully-qualified # ๐คฒ๐ป palms up together: light skin tone | |
| 409 | +1F932 1F3FC ; fully-qualified # ๐คฒ๐ผ palms up together: medium-light skin tone | |
| 410 | +1F932 1F3FD ; fully-qualified # ๐คฒ๐ฝ palms up together: medium skin tone | |
| 411 | +1F932 1F3FE ; fully-qualified # ๐คฒ๐พ palms up together: medium-dark skin tone | |
| 412 | +1F932 1F3FF ; fully-qualified # ๐คฒ๐ฟ palms up together: dark skin tone | |
| 413 | +1F91D ; fully-qualified # ๐ค handshake | |
| 414 | +1F64F ; fully-qualified # ๐ folded hands | |
| 415 | +1F64F 1F3FB ; fully-qualified # ๐๐ป folded hands: light skin tone | |
| 416 | +1F64F 1F3FC ; fully-qualified # ๐๐ผ folded hands: medium-light skin tone | |
| 417 | +1F64F 1F3FD ; fully-qualified # ๐๐ฝ folded hands: medium skin tone | |
| 418 | +1F64F 1F3FE ; fully-qualified # ๐๐พ folded hands: medium-dark skin tone | |
| 419 | +1F64F 1F3FF ; fully-qualified # ๐๐ฟ folded hands: dark skin tone | |
| 420 | + | |
| 421 | +# subgroup: hand-prop | |
| 422 | +270D FE0F ; fully-qualified # โ๏ธ writing hand | |
| 423 | +270D ; unqualified # โ writing hand | |
| 424 | +270D 1F3FB ; fully-qualified # โ๐ป writing hand: light skin tone | |
| 425 | +270D 1F3FC ; fully-qualified # โ๐ผ writing hand: medium-light skin tone | |
| 426 | +270D 1F3FD ; fully-qualified # โ๐ฝ writing hand: medium skin tone | |
| 427 | +270D 1F3FE ; fully-qualified # โ๐พ writing hand: medium-dark skin tone | |
| 428 | +270D 1F3FF ; fully-qualified # โ๐ฟ writing hand: dark skin tone | |
| 429 | +1F485 ; fully-qualified # ๐ nail polish | |
| 430 | +1F485 1F3FB ; fully-qualified # ๐ ๐ป nail polish: light skin tone | |
| 431 | +1F485 1F3FC ; fully-qualified # ๐ ๐ผ nail polish: medium-light skin tone | |
| 432 | +1F485 1F3FD ; fully-qualified # ๐ ๐ฝ nail polish: medium skin tone | |
| 433 | +1F485 1F3FE ; fully-qualified # ๐ ๐พ nail polish: medium-dark skin tone | |
| 434 | +1F485 1F3FF ; fully-qualified # ๐ ๐ฟ nail polish: dark skin tone | |
| 435 | +1F933 ; fully-qualified # ๐คณ selfie | |
| 436 | +1F933 1F3FB ; fully-qualified # ๐คณ๐ป selfie: light skin tone | |
| 437 | +1F933 1F3FC ; fully-qualified # ๐คณ๐ผ selfie: medium-light skin tone | |
| 438 | +1F933 1F3FD ; fully-qualified # ๐คณ๐ฝ selfie: medium skin tone | |
| 439 | +1F933 1F3FE ; fully-qualified # ๐คณ๐พ selfie: medium-dark skin tone | |
| 440 | +1F933 1F3FF ; fully-qualified # ๐คณ๐ฟ selfie: dark skin tone | |
| 441 | + | |
| 442 | +# subgroup: body-parts | |
| 443 | +1F4AA ; fully-qualified # ๐ช flexed biceps | |
| 444 | +1F4AA 1F3FB ; fully-qualified # ๐ช๐ป flexed biceps: light skin tone | |
| 445 | +1F4AA 1F3FC ; fully-qualified # ๐ช๐ผ flexed biceps: medium-light skin tone | |
| 446 | +1F4AA 1F3FD ; fully-qualified # ๐ช๐ฝ flexed biceps: medium skin tone | |
| 447 | +1F4AA 1F3FE ; fully-qualified # ๐ช๐พ flexed biceps: medium-dark skin tone | |
| 448 | +1F4AA 1F3FF ; fully-qualified # ๐ช๐ฟ flexed biceps: dark skin tone | |
| 449 | +1F9BE ; fully-qualified # ๐ฆพ mechanical arm | |
| 450 | +1F9BF ; fully-qualified # ๐ฆฟ mechanical leg | |
| 451 | +1F9B5 ; fully-qualified # ๐ฆต leg | |
| 452 | +1F9B5 1F3FB ; fully-qualified # ๐ฆต๐ป leg: light skin tone | |
| 453 | +1F9B5 1F3FC ; fully-qualified # ๐ฆต๐ผ leg: medium-light skin tone | |
| 454 | +1F9B5 1F3FD ; fully-qualified # ๐ฆต๐ฝ leg: medium skin tone | |
| 455 | +1F9B5 1F3FE ; fully-qualified # ๐ฆต๐พ leg: medium-dark skin tone | |
| 456 | +1F9B5 1F3FF ; fully-qualified # ๐ฆต๐ฟ leg: dark skin tone | |
| 457 | +1F9B6 ; fully-qualified # ๐ฆถ foot | |
| 458 | +1F9B6 1F3FB ; fully-qualified # ๐ฆถ๐ป foot: light skin tone | |
| 459 | +1F9B6 1F3FC ; fully-qualified # ๐ฆถ๐ผ foot: medium-light skin tone | |
| 460 | +1F9B6 1F3FD ; fully-qualified # ๐ฆถ๐ฝ foot: medium skin tone | |
| 461 | +1F9B6 1F3FE ; fully-qualified # ๐ฆถ๐พ foot: medium-dark skin tone | |
| 462 | +1F9B6 1F3FF ; fully-qualified # ๐ฆถ๐ฟ foot: dark skin tone | |
| 463 | +1F442 ; fully-qualified # ๐ ear | |
| 464 | +1F442 1F3FB ; fully-qualified # ๐๐ป ear: light skin tone | |
| 465 | +1F442 1F3FC ; fully-qualified # ๐๐ผ ear: medium-light skin tone | |
| 466 | +1F442 1F3FD ; fully-qualified # ๐๐ฝ ear: medium skin tone | |
| 467 | +1F442 1F3FE ; fully-qualified # ๐๐พ ear: medium-dark skin tone | |
| 468 | +1F442 1F3FF ; fully-qualified # ๐๐ฟ ear: dark skin tone | |
| 469 | +1F9BB ; fully-qualified # ๐ฆป ear with hearing aid | |
| 470 | +1F9BB 1F3FB ; fully-qualified # ๐ฆป๐ป ear with hearing aid: light skin tone | |
| 471 | +1F9BB 1F3FC ; fully-qualified # ๐ฆป๐ผ ear with hearing aid: medium-light skin tone | |
| 472 | +1F9BB 1F3FD ; fully-qualified # ๐ฆป๐ฝ ear with hearing aid: medium skin tone | |
| 473 | +1F9BB 1F3FE ; fully-qualified # ๐ฆป๐พ ear with hearing aid: medium-dark skin tone | |
| 474 | +1F9BB 1F3FF ; fully-qualified # ๐ฆป๐ฟ ear with hearing aid: dark skin tone | |
| 475 | +1F443 ; fully-qualified # ๐ nose | |
| 476 | +1F443 1F3FB ; fully-qualified # ๐๐ป nose: light skin tone | |
| 477 | +1F443 1F3FC ; fully-qualified # ๐๐ผ nose: medium-light skin tone | |
| 478 | +1F443 1F3FD ; fully-qualified # ๐๐ฝ nose: medium skin tone | |
| 479 | +1F443 1F3FE ; fully-qualified # ๐๐พ nose: medium-dark skin tone | |
| 480 | +1F443 1F3FF ; fully-qualified # ๐๐ฟ nose: dark skin tone | |
| 481 | +1F9E0 ; fully-qualified # ๐ง brain | |
| 482 | +1F9B7 ; fully-qualified # ๐ฆท tooth | |
| 483 | +1F9B4 ; fully-qualified # ๐ฆด bone | |
| 484 | +1F440 ; fully-qualified # ๐ eyes | |
| 485 | +1F441 FE0F ; fully-qualified # ๐๏ธ eye | |
| 486 | +1F441 ; unqualified # ๐ eye | |
| 487 | +1F445 ; fully-qualified # ๐ tongue | |
| 488 | +1F444 ; fully-qualified # ๐ mouth | |
| 489 | + | |
| 490 | +# subgroup: person | |
| 491 | +1F476 ; fully-qualified # ๐ถ baby | |
| 492 | +1F476 1F3FB ; fully-qualified # ๐ถ๐ป baby: light skin tone | |
| 493 | +1F476 1F3FC ; fully-qualified # ๐ถ๐ผ baby: medium-light skin tone | |
| 494 | +1F476 1F3FD ; fully-qualified # ๐ถ๐ฝ baby: medium skin tone | |
| 495 | +1F476 1F3FE ; fully-qualified # ๐ถ๐พ baby: medium-dark skin tone | |
| 496 | +1F476 1F3FF ; fully-qualified # ๐ถ๐ฟ baby: dark skin tone | |
| 497 | +1F9D2 ; fully-qualified # ๐ง child | |
| 498 | +1F9D2 1F3FB ; fully-qualified # ๐ง๐ป child: light skin tone | |
| 499 | +1F9D2 1F3FC ; fully-qualified # ๐ง๐ผ child: medium-light skin tone | |
| 500 | +1F9D2 1F3FD ; fully-qualified # ๐ง๐ฝ child: medium skin tone | |
| 501 | +1F9D2 1F3FE ; fully-qualified # ๐ง๐พ child: medium-dark skin tone | |
| 502 | +1F9D2 1F3FF ; fully-qualified # ๐ง๐ฟ child: dark skin tone | |
| 503 | +1F466 ; fully-qualified # ๐ฆ boy | |
| 504 | +1F466 1F3FB ; fully-qualified # ๐ฆ๐ป boy: light skin tone | |
| 505 | +1F466 1F3FC ; fully-qualified # ๐ฆ๐ผ boy: medium-light skin tone | |
| 506 | +1F466 1F3FD ; fully-qualified # ๐ฆ๐ฝ boy: medium skin tone | |
| 507 | +1F466 1F3FE ; fully-qualified # ๐ฆ๐พ boy: medium-dark skin tone | |
| 508 | +1F466 1F3FF ; fully-qualified # ๐ฆ๐ฟ boy: dark skin tone | |
| 509 | +1F467 ; fully-qualified # ๐ง girl | |
| 510 | +1F467 1F3FB ; fully-qualified # ๐ง๐ป girl: light skin tone | |
| 511 | +1F467 1F3FC ; fully-qualified # ๐ง๐ผ girl: medium-light skin tone | |
| 512 | +1F467 1F3FD ; fully-qualified # ๐ง๐ฝ girl: medium skin tone | |
| 513 | +1F467 1F3FE ; fully-qualified # ๐ง๐พ girl: medium-dark skin tone | |
| 514 | +1F467 1F3FF ; fully-qualified # ๐ง๐ฟ girl: dark skin tone | |
| 515 | +1F9D1 ; fully-qualified # ๐ง person | |
| 516 | +1F9D1 1F3FB ; fully-qualified # ๐ง๐ป person: light skin tone | |
| 517 | +1F9D1 1F3FC ; fully-qualified # ๐ง๐ผ person: medium-light skin tone | |
| 518 | +1F9D1 1F3FD ; fully-qualified # ๐ง๐ฝ person: medium skin tone | |
| 519 | +1F9D1 1F3FE ; fully-qualified # ๐ง๐พ person: medium-dark skin tone | |
| 520 | +1F9D1 1F3FF ; fully-qualified # ๐ง๐ฟ person: dark skin tone | |
| 521 | +1F471 ; fully-qualified # ๐ฑ person: blond hair | |
| 522 | +1F471 1F3FB ; fully-qualified # ๐ฑ๐ป person: light skin tone, blond hair | |
| 523 | +1F471 1F3FC ; fully-qualified # ๐ฑ๐ผ person: medium-light skin tone, blond hair | |
| 524 | +1F471 1F3FD ; fully-qualified # ๐ฑ๐ฝ person: medium skin tone, blond hair | |
| 525 | +1F471 1F3FE ; fully-qualified # ๐ฑ๐พ person: medium-dark skin tone, blond hair | |
| 526 | +1F471 1F3FF ; fully-qualified # ๐ฑ๐ฟ person: dark skin tone, blond hair | |
| 527 | +1F468 ; fully-qualified # ๐จ man | |
| 528 | +1F468 1F3FB ; fully-qualified # ๐จ๐ป man: light skin tone | |
| 529 | +1F468 1F3FC ; fully-qualified # ๐จ๐ผ man: medium-light skin tone | |
| 530 | +1F468 1F3FD ; fully-qualified # ๐จ๐ฝ man: medium skin tone | |
| 531 | +1F468 1F3FE ; fully-qualified # ๐จ๐พ man: medium-dark skin tone | |
| 532 | +1F468 1F3FF ; fully-qualified # ๐จ๐ฟ man: dark skin tone | |
| 533 | +1F9D4 ; fully-qualified # ๐ง man: beard | |
| 534 | +1F9D4 1F3FB ; fully-qualified # ๐ง๐ป man: light skin tone, beard | |
| 535 | +1F9D4 1F3FC ; fully-qualified # ๐ง๐ผ man: medium-light skin tone, beard | |
| 536 | +1F9D4 1F3FD ; fully-qualified # ๐ง๐ฝ man: medium skin tone, beard | |
| 537 | +1F9D4 1F3FE ; fully-qualified # ๐ง๐พ man: medium-dark skin tone, beard | |
| 538 | +1F9D4 1F3FF ; fully-qualified # ๐ง๐ฟ man: dark skin tone, beard | |
| 539 | +1F471 200D 2642 FE0F ; fully-qualified # ๐ฑโโ๏ธ man: blond hair | |
| 540 | +1F471 200D 2642 ; minimally-qualified # ๐ฑโโ man: blond hair | |
| 541 | +1F471 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ฑ๐ปโโ๏ธ man: light skin tone, blond hair | |
| 542 | +1F471 1F3FB 200D 2642 ; minimally-qualified # ๐ฑ๐ปโโ man: light skin tone, blond hair | |
| 543 | +1F471 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ฑ๐ผโโ๏ธ man: medium-light skin tone, blond hair | |
| 544 | +1F471 1F3FC 200D 2642 ; minimally-qualified # ๐ฑ๐ผโโ man: medium-light skin tone, blond hair | |
| 545 | +1F471 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ฑ๐ฝโโ๏ธ man: medium skin tone, blond hair | |
| 546 | +1F471 1F3FD 200D 2642 ; minimally-qualified # ๐ฑ๐ฝโโ man: medium skin tone, blond hair | |
| 547 | +1F471 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ฑ๐พโโ๏ธ man: medium-dark skin tone, blond hair | |
| 548 | +1F471 1F3FE 200D 2642 ; minimally-qualified # ๐ฑ๐พโโ man: medium-dark skin tone, blond hair | |
| 549 | +1F471 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ฑ๐ฟโโ๏ธ man: dark skin tone, blond hair | |
| 550 | +1F471 1F3FF 200D 2642 ; minimally-qualified # ๐ฑ๐ฟโโ man: dark skin tone, blond hair | |
| 551 | +1F468 200D 1F9B0 ; fully-qualified # ๐จโ๐ฆฐ man: red hair | |
| 552 | +1F468 1F3FB 200D 1F9B0 ; fully-qualified # ๐จ๐ปโ๐ฆฐ man: light skin tone, red hair | |
| 553 | +1F468 1F3FC 200D 1F9B0 ; fully-qualified # ๐จ๐ผโ๐ฆฐ man: medium-light skin tone, red hair | |
| 554 | +1F468 1F3FD 200D 1F9B0 ; fully-qualified # ๐จ๐ฝโ๐ฆฐ man: medium skin tone, red hair | |
| 555 | +1F468 1F3FE 200D 1F9B0 ; fully-qualified # ๐จ๐พโ๐ฆฐ man: medium-dark skin tone, red hair | |
| 556 | +1F468 1F3FF 200D 1F9B0 ; fully-qualified # ๐จ๐ฟโ๐ฆฐ man: dark skin tone, red hair | |
| 557 | +1F468 200D 1F9B1 ; fully-qualified # ๐จโ๐ฆฑ man: curly hair | |
| 558 | +1F468 1F3FB 200D 1F9B1 ; fully-qualified # ๐จ๐ปโ๐ฆฑ man: light skin tone, curly hair | |
| 559 | +1F468 1F3FC 200D 1F9B1 ; fully-qualified # ๐จ๐ผโ๐ฆฑ man: medium-light skin tone, curly hair | |
| 560 | +1F468 1F3FD 200D 1F9B1 ; fully-qualified # ๐จ๐ฝโ๐ฆฑ man: medium skin tone, curly hair | |
| 561 | +1F468 1F3FE 200D 1F9B1 ; fully-qualified # ๐จ๐พโ๐ฆฑ man: medium-dark skin tone, curly hair | |
| 562 | +1F468 1F3FF 200D 1F9B1 ; fully-qualified # ๐จ๐ฟโ๐ฆฑ man: dark skin tone, curly hair | |
| 563 | +1F468 200D 1F9B3 ; fully-qualified # ๐จโ๐ฆณ man: white hair | |
| 564 | +1F468 1F3FB 200D 1F9B3 ; fully-qualified # ๐จ๐ปโ๐ฆณ man: light skin tone, white hair | |
| 565 | +1F468 1F3FC 200D 1F9B3 ; fully-qualified # ๐จ๐ผโ๐ฆณ man: medium-light skin tone, white hair | |
| 566 | +1F468 1F3FD 200D 1F9B3 ; fully-qualified # ๐จ๐ฝโ๐ฆณ man: medium skin tone, white hair | |
| 567 | +1F468 1F3FE 200D 1F9B3 ; fully-qualified # ๐จ๐พโ๐ฆณ man: medium-dark skin tone, white hair | |
| 568 | +1F468 1F3FF 200D 1F9B3 ; fully-qualified # ๐จ๐ฟโ๐ฆณ man: dark skin tone, white hair | |
| 569 | +1F468 200D 1F9B2 ; fully-qualified # ๐จโ๐ฆฒ man: bald | |
| 570 | +1F468 1F3FB 200D 1F9B2 ; fully-qualified # ๐จ๐ปโ๐ฆฒ man: light skin tone, bald | |
| 571 | +1F468 1F3FC 200D 1F9B2 ; fully-qualified # ๐จ๐ผโ๐ฆฒ man: medium-light skin tone, bald | |
| 572 | +1F468 1F3FD 200D 1F9B2 ; fully-qualified # ๐จ๐ฝโ๐ฆฒ man: medium skin tone, bald | |
| 573 | +1F468 1F3FE 200D 1F9B2 ; fully-qualified # ๐จ๐พโ๐ฆฒ man: medium-dark skin tone, bald | |
| 574 | +1F468 1F3FF 200D 1F9B2 ; fully-qualified # ๐จ๐ฟโ๐ฆฒ man: dark skin tone, bald | |
| 575 | +1F469 ; fully-qualified # ๐ฉ woman | |
| 576 | +1F469 1F3FB ; fully-qualified # ๐ฉ๐ป woman: light skin tone | |
| 577 | +1F469 1F3FC ; fully-qualified # ๐ฉ๐ผ woman: medium-light skin tone | |
| 578 | +1F469 1F3FD ; fully-qualified # ๐ฉ๐ฝ woman: medium skin tone | |
| 579 | +1F469 1F3FE ; fully-qualified # ๐ฉ๐พ woman: medium-dark skin tone | |
| 580 | +1F469 1F3FF ; fully-qualified # ๐ฉ๐ฟ woman: dark skin tone | |
| 581 | +1F471 200D 2640 FE0F ; fully-qualified # ๐ฑโโ๏ธ woman: blond hair | |
| 582 | +1F471 200D 2640 ; minimally-qualified # ๐ฑโโ woman: blond hair | |
| 583 | +1F471 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ฑ๐ปโโ๏ธ woman: light skin tone, blond hair | |
| 584 | +1F471 1F3FB 200D 2640 ; minimally-qualified # ๐ฑ๐ปโโ woman: light skin tone, blond hair | |
| 585 | +1F471 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ฑ๐ผโโ๏ธ woman: medium-light skin tone, blond hair | |
| 586 | +1F471 1F3FC 200D 2640 ; minimally-qualified # ๐ฑ๐ผโโ woman: medium-light skin tone, blond hair | |
| 587 | +1F471 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ฑ๐ฝโโ๏ธ woman: medium skin tone, blond hair | |
| 588 | +1F471 1F3FD 200D 2640 ; minimally-qualified # ๐ฑ๐ฝโโ woman: medium skin tone, blond hair | |
| 589 | +1F471 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ฑ๐พโโ๏ธ woman: medium-dark skin tone, blond hair | |
| 590 | +1F471 1F3FE 200D 2640 ; minimally-qualified # ๐ฑ๐พโโ woman: medium-dark skin tone, blond hair | |
| 591 | +1F471 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ฑ๐ฟโโ๏ธ woman: dark skin tone, blond hair | |
| 592 | +1F471 1F3FF 200D 2640 ; minimally-qualified # ๐ฑ๐ฟโโ woman: dark skin tone, blond hair | |
| 593 | +1F469 200D 1F9B0 ; fully-qualified # ๐ฉโ๐ฆฐ woman: red hair | |
| 594 | +1F469 1F3FB 200D 1F9B0 ; fully-qualified # ๐ฉ๐ปโ๐ฆฐ woman: light skin tone, red hair | |
| 595 | +1F469 1F3FC 200D 1F9B0 ; fully-qualified # ๐ฉ๐ผโ๐ฆฐ woman: medium-light skin tone, red hair | |
| 596 | +1F469 1F3FD 200D 1F9B0 ; fully-qualified # ๐ฉ๐ฝโ๐ฆฐ woman: medium skin tone, red hair | |
| 597 | +1F469 1F3FE 200D 1F9B0 ; fully-qualified # ๐ฉ๐พโ๐ฆฐ woman: medium-dark skin tone, red hair | |
| 598 | +1F469 1F3FF 200D 1F9B0 ; fully-qualified # ๐ฉ๐ฟโ๐ฆฐ woman: dark skin tone, red hair | |
| 599 | +1F469 200D 1F9B1 ; fully-qualified # ๐ฉโ๐ฆฑ woman: curly hair | |
| 600 | +1F469 1F3FB 200D 1F9B1 ; fully-qualified # ๐ฉ๐ปโ๐ฆฑ woman: light skin tone, curly hair | |
| 601 | +1F469 1F3FC 200D 1F9B1 ; fully-qualified # ๐ฉ๐ผโ๐ฆฑ woman: medium-light skin tone, curly hair | |
| 602 | +1F469 1F3FD 200D 1F9B1 ; fully-qualified # ๐ฉ๐ฝโ๐ฆฑ woman: medium skin tone, curly hair | |
| 603 | +1F469 1F3FE 200D 1F9B1 ; fully-qualified # ๐ฉ๐พโ๐ฆฑ woman: medium-dark skin tone, curly hair | |
| 604 | +1F469 1F3FF 200D 1F9B1 ; fully-qualified # ๐ฉ๐ฟโ๐ฆฑ woman: dark skin tone, curly hair | |
| 605 | +1F469 200D 1F9B3 ; fully-qualified # ๐ฉโ๐ฆณ woman: white hair | |
| 606 | +1F469 1F3FB 200D 1F9B3 ; fully-qualified # ๐ฉ๐ปโ๐ฆณ woman: light skin tone, white hair | |
| 607 | +1F469 1F3FC 200D 1F9B3 ; fully-qualified # ๐ฉ๐ผโ๐ฆณ woman: medium-light skin tone, white hair | |
| 608 | +1F469 1F3FD 200D 1F9B3 ; fully-qualified # ๐ฉ๐ฝโ๐ฆณ woman: medium skin tone, white hair | |
| 609 | +1F469 1F3FE 200D 1F9B3 ; fully-qualified # ๐ฉ๐พโ๐ฆณ woman: medium-dark skin tone, white hair | |
| 610 | +1F469 1F3FF 200D 1F9B3 ; fully-qualified # ๐ฉ๐ฟโ๐ฆณ woman: dark skin tone, white hair | |
| 611 | +1F469 200D 1F9B2 ; fully-qualified # ๐ฉโ๐ฆฒ woman: bald | |
| 612 | +1F469 1F3FB 200D 1F9B2 ; fully-qualified # ๐ฉ๐ปโ๐ฆฒ woman: light skin tone, bald | |
| 613 | +1F469 1F3FC 200D 1F9B2 ; fully-qualified # ๐ฉ๐ผโ๐ฆฒ woman: medium-light skin tone, bald | |
| 614 | +1F469 1F3FD 200D 1F9B2 ; fully-qualified # ๐ฉ๐ฝโ๐ฆฒ woman: medium skin tone, bald | |
| 615 | +1F469 1F3FE 200D 1F9B2 ; fully-qualified # ๐ฉ๐พโ๐ฆฒ woman: medium-dark skin tone, bald | |
| 616 | +1F469 1F3FF 200D 1F9B2 ; fully-qualified # ๐ฉ๐ฟโ๐ฆฒ woman: dark skin tone, bald | |
| 617 | +1F9D3 ; fully-qualified # ๐ง older person | |
| 618 | +1F9D3 1F3FB ; fully-qualified # ๐ง๐ป older person: light skin tone | |
| 619 | +1F9D3 1F3FC ; fully-qualified # ๐ง๐ผ older person: medium-light skin tone | |
| 620 | +1F9D3 1F3FD ; fully-qualified # ๐ง๐ฝ older person: medium skin tone | |
| 621 | +1F9D3 1F3FE ; fully-qualified # ๐ง๐พ older person: medium-dark skin tone | |
| 622 | +1F9D3 1F3FF ; fully-qualified # ๐ง๐ฟ older person: dark skin tone | |
| 623 | +1F474 ; fully-qualified # ๐ด old man | |
| 624 | +1F474 1F3FB ; fully-qualified # ๐ด๐ป old man: light skin tone | |
| 625 | +1F474 1F3FC ; fully-qualified # ๐ด๐ผ old man: medium-light skin tone | |
| 626 | +1F474 1F3FD ; fully-qualified # ๐ด๐ฝ old man: medium skin tone | |
| 627 | +1F474 1F3FE ; fully-qualified # ๐ด๐พ old man: medium-dark skin tone | |
| 628 | +1F474 1F3FF ; fully-qualified # ๐ด๐ฟ old man: dark skin tone | |
| 629 | +1F475 ; fully-qualified # ๐ต old woman | |
| 630 | +1F475 1F3FB ; fully-qualified # ๐ต๐ป old woman: light skin tone | |
| 631 | +1F475 1F3FC ; fully-qualified # ๐ต๐ผ old woman: medium-light skin tone | |
| 632 | +1F475 1F3FD ; fully-qualified # ๐ต๐ฝ old woman: medium skin tone | |
| 633 | +1F475 1F3FE ; fully-qualified # ๐ต๐พ old woman: medium-dark skin tone | |
| 634 | +1F475 1F3FF ; fully-qualified # ๐ต๐ฟ old woman: dark skin tone | |
| 635 | + | |
| 636 | +# subgroup: person-gesture | |
| 637 | +1F64D ; fully-qualified # ๐ person frowning | |
| 638 | +1F64D 1F3FB ; fully-qualified # ๐๐ป person frowning: light skin tone | |
| 639 | +1F64D 1F3FC ; fully-qualified # ๐๐ผ person frowning: medium-light skin tone | |
| 640 | +1F64D 1F3FD ; fully-qualified # ๐๐ฝ person frowning: medium skin tone | |
| 641 | +1F64D 1F3FE ; fully-qualified # ๐๐พ person frowning: medium-dark skin tone | |
| 642 | +1F64D 1F3FF ; fully-qualified # ๐๐ฟ person frowning: dark skin tone | |
| 643 | +1F64D 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man frowning | |
| 644 | +1F64D 200D 2642 ; minimally-qualified # ๐โโ man frowning | |
| 645 | +1F64D 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man frowning: light skin tone | |
| 646 | +1F64D 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man frowning: light skin tone | |
| 647 | +1F64D 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man frowning: medium-light skin tone | |
| 648 | +1F64D 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man frowning: medium-light skin tone | |
| 649 | +1F64D 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man frowning: medium skin tone | |
| 650 | +1F64D 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man frowning: medium skin tone | |
| 651 | +1F64D 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man frowning: medium-dark skin tone | |
| 652 | +1F64D 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man frowning: medium-dark skin tone | |
| 653 | +1F64D 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man frowning: dark skin tone | |
| 654 | +1F64D 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man frowning: dark skin tone | |
| 655 | +1F64D 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman frowning | |
| 656 | +1F64D 200D 2640 ; minimally-qualified # ๐โโ woman frowning | |
| 657 | +1F64D 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman frowning: light skin tone | |
| 658 | +1F64D 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman frowning: light skin tone | |
| 659 | +1F64D 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman frowning: medium-light skin tone | |
| 660 | +1F64D 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman frowning: medium-light skin tone | |
| 661 | +1F64D 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman frowning: medium skin tone | |
| 662 | +1F64D 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman frowning: medium skin tone | |
| 663 | +1F64D 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman frowning: medium-dark skin tone | |
| 664 | +1F64D 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman frowning: medium-dark skin tone | |
| 665 | +1F64D 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman frowning: dark skin tone | |
| 666 | +1F64D 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman frowning: dark skin tone | |
| 667 | +1F64E ; fully-qualified # ๐ person pouting | |
| 668 | +1F64E 1F3FB ; fully-qualified # ๐๐ป person pouting: light skin tone | |
| 669 | +1F64E 1F3FC ; fully-qualified # ๐๐ผ person pouting: medium-light skin tone | |
| 670 | +1F64E 1F3FD ; fully-qualified # ๐๐ฝ person pouting: medium skin tone | |
| 671 | +1F64E 1F3FE ; fully-qualified # ๐๐พ person pouting: medium-dark skin tone | |
| 672 | +1F64E 1F3FF ; fully-qualified # ๐๐ฟ person pouting: dark skin tone | |
| 673 | +1F64E 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man pouting | |
| 674 | +1F64E 200D 2642 ; minimally-qualified # ๐โโ man pouting | |
| 675 | +1F64E 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man pouting: light skin tone | |
| 676 | +1F64E 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man pouting: light skin tone | |
| 677 | +1F64E 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man pouting: medium-light skin tone | |
| 678 | +1F64E 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man pouting: medium-light skin tone | |
| 679 | +1F64E 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man pouting: medium skin tone | |
| 680 | +1F64E 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man pouting: medium skin tone | |
| 681 | +1F64E 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man pouting: medium-dark skin tone | |
| 682 | +1F64E 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man pouting: medium-dark skin tone | |
| 683 | +1F64E 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man pouting: dark skin tone | |
| 684 | +1F64E 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man pouting: dark skin tone | |
| 685 | +1F64E 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman pouting | |
| 686 | +1F64E 200D 2640 ; minimally-qualified # ๐โโ woman pouting | |
| 687 | +1F64E 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman pouting: light skin tone | |
| 688 | +1F64E 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman pouting: light skin tone | |
| 689 | +1F64E 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman pouting: medium-light skin tone | |
| 690 | +1F64E 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman pouting: medium-light skin tone | |
| 691 | +1F64E 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman pouting: medium skin tone | |
| 692 | +1F64E 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman pouting: medium skin tone | |
| 693 | +1F64E 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman pouting: medium-dark skin tone | |
| 694 | +1F64E 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman pouting: medium-dark skin tone | |
| 695 | +1F64E 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman pouting: dark skin tone | |
| 696 | +1F64E 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman pouting: dark skin tone | |
| 697 | +1F645 ; fully-qualified # ๐ person gesturing NO | |
| 698 | +1F645 1F3FB ; fully-qualified # ๐ ๐ป person gesturing NO: light skin tone | |
| 699 | +1F645 1F3FC ; fully-qualified # ๐ ๐ผ person gesturing NO: medium-light skin tone | |
| 700 | +1F645 1F3FD ; fully-qualified # ๐ ๐ฝ person gesturing NO: medium skin tone | |
| 701 | +1F645 1F3FE ; fully-qualified # ๐ ๐พ person gesturing NO: medium-dark skin tone | |
| 702 | +1F645 1F3FF ; fully-qualified # ๐ ๐ฟ person gesturing NO: dark skin tone | |
| 703 | +1F645 200D 2642 FE0F ; fully-qualified # ๐ โโ๏ธ man gesturing NO | |
| 704 | +1F645 200D 2642 ; minimally-qualified # ๐ โโ man gesturing NO | |
| 705 | +1F645 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ ๐ปโโ๏ธ man gesturing NO: light skin tone | |
| 706 | +1F645 1F3FB 200D 2642 ; minimally-qualified # ๐ ๐ปโโ man gesturing NO: light skin tone | |
| 707 | +1F645 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ ๐ผโโ๏ธ man gesturing NO: medium-light skin tone | |
| 708 | +1F645 1F3FC 200D 2642 ; minimally-qualified # ๐ ๐ผโโ man gesturing NO: medium-light skin tone | |
| 709 | +1F645 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ ๐ฝโโ๏ธ man gesturing NO: medium skin tone | |
| 710 | +1F645 1F3FD 200D 2642 ; minimally-qualified # ๐ ๐ฝโโ man gesturing NO: medium skin tone | |
| 711 | +1F645 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ ๐พโโ๏ธ man gesturing NO: medium-dark skin tone | |
| 712 | +1F645 1F3FE 200D 2642 ; minimally-qualified # ๐ ๐พโโ man gesturing NO: medium-dark skin tone | |
| 713 | +1F645 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ ๐ฟโโ๏ธ man gesturing NO: dark skin tone | |
| 714 | +1F645 1F3FF 200D 2642 ; minimally-qualified # ๐ ๐ฟโโ man gesturing NO: dark skin tone | |
| 715 | +1F645 200D 2640 FE0F ; fully-qualified # ๐ โโ๏ธ woman gesturing NO | |
| 716 | +1F645 200D 2640 ; minimally-qualified # ๐ โโ woman gesturing NO | |
| 717 | +1F645 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ ๐ปโโ๏ธ woman gesturing NO: light skin tone | |
| 718 | +1F645 1F3FB 200D 2640 ; minimally-qualified # ๐ ๐ปโโ woman gesturing NO: light skin tone | |
| 719 | +1F645 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ ๐ผโโ๏ธ woman gesturing NO: medium-light skin tone | |
| 720 | +1F645 1F3FC 200D 2640 ; minimally-qualified # ๐ ๐ผโโ woman gesturing NO: medium-light skin tone | |
| 721 | +1F645 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ ๐ฝโโ๏ธ woman gesturing NO: medium skin tone | |
| 722 | +1F645 1F3FD 200D 2640 ; minimally-qualified # ๐ ๐ฝโโ woman gesturing NO: medium skin tone | |
| 723 | +1F645 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ ๐พโโ๏ธ woman gesturing NO: medium-dark skin tone | |
| 724 | +1F645 1F3FE 200D 2640 ; minimally-qualified # ๐ ๐พโโ woman gesturing NO: medium-dark skin tone | |
| 725 | +1F645 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ ๐ฟโโ๏ธ woman gesturing NO: dark skin tone | |
| 726 | +1F645 1F3FF 200D 2640 ; minimally-qualified # ๐ ๐ฟโโ woman gesturing NO: dark skin tone | |
| 727 | +1F646 ; fully-qualified # ๐ person gesturing OK | |
| 728 | +1F646 1F3FB ; fully-qualified # ๐๐ป person gesturing OK: light skin tone | |
| 729 | +1F646 1F3FC ; fully-qualified # ๐๐ผ person gesturing OK: medium-light skin tone | |
| 730 | +1F646 1F3FD ; fully-qualified # ๐๐ฝ person gesturing OK: medium skin tone | |
| 731 | +1F646 1F3FE ; fully-qualified # ๐๐พ person gesturing OK: medium-dark skin tone | |
| 732 | +1F646 1F3FF ; fully-qualified # ๐๐ฟ person gesturing OK: dark skin tone | |
| 733 | +1F646 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man gesturing OK | |
| 734 | +1F646 200D 2642 ; minimally-qualified # ๐โโ man gesturing OK | |
| 735 | +1F646 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man gesturing OK: light skin tone | |
| 736 | +1F646 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man gesturing OK: light skin tone | |
| 737 | +1F646 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man gesturing OK: medium-light skin tone | |
| 738 | +1F646 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man gesturing OK: medium-light skin tone | |
| 739 | +1F646 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man gesturing OK: medium skin tone | |
| 740 | +1F646 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man gesturing OK: medium skin tone | |
| 741 | +1F646 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man gesturing OK: medium-dark skin tone | |
| 742 | +1F646 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man gesturing OK: medium-dark skin tone | |
| 743 | +1F646 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man gesturing OK: dark skin tone | |
| 744 | +1F646 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man gesturing OK: dark skin tone | |
| 745 | +1F646 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman gesturing OK | |
| 746 | +1F646 200D 2640 ; minimally-qualified # ๐โโ woman gesturing OK | |
| 747 | +1F646 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman gesturing OK: light skin tone | |
| 748 | +1F646 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman gesturing OK: light skin tone | |
| 749 | +1F646 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman gesturing OK: medium-light skin tone | |
| 750 | +1F646 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman gesturing OK: medium-light skin tone | |
| 751 | +1F646 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman gesturing OK: medium skin tone | |
| 752 | +1F646 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman gesturing OK: medium skin tone | |
| 753 | +1F646 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman gesturing OK: medium-dark skin tone | |
| 754 | +1F646 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman gesturing OK: medium-dark skin tone | |
| 755 | +1F646 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman gesturing OK: dark skin tone | |
| 756 | +1F646 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman gesturing OK: dark skin tone | |
| 757 | +1F481 ; fully-qualified # ๐ person tipping hand | |
| 758 | +1F481 1F3FB ; fully-qualified # ๐๐ป person tipping hand: light skin tone | |
| 759 | +1F481 1F3FC ; fully-qualified # ๐๐ผ person tipping hand: medium-light skin tone | |
| 760 | +1F481 1F3FD ; fully-qualified # ๐๐ฝ person tipping hand: medium skin tone | |
| 761 | +1F481 1F3FE ; fully-qualified # ๐๐พ person tipping hand: medium-dark skin tone | |
| 762 | +1F481 1F3FF ; fully-qualified # ๐๐ฟ person tipping hand: dark skin tone | |
| 763 | +1F481 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man tipping hand | |
| 764 | +1F481 200D 2642 ; minimally-qualified # ๐โโ man tipping hand | |
| 765 | +1F481 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man tipping hand: light skin tone | |
| 766 | +1F481 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man tipping hand: light skin tone | |
| 767 | +1F481 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man tipping hand: medium-light skin tone | |
| 768 | +1F481 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man tipping hand: medium-light skin tone | |
| 769 | +1F481 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man tipping hand: medium skin tone | |
| 770 | +1F481 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man tipping hand: medium skin tone | |
| 771 | +1F481 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man tipping hand: medium-dark skin tone | |
| 772 | +1F481 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man tipping hand: medium-dark skin tone | |
| 773 | +1F481 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man tipping hand: dark skin tone | |
| 774 | +1F481 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man tipping hand: dark skin tone | |
| 775 | +1F481 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman tipping hand | |
| 776 | +1F481 200D 2640 ; minimally-qualified # ๐โโ woman tipping hand | |
| 777 | +1F481 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman tipping hand: light skin tone | |
| 778 | +1F481 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman tipping hand: light skin tone | |
| 779 | +1F481 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman tipping hand: medium-light skin tone | |
| 780 | +1F481 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman tipping hand: medium-light skin tone | |
| 781 | +1F481 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman tipping hand: medium skin tone | |
| 782 | +1F481 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman tipping hand: medium skin tone | |
| 783 | +1F481 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman tipping hand: medium-dark skin tone | |
| 784 | +1F481 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman tipping hand: medium-dark skin tone | |
| 785 | +1F481 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman tipping hand: dark skin tone | |
| 786 | +1F481 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman tipping hand: dark skin tone | |
| 787 | +1F64B ; fully-qualified # ๐ person raising hand | |
| 788 | +1F64B 1F3FB ; fully-qualified # ๐๐ป person raising hand: light skin tone | |
| 789 | +1F64B 1F3FC ; fully-qualified # ๐๐ผ person raising hand: medium-light skin tone | |
| 790 | +1F64B 1F3FD ; fully-qualified # ๐๐ฝ person raising hand: medium skin tone | |
| 791 | +1F64B 1F3FE ; fully-qualified # ๐๐พ person raising hand: medium-dark skin tone | |
| 792 | +1F64B 1F3FF ; fully-qualified # ๐๐ฟ person raising hand: dark skin tone | |
| 793 | +1F64B 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man raising hand | |
| 794 | +1F64B 200D 2642 ; minimally-qualified # ๐โโ man raising hand | |
| 795 | +1F64B 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man raising hand: light skin tone | |
| 796 | +1F64B 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man raising hand: light skin tone | |
| 797 | +1F64B 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man raising hand: medium-light skin tone | |
| 798 | +1F64B 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man raising hand: medium-light skin tone | |
| 799 | +1F64B 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man raising hand: medium skin tone | |
| 800 | +1F64B 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man raising hand: medium skin tone | |
| 801 | +1F64B 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man raising hand: medium-dark skin tone | |
| 802 | +1F64B 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man raising hand: medium-dark skin tone | |
| 803 | +1F64B 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man raising hand: dark skin tone | |
| 804 | +1F64B 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man raising hand: dark skin tone | |
| 805 | +1F64B 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman raising hand | |
| 806 | +1F64B 200D 2640 ; minimally-qualified # ๐โโ woman raising hand | |
| 807 | +1F64B 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman raising hand: light skin tone | |
| 808 | +1F64B 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman raising hand: light skin tone | |
| 809 | +1F64B 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman raising hand: medium-light skin tone | |
| 810 | +1F64B 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman raising hand: medium-light skin tone | |
| 811 | +1F64B 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman raising hand: medium skin tone | |
| 812 | +1F64B 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman raising hand: medium skin tone | |
| 813 | +1F64B 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman raising hand: medium-dark skin tone | |
| 814 | +1F64B 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman raising hand: medium-dark skin tone | |
| 815 | +1F64B 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman raising hand: dark skin tone | |
| 816 | +1F64B 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman raising hand: dark skin tone | |
| 817 | +1F9CF ; fully-qualified # ๐ง deaf person | |
| 818 | +1F9CF 1F3FB ; fully-qualified # ๐ง๐ป deaf person: light skin tone | |
| 819 | +1F9CF 1F3FC ; fully-qualified # ๐ง๐ผ deaf person: medium-light skin tone | |
| 820 | +1F9CF 1F3FD ; fully-qualified # ๐ง๐ฝ deaf person: medium skin tone | |
| 821 | +1F9CF 1F3FE ; fully-qualified # ๐ง๐พ deaf person: medium-dark skin tone | |
| 822 | +1F9CF 1F3FF ; fully-qualified # ๐ง๐ฟ deaf person: dark skin tone | |
| 823 | +1F9CF 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ deaf man | |
| 824 | +1F9CF 200D 2642 ; minimally-qualified # ๐งโโ deaf man | |
| 825 | +1F9CF 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ deaf man: light skin tone | |
| 826 | +1F9CF 1F3FB 200D 2642 ; minimally-qualified # ๐ง๐ปโโ deaf man: light skin tone | |
| 827 | +1F9CF 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ deaf man: medium-light skin tone | |
| 828 | +1F9CF 1F3FC 200D 2642 ; minimally-qualified # ๐ง๐ผโโ deaf man: medium-light skin tone | |
| 829 | +1F9CF 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ deaf man: medium skin tone | |
| 830 | +1F9CF 1F3FD 200D 2642 ; minimally-qualified # ๐ง๐ฝโโ deaf man: medium skin tone | |
| 831 | +1F9CF 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ deaf man: medium-dark skin tone | |
| 832 | +1F9CF 1F3FE 200D 2642 ; minimally-qualified # ๐ง๐พโโ deaf man: medium-dark skin tone | |
| 833 | +1F9CF 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ deaf man: dark skin tone | |
| 834 | +1F9CF 1F3FF 200D 2642 ; minimally-qualified # ๐ง๐ฟโโ deaf man: dark skin tone | |
| 835 | +1F9CF 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ deaf woman | |
| 836 | +1F9CF 200D 2640 ; minimally-qualified # ๐งโโ deaf woman | |
| 837 | +1F9CF 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ deaf woman: light skin tone | |
| 838 | +1F9CF 1F3FB 200D 2640 ; minimally-qualified # ๐ง๐ปโโ deaf woman: light skin tone | |
| 839 | +1F9CF 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ deaf woman: medium-light skin tone | |
| 840 | +1F9CF 1F3FC 200D 2640 ; minimally-qualified # ๐ง๐ผโโ deaf woman: medium-light skin tone | |
| 841 | +1F9CF 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ deaf woman: medium skin tone | |
| 842 | +1F9CF 1F3FD 200D 2640 ; minimally-qualified # ๐ง๐ฝโโ deaf woman: medium skin tone | |
| 843 | +1F9CF 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ deaf woman: medium-dark skin tone | |
| 844 | +1F9CF 1F3FE 200D 2640 ; minimally-qualified # ๐ง๐พโโ deaf woman: medium-dark skin tone | |
| 845 | +1F9CF 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ deaf woman: dark skin tone | |
| 846 | +1F9CF 1F3FF 200D 2640 ; minimally-qualified # ๐ง๐ฟโโ deaf woman: dark skin tone | |
| 847 | +1F647 ; fully-qualified # ๐ person bowing | |
| 848 | +1F647 1F3FB ; fully-qualified # ๐๐ป person bowing: light skin tone | |
| 849 | +1F647 1F3FC ; fully-qualified # ๐๐ผ person bowing: medium-light skin tone | |
| 850 | +1F647 1F3FD ; fully-qualified # ๐๐ฝ person bowing: medium skin tone | |
| 851 | +1F647 1F3FE ; fully-qualified # ๐๐พ person bowing: medium-dark skin tone | |
| 852 | +1F647 1F3FF ; fully-qualified # ๐๐ฟ person bowing: dark skin tone | |
| 853 | +1F647 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man bowing | |
| 854 | +1F647 200D 2642 ; minimally-qualified # ๐โโ man bowing | |
| 855 | +1F647 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man bowing: light skin tone | |
| 856 | +1F647 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man bowing: light skin tone | |
| 857 | +1F647 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man bowing: medium-light skin tone | |
| 858 | +1F647 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man bowing: medium-light skin tone | |
| 859 | +1F647 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man bowing: medium skin tone | |
| 860 | +1F647 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man bowing: medium skin tone | |
| 861 | +1F647 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man bowing: medium-dark skin tone | |
| 862 | +1F647 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man bowing: medium-dark skin tone | |
| 863 | +1F647 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man bowing: dark skin tone | |
| 864 | +1F647 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man bowing: dark skin tone | |
| 865 | +1F647 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman bowing | |
| 866 | +1F647 200D 2640 ; minimally-qualified # ๐โโ woman bowing | |
| 867 | +1F647 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman bowing: light skin tone | |
| 868 | +1F647 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman bowing: light skin tone | |
| 869 | +1F647 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman bowing: medium-light skin tone | |
| 870 | +1F647 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman bowing: medium-light skin tone | |
| 871 | +1F647 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman bowing: medium skin tone | |
| 872 | +1F647 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman bowing: medium skin tone | |
| 873 | +1F647 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman bowing: medium-dark skin tone | |
| 874 | +1F647 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman bowing: medium-dark skin tone | |
| 875 | +1F647 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman bowing: dark skin tone | |
| 876 | +1F647 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman bowing: dark skin tone | |
| 877 | +1F926 ; fully-qualified # ๐คฆ person facepalming | |
| 878 | +1F926 1F3FB ; fully-qualified # ๐คฆ๐ป person facepalming: light skin tone | |
| 879 | +1F926 1F3FC ; fully-qualified # ๐คฆ๐ผ person facepalming: medium-light skin tone | |
| 880 | +1F926 1F3FD ; fully-qualified # ๐คฆ๐ฝ person facepalming: medium skin tone | |
| 881 | +1F926 1F3FE ; fully-qualified # ๐คฆ๐พ person facepalming: medium-dark skin tone | |
| 882 | +1F926 1F3FF ; fully-qualified # ๐คฆ๐ฟ person facepalming: dark skin tone | |
| 883 | +1F926 200D 2642 FE0F ; fully-qualified # ๐คฆโโ๏ธ man facepalming | |
| 884 | +1F926 200D 2642 ; minimally-qualified # ๐คฆโโ man facepalming | |
| 885 | +1F926 1F3FB 200D 2642 FE0F ; fully-qualified # ๐คฆ๐ปโโ๏ธ man facepalming: light skin tone | |
| 886 | +1F926 1F3FB 200D 2642 ; minimally-qualified # ๐คฆ๐ปโโ man facepalming: light skin tone | |
| 887 | +1F926 1F3FC 200D 2642 FE0F ; fully-qualified # ๐คฆ๐ผโโ๏ธ man facepalming: medium-light skin tone | |
| 888 | +1F926 1F3FC 200D 2642 ; minimally-qualified # ๐คฆ๐ผโโ man facepalming: medium-light skin tone | |
| 889 | +1F926 1F3FD 200D 2642 FE0F ; fully-qualified # ๐คฆ๐ฝโโ๏ธ man facepalming: medium skin tone | |
| 890 | +1F926 1F3FD 200D 2642 ; minimally-qualified # ๐คฆ๐ฝโโ man facepalming: medium skin tone | |
| 891 | +1F926 1F3FE 200D 2642 FE0F ; fully-qualified # ๐คฆ๐พโโ๏ธ man facepalming: medium-dark skin tone | |
| 892 | +1F926 1F3FE 200D 2642 ; minimally-qualified # ๐คฆ๐พโโ man facepalming: medium-dark skin tone | |
| 893 | +1F926 1F3FF 200D 2642 FE0F ; fully-qualified # ๐คฆ๐ฟโโ๏ธ man facepalming: dark skin tone | |
| 894 | +1F926 1F3FF 200D 2642 ; minimally-qualified # ๐คฆ๐ฟโโ man facepalming: dark skin tone | |
| 895 | +1F926 200D 2640 FE0F ; fully-qualified # ๐คฆโโ๏ธ woman facepalming | |
| 896 | +1F926 200D 2640 ; minimally-qualified # ๐คฆโโ woman facepalming | |
| 897 | +1F926 1F3FB 200D 2640 FE0F ; fully-qualified # ๐คฆ๐ปโโ๏ธ woman facepalming: light skin tone | |
| 898 | +1F926 1F3FB 200D 2640 ; minimally-qualified # ๐คฆ๐ปโโ woman facepalming: light skin tone | |
| 899 | +1F926 1F3FC 200D 2640 FE0F ; fully-qualified # ๐คฆ๐ผโโ๏ธ woman facepalming: medium-light skin tone | |
| 900 | +1F926 1F3FC 200D 2640 ; minimally-qualified # ๐คฆ๐ผโโ woman facepalming: medium-light skin tone | |
| 901 | +1F926 1F3FD 200D 2640 FE0F ; fully-qualified # ๐คฆ๐ฝโโ๏ธ woman facepalming: medium skin tone | |
| 902 | +1F926 1F3FD 200D 2640 ; minimally-qualified # ๐คฆ๐ฝโโ woman facepalming: medium skin tone | |
| 903 | +1F926 1F3FE 200D 2640 FE0F ; fully-qualified # ๐คฆ๐พโโ๏ธ woman facepalming: medium-dark skin tone | |
| 904 | +1F926 1F3FE 200D 2640 ; minimally-qualified # ๐คฆ๐พโโ woman facepalming: medium-dark skin tone | |
| 905 | +1F926 1F3FF 200D 2640 FE0F ; fully-qualified # ๐คฆ๐ฟโโ๏ธ woman facepalming: dark skin tone | |
| 906 | +1F926 1F3FF 200D 2640 ; minimally-qualified # ๐คฆ๐ฟโโ woman facepalming: dark skin tone | |
| 907 | +1F937 ; fully-qualified # ๐คท person shrugging | |
| 908 | +1F937 1F3FB ; fully-qualified # ๐คท๐ป person shrugging: light skin tone | |
| 909 | +1F937 1F3FC ; fully-qualified # ๐คท๐ผ person shrugging: medium-light skin tone | |
| 910 | +1F937 1F3FD ; fully-qualified # ๐คท๐ฝ person shrugging: medium skin tone | |
| 911 | +1F937 1F3FE ; fully-qualified # ๐คท๐พ person shrugging: medium-dark skin tone | |
| 912 | +1F937 1F3FF ; fully-qualified # ๐คท๐ฟ person shrugging: dark skin tone | |
| 913 | +1F937 200D 2642 FE0F ; fully-qualified # ๐คทโโ๏ธ man shrugging | |
| 914 | +1F937 200D 2642 ; minimally-qualified # ๐คทโโ man shrugging | |
| 915 | +1F937 1F3FB 200D 2642 FE0F ; fully-qualified # ๐คท๐ปโโ๏ธ man shrugging: light skin tone | |
| 916 | +1F937 1F3FB 200D 2642 ; minimally-qualified # ๐คท๐ปโโ man shrugging: light skin tone | |
| 917 | +1F937 1F3FC 200D 2642 FE0F ; fully-qualified # ๐คท๐ผโโ๏ธ man shrugging: medium-light skin tone | |
| 918 | +1F937 1F3FC 200D 2642 ; minimally-qualified # ๐คท๐ผโโ man shrugging: medium-light skin tone | |
| 919 | +1F937 1F3FD 200D 2642 FE0F ; fully-qualified # ๐คท๐ฝโโ๏ธ man shrugging: medium skin tone | |
| 920 | +1F937 1F3FD 200D 2642 ; minimally-qualified # ๐คท๐ฝโโ man shrugging: medium skin tone | |
| 921 | +1F937 1F3FE 200D 2642 FE0F ; fully-qualified # ๐คท๐พโโ๏ธ man shrugging: medium-dark skin tone | |
| 922 | +1F937 1F3FE 200D 2642 ; minimally-qualified # ๐คท๐พโโ man shrugging: medium-dark skin tone | |
| 923 | +1F937 1F3FF 200D 2642 FE0F ; fully-qualified # ๐คท๐ฟโโ๏ธ man shrugging: dark skin tone | |
| 924 | +1F937 1F3FF 200D 2642 ; minimally-qualified # ๐คท๐ฟโโ man shrugging: dark skin tone | |
| 925 | +1F937 200D 2640 FE0F ; fully-qualified # ๐คทโโ๏ธ woman shrugging | |
| 926 | +1F937 200D 2640 ; minimally-qualified # ๐คทโโ woman shrugging | |
| 927 | +1F937 1F3FB 200D 2640 FE0F ; fully-qualified # ๐คท๐ปโโ๏ธ woman shrugging: light skin tone | |
| 928 | +1F937 1F3FB 200D 2640 ; minimally-qualified # ๐คท๐ปโโ woman shrugging: light skin tone | |
| 929 | +1F937 1F3FC 200D 2640 FE0F ; fully-qualified # ๐คท๐ผโโ๏ธ woman shrugging: medium-light skin tone | |
| 930 | +1F937 1F3FC 200D 2640 ; minimally-qualified # ๐คท๐ผโโ woman shrugging: medium-light skin tone | |
| 931 | +1F937 1F3FD 200D 2640 FE0F ; fully-qualified # ๐คท๐ฝโโ๏ธ woman shrugging: medium skin tone | |
| 932 | +1F937 1F3FD 200D 2640 ; minimally-qualified # ๐คท๐ฝโโ woman shrugging: medium skin tone | |
| 933 | +1F937 1F3FE 200D 2640 FE0F ; fully-qualified # ๐คท๐พโโ๏ธ woman shrugging: medium-dark skin tone | |
| 934 | +1F937 1F3FE 200D 2640 ; minimally-qualified # ๐คท๐พโโ woman shrugging: medium-dark skin tone | |
| 935 | +1F937 1F3FF 200D 2640 FE0F ; fully-qualified # ๐คท๐ฟโโ๏ธ woman shrugging: dark skin tone | |
| 936 | +1F937 1F3FF 200D 2640 ; minimally-qualified # ๐คท๐ฟโโ woman shrugging: dark skin tone | |
| 937 | + | |
| 938 | +# subgroup: person-role | |
| 939 | +1F468 200D 2695 FE0F ; fully-qualified # ๐จโโ๏ธ man health worker | |
| 940 | +1F468 200D 2695 ; minimally-qualified # ๐จโโ man health worker | |
| 941 | +1F468 1F3FB 200D 2695 FE0F ; fully-qualified # ๐จ๐ปโโ๏ธ man health worker: light skin tone | |
| 942 | +1F468 1F3FB 200D 2695 ; minimally-qualified # ๐จ๐ปโโ man health worker: light skin tone | |
| 943 | +1F468 1F3FC 200D 2695 FE0F ; fully-qualified # ๐จ๐ผโโ๏ธ man health worker: medium-light skin tone | |
| 944 | +1F468 1F3FC 200D 2695 ; minimally-qualified # ๐จ๐ผโโ man health worker: medium-light skin tone | |
| 945 | +1F468 1F3FD 200D 2695 FE0F ; fully-qualified # ๐จ๐ฝโโ๏ธ man health worker: medium skin tone | |
| 946 | +1F468 1F3FD 200D 2695 ; minimally-qualified # ๐จ๐ฝโโ man health worker: medium skin tone | |
| 947 | +1F468 1F3FE 200D 2695 FE0F ; fully-qualified # ๐จ๐พโโ๏ธ man health worker: medium-dark skin tone | |
| 948 | +1F468 1F3FE 200D 2695 ; minimally-qualified # ๐จ๐พโโ man health worker: medium-dark skin tone | |
| 949 | +1F468 1F3FF 200D 2695 FE0F ; fully-qualified # ๐จ๐ฟโโ๏ธ man health worker: dark skin tone | |
| 950 | +1F468 1F3FF 200D 2695 ; minimally-qualified # ๐จ๐ฟโโ man health worker: dark skin tone | |
| 951 | +1F469 200D 2695 FE0F ; fully-qualified # ๐ฉโโ๏ธ woman health worker | |
| 952 | +1F469 200D 2695 ; minimally-qualified # ๐ฉโโ woman health worker | |
| 953 | +1F469 1F3FB 200D 2695 FE0F ; fully-qualified # ๐ฉ๐ปโโ๏ธ woman health worker: light skin tone | |
| 954 | +1F469 1F3FB 200D 2695 ; minimally-qualified # ๐ฉ๐ปโโ woman health worker: light skin tone | |
| 955 | +1F469 1F3FC 200D 2695 FE0F ; fully-qualified # ๐ฉ๐ผโโ๏ธ woman health worker: medium-light skin tone | |
| 956 | +1F469 1F3FC 200D 2695 ; minimally-qualified # ๐ฉ๐ผโโ woman health worker: medium-light skin tone | |
| 957 | +1F469 1F3FD 200D 2695 FE0F ; fully-qualified # ๐ฉ๐ฝโโ๏ธ woman health worker: medium skin tone | |
| 958 | +1F469 1F3FD 200D 2695 ; minimally-qualified # ๐ฉ๐ฝโโ woman health worker: medium skin tone | |
| 959 | +1F469 1F3FE 200D 2695 FE0F ; fully-qualified # ๐ฉ๐พโโ๏ธ woman health worker: medium-dark skin tone | |
| 960 | +1F469 1F3FE 200D 2695 ; minimally-qualified # ๐ฉ๐พโโ woman health worker: medium-dark skin tone | |
| 961 | +1F469 1F3FF 200D 2695 FE0F ; fully-qualified # ๐ฉ๐ฟโโ๏ธ woman health worker: dark skin tone | |
| 962 | +1F469 1F3FF 200D 2695 ; minimally-qualified # ๐ฉ๐ฟโโ woman health worker: dark skin tone | |
| 963 | +1F468 200D 1F393 ; fully-qualified # ๐จโ๐ man student | |
| 964 | +1F468 1F3FB 200D 1F393 ; fully-qualified # ๐จ๐ปโ๐ man student: light skin tone | |
| 965 | +1F468 1F3FC 200D 1F393 ; fully-qualified # ๐จ๐ผโ๐ man student: medium-light skin tone | |
| 966 | +1F468 1F3FD 200D 1F393 ; fully-qualified # ๐จ๐ฝโ๐ man student: medium skin tone | |
| 967 | +1F468 1F3FE 200D 1F393 ; fully-qualified # ๐จ๐พโ๐ man student: medium-dark skin tone | |
| 968 | +1F468 1F3FF 200D 1F393 ; fully-qualified # ๐จ๐ฟโ๐ man student: dark skin tone | |
| 969 | +1F469 200D 1F393 ; fully-qualified # ๐ฉโ๐ woman student | |
| 970 | +1F469 1F3FB 200D 1F393 ; fully-qualified # ๐ฉ๐ปโ๐ woman student: light skin tone | |
| 971 | +1F469 1F3FC 200D 1F393 ; fully-qualified # ๐ฉ๐ผโ๐ woman student: medium-light skin tone | |
| 972 | +1F469 1F3FD 200D 1F393 ; fully-qualified # ๐ฉ๐ฝโ๐ woman student: medium skin tone | |
| 973 | +1F469 1F3FE 200D 1F393 ; fully-qualified # ๐ฉ๐พโ๐ woman student: medium-dark skin tone | |
| 974 | +1F469 1F3FF 200D 1F393 ; fully-qualified # ๐ฉ๐ฟโ๐ woman student: dark skin tone | |
| 975 | +1F468 200D 1F3EB ; fully-qualified # ๐จโ๐ซ man teacher | |
| 976 | +1F468 1F3FB 200D 1F3EB ; fully-qualified # ๐จ๐ปโ๐ซ man teacher: light skin tone | |
| 977 | +1F468 1F3FC 200D 1F3EB ; fully-qualified # ๐จ๐ผโ๐ซ man teacher: medium-light skin tone | |
| 978 | +1F468 1F3FD 200D 1F3EB ; fully-qualified # ๐จ๐ฝโ๐ซ man teacher: medium skin tone | |
| 979 | +1F468 1F3FE 200D 1F3EB ; fully-qualified # ๐จ๐พโ๐ซ man teacher: medium-dark skin tone | |
| 980 | +1F468 1F3FF 200D 1F3EB ; fully-qualified # ๐จ๐ฟโ๐ซ man teacher: dark skin tone | |
| 981 | +1F469 200D 1F3EB ; fully-qualified # ๐ฉโ๐ซ woman teacher | |
| 982 | +1F469 1F3FB 200D 1F3EB ; fully-qualified # ๐ฉ๐ปโ๐ซ woman teacher: light skin tone | |
| 983 | +1F469 1F3FC 200D 1F3EB ; fully-qualified # ๐ฉ๐ผโ๐ซ woman teacher: medium-light skin tone | |
| 984 | +1F469 1F3FD 200D 1F3EB ; fully-qualified # ๐ฉ๐ฝโ๐ซ woman teacher: medium skin tone | |
| 985 | +1F469 1F3FE 200D 1F3EB ; fully-qualified # ๐ฉ๐พโ๐ซ woman teacher: medium-dark skin tone | |
| 986 | +1F469 1F3FF 200D 1F3EB ; fully-qualified # ๐ฉ๐ฟโ๐ซ woman teacher: dark skin tone | |
| 987 | +1F468 200D 2696 FE0F ; fully-qualified # ๐จโโ๏ธ man judge | |
| 988 | +1F468 200D 2696 ; minimally-qualified # ๐จโโ man judge | |
| 989 | +1F468 1F3FB 200D 2696 FE0F ; fully-qualified # ๐จ๐ปโโ๏ธ man judge: light skin tone | |
| 990 | +1F468 1F3FB 200D 2696 ; minimally-qualified # ๐จ๐ปโโ man judge: light skin tone | |
| 991 | +1F468 1F3FC 200D 2696 FE0F ; fully-qualified # ๐จ๐ผโโ๏ธ man judge: medium-light skin tone | |
| 992 | +1F468 1F3FC 200D 2696 ; minimally-qualified # ๐จ๐ผโโ man judge: medium-light skin tone | |
| 993 | +1F468 1F3FD 200D 2696 FE0F ; fully-qualified # ๐จ๐ฝโโ๏ธ man judge: medium skin tone | |
| 994 | +1F468 1F3FD 200D 2696 ; minimally-qualified # ๐จ๐ฝโโ man judge: medium skin tone | |
| 995 | +1F468 1F3FE 200D 2696 FE0F ; fully-qualified # ๐จ๐พโโ๏ธ man judge: medium-dark skin tone | |
| 996 | +1F468 1F3FE 200D 2696 ; minimally-qualified # ๐จ๐พโโ man judge: medium-dark skin tone | |
| 997 | +1F468 1F3FF 200D 2696 FE0F ; fully-qualified # ๐จ๐ฟโโ๏ธ man judge: dark skin tone | |
| 998 | +1F468 1F3FF 200D 2696 ; minimally-qualified # ๐จ๐ฟโโ man judge: dark skin tone | |
| 999 | +1F469 200D 2696 FE0F ; fully-qualified # ๐ฉโโ๏ธ woman judge | |
| 1000 | +1F469 200D 2696 ; minimally-qualified # ๐ฉโโ woman judge | |
| 1001 | +1F469 1F3FB 200D 2696 FE0F ; fully-qualified # ๐ฉ๐ปโโ๏ธ woman judge: light skin tone | |
| 1002 | +1F469 1F3FB 200D 2696 ; minimally-qualified # ๐ฉ๐ปโโ woman judge: light skin tone | |
| 1003 | +1F469 1F3FC 200D 2696 FE0F ; fully-qualified # ๐ฉ๐ผโโ๏ธ woman judge: medium-light skin tone | |
| 1004 | +1F469 1F3FC 200D 2696 ; minimally-qualified # ๐ฉ๐ผโโ woman judge: medium-light skin tone | |
| 1005 | +1F469 1F3FD 200D 2696 FE0F ; fully-qualified # ๐ฉ๐ฝโโ๏ธ woman judge: medium skin tone | |
| 1006 | +1F469 1F3FD 200D 2696 ; minimally-qualified # ๐ฉ๐ฝโโ woman judge: medium skin tone | |
| 1007 | +1F469 1F3FE 200D 2696 FE0F ; fully-qualified # ๐ฉ๐พโโ๏ธ woman judge: medium-dark skin tone | |
| 1008 | +1F469 1F3FE 200D 2696 ; minimally-qualified # ๐ฉ๐พโโ woman judge: medium-dark skin tone | |
| 1009 | +1F469 1F3FF 200D 2696 FE0F ; fully-qualified # ๐ฉ๐ฟโโ๏ธ woman judge: dark skin tone | |
| 1010 | +1F469 1F3FF 200D 2696 ; minimally-qualified # ๐ฉ๐ฟโโ woman judge: dark skin tone | |
| 1011 | +1F468 200D 1F33E ; fully-qualified # ๐จโ๐พ man farmer | |
| 1012 | +1F468 1F3FB 200D 1F33E ; fully-qualified # ๐จ๐ปโ๐พ man farmer: light skin tone | |
| 1013 | +1F468 1F3FC 200D 1F33E ; fully-qualified # ๐จ๐ผโ๐พ man farmer: medium-light skin tone | |
| 1014 | +1F468 1F3FD 200D 1F33E ; fully-qualified # ๐จ๐ฝโ๐พ man farmer: medium skin tone | |
| 1015 | +1F468 1F3FE 200D 1F33E ; fully-qualified # ๐จ๐พโ๐พ man farmer: medium-dark skin tone | |
| 1016 | +1F468 1F3FF 200D 1F33E ; fully-qualified # ๐จ๐ฟโ๐พ man farmer: dark skin tone | |
| 1017 | +1F469 200D 1F33E ; fully-qualified # ๐ฉโ๐พ woman farmer | |
| 1018 | +1F469 1F3FB 200D 1F33E ; fully-qualified # ๐ฉ๐ปโ๐พ woman farmer: light skin tone | |
| 1019 | +1F469 1F3FC 200D 1F33E ; fully-qualified # ๐ฉ๐ผโ๐พ woman farmer: medium-light skin tone | |
| 1020 | +1F469 1F3FD 200D 1F33E ; fully-qualified # ๐ฉ๐ฝโ๐พ woman farmer: medium skin tone | |
| 1021 | +1F469 1F3FE 200D 1F33E ; fully-qualified # ๐ฉ๐พโ๐พ woman farmer: medium-dark skin tone | |
| 1022 | +1F469 1F3FF 200D 1F33E ; fully-qualified # ๐ฉ๐ฟโ๐พ woman farmer: dark skin tone | |
| 1023 | +1F468 200D 1F373 ; fully-qualified # ๐จโ๐ณ man cook | |
| 1024 | +1F468 1F3FB 200D 1F373 ; fully-qualified # ๐จ๐ปโ๐ณ man cook: light skin tone | |
| 1025 | +1F468 1F3FC 200D 1F373 ; fully-qualified # ๐จ๐ผโ๐ณ man cook: medium-light skin tone | |
| 1026 | +1F468 1F3FD 200D 1F373 ; fully-qualified # ๐จ๐ฝโ๐ณ man cook: medium skin tone | |
| 1027 | +1F468 1F3FE 200D 1F373 ; fully-qualified # ๐จ๐พโ๐ณ man cook: medium-dark skin tone | |
| 1028 | +1F468 1F3FF 200D 1F373 ; fully-qualified # ๐จ๐ฟโ๐ณ man cook: dark skin tone | |
| 1029 | +1F469 200D 1F373 ; fully-qualified # ๐ฉโ๐ณ woman cook | |
| 1030 | +1F469 1F3FB 200D 1F373 ; fully-qualified # ๐ฉ๐ปโ๐ณ woman cook: light skin tone | |
| 1031 | +1F469 1F3FC 200D 1F373 ; fully-qualified # ๐ฉ๐ผโ๐ณ woman cook: medium-light skin tone | |
| 1032 | +1F469 1F3FD 200D 1F373 ; fully-qualified # ๐ฉ๐ฝโ๐ณ woman cook: medium skin tone | |
| 1033 | +1F469 1F3FE 200D 1F373 ; fully-qualified # ๐ฉ๐พโ๐ณ woman cook: medium-dark skin tone | |
| 1034 | +1F469 1F3FF 200D 1F373 ; fully-qualified # ๐ฉ๐ฟโ๐ณ woman cook: dark skin tone | |
| 1035 | +1F468 200D 1F527 ; fully-qualified # ๐จโ๐ง man mechanic | |
| 1036 | +1F468 1F3FB 200D 1F527 ; fully-qualified # ๐จ๐ปโ๐ง man mechanic: light skin tone | |
| 1037 | +1F468 1F3FC 200D 1F527 ; fully-qualified # ๐จ๐ผโ๐ง man mechanic: medium-light skin tone | |
| 1038 | +1F468 1F3FD 200D 1F527 ; fully-qualified # ๐จ๐ฝโ๐ง man mechanic: medium skin tone | |
| 1039 | +1F468 1F3FE 200D 1F527 ; fully-qualified # ๐จ๐พโ๐ง man mechanic: medium-dark skin tone | |
| 1040 | +1F468 1F3FF 200D 1F527 ; fully-qualified # ๐จ๐ฟโ๐ง man mechanic: dark skin tone | |
| 1041 | +1F469 200D 1F527 ; fully-qualified # ๐ฉโ๐ง woman mechanic | |
| 1042 | +1F469 1F3FB 200D 1F527 ; fully-qualified # ๐ฉ๐ปโ๐ง woman mechanic: light skin tone | |
| 1043 | +1F469 1F3FC 200D 1F527 ; fully-qualified # ๐ฉ๐ผโ๐ง woman mechanic: medium-light skin tone | |
| 1044 | +1F469 1F3FD 200D 1F527 ; fully-qualified # ๐ฉ๐ฝโ๐ง woman mechanic: medium skin tone | |
| 1045 | +1F469 1F3FE 200D 1F527 ; fully-qualified # ๐ฉ๐พโ๐ง woman mechanic: medium-dark skin tone | |
| 1046 | +1F469 1F3FF 200D 1F527 ; fully-qualified # ๐ฉ๐ฟโ๐ง woman mechanic: dark skin tone | |
| 1047 | +1F468 200D 1F3ED ; fully-qualified # ๐จโ๐ญ man factory worker | |
| 1048 | +1F468 1F3FB 200D 1F3ED ; fully-qualified # ๐จ๐ปโ๐ญ man factory worker: light skin tone | |
| 1049 | +1F468 1F3FC 200D 1F3ED ; fully-qualified # ๐จ๐ผโ๐ญ man factory worker: medium-light skin tone | |
| 1050 | +1F468 1F3FD 200D 1F3ED ; fully-qualified # ๐จ๐ฝโ๐ญ man factory worker: medium skin tone | |
| 1051 | +1F468 1F3FE 200D 1F3ED ; fully-qualified # ๐จ๐พโ๐ญ man factory worker: medium-dark skin tone | |
| 1052 | +1F468 1F3FF 200D 1F3ED ; fully-qualified # ๐จ๐ฟโ๐ญ man factory worker: dark skin tone | |
| 1053 | +1F469 200D 1F3ED ; fully-qualified # ๐ฉโ๐ญ woman factory worker | |
| 1054 | +1F469 1F3FB 200D 1F3ED ; fully-qualified # ๐ฉ๐ปโ๐ญ woman factory worker: light skin tone | |
| 1055 | +1F469 1F3FC 200D 1F3ED ; fully-qualified # ๐ฉ๐ผโ๐ญ woman factory worker: medium-light skin tone | |
| 1056 | +1F469 1F3FD 200D 1F3ED ; fully-qualified # ๐ฉ๐ฝโ๐ญ woman factory worker: medium skin tone | |
| 1057 | +1F469 1F3FE 200D 1F3ED ; fully-qualified # ๐ฉ๐พโ๐ญ woman factory worker: medium-dark skin tone | |
| 1058 | +1F469 1F3FF 200D 1F3ED ; fully-qualified # ๐ฉ๐ฟโ๐ญ woman factory worker: dark skin tone | |
| 1059 | +1F468 200D 1F4BC ; fully-qualified # ๐จโ๐ผ man office worker | |
| 1060 | +1F468 1F3FB 200D 1F4BC ; fully-qualified # ๐จ๐ปโ๐ผ man office worker: light skin tone | |
| 1061 | +1F468 1F3FC 200D 1F4BC ; fully-qualified # ๐จ๐ผโ๐ผ man office worker: medium-light skin tone | |
| 1062 | +1F468 1F3FD 200D 1F4BC ; fully-qualified # ๐จ๐ฝโ๐ผ man office worker: medium skin tone | |
| 1063 | +1F468 1F3FE 200D 1F4BC ; fully-qualified # ๐จ๐พโ๐ผ man office worker: medium-dark skin tone | |
| 1064 | +1F468 1F3FF 200D 1F4BC ; fully-qualified # ๐จ๐ฟโ๐ผ man office worker: dark skin tone | |
| 1065 | +1F469 200D 1F4BC ; fully-qualified # ๐ฉโ๐ผ woman office worker | |
| 1066 | +1F469 1F3FB 200D 1F4BC ; fully-qualified # ๐ฉ๐ปโ๐ผ woman office worker: light skin tone | |
| 1067 | +1F469 1F3FC 200D 1F4BC ; fully-qualified # ๐ฉ๐ผโ๐ผ woman office worker: medium-light skin tone | |
| 1068 | +1F469 1F3FD 200D 1F4BC ; fully-qualified # ๐ฉ๐ฝโ๐ผ woman office worker: medium skin tone | |
| 1069 | +1F469 1F3FE 200D 1F4BC ; fully-qualified # ๐ฉ๐พโ๐ผ woman office worker: medium-dark skin tone | |
| 1070 | +1F469 1F3FF 200D 1F4BC ; fully-qualified # ๐ฉ๐ฟโ๐ผ woman office worker: dark skin tone | |
| 1071 | +1F468 200D 1F52C ; fully-qualified # ๐จโ๐ฌ man scientist | |
| 1072 | +1F468 1F3FB 200D 1F52C ; fully-qualified # ๐จ๐ปโ๐ฌ man scientist: light skin tone | |
| 1073 | +1F468 1F3FC 200D 1F52C ; fully-qualified # ๐จ๐ผโ๐ฌ man scientist: medium-light skin tone | |
| 1074 | +1F468 1F3FD 200D 1F52C ; fully-qualified # ๐จ๐ฝโ๐ฌ man scientist: medium skin tone | |
| 1075 | +1F468 1F3FE 200D 1F52C ; fully-qualified # ๐จ๐พโ๐ฌ man scientist: medium-dark skin tone | |
| 1076 | +1F468 1F3FF 200D 1F52C ; fully-qualified # ๐จ๐ฟโ๐ฌ man scientist: dark skin tone | |
| 1077 | +1F469 200D 1F52C ; fully-qualified # ๐ฉโ๐ฌ woman scientist | |
| 1078 | +1F469 1F3FB 200D 1F52C ; fully-qualified # ๐ฉ๐ปโ๐ฌ woman scientist: light skin tone | |
| 1079 | +1F469 1F3FC 200D 1F52C ; fully-qualified # ๐ฉ๐ผโ๐ฌ woman scientist: medium-light skin tone | |
| 1080 | +1F469 1F3FD 200D 1F52C ; fully-qualified # ๐ฉ๐ฝโ๐ฌ woman scientist: medium skin tone | |
| 1081 | +1F469 1F3FE 200D 1F52C ; fully-qualified # ๐ฉ๐พโ๐ฌ woman scientist: medium-dark skin tone | |
| 1082 | +1F469 1F3FF 200D 1F52C ; fully-qualified # ๐ฉ๐ฟโ๐ฌ woman scientist: dark skin tone | |
| 1083 | +1F468 200D 1F4BB ; fully-qualified # ๐จโ๐ป man technologist | |
| 1084 | +1F468 1F3FB 200D 1F4BB ; fully-qualified # ๐จ๐ปโ๐ป man technologist: light skin tone | |
| 1085 | +1F468 1F3FC 200D 1F4BB ; fully-qualified # ๐จ๐ผโ๐ป man technologist: medium-light skin tone | |
| 1086 | +1F468 1F3FD 200D 1F4BB ; fully-qualified # ๐จ๐ฝโ๐ป man technologist: medium skin tone | |
| 1087 | +1F468 1F3FE 200D 1F4BB ; fully-qualified # ๐จ๐พโ๐ป man technologist: medium-dark skin tone | |
| 1088 | +1F468 1F3FF 200D 1F4BB ; fully-qualified # ๐จ๐ฟโ๐ป man technologist: dark skin tone | |
| 1089 | +1F469 200D 1F4BB ; fully-qualified # ๐ฉโ๐ป woman technologist | |
| 1090 | +1F469 1F3FB 200D 1F4BB ; fully-qualified # ๐ฉ๐ปโ๐ป woman technologist: light skin tone | |
| 1091 | +1F469 1F3FC 200D 1F4BB ; fully-qualified # ๐ฉ๐ผโ๐ป woman technologist: medium-light skin tone | |
| 1092 | +1F469 1F3FD 200D 1F4BB ; fully-qualified # ๐ฉ๐ฝโ๐ป woman technologist: medium skin tone | |
| 1093 | +1F469 1F3FE 200D 1F4BB ; fully-qualified # ๐ฉ๐พโ๐ป woman technologist: medium-dark skin tone | |
| 1094 | +1F469 1F3FF 200D 1F4BB ; fully-qualified # ๐ฉ๐ฟโ๐ป woman technologist: dark skin tone | |
| 1095 | +1F468 200D 1F3A4 ; fully-qualified # ๐จโ๐ค man singer | |
| 1096 | +1F468 1F3FB 200D 1F3A4 ; fully-qualified # ๐จ๐ปโ๐ค man singer: light skin tone | |
| 1097 | +1F468 1F3FC 200D 1F3A4 ; fully-qualified # ๐จ๐ผโ๐ค man singer: medium-light skin tone | |
| 1098 | +1F468 1F3FD 200D 1F3A4 ; fully-qualified # ๐จ๐ฝโ๐ค man singer: medium skin tone | |
| 1099 | +1F468 1F3FE 200D 1F3A4 ; fully-qualified # ๐จ๐พโ๐ค man singer: medium-dark skin tone | |
| 1100 | +1F468 1F3FF 200D 1F3A4 ; fully-qualified # ๐จ๐ฟโ๐ค man singer: dark skin tone | |
| 1101 | +1F469 200D 1F3A4 ; fully-qualified # ๐ฉโ๐ค woman singer | |
| 1102 | +1F469 1F3FB 200D 1F3A4 ; fully-qualified # ๐ฉ๐ปโ๐ค woman singer: light skin tone | |
| 1103 | +1F469 1F3FC 200D 1F3A4 ; fully-qualified # ๐ฉ๐ผโ๐ค woman singer: medium-light skin tone | |
| 1104 | +1F469 1F3FD 200D 1F3A4 ; fully-qualified # ๐ฉ๐ฝโ๐ค woman singer: medium skin tone | |
| 1105 | +1F469 1F3FE 200D 1F3A4 ; fully-qualified # ๐ฉ๐พโ๐ค woman singer: medium-dark skin tone | |
| 1106 | +1F469 1F3FF 200D 1F3A4 ; fully-qualified # ๐ฉ๐ฟโ๐ค woman singer: dark skin tone | |
| 1107 | +1F468 200D 1F3A8 ; fully-qualified # ๐จโ๐จ man artist | |
| 1108 | +1F468 1F3FB 200D 1F3A8 ; fully-qualified # ๐จ๐ปโ๐จ man artist: light skin tone | |
| 1109 | +1F468 1F3FC 200D 1F3A8 ; fully-qualified # ๐จ๐ผโ๐จ man artist: medium-light skin tone | |
| 1110 | +1F468 1F3FD 200D 1F3A8 ; fully-qualified # ๐จ๐ฝโ๐จ man artist: medium skin tone | |
| 1111 | +1F468 1F3FE 200D 1F3A8 ; fully-qualified # ๐จ๐พโ๐จ man artist: medium-dark skin tone | |
| 1112 | +1F468 1F3FF 200D 1F3A8 ; fully-qualified # ๐จ๐ฟโ๐จ man artist: dark skin tone | |
| 1113 | +1F469 200D 1F3A8 ; fully-qualified # ๐ฉโ๐จ woman artist | |
| 1114 | +1F469 1F3FB 200D 1F3A8 ; fully-qualified # ๐ฉ๐ปโ๐จ woman artist: light skin tone | |
| 1115 | +1F469 1F3FC 200D 1F3A8 ; fully-qualified # ๐ฉ๐ผโ๐จ woman artist: medium-light skin tone | |
| 1116 | +1F469 1F3FD 200D 1F3A8 ; fully-qualified # ๐ฉ๐ฝโ๐จ woman artist: medium skin tone | |
| 1117 | +1F469 1F3FE 200D 1F3A8 ; fully-qualified # ๐ฉ๐พโ๐จ woman artist: medium-dark skin tone | |
| 1118 | +1F469 1F3FF 200D 1F3A8 ; fully-qualified # ๐ฉ๐ฟโ๐จ woman artist: dark skin tone | |
| 1119 | +1F468 200D 2708 FE0F ; fully-qualified # ๐จโโ๏ธ man pilot | |
| 1120 | +1F468 200D 2708 ; minimally-qualified # ๐จโโ man pilot | |
| 1121 | +1F468 1F3FB 200D 2708 FE0F ; fully-qualified # ๐จ๐ปโโ๏ธ man pilot: light skin tone | |
| 1122 | +1F468 1F3FB 200D 2708 ; minimally-qualified # ๐จ๐ปโโ man pilot: light skin tone | |
| 1123 | +1F468 1F3FC 200D 2708 FE0F ; fully-qualified # ๐จ๐ผโโ๏ธ man pilot: medium-light skin tone | |
| 1124 | +1F468 1F3FC 200D 2708 ; minimally-qualified # ๐จ๐ผโโ man pilot: medium-light skin tone | |
| 1125 | +1F468 1F3FD 200D 2708 FE0F ; fully-qualified # ๐จ๐ฝโโ๏ธ man pilot: medium skin tone | |
| 1126 | +1F468 1F3FD 200D 2708 ; minimally-qualified # ๐จ๐ฝโโ man pilot: medium skin tone | |
| 1127 | +1F468 1F3FE 200D 2708 FE0F ; fully-qualified # ๐จ๐พโโ๏ธ man pilot: medium-dark skin tone | |
| 1128 | +1F468 1F3FE 200D 2708 ; minimally-qualified # ๐จ๐พโโ man pilot: medium-dark skin tone | |
| 1129 | +1F468 1F3FF 200D 2708 FE0F ; fully-qualified # ๐จ๐ฟโโ๏ธ man pilot: dark skin tone | |
| 1130 | +1F468 1F3FF 200D 2708 ; minimally-qualified # ๐จ๐ฟโโ man pilot: dark skin tone | |
| 1131 | +1F469 200D 2708 FE0F ; fully-qualified # ๐ฉโโ๏ธ woman pilot | |
| 1132 | +1F469 200D 2708 ; minimally-qualified # ๐ฉโโ woman pilot | |
| 1133 | +1F469 1F3FB 200D 2708 FE0F ; fully-qualified # ๐ฉ๐ปโโ๏ธ woman pilot: light skin tone | |
| 1134 | +1F469 1F3FB 200D 2708 ; minimally-qualified # ๐ฉ๐ปโโ woman pilot: light skin tone | |
| 1135 | +1F469 1F3FC 200D 2708 FE0F ; fully-qualified # ๐ฉ๐ผโโ๏ธ woman pilot: medium-light skin tone | |
| 1136 | +1F469 1F3FC 200D 2708 ; minimally-qualified # ๐ฉ๐ผโโ woman pilot: medium-light skin tone | |
| 1137 | +1F469 1F3FD 200D 2708 FE0F ; fully-qualified # ๐ฉ๐ฝโโ๏ธ woman pilot: medium skin tone | |
| 1138 | +1F469 1F3FD 200D 2708 ; minimally-qualified # ๐ฉ๐ฝโโ woman pilot: medium skin tone | |
| 1139 | +1F469 1F3FE 200D 2708 FE0F ; fully-qualified # ๐ฉ๐พโโ๏ธ woman pilot: medium-dark skin tone | |
| 1140 | +1F469 1F3FE 200D 2708 ; minimally-qualified # ๐ฉ๐พโโ woman pilot: medium-dark skin tone | |
| 1141 | +1F469 1F3FF 200D 2708 FE0F ; fully-qualified # ๐ฉ๐ฟโโ๏ธ woman pilot: dark skin tone | |
| 1142 | +1F469 1F3FF 200D 2708 ; minimally-qualified # ๐ฉ๐ฟโโ woman pilot: dark skin tone | |
| 1143 | +1F468 200D 1F680 ; fully-qualified # ๐จโ๐ man astronaut | |
| 1144 | +1F468 1F3FB 200D 1F680 ; fully-qualified # ๐จ๐ปโ๐ man astronaut: light skin tone | |
| 1145 | +1F468 1F3FC 200D 1F680 ; fully-qualified # ๐จ๐ผโ๐ man astronaut: medium-light skin tone | |
| 1146 | +1F468 1F3FD 200D 1F680 ; fully-qualified # ๐จ๐ฝโ๐ man astronaut: medium skin tone | |
| 1147 | +1F468 1F3FE 200D 1F680 ; fully-qualified # ๐จ๐พโ๐ man astronaut: medium-dark skin tone | |
| 1148 | +1F468 1F3FF 200D 1F680 ; fully-qualified # ๐จ๐ฟโ๐ man astronaut: dark skin tone | |
| 1149 | +1F469 200D 1F680 ; fully-qualified # ๐ฉโ๐ woman astronaut | |
| 1150 | +1F469 1F3FB 200D 1F680 ; fully-qualified # ๐ฉ๐ปโ๐ woman astronaut: light skin tone | |
| 1151 | +1F469 1F3FC 200D 1F680 ; fully-qualified # ๐ฉ๐ผโ๐ woman astronaut: medium-light skin tone | |
| 1152 | +1F469 1F3FD 200D 1F680 ; fully-qualified # ๐ฉ๐ฝโ๐ woman astronaut: medium skin tone | |
| 1153 | +1F469 1F3FE 200D 1F680 ; fully-qualified # ๐ฉ๐พโ๐ woman astronaut: medium-dark skin tone | |
| 1154 | +1F469 1F3FF 200D 1F680 ; fully-qualified # ๐ฉ๐ฟโ๐ woman astronaut: dark skin tone | |
| 1155 | +1F468 200D 1F692 ; fully-qualified # ๐จโ๐ man firefighter | |
| 1156 | +1F468 1F3FB 200D 1F692 ; fully-qualified # ๐จ๐ปโ๐ man firefighter: light skin tone | |
| 1157 | +1F468 1F3FC 200D 1F692 ; fully-qualified # ๐จ๐ผโ๐ man firefighter: medium-light skin tone | |
| 1158 | +1F468 1F3FD 200D 1F692 ; fully-qualified # ๐จ๐ฝโ๐ man firefighter: medium skin tone | |
| 1159 | +1F468 1F3FE 200D 1F692 ; fully-qualified # ๐จ๐พโ๐ man firefighter: medium-dark skin tone | |
| 1160 | +1F468 1F3FF 200D 1F692 ; fully-qualified # ๐จ๐ฟโ๐ man firefighter: dark skin tone | |
| 1161 | +1F469 200D 1F692 ; fully-qualified # ๐ฉโ๐ woman firefighter | |
| 1162 | +1F469 1F3FB 200D 1F692 ; fully-qualified # ๐ฉ๐ปโ๐ woman firefighter: light skin tone | |
| 1163 | +1F469 1F3FC 200D 1F692 ; fully-qualified # ๐ฉ๐ผโ๐ woman firefighter: medium-light skin tone | |
| 1164 | +1F469 1F3FD 200D 1F692 ; fully-qualified # ๐ฉ๐ฝโ๐ woman firefighter: medium skin tone | |
| 1165 | +1F469 1F3FE 200D 1F692 ; fully-qualified # ๐ฉ๐พโ๐ woman firefighter: medium-dark skin tone | |
| 1166 | +1F469 1F3FF 200D 1F692 ; fully-qualified # ๐ฉ๐ฟโ๐ woman firefighter: dark skin tone | |
| 1167 | +1F46E ; fully-qualified # ๐ฎ police officer | |
| 1168 | +1F46E 1F3FB ; fully-qualified # ๐ฎ๐ป police officer: light skin tone | |
| 1169 | +1F46E 1F3FC ; fully-qualified # ๐ฎ๐ผ police officer: medium-light skin tone | |
| 1170 | +1F46E 1F3FD ; fully-qualified # ๐ฎ๐ฝ police officer: medium skin tone | |
| 1171 | +1F46E 1F3FE ; fully-qualified # ๐ฎ๐พ police officer: medium-dark skin tone | |
| 1172 | +1F46E 1F3FF ; fully-qualified # ๐ฎ๐ฟ police officer: dark skin tone | |
| 1173 | +1F46E 200D 2642 FE0F ; fully-qualified # ๐ฎโโ๏ธ man police officer | |
| 1174 | +1F46E 200D 2642 ; minimally-qualified # ๐ฎโโ man police officer | |
| 1175 | +1F46E 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ฎ๐ปโโ๏ธ man police officer: light skin tone | |
| 1176 | +1F46E 1F3FB 200D 2642 ; minimally-qualified # ๐ฎ๐ปโโ man police officer: light skin tone | |
| 1177 | +1F46E 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ฎ๐ผโโ๏ธ man police officer: medium-light skin tone | |
| 1178 | +1F46E 1F3FC 200D 2642 ; minimally-qualified # ๐ฎ๐ผโโ man police officer: medium-light skin tone | |
| 1179 | +1F46E 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ฎ๐ฝโโ๏ธ man police officer: medium skin tone | |
| 1180 | +1F46E 1F3FD 200D 2642 ; minimally-qualified # ๐ฎ๐ฝโโ man police officer: medium skin tone | |
| 1181 | +1F46E 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ฎ๐พโโ๏ธ man police officer: medium-dark skin tone | |
| 1182 | +1F46E 1F3FE 200D 2642 ; minimally-qualified # ๐ฎ๐พโโ man police officer: medium-dark skin tone | |
| 1183 | +1F46E 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ฎ๐ฟโโ๏ธ man police officer: dark skin tone | |
| 1184 | +1F46E 1F3FF 200D 2642 ; minimally-qualified # ๐ฎ๐ฟโโ man police officer: dark skin tone | |
| 1185 | +1F46E 200D 2640 FE0F ; fully-qualified # ๐ฎโโ๏ธ woman police officer | |
| 1186 | +1F46E 200D 2640 ; minimally-qualified # ๐ฎโโ woman police officer | |
| 1187 | +1F46E 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ฎ๐ปโโ๏ธ woman police officer: light skin tone | |
| 1188 | +1F46E 1F3FB 200D 2640 ; minimally-qualified # ๐ฎ๐ปโโ woman police officer: light skin tone | |
| 1189 | +1F46E 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ฎ๐ผโโ๏ธ woman police officer: medium-light skin tone | |
| 1190 | +1F46E 1F3FC 200D 2640 ; minimally-qualified # ๐ฎ๐ผโโ woman police officer: medium-light skin tone | |
| 1191 | +1F46E 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ฎ๐ฝโโ๏ธ woman police officer: medium skin tone | |
| 1192 | +1F46E 1F3FD 200D 2640 ; minimally-qualified # ๐ฎ๐ฝโโ woman police officer: medium skin tone | |
| 1193 | +1F46E 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ฎ๐พโโ๏ธ woman police officer: medium-dark skin tone | |
| 1194 | +1F46E 1F3FE 200D 2640 ; minimally-qualified # ๐ฎ๐พโโ woman police officer: medium-dark skin tone | |
| 1195 | +1F46E 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ฎ๐ฟโโ๏ธ woman police officer: dark skin tone | |
| 1196 | +1F46E 1F3FF 200D 2640 ; minimally-qualified # ๐ฎ๐ฟโโ woman police officer: dark skin tone | |
| 1197 | +1F575 FE0F ; fully-qualified # ๐ต๏ธ detective | |
| 1198 | +1F575 ; unqualified # ๐ต detective | |
| 1199 | +1F575 1F3FB ; fully-qualified # ๐ต๐ป detective: light skin tone | |
| 1200 | +1F575 1F3FC ; fully-qualified # ๐ต๐ผ detective: medium-light skin tone | |
| 1201 | +1F575 1F3FD ; fully-qualified # ๐ต๐ฝ detective: medium skin tone | |
| 1202 | +1F575 1F3FE ; fully-qualified # ๐ต๐พ detective: medium-dark skin tone | |
| 1203 | +1F575 1F3FF ; fully-qualified # ๐ต๐ฟ detective: dark skin tone | |
| 1204 | +1F575 FE0F 200D 2642 FE0F ; fully-qualified # ๐ต๏ธโโ๏ธ man detective | |
| 1205 | +1F575 200D 2642 FE0F ; unqualified # ๐ตโโ๏ธ man detective | |
| 1206 | +1F575 FE0F 200D 2642 ; unqualified # ๐ต๏ธโโ man detective | |
| 1207 | +1F575 200D 2642 ; unqualified # ๐ตโโ man detective | |
| 1208 | +1F575 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ต๐ปโโ๏ธ man detective: light skin tone | |
| 1209 | +1F575 1F3FB 200D 2642 ; minimally-qualified # ๐ต๐ปโโ man detective: light skin tone | |
| 1210 | +1F575 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ต๐ผโโ๏ธ man detective: medium-light skin tone | |
| 1211 | +1F575 1F3FC 200D 2642 ; minimally-qualified # ๐ต๐ผโโ man detective: medium-light skin tone | |
| 1212 | +1F575 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ต๐ฝโโ๏ธ man detective: medium skin tone | |
| 1213 | +1F575 1F3FD 200D 2642 ; minimally-qualified # ๐ต๐ฝโโ man detective: medium skin tone | |
| 1214 | +1F575 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ต๐พโโ๏ธ man detective: medium-dark skin tone | |
| 1215 | +1F575 1F3FE 200D 2642 ; minimally-qualified # ๐ต๐พโโ man detective: medium-dark skin tone | |
| 1216 | +1F575 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ต๐ฟโโ๏ธ man detective: dark skin tone | |
| 1217 | +1F575 1F3FF 200D 2642 ; minimally-qualified # ๐ต๐ฟโโ man detective: dark skin tone | |
| 1218 | +1F575 FE0F 200D 2640 FE0F ; fully-qualified # ๐ต๏ธโโ๏ธ woman detective | |
| 1219 | +1F575 200D 2640 FE0F ; unqualified # ๐ตโโ๏ธ woman detective | |
| 1220 | +1F575 FE0F 200D 2640 ; unqualified # ๐ต๏ธโโ woman detective | |
| 1221 | +1F575 200D 2640 ; unqualified # ๐ตโโ woman detective | |
| 1222 | +1F575 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ต๐ปโโ๏ธ woman detective: light skin tone | |
| 1223 | +1F575 1F3FB 200D 2640 ; minimally-qualified # ๐ต๐ปโโ woman detective: light skin tone | |
| 1224 | +1F575 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ต๐ผโโ๏ธ woman detective: medium-light skin tone | |
| 1225 | +1F575 1F3FC 200D 2640 ; minimally-qualified # ๐ต๐ผโโ woman detective: medium-light skin tone | |
| 1226 | +1F575 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ต๐ฝโโ๏ธ woman detective: medium skin tone | |
| 1227 | +1F575 1F3FD 200D 2640 ; minimally-qualified # ๐ต๐ฝโโ woman detective: medium skin tone | |
| 1228 | +1F575 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ต๐พโโ๏ธ woman detective: medium-dark skin tone | |
| 1229 | +1F575 1F3FE 200D 2640 ; minimally-qualified # ๐ต๐พโโ woman detective: medium-dark skin tone | |
| 1230 | +1F575 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ต๐ฟโโ๏ธ woman detective: dark skin tone | |
| 1231 | +1F575 1F3FF 200D 2640 ; minimally-qualified # ๐ต๐ฟโโ woman detective: dark skin tone | |
| 1232 | +1F482 ; fully-qualified # ๐ guard | |
| 1233 | +1F482 1F3FB ; fully-qualified # ๐๐ป guard: light skin tone | |
| 1234 | +1F482 1F3FC ; fully-qualified # ๐๐ผ guard: medium-light skin tone | |
| 1235 | +1F482 1F3FD ; fully-qualified # ๐๐ฝ guard: medium skin tone | |
| 1236 | +1F482 1F3FE ; fully-qualified # ๐๐พ guard: medium-dark skin tone | |
| 1237 | +1F482 1F3FF ; fully-qualified # ๐๐ฟ guard: dark skin tone | |
| 1238 | +1F482 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man guard | |
| 1239 | +1F482 200D 2642 ; minimally-qualified # ๐โโ man guard | |
| 1240 | +1F482 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man guard: light skin tone | |
| 1241 | +1F482 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man guard: light skin tone | |
| 1242 | +1F482 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man guard: medium-light skin tone | |
| 1243 | +1F482 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man guard: medium-light skin tone | |
| 1244 | +1F482 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man guard: medium skin tone | |
| 1245 | +1F482 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man guard: medium skin tone | |
| 1246 | +1F482 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man guard: medium-dark skin tone | |
| 1247 | +1F482 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man guard: medium-dark skin tone | |
| 1248 | +1F482 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man guard: dark skin tone | |
| 1249 | +1F482 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man guard: dark skin tone | |
| 1250 | +1F482 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman guard | |
| 1251 | +1F482 200D 2640 ; minimally-qualified # ๐โโ woman guard | |
| 1252 | +1F482 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman guard: light skin tone | |
| 1253 | +1F482 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman guard: light skin tone | |
| 1254 | +1F482 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman guard: medium-light skin tone | |
| 1255 | +1F482 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman guard: medium-light skin tone | |
| 1256 | +1F482 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman guard: medium skin tone | |
| 1257 | +1F482 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman guard: medium skin tone | |
| 1258 | +1F482 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman guard: medium-dark skin tone | |
| 1259 | +1F482 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman guard: medium-dark skin tone | |
| 1260 | +1F482 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman guard: dark skin tone | |
| 1261 | +1F482 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman guard: dark skin tone | |
| 1262 | +1F477 ; fully-qualified # ๐ท construction worker | |
| 1263 | +1F477 1F3FB ; fully-qualified # ๐ท๐ป construction worker: light skin tone | |
| 1264 | +1F477 1F3FC ; fully-qualified # ๐ท๐ผ construction worker: medium-light skin tone | |
| 1265 | +1F477 1F3FD ; fully-qualified # ๐ท๐ฝ construction worker: medium skin tone | |
| 1266 | +1F477 1F3FE ; fully-qualified # ๐ท๐พ construction worker: medium-dark skin tone | |
| 1267 | +1F477 1F3FF ; fully-qualified # ๐ท๐ฟ construction worker: dark skin tone | |
| 1268 | +1F477 200D 2642 FE0F ; fully-qualified # ๐ทโโ๏ธ man construction worker | |
| 1269 | +1F477 200D 2642 ; minimally-qualified # ๐ทโโ man construction worker | |
| 1270 | +1F477 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ท๐ปโโ๏ธ man construction worker: light skin tone | |
| 1271 | +1F477 1F3FB 200D 2642 ; minimally-qualified # ๐ท๐ปโโ man construction worker: light skin tone | |
| 1272 | +1F477 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ท๐ผโโ๏ธ man construction worker: medium-light skin tone | |
| 1273 | +1F477 1F3FC 200D 2642 ; minimally-qualified # ๐ท๐ผโโ man construction worker: medium-light skin tone | |
| 1274 | +1F477 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ท๐ฝโโ๏ธ man construction worker: medium skin tone | |
| 1275 | +1F477 1F3FD 200D 2642 ; minimally-qualified # ๐ท๐ฝโโ man construction worker: medium skin tone | |
| 1276 | +1F477 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ท๐พโโ๏ธ man construction worker: medium-dark skin tone | |
| 1277 | +1F477 1F3FE 200D 2642 ; minimally-qualified # ๐ท๐พโโ man construction worker: medium-dark skin tone | |
| 1278 | +1F477 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ท๐ฟโโ๏ธ man construction worker: dark skin tone | |
| 1279 | +1F477 1F3FF 200D 2642 ; minimally-qualified # ๐ท๐ฟโโ man construction worker: dark skin tone | |
| 1280 | +1F477 200D 2640 FE0F ; fully-qualified # ๐ทโโ๏ธ woman construction worker | |
| 1281 | +1F477 200D 2640 ; minimally-qualified # ๐ทโโ woman construction worker | |
| 1282 | +1F477 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ท๐ปโโ๏ธ woman construction worker: light skin tone | |
| 1283 | +1F477 1F3FB 200D 2640 ; minimally-qualified # ๐ท๐ปโโ woman construction worker: light skin tone | |
| 1284 | +1F477 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ท๐ผโโ๏ธ woman construction worker: medium-light skin tone | |
| 1285 | +1F477 1F3FC 200D 2640 ; minimally-qualified # ๐ท๐ผโโ woman construction worker: medium-light skin tone | |
| 1286 | +1F477 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ท๐ฝโโ๏ธ woman construction worker: medium skin tone | |
| 1287 | +1F477 1F3FD 200D 2640 ; minimally-qualified # ๐ท๐ฝโโ woman construction worker: medium skin tone | |
| 1288 | +1F477 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ท๐พโโ๏ธ woman construction worker: medium-dark skin tone | |
| 1289 | +1F477 1F3FE 200D 2640 ; minimally-qualified # ๐ท๐พโโ woman construction worker: medium-dark skin tone | |
| 1290 | +1F477 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ท๐ฟโโ๏ธ woman construction worker: dark skin tone | |
| 1291 | +1F477 1F3FF 200D 2640 ; minimally-qualified # ๐ท๐ฟโโ woman construction worker: dark skin tone | |
| 1292 | +1F934 ; fully-qualified # ๐คด prince | |
| 1293 | +1F934 1F3FB ; fully-qualified # ๐คด๐ป prince: light skin tone | |
| 1294 | +1F934 1F3FC ; fully-qualified # ๐คด๐ผ prince: medium-light skin tone | |
| 1295 | +1F934 1F3FD ; fully-qualified # ๐คด๐ฝ prince: medium skin tone | |
| 1296 | +1F934 1F3FE ; fully-qualified # ๐คด๐พ prince: medium-dark skin tone | |
| 1297 | +1F934 1F3FF ; fully-qualified # ๐คด๐ฟ prince: dark skin tone | |
| 1298 | +1F478 ; fully-qualified # ๐ธ princess | |
| 1299 | +1F478 1F3FB ; fully-qualified # ๐ธ๐ป princess: light skin tone | |
| 1300 | +1F478 1F3FC ; fully-qualified # ๐ธ๐ผ princess: medium-light skin tone | |
| 1301 | +1F478 1F3FD ; fully-qualified # ๐ธ๐ฝ princess: medium skin tone | |
| 1302 | +1F478 1F3FE ; fully-qualified # ๐ธ๐พ princess: medium-dark skin tone | |
| 1303 | +1F478 1F3FF ; fully-qualified # ๐ธ๐ฟ princess: dark skin tone | |
| 1304 | +1F473 ; fully-qualified # ๐ณ person wearing turban | |
| 1305 | +1F473 1F3FB ; fully-qualified # ๐ณ๐ป person wearing turban: light skin tone | |
| 1306 | +1F473 1F3FC ; fully-qualified # ๐ณ๐ผ person wearing turban: medium-light skin tone | |
| 1307 | +1F473 1F3FD ; fully-qualified # ๐ณ๐ฝ person wearing turban: medium skin tone | |
| 1308 | +1F473 1F3FE ; fully-qualified # ๐ณ๐พ person wearing turban: medium-dark skin tone | |
| 1309 | +1F473 1F3FF ; fully-qualified # ๐ณ๐ฟ person wearing turban: dark skin tone | |
| 1310 | +1F473 200D 2642 FE0F ; fully-qualified # ๐ณโโ๏ธ man wearing turban | |
| 1311 | +1F473 200D 2642 ; minimally-qualified # ๐ณโโ man wearing turban | |
| 1312 | +1F473 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ณ๐ปโโ๏ธ man wearing turban: light skin tone | |
| 1313 | +1F473 1F3FB 200D 2642 ; minimally-qualified # ๐ณ๐ปโโ man wearing turban: light skin tone | |
| 1314 | +1F473 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ณ๐ผโโ๏ธ man wearing turban: medium-light skin tone | |
| 1315 | +1F473 1F3FC 200D 2642 ; minimally-qualified # ๐ณ๐ผโโ man wearing turban: medium-light skin tone | |
| 1316 | +1F473 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ณ๐ฝโโ๏ธ man wearing turban: medium skin tone | |
| 1317 | +1F473 1F3FD 200D 2642 ; minimally-qualified # ๐ณ๐ฝโโ man wearing turban: medium skin tone | |
| 1318 | +1F473 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ณ๐พโโ๏ธ man wearing turban: medium-dark skin tone | |
| 1319 | +1F473 1F3FE 200D 2642 ; minimally-qualified # ๐ณ๐พโโ man wearing turban: medium-dark skin tone | |
| 1320 | +1F473 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ณ๐ฟโโ๏ธ man wearing turban: dark skin tone | |
| 1321 | +1F473 1F3FF 200D 2642 ; minimally-qualified # ๐ณ๐ฟโโ man wearing turban: dark skin tone | |
| 1322 | +1F473 200D 2640 FE0F ; fully-qualified # ๐ณโโ๏ธ woman wearing turban | |
| 1323 | +1F473 200D 2640 ; minimally-qualified # ๐ณโโ woman wearing turban | |
| 1324 | +1F473 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ณ๐ปโโ๏ธ woman wearing turban: light skin tone | |
| 1325 | +1F473 1F3FB 200D 2640 ; minimally-qualified # ๐ณ๐ปโโ woman wearing turban: light skin tone | |
| 1326 | +1F473 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ณ๐ผโโ๏ธ woman wearing turban: medium-light skin tone | |
| 1327 | +1F473 1F3FC 200D 2640 ; minimally-qualified # ๐ณ๐ผโโ woman wearing turban: medium-light skin tone | |
| 1328 | +1F473 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ณ๐ฝโโ๏ธ woman wearing turban: medium skin tone | |
| 1329 | +1F473 1F3FD 200D 2640 ; minimally-qualified # ๐ณ๐ฝโโ woman wearing turban: medium skin tone | |
| 1330 | +1F473 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ณ๐พโโ๏ธ woman wearing turban: medium-dark skin tone | |
| 1331 | +1F473 1F3FE 200D 2640 ; minimally-qualified # ๐ณ๐พโโ woman wearing turban: medium-dark skin tone | |
| 1332 | +1F473 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ณ๐ฟโโ๏ธ woman wearing turban: dark skin tone | |
| 1333 | +1F473 1F3FF 200D 2640 ; minimally-qualified # ๐ณ๐ฟโโ woman wearing turban: dark skin tone | |
| 1334 | +1F472 ; fully-qualified # ๐ฒ man with Chinese cap | |
| 1335 | +1F472 1F3FB ; fully-qualified # ๐ฒ๐ป man with Chinese cap: light skin tone | |
| 1336 | +1F472 1F3FC ; fully-qualified # ๐ฒ๐ผ man with Chinese cap: medium-light skin tone | |
| 1337 | +1F472 1F3FD ; fully-qualified # ๐ฒ๐ฝ man with Chinese cap: medium skin tone | |
| 1338 | +1F472 1F3FE ; fully-qualified # ๐ฒ๐พ man with Chinese cap: medium-dark skin tone | |
| 1339 | +1F472 1F3FF ; fully-qualified # ๐ฒ๐ฟ man with Chinese cap: dark skin tone | |
| 1340 | +1F9D5 ; fully-qualified # ๐ง woman with headscarf | |
| 1341 | +1F9D5 1F3FB ; fully-qualified # ๐ง๐ป woman with headscarf: light skin tone | |
| 1342 | +1F9D5 1F3FC ; fully-qualified # ๐ง๐ผ woman with headscarf: medium-light skin tone | |
| 1343 | +1F9D5 1F3FD ; fully-qualified # ๐ง๐ฝ woman with headscarf: medium skin tone | |
| 1344 | +1F9D5 1F3FE ; fully-qualified # ๐ง๐พ woman with headscarf: medium-dark skin tone | |
| 1345 | +1F9D5 1F3FF ; fully-qualified # ๐ง๐ฟ woman with headscarf: dark skin tone | |
| 1346 | +1F935 ; fully-qualified # ๐คต man in tuxedo | |
| 1347 | +1F935 1F3FB ; fully-qualified # ๐คต๐ป man in tuxedo: light skin tone | |
| 1348 | +1F935 1F3FC ; fully-qualified # ๐คต๐ผ man in tuxedo: medium-light skin tone | |
| 1349 | +1F935 1F3FD ; fully-qualified # ๐คต๐ฝ man in tuxedo: medium skin tone | |
| 1350 | +1F935 1F3FE ; fully-qualified # ๐คต๐พ man in tuxedo: medium-dark skin tone | |
| 1351 | +1F935 1F3FF ; fully-qualified # ๐คต๐ฟ man in tuxedo: dark skin tone | |
| 1352 | +1F470 ; fully-qualified # ๐ฐ bride with veil | |
| 1353 | +1F470 1F3FB ; fully-qualified # ๐ฐ๐ป bride with veil: light skin tone | |
| 1354 | +1F470 1F3FC ; fully-qualified # ๐ฐ๐ผ bride with veil: medium-light skin tone | |
| 1355 | +1F470 1F3FD ; fully-qualified # ๐ฐ๐ฝ bride with veil: medium skin tone | |
| 1356 | +1F470 1F3FE ; fully-qualified # ๐ฐ๐พ bride with veil: medium-dark skin tone | |
| 1357 | +1F470 1F3FF ; fully-qualified # ๐ฐ๐ฟ bride with veil: dark skin tone | |
| 1358 | +1F930 ; fully-qualified # ๐คฐ pregnant woman | |
| 1359 | +1F930 1F3FB ; fully-qualified # ๐คฐ๐ป pregnant woman: light skin tone | |
| 1360 | +1F930 1F3FC ; fully-qualified # ๐คฐ๐ผ pregnant woman: medium-light skin tone | |
| 1361 | +1F930 1F3FD ; fully-qualified # ๐คฐ๐ฝ pregnant woman: medium skin tone | |
| 1362 | +1F930 1F3FE ; fully-qualified # ๐คฐ๐พ pregnant woman: medium-dark skin tone | |
| 1363 | +1F930 1F3FF ; fully-qualified # ๐คฐ๐ฟ pregnant woman: dark skin tone | |
| 1364 | +1F931 ; fully-qualified # ๐คฑ breast-feeding | |
| 1365 | +1F931 1F3FB ; fully-qualified # ๐คฑ๐ป breast-feeding: light skin tone | |
| 1366 | +1F931 1F3FC ; fully-qualified # ๐คฑ๐ผ breast-feeding: medium-light skin tone | |
| 1367 | +1F931 1F3FD ; fully-qualified # ๐คฑ๐ฝ breast-feeding: medium skin tone | |
| 1368 | +1F931 1F3FE ; fully-qualified # ๐คฑ๐พ breast-feeding: medium-dark skin tone | |
| 1369 | +1F931 1F3FF ; fully-qualified # ๐คฑ๐ฟ breast-feeding: dark skin tone | |
| 1370 | + | |
| 1371 | +# subgroup: person-fantasy | |
| 1372 | +1F47C ; fully-qualified # ๐ผ baby angel | |
| 1373 | +1F47C 1F3FB ; fully-qualified # ๐ผ๐ป baby angel: light skin tone | |
| 1374 | +1F47C 1F3FC ; fully-qualified # ๐ผ๐ผ baby angel: medium-light skin tone | |
| 1375 | +1F47C 1F3FD ; fully-qualified # ๐ผ๐ฝ baby angel: medium skin tone | |
| 1376 | +1F47C 1F3FE ; fully-qualified # ๐ผ๐พ baby angel: medium-dark skin tone | |
| 1377 | +1F47C 1F3FF ; fully-qualified # ๐ผ๐ฟ baby angel: dark skin tone | |
| 1378 | +1F385 ; fully-qualified # ๐ Santa Claus | |
| 1379 | +1F385 1F3FB ; fully-qualified # ๐ ๐ป Santa Claus: light skin tone | |
| 1380 | +1F385 1F3FC ; fully-qualified # ๐ ๐ผ Santa Claus: medium-light skin tone | |
| 1381 | +1F385 1F3FD ; fully-qualified # ๐ ๐ฝ Santa Claus: medium skin tone | |
| 1382 | +1F385 1F3FE ; fully-qualified # ๐ ๐พ Santa Claus: medium-dark skin tone | |
| 1383 | +1F385 1F3FF ; fully-qualified # ๐ ๐ฟ Santa Claus: dark skin tone | |
| 1384 | +1F936 ; fully-qualified # ๐คถ Mrs. Claus | |
| 1385 | +1F936 1F3FB ; fully-qualified # ๐คถ๐ป Mrs. Claus: light skin tone | |
| 1386 | +1F936 1F3FC ; fully-qualified # ๐คถ๐ผ Mrs. Claus: medium-light skin tone | |
| 1387 | +1F936 1F3FD ; fully-qualified # ๐คถ๐ฝ Mrs. Claus: medium skin tone | |
| 1388 | +1F936 1F3FE ; fully-qualified # ๐คถ๐พ Mrs. Claus: medium-dark skin tone | |
| 1389 | +1F936 1F3FF ; fully-qualified # ๐คถ๐ฟ Mrs. Claus: dark skin tone | |
| 1390 | +1F9B8 ; fully-qualified # ๐ฆธ superhero | |
| 1391 | +1F9B8 1F3FB ; fully-qualified # ๐ฆธ๐ป superhero: light skin tone | |
| 1392 | +1F9B8 1F3FC ; fully-qualified # ๐ฆธ๐ผ superhero: medium-light skin tone | |
| 1393 | +1F9B8 1F3FD ; fully-qualified # ๐ฆธ๐ฝ superhero: medium skin tone | |
| 1394 | +1F9B8 1F3FE ; fully-qualified # ๐ฆธ๐พ superhero: medium-dark skin tone | |
| 1395 | +1F9B8 1F3FF ; fully-qualified # ๐ฆธ๐ฟ superhero: dark skin tone | |
| 1396 | +1F9B8 200D 2642 FE0F ; fully-qualified # ๐ฆธโโ๏ธ man superhero | |
| 1397 | +1F9B8 200D 2642 ; minimally-qualified # ๐ฆธโโ man superhero | |
| 1398 | +1F9B8 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ฆธ๐ปโโ๏ธ man superhero: light skin tone | |
| 1399 | +1F9B8 1F3FB 200D 2642 ; minimally-qualified # ๐ฆธ๐ปโโ man superhero: light skin tone | |
| 1400 | +1F9B8 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ฆธ๐ผโโ๏ธ man superhero: medium-light skin tone | |
| 1401 | +1F9B8 1F3FC 200D 2642 ; minimally-qualified # ๐ฆธ๐ผโโ man superhero: medium-light skin tone | |
| 1402 | +1F9B8 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ฆธ๐ฝโโ๏ธ man superhero: medium skin tone | |
| 1403 | +1F9B8 1F3FD 200D 2642 ; minimally-qualified # ๐ฆธ๐ฝโโ man superhero: medium skin tone | |
| 1404 | +1F9B8 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ฆธ๐พโโ๏ธ man superhero: medium-dark skin tone | |
| 1405 | +1F9B8 1F3FE 200D 2642 ; minimally-qualified # ๐ฆธ๐พโโ man superhero: medium-dark skin tone | |
| 1406 | +1F9B8 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ฆธ๐ฟโโ๏ธ man superhero: dark skin tone | |
| 1407 | +1F9B8 1F3FF 200D 2642 ; minimally-qualified # ๐ฆธ๐ฟโโ man superhero: dark skin tone | |
| 1408 | +1F9B8 200D 2640 FE0F ; fully-qualified # ๐ฆธโโ๏ธ woman superhero | |
| 1409 | +1F9B8 200D 2640 ; minimally-qualified # ๐ฆธโโ woman superhero | |
| 1410 | +1F9B8 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ฆธ๐ปโโ๏ธ woman superhero: light skin tone | |
| 1411 | +1F9B8 1F3FB 200D 2640 ; minimally-qualified # ๐ฆธ๐ปโโ woman superhero: light skin tone | |
| 1412 | +1F9B8 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ฆธ๐ผโโ๏ธ woman superhero: medium-light skin tone | |
| 1413 | +1F9B8 1F3FC 200D 2640 ; minimally-qualified # ๐ฆธ๐ผโโ woman superhero: medium-light skin tone | |
| 1414 | +1F9B8 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ฆธ๐ฝโโ๏ธ woman superhero: medium skin tone | |
| 1415 | +1F9B8 1F3FD 200D 2640 ; minimally-qualified # ๐ฆธ๐ฝโโ woman superhero: medium skin tone | |
| 1416 | +1F9B8 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ฆธ๐พโโ๏ธ woman superhero: medium-dark skin tone | |
| 1417 | +1F9B8 1F3FE 200D 2640 ; minimally-qualified # ๐ฆธ๐พโโ woman superhero: medium-dark skin tone | |
| 1418 | +1F9B8 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ฆธ๐ฟโโ๏ธ woman superhero: dark skin tone | |
| 1419 | +1F9B8 1F3FF 200D 2640 ; minimally-qualified # ๐ฆธ๐ฟโโ woman superhero: dark skin tone | |
| 1420 | +1F9B9 ; fully-qualified # ๐ฆน supervillain | |
| 1421 | +1F9B9 1F3FB ; fully-qualified # ๐ฆน๐ป supervillain: light skin tone | |
| 1422 | +1F9B9 1F3FC ; fully-qualified # ๐ฆน๐ผ supervillain: medium-light skin tone | |
| 1423 | +1F9B9 1F3FD ; fully-qualified # ๐ฆน๐ฝ supervillain: medium skin tone | |
| 1424 | +1F9B9 1F3FE ; fully-qualified # ๐ฆน๐พ supervillain: medium-dark skin tone | |
| 1425 | +1F9B9 1F3FF ; fully-qualified # ๐ฆน๐ฟ supervillain: dark skin tone | |
| 1426 | +1F9B9 200D 2642 FE0F ; fully-qualified # ๐ฆนโโ๏ธ man supervillain | |
| 1427 | +1F9B9 200D 2642 ; minimally-qualified # ๐ฆนโโ man supervillain | |
| 1428 | +1F9B9 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ฆน๐ปโโ๏ธ man supervillain: light skin tone | |
| 1429 | +1F9B9 1F3FB 200D 2642 ; minimally-qualified # ๐ฆน๐ปโโ man supervillain: light skin tone | |
| 1430 | +1F9B9 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ฆน๐ผโโ๏ธ man supervillain: medium-light skin tone | |
| 1431 | +1F9B9 1F3FC 200D 2642 ; minimally-qualified # ๐ฆน๐ผโโ man supervillain: medium-light skin tone | |
| 1432 | +1F9B9 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ฆน๐ฝโโ๏ธ man supervillain: medium skin tone | |
| 1433 | +1F9B9 1F3FD 200D 2642 ; minimally-qualified # ๐ฆน๐ฝโโ man supervillain: medium skin tone | |
| 1434 | +1F9B9 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ฆน๐พโโ๏ธ man supervillain: medium-dark skin tone | |
| 1435 | +1F9B9 1F3FE 200D 2642 ; minimally-qualified # ๐ฆน๐พโโ man supervillain: medium-dark skin tone | |
| 1436 | +1F9B9 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ฆน๐ฟโโ๏ธ man supervillain: dark skin tone | |
| 1437 | +1F9B9 1F3FF 200D 2642 ; minimally-qualified # ๐ฆน๐ฟโโ man supervillain: dark skin tone | |
| 1438 | +1F9B9 200D 2640 FE0F ; fully-qualified # ๐ฆนโโ๏ธ woman supervillain | |
| 1439 | +1F9B9 200D 2640 ; minimally-qualified # ๐ฆนโโ woman supervillain | |
| 1440 | +1F9B9 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ฆน๐ปโโ๏ธ woman supervillain: light skin tone | |
| 1441 | +1F9B9 1F3FB 200D 2640 ; minimally-qualified # ๐ฆน๐ปโโ woman supervillain: light skin tone | |
| 1442 | +1F9B9 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ฆน๐ผโโ๏ธ woman supervillain: medium-light skin tone | |
| 1443 | +1F9B9 1F3FC 200D 2640 ; minimally-qualified # ๐ฆน๐ผโโ woman supervillain: medium-light skin tone | |
| 1444 | +1F9B9 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ฆน๐ฝโโ๏ธ woman supervillain: medium skin tone | |
| 1445 | +1F9B9 1F3FD 200D 2640 ; minimally-qualified # ๐ฆน๐ฝโโ woman supervillain: medium skin tone | |
| 1446 | +1F9B9 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ฆน๐พโโ๏ธ woman supervillain: medium-dark skin tone | |
| 1447 | +1F9B9 1F3FE 200D 2640 ; minimally-qualified # ๐ฆน๐พโโ woman supervillain: medium-dark skin tone | |
| 1448 | +1F9B9 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ฆน๐ฟโโ๏ธ woman supervillain: dark skin tone | |
| 1449 | +1F9B9 1F3FF 200D 2640 ; minimally-qualified # ๐ฆน๐ฟโโ woman supervillain: dark skin tone | |
| 1450 | +1F9D9 ; fully-qualified # ๐ง mage | |
| 1451 | +1F9D9 1F3FB ; fully-qualified # ๐ง๐ป mage: light skin tone | |
| 1452 | +1F9D9 1F3FC ; fully-qualified # ๐ง๐ผ mage: medium-light skin tone | |
| 1453 | +1F9D9 1F3FD ; fully-qualified # ๐ง๐ฝ mage: medium skin tone | |
| 1454 | +1F9D9 1F3FE ; fully-qualified # ๐ง๐พ mage: medium-dark skin tone | |
| 1455 | +1F9D9 1F3FF ; fully-qualified # ๐ง๐ฟ mage: dark skin tone | |
| 1456 | +1F9D9 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ man mage | |
| 1457 | +1F9D9 200D 2642 ; minimally-qualified # ๐งโโ man mage | |
| 1458 | +1F9D9 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ man mage: light skin tone | |
| 1459 | +1F9D9 1F3FB 200D 2642 ; minimally-qualified # ๐ง๐ปโโ man mage: light skin tone | |
| 1460 | +1F9D9 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ man mage: medium-light skin tone | |
| 1461 | +1F9D9 1F3FC 200D 2642 ; minimally-qualified # ๐ง๐ผโโ man mage: medium-light skin tone | |
| 1462 | +1F9D9 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ man mage: medium skin tone | |
| 1463 | +1F9D9 1F3FD 200D 2642 ; minimally-qualified # ๐ง๐ฝโโ man mage: medium skin tone | |
| 1464 | +1F9D9 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ man mage: medium-dark skin tone | |
| 1465 | +1F9D9 1F3FE 200D 2642 ; minimally-qualified # ๐ง๐พโโ man mage: medium-dark skin tone | |
| 1466 | +1F9D9 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ man mage: dark skin tone | |
| 1467 | +1F9D9 1F3FF 200D 2642 ; minimally-qualified # ๐ง๐ฟโโ man mage: dark skin tone | |
| 1468 | +1F9D9 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ woman mage | |
| 1469 | +1F9D9 200D 2640 ; minimally-qualified # ๐งโโ woman mage | |
| 1470 | +1F9D9 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ woman mage: light skin tone | |
| 1471 | +1F9D9 1F3FB 200D 2640 ; minimally-qualified # ๐ง๐ปโโ woman mage: light skin tone | |
| 1472 | +1F9D9 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ woman mage: medium-light skin tone | |
| 1473 | +1F9D9 1F3FC 200D 2640 ; minimally-qualified # ๐ง๐ผโโ woman mage: medium-light skin tone | |
| 1474 | +1F9D9 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ woman mage: medium skin tone | |
| 1475 | +1F9D9 1F3FD 200D 2640 ; minimally-qualified # ๐ง๐ฝโโ woman mage: medium skin tone | |
| 1476 | +1F9D9 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ woman mage: medium-dark skin tone | |
| 1477 | +1F9D9 1F3FE 200D 2640 ; minimally-qualified # ๐ง๐พโโ woman mage: medium-dark skin tone | |
| 1478 | +1F9D9 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ woman mage: dark skin tone | |
| 1479 | +1F9D9 1F3FF 200D 2640 ; minimally-qualified # ๐ง๐ฟโโ woman mage: dark skin tone | |
| 1480 | +1F9DA ; fully-qualified # ๐ง fairy | |
| 1481 | +1F9DA 1F3FB ; fully-qualified # ๐ง๐ป fairy: light skin tone | |
| 1482 | +1F9DA 1F3FC ; fully-qualified # ๐ง๐ผ fairy: medium-light skin tone | |
| 1483 | +1F9DA 1F3FD ; fully-qualified # ๐ง๐ฝ fairy: medium skin tone | |
| 1484 | +1F9DA 1F3FE ; fully-qualified # ๐ง๐พ fairy: medium-dark skin tone | |
| 1485 | +1F9DA 1F3FF ; fully-qualified # ๐ง๐ฟ fairy: dark skin tone | |
| 1486 | +1F9DA 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ man fairy | |
| 1487 | +1F9DA 200D 2642 ; minimally-qualified # ๐งโโ man fairy | |
| 1488 | +1F9DA 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ man fairy: light skin tone | |
| 1489 | +1F9DA 1F3FB 200D 2642 ; minimally-qualified # ๐ง๐ปโโ man fairy: light skin tone | |
| 1490 | +1F9DA 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ man fairy: medium-light skin tone | |
| 1491 | +1F9DA 1F3FC 200D 2642 ; minimally-qualified # ๐ง๐ผโโ man fairy: medium-light skin tone | |
| 1492 | +1F9DA 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ man fairy: medium skin tone | |
| 1493 | +1F9DA 1F3FD 200D 2642 ; minimally-qualified # ๐ง๐ฝโโ man fairy: medium skin tone | |
| 1494 | +1F9DA 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ man fairy: medium-dark skin tone | |
| 1495 | +1F9DA 1F3FE 200D 2642 ; minimally-qualified # ๐ง๐พโโ man fairy: medium-dark skin tone | |
| 1496 | +1F9DA 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ man fairy: dark skin tone | |
| 1497 | +1F9DA 1F3FF 200D 2642 ; minimally-qualified # ๐ง๐ฟโโ man fairy: dark skin tone | |
| 1498 | +1F9DA 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ woman fairy | |
| 1499 | +1F9DA 200D 2640 ; minimally-qualified # ๐งโโ woman fairy | |
| 1500 | +1F9DA 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ woman fairy: light skin tone | |
| 1501 | +1F9DA 1F3FB 200D 2640 ; minimally-qualified # ๐ง๐ปโโ woman fairy: light skin tone | |
| 1502 | +1F9DA 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ woman fairy: medium-light skin tone | |
| 1503 | +1F9DA 1F3FC 200D 2640 ; minimally-qualified # ๐ง๐ผโโ woman fairy: medium-light skin tone | |
| 1504 | +1F9DA 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ woman fairy: medium skin tone | |
| 1505 | +1F9DA 1F3FD 200D 2640 ; minimally-qualified # ๐ง๐ฝโโ woman fairy: medium skin tone | |
| 1506 | +1F9DA 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ woman fairy: medium-dark skin tone | |
| 1507 | +1F9DA 1F3FE 200D 2640 ; minimally-qualified # ๐ง๐พโโ woman fairy: medium-dark skin tone | |
| 1508 | +1F9DA 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ woman fairy: dark skin tone | |
| 1509 | +1F9DA 1F3FF 200D 2640 ; minimally-qualified # ๐ง๐ฟโโ woman fairy: dark skin tone | |
| 1510 | +1F9DB ; fully-qualified # ๐ง vampire | |
| 1511 | +1F9DB 1F3FB ; fully-qualified # ๐ง๐ป vampire: light skin tone | |
| 1512 | +1F9DB 1F3FC ; fully-qualified # ๐ง๐ผ vampire: medium-light skin tone | |
| 1513 | +1F9DB 1F3FD ; fully-qualified # ๐ง๐ฝ vampire: medium skin tone | |
| 1514 | +1F9DB 1F3FE ; fully-qualified # ๐ง๐พ vampire: medium-dark skin tone | |
| 1515 | +1F9DB 1F3FF ; fully-qualified # ๐ง๐ฟ vampire: dark skin tone | |
| 1516 | +1F9DB 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ man vampire | |
| 1517 | +1F9DB 200D 2642 ; minimally-qualified # ๐งโโ man vampire | |
| 1518 | +1F9DB 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ man vampire: light skin tone | |
| 1519 | +1F9DB 1F3FB 200D 2642 ; minimally-qualified # ๐ง๐ปโโ man vampire: light skin tone | |
| 1520 | +1F9DB 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ man vampire: medium-light skin tone | |
| 1521 | +1F9DB 1F3FC 200D 2642 ; minimally-qualified # ๐ง๐ผโโ man vampire: medium-light skin tone | |
| 1522 | +1F9DB 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ man vampire: medium skin tone | |
| 1523 | +1F9DB 1F3FD 200D 2642 ; minimally-qualified # ๐ง๐ฝโโ man vampire: medium skin tone | |
| 1524 | +1F9DB 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ man vampire: medium-dark skin tone | |
| 1525 | +1F9DB 1F3FE 200D 2642 ; minimally-qualified # ๐ง๐พโโ man vampire: medium-dark skin tone | |
| 1526 | +1F9DB 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ man vampire: dark skin tone | |
| 1527 | +1F9DB 1F3FF 200D 2642 ; minimally-qualified # ๐ง๐ฟโโ man vampire: dark skin tone | |
| 1528 | +1F9DB 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ woman vampire | |
| 1529 | +1F9DB 200D 2640 ; minimally-qualified # ๐งโโ woman vampire | |
| 1530 | +1F9DB 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ woman vampire: light skin tone | |
| 1531 | +1F9DB 1F3FB 200D 2640 ; minimally-qualified # ๐ง๐ปโโ woman vampire: light skin tone | |
| 1532 | +1F9DB 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ woman vampire: medium-light skin tone | |
| 1533 | +1F9DB 1F3FC 200D 2640 ; minimally-qualified # ๐ง๐ผโโ woman vampire: medium-light skin tone | |
| 1534 | +1F9DB 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ woman vampire: medium skin tone | |
| 1535 | +1F9DB 1F3FD 200D 2640 ; minimally-qualified # ๐ง๐ฝโโ woman vampire: medium skin tone | |
| 1536 | +1F9DB 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ woman vampire: medium-dark skin tone | |
| 1537 | +1F9DB 1F3FE 200D 2640 ; minimally-qualified # ๐ง๐พโโ woman vampire: medium-dark skin tone | |
| 1538 | +1F9DB 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ woman vampire: dark skin tone | |
| 1539 | +1F9DB 1F3FF 200D 2640 ; minimally-qualified # ๐ง๐ฟโโ woman vampire: dark skin tone | |
| 1540 | +1F9DC ; fully-qualified # ๐ง merperson | |
| 1541 | +1F9DC 1F3FB ; fully-qualified # ๐ง๐ป merperson: light skin tone | |
| 1542 | +1F9DC 1F3FC ; fully-qualified # ๐ง๐ผ merperson: medium-light skin tone | |
| 1543 | +1F9DC 1F3FD ; fully-qualified # ๐ง๐ฝ merperson: medium skin tone | |
| 1544 | +1F9DC 1F3FE ; fully-qualified # ๐ง๐พ merperson: medium-dark skin tone | |
| 1545 | +1F9DC 1F3FF ; fully-qualified # ๐ง๐ฟ merperson: dark skin tone | |
| 1546 | +1F9DC 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ merman | |
| 1547 | +1F9DC 200D 2642 ; minimally-qualified # ๐งโโ merman | |
| 1548 | +1F9DC 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ merman: light skin tone | |
| 1549 | +1F9DC 1F3FB 200D 2642 ; minimally-qualified # ๐ง๐ปโโ merman: light skin tone | |
| 1550 | +1F9DC 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ merman: medium-light skin tone | |
| 1551 | +1F9DC 1F3FC 200D 2642 ; minimally-qualified # ๐ง๐ผโโ merman: medium-light skin tone | |
| 1552 | +1F9DC 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ merman: medium skin tone | |
| 1553 | +1F9DC 1F3FD 200D 2642 ; minimally-qualified # ๐ง๐ฝโโ merman: medium skin tone | |
| 1554 | +1F9DC 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ merman: medium-dark skin tone | |
| 1555 | +1F9DC 1F3FE 200D 2642 ; minimally-qualified # ๐ง๐พโโ merman: medium-dark skin tone | |
| 1556 | +1F9DC 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ merman: dark skin tone | |
| 1557 | +1F9DC 1F3FF 200D 2642 ; minimally-qualified # ๐ง๐ฟโโ merman: dark skin tone | |
| 1558 | +1F9DC 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ mermaid | |
| 1559 | +1F9DC 200D 2640 ; minimally-qualified # ๐งโโ mermaid | |
| 1560 | +1F9DC 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ mermaid: light skin tone | |
| 1561 | +1F9DC 1F3FB 200D 2640 ; minimally-qualified # ๐ง๐ปโโ mermaid: light skin tone | |
| 1562 | +1F9DC 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ mermaid: medium-light skin tone | |
| 1563 | +1F9DC 1F3FC 200D 2640 ; minimally-qualified # ๐ง๐ผโโ mermaid: medium-light skin tone | |
| 1564 | +1F9DC 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ mermaid: medium skin tone | |
| 1565 | +1F9DC 1F3FD 200D 2640 ; minimally-qualified # ๐ง๐ฝโโ mermaid: medium skin tone | |
| 1566 | +1F9DC 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ mermaid: medium-dark skin tone | |
| 1567 | +1F9DC 1F3FE 200D 2640 ; minimally-qualified # ๐ง๐พโโ mermaid: medium-dark skin tone | |
| 1568 | +1F9DC 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ mermaid: dark skin tone | |
| 1569 | +1F9DC 1F3FF 200D 2640 ; minimally-qualified # ๐ง๐ฟโโ mermaid: dark skin tone | |
| 1570 | +1F9DD ; fully-qualified # ๐ง elf | |
| 1571 | +1F9DD 1F3FB ; fully-qualified # ๐ง๐ป elf: light skin tone | |
| 1572 | +1F9DD 1F3FC ; fully-qualified # ๐ง๐ผ elf: medium-light skin tone | |
| 1573 | +1F9DD 1F3FD ; fully-qualified # ๐ง๐ฝ elf: medium skin tone | |
| 1574 | +1F9DD 1F3FE ; fully-qualified # ๐ง๐พ elf: medium-dark skin tone | |
| 1575 | +1F9DD 1F3FF ; fully-qualified # ๐ง๐ฟ elf: dark skin tone | |
| 1576 | +1F9DD 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ man elf | |
| 1577 | +1F9DD 200D 2642 ; minimally-qualified # ๐งโโ man elf | |
| 1578 | +1F9DD 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ man elf: light skin tone | |
| 1579 | +1F9DD 1F3FB 200D 2642 ; minimally-qualified # ๐ง๐ปโโ man elf: light skin tone | |
| 1580 | +1F9DD 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ man elf: medium-light skin tone | |
| 1581 | +1F9DD 1F3FC 200D 2642 ; minimally-qualified # ๐ง๐ผโโ man elf: medium-light skin tone | |
| 1582 | +1F9DD 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ man elf: medium skin tone | |
| 1583 | +1F9DD 1F3FD 200D 2642 ; minimally-qualified # ๐ง๐ฝโโ man elf: medium skin tone | |
| 1584 | +1F9DD 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ man elf: medium-dark skin tone | |
| 1585 | +1F9DD 1F3FE 200D 2642 ; minimally-qualified # ๐ง๐พโโ man elf: medium-dark skin tone | |
| 1586 | +1F9DD 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ man elf: dark skin tone | |
| 1587 | +1F9DD 1F3FF 200D 2642 ; minimally-qualified # ๐ง๐ฟโโ man elf: dark skin tone | |
| 1588 | +1F9DD 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ woman elf | |
| 1589 | +1F9DD 200D 2640 ; minimally-qualified # ๐งโโ woman elf | |
| 1590 | +1F9DD 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ woman elf: light skin tone | |
| 1591 | +1F9DD 1F3FB 200D 2640 ; minimally-qualified # ๐ง๐ปโโ woman elf: light skin tone | |
| 1592 | +1F9DD 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ woman elf: medium-light skin tone | |
| 1593 | +1F9DD 1F3FC 200D 2640 ; minimally-qualified # ๐ง๐ผโโ woman elf: medium-light skin tone | |
| 1594 | +1F9DD 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ woman elf: medium skin tone | |
| 1595 | +1F9DD 1F3FD 200D 2640 ; minimally-qualified # ๐ง๐ฝโโ woman elf: medium skin tone | |
| 1596 | +1F9DD 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ woman elf: medium-dark skin tone | |
| 1597 | +1F9DD 1F3FE 200D 2640 ; minimally-qualified # ๐ง๐พโโ woman elf: medium-dark skin tone | |
| 1598 | +1F9DD 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ woman elf: dark skin tone | |
| 1599 | +1F9DD 1F3FF 200D 2640 ; minimally-qualified # ๐ง๐ฟโโ woman elf: dark skin tone | |
| 1600 | +1F9DE ; fully-qualified # ๐ง genie | |
| 1601 | +1F9DE 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ man genie | |
| 1602 | +1F9DE 200D 2642 ; minimally-qualified # ๐งโโ man genie | |
| 1603 | +1F9DE 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ woman genie | |
| 1604 | +1F9DE 200D 2640 ; minimally-qualified # ๐งโโ woman genie | |
| 1605 | +1F9DF ; fully-qualified # ๐ง zombie | |
| 1606 | +1F9DF 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ man zombie | |
| 1607 | +1F9DF 200D 2642 ; minimally-qualified # ๐งโโ man zombie | |
| 1608 | +1F9DF 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ woman zombie | |
| 1609 | +1F9DF 200D 2640 ; minimally-qualified # ๐งโโ woman zombie | |
| 1610 | + | |
| 1611 | +# subgroup: person-activity | |
| 1612 | +1F486 ; fully-qualified # ๐ person getting massage | |
| 1613 | +1F486 1F3FB ; fully-qualified # ๐๐ป person getting massage: light skin tone | |
| 1614 | +1F486 1F3FC ; fully-qualified # ๐๐ผ person getting massage: medium-light skin tone | |
| 1615 | +1F486 1F3FD ; fully-qualified # ๐๐ฝ person getting massage: medium skin tone | |
| 1616 | +1F486 1F3FE ; fully-qualified # ๐๐พ person getting massage: medium-dark skin tone | |
| 1617 | +1F486 1F3FF ; fully-qualified # ๐๐ฟ person getting massage: dark skin tone | |
| 1618 | +1F486 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man getting massage | |
| 1619 | +1F486 200D 2642 ; minimally-qualified # ๐โโ man getting massage | |
| 1620 | +1F486 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man getting massage: light skin tone | |
| 1621 | +1F486 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man getting massage: light skin tone | |
| 1622 | +1F486 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man getting massage: medium-light skin tone | |
| 1623 | +1F486 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man getting massage: medium-light skin tone | |
| 1624 | +1F486 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man getting massage: medium skin tone | |
| 1625 | +1F486 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man getting massage: medium skin tone | |
| 1626 | +1F486 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man getting massage: medium-dark skin tone | |
| 1627 | +1F486 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man getting massage: medium-dark skin tone | |
| 1628 | +1F486 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man getting massage: dark skin tone | |
| 1629 | +1F486 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man getting massage: dark skin tone | |
| 1630 | +1F486 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman getting massage | |
| 1631 | +1F486 200D 2640 ; minimally-qualified # ๐โโ woman getting massage | |
| 1632 | +1F486 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman getting massage: light skin tone | |
| 1633 | +1F486 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman getting massage: light skin tone | |
| 1634 | +1F486 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman getting massage: medium-light skin tone | |
| 1635 | +1F486 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman getting massage: medium-light skin tone | |
| 1636 | +1F486 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman getting massage: medium skin tone | |
| 1637 | +1F486 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman getting massage: medium skin tone | |
| 1638 | +1F486 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman getting massage: medium-dark skin tone | |
| 1639 | +1F486 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman getting massage: medium-dark skin tone | |
| 1640 | +1F486 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman getting massage: dark skin tone | |
| 1641 | +1F486 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman getting massage: dark skin tone | |
| 1642 | +1F487 ; fully-qualified # ๐ person getting haircut | |
| 1643 | +1F487 1F3FB ; fully-qualified # ๐๐ป person getting haircut: light skin tone | |
| 1644 | +1F487 1F3FC ; fully-qualified # ๐๐ผ person getting haircut: medium-light skin tone | |
| 1645 | +1F487 1F3FD ; fully-qualified # ๐๐ฝ person getting haircut: medium skin tone | |
| 1646 | +1F487 1F3FE ; fully-qualified # ๐๐พ person getting haircut: medium-dark skin tone | |
| 1647 | +1F487 1F3FF ; fully-qualified # ๐๐ฟ person getting haircut: dark skin tone | |
| 1648 | +1F487 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man getting haircut | |
| 1649 | +1F487 200D 2642 ; minimally-qualified # ๐โโ man getting haircut | |
| 1650 | +1F487 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man getting haircut: light skin tone | |
| 1651 | +1F487 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man getting haircut: light skin tone | |
| 1652 | +1F487 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man getting haircut: medium-light skin tone | |
| 1653 | +1F487 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man getting haircut: medium-light skin tone | |
| 1654 | +1F487 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man getting haircut: medium skin tone | |
| 1655 | +1F487 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man getting haircut: medium skin tone | |
| 1656 | +1F487 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man getting haircut: medium-dark skin tone | |
| 1657 | +1F487 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man getting haircut: medium-dark skin tone | |
| 1658 | +1F487 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man getting haircut: dark skin tone | |
| 1659 | +1F487 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man getting haircut: dark skin tone | |
| 1660 | +1F487 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman getting haircut | |
| 1661 | +1F487 200D 2640 ; minimally-qualified # ๐โโ woman getting haircut | |
| 1662 | +1F487 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman getting haircut: light skin tone | |
| 1663 | +1F487 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman getting haircut: light skin tone | |
| 1664 | +1F487 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman getting haircut: medium-light skin tone | |
| 1665 | +1F487 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman getting haircut: medium-light skin tone | |
| 1666 | +1F487 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman getting haircut: medium skin tone | |
| 1667 | +1F487 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman getting haircut: medium skin tone | |
| 1668 | +1F487 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman getting haircut: medium-dark skin tone | |
| 1669 | +1F487 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman getting haircut: medium-dark skin tone | |
| 1670 | +1F487 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman getting haircut: dark skin tone | |
| 1671 | +1F487 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman getting haircut: dark skin tone | |
| 1672 | +1F6B6 ; fully-qualified # ๐ถ person walking | |
| 1673 | +1F6B6 1F3FB ; fully-qualified # ๐ถ๐ป person walking: light skin tone | |
| 1674 | +1F6B6 1F3FC ; fully-qualified # ๐ถ๐ผ person walking: medium-light skin tone | |
| 1675 | +1F6B6 1F3FD ; fully-qualified # ๐ถ๐ฝ person walking: medium skin tone | |
| 1676 | +1F6B6 1F3FE ; fully-qualified # ๐ถ๐พ person walking: medium-dark skin tone | |
| 1677 | +1F6B6 1F3FF ; fully-qualified # ๐ถ๐ฟ person walking: dark skin tone | |
| 1678 | +1F6B6 200D 2642 FE0F ; fully-qualified # ๐ถโโ๏ธ man walking | |
| 1679 | +1F6B6 200D 2642 ; minimally-qualified # ๐ถโโ man walking | |
| 1680 | +1F6B6 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ถ๐ปโโ๏ธ man walking: light skin tone | |
| 1681 | +1F6B6 1F3FB 200D 2642 ; minimally-qualified # ๐ถ๐ปโโ man walking: light skin tone | |
| 1682 | +1F6B6 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ถ๐ผโโ๏ธ man walking: medium-light skin tone | |
| 1683 | +1F6B6 1F3FC 200D 2642 ; minimally-qualified # ๐ถ๐ผโโ man walking: medium-light skin tone | |
| 1684 | +1F6B6 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ถ๐ฝโโ๏ธ man walking: medium skin tone | |
| 1685 | +1F6B6 1F3FD 200D 2642 ; minimally-qualified # ๐ถ๐ฝโโ man walking: medium skin tone | |
| 1686 | +1F6B6 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ถ๐พโโ๏ธ man walking: medium-dark skin tone | |
| 1687 | +1F6B6 1F3FE 200D 2642 ; minimally-qualified # ๐ถ๐พโโ man walking: medium-dark skin tone | |
| 1688 | +1F6B6 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ถ๐ฟโโ๏ธ man walking: dark skin tone | |
| 1689 | +1F6B6 1F3FF 200D 2642 ; minimally-qualified # ๐ถ๐ฟโโ man walking: dark skin tone | |
| 1690 | +1F6B6 200D 2640 FE0F ; fully-qualified # ๐ถโโ๏ธ woman walking | |
| 1691 | +1F6B6 200D 2640 ; minimally-qualified # ๐ถโโ woman walking | |
| 1692 | +1F6B6 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ถ๐ปโโ๏ธ woman walking: light skin tone | |
| 1693 | +1F6B6 1F3FB 200D 2640 ; minimally-qualified # ๐ถ๐ปโโ woman walking: light skin tone | |
| 1694 | +1F6B6 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ถ๐ผโโ๏ธ woman walking: medium-light skin tone | |
| 1695 | +1F6B6 1F3FC 200D 2640 ; minimally-qualified # ๐ถ๐ผโโ woman walking: medium-light skin tone | |
| 1696 | +1F6B6 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ถ๐ฝโโ๏ธ woman walking: medium skin tone | |
| 1697 | +1F6B6 1F3FD 200D 2640 ; minimally-qualified # ๐ถ๐ฝโโ woman walking: medium skin tone | |
| 1698 | +1F6B6 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ถ๐พโโ๏ธ woman walking: medium-dark skin tone | |
| 1699 | +1F6B6 1F3FE 200D 2640 ; minimally-qualified # ๐ถ๐พโโ woman walking: medium-dark skin tone | |
| 1700 | +1F6B6 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ถ๐ฟโโ๏ธ woman walking: dark skin tone | |
| 1701 | +1F6B6 1F3FF 200D 2640 ; minimally-qualified # ๐ถ๐ฟโโ woman walking: dark skin tone | |
| 1702 | +1F9CD ; fully-qualified # ๐ง person standing | |
| 1703 | +1F9CD 1F3FB ; fully-qualified # ๐ง๐ป person standing: light skin tone | |
| 1704 | +1F9CD 1F3FC ; fully-qualified # ๐ง๐ผ person standing: medium-light skin tone | |
| 1705 | +1F9CD 1F3FD ; fully-qualified # ๐ง๐ฝ person standing: medium skin tone | |
| 1706 | +1F9CD 1F3FE ; fully-qualified # ๐ง๐พ person standing: medium-dark skin tone | |
| 1707 | +1F9CD 1F3FF ; fully-qualified # ๐ง๐ฟ person standing: dark skin tone | |
| 1708 | +1F9CD 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ man standing | |
| 1709 | +1F9CD 200D 2642 ; minimally-qualified # ๐งโโ man standing | |
| 1710 | +1F9CD 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ man standing: light skin tone | |
| 1711 | +1F9CD 1F3FB 200D 2642 ; minimally-qualified # ๐ง๐ปโโ man standing: light skin tone | |
| 1712 | +1F9CD 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ man standing: medium-light skin tone | |
| 1713 | +1F9CD 1F3FC 200D 2642 ; minimally-qualified # ๐ง๐ผโโ man standing: medium-light skin tone | |
| 1714 | +1F9CD 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ man standing: medium skin tone | |
| 1715 | +1F9CD 1F3FD 200D 2642 ; minimally-qualified # ๐ง๐ฝโโ man standing: medium skin tone | |
| 1716 | +1F9CD 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ man standing: medium-dark skin tone | |
| 1717 | +1F9CD 1F3FE 200D 2642 ; minimally-qualified # ๐ง๐พโโ man standing: medium-dark skin tone | |
| 1718 | +1F9CD 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ man standing: dark skin tone | |
| 1719 | +1F9CD 1F3FF 200D 2642 ; minimally-qualified # ๐ง๐ฟโโ man standing: dark skin tone | |
| 1720 | +1F9CD 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ woman standing | |
| 1721 | +1F9CD 200D 2640 ; minimally-qualified # ๐งโโ woman standing | |
| 1722 | +1F9CD 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ woman standing: light skin tone | |
| 1723 | +1F9CD 1F3FB 200D 2640 ; minimally-qualified # ๐ง๐ปโโ woman standing: light skin tone | |
| 1724 | +1F9CD 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ woman standing: medium-light skin tone | |
| 1725 | +1F9CD 1F3FC 200D 2640 ; minimally-qualified # ๐ง๐ผโโ woman standing: medium-light skin tone | |
| 1726 | +1F9CD 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ woman standing: medium skin tone | |
| 1727 | +1F9CD 1F3FD 200D 2640 ; minimally-qualified # ๐ง๐ฝโโ woman standing: medium skin tone | |
| 1728 | +1F9CD 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ woman standing: medium-dark skin tone | |
| 1729 | +1F9CD 1F3FE 200D 2640 ; minimally-qualified # ๐ง๐พโโ woman standing: medium-dark skin tone | |
| 1730 | +1F9CD 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ woman standing: dark skin tone | |
| 1731 | +1F9CD 1F3FF 200D 2640 ; minimally-qualified # ๐ง๐ฟโโ woman standing: dark skin tone | |
| 1732 | +1F9CE ; fully-qualified # ๐ง person kneeling | |
| 1733 | +1F9CE 1F3FB ; fully-qualified # ๐ง๐ป person kneeling: light skin tone | |
| 1734 | +1F9CE 1F3FC ; fully-qualified # ๐ง๐ผ person kneeling: medium-light skin tone | |
| 1735 | +1F9CE 1F3FD ; fully-qualified # ๐ง๐ฝ person kneeling: medium skin tone | |
| 1736 | +1F9CE 1F3FE ; fully-qualified # ๐ง๐พ person kneeling: medium-dark skin tone | |
| 1737 | +1F9CE 1F3FF ; fully-qualified # ๐ง๐ฟ person kneeling: dark skin tone | |
| 1738 | +1F9CE 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ man kneeling | |
| 1739 | +1F9CE 200D 2642 ; minimally-qualified # ๐งโโ man kneeling | |
| 1740 | +1F9CE 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ man kneeling: light skin tone | |
| 1741 | +1F9CE 1F3FB 200D 2642 ; minimally-qualified # ๐ง๐ปโโ man kneeling: light skin tone | |
| 1742 | +1F9CE 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ man kneeling: medium-light skin tone | |
| 1743 | +1F9CE 1F3FC 200D 2642 ; minimally-qualified # ๐ง๐ผโโ man kneeling: medium-light skin tone | |
| 1744 | +1F9CE 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ man kneeling: medium skin tone | |
| 1745 | +1F9CE 1F3FD 200D 2642 ; minimally-qualified # ๐ง๐ฝโโ man kneeling: medium skin tone | |
| 1746 | +1F9CE 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ man kneeling: medium-dark skin tone | |
| 1747 | +1F9CE 1F3FE 200D 2642 ; minimally-qualified # ๐ง๐พโโ man kneeling: medium-dark skin tone | |
| 1748 | +1F9CE 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ man kneeling: dark skin tone | |
| 1749 | +1F9CE 1F3FF 200D 2642 ; minimally-qualified # ๐ง๐ฟโโ man kneeling: dark skin tone | |
| 1750 | +1F9CE 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ woman kneeling | |
| 1751 | +1F9CE 200D 2640 ; minimally-qualified # ๐งโโ woman kneeling | |
| 1752 | +1F9CE 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ woman kneeling: light skin tone | |
| 1753 | +1F9CE 1F3FB 200D 2640 ; minimally-qualified # ๐ง๐ปโโ woman kneeling: light skin tone | |
| 1754 | +1F9CE 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ woman kneeling: medium-light skin tone | |
| 1755 | +1F9CE 1F3FC 200D 2640 ; minimally-qualified # ๐ง๐ผโโ woman kneeling: medium-light skin tone | |
| 1756 | +1F9CE 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ woman kneeling: medium skin tone | |
| 1757 | +1F9CE 1F3FD 200D 2640 ; minimally-qualified # ๐ง๐ฝโโ woman kneeling: medium skin tone | |
| 1758 | +1F9CE 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ woman kneeling: medium-dark skin tone | |
| 1759 | +1F9CE 1F3FE 200D 2640 ; minimally-qualified # ๐ง๐พโโ woman kneeling: medium-dark skin tone | |
| 1760 | +1F9CE 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ woman kneeling: dark skin tone | |
| 1761 | +1F9CE 1F3FF 200D 2640 ; minimally-qualified # ๐ง๐ฟโโ woman kneeling: dark skin tone | |
| 1762 | +1F468 200D 1F9AF ; fully-qualified # ๐จโ๐ฆฏ man with probing cane | |
| 1763 | +1F468 1F3FB 200D 1F9AF ; fully-qualified # ๐จ๐ปโ๐ฆฏ man with probing cane: light skin tone | |
| 1764 | +1F468 1F3FC 200D 1F9AF ; fully-qualified # ๐จ๐ผโ๐ฆฏ man with probing cane: medium-light skin tone | |
| 1765 | +1F468 1F3FD 200D 1F9AF ; fully-qualified # ๐จ๐ฝโ๐ฆฏ man with probing cane: medium skin tone | |
| 1766 | +1F468 1F3FE 200D 1F9AF ; fully-qualified # ๐จ๐พโ๐ฆฏ man with probing cane: medium-dark skin tone | |
| 1767 | +1F468 1F3FF 200D 1F9AF ; fully-qualified # ๐จ๐ฟโ๐ฆฏ man with probing cane: dark skin tone | |
| 1768 | +1F469 200D 1F9AF ; fully-qualified # ๐ฉโ๐ฆฏ woman with probing cane | |
| 1769 | +1F469 1F3FB 200D 1F9AF ; fully-qualified # ๐ฉ๐ปโ๐ฆฏ woman with probing cane: light skin tone | |
| 1770 | +1F469 1F3FC 200D 1F9AF ; fully-qualified # ๐ฉ๐ผโ๐ฆฏ woman with probing cane: medium-light skin tone | |
| 1771 | +1F469 1F3FD 200D 1F9AF ; fully-qualified # ๐ฉ๐ฝโ๐ฆฏ woman with probing cane: medium skin tone | |
| 1772 | +1F469 1F3FE 200D 1F9AF ; fully-qualified # ๐ฉ๐พโ๐ฆฏ woman with probing cane: medium-dark skin tone | |
| 1773 | +1F469 1F3FF 200D 1F9AF ; fully-qualified # ๐ฉ๐ฟโ๐ฆฏ woman with probing cane: dark skin tone | |
| 1774 | +1F468 200D 1F9BC ; fully-qualified # ๐จโ๐ฆผ man in motorized wheelchair | |
| 1775 | +1F468 1F3FB 200D 1F9BC ; fully-qualified # ๐จ๐ปโ๐ฆผ man in motorized wheelchair: light skin tone | |
| 1776 | +1F468 1F3FC 200D 1F9BC ; fully-qualified # ๐จ๐ผโ๐ฆผ man in motorized wheelchair: medium-light skin tone | |
| 1777 | +1F468 1F3FD 200D 1F9BC ; fully-qualified # ๐จ๐ฝโ๐ฆผ man in motorized wheelchair: medium skin tone | |
| 1778 | +1F468 1F3FE 200D 1F9BC ; fully-qualified # ๐จ๐พโ๐ฆผ man in motorized wheelchair: medium-dark skin tone | |
| 1779 | +1F468 1F3FF 200D 1F9BC ; fully-qualified # ๐จ๐ฟโ๐ฆผ man in motorized wheelchair: dark skin tone | |
| 1780 | +1F469 200D 1F9BC ; fully-qualified # ๐ฉโ๐ฆผ woman in motorized wheelchair | |
| 1781 | +1F469 1F3FB 200D 1F9BC ; fully-qualified # ๐ฉ๐ปโ๐ฆผ woman in motorized wheelchair: light skin tone | |
| 1782 | +1F469 1F3FC 200D 1F9BC ; fully-qualified # ๐ฉ๐ผโ๐ฆผ woman in motorized wheelchair: medium-light skin tone | |
| 1783 | +1F469 1F3FD 200D 1F9BC ; fully-qualified # ๐ฉ๐ฝโ๐ฆผ woman in motorized wheelchair: medium skin tone | |
| 1784 | +1F469 1F3FE 200D 1F9BC ; fully-qualified # ๐ฉ๐พโ๐ฆผ woman in motorized wheelchair: medium-dark skin tone | |
| 1785 | +1F469 1F3FF 200D 1F9BC ; fully-qualified # ๐ฉ๐ฟโ๐ฆผ woman in motorized wheelchair: dark skin tone | |
| 1786 | +1F468 200D 1F9BD ; fully-qualified # ๐จโ๐ฆฝ man in manual wheelchair | |
| 1787 | +1F468 1F3FB 200D 1F9BD ; fully-qualified # ๐จ๐ปโ๐ฆฝ man in manual wheelchair: light skin tone | |
| 1788 | +1F468 1F3FC 200D 1F9BD ; fully-qualified # ๐จ๐ผโ๐ฆฝ man in manual wheelchair: medium-light skin tone | |
| 1789 | +1F468 1F3FD 200D 1F9BD ; fully-qualified # ๐จ๐ฝโ๐ฆฝ man in manual wheelchair: medium skin tone | |
| 1790 | +1F468 1F3FE 200D 1F9BD ; fully-qualified # ๐จ๐พโ๐ฆฝ man in manual wheelchair: medium-dark skin tone | |
| 1791 | +1F468 1F3FF 200D 1F9BD ; fully-qualified # ๐จ๐ฟโ๐ฆฝ man in manual wheelchair: dark skin tone | |
| 1792 | +1F469 200D 1F9BD ; fully-qualified # ๐ฉโ๐ฆฝ woman in manual wheelchair | |
| 1793 | +1F469 1F3FB 200D 1F9BD ; fully-qualified # ๐ฉ๐ปโ๐ฆฝ woman in manual wheelchair: light skin tone | |
| 1794 | +1F469 1F3FC 200D 1F9BD ; fully-qualified # ๐ฉ๐ผโ๐ฆฝ woman in manual wheelchair: medium-light skin tone | |
| 1795 | +1F469 1F3FD 200D 1F9BD ; fully-qualified # ๐ฉ๐ฝโ๐ฆฝ woman in manual wheelchair: medium skin tone | |
| 1796 | +1F469 1F3FE 200D 1F9BD ; fully-qualified # ๐ฉ๐พโ๐ฆฝ woman in manual wheelchair: medium-dark skin tone | |
| 1797 | +1F469 1F3FF 200D 1F9BD ; fully-qualified # ๐ฉ๐ฟโ๐ฆฝ woman in manual wheelchair: dark skin tone | |
| 1798 | +1F3C3 ; fully-qualified # ๐ person running | |
| 1799 | +1F3C3 1F3FB ; fully-qualified # ๐๐ป person running: light skin tone | |
| 1800 | +1F3C3 1F3FC ; fully-qualified # ๐๐ผ person running: medium-light skin tone | |
| 1801 | +1F3C3 1F3FD ; fully-qualified # ๐๐ฝ person running: medium skin tone | |
| 1802 | +1F3C3 1F3FE ; fully-qualified # ๐๐พ person running: medium-dark skin tone | |
| 1803 | +1F3C3 1F3FF ; fully-qualified # ๐๐ฟ person running: dark skin tone | |
| 1804 | +1F3C3 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man running | |
| 1805 | +1F3C3 200D 2642 ; minimally-qualified # ๐โโ man running | |
| 1806 | +1F3C3 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man running: light skin tone | |
| 1807 | +1F3C3 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man running: light skin tone | |
| 1808 | +1F3C3 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man running: medium-light skin tone | |
| 1809 | +1F3C3 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man running: medium-light skin tone | |
| 1810 | +1F3C3 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man running: medium skin tone | |
| 1811 | +1F3C3 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man running: medium skin tone | |
| 1812 | +1F3C3 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man running: medium-dark skin tone | |
| 1813 | +1F3C3 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man running: medium-dark skin tone | |
| 1814 | +1F3C3 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man running: dark skin tone | |
| 1815 | +1F3C3 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man running: dark skin tone | |
| 1816 | +1F3C3 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman running | |
| 1817 | +1F3C3 200D 2640 ; minimally-qualified # ๐โโ woman running | |
| 1818 | +1F3C3 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman running: light skin tone | |
| 1819 | +1F3C3 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman running: light skin tone | |
| 1820 | +1F3C3 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman running: medium-light skin tone | |
| 1821 | +1F3C3 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman running: medium-light skin tone | |
| 1822 | +1F3C3 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman running: medium skin tone | |
| 1823 | +1F3C3 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman running: medium skin tone | |
| 1824 | +1F3C3 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman running: medium-dark skin tone | |
| 1825 | +1F3C3 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman running: medium-dark skin tone | |
| 1826 | +1F3C3 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman running: dark skin tone | |
| 1827 | +1F3C3 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman running: dark skin tone | |
| 1828 | +1F483 ; fully-qualified # ๐ woman dancing | |
| 1829 | +1F483 1F3FB ; fully-qualified # ๐๐ป woman dancing: light skin tone | |
| 1830 | +1F483 1F3FC ; fully-qualified # ๐๐ผ woman dancing: medium-light skin tone | |
| 1831 | +1F483 1F3FD ; fully-qualified # ๐๐ฝ woman dancing: medium skin tone | |
| 1832 | +1F483 1F3FE ; fully-qualified # ๐๐พ woman dancing: medium-dark skin tone | |
| 1833 | +1F483 1F3FF ; fully-qualified # ๐๐ฟ woman dancing: dark skin tone | |
| 1834 | +1F57A ; fully-qualified # ๐บ man dancing | |
| 1835 | +1F57A 1F3FB ; fully-qualified # ๐บ๐ป man dancing: light skin tone | |
| 1836 | +1F57A 1F3FC ; fully-qualified # ๐บ๐ผ man dancing: medium-light skin tone | |
| 1837 | +1F57A 1F3FD ; fully-qualified # ๐บ๐ฝ man dancing: medium skin tone | |
| 1838 | +1F57A 1F3FE ; fully-qualified # ๐บ๐พ man dancing: medium-dark skin tone | |
| 1839 | +1F57A 1F3FF ; fully-qualified # ๐บ๐ฟ man dancing: dark skin tone | |
| 1840 | +1F574 FE0F ; fully-qualified # ๐ด๏ธ man in suit levitating | |
| 1841 | +1F574 ; unqualified # ๐ด man in suit levitating | |
| 1842 | +1F574 1F3FB ; fully-qualified # ๐ด๐ป man in suit levitating: light skin tone | |
| 1843 | +1F574 1F3FC ; fully-qualified # ๐ด๐ผ man in suit levitating: medium-light skin tone | |
| 1844 | +1F574 1F3FD ; fully-qualified # ๐ด๐ฝ man in suit levitating: medium skin tone | |
| 1845 | +1F574 1F3FE ; fully-qualified # ๐ด๐พ man in suit levitating: medium-dark skin tone | |
| 1846 | +1F574 1F3FF ; fully-qualified # ๐ด๐ฟ man in suit levitating: dark skin tone | |
| 1847 | +1F46F ; fully-qualified # ๐ฏ people with bunny ears | |
| 1848 | +1F46F 200D 2642 FE0F ; fully-qualified # ๐ฏโโ๏ธ men with bunny ears | |
| 1849 | +1F46F 200D 2642 ; minimally-qualified # ๐ฏโโ men with bunny ears | |
| 1850 | +1F46F 200D 2640 FE0F ; fully-qualified # ๐ฏโโ๏ธ women with bunny ears | |
| 1851 | +1F46F 200D 2640 ; minimally-qualified # ๐ฏโโ women with bunny ears | |
| 1852 | +1F9D6 ; fully-qualified # ๐ง person in steamy room | |
| 1853 | +1F9D6 1F3FB ; fully-qualified # ๐ง๐ป person in steamy room: light skin tone | |
| 1854 | +1F9D6 1F3FC ; fully-qualified # ๐ง๐ผ person in steamy room: medium-light skin tone | |
| 1855 | +1F9D6 1F3FD ; fully-qualified # ๐ง๐ฝ person in steamy room: medium skin tone | |
| 1856 | +1F9D6 1F3FE ; fully-qualified # ๐ง๐พ person in steamy room: medium-dark skin tone | |
| 1857 | +1F9D6 1F3FF ; fully-qualified # ๐ง๐ฟ person in steamy room: dark skin tone | |
| 1858 | +1F9D6 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ man in steamy room | |
| 1859 | +1F9D6 200D 2642 ; minimally-qualified # ๐งโโ man in steamy room | |
| 1860 | +1F9D6 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ man in steamy room: light skin tone | |
| 1861 | +1F9D6 1F3FB 200D 2642 ; minimally-qualified # ๐ง๐ปโโ man in steamy room: light skin tone | |
| 1862 | +1F9D6 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ man in steamy room: medium-light skin tone | |
| 1863 | +1F9D6 1F3FC 200D 2642 ; minimally-qualified # ๐ง๐ผโโ man in steamy room: medium-light skin tone | |
| 1864 | +1F9D6 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ man in steamy room: medium skin tone | |
| 1865 | +1F9D6 1F3FD 200D 2642 ; minimally-qualified # ๐ง๐ฝโโ man in steamy room: medium skin tone | |
| 1866 | +1F9D6 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ man in steamy room: medium-dark skin tone | |
| 1867 | +1F9D6 1F3FE 200D 2642 ; minimally-qualified # ๐ง๐พโโ man in steamy room: medium-dark skin tone | |
| 1868 | +1F9D6 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ man in steamy room: dark skin tone | |
| 1869 | +1F9D6 1F3FF 200D 2642 ; minimally-qualified # ๐ง๐ฟโโ man in steamy room: dark skin tone | |
| 1870 | +1F9D6 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ woman in steamy room | |
| 1871 | +1F9D6 200D 2640 ; minimally-qualified # ๐งโโ woman in steamy room | |
| 1872 | +1F9D6 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ woman in steamy room: light skin tone | |
| 1873 | +1F9D6 1F3FB 200D 2640 ; minimally-qualified # ๐ง๐ปโโ woman in steamy room: light skin tone | |
| 1874 | +1F9D6 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ woman in steamy room: medium-light skin tone | |
| 1875 | +1F9D6 1F3FC 200D 2640 ; minimally-qualified # ๐ง๐ผโโ woman in steamy room: medium-light skin tone | |
| 1876 | +1F9D6 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ woman in steamy room: medium skin tone | |
| 1877 | +1F9D6 1F3FD 200D 2640 ; minimally-qualified # ๐ง๐ฝโโ woman in steamy room: medium skin tone | |
| 1878 | +1F9D6 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ woman in steamy room: medium-dark skin tone | |
| 1879 | +1F9D6 1F3FE 200D 2640 ; minimally-qualified # ๐ง๐พโโ woman in steamy room: medium-dark skin tone | |
| 1880 | +1F9D6 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ woman in steamy room: dark skin tone | |
| 1881 | +1F9D6 1F3FF 200D 2640 ; minimally-qualified # ๐ง๐ฟโโ woman in steamy room: dark skin tone | |
| 1882 | +1F9D7 ; fully-qualified # ๐ง person climbing | |
| 1883 | +1F9D7 1F3FB ; fully-qualified # ๐ง๐ป person climbing: light skin tone | |
| 1884 | +1F9D7 1F3FC ; fully-qualified # ๐ง๐ผ person climbing: medium-light skin tone | |
| 1885 | +1F9D7 1F3FD ; fully-qualified # ๐ง๐ฝ person climbing: medium skin tone | |
| 1886 | +1F9D7 1F3FE ; fully-qualified # ๐ง๐พ person climbing: medium-dark skin tone | |
| 1887 | +1F9D7 1F3FF ; fully-qualified # ๐ง๐ฟ person climbing: dark skin tone | |
| 1888 | +1F9D7 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ man climbing | |
| 1889 | +1F9D7 200D 2642 ; minimally-qualified # ๐งโโ man climbing | |
| 1890 | +1F9D7 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ man climbing: light skin tone | |
| 1891 | +1F9D7 1F3FB 200D 2642 ; minimally-qualified # ๐ง๐ปโโ man climbing: light skin tone | |
| 1892 | +1F9D7 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ man climbing: medium-light skin tone | |
| 1893 | +1F9D7 1F3FC 200D 2642 ; minimally-qualified # ๐ง๐ผโโ man climbing: medium-light skin tone | |
| 1894 | +1F9D7 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ man climbing: medium skin tone | |
| 1895 | +1F9D7 1F3FD 200D 2642 ; minimally-qualified # ๐ง๐ฝโโ man climbing: medium skin tone | |
| 1896 | +1F9D7 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ man climbing: medium-dark skin tone | |
| 1897 | +1F9D7 1F3FE 200D 2642 ; minimally-qualified # ๐ง๐พโโ man climbing: medium-dark skin tone | |
| 1898 | +1F9D7 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ man climbing: dark skin tone | |
| 1899 | +1F9D7 1F3FF 200D 2642 ; minimally-qualified # ๐ง๐ฟโโ man climbing: dark skin tone | |
| 1900 | +1F9D7 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ woman climbing | |
| 1901 | +1F9D7 200D 2640 ; minimally-qualified # ๐งโโ woman climbing | |
| 1902 | +1F9D7 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ woman climbing: light skin tone | |
| 1903 | +1F9D7 1F3FB 200D 2640 ; minimally-qualified # ๐ง๐ปโโ woman climbing: light skin tone | |
| 1904 | +1F9D7 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ woman climbing: medium-light skin tone | |
| 1905 | +1F9D7 1F3FC 200D 2640 ; minimally-qualified # ๐ง๐ผโโ woman climbing: medium-light skin tone | |
| 1906 | +1F9D7 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ woman climbing: medium skin tone | |
| 1907 | +1F9D7 1F3FD 200D 2640 ; minimally-qualified # ๐ง๐ฝโโ woman climbing: medium skin tone | |
| 1908 | +1F9D7 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ woman climbing: medium-dark skin tone | |
| 1909 | +1F9D7 1F3FE 200D 2640 ; minimally-qualified # ๐ง๐พโโ woman climbing: medium-dark skin tone | |
| 1910 | +1F9D7 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ woman climbing: dark skin tone | |
| 1911 | +1F9D7 1F3FF 200D 2640 ; minimally-qualified # ๐ง๐ฟโโ woman climbing: dark skin tone | |
| 1912 | + | |
| 1913 | +# subgroup: person-sport | |
| 1914 | +1F93A ; fully-qualified # ๐คบ person fencing | |
| 1915 | +1F3C7 ; fully-qualified # ๐ horse racing | |
| 1916 | +1F3C7 1F3FB ; fully-qualified # ๐๐ป horse racing: light skin tone | |
| 1917 | +1F3C7 1F3FC ; fully-qualified # ๐๐ผ horse racing: medium-light skin tone | |
| 1918 | +1F3C7 1F3FD ; fully-qualified # ๐๐ฝ horse racing: medium skin tone | |
| 1919 | +1F3C7 1F3FE ; fully-qualified # ๐๐พ horse racing: medium-dark skin tone | |
| 1920 | +1F3C7 1F3FF ; fully-qualified # ๐๐ฟ horse racing: dark skin tone | |
| 1921 | +26F7 FE0F ; fully-qualified # โท๏ธ skier | |
| 1922 | +26F7 ; unqualified # โท skier | |
| 1923 | +1F3C2 ; fully-qualified # ๐ snowboarder | |
| 1924 | +1F3C2 1F3FB ; fully-qualified # ๐๐ป snowboarder: light skin tone | |
| 1925 | +1F3C2 1F3FC ; fully-qualified # ๐๐ผ snowboarder: medium-light skin tone | |
| 1926 | +1F3C2 1F3FD ; fully-qualified # ๐๐ฝ snowboarder: medium skin tone | |
| 1927 | +1F3C2 1F3FE ; fully-qualified # ๐๐พ snowboarder: medium-dark skin tone | |
| 1928 | +1F3C2 1F3FF ; fully-qualified # ๐๐ฟ snowboarder: dark skin tone | |
| 1929 | +1F3CC FE0F ; fully-qualified # ๐๏ธ person golfing | |
| 1930 | +1F3CC ; unqualified # ๐ person golfing | |
| 1931 | +1F3CC 1F3FB ; fully-qualified # ๐๐ป person golfing: light skin tone | |
| 1932 | +1F3CC 1F3FC ; fully-qualified # ๐๐ผ person golfing: medium-light skin tone | |
| 1933 | +1F3CC 1F3FD ; fully-qualified # ๐๐ฝ person golfing: medium skin tone | |
| 1934 | +1F3CC 1F3FE ; fully-qualified # ๐๐พ person golfing: medium-dark skin tone | |
| 1935 | +1F3CC 1F3FF ; fully-qualified # ๐๐ฟ person golfing: dark skin tone | |
| 1936 | +1F3CC FE0F 200D 2642 FE0F ; fully-qualified # ๐๏ธโโ๏ธ man golfing | |
| 1937 | +1F3CC 200D 2642 FE0F ; unqualified # ๐โโ๏ธ man golfing | |
| 1938 | +1F3CC FE0F 200D 2642 ; unqualified # ๐๏ธโโ man golfing | |
| 1939 | +1F3CC 200D 2642 ; unqualified # ๐โโ man golfing | |
| 1940 | +1F3CC 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man golfing: light skin tone | |
| 1941 | +1F3CC 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man golfing: light skin tone | |
| 1942 | +1F3CC 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man golfing: medium-light skin tone | |
| 1943 | +1F3CC 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man golfing: medium-light skin tone | |
| 1944 | +1F3CC 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man golfing: medium skin tone | |
| 1945 | +1F3CC 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man golfing: medium skin tone | |
| 1946 | +1F3CC 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man golfing: medium-dark skin tone | |
| 1947 | +1F3CC 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man golfing: medium-dark skin tone | |
| 1948 | +1F3CC 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man golfing: dark skin tone | |
| 1949 | +1F3CC 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man golfing: dark skin tone | |
| 1950 | +1F3CC FE0F 200D 2640 FE0F ; fully-qualified # ๐๏ธโโ๏ธ woman golfing | |
| 1951 | +1F3CC 200D 2640 FE0F ; unqualified # ๐โโ๏ธ woman golfing | |
| 1952 | +1F3CC FE0F 200D 2640 ; unqualified # ๐๏ธโโ woman golfing | |
| 1953 | +1F3CC 200D 2640 ; unqualified # ๐โโ woman golfing | |
| 1954 | +1F3CC 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman golfing: light skin tone | |
| 1955 | +1F3CC 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman golfing: light skin tone | |
| 1956 | +1F3CC 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman golfing: medium-light skin tone | |
| 1957 | +1F3CC 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman golfing: medium-light skin tone | |
| 1958 | +1F3CC 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman golfing: medium skin tone | |
| 1959 | +1F3CC 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman golfing: medium skin tone | |
| 1960 | +1F3CC 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman golfing: medium-dark skin tone | |
| 1961 | +1F3CC 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman golfing: medium-dark skin tone | |
| 1962 | +1F3CC 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman golfing: dark skin tone | |
| 1963 | +1F3CC 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman golfing: dark skin tone | |
| 1964 | +1F3C4 ; fully-qualified # ๐ person surfing | |
| 1965 | +1F3C4 1F3FB ; fully-qualified # ๐๐ป person surfing: light skin tone | |
| 1966 | +1F3C4 1F3FC ; fully-qualified # ๐๐ผ person surfing: medium-light skin tone | |
| 1967 | +1F3C4 1F3FD ; fully-qualified # ๐๐ฝ person surfing: medium skin tone | |
| 1968 | +1F3C4 1F3FE ; fully-qualified # ๐๐พ person surfing: medium-dark skin tone | |
| 1969 | +1F3C4 1F3FF ; fully-qualified # ๐๐ฟ person surfing: dark skin tone | |
| 1970 | +1F3C4 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man surfing | |
| 1971 | +1F3C4 200D 2642 ; minimally-qualified # ๐โโ man surfing | |
| 1972 | +1F3C4 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man surfing: light skin tone | |
| 1973 | +1F3C4 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man surfing: light skin tone | |
| 1974 | +1F3C4 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man surfing: medium-light skin tone | |
| 1975 | +1F3C4 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man surfing: medium-light skin tone | |
| 1976 | +1F3C4 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man surfing: medium skin tone | |
| 1977 | +1F3C4 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man surfing: medium skin tone | |
| 1978 | +1F3C4 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man surfing: medium-dark skin tone | |
| 1979 | +1F3C4 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man surfing: medium-dark skin tone | |
| 1980 | +1F3C4 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man surfing: dark skin tone | |
| 1981 | +1F3C4 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man surfing: dark skin tone | |
| 1982 | +1F3C4 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman surfing | |
| 1983 | +1F3C4 200D 2640 ; minimally-qualified # ๐โโ woman surfing | |
| 1984 | +1F3C4 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman surfing: light skin tone | |
| 1985 | +1F3C4 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman surfing: light skin tone | |
| 1986 | +1F3C4 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman surfing: medium-light skin tone | |
| 1987 | +1F3C4 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman surfing: medium-light skin tone | |
| 1988 | +1F3C4 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman surfing: medium skin tone | |
| 1989 | +1F3C4 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman surfing: medium skin tone | |
| 1990 | +1F3C4 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman surfing: medium-dark skin tone | |
| 1991 | +1F3C4 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman surfing: medium-dark skin tone | |
| 1992 | +1F3C4 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman surfing: dark skin tone | |
| 1993 | +1F3C4 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman surfing: dark skin tone | |
| 1994 | +1F6A3 ; fully-qualified # ๐ฃ person rowing boat | |
| 1995 | +1F6A3 1F3FB ; fully-qualified # ๐ฃ๐ป person rowing boat: light skin tone | |
| 1996 | +1F6A3 1F3FC ; fully-qualified # ๐ฃ๐ผ person rowing boat: medium-light skin tone | |
| 1997 | +1F6A3 1F3FD ; fully-qualified # ๐ฃ๐ฝ person rowing boat: medium skin tone | |
| 1998 | +1F6A3 1F3FE ; fully-qualified # ๐ฃ๐พ person rowing boat: medium-dark skin tone | |
| 1999 | +1F6A3 1F3FF ; fully-qualified # ๐ฃ๐ฟ person rowing boat: dark skin tone | |
| 2000 | +1F6A3 200D 2642 FE0F ; fully-qualified # ๐ฃโโ๏ธ man rowing boat | |
| 2001 | +1F6A3 200D 2642 ; minimally-qualified # ๐ฃโโ man rowing boat | |
| 2002 | +1F6A3 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ฃ๐ปโโ๏ธ man rowing boat: light skin tone | |
| 2003 | +1F6A3 1F3FB 200D 2642 ; minimally-qualified # ๐ฃ๐ปโโ man rowing boat: light skin tone | |
| 2004 | +1F6A3 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ฃ๐ผโโ๏ธ man rowing boat: medium-light skin tone | |
| 2005 | +1F6A3 1F3FC 200D 2642 ; minimally-qualified # ๐ฃ๐ผโโ man rowing boat: medium-light skin tone | |
| 2006 | +1F6A3 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ฃ๐ฝโโ๏ธ man rowing boat: medium skin tone | |
| 2007 | +1F6A3 1F3FD 200D 2642 ; minimally-qualified # ๐ฃ๐ฝโโ man rowing boat: medium skin tone | |
| 2008 | +1F6A3 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ฃ๐พโโ๏ธ man rowing boat: medium-dark skin tone | |
| 2009 | +1F6A3 1F3FE 200D 2642 ; minimally-qualified # ๐ฃ๐พโโ man rowing boat: medium-dark skin tone | |
| 2010 | +1F6A3 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ฃ๐ฟโโ๏ธ man rowing boat: dark skin tone | |
| 2011 | +1F6A3 1F3FF 200D 2642 ; minimally-qualified # ๐ฃ๐ฟโโ man rowing boat: dark skin tone | |
| 2012 | +1F6A3 200D 2640 FE0F ; fully-qualified # ๐ฃโโ๏ธ woman rowing boat | |
| 2013 | +1F6A3 200D 2640 ; minimally-qualified # ๐ฃโโ woman rowing boat | |
| 2014 | +1F6A3 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ฃ๐ปโโ๏ธ woman rowing boat: light skin tone | |
| 2015 | +1F6A3 1F3FB 200D 2640 ; minimally-qualified # ๐ฃ๐ปโโ woman rowing boat: light skin tone | |
| 2016 | +1F6A3 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ฃ๐ผโโ๏ธ woman rowing boat: medium-light skin tone | |
| 2017 | +1F6A3 1F3FC 200D 2640 ; minimally-qualified # ๐ฃ๐ผโโ woman rowing boat: medium-light skin tone | |
| 2018 | +1F6A3 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ฃ๐ฝโโ๏ธ woman rowing boat: medium skin tone | |
| 2019 | +1F6A3 1F3FD 200D 2640 ; minimally-qualified # ๐ฃ๐ฝโโ woman rowing boat: medium skin tone | |
| 2020 | +1F6A3 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ฃ๐พโโ๏ธ woman rowing boat: medium-dark skin tone | |
| 2021 | +1F6A3 1F3FE 200D 2640 ; minimally-qualified # ๐ฃ๐พโโ woman rowing boat: medium-dark skin tone | |
| 2022 | +1F6A3 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ฃ๐ฟโโ๏ธ woman rowing boat: dark skin tone | |
| 2023 | +1F6A3 1F3FF 200D 2640 ; minimally-qualified # ๐ฃ๐ฟโโ woman rowing boat: dark skin tone | |
| 2024 | +1F3CA ; fully-qualified # ๐ person swimming | |
| 2025 | +1F3CA 1F3FB ; fully-qualified # ๐๐ป person swimming: light skin tone | |
| 2026 | +1F3CA 1F3FC ; fully-qualified # ๐๐ผ person swimming: medium-light skin tone | |
| 2027 | +1F3CA 1F3FD ; fully-qualified # ๐๐ฝ person swimming: medium skin tone | |
| 2028 | +1F3CA 1F3FE ; fully-qualified # ๐๐พ person swimming: medium-dark skin tone | |
| 2029 | +1F3CA 1F3FF ; fully-qualified # ๐๐ฟ person swimming: dark skin tone | |
| 2030 | +1F3CA 200D 2642 FE0F ; fully-qualified # ๐โโ๏ธ man swimming | |
| 2031 | +1F3CA 200D 2642 ; minimally-qualified # ๐โโ man swimming | |
| 2032 | +1F3CA 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man swimming: light skin tone | |
| 2033 | +1F3CA 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man swimming: light skin tone | |
| 2034 | +1F3CA 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man swimming: medium-light skin tone | |
| 2035 | +1F3CA 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man swimming: medium-light skin tone | |
| 2036 | +1F3CA 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man swimming: medium skin tone | |
| 2037 | +1F3CA 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man swimming: medium skin tone | |
| 2038 | +1F3CA 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man swimming: medium-dark skin tone | |
| 2039 | +1F3CA 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man swimming: medium-dark skin tone | |
| 2040 | +1F3CA 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man swimming: dark skin tone | |
| 2041 | +1F3CA 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man swimming: dark skin tone | |
| 2042 | +1F3CA 200D 2640 FE0F ; fully-qualified # ๐โโ๏ธ woman swimming | |
| 2043 | +1F3CA 200D 2640 ; minimally-qualified # ๐โโ woman swimming | |
| 2044 | +1F3CA 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman swimming: light skin tone | |
| 2045 | +1F3CA 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman swimming: light skin tone | |
| 2046 | +1F3CA 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman swimming: medium-light skin tone | |
| 2047 | +1F3CA 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman swimming: medium-light skin tone | |
| 2048 | +1F3CA 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman swimming: medium skin tone | |
| 2049 | +1F3CA 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman swimming: medium skin tone | |
| 2050 | +1F3CA 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman swimming: medium-dark skin tone | |
| 2051 | +1F3CA 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman swimming: medium-dark skin tone | |
| 2052 | +1F3CA 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman swimming: dark skin tone | |
| 2053 | +1F3CA 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman swimming: dark skin tone | |
| 2054 | +26F9 FE0F ; fully-qualified # โน๏ธ person bouncing ball | |
| 2055 | +26F9 ; unqualified # โน person bouncing ball | |
| 2056 | +26F9 1F3FB ; fully-qualified # โน๐ป person bouncing ball: light skin tone | |
| 2057 | +26F9 1F3FC ; fully-qualified # โน๐ผ person bouncing ball: medium-light skin tone | |
| 2058 | +26F9 1F3FD ; fully-qualified # โน๐ฝ person bouncing ball: medium skin tone | |
| 2059 | +26F9 1F3FE ; fully-qualified # โน๐พ person bouncing ball: medium-dark skin tone | |
| 2060 | +26F9 1F3FF ; fully-qualified # โน๐ฟ person bouncing ball: dark skin tone | |
| 2061 | +26F9 FE0F 200D 2642 FE0F ; fully-qualified # โน๏ธโโ๏ธ man bouncing ball | |
| 2062 | +26F9 200D 2642 FE0F ; unqualified # โนโโ๏ธ man bouncing ball | |
| 2063 | +26F9 FE0F 200D 2642 ; unqualified # โน๏ธโโ man bouncing ball | |
| 2064 | +26F9 200D 2642 ; unqualified # โนโโ man bouncing ball | |
| 2065 | +26F9 1F3FB 200D 2642 FE0F ; fully-qualified # โน๐ปโโ๏ธ man bouncing ball: light skin tone | |
| 2066 | +26F9 1F3FB 200D 2642 ; minimally-qualified # โน๐ปโโ man bouncing ball: light skin tone | |
| 2067 | +26F9 1F3FC 200D 2642 FE0F ; fully-qualified # โน๐ผโโ๏ธ man bouncing ball: medium-light skin tone | |
| 2068 | +26F9 1F3FC 200D 2642 ; minimally-qualified # โน๐ผโโ man bouncing ball: medium-light skin tone | |
| 2069 | +26F9 1F3FD 200D 2642 FE0F ; fully-qualified # โน๐ฝโโ๏ธ man bouncing ball: medium skin tone | |
| 2070 | +26F9 1F3FD 200D 2642 ; minimally-qualified # โน๐ฝโโ man bouncing ball: medium skin tone | |
| 2071 | +26F9 1F3FE 200D 2642 FE0F ; fully-qualified # โน๐พโโ๏ธ man bouncing ball: medium-dark skin tone | |
| 2072 | +26F9 1F3FE 200D 2642 ; minimally-qualified # โน๐พโโ man bouncing ball: medium-dark skin tone | |
| 2073 | +26F9 1F3FF 200D 2642 FE0F ; fully-qualified # โน๐ฟโโ๏ธ man bouncing ball: dark skin tone | |
| 2074 | +26F9 1F3FF 200D 2642 ; minimally-qualified # โน๐ฟโโ man bouncing ball: dark skin tone | |
| 2075 | +26F9 FE0F 200D 2640 FE0F ; fully-qualified # โน๏ธโโ๏ธ woman bouncing ball | |
| 2076 | +26F9 200D 2640 FE0F ; unqualified # โนโโ๏ธ woman bouncing ball | |
| 2077 | +26F9 FE0F 200D 2640 ; unqualified # โน๏ธโโ woman bouncing ball | |
| 2078 | +26F9 200D 2640 ; unqualified # โนโโ woman bouncing ball | |
| 2079 | +26F9 1F3FB 200D 2640 FE0F ; fully-qualified # โน๐ปโโ๏ธ woman bouncing ball: light skin tone | |
| 2080 | +26F9 1F3FB 200D 2640 ; minimally-qualified # โน๐ปโโ woman bouncing ball: light skin tone | |
| 2081 | +26F9 1F3FC 200D 2640 FE0F ; fully-qualified # โน๐ผโโ๏ธ woman bouncing ball: medium-light skin tone | |
| 2082 | +26F9 1F3FC 200D 2640 ; minimally-qualified # โน๐ผโโ woman bouncing ball: medium-light skin tone | |
| 2083 | +26F9 1F3FD 200D 2640 FE0F ; fully-qualified # โน๐ฝโโ๏ธ woman bouncing ball: medium skin tone | |
| 2084 | +26F9 1F3FD 200D 2640 ; minimally-qualified # โน๐ฝโโ woman bouncing ball: medium skin tone | |
| 2085 | +26F9 1F3FE 200D 2640 FE0F ; fully-qualified # โน๐พโโ๏ธ woman bouncing ball: medium-dark skin tone | |
| 2086 | +26F9 1F3FE 200D 2640 ; minimally-qualified # โน๐พโโ woman bouncing ball: medium-dark skin tone | |
| 2087 | +26F9 1F3FF 200D 2640 FE0F ; fully-qualified # โน๐ฟโโ๏ธ woman bouncing ball: dark skin tone | |
| 2088 | +26F9 1F3FF 200D 2640 ; minimally-qualified # โน๐ฟโโ woman bouncing ball: dark skin tone | |
| 2089 | +1F3CB FE0F ; fully-qualified # ๐๏ธ person lifting weights | |
| 2090 | +1F3CB ; unqualified # ๐ person lifting weights | |
| 2091 | +1F3CB 1F3FB ; fully-qualified # ๐๐ป person lifting weights: light skin tone | |
| 2092 | +1F3CB 1F3FC ; fully-qualified # ๐๐ผ person lifting weights: medium-light skin tone | |
| 2093 | +1F3CB 1F3FD ; fully-qualified # ๐๐ฝ person lifting weights: medium skin tone | |
| 2094 | +1F3CB 1F3FE ; fully-qualified # ๐๐พ person lifting weights: medium-dark skin tone | |
| 2095 | +1F3CB 1F3FF ; fully-qualified # ๐๐ฟ person lifting weights: dark skin tone | |
| 2096 | +1F3CB FE0F 200D 2642 FE0F ; fully-qualified # ๐๏ธโโ๏ธ man lifting weights | |
| 2097 | +1F3CB 200D 2642 FE0F ; unqualified # ๐โโ๏ธ man lifting weights | |
| 2098 | +1F3CB FE0F 200D 2642 ; unqualified # ๐๏ธโโ man lifting weights | |
| 2099 | +1F3CB 200D 2642 ; unqualified # ๐โโ man lifting weights | |
| 2100 | +1F3CB 1F3FB 200D 2642 FE0F ; fully-qualified # ๐๐ปโโ๏ธ man lifting weights: light skin tone | |
| 2101 | +1F3CB 1F3FB 200D 2642 ; minimally-qualified # ๐๐ปโโ man lifting weights: light skin tone | |
| 2102 | +1F3CB 1F3FC 200D 2642 FE0F ; fully-qualified # ๐๐ผโโ๏ธ man lifting weights: medium-light skin tone | |
| 2103 | +1F3CB 1F3FC 200D 2642 ; minimally-qualified # ๐๐ผโโ man lifting weights: medium-light skin tone | |
| 2104 | +1F3CB 1F3FD 200D 2642 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ man lifting weights: medium skin tone | |
| 2105 | +1F3CB 1F3FD 200D 2642 ; minimally-qualified # ๐๐ฝโโ man lifting weights: medium skin tone | |
| 2106 | +1F3CB 1F3FE 200D 2642 FE0F ; fully-qualified # ๐๐พโโ๏ธ man lifting weights: medium-dark skin tone | |
| 2107 | +1F3CB 1F3FE 200D 2642 ; minimally-qualified # ๐๐พโโ man lifting weights: medium-dark skin tone | |
| 2108 | +1F3CB 1F3FF 200D 2642 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ man lifting weights: dark skin tone | |
| 2109 | +1F3CB 1F3FF 200D 2642 ; minimally-qualified # ๐๐ฟโโ man lifting weights: dark skin tone | |
| 2110 | +1F3CB FE0F 200D 2640 FE0F ; fully-qualified # ๐๏ธโโ๏ธ woman lifting weights | |
| 2111 | +1F3CB 200D 2640 FE0F ; unqualified # ๐โโ๏ธ woman lifting weights | |
| 2112 | +1F3CB FE0F 200D 2640 ; unqualified # ๐๏ธโโ woman lifting weights | |
| 2113 | +1F3CB 200D 2640 ; unqualified # ๐โโ woman lifting weights | |
| 2114 | +1F3CB 1F3FB 200D 2640 FE0F ; fully-qualified # ๐๐ปโโ๏ธ woman lifting weights: light skin tone | |
| 2115 | +1F3CB 1F3FB 200D 2640 ; minimally-qualified # ๐๐ปโโ woman lifting weights: light skin tone | |
| 2116 | +1F3CB 1F3FC 200D 2640 FE0F ; fully-qualified # ๐๐ผโโ๏ธ woman lifting weights: medium-light skin tone | |
| 2117 | +1F3CB 1F3FC 200D 2640 ; minimally-qualified # ๐๐ผโโ woman lifting weights: medium-light skin tone | |
| 2118 | +1F3CB 1F3FD 200D 2640 FE0F ; fully-qualified # ๐๐ฝโโ๏ธ woman lifting weights: medium skin tone | |
| 2119 | +1F3CB 1F3FD 200D 2640 ; minimally-qualified # ๐๐ฝโโ woman lifting weights: medium skin tone | |
| 2120 | +1F3CB 1F3FE 200D 2640 FE0F ; fully-qualified # ๐๐พโโ๏ธ woman lifting weights: medium-dark skin tone | |
| 2121 | +1F3CB 1F3FE 200D 2640 ; minimally-qualified # ๐๐พโโ woman lifting weights: medium-dark skin tone | |
| 2122 | +1F3CB 1F3FF 200D 2640 FE0F ; fully-qualified # ๐๐ฟโโ๏ธ woman lifting weights: dark skin tone | |
| 2123 | +1F3CB 1F3FF 200D 2640 ; minimally-qualified # ๐๐ฟโโ woman lifting weights: dark skin tone | |
| 2124 | +1F6B4 ; fully-qualified # ๐ด person biking | |
| 2125 | +1F6B4 1F3FB ; fully-qualified # ๐ด๐ป person biking: light skin tone | |
| 2126 | +1F6B4 1F3FC ; fully-qualified # ๐ด๐ผ person biking: medium-light skin tone | |
| 2127 | +1F6B4 1F3FD ; fully-qualified # ๐ด๐ฝ person biking: medium skin tone | |
| 2128 | +1F6B4 1F3FE ; fully-qualified # ๐ด๐พ person biking: medium-dark skin tone | |
| 2129 | +1F6B4 1F3FF ; fully-qualified # ๐ด๐ฟ person biking: dark skin tone | |
| 2130 | +1F6B4 200D 2642 FE0F ; fully-qualified # ๐ดโโ๏ธ man biking | |
| 2131 | +1F6B4 200D 2642 ; minimally-qualified # ๐ดโโ man biking | |
| 2132 | +1F6B4 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ด๐ปโโ๏ธ man biking: light skin tone | |
| 2133 | +1F6B4 1F3FB 200D 2642 ; minimally-qualified # ๐ด๐ปโโ man biking: light skin tone | |
| 2134 | +1F6B4 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ด๐ผโโ๏ธ man biking: medium-light skin tone | |
| 2135 | +1F6B4 1F3FC 200D 2642 ; minimally-qualified # ๐ด๐ผโโ man biking: medium-light skin tone | |
| 2136 | +1F6B4 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ด๐ฝโโ๏ธ man biking: medium skin tone | |
| 2137 | +1F6B4 1F3FD 200D 2642 ; minimally-qualified # ๐ด๐ฝโโ man biking: medium skin tone | |
| 2138 | +1F6B4 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ด๐พโโ๏ธ man biking: medium-dark skin tone | |
| 2139 | +1F6B4 1F3FE 200D 2642 ; minimally-qualified # ๐ด๐พโโ man biking: medium-dark skin tone | |
| 2140 | +1F6B4 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ด๐ฟโโ๏ธ man biking: dark skin tone | |
| 2141 | +1F6B4 1F3FF 200D 2642 ; minimally-qualified # ๐ด๐ฟโโ man biking: dark skin tone | |
| 2142 | +1F6B4 200D 2640 FE0F ; fully-qualified # ๐ดโโ๏ธ woman biking | |
| 2143 | +1F6B4 200D 2640 ; minimally-qualified # ๐ดโโ woman biking | |
| 2144 | +1F6B4 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ด๐ปโโ๏ธ woman biking: light skin tone | |
| 2145 | +1F6B4 1F3FB 200D 2640 ; minimally-qualified # ๐ด๐ปโโ woman biking: light skin tone | |
| 2146 | +1F6B4 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ด๐ผโโ๏ธ woman biking: medium-light skin tone | |
| 2147 | +1F6B4 1F3FC 200D 2640 ; minimally-qualified # ๐ด๐ผโโ woman biking: medium-light skin tone | |
| 2148 | +1F6B4 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ด๐ฝโโ๏ธ woman biking: medium skin tone | |
| 2149 | +1F6B4 1F3FD 200D 2640 ; minimally-qualified # ๐ด๐ฝโโ woman biking: medium skin tone | |
| 2150 | +1F6B4 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ด๐พโโ๏ธ woman biking: medium-dark skin tone | |
| 2151 | +1F6B4 1F3FE 200D 2640 ; minimally-qualified # ๐ด๐พโโ woman biking: medium-dark skin tone | |
| 2152 | +1F6B4 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ด๐ฟโโ๏ธ woman biking: dark skin tone | |
| 2153 | +1F6B4 1F3FF 200D 2640 ; minimally-qualified # ๐ด๐ฟโโ woman biking: dark skin tone | |
| 2154 | +1F6B5 ; fully-qualified # ๐ต person mountain biking | |
| 2155 | +1F6B5 1F3FB ; fully-qualified # ๐ต๐ป person mountain biking: light skin tone | |
| 2156 | +1F6B5 1F3FC ; fully-qualified # ๐ต๐ผ person mountain biking: medium-light skin tone | |
| 2157 | +1F6B5 1F3FD ; fully-qualified # ๐ต๐ฝ person mountain biking: medium skin tone | |
| 2158 | +1F6B5 1F3FE ; fully-qualified # ๐ต๐พ person mountain biking: medium-dark skin tone | |
| 2159 | +1F6B5 1F3FF ; fully-qualified # ๐ต๐ฟ person mountain biking: dark skin tone | |
| 2160 | +1F6B5 200D 2642 FE0F ; fully-qualified # ๐ตโโ๏ธ man mountain biking | |
| 2161 | +1F6B5 200D 2642 ; minimally-qualified # ๐ตโโ man mountain biking | |
| 2162 | +1F6B5 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ต๐ปโโ๏ธ man mountain biking: light skin tone | |
| 2163 | +1F6B5 1F3FB 200D 2642 ; minimally-qualified # ๐ต๐ปโโ man mountain biking: light skin tone | |
| 2164 | +1F6B5 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ต๐ผโโ๏ธ man mountain biking: medium-light skin tone | |
| 2165 | +1F6B5 1F3FC 200D 2642 ; minimally-qualified # ๐ต๐ผโโ man mountain biking: medium-light skin tone | |
| 2166 | +1F6B5 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ต๐ฝโโ๏ธ man mountain biking: medium skin tone | |
| 2167 | +1F6B5 1F3FD 200D 2642 ; minimally-qualified # ๐ต๐ฝโโ man mountain biking: medium skin tone | |
| 2168 | +1F6B5 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ต๐พโโ๏ธ man mountain biking: medium-dark skin tone | |
| 2169 | +1F6B5 1F3FE 200D 2642 ; minimally-qualified # ๐ต๐พโโ man mountain biking: medium-dark skin tone | |
| 2170 | +1F6B5 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ต๐ฟโโ๏ธ man mountain biking: dark skin tone | |
| 2171 | +1F6B5 1F3FF 200D 2642 ; minimally-qualified # ๐ต๐ฟโโ man mountain biking: dark skin tone | |
| 2172 | +1F6B5 200D 2640 FE0F ; fully-qualified # ๐ตโโ๏ธ woman mountain biking | |
| 2173 | +1F6B5 200D 2640 ; minimally-qualified # ๐ตโโ woman mountain biking | |
| 2174 | +1F6B5 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ต๐ปโโ๏ธ woman mountain biking: light skin tone | |
| 2175 | +1F6B5 1F3FB 200D 2640 ; minimally-qualified # ๐ต๐ปโโ woman mountain biking: light skin tone | |
| 2176 | +1F6B5 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ต๐ผโโ๏ธ woman mountain biking: medium-light skin tone | |
| 2177 | +1F6B5 1F3FC 200D 2640 ; minimally-qualified # ๐ต๐ผโโ woman mountain biking: medium-light skin tone | |
| 2178 | +1F6B5 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ต๐ฝโโ๏ธ woman mountain biking: medium skin tone | |
| 2179 | +1F6B5 1F3FD 200D 2640 ; minimally-qualified # ๐ต๐ฝโโ woman mountain biking: medium skin tone | |
| 2180 | +1F6B5 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ต๐พโโ๏ธ woman mountain biking: medium-dark skin tone | |
| 2181 | +1F6B5 1F3FE 200D 2640 ; minimally-qualified # ๐ต๐พโโ woman mountain biking: medium-dark skin tone | |
| 2182 | +1F6B5 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ต๐ฟโโ๏ธ woman mountain biking: dark skin tone | |
| 2183 | +1F6B5 1F3FF 200D 2640 ; minimally-qualified # ๐ต๐ฟโโ woman mountain biking: dark skin tone | |
| 2184 | +1F938 ; fully-qualified # ๐คธ person cartwheeling | |
| 2185 | +1F938 1F3FB ; fully-qualified # ๐คธ๐ป person cartwheeling: light skin tone | |
| 2186 | +1F938 1F3FC ; fully-qualified # ๐คธ๐ผ person cartwheeling: medium-light skin tone | |
| 2187 | +1F938 1F3FD ; fully-qualified # ๐คธ๐ฝ person cartwheeling: medium skin tone | |
| 2188 | +1F938 1F3FE ; fully-qualified # ๐คธ๐พ person cartwheeling: medium-dark skin tone | |
| 2189 | +1F938 1F3FF ; fully-qualified # ๐คธ๐ฟ person cartwheeling: dark skin tone | |
| 2190 | +1F938 200D 2642 FE0F ; fully-qualified # ๐คธโโ๏ธ man cartwheeling | |
| 2191 | +1F938 200D 2642 ; minimally-qualified # ๐คธโโ man cartwheeling | |
| 2192 | +1F938 1F3FB 200D 2642 FE0F ; fully-qualified # ๐คธ๐ปโโ๏ธ man cartwheeling: light skin tone | |
| 2193 | +1F938 1F3FB 200D 2642 ; minimally-qualified # ๐คธ๐ปโโ man cartwheeling: light skin tone | |
| 2194 | +1F938 1F3FC 200D 2642 FE0F ; fully-qualified # ๐คธ๐ผโโ๏ธ man cartwheeling: medium-light skin tone | |
| 2195 | +1F938 1F3FC 200D 2642 ; minimally-qualified # ๐คธ๐ผโโ man cartwheeling: medium-light skin tone | |
| 2196 | +1F938 1F3FD 200D 2642 FE0F ; fully-qualified # ๐คธ๐ฝโโ๏ธ man cartwheeling: medium skin tone | |
| 2197 | +1F938 1F3FD 200D 2642 ; minimally-qualified # ๐คธ๐ฝโโ man cartwheeling: medium skin tone | |
| 2198 | +1F938 1F3FE 200D 2642 FE0F ; fully-qualified # ๐คธ๐พโโ๏ธ man cartwheeling: medium-dark skin tone | |
| 2199 | +1F938 1F3FE 200D 2642 ; minimally-qualified # ๐คธ๐พโโ man cartwheeling: medium-dark skin tone | |
| 2200 | +1F938 1F3FF 200D 2642 FE0F ; fully-qualified # ๐คธ๐ฟโโ๏ธ man cartwheeling: dark skin tone | |
| 2201 | +1F938 1F3FF 200D 2642 ; minimally-qualified # ๐คธ๐ฟโโ man cartwheeling: dark skin tone | |
| 2202 | +1F938 200D 2640 FE0F ; fully-qualified # ๐คธโโ๏ธ woman cartwheeling | |
| 2203 | +1F938 200D 2640 ; minimally-qualified # ๐คธโโ woman cartwheeling | |
| 2204 | +1F938 1F3FB 200D 2640 FE0F ; fully-qualified # ๐คธ๐ปโโ๏ธ woman cartwheeling: light skin tone | |
| 2205 | +1F938 1F3FB 200D 2640 ; minimally-qualified # ๐คธ๐ปโโ woman cartwheeling: light skin tone | |
| 2206 | +1F938 1F3FC 200D 2640 FE0F ; fully-qualified # ๐คธ๐ผโโ๏ธ woman cartwheeling: medium-light skin tone | |
| 2207 | +1F938 1F3FC 200D 2640 ; minimally-qualified # ๐คธ๐ผโโ woman cartwheeling: medium-light skin tone | |
| 2208 | +1F938 1F3FD 200D 2640 FE0F ; fully-qualified # ๐คธ๐ฝโโ๏ธ woman cartwheeling: medium skin tone | |
| 2209 | +1F938 1F3FD 200D 2640 ; minimally-qualified # ๐คธ๐ฝโโ woman cartwheeling: medium skin tone | |
| 2210 | +1F938 1F3FE 200D 2640 FE0F ; fully-qualified # ๐คธ๐พโโ๏ธ woman cartwheeling: medium-dark skin tone | |
| 2211 | +1F938 1F3FE 200D 2640 ; minimally-qualified # ๐คธ๐พโโ woman cartwheeling: medium-dark skin tone | |
| 2212 | +1F938 1F3FF 200D 2640 FE0F ; fully-qualified # ๐คธ๐ฟโโ๏ธ woman cartwheeling: dark skin tone | |
| 2213 | +1F938 1F3FF 200D 2640 ; minimally-qualified # ๐คธ๐ฟโโ woman cartwheeling: dark skin tone | |
| 2214 | +1F93C ; fully-qualified # ๐คผ people wrestling | |
| 2215 | +1F93C 200D 2642 FE0F ; fully-qualified # ๐คผโโ๏ธ men wrestling | |
| 2216 | +1F93C 200D 2642 ; minimally-qualified # ๐คผโโ men wrestling | |
| 2217 | +1F93C 200D 2640 FE0F ; fully-qualified # ๐คผโโ๏ธ women wrestling | |
| 2218 | +1F93C 200D 2640 ; minimally-qualified # ๐คผโโ women wrestling | |
| 2219 | +1F93D ; fully-qualified # ๐คฝ person playing water polo | |
| 2220 | +1F93D 1F3FB ; fully-qualified # ๐คฝ๐ป person playing water polo: light skin tone | |
| 2221 | +1F93D 1F3FC ; fully-qualified # ๐คฝ๐ผ person playing water polo: medium-light skin tone | |
| 2222 | +1F93D 1F3FD ; fully-qualified # ๐คฝ๐ฝ person playing water polo: medium skin tone | |
| 2223 | +1F93D 1F3FE ; fully-qualified # ๐คฝ๐พ person playing water polo: medium-dark skin tone | |
| 2224 | +1F93D 1F3FF ; fully-qualified # ๐คฝ๐ฟ person playing water polo: dark skin tone | |
| 2225 | +1F93D 200D 2642 FE0F ; fully-qualified # ๐คฝโโ๏ธ man playing water polo | |
| 2226 | +1F93D 200D 2642 ; minimally-qualified # ๐คฝโโ man playing water polo | |
| 2227 | +1F93D 1F3FB 200D 2642 FE0F ; fully-qualified # ๐คฝ๐ปโโ๏ธ man playing water polo: light skin tone | |
| 2228 | +1F93D 1F3FB 200D 2642 ; minimally-qualified # ๐คฝ๐ปโโ man playing water polo: light skin tone | |
| 2229 | +1F93D 1F3FC 200D 2642 FE0F ; fully-qualified # ๐คฝ๐ผโโ๏ธ man playing water polo: medium-light skin tone | |
| 2230 | +1F93D 1F3FC 200D 2642 ; minimally-qualified # ๐คฝ๐ผโโ man playing water polo: medium-light skin tone | |
| 2231 | +1F93D 1F3FD 200D 2642 FE0F ; fully-qualified # ๐คฝ๐ฝโโ๏ธ man playing water polo: medium skin tone | |
| 2232 | +1F93D 1F3FD 200D 2642 ; minimally-qualified # ๐คฝ๐ฝโโ man playing water polo: medium skin tone | |
| 2233 | +1F93D 1F3FE 200D 2642 FE0F ; fully-qualified # ๐คฝ๐พโโ๏ธ man playing water polo: medium-dark skin tone | |
| 2234 | +1F93D 1F3FE 200D 2642 ; minimally-qualified # ๐คฝ๐พโโ man playing water polo: medium-dark skin tone | |
| 2235 | +1F93D 1F3FF 200D 2642 FE0F ; fully-qualified # ๐คฝ๐ฟโโ๏ธ man playing water polo: dark skin tone | |
| 2236 | +1F93D 1F3FF 200D 2642 ; minimally-qualified # ๐คฝ๐ฟโโ man playing water polo: dark skin tone | |
| 2237 | +1F93D 200D 2640 FE0F ; fully-qualified # ๐คฝโโ๏ธ woman playing water polo | |
| 2238 | +1F93D 200D 2640 ; minimally-qualified # ๐คฝโโ woman playing water polo | |
| 2239 | +1F93D 1F3FB 200D 2640 FE0F ; fully-qualified # ๐คฝ๐ปโโ๏ธ woman playing water polo: light skin tone | |
| 2240 | +1F93D 1F3FB 200D 2640 ; minimally-qualified # ๐คฝ๐ปโโ woman playing water polo: light skin tone | |
| 2241 | +1F93D 1F3FC 200D 2640 FE0F ; fully-qualified # ๐คฝ๐ผโโ๏ธ woman playing water polo: medium-light skin tone | |
| 2242 | +1F93D 1F3FC 200D 2640 ; minimally-qualified # ๐คฝ๐ผโโ woman playing water polo: medium-light skin tone | |
| 2243 | +1F93D 1F3FD 200D 2640 FE0F ; fully-qualified # ๐คฝ๐ฝโโ๏ธ woman playing water polo: medium skin tone | |
| 2244 | +1F93D 1F3FD 200D 2640 ; minimally-qualified # ๐คฝ๐ฝโโ woman playing water polo: medium skin tone | |
| 2245 | +1F93D 1F3FE 200D 2640 FE0F ; fully-qualified # ๐คฝ๐พโโ๏ธ woman playing water polo: medium-dark skin tone | |
| 2246 | +1F93D 1F3FE 200D 2640 ; minimally-qualified # ๐คฝ๐พโโ woman playing water polo: medium-dark skin tone | |
| 2247 | +1F93D 1F3FF 200D 2640 FE0F ; fully-qualified # ๐คฝ๐ฟโโ๏ธ woman playing water polo: dark skin tone | |
| 2248 | +1F93D 1F3FF 200D 2640 ; minimally-qualified # ๐คฝ๐ฟโโ woman playing water polo: dark skin tone | |
| 2249 | +1F93E ; fully-qualified # ๐คพ person playing handball | |
| 2250 | +1F93E 1F3FB ; fully-qualified # ๐คพ๐ป person playing handball: light skin tone | |
| 2251 | +1F93E 1F3FC ; fully-qualified # ๐คพ๐ผ person playing handball: medium-light skin tone | |
| 2252 | +1F93E 1F3FD ; fully-qualified # ๐คพ๐ฝ person playing handball: medium skin tone | |
| 2253 | +1F93E 1F3FE ; fully-qualified # ๐คพ๐พ person playing handball: medium-dark skin tone | |
| 2254 | +1F93E 1F3FF ; fully-qualified # ๐คพ๐ฟ person playing handball: dark skin tone | |
| 2255 | +1F93E 200D 2642 FE0F ; fully-qualified # ๐คพโโ๏ธ man playing handball | |
| 2256 | +1F93E 200D 2642 ; minimally-qualified # ๐คพโโ man playing handball | |
| 2257 | +1F93E 1F3FB 200D 2642 FE0F ; fully-qualified # ๐คพ๐ปโโ๏ธ man playing handball: light skin tone | |
| 2258 | +1F93E 1F3FB 200D 2642 ; minimally-qualified # ๐คพ๐ปโโ man playing handball: light skin tone | |
| 2259 | +1F93E 1F3FC 200D 2642 FE0F ; fully-qualified # ๐คพ๐ผโโ๏ธ man playing handball: medium-light skin tone | |
| 2260 | +1F93E 1F3FC 200D 2642 ; minimally-qualified # ๐คพ๐ผโโ man playing handball: medium-light skin tone | |
| 2261 | +1F93E 1F3FD 200D 2642 FE0F ; fully-qualified # ๐คพ๐ฝโโ๏ธ man playing handball: medium skin tone | |
| 2262 | +1F93E 1F3FD 200D 2642 ; minimally-qualified # ๐คพ๐ฝโโ man playing handball: medium skin tone | |
| 2263 | +1F93E 1F3FE 200D 2642 FE0F ; fully-qualified # ๐คพ๐พโโ๏ธ man playing handball: medium-dark skin tone | |
| 2264 | +1F93E 1F3FE 200D 2642 ; minimally-qualified # ๐คพ๐พโโ man playing handball: medium-dark skin tone | |
| 2265 | +1F93E 1F3FF 200D 2642 FE0F ; fully-qualified # ๐คพ๐ฟโโ๏ธ man playing handball: dark skin tone | |
| 2266 | +1F93E 1F3FF 200D 2642 ; minimally-qualified # ๐คพ๐ฟโโ man playing handball: dark skin tone | |
| 2267 | +1F93E 200D 2640 FE0F ; fully-qualified # ๐คพโโ๏ธ woman playing handball | |
| 2268 | +1F93E 200D 2640 ; minimally-qualified # ๐คพโโ woman playing handball | |
| 2269 | +1F93E 1F3FB 200D 2640 FE0F ; fully-qualified # ๐คพ๐ปโโ๏ธ woman playing handball: light skin tone | |
| 2270 | +1F93E 1F3FB 200D 2640 ; minimally-qualified # ๐คพ๐ปโโ woman playing handball: light skin tone | |
| 2271 | +1F93E 1F3FC 200D 2640 FE0F ; fully-qualified # ๐คพ๐ผโโ๏ธ woman playing handball: medium-light skin tone | |
| 2272 | +1F93E 1F3FC 200D 2640 ; minimally-qualified # ๐คพ๐ผโโ woman playing handball: medium-light skin tone | |
| 2273 | +1F93E 1F3FD 200D 2640 FE0F ; fully-qualified # ๐คพ๐ฝโโ๏ธ woman playing handball: medium skin tone | |
| 2274 | +1F93E 1F3FD 200D 2640 ; minimally-qualified # ๐คพ๐ฝโโ woman playing handball: medium skin tone | |
| 2275 | +1F93E 1F3FE 200D 2640 FE0F ; fully-qualified # ๐คพ๐พโโ๏ธ woman playing handball: medium-dark skin tone | |
| 2276 | +1F93E 1F3FE 200D 2640 ; minimally-qualified # ๐คพ๐พโโ woman playing handball: medium-dark skin tone | |
| 2277 | +1F93E 1F3FF 200D 2640 FE0F ; fully-qualified # ๐คพ๐ฟโโ๏ธ woman playing handball: dark skin tone | |
| 2278 | +1F93E 1F3FF 200D 2640 ; minimally-qualified # ๐คพ๐ฟโโ woman playing handball: dark skin tone | |
| 2279 | +1F939 ; fully-qualified # ๐คน person juggling | |
| 2280 | +1F939 1F3FB ; fully-qualified # ๐คน๐ป person juggling: light skin tone | |
| 2281 | +1F939 1F3FC ; fully-qualified # ๐คน๐ผ person juggling: medium-light skin tone | |
| 2282 | +1F939 1F3FD ; fully-qualified # ๐คน๐ฝ person juggling: medium skin tone | |
| 2283 | +1F939 1F3FE ; fully-qualified # ๐คน๐พ person juggling: medium-dark skin tone | |
| 2284 | +1F939 1F3FF ; fully-qualified # ๐คน๐ฟ person juggling: dark skin tone | |
| 2285 | +1F939 200D 2642 FE0F ; fully-qualified # ๐คนโโ๏ธ man juggling | |
| 2286 | +1F939 200D 2642 ; minimally-qualified # ๐คนโโ man juggling | |
| 2287 | +1F939 1F3FB 200D 2642 FE0F ; fully-qualified # ๐คน๐ปโโ๏ธ man juggling: light skin tone | |
| 2288 | +1F939 1F3FB 200D 2642 ; minimally-qualified # ๐คน๐ปโโ man juggling: light skin tone | |
| 2289 | +1F939 1F3FC 200D 2642 FE0F ; fully-qualified # ๐คน๐ผโโ๏ธ man juggling: medium-light skin tone | |
| 2290 | +1F939 1F3FC 200D 2642 ; minimally-qualified # ๐คน๐ผโโ man juggling: medium-light skin tone | |
| 2291 | +1F939 1F3FD 200D 2642 FE0F ; fully-qualified # ๐คน๐ฝโโ๏ธ man juggling: medium skin tone | |
| 2292 | +1F939 1F3FD 200D 2642 ; minimally-qualified # ๐คน๐ฝโโ man juggling: medium skin tone | |
| 2293 | +1F939 1F3FE 200D 2642 FE0F ; fully-qualified # ๐คน๐พโโ๏ธ man juggling: medium-dark skin tone | |
| 2294 | +1F939 1F3FE 200D 2642 ; minimally-qualified # ๐คน๐พโโ man juggling: medium-dark skin tone | |
| 2295 | +1F939 1F3FF 200D 2642 FE0F ; fully-qualified # ๐คน๐ฟโโ๏ธ man juggling: dark skin tone | |
| 2296 | +1F939 1F3FF 200D 2642 ; minimally-qualified # ๐คน๐ฟโโ man juggling: dark skin tone | |
| 2297 | +1F939 200D 2640 FE0F ; fully-qualified # ๐คนโโ๏ธ woman juggling | |
| 2298 | +1F939 200D 2640 ; minimally-qualified # ๐คนโโ woman juggling | |
| 2299 | +1F939 1F3FB 200D 2640 FE0F ; fully-qualified # ๐คน๐ปโโ๏ธ woman juggling: light skin tone | |
| 2300 | +1F939 1F3FB 200D 2640 ; minimally-qualified # ๐คน๐ปโโ woman juggling: light skin tone | |
| 2301 | +1F939 1F3FC 200D 2640 FE0F ; fully-qualified # ๐คน๐ผโโ๏ธ woman juggling: medium-light skin tone | |
| 2302 | +1F939 1F3FC 200D 2640 ; minimally-qualified # ๐คน๐ผโโ woman juggling: medium-light skin tone | |
| 2303 | +1F939 1F3FD 200D 2640 FE0F ; fully-qualified # ๐คน๐ฝโโ๏ธ woman juggling: medium skin tone | |
| 2304 | +1F939 1F3FD 200D 2640 ; minimally-qualified # ๐คน๐ฝโโ woman juggling: medium skin tone | |
| 2305 | +1F939 1F3FE 200D 2640 FE0F ; fully-qualified # ๐คน๐พโโ๏ธ woman juggling: medium-dark skin tone | |
| 2306 | +1F939 1F3FE 200D 2640 ; minimally-qualified # ๐คน๐พโโ woman juggling: medium-dark skin tone | |
| 2307 | +1F939 1F3FF 200D 2640 FE0F ; fully-qualified # ๐คน๐ฟโโ๏ธ woman juggling: dark skin tone | |
| 2308 | +1F939 1F3FF 200D 2640 ; minimally-qualified # ๐คน๐ฟโโ woman juggling: dark skin tone | |
| 2309 | + | |
| 2310 | +# subgroup: person-resting | |
| 2311 | +1F9D8 ; fully-qualified # ๐ง person in lotus position | |
| 2312 | +1F9D8 1F3FB ; fully-qualified # ๐ง๐ป person in lotus position: light skin tone | |
| 2313 | +1F9D8 1F3FC ; fully-qualified # ๐ง๐ผ person in lotus position: medium-light skin tone | |
| 2314 | +1F9D8 1F3FD ; fully-qualified # ๐ง๐ฝ person in lotus position: medium skin tone | |
| 2315 | +1F9D8 1F3FE ; fully-qualified # ๐ง๐พ person in lotus position: medium-dark skin tone | |
| 2316 | +1F9D8 1F3FF ; fully-qualified # ๐ง๐ฟ person in lotus position: dark skin tone | |
| 2317 | +1F9D8 200D 2642 FE0F ; fully-qualified # ๐งโโ๏ธ man in lotus position | |
| 2318 | +1F9D8 200D 2642 ; minimally-qualified # ๐งโโ man in lotus position | |
| 2319 | +1F9D8 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ man in lotus position: light skin tone | |
| 2320 | +1F9D8 1F3FB 200D 2642 ; minimally-qualified # ๐ง๐ปโโ man in lotus position: light skin tone | |
| 2321 | +1F9D8 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ man in lotus position: medium-light skin tone | |
| 2322 | +1F9D8 1F3FC 200D 2642 ; minimally-qualified # ๐ง๐ผโโ man in lotus position: medium-light skin tone | |
| 2323 | +1F9D8 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ man in lotus position: medium skin tone | |
| 2324 | +1F9D8 1F3FD 200D 2642 ; minimally-qualified # ๐ง๐ฝโโ man in lotus position: medium skin tone | |
| 2325 | +1F9D8 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ man in lotus position: medium-dark skin tone | |
| 2326 | +1F9D8 1F3FE 200D 2642 ; minimally-qualified # ๐ง๐พโโ man in lotus position: medium-dark skin tone | |
| 2327 | +1F9D8 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ man in lotus position: dark skin tone | |
| 2328 | +1F9D8 1F3FF 200D 2642 ; minimally-qualified # ๐ง๐ฟโโ man in lotus position: dark skin tone | |
| 2329 | +1F9D8 200D 2640 FE0F ; fully-qualified # ๐งโโ๏ธ woman in lotus position | |
| 2330 | +1F9D8 200D 2640 ; minimally-qualified # ๐งโโ woman in lotus position | |
| 2331 | +1F9D8 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ง๐ปโโ๏ธ woman in lotus position: light skin tone | |
| 2332 | +1F9D8 1F3FB 200D 2640 ; minimally-qualified # ๐ง๐ปโโ woman in lotus position: light skin tone | |
| 2333 | +1F9D8 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ง๐ผโโ๏ธ woman in lotus position: medium-light skin tone | |
| 2334 | +1F9D8 1F3FC 200D 2640 ; minimally-qualified # ๐ง๐ผโโ woman in lotus position: medium-light skin tone | |
| 2335 | +1F9D8 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ง๐ฝโโ๏ธ woman in lotus position: medium skin tone | |
| 2336 | +1F9D8 1F3FD 200D 2640 ; minimally-qualified # ๐ง๐ฝโโ woman in lotus position: medium skin tone | |
| 2337 | +1F9D8 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ง๐พโโ๏ธ woman in lotus position: medium-dark skin tone | |
| 2338 | +1F9D8 1F3FE 200D 2640 ; minimally-qualified # ๐ง๐พโโ woman in lotus position: medium-dark skin tone | |
| 2339 | +1F9D8 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ง๐ฟโโ๏ธ woman in lotus position: dark skin tone | |
| 2340 | +1F9D8 1F3FF 200D 2640 ; minimally-qualified # ๐ง๐ฟโโ woman in lotus position: dark skin tone | |
| 2341 | +1F6C0 ; fully-qualified # ๐ person taking bath | |
| 2342 | +1F6C0 1F3FB ; fully-qualified # ๐๐ป person taking bath: light skin tone | |
| 2343 | +1F6C0 1F3FC ; fully-qualified # ๐๐ผ person taking bath: medium-light skin tone | |
| 2344 | +1F6C0 1F3FD ; fully-qualified # ๐๐ฝ person taking bath: medium skin tone | |
| 2345 | +1F6C0 1F3FE ; fully-qualified # ๐๐พ person taking bath: medium-dark skin tone | |
| 2346 | +1F6C0 1F3FF ; fully-qualified # ๐๐ฟ person taking bath: dark skin tone | |
| 2347 | +1F6CC ; fully-qualified # ๐ person in bed | |
| 2348 | +1F6CC 1F3FB ; fully-qualified # ๐๐ป person in bed: light skin tone | |
| 2349 | +1F6CC 1F3FC ; fully-qualified # ๐๐ผ person in bed: medium-light skin tone | |
| 2350 | +1F6CC 1F3FD ; fully-qualified # ๐๐ฝ person in bed: medium skin tone | |
| 2351 | +1F6CC 1F3FE ; fully-qualified # ๐๐พ person in bed: medium-dark skin tone | |
| 2352 | +1F6CC 1F3FF ; fully-qualified # ๐๐ฟ person in bed: dark skin tone | |
| 2353 | + | |
| 2354 | +# subgroup: family | |
| 2355 | +1F9D1 200D 1F91D 200D 1F9D1 ; fully-qualified # ๐งโ๐คโ๐ง people holding hands | |
| 2356 | +1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # ๐ง๐ปโ๐คโ๐ง๐ป people holding hands: light skin tone | |
| 2357 | +1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # ๐ง๐ผโ๐คโ๐ง๐ป people holding hands: medium-light skin tone, light skin tone | |
| 2358 | +1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # ๐ง๐ผโ๐คโ๐ง๐ผ people holding hands: medium-light skin tone | |
| 2359 | +1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # ๐ง๐ฝโ๐คโ๐ง๐ป people holding hands: medium skin tone, light skin tone | |
| 2360 | +1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # ๐ง๐ฝโ๐คโ๐ง๐ผ people holding hands: medium skin tone, medium-light skin tone | |
| 2361 | +1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # ๐ง๐ฝโ๐คโ๐ง๐ฝ people holding hands: medium skin tone | |
| 2362 | +1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # ๐ง๐พโ๐คโ๐ง๐ป people holding hands: medium-dark skin tone, light skin tone | |
| 2363 | +1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # ๐ง๐พโ๐คโ๐ง๐ผ people holding hands: medium-dark skin tone, medium-light skin tone | |
| 2364 | +1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # ๐ง๐พโ๐คโ๐ง๐ฝ people holding hands: medium-dark skin tone, medium skin tone | |
| 2365 | +1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FE ; fully-qualified # ๐ง๐พโ๐คโ๐ง๐พ people holding hands: medium-dark skin tone | |
| 2366 | +1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # ๐ง๐ฟโ๐คโ๐ง๐ป people holding hands: dark skin tone, light skin tone | |
| 2367 | +1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # ๐ง๐ฟโ๐คโ๐ง๐ผ people holding hands: dark skin tone, medium-light skin tone | |
| 2368 | +1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # ๐ง๐ฟโ๐คโ๐ง๐ฝ people holding hands: dark skin tone, medium skin tone | |
| 2369 | +1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FE ; fully-qualified # ๐ง๐ฟโ๐คโ๐ง๐พ people holding hands: dark skin tone, medium-dark skin tone | |
| 2370 | +1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FF ; fully-qualified # ๐ง๐ฟโ๐คโ๐ง๐ฟ people holding hands: dark skin tone | |
| 2371 | +1F46D ; fully-qualified # ๐ญ women holding hands | |
| 2372 | +1F46D 1F3FB ; fully-qualified # ๐ญ๐ป women holding hands: light skin tone | |
| 2373 | +1F469 1F3FC 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # ๐ฉ๐ผโ๐คโ๐ฉ๐ป women holding hands: medium-light skin tone, light skin tone | |
| 2374 | +1F46D 1F3FC ; fully-qualified # ๐ญ๐ผ women holding hands: medium-light skin tone | |
| 2375 | +1F469 1F3FD 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # ๐ฉ๐ฝโ๐คโ๐ฉ๐ป women holding hands: medium skin tone, light skin tone | |
| 2376 | +1F469 1F3FD 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # ๐ฉ๐ฝโ๐คโ๐ฉ๐ผ women holding hands: medium skin tone, medium-light skin tone | |
| 2377 | +1F46D 1F3FD ; fully-qualified # ๐ญ๐ฝ women holding hands: medium skin tone | |
| 2378 | +1F469 1F3FE 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # ๐ฉ๐พโ๐คโ๐ฉ๐ป women holding hands: medium-dark skin tone, light skin tone | |
| 2379 | +1F469 1F3FE 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # ๐ฉ๐พโ๐คโ๐ฉ๐ผ women holding hands: medium-dark skin tone, medium-light skin tone | |
| 2380 | +1F469 1F3FE 200D 1F91D 200D 1F469 1F3FD ; fully-qualified # ๐ฉ๐พโ๐คโ๐ฉ๐ฝ women holding hands: medium-dark skin tone, medium skin tone | |
| 2381 | +1F46D 1F3FE ; fully-qualified # ๐ญ๐พ women holding hands: medium-dark skin tone | |
| 2382 | +1F469 1F3FF 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # ๐ฉ๐ฟโ๐คโ๐ฉ๐ป women holding hands: dark skin tone, light skin tone | |
| 2383 | +1F469 1F3FF 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # ๐ฉ๐ฟโ๐คโ๐ฉ๐ผ women holding hands: dark skin tone, medium-light skin tone | |
| 2384 | +1F469 1F3FF 200D 1F91D 200D 1F469 1F3FD ; fully-qualified # ๐ฉ๐ฟโ๐คโ๐ฉ๐ฝ women holding hands: dark skin tone, medium skin tone | |
| 2385 | +1F469 1F3FF 200D 1F91D 200D 1F469 1F3FE ; fully-qualified # ๐ฉ๐ฟโ๐คโ๐ฉ๐พ women holding hands: dark skin tone, medium-dark skin tone | |
| 2386 | +1F46D 1F3FF ; fully-qualified # ๐ญ๐ฟ women holding hands: dark skin tone | |
| 2387 | +1F46B ; fully-qualified # ๐ซ woman and man holding hands | |
| 2388 | +1F46B 1F3FB ; fully-qualified # ๐ซ๐ป woman and man holding hands: light skin tone | |
| 2389 | +1F469 1F3FB 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐ฉ๐ปโ๐คโ๐จ๐ผ woman and man holding hands: light skin tone, medium-light skin tone | |
| 2390 | +1F469 1F3FB 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐ฉ๐ปโ๐คโ๐จ๐ฝ woman and man holding hands: light skin tone, medium skin tone | |
| 2391 | +1F469 1F3FB 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # ๐ฉ๐ปโ๐คโ๐จ๐พ woman and man holding hands: light skin tone, medium-dark skin tone | |
| 2392 | +1F469 1F3FB 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # ๐ฉ๐ปโ๐คโ๐จ๐ฟ woman and man holding hands: light skin tone, dark skin tone | |
| 2393 | +1F469 1F3FC 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐ฉ๐ผโ๐คโ๐จ๐ป woman and man holding hands: medium-light skin tone, light skin tone | |
| 2394 | +1F46B 1F3FC ; fully-qualified # ๐ซ๐ผ woman and man holding hands: medium-light skin tone | |
| 2395 | +1F469 1F3FC 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐ฉ๐ผโ๐คโ๐จ๐ฝ woman and man holding hands: medium-light skin tone, medium skin tone | |
| 2396 | +1F469 1F3FC 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # ๐ฉ๐ผโ๐คโ๐จ๐พ woman and man holding hands: medium-light skin tone, medium-dark skin tone | |
| 2397 | +1F469 1F3FC 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # ๐ฉ๐ผโ๐คโ๐จ๐ฟ woman and man holding hands: medium-light skin tone, dark skin tone | |
| 2398 | +1F469 1F3FD 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐ฉ๐ฝโ๐คโ๐จ๐ป woman and man holding hands: medium skin tone, light skin tone | |
| 2399 | +1F469 1F3FD 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐ฉ๐ฝโ๐คโ๐จ๐ผ woman and man holding hands: medium skin tone, medium-light skin tone | |
| 2400 | +1F46B 1F3FD ; fully-qualified # ๐ซ๐ฝ woman and man holding hands: medium skin tone | |
| 2401 | +1F469 1F3FD 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # ๐ฉ๐ฝโ๐คโ๐จ๐พ woman and man holding hands: medium skin tone, medium-dark skin tone | |
| 2402 | +1F469 1F3FD 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # ๐ฉ๐ฝโ๐คโ๐จ๐ฟ woman and man holding hands: medium skin tone, dark skin tone | |
| 2403 | +1F469 1F3FE 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐ฉ๐พโ๐คโ๐จ๐ป woman and man holding hands: medium-dark skin tone, light skin tone | |
| 2404 | +1F469 1F3FE 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐ฉ๐พโ๐คโ๐จ๐ผ woman and man holding hands: medium-dark skin tone, medium-light skin tone | |
| 2405 | +1F469 1F3FE 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐ฉ๐พโ๐คโ๐จ๐ฝ woman and man holding hands: medium-dark skin tone, medium skin tone | |
| 2406 | +1F46B 1F3FE ; fully-qualified # ๐ซ๐พ woman and man holding hands: medium-dark skin tone | |
| 2407 | +1F469 1F3FE 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # ๐ฉ๐พโ๐คโ๐จ๐ฟ woman and man holding hands: medium-dark skin tone, dark skin tone | |
| 2408 | +1F469 1F3FF 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐ฉ๐ฟโ๐คโ๐จ๐ป woman and man holding hands: dark skin tone, light skin tone | |
| 2409 | +1F469 1F3FF 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐ฉ๐ฟโ๐คโ๐จ๐ผ woman and man holding hands: dark skin tone, medium-light skin tone | |
| 2410 | +1F469 1F3FF 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐ฉ๐ฟโ๐คโ๐จ๐ฝ woman and man holding hands: dark skin tone, medium skin tone | |
| 2411 | +1F469 1F3FF 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # ๐ฉ๐ฟโ๐คโ๐จ๐พ woman and man holding hands: dark skin tone, medium-dark skin tone | |
| 2412 | +1F46B 1F3FF ; fully-qualified # ๐ซ๐ฟ woman and man holding hands: dark skin tone | |
| 2413 | +1F46C ; fully-qualified # ๐ฌ men holding hands | |
| 2414 | +1F46C 1F3FB ; fully-qualified # ๐ฌ๐ป men holding hands: light skin tone | |
| 2415 | +1F468 1F3FC 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐จ๐ผโ๐คโ๐จ๐ป men holding hands: medium-light skin tone, light skin tone | |
| 2416 | +1F46C 1F3FC ; fully-qualified # ๐ฌ๐ผ men holding hands: medium-light skin tone | |
| 2417 | +1F468 1F3FD 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐จ๐ฝโ๐คโ๐จ๐ป men holding hands: medium skin tone, light skin tone | |
| 2418 | +1F468 1F3FD 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐จ๐ฝโ๐คโ๐จ๐ผ men holding hands: medium skin tone, medium-light skin tone | |
| 2419 | +1F46C 1F3FD ; fully-qualified # ๐ฌ๐ฝ men holding hands: medium skin tone | |
| 2420 | +1F468 1F3FE 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐จ๐พโ๐คโ๐จ๐ป men holding hands: medium-dark skin tone, light skin tone | |
| 2421 | +1F468 1F3FE 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐จ๐พโ๐คโ๐จ๐ผ men holding hands: medium-dark skin tone, medium-light skin tone | |
| 2422 | +1F468 1F3FE 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐จ๐พโ๐คโ๐จ๐ฝ men holding hands: medium-dark skin tone, medium skin tone | |
| 2423 | +1F46C 1F3FE ; fully-qualified # ๐ฌ๐พ men holding hands: medium-dark skin tone | |
| 2424 | +1F468 1F3FF 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐จ๐ฟโ๐คโ๐จ๐ป men holding hands: dark skin tone, light skin tone | |
| 2425 | +1F468 1F3FF 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐จ๐ฟโ๐คโ๐จ๐ผ men holding hands: dark skin tone, medium-light skin tone | |
| 2426 | +1F468 1F3FF 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐จ๐ฟโ๐คโ๐จ๐ฝ men holding hands: dark skin tone, medium skin tone | |
| 2427 | +1F468 1F3FF 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # ๐จ๐ฟโ๐คโ๐จ๐พ men holding hands: dark skin tone, medium-dark skin tone | |
| 2428 | +1F46C 1F3FF ; fully-qualified # ๐ฌ๐ฟ men holding hands: dark skin tone | |
| 2429 | +1F48F ; fully-qualified # ๐ kiss | |
| 2430 | +1F469 200D 2764 FE0F 200D 1F48B 200D 1F468 ; fully-qualified # ๐ฉโโค๏ธโ๐โ๐จ kiss: woman, man | |
| 2431 | +1F469 200D 2764 200D 1F48B 200D 1F468 ; minimally-qualified # ๐ฉโโคโ๐โ๐จ kiss: woman, man | |
| 2432 | +1F468 200D 2764 FE0F 200D 1F48B 200D 1F468 ; fully-qualified # ๐จโโค๏ธโ๐โ๐จ kiss: man, man | |
| 2433 | +1F468 200D 2764 200D 1F48B 200D 1F468 ; minimally-qualified # ๐จโโคโ๐โ๐จ kiss: man, man | |
| 2434 | +1F469 200D 2764 FE0F 200D 1F48B 200D 1F469 ; fully-qualified # ๐ฉโโค๏ธโ๐โ๐ฉ kiss: woman, woman | |
| 2435 | +1F469 200D 2764 200D 1F48B 200D 1F469 ; minimally-qualified # ๐ฉโโคโ๐โ๐ฉ kiss: woman, woman | |
| 2436 | +1F491 ; fully-qualified # ๐ couple with heart | |
| 2437 | +1F469 200D 2764 FE0F 200D 1F468 ; fully-qualified # ๐ฉโโค๏ธโ๐จ couple with heart: woman, man | |
| 2438 | +1F469 200D 2764 200D 1F468 ; minimally-qualified # ๐ฉโโคโ๐จ couple with heart: woman, man | |
| 2439 | +1F468 200D 2764 FE0F 200D 1F468 ; fully-qualified # ๐จโโค๏ธโ๐จ couple with heart: man, man | |
| 2440 | +1F468 200D 2764 200D 1F468 ; minimally-qualified # ๐จโโคโ๐จ couple with heart: man, man | |
| 2441 | +1F469 200D 2764 FE0F 200D 1F469 ; fully-qualified # ๐ฉโโค๏ธโ๐ฉ couple with heart: woman, woman | |
| 2442 | +1F469 200D 2764 200D 1F469 ; minimally-qualified # ๐ฉโโคโ๐ฉ couple with heart: woman, woman | |
| 2443 | +1F46A ; fully-qualified # ๐ช family | |
| 2444 | +1F468 200D 1F469 200D 1F466 ; fully-qualified # ๐จโ๐ฉโ๐ฆ family: man, woman, boy | |
| 2445 | +1F468 200D 1F469 200D 1F467 ; fully-qualified # ๐จโ๐ฉโ๐ง family: man, woman, girl | |
| 2446 | +1F468 200D 1F469 200D 1F467 200D 1F466 ; fully-qualified # ๐จโ๐ฉโ๐งโ๐ฆ family: man, woman, girl, boy | |
| 2447 | +1F468 200D 1F469 200D 1F466 200D 1F466 ; fully-qualified # ๐จโ๐ฉโ๐ฆโ๐ฆ family: man, woman, boy, boy | |
| 2448 | +1F468 200D 1F469 200D 1F467 200D 1F467 ; fully-qualified # ๐จโ๐ฉโ๐งโ๐ง family: man, woman, girl, girl | |
| 2449 | +1F468 200D 1F468 200D 1F466 ; fully-qualified # ๐จโ๐จโ๐ฆ family: man, man, boy | |
| 2450 | +1F468 200D 1F468 200D 1F467 ; fully-qualified # ๐จโ๐จโ๐ง family: man, man, girl | |
| 2451 | +1F468 200D 1F468 200D 1F467 200D 1F466 ; fully-qualified # ๐จโ๐จโ๐งโ๐ฆ family: man, man, girl, boy | |
| 2452 | +1F468 200D 1F468 200D 1F466 200D 1F466 ; fully-qualified # ๐จโ๐จโ๐ฆโ๐ฆ family: man, man, boy, boy | |
| 2453 | +1F468 200D 1F468 200D 1F467 200D 1F467 ; fully-qualified # ๐จโ๐จโ๐งโ๐ง family: man, man, girl, girl | |
| 2454 | +1F469 200D 1F469 200D 1F466 ; fully-qualified # ๐ฉโ๐ฉโ๐ฆ family: woman, woman, boy | |
| 2455 | +1F469 200D 1F469 200D 1F467 ; fully-qualified # ๐ฉโ๐ฉโ๐ง family: woman, woman, girl | |
| 2456 | +1F469 200D 1F469 200D 1F467 200D 1F466 ; fully-qualified # ๐ฉโ๐ฉโ๐งโ๐ฆ family: woman, woman, girl, boy | |
| 2457 | +1F469 200D 1F469 200D 1F466 200D 1F466 ; fully-qualified # ๐ฉโ๐ฉโ๐ฆโ๐ฆ family: woman, woman, boy, boy | |
| 2458 | +1F469 200D 1F469 200D 1F467 200D 1F467 ; fully-qualified # ๐ฉโ๐ฉโ๐งโ๐ง family: woman, woman, girl, girl | |
| 2459 | +1F468 200D 1F466 ; fully-qualified # ๐จโ๐ฆ family: man, boy | |
| 2460 | +1F468 200D 1F466 200D 1F466 ; fully-qualified # ๐จโ๐ฆโ๐ฆ family: man, boy, boy | |
| 2461 | +1F468 200D 1F467 ; fully-qualified # ๐จโ๐ง family: man, girl | |
| 2462 | +1F468 200D 1F467 200D 1F466 ; fully-qualified # ๐จโ๐งโ๐ฆ family: man, girl, boy | |
| 2463 | +1F468 200D 1F467 200D 1F467 ; fully-qualified # ๐จโ๐งโ๐ง family: man, girl, girl | |
| 2464 | +1F469 200D 1F466 ; fully-qualified # ๐ฉโ๐ฆ family: woman, boy | |
| 2465 | +1F469 200D 1F466 200D 1F466 ; fully-qualified # ๐ฉโ๐ฆโ๐ฆ family: woman, boy, boy | |
| 2466 | +1F469 200D 1F467 ; fully-qualified # ๐ฉโ๐ง family: woman, girl | |
| 2467 | +1F469 200D 1F467 200D 1F466 ; fully-qualified # ๐ฉโ๐งโ๐ฆ family: woman, girl, boy | |
| 2468 | +1F469 200D 1F467 200D 1F467 ; fully-qualified # ๐ฉโ๐งโ๐ง family: woman, girl, girl | |
| 2469 | + | |
| 2470 | +# subgroup: person-symbol | |
| 2471 | +1F5E3 FE0F ; fully-qualified # ๐ฃ๏ธ speaking head | |
| 2472 | +1F5E3 ; unqualified # ๐ฃ speaking head | |
| 2473 | +1F464 ; fully-qualified # ๐ค bust in silhouette | |
| 2474 | +1F465 ; fully-qualified # ๐ฅ busts in silhouette | |
| 2475 | +1F463 ; fully-qualified # ๐ฃ footprints | |
| 2476 | + | |
| 2477 | +# People & Body subtotal: 2212 | |
| 2478 | +# People & Body subtotal: 447 w/o modifiers | |
| 2479 | + | |
| 2480 | +# group: Component | |
| 2481 | + | |
| 2482 | +# subgroup: skin-tone | |
| 2483 | +1F3FB ; component # ๐ป light skin tone | |
| 2484 | +1F3FC ; component # ๐ผ medium-light skin tone | |
| 2485 | +1F3FD ; component # ๐ฝ medium skin tone | |
| 2486 | +1F3FE ; component # ๐พ medium-dark skin tone | |
| 2487 | +1F3FF ; component # ๐ฟ dark skin tone | |
| 2488 | + | |
| 2489 | +# subgroup: hair-style | |
| 2490 | +1F9B0 ; component # ๐ฆฐ red hair | |
| 2491 | +1F9B1 ; component # ๐ฆฑ curly hair | |
| 2492 | +1F9B3 ; component # ๐ฆณ white hair | |
| 2493 | +1F9B2 ; component # ๐ฆฒ bald | |
| 2494 | + | |
| 2495 | +# Component subtotal: 9 | |
| 2496 | +# Component subtotal: 4 w/o modifiers | |
| 2497 | + | |
| 2498 | +# group: Animals & Nature | |
| 2499 | + | |
| 2500 | +# subgroup: animal-mammal | |
| 2501 | +1F435 ; fully-qualified # ๐ต monkey face | |
| 2502 | +1F412 ; fully-qualified # ๐ monkey | |
| 2503 | +1F98D ; fully-qualified # ๐ฆ gorilla | |
| 2504 | +1F9A7 ; fully-qualified # ๐ฆง orangutan | |
| 2505 | +1F436 ; fully-qualified # ๐ถ dog face | |
| 2506 | +1F415 ; fully-qualified # ๐ dog | |
| 2507 | +1F9AE ; fully-qualified # ๐ฆฎ guide dog | |
| 2508 | +1F415 200D 1F9BA ; fully-qualified # ๐โ๐ฆบ service dog | |
| 2509 | +1F429 ; fully-qualified # ๐ฉ poodle | |
| 2510 | +1F43A ; fully-qualified # ๐บ wolf | |
| 2511 | +1F98A ; fully-qualified # ๐ฆ fox | |
| 2512 | +1F99D ; fully-qualified # ๐ฆ raccoon | |
| 2513 | +1F431 ; fully-qualified # ๐ฑ cat face | |
| 2514 | +1F408 ; fully-qualified # ๐ cat | |
| 2515 | +1F981 ; fully-qualified # ๐ฆ lion | |
| 2516 | +1F42F ; fully-qualified # ๐ฏ tiger face | |
| 2517 | +1F405 ; fully-qualified # ๐ tiger | |
| 2518 | +1F406 ; fully-qualified # ๐ leopard | |
| 2519 | +1F434 ; fully-qualified # ๐ด horse face | |
| 2520 | +1F40E ; fully-qualified # ๐ horse | |
| 2521 | +1F984 ; fully-qualified # ๐ฆ unicorn | |
| 2522 | +1F993 ; fully-qualified # ๐ฆ zebra | |
| 2523 | +1F98C ; fully-qualified # ๐ฆ deer | |
| 2524 | +1F42E ; fully-qualified # ๐ฎ cow face | |
| 2525 | +1F402 ; fully-qualified # ๐ ox | |
| 2526 | +1F403 ; fully-qualified # ๐ water buffalo | |
| 2527 | +1F404 ; fully-qualified # ๐ cow | |
| 2528 | +1F437 ; fully-qualified # ๐ท pig face | |
| 2529 | +1F416 ; fully-qualified # ๐ pig | |
| 2530 | +1F417 ; fully-qualified # ๐ boar | |
| 2531 | +1F43D ; fully-qualified # ๐ฝ pig nose | |
| 2532 | +1F40F ; fully-qualified # ๐ ram | |
| 2533 | +1F411 ; fully-qualified # ๐ ewe | |
| 2534 | +1F410 ; fully-qualified # ๐ goat | |
| 2535 | +1F42A ; fully-qualified # ๐ช camel | |
| 2536 | +1F42B ; fully-qualified # ๐ซ two-hump camel | |
| 2537 | +1F999 ; fully-qualified # ๐ฆ llama | |
| 2538 | +1F992 ; fully-qualified # ๐ฆ giraffe | |
| 2539 | +1F418 ; fully-qualified # ๐ elephant | |
| 2540 | +1F98F ; fully-qualified # ๐ฆ rhinoceros | |
| 2541 | +1F99B ; fully-qualified # ๐ฆ hippopotamus | |
| 2542 | +1F42D ; fully-qualified # ๐ญ mouse face | |
| 2543 | +1F401 ; fully-qualified # ๐ mouse | |
| 2544 | +1F400 ; fully-qualified # ๐ rat | |
| 2545 | +1F439 ; fully-qualified # ๐น hamster | |
| 2546 | +1F430 ; fully-qualified # ๐ฐ rabbit face | |
| 2547 | +1F407 ; fully-qualified # ๐ rabbit | |
| 2548 | +1F43F FE0F ; fully-qualified # ๐ฟ๏ธ chipmunk | |
| 2549 | +1F43F ; unqualified # ๐ฟ chipmunk | |
| 2550 | +1F994 ; fully-qualified # ๐ฆ hedgehog | |
| 2551 | +1F987 ; fully-qualified # ๐ฆ bat | |
| 2552 | +1F43B ; fully-qualified # ๐ป bear | |
| 2553 | +1F428 ; fully-qualified # ๐จ koala | |
| 2554 | +1F43C ; fully-qualified # ๐ผ panda | |
| 2555 | +1F9A5 ; fully-qualified # ๐ฆฅ sloth | |
| 2556 | +1F9A6 ; fully-qualified # ๐ฆฆ otter | |
| 2557 | +1F9A8 ; fully-qualified # ๐ฆจ skunk | |
| 2558 | +1F998 ; fully-qualified # ๐ฆ kangaroo | |
| 2559 | +1F9A1 ; fully-qualified # ๐ฆก badger | |
| 2560 | +1F43E ; fully-qualified # ๐พ paw prints | |
| 2561 | + | |
| 2562 | +# subgroup: animal-bird | |
| 2563 | +1F983 ; fully-qualified # ๐ฆ turkey | |
| 2564 | +1F414 ; fully-qualified # ๐ chicken | |
| 2565 | +1F413 ; fully-qualified # ๐ rooster | |
| 2566 | +1F423 ; fully-qualified # ๐ฃ hatching chick | |
| 2567 | +1F424 ; fully-qualified # ๐ค baby chick | |
| 2568 | +1F425 ; fully-qualified # ๐ฅ front-facing baby chick | |
| 2569 | +1F426 ; fully-qualified # ๐ฆ bird | |
| 2570 | +1F427 ; fully-qualified # ๐ง penguin | |
| 2571 | +1F54A FE0F ; fully-qualified # ๐๏ธ dove | |
| 2572 | +1F54A ; unqualified # ๐ dove | |
| 2573 | +1F985 ; fully-qualified # ๐ฆ eagle | |
| 2574 | +1F986 ; fully-qualified # ๐ฆ duck | |
| 2575 | +1F9A2 ; fully-qualified # ๐ฆข swan | |
| 2576 | +1F989 ; fully-qualified # ๐ฆ owl | |
| 2577 | +1F9A9 ; fully-qualified # ๐ฆฉ flamingo | |
| 2578 | +1F99A ; fully-qualified # ๐ฆ peacock | |
| 2579 | +1F99C ; fully-qualified # ๐ฆ parrot | |
| 2580 | + | |
| 2581 | +# subgroup: animal-amphibian | |
| 2582 | +1F438 ; fully-qualified # ๐ธ frog | |
| 2583 | + | |
| 2584 | +# subgroup: animal-reptile | |
| 2585 | +1F40A ; fully-qualified # ๐ crocodile | |
| 2586 | +1F422 ; fully-qualified # ๐ข turtle | |
| 2587 | +1F98E ; fully-qualified # ๐ฆ lizard | |
| 2588 | +1F40D ; fully-qualified # ๐ snake | |
| 2589 | +1F432 ; fully-qualified # ๐ฒ dragon face | |
| 2590 | +1F409 ; fully-qualified # ๐ dragon | |
| 2591 | +1F995 ; fully-qualified # ๐ฆ sauropod | |
| 2592 | +1F996 ; fully-qualified # ๐ฆ T-Rex | |
| 2593 | + | |
| 2594 | +# subgroup: animal-marine | |
| 2595 | +1F433 ; fully-qualified # ๐ณ spouting whale | |
| 2596 | +1F40B ; fully-qualified # ๐ whale | |
| 2597 | +1F42C ; fully-qualified # ๐ฌ dolphin | |
| 2598 | +1F41F ; fully-qualified # ๐ fish | |
| 2599 | +1F420 ; fully-qualified # ๐ tropical fish | |
| 2600 | +1F421 ; fully-qualified # ๐ก blowfish | |
| 2601 | +1F988 ; fully-qualified # ๐ฆ shark | |
| 2602 | +1F419 ; fully-qualified # ๐ octopus | |
| 2603 | +1F41A ; fully-qualified # ๐ spiral shell | |
| 2604 | + | |
| 2605 | +# subgroup: animal-bug | |
| 2606 | +1F40C ; fully-qualified # ๐ snail | |
| 2607 | +1F98B ; fully-qualified # ๐ฆ butterfly | |
| 2608 | +1F41B ; fully-qualified # ๐ bug | |
| 2609 | +1F41C ; fully-qualified # ๐ ant | |
| 2610 | +1F41D ; fully-qualified # ๐ honeybee | |
| 2611 | +1F41E ; fully-qualified # ๐ lady beetle | |
| 2612 | +1F997 ; fully-qualified # ๐ฆ cricket | |
| 2613 | +1F577 FE0F ; fully-qualified # ๐ท๏ธ spider | |
| 2614 | +1F577 ; unqualified # ๐ท spider | |
| 2615 | +1F578 FE0F ; fully-qualified # ๐ธ๏ธ spider web | |
| 2616 | +1F578 ; unqualified # ๐ธ spider web | |
| 2617 | +1F982 ; fully-qualified # ๐ฆ scorpion | |
| 2618 | +1F99F ; fully-qualified # ๐ฆ mosquito | |
| 2619 | +1F9A0 ; fully-qualified # ๐ฆ microbe | |
| 2620 | + | |
| 2621 | +# subgroup: plant-flower | |
| 2622 | +1F490 ; fully-qualified # ๐ bouquet | |
| 2623 | +1F338 ; fully-qualified # ๐ธ cherry blossom | |
| 2624 | +1F4AE ; fully-qualified # ๐ฎ white flower | |
| 2625 | +1F3F5 FE0F ; fully-qualified # ๐ต๏ธ rosette | |
| 2626 | +1F3F5 ; unqualified # ๐ต rosette | |
| 2627 | +1F339 ; fully-qualified # ๐น rose | |
| 2628 | +1F940 ; fully-qualified # ๐ฅ wilted flower | |
| 2629 | +1F33A ; fully-qualified # ๐บ hibiscus | |
| 2630 | +1F33B ; fully-qualified # ๐ป sunflower | |
| 2631 | +1F33C ; fully-qualified # ๐ผ blossom | |
| 2632 | +1F337 ; fully-qualified # ๐ท tulip | |
| 2633 | + | |
| 2634 | +# subgroup: plant-other | |
| 2635 | +1F331 ; fully-qualified # ๐ฑ seedling | |
| 2636 | +1F332 ; fully-qualified # ๐ฒ evergreen tree | |
| 2637 | +1F333 ; fully-qualified # ๐ณ deciduous tree | |
| 2638 | +1F334 ; fully-qualified # ๐ด palm tree | |
| 2639 | +1F335 ; fully-qualified # ๐ต cactus | |
| 2640 | +1F33E ; fully-qualified # ๐พ sheaf of rice | |
| 2641 | +1F33F ; fully-qualified # ๐ฟ herb | |
| 2642 | +2618 FE0F ; fully-qualified # โ๏ธ shamrock | |
| 2643 | +2618 ; unqualified # โ shamrock | |
| 2644 | +1F340 ; fully-qualified # ๐ four leaf clover | |
| 2645 | +1F341 ; fully-qualified # ๐ maple leaf | |
| 2646 | +1F342 ; fully-qualified # ๐ fallen leaf | |
| 2647 | +1F343 ; fully-qualified # ๐ leaf fluttering in wind | |
| 2648 | + | |
| 2649 | +# Animals & Nature subtotal: 133 | |
| 2650 | +# Animals & Nature subtotal: 133 w/o modifiers | |
| 2651 | + | |
| 2652 | +# group: Food & Drink | |
| 2653 | + | |
| 2654 | +# subgroup: food-fruit | |
| 2655 | +1F347 ; fully-qualified # ๐ grapes | |
| 2656 | +1F348 ; fully-qualified # ๐ melon | |
| 2657 | +1F349 ; fully-qualified # ๐ watermelon | |
| 2658 | +1F34A ; fully-qualified # ๐ tangerine | |
| 2659 | +1F34B ; fully-qualified # ๐ lemon | |
| 2660 | +1F34C ; fully-qualified # ๐ banana | |
| 2661 | +1F34D ; fully-qualified # ๐ pineapple | |
| 2662 | +1F96D ; fully-qualified # ๐ฅญ mango | |
| 2663 | +1F34E ; fully-qualified # ๐ red apple | |
| 2664 | +1F34F ; fully-qualified # ๐ green apple | |
| 2665 | +1F350 ; fully-qualified # ๐ pear | |
| 2666 | +1F351 ; fully-qualified # ๐ peach | |
| 2667 | +1F352 ; fully-qualified # ๐ cherries | |
| 2668 | +1F353 ; fully-qualified # ๐ strawberry | |
| 2669 | +1F95D ; fully-qualified # ๐ฅ kiwi fruit | |
| 2670 | +1F345 ; fully-qualified # ๐ tomato | |
| 2671 | +1F965 ; fully-qualified # ๐ฅฅ coconut | |
| 2672 | + | |
| 2673 | +# subgroup: food-vegetable | |
| 2674 | +1F951 ; fully-qualified # ๐ฅ avocado | |
| 2675 | +1F346 ; fully-qualified # ๐ eggplant | |
| 2676 | +1F954 ; fully-qualified # ๐ฅ potato | |
| 2677 | +1F955 ; fully-qualified # ๐ฅ carrot | |
| 2678 | +1F33D ; fully-qualified # ๐ฝ ear of corn | |
| 2679 | +1F336 FE0F ; fully-qualified # ๐ถ๏ธ hot pepper | |
| 2680 | +1F336 ; unqualified # ๐ถ hot pepper | |
| 2681 | +1F952 ; fully-qualified # ๐ฅ cucumber | |
| 2682 | +1F96C ; fully-qualified # ๐ฅฌ leafy green | |
| 2683 | +1F966 ; fully-qualified # ๐ฅฆ broccoli | |
| 2684 | +1F9C4 ; fully-qualified # ๐ง garlic | |
| 2685 | +1F9C5 ; fully-qualified # ๐ง onion | |
| 2686 | +1F344 ; fully-qualified # ๐ mushroom | |
| 2687 | +1F95C ; fully-qualified # ๐ฅ peanuts | |
| 2688 | +1F330 ; fully-qualified # ๐ฐ chestnut | |
| 2689 | + | |
| 2690 | +# subgroup: food-prepared | |
| 2691 | +1F35E ; fully-qualified # ๐ bread | |
| 2692 | +1F950 ; fully-qualified # ๐ฅ croissant | |
| 2693 | +1F956 ; fully-qualified # ๐ฅ baguette bread | |
| 2694 | +1F968 ; fully-qualified # ๐ฅจ pretzel | |
| 2695 | +1F96F ; fully-qualified # ๐ฅฏ bagel | |
| 2696 | +1F95E ; fully-qualified # ๐ฅ pancakes | |
| 2697 | +1F9C7 ; fully-qualified # ๐ง waffle | |
| 2698 | +1F9C0 ; fully-qualified # ๐ง cheese wedge | |
| 2699 | +1F356 ; fully-qualified # ๐ meat on bone | |
| 2700 | +1F357 ; fully-qualified # ๐ poultry leg | |
| 2701 | +1F969 ; fully-qualified # ๐ฅฉ cut of meat | |
| 2702 | +1F953 ; fully-qualified # ๐ฅ bacon | |
| 2703 | +1F354 ; fully-qualified # ๐ hamburger | |
| 2704 | +1F35F ; fully-qualified # ๐ french fries | |
| 2705 | +1F355 ; fully-qualified # ๐ pizza | |
| 2706 | +1F32D ; fully-qualified # ๐ญ hot dog | |
| 2707 | +1F96A ; fully-qualified # ๐ฅช sandwich | |
| 2708 | +1F32E ; fully-qualified # ๐ฎ taco | |
| 2709 | +1F32F ; fully-qualified # ๐ฏ burrito | |
| 2710 | +1F959 ; fully-qualified # ๐ฅ stuffed flatbread | |
| 2711 | +1F9C6 ; fully-qualified # ๐ง falafel | |
| 2712 | +1F95A ; fully-qualified # ๐ฅ egg | |
| 2713 | +1F373 ; fully-qualified # ๐ณ cooking | |
| 2714 | +1F958 ; fully-qualified # ๐ฅ shallow pan of food | |
| 2715 | +1F372 ; fully-qualified # ๐ฒ pot of food | |
| 2716 | +1F963 ; fully-qualified # ๐ฅฃ bowl with spoon | |
| 2717 | +1F957 ; fully-qualified # ๐ฅ green salad | |
| 2718 | +1F37F ; fully-qualified # ๐ฟ popcorn | |
| 2719 | +1F9C8 ; fully-qualified # ๐ง butter | |
| 2720 | +1F9C2 ; fully-qualified # ๐ง salt | |
| 2721 | +1F96B ; fully-qualified # ๐ฅซ canned food | |
| 2722 | + | |
| 2723 | +# subgroup: food-asian | |
| 2724 | +1F371 ; fully-qualified # ๐ฑ bento box | |
| 2725 | +1F358 ; fully-qualified # ๐ rice cracker | |
| 2726 | +1F359 ; fully-qualified # ๐ rice ball | |
| 2727 | +1F35A ; fully-qualified # ๐ cooked rice | |
| 2728 | +1F35B ; fully-qualified # ๐ curry rice | |
| 2729 | +1F35C ; fully-qualified # ๐ steaming bowl | |
| 2730 | +1F35D ; fully-qualified # ๐ spaghetti | |
| 2731 | +1F360 ; fully-qualified # ๐ roasted sweet potato | |
| 2732 | +1F362 ; fully-qualified # ๐ข oden | |
| 2733 | +1F363 ; fully-qualified # ๐ฃ sushi | |
| 2734 | +1F364 ; fully-qualified # ๐ค fried shrimp | |
| 2735 | +1F365 ; fully-qualified # ๐ฅ fish cake with swirl | |
| 2736 | +1F96E ; fully-qualified # ๐ฅฎ moon cake | |
| 2737 | +1F361 ; fully-qualified # ๐ก dango | |
| 2738 | +1F95F ; fully-qualified # ๐ฅ dumpling | |
| 2739 | +1F960 ; fully-qualified # ๐ฅ fortune cookie | |
| 2740 | +1F961 ; fully-qualified # ๐ฅก takeout box | |
| 2741 | + | |
| 2742 | +# subgroup: food-marine | |
| 2743 | +1F980 ; fully-qualified # ๐ฆ crab | |
| 2744 | +1F99E ; fully-qualified # ๐ฆ lobster | |
| 2745 | +1F990 ; fully-qualified # ๐ฆ shrimp | |
| 2746 | +1F991 ; fully-qualified # ๐ฆ squid | |
| 2747 | +1F9AA ; fully-qualified # ๐ฆช oyster | |
| 2748 | + | |
| 2749 | +# subgroup: food-sweet | |
| 2750 | +1F366 ; fully-qualified # ๐ฆ soft ice cream | |
| 2751 | +1F367 ; fully-qualified # ๐ง shaved ice | |
| 2752 | +1F368 ; fully-qualified # ๐จ ice cream | |
| 2753 | +1F369 ; fully-qualified # ๐ฉ doughnut | |
| 2754 | +1F36A ; fully-qualified # ๐ช cookie | |
| 2755 | +1F382 ; fully-qualified # ๐ birthday cake | |
| 2756 | +1F370 ; fully-qualified # ๐ฐ shortcake | |
| 2757 | +1F9C1 ; fully-qualified # ๐ง cupcake | |
| 2758 | +1F967 ; fully-qualified # ๐ฅง pie | |
| 2759 | +1F36B ; fully-qualified # ๐ซ chocolate bar | |
| 2760 | +1F36C ; fully-qualified # ๐ฌ candy | |
| 2761 | +1F36D ; fully-qualified # ๐ญ lollipop | |
| 2762 | +1F36E ; fully-qualified # ๐ฎ custard | |
| 2763 | +1F36F ; fully-qualified # ๐ฏ honey pot | |
| 2764 | + | |
| 2765 | +# subgroup: drink | |
| 2766 | +1F37C ; fully-qualified # ๐ผ baby bottle | |
| 2767 | +1F95B ; fully-qualified # ๐ฅ glass of milk | |
| 2768 | +2615 ; fully-qualified # โ hot beverage | |
| 2769 | +1F375 ; fully-qualified # ๐ต teacup without handle | |
| 2770 | +1F376 ; fully-qualified # ๐ถ sake | |
| 2771 | +1F37E ; fully-qualified # ๐พ bottle with popping cork | |
| 2772 | +1F377 ; fully-qualified # ๐ท wine glass | |
| 2773 | +1F378 ; fully-qualified # ๐ธ cocktail glass | |
| 2774 | +1F379 ; fully-qualified # ๐น tropical drink | |
| 2775 | +1F37A ; fully-qualified # ๐บ beer mug | |
| 2776 | +1F37B ; fully-qualified # ๐ป clinking beer mugs | |
| 2777 | +1F942 ; fully-qualified # ๐ฅ clinking glasses | |
| 2778 | +1F943 ; fully-qualified # ๐ฅ tumbler glass | |
| 2779 | +1F964 ; fully-qualified # ๐ฅค cup with straw | |
| 2780 | +1F9C3 ; fully-qualified # ๐ง beverage box | |
| 2781 | +1F9C9 ; fully-qualified # ๐ง mate | |
| 2782 | +1F9CA ; fully-qualified # ๐ง ice cube | |
| 2783 | + | |
| 2784 | +# subgroup: dishware | |
| 2785 | +1F962 ; fully-qualified # ๐ฅข chopsticks | |
| 2786 | +1F37D FE0F ; fully-qualified # ๐ฝ๏ธ fork and knife with plate | |
| 2787 | +1F37D ; unqualified # ๐ฝ fork and knife with plate | |
| 2788 | +1F374 ; fully-qualified # ๐ด fork and knife | |
| 2789 | +1F944 ; fully-qualified # ๐ฅ spoon | |
| 2790 | +1F52A ; fully-qualified # ๐ช kitchen knife | |
| 2791 | +1F3FA ; fully-qualified # ๐บ amphora | |
| 2792 | + | |
| 2793 | +# Food & Drink subtotal: 123 | |
| 2794 | +# Food & Drink subtotal: 123 w/o modifiers | |
| 2795 | + | |
| 2796 | +# group: Travel & Places | |
| 2797 | + | |
| 2798 | +# subgroup: place-map | |
| 2799 | +1F30D ; fully-qualified # ๐ globe showing Europe-Africa | |
| 2800 | +1F30E ; fully-qualified # ๐ globe showing Americas | |
| 2801 | +1F30F ; fully-qualified # ๐ globe showing Asia-Australia | |
| 2802 | +1F310 ; fully-qualified # ๐ globe with meridians | |
| 2803 | +1F5FA FE0F ; fully-qualified # ๐บ๏ธ world map | |
| 2804 | +1F5FA ; unqualified # ๐บ world map | |
| 2805 | +1F5FE ; fully-qualified # ๐พ map of Japan | |
| 2806 | +1F9ED ; fully-qualified # ๐งญ compass | |
| 2807 | + | |
| 2808 | +# subgroup: place-geographic | |
| 2809 | +1F3D4 FE0F ; fully-qualified # ๐๏ธ snow-capped mountain | |
| 2810 | +1F3D4 ; unqualified # ๐ snow-capped mountain | |
| 2811 | +26F0 FE0F ; fully-qualified # โฐ๏ธ mountain | |
| 2812 | +26F0 ; unqualified # โฐ mountain | |
| 2813 | +1F30B ; fully-qualified # ๐ volcano | |
| 2814 | +1F5FB ; fully-qualified # ๐ป mount fuji | |
| 2815 | +1F3D5 FE0F ; fully-qualified # ๐๏ธ camping | |
| 2816 | +1F3D5 ; unqualified # ๐ camping | |
| 2817 | +1F3D6 FE0F ; fully-qualified # ๐๏ธ beach with umbrella | |
| 2818 | +1F3D6 ; unqualified # ๐ beach with umbrella | |
| 2819 | +1F3DC FE0F ; fully-qualified # ๐๏ธ desert | |
| 2820 | +1F3DC ; unqualified # ๐ desert | |
| 2821 | +1F3DD FE0F ; fully-qualified # ๐๏ธ desert island | |
| 2822 | +1F3DD ; unqualified # ๐ desert island | |
| 2823 | +1F3DE FE0F ; fully-qualified # ๐๏ธ national park | |
| 2824 | +1F3DE ; unqualified # ๐ national park | |
| 2825 | + | |
| 2826 | +# subgroup: place-building | |
| 2827 | +1F3DF FE0F ; fully-qualified # ๐๏ธ stadium | |
| 2828 | +1F3DF ; unqualified # ๐ stadium | |
| 2829 | +1F3DB FE0F ; fully-qualified # ๐๏ธ classical building | |
| 2830 | +1F3DB ; unqualified # ๐ classical building | |
| 2831 | +1F3D7 FE0F ; fully-qualified # ๐๏ธ building construction | |
| 2832 | +1F3D7 ; unqualified # ๐ building construction | |
| 2833 | +1F9F1 ; fully-qualified # ๐งฑ brick | |
| 2834 | +1F3D8 FE0F ; fully-qualified # ๐๏ธ houses | |
| 2835 | +1F3D8 ; unqualified # ๐ houses | |
| 2836 | +1F3DA FE0F ; fully-qualified # ๐๏ธ derelict house | |
| 2837 | +1F3DA ; unqualified # ๐ derelict house | |
| 2838 | +1F3E0 ; fully-qualified # ๐ house | |
| 2839 | +1F3E1 ; fully-qualified # ๐ก house with garden | |
| 2840 | +1F3E2 ; fully-qualified # ๐ข office building | |
| 2841 | +1F3E3 ; fully-qualified # ๐ฃ Japanese post office | |
| 2842 | +1F3E4 ; fully-qualified # ๐ค post office | |
| 2843 | +1F3E5 ; fully-qualified # ๐ฅ hospital | |
| 2844 | +1F3E6 ; fully-qualified # ๐ฆ bank | |
| 2845 | +1F3E8 ; fully-qualified # ๐จ hotel | |
| 2846 | +1F3E9 ; fully-qualified # ๐ฉ love hotel | |
| 2847 | +1F3EA ; fully-qualified # ๐ช convenience store | |
| 2848 | +1F3EB ; fully-qualified # ๐ซ school | |
| 2849 | +1F3EC ; fully-qualified # ๐ฌ department store | |
| 2850 | +1F3ED ; fully-qualified # ๐ญ factory | |
| 2851 | +1F3EF ; fully-qualified # ๐ฏ Japanese castle | |
| 2852 | +1F3F0 ; fully-qualified # ๐ฐ castle | |
| 2853 | +1F492 ; fully-qualified # ๐ wedding | |
| 2854 | +1F5FC ; fully-qualified # ๐ผ Tokyo tower | |
| 2855 | +1F5FD ; fully-qualified # ๐ฝ Statue of Liberty | |
| 2856 | + | |
| 2857 | +# subgroup: place-religious | |
| 2858 | +26EA ; fully-qualified # โช church | |
| 2859 | +1F54C ; fully-qualified # ๐ mosque | |
| 2860 | +1F6D5 ; fully-qualified # ๐ hindu temple | |
| 2861 | +1F54D ; fully-qualified # ๐ synagogue | |
| 2862 | +26E9 FE0F ; fully-qualified # โฉ๏ธ shinto shrine | |
| 2863 | +26E9 ; unqualified # โฉ shinto shrine | |
| 2864 | +1F54B ; fully-qualified # ๐ kaaba | |
| 2865 | + | |
| 2866 | +# subgroup: place-other | |
| 2867 | +26F2 ; fully-qualified # โฒ fountain | |
| 2868 | +26FA ; fully-qualified # โบ tent | |
| 2869 | +1F301 ; fully-qualified # ๐ foggy | |
| 2870 | +1F303 ; fully-qualified # ๐ night with stars | |
| 2871 | +1F3D9 FE0F ; fully-qualified # ๐๏ธ cityscape | |
| 2872 | +1F3D9 ; unqualified # ๐ cityscape | |
| 2873 | +1F304 ; fully-qualified # ๐ sunrise over mountains | |
| 2874 | +1F305 ; fully-qualified # ๐ sunrise | |
| 2875 | +1F306 ; fully-qualified # ๐ cityscape at dusk | |
| 2876 | +1F307 ; fully-qualified # ๐ sunset | |
| 2877 | +1F309 ; fully-qualified # ๐ bridge at night | |
| 2878 | +2668 FE0F ; fully-qualified # โจ๏ธ hot springs | |
| 2879 | +2668 ; unqualified # โจ hot springs | |
| 2880 | +1F3A0 ; fully-qualified # ๐ carousel horse | |
| 2881 | +1F3A1 ; fully-qualified # ๐ก ferris wheel | |
| 2882 | +1F3A2 ; fully-qualified # ๐ข roller coaster | |
| 2883 | +1F488 ; fully-qualified # ๐ barber pole | |
| 2884 | +1F3AA ; fully-qualified # ๐ช circus tent | |
| 2885 | + | |
| 2886 | +# subgroup: transport-ground | |
| 2887 | +1F682 ; fully-qualified # ๐ locomotive | |
| 2888 | +1F683 ; fully-qualified # ๐ railway car | |
| 2889 | +1F684 ; fully-qualified # ๐ high-speed train | |
| 2890 | +1F685 ; fully-qualified # ๐ bullet train | |
| 2891 | +1F686 ; fully-qualified # ๐ train | |
| 2892 | +1F687 ; fully-qualified # ๐ metro | |
| 2893 | +1F688 ; fully-qualified # ๐ light rail | |
| 2894 | +1F689 ; fully-qualified # ๐ station | |
| 2895 | +1F68A ; fully-qualified # ๐ tram | |
| 2896 | +1F69D ; fully-qualified # ๐ monorail | |
| 2897 | +1F69E ; fully-qualified # ๐ mountain railway | |
| 2898 | +1F68B ; fully-qualified # ๐ tram car | |
| 2899 | +1F68C ; fully-qualified # ๐ bus | |
| 2900 | +1F68D ; fully-qualified # ๐ oncoming bus | |
| 2901 | +1F68E ; fully-qualified # ๐ trolleybus | |
| 2902 | +1F690 ; fully-qualified # ๐ minibus | |
| 2903 | +1F691 ; fully-qualified # ๐ ambulance | |
| 2904 | +1F692 ; fully-qualified # ๐ fire engine | |
| 2905 | +1F693 ; fully-qualified # ๐ police car | |
| 2906 | +1F694 ; fully-qualified # ๐ oncoming police car | |
| 2907 | +1F695 ; fully-qualified # ๐ taxi | |
| 2908 | +1F696 ; fully-qualified # ๐ oncoming taxi | |
| 2909 | +1F697 ; fully-qualified # ๐ automobile | |
| 2910 | +1F698 ; fully-qualified # ๐ oncoming automobile | |
| 2911 | +1F699 ; fully-qualified # ๐ sport utility vehicle | |
| 2912 | +1F69A ; fully-qualified # ๐ delivery truck | |
| 2913 | +1F69B ; fully-qualified # ๐ articulated lorry | |
| 2914 | +1F69C ; fully-qualified # ๐ tractor | |
| 2915 | +1F3CE FE0F ; fully-qualified # ๐๏ธ racing car | |
| 2916 | +1F3CE ; unqualified # ๐ racing car | |
| 2917 | +1F3CD FE0F ; fully-qualified # ๐๏ธ motorcycle | |
| 2918 | +1F3CD ; unqualified # ๐ motorcycle | |
| 2919 | +1F6F5 ; fully-qualified # ๐ต motor scooter | |
| 2920 | +1F9BD ; fully-qualified # ๐ฆฝ manual wheelchair | |
| 2921 | +1F9BC ; fully-qualified # ๐ฆผ motorized wheelchair | |
| 2922 | +1F6FA ; fully-qualified # ๐บ auto rickshaw | |
| 2923 | +1F6B2 ; fully-qualified # ๐ฒ bicycle | |
| 2924 | +1F6F4 ; fully-qualified # ๐ด kick scooter | |
| 2925 | +1F6F9 ; fully-qualified # ๐น skateboard | |
| 2926 | +1F68F ; fully-qualified # ๐ bus stop | |
| 2927 | +1F6E3 FE0F ; fully-qualified # ๐ฃ๏ธ motorway | |
| 2928 | +1F6E3 ; unqualified # ๐ฃ motorway | |
| 2929 | +1F6E4 FE0F ; fully-qualified # ๐ค๏ธ railway track | |
| 2930 | +1F6E4 ; unqualified # ๐ค railway track | |
| 2931 | +1F6E2 FE0F ; fully-qualified # ๐ข๏ธ oil drum | |
| 2932 | +1F6E2 ; unqualified # ๐ข oil drum | |
| 2933 | +26FD ; fully-qualified # โฝ fuel pump | |
| 2934 | +1F6A8 ; fully-qualified # ๐จ police car light | |
| 2935 | +1F6A5 ; fully-qualified # ๐ฅ horizontal traffic light | |
| 2936 | +1F6A6 ; fully-qualified # ๐ฆ vertical traffic light | |
| 2937 | +1F6D1 ; fully-qualified # ๐ stop sign | |
| 2938 | +1F6A7 ; fully-qualified # ๐ง construction | |
| 2939 | + | |
| 2940 | +# subgroup: transport-water | |
| 2941 | +2693 ; fully-qualified # โ anchor | |
| 2942 | +26F5 ; fully-qualified # โต sailboat | |
| 2943 | +1F6F6 ; fully-qualified # ๐ถ canoe | |
| 2944 | +1F6A4 ; fully-qualified # ๐ค speedboat | |
| 2945 | +1F6F3 FE0F ; fully-qualified # ๐ณ๏ธ passenger ship | |
| 2946 | +1F6F3 ; unqualified # ๐ณ passenger ship | |
| 2947 | +26F4 FE0F ; fully-qualified # โด๏ธ ferry | |
| 2948 | +26F4 ; unqualified # โด ferry | |
| 2949 | +1F6E5 FE0F ; fully-qualified # ๐ฅ๏ธ motor boat | |
| 2950 | +1F6E5 ; unqualified # ๐ฅ motor boat | |
| 2951 | +1F6A2 ; fully-qualified # ๐ข ship | |
| 2952 | + | |
| 2953 | +# subgroup: transport-air | |
| 2954 | +2708 FE0F ; fully-qualified # โ๏ธ airplane | |
| 2955 | +2708 ; unqualified # โ airplane | |
| 2956 | +1F6E9 FE0F ; fully-qualified # ๐ฉ๏ธ small airplane | |
| 2957 | +1F6E9 ; unqualified # ๐ฉ small airplane | |
| 2958 | +1F6EB ; fully-qualified # ๐ซ airplane departure | |
| 2959 | +1F6EC ; fully-qualified # ๐ฌ airplane arrival | |
| 2960 | +1FA82 ; fully-qualified # ๐ช parachute | |
| 2961 | +1F4BA ; fully-qualified # ๐บ seat | |
| 2962 | +1F681 ; fully-qualified # ๐ helicopter | |
| 2963 | +1F69F ; fully-qualified # ๐ suspension railway | |
| 2964 | +1F6A0 ; fully-qualified # ๐ mountain cableway | |
| 2965 | +1F6A1 ; fully-qualified # ๐ก aerial tramway | |
| 2966 | +1F6F0 FE0F ; fully-qualified # ๐ฐ๏ธ satellite | |
| 2967 | +1F6F0 ; unqualified # ๐ฐ satellite | |
| 2968 | +1F680 ; fully-qualified # ๐ rocket | |
| 2969 | +1F6F8 ; fully-qualified # ๐ธ flying saucer | |
| 2970 | + | |
| 2971 | +# subgroup: hotel | |
| 2972 | +1F6CE FE0F ; fully-qualified # ๐๏ธ bellhop bell | |
| 2973 | +1F6CE ; unqualified # ๐ bellhop bell | |
| 2974 | +1F9F3 ; fully-qualified # ๐งณ luggage | |
| 2975 | + | |
| 2976 | +# subgroup: time | |
| 2977 | +231B ; fully-qualified # โ hourglass done | |
| 2978 | +23F3 ; fully-qualified # โณ hourglass not done | |
| 2979 | +231A ; fully-qualified # โ watch | |
| 2980 | +23F0 ; fully-qualified # โฐ alarm clock | |
| 2981 | +23F1 FE0F ; fully-qualified # โฑ๏ธ stopwatch | |
| 2982 | +23F1 ; unqualified # โฑ stopwatch | |
| 2983 | +23F2 FE0F ; fully-qualified # โฒ๏ธ timer clock | |
| 2984 | +23F2 ; unqualified # โฒ timer clock | |
| 2985 | +1F570 FE0F ; fully-qualified # ๐ฐ๏ธ mantelpiece clock | |
| 2986 | +1F570 ; unqualified # ๐ฐ mantelpiece clock | |
| 2987 | +1F55B ; fully-qualified # ๐ twelve oโclock | |
| 2988 | +1F567 ; fully-qualified # ๐ง twelve-thirty | |
| 2989 | +1F550 ; fully-qualified # ๐ one oโclock | |
| 2990 | +1F55C ; fully-qualified # ๐ one-thirty | |
| 2991 | +1F551 ; fully-qualified # ๐ two oโclock | |
| 2992 | +1F55D ; fully-qualified # ๐ two-thirty | |
| 2993 | +1F552 ; fully-qualified # ๐ three oโclock | |
| 2994 | +1F55E ; fully-qualified # ๐ three-thirty | |
| 2995 | +1F553 ; fully-qualified # ๐ four oโclock | |
| 2996 | +1F55F ; fully-qualified # ๐ four-thirty | |
| 2997 | +1F554 ; fully-qualified # ๐ five oโclock | |
| 2998 | +1F560 ; fully-qualified # ๐ five-thirty | |
| 2999 | +1F555 ; fully-qualified # ๐ six oโclock | |
| 3000 | +1F561 ; fully-qualified # ๐ก six-thirty | |
| 3001 | +1F556 ; fully-qualified # ๐ seven oโclock | |
| 3002 | +1F562 ; fully-qualified # ๐ข seven-thirty | |
| 3003 | +1F557 ; fully-qualified # ๐ eight oโclock | |
| 3004 | +1F563 ; fully-qualified # ๐ฃ eight-thirty | |
| 3005 | +1F558 ; fully-qualified # ๐ nine oโclock | |
| 3006 | +1F564 ; fully-qualified # ๐ค nine-thirty | |
| 3007 | +1F559 ; fully-qualified # ๐ ten oโclock | |
| 3008 | +1F565 ; fully-qualified # ๐ฅ ten-thirty | |
| 3009 | +1F55A ; fully-qualified # ๐ eleven oโclock | |
| 3010 | +1F566 ; fully-qualified # ๐ฆ eleven-thirty | |
| 3011 | + | |
| 3012 | +# subgroup: sky & weather | |
| 3013 | +1F311 ; fully-qualified # ๐ new moon | |
| 3014 | +1F312 ; fully-qualified # ๐ waxing crescent moon | |
| 3015 | +1F313 ; fully-qualified # ๐ first quarter moon | |
| 3016 | +1F314 ; fully-qualified # ๐ waxing gibbous moon | |
| 3017 | +1F315 ; fully-qualified # ๐ full moon | |
| 3018 | +1F316 ; fully-qualified # ๐ waning gibbous moon | |
| 3019 | +1F317 ; fully-qualified # ๐ last quarter moon | |
| 3020 | +1F318 ; fully-qualified # ๐ waning crescent moon | |
| 3021 | +1F319 ; fully-qualified # ๐ crescent moon | |
| 3022 | +1F31A ; fully-qualified # ๐ new moon face | |
| 3023 | +1F31B ; fully-qualified # ๐ first quarter moon face | |
| 3024 | +1F31C ; fully-qualified # ๐ last quarter moon face | |
| 3025 | +1F321 FE0F ; fully-qualified # ๐ก๏ธ thermometer | |
| 3026 | +1F321 ; unqualified # ๐ก thermometer | |
| 3027 | +2600 FE0F ; fully-qualified # โ๏ธ sun | |
| 3028 | +2600 ; unqualified # โ sun | |
| 3029 | +1F31D ; fully-qualified # ๐ full moon face | |
| 3030 | +1F31E ; fully-qualified # ๐ sun with face | |
| 3031 | +1FA90 ; fully-qualified # ๐ช ringed planet | |
| 3032 | +2B50 ; fully-qualified # โญ star | |
| 3033 | +1F31F ; fully-qualified # ๐ glowing star | |
| 3034 | +1F320 ; fully-qualified # ๐ shooting star | |
| 3035 | +1F30C ; fully-qualified # ๐ milky way | |
| 3036 | +2601 FE0F ; fully-qualified # โ๏ธ cloud | |
| 3037 | +2601 ; unqualified # โ cloud | |
| 3038 | +26C5 ; fully-qualified # โ sun behind cloud | |
| 3039 | +26C8 FE0F ; fully-qualified # โ๏ธ cloud with lightning and rain | |
| 3040 | +26C8 ; unqualified # โ cloud with lightning and rain | |
| 3041 | +1F324 FE0F ; fully-qualified # ๐ค๏ธ sun behind small cloud | |
| 3042 | +1F324 ; unqualified # ๐ค sun behind small cloud | |
| 3043 | +1F325 FE0F ; fully-qualified # ๐ฅ๏ธ sun behind large cloud | |
| 3044 | +1F325 ; unqualified # ๐ฅ sun behind large cloud | |
| 3045 | +1F326 FE0F ; fully-qualified # ๐ฆ๏ธ sun behind rain cloud | |
| 3046 | +1F326 ; unqualified # ๐ฆ sun behind rain cloud | |
| 3047 | +1F327 FE0F ; fully-qualified # ๐ง๏ธ cloud with rain | |
| 3048 | +1F327 ; unqualified # ๐ง cloud with rain | |
| 3049 | +1F328 FE0F ; fully-qualified # ๐จ๏ธ cloud with snow | |
| 3050 | +1F328 ; unqualified # ๐จ cloud with snow | |
| 3051 | +1F329 FE0F ; fully-qualified # ๐ฉ๏ธ cloud with lightning | |
| 3052 | +1F329 ; unqualified # ๐ฉ cloud with lightning | |
| 3053 | +1F32A FE0F ; fully-qualified # ๐ช๏ธ tornado | |
| 3054 | +1F32A ; unqualified # ๐ช tornado | |
| 3055 | +1F32B FE0F ; fully-qualified # ๐ซ๏ธ fog | |
| 3056 | +1F32B ; unqualified # ๐ซ fog | |
| 3057 | +1F32C FE0F ; fully-qualified # ๐ฌ๏ธ wind face | |
| 3058 | +1F32C ; unqualified # ๐ฌ wind face | |
| 3059 | +1F300 ; fully-qualified # ๐ cyclone | |
| 3060 | +1F308 ; fully-qualified # ๐ rainbow | |
| 3061 | +1F302 ; fully-qualified # ๐ closed umbrella | |
| 3062 | +2602 FE0F ; fully-qualified # โ๏ธ umbrella | |
| 3063 | +2602 ; unqualified # โ umbrella | |
| 3064 | +2614 ; fully-qualified # โ umbrella with rain drops | |
| 3065 | +26F1 FE0F ; fully-qualified # โฑ๏ธ umbrella on ground | |
| 3066 | +26F1 ; unqualified # โฑ umbrella on ground | |
| 3067 | +26A1 ; fully-qualified # โก high voltage | |
| 3068 | +2744 FE0F ; fully-qualified # โ๏ธ snowflake | |
| 3069 | +2744 ; unqualified # โ snowflake | |
| 3070 | +2603 FE0F ; fully-qualified # โ๏ธ snowman | |
| 3071 | +2603 ; unqualified # โ snowman | |
| 3072 | +26C4 ; fully-qualified # โ snowman without snow | |
| 3073 | +2604 FE0F ; fully-qualified # โ๏ธ comet | |
| 3074 | +2604 ; unqualified # โ comet | |
| 3075 | +1F525 ; fully-qualified # ๐ฅ fire | |
| 3076 | +1F4A7 ; fully-qualified # ๐ง droplet | |
| 3077 | +1F30A ; fully-qualified # ๐ water wave | |
| 3078 | + | |
| 3079 | +# Travel & Places subtotal: 259 | |
| 3080 | +# Travel & Places subtotal: 259 w/o modifiers | |
| 3081 | + | |
| 3082 | +# group: Activities | |
| 3083 | + | |
| 3084 | +# subgroup: event | |
| 3085 | +1F383 ; fully-qualified # ๐ jack-o-lantern | |
| 3086 | +1F384 ; fully-qualified # ๐ Christmas tree | |
| 3087 | +1F386 ; fully-qualified # ๐ fireworks | |
| 3088 | +1F387 ; fully-qualified # ๐ sparkler | |
| 3089 | +1F9E8 ; fully-qualified # ๐งจ firecracker | |
| 3090 | +2728 ; fully-qualified # โจ sparkles | |
| 3091 | +1F388 ; fully-qualified # ๐ balloon | |
| 3092 | +1F389 ; fully-qualified # ๐ party popper | |
| 3093 | +1F38A ; fully-qualified # ๐ confetti ball | |
| 3094 | +1F38B ; fully-qualified # ๐ tanabata tree | |
| 3095 | +1F38D ; fully-qualified # ๐ pine decoration | |
| 3096 | +1F38E ; fully-qualified # ๐ Japanese dolls | |
| 3097 | +1F38F ; fully-qualified # ๐ carp streamer | |
| 3098 | +1F390 ; fully-qualified # ๐ wind chime | |
| 3099 | +1F391 ; fully-qualified # ๐ moon viewing ceremony | |
| 3100 | +1F9E7 ; fully-qualified # ๐งง red envelope | |
| 3101 | +1F380 ; fully-qualified # ๐ ribbon | |
| 3102 | +1F381 ; fully-qualified # ๐ wrapped gift | |
| 3103 | +1F397 FE0F ; fully-qualified # ๐๏ธ reminder ribbon | |
| 3104 | +1F397 ; unqualified # ๐ reminder ribbon | |
| 3105 | +1F39F FE0F ; fully-qualified # ๐๏ธ admission tickets | |
| 3106 | +1F39F ; unqualified # ๐ admission tickets | |
| 3107 | +1F3AB ; fully-qualified # ๐ซ ticket | |
| 3108 | + | |
| 3109 | +# subgroup: award-medal | |
| 3110 | +1F396 FE0F ; fully-qualified # ๐๏ธ military medal | |
| 3111 | +1F396 ; unqualified # ๐ military medal | |
| 3112 | +1F3C6 ; fully-qualified # ๐ trophy | |
| 3113 | +1F3C5 ; fully-qualified # ๐ sports medal | |
| 3114 | +1F947 ; fully-qualified # ๐ฅ 1st place medal | |
| 3115 | +1F948 ; fully-qualified # ๐ฅ 2nd place medal | |
| 3116 | +1F949 ; fully-qualified # ๐ฅ 3rd place medal | |
| 3117 | + | |
| 3118 | +# subgroup: sport | |
| 3119 | +26BD ; fully-qualified # โฝ soccer ball | |
| 3120 | +26BE ; fully-qualified # โพ baseball | |
| 3121 | +1F94E ; fully-qualified # ๐ฅ softball | |
| 3122 | +1F3C0 ; fully-qualified # ๐ basketball | |
| 3123 | +1F3D0 ; fully-qualified # ๐ volleyball | |
| 3124 | +1F3C8 ; fully-qualified # ๐ american football | |
| 3125 | +1F3C9 ; fully-qualified # ๐ rugby football | |
| 3126 | +1F3BE ; fully-qualified # ๐พ tennis | |
| 3127 | +1F94F ; fully-qualified # ๐ฅ flying disc | |
| 3128 | +1F3B3 ; fully-qualified # ๐ณ bowling | |
| 3129 | +1F3CF ; fully-qualified # ๐ cricket game | |
| 3130 | +1F3D1 ; fully-qualified # ๐ field hockey | |
| 3131 | +1F3D2 ; fully-qualified # ๐ ice hockey | |
| 3132 | +1F94D ; fully-qualified # ๐ฅ lacrosse | |
| 3133 | +1F3D3 ; fully-qualified # ๐ ping pong | |
| 3134 | +1F3F8 ; fully-qualified # ๐ธ badminton | |
| 3135 | +1F94A ; fully-qualified # ๐ฅ boxing glove | |
| 3136 | +1F94B ; fully-qualified # ๐ฅ martial arts uniform | |
| 3137 | +1F945 ; fully-qualified # ๐ฅ goal net | |
| 3138 | +26F3 ; fully-qualified # โณ flag in hole | |
| 3139 | +26F8 FE0F ; fully-qualified # โธ๏ธ ice skate | |
| 3140 | +26F8 ; unqualified # โธ ice skate | |
| 3141 | +1F3A3 ; fully-qualified # ๐ฃ fishing pole | |
| 3142 | +1F93F ; fully-qualified # ๐คฟ diving mask | |
| 3143 | +1F3BD ; fully-qualified # ๐ฝ running shirt | |
| 3144 | +1F3BF ; fully-qualified # ๐ฟ skis | |
| 3145 | +1F6F7 ; fully-qualified # ๐ท sled | |
| 3146 | +1F94C ; fully-qualified # ๐ฅ curling stone | |
| 3147 | + | |
| 3148 | +# subgroup: game | |
| 3149 | +1F3AF ; fully-qualified # ๐ฏ direct hit | |
| 3150 | +1FA80 ; fully-qualified # ๐ช yo-yo | |
| 3151 | +1FA81 ; fully-qualified # ๐ช kite | |
| 3152 | +1F3B1 ; fully-qualified # ๐ฑ pool 8 ball | |
| 3153 | +1F52E ; fully-qualified # ๐ฎ crystal ball | |
| 3154 | +1F9FF ; fully-qualified # ๐งฟ nazar amulet | |
| 3155 | +1F3AE ; fully-qualified # ๐ฎ video game | |
| 3156 | +1F579 FE0F ; fully-qualified # ๐น๏ธ joystick | |
| 3157 | +1F579 ; unqualified # ๐น joystick | |
| 3158 | +1F3B0 ; fully-qualified # ๐ฐ slot machine | |
| 3159 | +1F3B2 ; fully-qualified # ๐ฒ game die | |
| 3160 | +1F9E9 ; fully-qualified # ๐งฉ puzzle piece | |
| 3161 | +1F9F8 ; fully-qualified # ๐งธ teddy bear | |
| 3162 | +2660 FE0F ; fully-qualified # โ ๏ธ spade suit | |
| 3163 | +2660 ; unqualified # โ spade suit | |
| 3164 | +2665 FE0F ; fully-qualified # โฅ๏ธ heart suit | |
| 3165 | +2665 ; unqualified # โฅ heart suit | |
| 3166 | +2666 FE0F ; fully-qualified # โฆ๏ธ diamond suit | |
| 3167 | +2666 ; unqualified # โฆ diamond suit | |
| 3168 | +2663 FE0F ; fully-qualified # โฃ๏ธ club suit | |
| 3169 | +2663 ; unqualified # โฃ club suit | |
| 3170 | +265F FE0F ; fully-qualified # โ๏ธ chess pawn | |
| 3171 | +265F ; unqualified # โ chess pawn | |
| 3172 | +1F0CF ; fully-qualified # ๐ joker | |
| 3173 | +1F004 ; fully-qualified # ๐ mahjong red dragon | |
| 3174 | +1F3B4 ; fully-qualified # ๐ด flower playing cards | |
| 3175 | + | |
| 3176 | +# subgroup: arts & crafts | |
| 3177 | +1F3AD ; fully-qualified # ๐ญ performing arts | |
| 3178 | +1F5BC FE0F ; fully-qualified # ๐ผ๏ธ framed picture | |
| 3179 | +1F5BC ; unqualified # ๐ผ framed picture | |
| 3180 | +1F3A8 ; fully-qualified # ๐จ artist palette | |
| 3181 | +1F9F5 ; fully-qualified # ๐งต thread | |
| 3182 | +1F9F6 ; fully-qualified # ๐งถ yarn | |
| 3183 | + | |
| 3184 | +# Activities subtotal: 90 | |
| 3185 | +# Activities subtotal: 90 w/o modifiers | |
| 3186 | + | |
| 3187 | +# group: Objects | |
| 3188 | + | |
| 3189 | +# subgroup: clothing | |
| 3190 | +1F453 ; fully-qualified # ๐ glasses | |
| 3191 | +1F576 FE0F ; fully-qualified # ๐ถ๏ธ sunglasses | |
| 3192 | +1F576 ; unqualified # ๐ถ sunglasses | |
| 3193 | +1F97D ; fully-qualified # ๐ฅฝ goggles | |
| 3194 | +1F97C ; fully-qualified # ๐ฅผ lab coat | |
| 3195 | +1F9BA ; fully-qualified # ๐ฆบ safety vest | |
| 3196 | +1F454 ; fully-qualified # ๐ necktie | |
| 3197 | +1F455 ; fully-qualified # ๐ t-shirt | |
| 3198 | +1F456 ; fully-qualified # ๐ jeans | |
| 3199 | +1F9E3 ; fully-qualified # ๐งฃ scarf | |
| 3200 | +1F9E4 ; fully-qualified # ๐งค gloves | |
| 3201 | +1F9E5 ; fully-qualified # ๐งฅ coat | |
| 3202 | +1F9E6 ; fully-qualified # ๐งฆ socks | |
| 3203 | +1F457 ; fully-qualified # ๐ dress | |
| 3204 | +1F458 ; fully-qualified # ๐ kimono | |
| 3205 | +1F97B ; fully-qualified # ๐ฅป sari | |
| 3206 | +1FA71 ; fully-qualified # ๐ฉฑ one-piece swimsuit | |
| 3207 | +1FA72 ; fully-qualified # ๐ฉฒ swim brief | |
| 3208 | +1FA73 ; fully-qualified # ๐ฉณ shorts | |
| 3209 | +1F459 ; fully-qualified # ๐ bikini | |
| 3210 | +1F45A ; fully-qualified # ๐ womanโs clothes | |
| 3211 | +1F45B ; fully-qualified # ๐ purse | |
| 3212 | +1F45C ; fully-qualified # ๐ handbag | |
| 3213 | +1F45D ; fully-qualified # ๐ clutch bag | |
| 3214 | +1F6CD FE0F ; fully-qualified # ๐๏ธ shopping bags | |
| 3215 | +1F6CD ; unqualified # ๐ shopping bags | |
| 3216 | +1F392 ; fully-qualified # ๐ backpack | |
| 3217 | +1F45E ; fully-qualified # ๐ manโs shoe | |
| 3218 | +1F45F ; fully-qualified # ๐ running shoe | |
| 3219 | +1F97E ; fully-qualified # ๐ฅพ hiking boot | |
| 3220 | +1F97F ; fully-qualified # ๐ฅฟ flat shoe | |
| 3221 | +1F460 ; fully-qualified # ๐ high-heeled shoe | |
| 3222 | +1F461 ; fully-qualified # ๐ก womanโs sandal | |
| 3223 | +1FA70 ; fully-qualified # ๐ฉฐ ballet shoes | |
| 3224 | +1F462 ; fully-qualified # ๐ข womanโs boot | |
| 3225 | +1F451 ; fully-qualified # ๐ crown | |
| 3226 | +1F452 ; fully-qualified # ๐ womanโs hat | |
| 3227 | +1F3A9 ; fully-qualified # ๐ฉ top hat | |
| 3228 | +1F393 ; fully-qualified # ๐ graduation cap | |
| 3229 | +1F9E2 ; fully-qualified # ๐งข billed cap | |
| 3230 | +26D1 FE0F ; fully-qualified # โ๏ธ rescue workerโs helmet | |
| 3231 | +26D1 ; unqualified # โ rescue workerโs helmet | |
| 3232 | +1F4FF ; fully-qualified # ๐ฟ prayer beads | |
| 3233 | +1F484 ; fully-qualified # ๐ lipstick | |
| 3234 | +1F48D ; fully-qualified # ๐ ring | |
| 3235 | +1F48E ; fully-qualified # ๐ gem stone | |
| 3236 | + | |
| 3237 | +# subgroup: sound | |
| 3238 | +1F507 ; fully-qualified # ๐ muted speaker | |
| 3239 | +1F508 ; fully-qualified # ๐ speaker low volume | |
| 3240 | +1F509 ; fully-qualified # ๐ speaker medium volume | |
| 3241 | +1F50A ; fully-qualified # ๐ speaker high volume | |
| 3242 | +1F4E2 ; fully-qualified # ๐ข loudspeaker | |
| 3243 | +1F4E3 ; fully-qualified # ๐ฃ megaphone | |
| 3244 | +1F4EF ; fully-qualified # ๐ฏ postal horn | |
| 3245 | +1F514 ; fully-qualified # ๐ bell | |
| 3246 | +1F515 ; fully-qualified # ๐ bell with slash | |
| 3247 | + | |
| 3248 | +# subgroup: music | |
| 3249 | +1F3BC ; fully-qualified # ๐ผ musical score | |
| 3250 | +1F3B5 ; fully-qualified # ๐ต musical note | |
| 3251 | +1F3B6 ; fully-qualified # ๐ถ musical notes | |
| 3252 | +1F399 FE0F ; fully-qualified # ๐๏ธ studio microphone | |
| 3253 | +1F399 ; unqualified # ๐ studio microphone | |
| 3254 | +1F39A FE0F ; fully-qualified # ๐๏ธ level slider | |
| 3255 | +1F39A ; unqualified # ๐ level slider | |
| 3256 | +1F39B FE0F ; fully-qualified # ๐๏ธ control knobs | |
| 3257 | +1F39B ; unqualified # ๐ control knobs | |
| 3258 | +1F3A4 ; fully-qualified # ๐ค microphone | |
| 3259 | +1F3A7 ; fully-qualified # ๐ง headphone | |
| 3260 | +1F4FB ; fully-qualified # ๐ป radio | |
| 3261 | + | |
| 3262 | +# subgroup: musical-instrument | |
| 3263 | +1F3B7 ; fully-qualified # ๐ท saxophone | |
| 3264 | +1F3B8 ; fully-qualified # ๐ธ guitar | |
| 3265 | +1F3B9 ; fully-qualified # ๐น musical keyboard | |
| 3266 | +1F3BA ; fully-qualified # ๐บ trumpet | |
| 3267 | +1F3BB ; fully-qualified # ๐ป violin | |
| 3268 | +1FA95 ; fully-qualified # ๐ช banjo | |
| 3269 | +1F941 ; fully-qualified # ๐ฅ drum | |
| 3270 | + | |
| 3271 | +# subgroup: phone | |
| 3272 | +1F4F1 ; fully-qualified # ๐ฑ mobile phone | |
| 3273 | +1F4F2 ; fully-qualified # ๐ฒ mobile phone with arrow | |
| 3274 | +260E FE0F ; fully-qualified # โ๏ธ telephone | |
| 3275 | +260E ; unqualified # โ telephone | |
| 3276 | +1F4DE ; fully-qualified # ๐ telephone receiver | |
| 3277 | +1F4DF ; fully-qualified # ๐ pager | |
| 3278 | +1F4E0 ; fully-qualified # ๐ fax machine | |
| 3279 | + | |
| 3280 | +# subgroup: computer | |
| 3281 | +1F50B ; fully-qualified # ๐ battery | |
| 3282 | +1F50C ; fully-qualified # ๐ electric plug | |
| 3283 | +1F4BB ; fully-qualified # ๐ป laptop computer | |
| 3284 | +1F5A5 FE0F ; fully-qualified # ๐ฅ๏ธ desktop computer | |
| 3285 | +1F5A5 ; unqualified # ๐ฅ desktop computer | |
| 3286 | +1F5A8 FE0F ; fully-qualified # ๐จ๏ธ printer | |
| 3287 | +1F5A8 ; unqualified # ๐จ printer | |
| 3288 | +2328 FE0F ; fully-qualified # โจ๏ธ keyboard | |
| 3289 | +2328 ; unqualified # โจ keyboard | |
| 3290 | +1F5B1 FE0F ; fully-qualified # ๐ฑ๏ธ computer mouse | |
| 3291 | +1F5B1 ; unqualified # ๐ฑ computer mouse | |
| 3292 | +1F5B2 FE0F ; fully-qualified # ๐ฒ๏ธ trackball | |
| 3293 | +1F5B2 ; unqualified # ๐ฒ trackball | |
| 3294 | +1F4BD ; fully-qualified # ๐ฝ computer disk | |
| 3295 | +1F4BE ; fully-qualified # ๐พ floppy disk | |
| 3296 | +1F4BF ; fully-qualified # ๐ฟ optical disk | |
| 3297 | +1F4C0 ; fully-qualified # ๐ dvd | |
| 3298 | +1F9EE ; fully-qualified # ๐งฎ abacus | |
| 3299 | + | |
| 3300 | +# subgroup: light & video | |
| 3301 | +1F3A5 ; fully-qualified # ๐ฅ movie camera | |
| 3302 | +1F39E FE0F ; fully-qualified # ๐๏ธ film frames | |
| 3303 | +1F39E ; unqualified # ๐ film frames | |
| 3304 | +1F4FD FE0F ; fully-qualified # ๐ฝ๏ธ film projector | |
| 3305 | +1F4FD ; unqualified # ๐ฝ film projector | |
| 3306 | +1F3AC ; fully-qualified # ๐ฌ clapper board | |
| 3307 | +1F4FA ; fully-qualified # ๐บ television | |
| 3308 | +1F4F7 ; fully-qualified # ๐ท camera | |
| 3309 | +1F4F8 ; fully-qualified # ๐ธ camera with flash | |
| 3310 | +1F4F9 ; fully-qualified # ๐น video camera | |
| 3311 | +1F4FC ; fully-qualified # ๐ผ videocassette | |
| 3312 | +1F50D ; fully-qualified # ๐ magnifying glass tilted left | |
| 3313 | +1F50E ; fully-qualified # ๐ magnifying glass tilted right | |
| 3314 | +1F56F FE0F ; fully-qualified # ๐ฏ๏ธ candle | |
| 3315 | +1F56F ; unqualified # ๐ฏ candle | |
| 3316 | +1F4A1 ; fully-qualified # ๐ก light bulb | |
| 3317 | +1F526 ; fully-qualified # ๐ฆ flashlight | |
| 3318 | +1F3EE ; fully-qualified # ๐ฎ red paper lantern | |
| 3319 | +1FA94 ; fully-qualified # ๐ช diya lamp | |
| 3320 | + | |
| 3321 | +# subgroup: book-paper | |
| 3322 | +1F4D4 ; fully-qualified # ๐ notebook with decorative cover | |
| 3323 | +1F4D5 ; fully-qualified # ๐ closed book | |
| 3324 | +1F4D6 ; fully-qualified # ๐ open book | |
| 3325 | +1F4D7 ; fully-qualified # ๐ green book | |
| 3326 | +1F4D8 ; fully-qualified # ๐ blue book | |
| 3327 | +1F4D9 ; fully-qualified # ๐ orange book | |
| 3328 | +1F4DA ; fully-qualified # ๐ books | |
| 3329 | +1F4D3 ; fully-qualified # ๐ notebook | |
| 3330 | +1F4D2 ; fully-qualified # ๐ ledger | |
| 3331 | +1F4C3 ; fully-qualified # ๐ page with curl | |
| 3332 | +1F4DC ; fully-qualified # ๐ scroll | |
| 3333 | +1F4C4 ; fully-qualified # ๐ page facing up | |
| 3334 | +1F4F0 ; fully-qualified # ๐ฐ newspaper | |
| 3335 | +1F5DE FE0F ; fully-qualified # ๐๏ธ rolled-up newspaper | |
| 3336 | +1F5DE ; unqualified # ๐ rolled-up newspaper | |
| 3337 | +1F4D1 ; fully-qualified # ๐ bookmark tabs | |
| 3338 | +1F516 ; fully-qualified # ๐ bookmark | |
| 3339 | +1F3F7 FE0F ; fully-qualified # ๐ท๏ธ label | |
| 3340 | +1F3F7 ; unqualified # ๐ท label | |
| 3341 | + | |
| 3342 | +# subgroup: money | |
| 3343 | +1F4B0 ; fully-qualified # ๐ฐ money bag | |
| 3344 | +1F4B4 ; fully-qualified # ๐ด yen banknote | |
| 3345 | +1F4B5 ; fully-qualified # ๐ต dollar banknote | |
| 3346 | +1F4B6 ; fully-qualified # ๐ถ euro banknote | |
| 3347 | +1F4B7 ; fully-qualified # ๐ท pound banknote | |
| 3348 | +1F4B8 ; fully-qualified # ๐ธ money with wings | |
| 3349 | +1F4B3 ; fully-qualified # ๐ณ credit card | |
| 3350 | +1F9FE ; fully-qualified # ๐งพ receipt | |
| 3351 | +1F4B9 ; fully-qualified # ๐น chart increasing with yen | |
| 3352 | +1F4B1 ; fully-qualified # ๐ฑ currency exchange | |
| 3353 | +1F4B2 ; fully-qualified # ๐ฒ heavy dollar sign | |
| 3354 | + | |
| 3355 | +# subgroup: mail | |
| 3356 | +2709 FE0F ; fully-qualified # โ๏ธ envelope | |
| 3357 | +2709 ; unqualified # โ envelope | |
| 3358 | +1F4E7 ; fully-qualified # ๐ง e-mail | |
| 3359 | +1F4E8 ; fully-qualified # ๐จ incoming envelope | |
| 3360 | +1F4E9 ; fully-qualified # ๐ฉ envelope with arrow | |
| 3361 | +1F4E4 ; fully-qualified # ๐ค outbox tray | |
| 3362 | +1F4E5 ; fully-qualified # ๐ฅ inbox tray | |
| 3363 | +1F4E6 ; fully-qualified # ๐ฆ package | |
| 3364 | +1F4EB ; fully-qualified # ๐ซ closed mailbox with raised flag | |
| 3365 | +1F4EA ; fully-qualified # ๐ช closed mailbox with lowered flag | |
| 3366 | +1F4EC ; fully-qualified # ๐ฌ open mailbox with raised flag | |
| 3367 | +1F4ED ; fully-qualified # ๐ญ open mailbox with lowered flag | |
| 3368 | +1F4EE ; fully-qualified # ๐ฎ postbox | |
| 3369 | +1F5F3 FE0F ; fully-qualified # ๐ณ๏ธ ballot box with ballot | |
| 3370 | +1F5F3 ; unqualified # ๐ณ ballot box with ballot | |
| 3371 | + | |
| 3372 | +# subgroup: writing | |
| 3373 | +270F FE0F ; fully-qualified # โ๏ธ pencil | |
| 3374 | +270F ; unqualified # โ pencil | |
| 3375 | +2712 FE0F ; fully-qualified # โ๏ธ black nib | |
| 3376 | +2712 ; unqualified # โ black nib | |
| 3377 | +1F58B FE0F ; fully-qualified # ๐๏ธ fountain pen | |
| 3378 | +1F58B ; unqualified # ๐ fountain pen | |
| 3379 | +1F58A FE0F ; fully-qualified # ๐๏ธ pen | |
| 3380 | +1F58A ; unqualified # ๐ pen | |
| 3381 | +1F58C FE0F ; fully-qualified # ๐๏ธ paintbrush | |
| 3382 | +1F58C ; unqualified # ๐ paintbrush | |
| 3383 | +1F58D FE0F ; fully-qualified # ๐๏ธ crayon | |
| 3384 | +1F58D ; unqualified # ๐ crayon | |
| 3385 | +1F4DD ; fully-qualified # ๐ memo | |
| 3386 | + | |
| 3387 | +# subgroup: office | |
| 3388 | +1F4BC ; fully-qualified # ๐ผ briefcase | |
| 3389 | +1F4C1 ; fully-qualified # ๐ file folder | |
| 3390 | +1F4C2 ; fully-qualified # ๐ open file folder | |
| 3391 | +1F5C2 FE0F ; fully-qualified # ๐๏ธ card index dividers | |
| 3392 | +1F5C2 ; unqualified # ๐ card index dividers | |
| 3393 | +1F4C5 ; fully-qualified # ๐ calendar | |
| 3394 | +1F4C6 ; fully-qualified # ๐ tear-off calendar | |
| 3395 | +1F5D2 FE0F ; fully-qualified # ๐๏ธ spiral notepad | |
| 3396 | +1F5D2 ; unqualified # ๐ spiral notepad | |
| 3397 | +1F5D3 FE0F ; fully-qualified # ๐๏ธ spiral calendar | |
| 3398 | +1F5D3 ; unqualified # ๐ spiral calendar | |
| 3399 | +1F4C7 ; fully-qualified # ๐ card index | |
| 3400 | +1F4C8 ; fully-qualified # ๐ chart increasing | |
| 3401 | +1F4C9 ; fully-qualified # ๐ chart decreasing | |
| 3402 | +1F4CA ; fully-qualified # ๐ bar chart | |
| 3403 | +1F4CB ; fully-qualified # ๐ clipboard | |
| 3404 | +1F4CC ; fully-qualified # ๐ pushpin | |
| 3405 | +1F4CD ; fully-qualified # ๐ round pushpin | |
| 3406 | +1F4CE ; fully-qualified # ๐ paperclip | |
| 3407 | +1F587 FE0F ; fully-qualified # ๐๏ธ linked paperclips | |
| 3408 | +1F587 ; unqualified # ๐ linked paperclips | |
| 3409 | +1F4CF ; fully-qualified # ๐ straight ruler | |
| 3410 | +1F4D0 ; fully-qualified # ๐ triangular ruler | |
| 3411 | +2702 FE0F ; fully-qualified # โ๏ธ scissors | |
| 3412 | +2702 ; unqualified # โ scissors | |
| 3413 | +1F5C3 FE0F ; fully-qualified # ๐๏ธ card file box | |
| 3414 | +1F5C3 ; unqualified # ๐ card file box | |
| 3415 | +1F5C4 FE0F ; fully-qualified # ๐๏ธ file cabinet | |
| 3416 | +1F5C4 ; unqualified # ๐ file cabinet | |
| 3417 | +1F5D1 FE0F ; fully-qualified # ๐๏ธ wastebasket | |
| 3418 | +1F5D1 ; unqualified # ๐ wastebasket | |
| 3419 | + | |
| 3420 | +# subgroup: lock | |
| 3421 | +1F512 ; fully-qualified # ๐ locked | |
| 3422 | +1F513 ; fully-qualified # ๐ unlocked | |
| 3423 | +1F50F ; fully-qualified # ๐ locked with pen | |
| 3424 | +1F510 ; fully-qualified # ๐ locked with key | |
| 3425 | +1F511 ; fully-qualified # ๐ key | |
| 3426 | +1F5DD FE0F ; fully-qualified # ๐๏ธ old key | |
| 3427 | +1F5DD ; unqualified # ๐ old key | |
| 3428 | + | |
| 3429 | +# subgroup: tool | |
| 3430 | +1F528 ; fully-qualified # ๐จ hammer | |
| 3431 | +1FA93 ; fully-qualified # ๐ช axe | |
| 3432 | +26CF FE0F ; fully-qualified # โ๏ธ pick | |
| 3433 | +26CF ; unqualified # โ pick | |
| 3434 | +2692 FE0F ; fully-qualified # โ๏ธ hammer and pick | |
| 3435 | +2692 ; unqualified # โ hammer and pick | |
| 3436 | +1F6E0 FE0F ; fully-qualified # ๐ ๏ธ hammer and wrench | |
| 3437 | +1F6E0 ; unqualified # ๐ hammer and wrench | |
| 3438 | +1F5E1 FE0F ; fully-qualified # ๐ก๏ธ dagger | |
| 3439 | +1F5E1 ; unqualified # ๐ก dagger | |
| 3440 | +2694 FE0F ; fully-qualified # โ๏ธ crossed swords | |
| 3441 | +2694 ; unqualified # โ crossed swords | |
| 3442 | +1F52B ; fully-qualified # ๐ซ pistol | |
| 3443 | +1F3F9 ; fully-qualified # ๐น bow and arrow | |
| 3444 | +1F6E1 FE0F ; fully-qualified # ๐ก๏ธ shield | |
| 3445 | +1F6E1 ; unqualified # ๐ก shield | |
| 3446 | +1F527 ; fully-qualified # ๐ง wrench | |
| 3447 | +1F529 ; fully-qualified # ๐ฉ nut and bolt | |
| 3448 | +2699 FE0F ; fully-qualified # โ๏ธ gear | |
| 3449 | +2699 ; unqualified # โ gear | |
| 3450 | +1F5DC FE0F ; fully-qualified # ๐๏ธ clamp | |
| 3451 | +1F5DC ; unqualified # ๐ clamp | |
| 3452 | +2696 FE0F ; fully-qualified # โ๏ธ balance scale | |
| 3453 | +2696 ; unqualified # โ balance scale | |
| 3454 | +1F9AF ; fully-qualified # ๐ฆฏ probing cane | |
| 3455 | +1F517 ; fully-qualified # ๐ link | |
| 3456 | +26D3 FE0F ; fully-qualified # โ๏ธ chains | |
| 3457 | +26D3 ; unqualified # โ chains | |
| 3458 | +1F9F0 ; fully-qualified # ๐งฐ toolbox | |
| 3459 | +1F9F2 ; fully-qualified # ๐งฒ magnet | |
| 3460 | + | |
| 3461 | +# subgroup: science | |
| 3462 | +2697 FE0F ; fully-qualified # โ๏ธ alembic | |
| 3463 | +2697 ; unqualified # โ alembic | |
| 3464 | +1F9EA ; fully-qualified # ๐งช test tube | |
| 3465 | +1F9EB ; fully-qualified # ๐งซ petri dish | |
| 3466 | +1F9EC ; fully-qualified # ๐งฌ dna | |
| 3467 | +1F52C ; fully-qualified # ๐ฌ microscope | |
| 3468 | +1F52D ; fully-qualified # ๐ญ telescope | |
| 3469 | +1F4E1 ; fully-qualified # ๐ก satellite antenna | |
| 3470 | + | |
| 3471 | +# subgroup: medical | |
| 3472 | +1F489 ; fully-qualified # ๐ syringe | |
| 3473 | +1FA78 ; fully-qualified # ๐ฉธ drop of blood | |
| 3474 | +1F48A ; fully-qualified # ๐ pill | |
| 3475 | +1FA79 ; fully-qualified # ๐ฉน adhesive bandage | |
| 3476 | +1FA7A ; fully-qualified # ๐ฉบ stethoscope | |
| 3477 | + | |
| 3478 | +# subgroup: household | |
| 3479 | +1F6AA ; fully-qualified # ๐ช door | |
| 3480 | +1F6CF FE0F ; fully-qualified # ๐๏ธ bed | |
| 3481 | +1F6CF ; unqualified # ๐ bed | |
| 3482 | +1F6CB FE0F ; fully-qualified # ๐๏ธ couch and lamp | |
| 3483 | +1F6CB ; unqualified # ๐ couch and lamp | |
| 3484 | +1FA91 ; fully-qualified # ๐ช chair | |
| 3485 | +1F6BD ; fully-qualified # ๐ฝ toilet | |
| 3486 | +1F6BF ; fully-qualified # ๐ฟ shower | |
| 3487 | +1F6C1 ; fully-qualified # ๐ bathtub | |
| 3488 | +1FA92 ; fully-qualified # ๐ช razor | |
| 3489 | +1F9F4 ; fully-qualified # ๐งด lotion bottle | |
| 3490 | +1F9F7 ; fully-qualified # ๐งท safety pin | |
| 3491 | +1F9F9 ; fully-qualified # ๐งน broom | |
| 3492 | +1F9FA ; fully-qualified # ๐งบ basket | |
| 3493 | +1F9FB ; fully-qualified # ๐งป roll of paper | |
| 3494 | +1F9FC ; fully-qualified # ๐งผ soap | |
| 3495 | +1F9FD ; fully-qualified # ๐งฝ sponge | |
| 3496 | +1F9EF ; fully-qualified # ๐งฏ fire extinguisher | |
| 3497 | +1F6D2 ; fully-qualified # ๐ shopping cart | |
| 3498 | + | |
| 3499 | +# subgroup: other-object | |
| 3500 | +1F6AC ; fully-qualified # ๐ฌ cigarette | |
| 3501 | +26B0 FE0F ; fully-qualified # โฐ๏ธ coffin | |
| 3502 | +26B0 ; unqualified # โฐ coffin | |
| 3503 | +26B1 FE0F ; fully-qualified # โฑ๏ธ funeral urn | |
| 3504 | +26B1 ; unqualified # โฑ funeral urn | |
| 3505 | +1F5FF ; fully-qualified # ๐ฟ moai | |
| 3506 | + | |
| 3507 | +# Objects subtotal: 282 | |
| 3508 | +# Objects subtotal: 282 w/o modifiers | |
| 3509 | + | |
| 3510 | +# group: Symbols | |
| 3511 | + | |
| 3512 | +# subgroup: transport-sign | |
| 3513 | +1F3E7 ; fully-qualified # ๐ง ATM sign | |
| 3514 | +1F6AE ; fully-qualified # ๐ฎ litter in bin sign | |
| 3515 | +1F6B0 ; fully-qualified # ๐ฐ potable water | |
| 3516 | +267F ; fully-qualified # โฟ wheelchair symbol | |
| 3517 | +1F6B9 ; fully-qualified # ๐น menโs room | |
| 3518 | +1F6BA ; fully-qualified # ๐บ womenโs room | |
| 3519 | +1F6BB ; fully-qualified # ๐ป restroom | |
| 3520 | +1F6BC ; fully-qualified # ๐ผ baby symbol | |
| 3521 | +1F6BE ; fully-qualified # ๐พ water closet | |
| 3522 | +1F6C2 ; fully-qualified # ๐ passport control | |
| 3523 | +1F6C3 ; fully-qualified # ๐ customs | |
| 3524 | +1F6C4 ; fully-qualified # ๐ baggage claim | |
| 3525 | +1F6C5 ; fully-qualified # ๐ left luggage | |
| 3526 | + | |
| 3527 | +# subgroup: warning | |
| 3528 | +26A0 FE0F ; fully-qualified # โ ๏ธ warning | |
| 3529 | +26A0 ; unqualified # โ warning | |
| 3530 | +1F6B8 ; fully-qualified # ๐ธ children crossing | |
| 3531 | +26D4 ; fully-qualified # โ no entry | |
| 3532 | +1F6AB ; fully-qualified # ๐ซ prohibited | |
| 3533 | +1F6B3 ; fully-qualified # ๐ณ no bicycles | |
| 3534 | +1F6AD ; fully-qualified # ๐ญ no smoking | |
| 3535 | +1F6AF ; fully-qualified # ๐ฏ no littering | |
| 3536 | +1F6B1 ; fully-qualified # ๐ฑ non-potable water | |
| 3537 | +1F6B7 ; fully-qualified # ๐ท no pedestrians | |
| 3538 | +1F4F5 ; fully-qualified # ๐ต no mobile phones | |
| 3539 | +1F51E ; fully-qualified # ๐ no one under eighteen | |
| 3540 | +2622 FE0F ; fully-qualified # โข๏ธ radioactive | |
| 3541 | +2622 ; unqualified # โข radioactive | |
| 3542 | +2623 FE0F ; fully-qualified # โฃ๏ธ biohazard | |
| 3543 | +2623 ; unqualified # โฃ biohazard | |
| 3544 | + | |
| 3545 | +# subgroup: arrow | |
| 3546 | +2B06 FE0F ; fully-qualified # โฌ๏ธ up arrow | |
| 3547 | +2B06 ; unqualified # โฌ up arrow | |
| 3548 | +2197 FE0F ; fully-qualified # โ๏ธ up-right arrow | |
| 3549 | +2197 ; unqualified # โ up-right arrow | |
| 3550 | +27A1 FE0F ; fully-qualified # โก๏ธ right arrow | |
| 3551 | +27A1 ; unqualified # โก right arrow | |
| 3552 | +2198 FE0F ; fully-qualified # โ๏ธ down-right arrow | |
| 3553 | +2198 ; unqualified # โ down-right arrow | |
| 3554 | +2B07 FE0F ; fully-qualified # โฌ๏ธ down arrow | |
| 3555 | +2B07 ; unqualified # โฌ down arrow | |
| 3556 | +2199 FE0F ; fully-qualified # โ๏ธ down-left arrow | |
| 3557 | +2199 ; unqualified # โ down-left arrow | |
| 3558 | +2B05 FE0F ; fully-qualified # โฌ ๏ธ left arrow | |
| 3559 | +2B05 ; unqualified # โฌ left arrow | |
| 3560 | +2196 FE0F ; fully-qualified # โ๏ธ up-left arrow | |
| 3561 | +2196 ; unqualified # โ up-left arrow | |
| 3562 | +2195 FE0F ; fully-qualified # โ๏ธ up-down arrow | |
| 3563 | +2195 ; unqualified # โ up-down arrow | |
| 3564 | +2194 FE0F ; fully-qualified # โ๏ธ left-right arrow | |
| 3565 | +2194 ; unqualified # โ left-right arrow | |
| 3566 | +21A9 FE0F ; fully-qualified # โฉ๏ธ right arrow curving left | |
| 3567 | +21A9 ; unqualified # โฉ right arrow curving left | |
| 3568 | +21AA FE0F ; fully-qualified # โช๏ธ left arrow curving right | |
| 3569 | +21AA ; unqualified # โช left arrow curving right | |
| 3570 | +2934 FE0F ; fully-qualified # โคด๏ธ right arrow curving up | |
| 3571 | +2934 ; unqualified # โคด right arrow curving up | |
| 3572 | +2935 FE0F ; fully-qualified # โคต๏ธ right arrow curving down | |
| 3573 | +2935 ; unqualified # โคต right arrow curving down | |
| 3574 | +1F503 ; fully-qualified # ๐ clockwise vertical arrows | |
| 3575 | +1F504 ; fully-qualified # ๐ counterclockwise arrows button | |
| 3576 | +1F519 ; fully-qualified # ๐ BACK arrow | |
| 3577 | +1F51A ; fully-qualified # ๐ END arrow | |
| 3578 | +1F51B ; fully-qualified # ๐ ON! arrow | |
| 3579 | +1F51C ; fully-qualified # ๐ SOON arrow | |
| 3580 | +1F51D ; fully-qualified # ๐ TOP arrow | |
| 3581 | + | |
| 3582 | +# subgroup: religion | |
| 3583 | +1F6D0 ; fully-qualified # ๐ place of worship | |
| 3584 | +269B FE0F ; fully-qualified # โ๏ธ atom symbol | |
| 3585 | +269B ; unqualified # โ atom symbol | |
| 3586 | +1F549 FE0F ; fully-qualified # ๐๏ธ om | |
| 3587 | +1F549 ; unqualified # ๐ om | |
| 3588 | +2721 FE0F ; fully-qualified # โก๏ธ star of David | |
| 3589 | +2721 ; unqualified # โก star of David | |
| 3590 | +2638 FE0F ; fully-qualified # โธ๏ธ wheel of dharma | |
| 3591 | +2638 ; unqualified # โธ wheel of dharma | |
| 3592 | +262F FE0F ; fully-qualified # โฏ๏ธ yin yang | |
| 3593 | +262F ; unqualified # โฏ yin yang | |
| 3594 | +271D FE0F ; fully-qualified # โ๏ธ latin cross | |
| 3595 | +271D ; unqualified # โ latin cross | |
| 3596 | +2626 FE0F ; fully-qualified # โฆ๏ธ orthodox cross | |
| 3597 | +2626 ; unqualified # โฆ orthodox cross | |
| 3598 | +262A FE0F ; fully-qualified # โช๏ธ star and crescent | |
| 3599 | +262A ; unqualified # โช star and crescent | |
| 3600 | +262E FE0F ; fully-qualified # โฎ๏ธ peace symbol | |
| 3601 | +262E ; unqualified # โฎ peace symbol | |
| 3602 | +1F54E ; fully-qualified # ๐ menorah | |
| 3603 | +1F52F ; fully-qualified # ๐ฏ dotted six-pointed star | |
| 3604 | + | |
| 3605 | +# subgroup: zodiac | |
| 3606 | +2648 ; fully-qualified # โ Aries | |
| 3607 | +2649 ; fully-qualified # โ Taurus | |
| 3608 | +264A ; fully-qualified # โ Gemini | |
| 3609 | +264B ; fully-qualified # โ Cancer | |
| 3610 | +264C ; fully-qualified # โ Leo | |
| 3611 | +264D ; fully-qualified # โ Virgo | |
| 3612 | +264E ; fully-qualified # โ Libra | |
| 3613 | +264F ; fully-qualified # โ Scorpio | |
| 3614 | +2650 ; fully-qualified # โ Sagittarius | |
| 3615 | +2651 ; fully-qualified # โ Capricorn | |
| 3616 | +2652 ; fully-qualified # โ Aquarius | |
| 3617 | +2653 ; fully-qualified # โ Pisces | |
| 3618 | +26CE ; fully-qualified # โ Ophiuchus | |
| 3619 | + | |
| 3620 | +# subgroup: av-symbol | |
| 3621 | +1F500 ; fully-qualified # ๐ shuffle tracks button | |
| 3622 | +1F501 ; fully-qualified # ๐ repeat button | |
| 3623 | +1F502 ; fully-qualified # ๐ repeat single button | |
| 3624 | +25B6 FE0F ; fully-qualified # โถ๏ธ play button | |
| 3625 | +25B6 ; unqualified # โถ play button | |
| 3626 | +23E9 ; fully-qualified # โฉ fast-forward button | |
| 3627 | +23ED FE0F ; fully-qualified # โญ๏ธ next track button | |
| 3628 | +23ED ; unqualified # โญ next track button | |
| 3629 | +23EF FE0F ; fully-qualified # โฏ๏ธ play or pause button | |
| 3630 | +23EF ; unqualified # โฏ play or pause button | |
| 3631 | +25C0 FE0F ; fully-qualified # โ๏ธ reverse button | |
| 3632 | +25C0 ; unqualified # โ reverse button | |
| 3633 | +23EA ; fully-qualified # โช fast reverse button | |
| 3634 | +23EE FE0F ; fully-qualified # โฎ๏ธ last track button | |
| 3635 | +23EE ; unqualified # โฎ last track button | |
| 3636 | +1F53C ; fully-qualified # ๐ผ upwards button | |
| 3637 | +23EB ; fully-qualified # โซ fast up button | |
| 3638 | +1F53D ; fully-qualified # ๐ฝ downwards button | |
| 3639 | +23EC ; fully-qualified # โฌ fast down button | |
| 3640 | +23F8 FE0F ; fully-qualified # โธ๏ธ pause button | |
| 3641 | +23F8 ; unqualified # โธ pause button | |
| 3642 | +23F9 FE0F ; fully-qualified # โน๏ธ stop button | |
| 3643 | +23F9 ; unqualified # โน stop button | |
| 3644 | +23FA FE0F ; fully-qualified # โบ๏ธ record button | |
| 3645 | +23FA ; unqualified # โบ record button | |
| 3646 | +23CF FE0F ; fully-qualified # โ๏ธ eject button | |
| 3647 | +23CF ; unqualified # โ eject button | |
| 3648 | +1F3A6 ; fully-qualified # ๐ฆ cinema | |
| 3649 | +1F505 ; fully-qualified # ๐ dim button | |
| 3650 | +1F506 ; fully-qualified # ๐ bright button | |
| 3651 | +1F4F6 ; fully-qualified # ๐ถ antenna bars | |
| 3652 | +1F4F3 ; fully-qualified # ๐ณ vibration mode | |
| 3653 | +1F4F4 ; fully-qualified # ๐ด mobile phone off | |
| 3654 | + | |
| 3655 | +# subgroup: gender | |
| 3656 | +2640 FE0F ; fully-qualified # โ๏ธ female sign | |
| 3657 | +2640 ; unqualified # โ female sign | |
| 3658 | +2642 FE0F ; fully-qualified # โ๏ธ male sign | |
| 3659 | +2642 ; unqualified # โ male sign | |
| 3660 | + | |
| 3661 | +# subgroup: other-symbol | |
| 3662 | +2695 FE0F ; fully-qualified # โ๏ธ medical symbol | |
| 3663 | +2695 ; unqualified # โ medical symbol | |
| 3664 | +267E FE0F ; fully-qualified # โพ๏ธ infinity | |
| 3665 | +267E ; unqualified # โพ infinity | |
| 3666 | +267B FE0F ; fully-qualified # โป๏ธ recycling symbol | |
| 3667 | +267B ; unqualified # โป recycling symbol | |
| 3668 | +269C FE0F ; fully-qualified # โ๏ธ fleur-de-lis | |
| 3669 | +269C ; unqualified # โ fleur-de-lis | |
| 3670 | +1F531 ; fully-qualified # ๐ฑ trident emblem | |
| 3671 | +1F4DB ; fully-qualified # ๐ name badge | |
| 3672 | +1F530 ; fully-qualified # ๐ฐ Japanese symbol for beginner | |
| 3673 | +2B55 ; fully-qualified # โญ hollow red circle | |
| 3674 | +2705 ; fully-qualified # โ check mark button | |
| 3675 | +2611 FE0F ; fully-qualified # โ๏ธ check box with check | |
| 3676 | +2611 ; unqualified # โ check box with check | |
| 3677 | +2714 FE0F ; fully-qualified # โ๏ธ check mark | |
| 3678 | +2714 ; unqualified # โ check mark | |
| 3679 | +2716 FE0F ; fully-qualified # โ๏ธ multiplication sign | |
| 3680 | +2716 ; unqualified # โ multiplication sign | |
| 3681 | +274C ; fully-qualified # โ cross mark | |
| 3682 | +274E ; fully-qualified # โ cross mark button | |
| 3683 | +2795 ; fully-qualified # โ plus sign | |
| 3684 | +2796 ; fully-qualified # โ minus sign | |
| 3685 | +2797 ; fully-qualified # โ division sign | |
| 3686 | +27B0 ; fully-qualified # โฐ curly loop | |
| 3687 | +27BF ; fully-qualified # โฟ double curly loop | |
| 3688 | +303D FE0F ; fully-qualified # ใฝ๏ธ part alternation mark | |
| 3689 | +303D ; unqualified # ใฝ part alternation mark | |
| 3690 | +2733 FE0F ; fully-qualified # โณ๏ธ eight-spoked asterisk | |
| 3691 | +2733 ; unqualified # โณ eight-spoked asterisk | |
| 3692 | +2734 FE0F ; fully-qualified # โด๏ธ eight-pointed star | |
| 3693 | +2734 ; unqualified # โด eight-pointed star | |
| 3694 | +2747 FE0F ; fully-qualified # โ๏ธ sparkle | |
| 3695 | +2747 ; unqualified # โ sparkle | |
| 3696 | +203C FE0F ; fully-qualified # โผ๏ธ double exclamation mark | |
| 3697 | +203C ; unqualified # โผ double exclamation mark | |
| 3698 | +2049 FE0F ; fully-qualified # โ๏ธ exclamation question mark | |
| 3699 | +2049 ; unqualified # โ exclamation question mark | |
| 3700 | +2753 ; fully-qualified # โ question mark | |
| 3701 | +2754 ; fully-qualified # โ white question mark | |
| 3702 | +2755 ; fully-qualified # โ white exclamation mark | |
| 3703 | +2757 ; fully-qualified # โ exclamation mark | |
| 3704 | +3030 FE0F ; fully-qualified # ใฐ๏ธ wavy dash | |
| 3705 | +3030 ; unqualified # ใฐ wavy dash | |
| 3706 | +00A9 FE0F ; fully-qualified # ยฉ๏ธ copyright | |
| 3707 | +00A9 ; unqualified # ยฉ copyright | |
| 3708 | +00AE FE0F ; fully-qualified # ยฎ๏ธ registered | |
| 3709 | +00AE ; unqualified # ยฎ registered | |
| 3710 | +2122 FE0F ; fully-qualified # โข๏ธ trade mark | |
| 3711 | +2122 ; unqualified # โข trade mark | |
| 3712 | + | |
| 3713 | +# subgroup: keycap | |
| 3714 | +0023 FE0F 20E3 ; fully-qualified # #๏ธโฃ keycap: # | |
| 3715 | +0023 20E3 ; unqualified # #โฃ keycap: # | |
| 3716 | +002A FE0F 20E3 ; fully-qualified # *๏ธโฃ keycap: * | |
| 3717 | +002A 20E3 ; unqualified # *โฃ keycap: * | |
| 3718 | +0030 FE0F 20E3 ; fully-qualified # 0๏ธโฃ keycap: 0 | |
| 3719 | +0030 20E3 ; unqualified # 0โฃ keycap: 0 | |
| 3720 | +0031 FE0F 20E3 ; fully-qualified # 1๏ธโฃ keycap: 1 | |
| 3721 | +0031 20E3 ; unqualified # 1โฃ keycap: 1 | |
| 3722 | +0032 FE0F 20E3 ; fully-qualified # 2๏ธโฃ keycap: 2 | |
| 3723 | +0032 20E3 ; unqualified # 2โฃ keycap: 2 | |
| 3724 | +0033 FE0F 20E3 ; fully-qualified # 3๏ธโฃ keycap: 3 | |
| 3725 | +0033 20E3 ; unqualified # 3โฃ keycap: 3 | |
| 3726 | +0034 FE0F 20E3 ; fully-qualified # 4๏ธโฃ keycap: 4 | |
| 3727 | +0034 20E3 ; unqualified # 4โฃ keycap: 4 | |
| 3728 | +0035 FE0F 20E3 ; fully-qualified # 5๏ธโฃ keycap: 5 | |
| 3729 | +0035 20E3 ; unqualified # 5โฃ keycap: 5 | |
| 3730 | +0036 FE0F 20E3 ; fully-qualified # 6๏ธโฃ keycap: 6 | |
| 3731 | +0036 20E3 ; unqualified # 6โฃ keycap: 6 | |
| 3732 | +0037 FE0F 20E3 ; fully-qualified # 7๏ธโฃ keycap: 7 | |
| 3733 | +0037 20E3 ; unqualified # 7โฃ keycap: 7 | |
| 3734 | +0038 FE0F 20E3 ; fully-qualified # 8๏ธโฃ keycap: 8 | |
| 3735 | +0038 20E3 ; unqualified # 8โฃ keycap: 8 | |
| 3736 | +0039 FE0F 20E3 ; fully-qualified # 9๏ธโฃ keycap: 9 | |
| 3737 | +0039 20E3 ; unqualified # 9โฃ keycap: 9 | |
| 3738 | +1F51F ; fully-qualified # ๐ keycap: 10 | |
| 3739 | + | |
| 3740 | +# subgroup: alphanum | |
| 3741 | +1F520 ; fully-qualified # ๐ input latin uppercase | |
| 3742 | +1F521 ; fully-qualified # ๐ก input latin lowercase | |
| 3743 | +1F522 ; fully-qualified # ๐ข input numbers | |
| 3744 | +1F523 ; fully-qualified # ๐ฃ input symbols | |
| 3745 | +1F524 ; fully-qualified # ๐ค input latin letters | |
| 3746 | +1F170 FE0F ; fully-qualified # ๐ ฐ๏ธ A button (blood type) | |
| 3747 | +1F170 ; unqualified # ๐ ฐ A button (blood type) | |
| 3748 | +1F18E ; fully-qualified # ๐ AB button (blood type) | |
| 3749 | +1F171 FE0F ; fully-qualified # ๐ ฑ๏ธ B button (blood type) | |
| 3750 | +1F171 ; unqualified # ๐ ฑ B button (blood type) | |
| 3751 | +1F191 ; fully-qualified # ๐ CL button | |
| 3752 | +1F192 ; fully-qualified # ๐ COOL button | |
| 3753 | +1F193 ; fully-qualified # ๐ FREE button | |
| 3754 | +2139 FE0F ; fully-qualified # โน๏ธ information | |
| 3755 | +2139 ; unqualified # โน information | |
| 3756 | +1F194 ; fully-qualified # ๐ ID button | |
| 3757 | +24C2 FE0F ; fully-qualified # โ๏ธ circled M | |
| 3758 | +24C2 ; unqualified # โ circled M | |
| 3759 | +1F195 ; fully-qualified # ๐ NEW button | |
| 3760 | +1F196 ; fully-qualified # ๐ NG button | |
| 3761 | +1F17E FE0F ; fully-qualified # ๐ พ๏ธ O button (blood type) | |
| 3762 | +1F17E ; unqualified # ๐ พ O button (blood type) | |
| 3763 | +1F197 ; fully-qualified # ๐ OK button | |
| 3764 | +1F17F FE0F ; fully-qualified # ๐ ฟ๏ธ P button | |
| 3765 | +1F17F ; unqualified # ๐ ฟ P button | |
| 3766 | +1F198 ; fully-qualified # ๐ SOS button | |
| 3767 | +1F199 ; fully-qualified # ๐ UP! button | |
| 3768 | +1F19A ; fully-qualified # ๐ VS button | |
| 3769 | +1F201 ; fully-qualified # ๐ Japanese โhereโ button | |
| 3770 | +1F202 FE0F ; fully-qualified # ๐๏ธ Japanese โservice chargeโ button | |
| 3771 | +1F202 ; unqualified # ๐ Japanese โservice chargeโ button | |
| 3772 | +1F237 FE0F ; fully-qualified # ๐ท๏ธ Japanese โmonthly amountโ button | |
| 3773 | +1F237 ; unqualified # ๐ท Japanese โmonthly amountโ button | |
| 3774 | +1F236 ; fully-qualified # ๐ถ Japanese โnot free of chargeโ button | |
| 3775 | +1F22F ; fully-qualified # ๐ฏ Japanese โreservedโ button | |
| 3776 | +1F250 ; fully-qualified # ๐ Japanese โbargainโ button | |
| 3777 | +1F239 ; fully-qualified # ๐น Japanese โdiscountโ button | |
| 3778 | +1F21A ; fully-qualified # ๐ Japanese โfree of chargeโ button | |
| 3779 | +1F232 ; fully-qualified # ๐ฒ Japanese โprohibitedโ button | |
| 3780 | +1F251 ; fully-qualified # ๐ Japanese โacceptableโ button | |
| 3781 | +1F238 ; fully-qualified # ๐ธ Japanese โapplicationโ button | |
| 3782 | +1F234 ; fully-qualified # ๐ด Japanese โpassing gradeโ button | |
| 3783 | +1F233 ; fully-qualified # ๐ณ Japanese โvacancyโ button | |
| 3784 | +3297 FE0F ; fully-qualified # ใ๏ธ Japanese โcongratulationsโ button | |
| 3785 | +3297 ; unqualified # ใ Japanese โcongratulationsโ button | |
| 3786 | +3299 FE0F ; fully-qualified # ใ๏ธ Japanese โsecretโ button | |
| 3787 | +3299 ; unqualified # ใ Japanese โsecretโ button | |
| 3788 | +1F23A ; fully-qualified # ๐บ Japanese โopen for businessโ button | |
| 3789 | +1F235 ; fully-qualified # ๐ต Japanese โno vacancyโ button | |
| 3790 | + | |
| 3791 | +# subgroup: geometric | |
| 3792 | +1F534 ; fully-qualified # ๐ด red circle | |
| 3793 | +1F7E0 ; fully-qualified # ๐ orange circle | |
| 3794 | +1F7E1 ; fully-qualified # ๐ก yellow circle | |
| 3795 | +1F7E2 ; fully-qualified # ๐ข green circle | |
| 3796 | +1F535 ; fully-qualified # ๐ต blue circle | |
| 3797 | +1F7E3 ; fully-qualified # ๐ฃ purple circle | |
| 3798 | +1F7E4 ; fully-qualified # ๐ค brown circle | |
| 3799 | +26AB ; fully-qualified # โซ black circle | |
| 3800 | +26AA ; fully-qualified # โช white circle | |
| 3801 | +1F7E5 ; fully-qualified # ๐ฅ red square | |
| 3802 | +1F7E7 ; fully-qualified # ๐ง orange square | |
| 3803 | +1F7E8 ; fully-qualified # ๐จ yellow square | |
| 3804 | +1F7E9 ; fully-qualified # ๐ฉ green square | |
| 3805 | +1F7E6 ; fully-qualified # ๐ฆ blue square | |
| 3806 | +1F7EA ; fully-qualified # ๐ช purple square | |
| 3807 | +1F7EB ; fully-qualified # ๐ซ brown square | |
| 3808 | +2B1B ; fully-qualified # โฌ black large square | |
| 3809 | +2B1C ; fully-qualified # โฌ white large square | |
| 3810 | +25FC FE0F ; fully-qualified # โผ๏ธ black medium square | |
| 3811 | +25FC ; unqualified # โผ black medium square | |
| 3812 | +25FB FE0F ; fully-qualified # โป๏ธ white medium square | |
| 3813 | +25FB ; unqualified # โป white medium square | |
| 3814 | +25FE ; fully-qualified # โพ black medium-small square | |
| 3815 | +25FD ; fully-qualified # โฝ white medium-small square | |
| 3816 | +25AA FE0F ; fully-qualified # โช๏ธ black small square | |
| 3817 | +25AA ; unqualified # โช black small square | |
| 3818 | +25AB FE0F ; fully-qualified # โซ๏ธ white small square | |
| 3819 | +25AB ; unqualified # โซ white small square | |
| 3820 | +1F536 ; fully-qualified # ๐ถ large orange diamond | |
| 3821 | +1F537 ; fully-qualified # ๐ท large blue diamond | |
| 3822 | +1F538 ; fully-qualified # ๐ธ small orange diamond | |
| 3823 | +1F539 ; fully-qualified # ๐น small blue diamond | |
| 3824 | +1F53A ; fully-qualified # ๐บ red triangle pointed up | |
| 3825 | +1F53B ; fully-qualified # ๐ป red triangle pointed down | |
| 3826 | +1F4A0 ; fully-qualified # ๐ diamond with a dot | |
| 3827 | +1F518 ; fully-qualified # ๐ radio button | |
| 3828 | +1F533 ; fully-qualified # ๐ณ white square button | |
| 3829 | +1F532 ; fully-qualified # ๐ฒ black square button | |
| 3830 | + | |
| 3831 | +# Symbols subtotal: 297 | |
| 3832 | +# Symbols subtotal: 297 w/o modifiers | |
| 3833 | + | |
| 3834 | +# group: Flags | |
| 3835 | + | |
| 3836 | +# subgroup: flag | |
| 3837 | +1F3C1 ; fully-qualified # ๐ chequered flag | |
| 3838 | +1F6A9 ; fully-qualified # ๐ฉ triangular flag | |
| 3839 | +1F38C ; fully-qualified # ๐ crossed flags | |
| 3840 | +1F3F4 ; fully-qualified # ๐ด black flag | |
| 3841 | +1F3F3 FE0F ; fully-qualified # ๐ณ๏ธ white flag | |
| 3842 | +1F3F3 ; unqualified # ๐ณ white flag | |
| 3843 | +1F3F3 FE0F 200D 1F308 ; fully-qualified # ๐ณ๏ธโ๐ rainbow flag | |
| 3844 | +1F3F3 200D 1F308 ; unqualified # ๐ณโ๐ rainbow flag | |
| 3845 | +1F3F4 200D 2620 FE0F ; fully-qualified # ๐ดโโ ๏ธ pirate flag | |
| 3846 | +1F3F4 200D 2620 ; minimally-qualified # ๐ดโโ pirate flag | |
| 3847 | + | |
| 3848 | +# subgroup: country-flag | |
| 3849 | +1F1E6 1F1E8 ; fully-qualified # ๐ฆ๐จ flag: Ascension Island | |
| 3850 | +1F1E6 1F1E9 ; fully-qualified # ๐ฆ๐ฉ flag: Andorra | |
| 3851 | +1F1E6 1F1EA ; fully-qualified # ๐ฆ๐ช flag: United Arab Emirates | |
| 3852 | +1F1E6 1F1EB ; fully-qualified # ๐ฆ๐ซ flag: Afghanistan | |
| 3853 | +1F1E6 1F1EC ; fully-qualified # ๐ฆ๐ฌ flag: Antigua & Barbuda | |
| 3854 | +1F1E6 1F1EE ; fully-qualified # ๐ฆ๐ฎ flag: Anguilla | |
| 3855 | +1F1E6 1F1F1 ; fully-qualified # ๐ฆ๐ฑ flag: Albania | |
| 3856 | +1F1E6 1F1F2 ; fully-qualified # ๐ฆ๐ฒ flag: Armenia | |
| 3857 | +1F1E6 1F1F4 ; fully-qualified # ๐ฆ๐ด flag: Angola | |
| 3858 | +1F1E6 1F1F6 ; fully-qualified # ๐ฆ๐ถ flag: Antarctica | |
| 3859 | +1F1E6 1F1F7 ; fully-qualified # ๐ฆ๐ท flag: Argentina | |
| 3860 | +1F1E6 1F1F8 ; fully-qualified # ๐ฆ๐ธ flag: American Samoa | |
| 3861 | +1F1E6 1F1F9 ; fully-qualified # ๐ฆ๐น flag: Austria | |
| 3862 | +1F1E6 1F1FA ; fully-qualified # ๐ฆ๐บ flag: Australia | |
| 3863 | +1F1E6 1F1FC ; fully-qualified # ๐ฆ๐ผ flag: Aruba | |
| 3864 | +1F1E6 1F1FD ; fully-qualified # ๐ฆ๐ฝ flag: ร land Islands | |
| 3865 | +1F1E6 1F1FF ; fully-qualified # ๐ฆ๐ฟ flag: Azerbaijan | |
| 3866 | +1F1E7 1F1E6 ; fully-qualified # ๐ง๐ฆ flag: Bosnia & Herzegovina | |
| 3867 | +1F1E7 1F1E7 ; fully-qualified # ๐ง๐ง flag: Barbados | |
| 3868 | +1F1E7 1F1E9 ; fully-qualified # ๐ง๐ฉ flag: Bangladesh | |
| 3869 | +1F1E7 1F1EA ; fully-qualified # ๐ง๐ช flag: Belgium | |
| 3870 | +1F1E7 1F1EB ; fully-qualified # ๐ง๐ซ flag: Burkina Faso | |
| 3871 | +1F1E7 1F1EC ; fully-qualified # ๐ง๐ฌ flag: Bulgaria | |
| 3872 | +1F1E7 1F1ED ; fully-qualified # ๐ง๐ญ flag: Bahrain | |
| 3873 | +1F1E7 1F1EE ; fully-qualified # ๐ง๐ฎ flag: Burundi | |
| 3874 | +1F1E7 1F1EF ; fully-qualified # ๐ง๐ฏ flag: Benin | |
| 3875 | +1F1E7 1F1F1 ; fully-qualified # ๐ง๐ฑ flag: St. Barthรฉlemy | |
| 3876 | +1F1E7 1F1F2 ; fully-qualified # ๐ง๐ฒ flag: Bermuda | |
| 3877 | +1F1E7 1F1F3 ; fully-qualified # ๐ง๐ณ flag: Brunei | |
| 3878 | +1F1E7 1F1F4 ; fully-qualified # ๐ง๐ด flag: Bolivia | |
| 3879 | +1F1E7 1F1F6 ; fully-qualified # ๐ง๐ถ flag: Caribbean Netherlands | |
| 3880 | +1F1E7 1F1F7 ; fully-qualified # ๐ง๐ท flag: Brazil | |
| 3881 | +1F1E7 1F1F8 ; fully-qualified # ๐ง๐ธ flag: Bahamas | |
| 3882 | +1F1E7 1F1F9 ; fully-qualified # ๐ง๐น flag: Bhutan | |
| 3883 | +1F1E7 1F1FB ; fully-qualified # ๐ง๐ป flag: Bouvet Island | |
| 3884 | +1F1E7 1F1FC ; fully-qualified # ๐ง๐ผ flag: Botswana | |
| 3885 | +1F1E7 1F1FE ; fully-qualified # ๐ง๐พ flag: Belarus | |
| 3886 | +1F1E7 1F1FF ; fully-qualified # ๐ง๐ฟ flag: Belize | |
| 3887 | +1F1E8 1F1E6 ; fully-qualified # ๐จ๐ฆ flag: Canada | |
| 3888 | +1F1E8 1F1E8 ; fully-qualified # ๐จ๐จ flag: Cocos (Keeling) Islands | |
| 3889 | +1F1E8 1F1E9 ; fully-qualified # ๐จ๐ฉ flag: Congo - Kinshasa | |
| 3890 | +1F1E8 1F1EB ; fully-qualified # ๐จ๐ซ flag: Central African Republic | |
| 3891 | +1F1E8 1F1EC ; fully-qualified # ๐จ๐ฌ flag: Congo - Brazzaville | |
| 3892 | +1F1E8 1F1ED ; fully-qualified # ๐จ๐ญ flag: Switzerland | |
| 3893 | +1F1E8 1F1EE ; fully-qualified # ๐จ๐ฎ flag: Cรดte dโIvoire | |
| 3894 | +1F1E8 1F1F0 ; fully-qualified # ๐จ๐ฐ flag: Cook Islands | |
| 3895 | +1F1E8 1F1F1 ; fully-qualified # ๐จ๐ฑ flag: Chile | |
| 3896 | +1F1E8 1F1F2 ; fully-qualified # ๐จ๐ฒ flag: Cameroon | |
| 3897 | +1F1E8 1F1F3 ; fully-qualified # ๐จ๐ณ flag: China | |
| 3898 | +1F1E8 1F1F4 ; fully-qualified # ๐จ๐ด flag: Colombia | |
| 3899 | +1F1E8 1F1F5 ; fully-qualified # ๐จ๐ต flag: Clipperton Island | |
| 3900 | +1F1E8 1F1F7 ; fully-qualified # ๐จ๐ท flag: Costa Rica | |
| 3901 | +1F1E8 1F1FA ; fully-qualified # ๐จ๐บ flag: Cuba | |
| 3902 | +1F1E8 1F1FB ; fully-qualified # ๐จ๐ป flag: Cape Verde | |
| 3903 | +1F1E8 1F1FC ; fully-qualified # ๐จ๐ผ flag: Curaรงao | |
| 3904 | +1F1E8 1F1FD ; fully-qualified # ๐จ๐ฝ flag: Christmas Island | |
| 3905 | +1F1E8 1F1FE ; fully-qualified # ๐จ๐พ flag: Cyprus | |
| 3906 | +1F1E8 1F1FF ; fully-qualified # ๐จ๐ฟ flag: Czechia | |
| 3907 | +1F1E9 1F1EA ; fully-qualified # ๐ฉ๐ช flag: Germany | |
| 3908 | +1F1E9 1F1EC ; fully-qualified # ๐ฉ๐ฌ flag: Diego Garcia | |
| 3909 | +1F1E9 1F1EF ; fully-qualified # ๐ฉ๐ฏ flag: Djibouti | |
| 3910 | +1F1E9 1F1F0 ; fully-qualified # ๐ฉ๐ฐ flag: Denmark | |
| 3911 | +1F1E9 1F1F2 ; fully-qualified # ๐ฉ๐ฒ flag: Dominica | |
| 3912 | +1F1E9 1F1F4 ; fully-qualified # ๐ฉ๐ด flag: Dominican Republic | |
| 3913 | +1F1E9 1F1FF ; fully-qualified # ๐ฉ๐ฟ flag: Algeria | |
| 3914 | +1F1EA 1F1E6 ; fully-qualified # ๐ช๐ฆ flag: Ceuta & Melilla | |
| 3915 | +1F1EA 1F1E8 ; fully-qualified # ๐ช๐จ flag: Ecuador | |
| 3916 | +1F1EA 1F1EA ; fully-qualified # ๐ช๐ช flag: Estonia | |
| 3917 | +1F1EA 1F1EC ; fully-qualified # ๐ช๐ฌ flag: Egypt | |
| 3918 | +1F1EA 1F1ED ; fully-qualified # ๐ช๐ญ flag: Western Sahara | |
| 3919 | +1F1EA 1F1F7 ; fully-qualified # ๐ช๐ท flag: Eritrea | |
| 3920 | +1F1EA 1F1F8 ; fully-qualified # ๐ช๐ธ flag: Spain | |
| 3921 | +1F1EA 1F1F9 ; fully-qualified # ๐ช๐น flag: Ethiopia | |
| 3922 | +1F1EA 1F1FA ; fully-qualified # ๐ช๐บ flag: European Union | |
| 3923 | +1F1EB 1F1EE ; fully-qualified # ๐ซ๐ฎ flag: Finland | |
| 3924 | +1F1EB 1F1EF ; fully-qualified # ๐ซ๐ฏ flag: Fiji | |
| 3925 | +1F1EB 1F1F0 ; fully-qualified # ๐ซ๐ฐ flag: Falkland Islands | |
| 3926 | +1F1EB 1F1F2 ; fully-qualified # ๐ซ๐ฒ flag: Micronesia | |
| 3927 | +1F1EB 1F1F4 ; fully-qualified # ๐ซ๐ด flag: Faroe Islands | |
| 3928 | +1F1EB 1F1F7 ; fully-qualified # ๐ซ๐ท flag: France | |
| 3929 | +1F1EC 1F1E6 ; fully-qualified # ๐ฌ๐ฆ flag: Gabon | |
| 3930 | +1F1EC 1F1E7 ; fully-qualified # ๐ฌ๐ง flag: United Kingdom | |
| 3931 | +1F1EC 1F1E9 ; fully-qualified # ๐ฌ๐ฉ flag: Grenada | |
| 3932 | +1F1EC 1F1EA ; fully-qualified # ๐ฌ๐ช flag: Georgia | |
| 3933 | +1F1EC 1F1EB ; fully-qualified # ๐ฌ๐ซ flag: French Guiana | |
| 3934 | +1F1EC 1F1EC ; fully-qualified # ๐ฌ๐ฌ flag: Guernsey | |
| 3935 | +1F1EC 1F1ED ; fully-qualified # ๐ฌ๐ญ flag: Ghana | |
| 3936 | +1F1EC 1F1EE ; fully-qualified # ๐ฌ๐ฎ flag: Gibraltar | |
| 3937 | +1F1EC 1F1F1 ; fully-qualified # ๐ฌ๐ฑ flag: Greenland | |
| 3938 | +1F1EC 1F1F2 ; fully-qualified # ๐ฌ๐ฒ flag: Gambia | |
| 3939 | +1F1EC 1F1F3 ; fully-qualified # ๐ฌ๐ณ flag: Guinea | |
| 3940 | +1F1EC 1F1F5 ; fully-qualified # ๐ฌ๐ต flag: Guadeloupe | |
| 3941 | +1F1EC 1F1F6 ; fully-qualified # ๐ฌ๐ถ flag: Equatorial Guinea | |
| 3942 | +1F1EC 1F1F7 ; fully-qualified # ๐ฌ๐ท flag: Greece | |
| 3943 | +1F1EC 1F1F8 ; fully-qualified # ๐ฌ๐ธ flag: South Georgia & South Sandwich Islands | |
| 3944 | +1F1EC 1F1F9 ; fully-qualified # ๐ฌ๐น flag: Guatemala | |
| 3945 | +1F1EC 1F1FA ; fully-qualified # ๐ฌ๐บ flag: Guam | |
| 3946 | +1F1EC 1F1FC ; fully-qualified # ๐ฌ๐ผ flag: Guinea-Bissau | |
| 3947 | +1F1EC 1F1FE ; fully-qualified # ๐ฌ๐พ flag: Guyana | |
| 3948 | +1F1ED 1F1F0 ; fully-qualified # ๐ญ๐ฐ flag: Hong Kong SAR China | |
| 3949 | +1F1ED 1F1F2 ; fully-qualified # ๐ญ๐ฒ flag: Heard & McDonald Islands | |
| 3950 | +1F1ED 1F1F3 ; fully-qualified # ๐ญ๐ณ flag: Honduras | |
| 3951 | +1F1ED 1F1F7 ; fully-qualified # ๐ญ๐ท flag: Croatia | |
| 3952 | +1F1ED 1F1F9 ; fully-qualified # ๐ญ๐น flag: Haiti | |
| 3953 | +1F1ED 1F1FA ; fully-qualified # ๐ญ๐บ flag: Hungary | |
| 3954 | +1F1EE 1F1E8 ; fully-qualified # ๐ฎ๐จ flag: Canary Islands | |
| 3955 | +1F1EE 1F1E9 ; fully-qualified # ๐ฎ๐ฉ flag: Indonesia | |
| 3956 | +1F1EE 1F1EA ; fully-qualified # ๐ฎ๐ช flag: Ireland | |
| 3957 | +1F1EE 1F1F1 ; fully-qualified # ๐ฎ๐ฑ flag: Israel | |
| 3958 | +1F1EE 1F1F2 ; fully-qualified # ๐ฎ๐ฒ flag: Isle of Man | |
| 3959 | +1F1EE 1F1F3 ; fully-qualified # ๐ฎ๐ณ flag: India | |
| 3960 | +1F1EE 1F1F4 ; fully-qualified # ๐ฎ๐ด flag: British Indian Ocean Territory | |
| 3961 | +1F1EE 1F1F6 ; fully-qualified # ๐ฎ๐ถ flag: Iraq | |
| 3962 | +1F1EE 1F1F7 ; fully-qualified # ๐ฎ๐ท flag: Iran | |
| 3963 | +1F1EE 1F1F8 ; fully-qualified # ๐ฎ๐ธ flag: Iceland | |
| 3964 | +1F1EE 1F1F9 ; fully-qualified # ๐ฎ๐น flag: Italy | |
| 3965 | +1F1EF 1F1EA ; fully-qualified # ๐ฏ๐ช flag: Jersey | |
| 3966 | +1F1EF 1F1F2 ; fully-qualified # ๐ฏ๐ฒ flag: Jamaica | |
| 3967 | +1F1EF 1F1F4 ; fully-qualified # ๐ฏ๐ด flag: Jordan | |
| 3968 | +1F1EF 1F1F5 ; fully-qualified # ๐ฏ๐ต flag: Japan | |
| 3969 | +1F1F0 1F1EA ; fully-qualified # ๐ฐ๐ช flag: Kenya | |
| 3970 | +1F1F0 1F1EC ; fully-qualified # ๐ฐ๐ฌ flag: Kyrgyzstan | |
| 3971 | +1F1F0 1F1ED ; fully-qualified # ๐ฐ๐ญ flag: Cambodia | |
| 3972 | +1F1F0 1F1EE ; fully-qualified # ๐ฐ๐ฎ flag: Kiribati | |
| 3973 | +1F1F0 1F1F2 ; fully-qualified # ๐ฐ๐ฒ flag: Comoros | |
| 3974 | +1F1F0 1F1F3 ; fully-qualified # ๐ฐ๐ณ flag: St. Kitts & Nevis | |
| 3975 | +1F1F0 1F1F5 ; fully-qualified # ๐ฐ๐ต flag: North Korea | |
| 3976 | +1F1F0 1F1F7 ; fully-qualified # ๐ฐ๐ท flag: South Korea | |
| 3977 | +1F1F0 1F1FC ; fully-qualified # ๐ฐ๐ผ flag: Kuwait | |
| 3978 | +1F1F0 1F1FE ; fully-qualified # ๐ฐ๐พ flag: Cayman Islands | |
| 3979 | +1F1F0 1F1FF ; fully-qualified # ๐ฐ๐ฟ flag: Kazakhstan | |
| 3980 | +1F1F1 1F1E6 ; fully-qualified # ๐ฑ๐ฆ flag: Laos | |
| 3981 | +1F1F1 1F1E7 ; fully-qualified # ๐ฑ๐ง flag: Lebanon | |
| 3982 | +1F1F1 1F1E8 ; fully-qualified # ๐ฑ๐จ flag: St. Lucia | |
| 3983 | +1F1F1 1F1EE ; fully-qualified # ๐ฑ๐ฎ flag: Liechtenstein | |
| 3984 | +1F1F1 1F1F0 ; fully-qualified # ๐ฑ๐ฐ flag: Sri Lanka | |
| 3985 | +1F1F1 1F1F7 ; fully-qualified # ๐ฑ๐ท flag: Liberia | |
| 3986 | +1F1F1 1F1F8 ; fully-qualified # ๐ฑ๐ธ flag: Lesotho | |
| 3987 | +1F1F1 1F1F9 ; fully-qualified # ๐ฑ๐น flag: Lithuania | |
| 3988 | +1F1F1 1F1FA ; fully-qualified # ๐ฑ๐บ flag: Luxembourg | |
| 3989 | +1F1F1 1F1FB ; fully-qualified # ๐ฑ๐ป flag: Latvia | |
| 3990 | +1F1F1 1F1FE ; fully-qualified # ๐ฑ๐พ flag: Libya | |
| 3991 | +1F1F2 1F1E6 ; fully-qualified # ๐ฒ๐ฆ flag: Morocco | |
| 3992 | +1F1F2 1F1E8 ; fully-qualified # ๐ฒ๐จ flag: Monaco | |
| 3993 | +1F1F2 1F1E9 ; fully-qualified # ๐ฒ๐ฉ flag: Moldova | |
| 3994 | +1F1F2 1F1EA ; fully-qualified # ๐ฒ๐ช flag: Montenegro | |
| 3995 | +1F1F2 1F1EB ; fully-qualified # ๐ฒ๐ซ flag: St. Martin | |
| 3996 | +1F1F2 1F1EC ; fully-qualified # ๐ฒ๐ฌ flag: Madagascar | |
| 3997 | +1F1F2 1F1ED ; fully-qualified # ๐ฒ๐ญ flag: Marshall Islands | |
| 3998 | +1F1F2 1F1F0 ; fully-qualified # ๐ฒ๐ฐ flag: Macedonia | |
| 3999 | +1F1F2 1F1F1 ; fully-qualified # ๐ฒ๐ฑ flag: Mali | |
| 4000 | +1F1F2 1F1F2 ; fully-qualified # ๐ฒ๐ฒ flag: Myanmar (Burma) | |
| 4001 | +1F1F2 1F1F3 ; fully-qualified # ๐ฒ๐ณ flag: Mongolia | |
| 4002 | +1F1F2 1F1F4 ; fully-qualified # ๐ฒ๐ด flag: Macao SAR China | |
| 4003 | +1F1F2 1F1F5 ; fully-qualified # ๐ฒ๐ต flag: Northern Mariana Islands | |
| 4004 | +1F1F2 1F1F6 ; fully-qualified # ๐ฒ๐ถ flag: Martinique | |
| 4005 | +1F1F2 1F1F7 ; fully-qualified # ๐ฒ๐ท flag: Mauritania | |
| 4006 | +1F1F2 1F1F8 ; fully-qualified # ๐ฒ๐ธ flag: Montserrat | |
| 4007 | +1F1F2 1F1F9 ; fully-qualified # ๐ฒ๐น flag: Malta | |
| 4008 | +1F1F2 1F1FA ; fully-qualified # ๐ฒ๐บ flag: Mauritius | |
| 4009 | +1F1F2 1F1FB ; fully-qualified # ๐ฒ๐ป flag: Maldives | |
| 4010 | +1F1F2 1F1FC ; fully-qualified # ๐ฒ๐ผ flag: Malawi | |
| 4011 | +1F1F2 1F1FD ; fully-qualified # ๐ฒ๐ฝ flag: Mexico | |
| 4012 | +1F1F2 1F1FE ; fully-qualified # ๐ฒ๐พ flag: Malaysia | |
| 4013 | +1F1F2 1F1FF ; fully-qualified # ๐ฒ๐ฟ flag: Mozambique | |
| 4014 | +1F1F3 1F1E6 ; fully-qualified # ๐ณ๐ฆ flag: Namibia | |
| 4015 | +1F1F3 1F1E8 ; fully-qualified # ๐ณ๐จ flag: New Caledonia | |
| 4016 | +1F1F3 1F1EA ; fully-qualified # ๐ณ๐ช flag: Niger | |
| 4017 | +1F1F3 1F1EB ; fully-qualified # ๐ณ๐ซ flag: Norfolk Island | |
| 4018 | +1F1F3 1F1EC ; fully-qualified # ๐ณ๐ฌ flag: Nigeria | |
| 4019 | +1F1F3 1F1EE ; fully-qualified # ๐ณ๐ฎ flag: Nicaragua | |
| 4020 | +1F1F3 1F1F1 ; fully-qualified # ๐ณ๐ฑ flag: Netherlands | |
| 4021 | +1F1F3 1F1F4 ; fully-qualified # ๐ณ๐ด flag: Norway | |
| 4022 | +1F1F3 1F1F5 ; fully-qualified # ๐ณ๐ต flag: Nepal | |
| 4023 | +1F1F3 1F1F7 ; fully-qualified # ๐ณ๐ท flag: Nauru | |
| 4024 | +1F1F3 1F1FA ; fully-qualified # ๐ณ๐บ flag: Niue | |
| 4025 | +1F1F3 1F1FF ; fully-qualified # ๐ณ๐ฟ flag: New Zealand | |
| 4026 | +1F1F4 1F1F2 ; fully-qualified # ๐ด๐ฒ flag: Oman | |
| 4027 | +1F1F5 1F1E6 ; fully-qualified # ๐ต๐ฆ flag: Panama | |
| 4028 | +1F1F5 1F1EA ; fully-qualified # ๐ต๐ช flag: Peru | |
| 4029 | +1F1F5 1F1EB ; fully-qualified # ๐ต๐ซ flag: French Polynesia | |
| 4030 | +1F1F5 1F1EC ; fully-qualified # ๐ต๐ฌ flag: Papua New Guinea | |
| 4031 | +1F1F5 1F1ED ; fully-qualified # ๐ต๐ญ flag: Philippines | |
| 4032 | +1F1F5 1F1F0 ; fully-qualified # ๐ต๐ฐ flag: Pakistan | |
| 4033 | +1F1F5 1F1F1 ; fully-qualified # ๐ต๐ฑ flag: Poland | |
| 4034 | +1F1F5 1F1F2 ; fully-qualified # ๐ต๐ฒ flag: St. Pierre & Miquelon | |
| 4035 | +1F1F5 1F1F3 ; fully-qualified # ๐ต๐ณ flag: Pitcairn Islands | |
| 4036 | +1F1F5 1F1F7 ; fully-qualified # ๐ต๐ท flag: Puerto Rico | |
| 4037 | +1F1F5 1F1F8 ; fully-qualified # ๐ต๐ธ flag: Palestinian Territories | |
| 4038 | +1F1F5 1F1F9 ; fully-qualified # ๐ต๐น flag: Portugal | |
| 4039 | +1F1F5 1F1FC ; fully-qualified # ๐ต๐ผ flag: Palau | |
| 4040 | +1F1F5 1F1FE ; fully-qualified # ๐ต๐พ flag: Paraguay | |
| 4041 | +1F1F6 1F1E6 ; fully-qualified # ๐ถ๐ฆ flag: Qatar | |
| 4042 | +1F1F7 1F1EA ; fully-qualified # ๐ท๐ช flag: Rรฉunion | |
| 4043 | +1F1F7 1F1F4 ; fully-qualified # ๐ท๐ด flag: Romania | |
| 4044 | +1F1F7 1F1F8 ; fully-qualified # ๐ท๐ธ flag: Serbia | |
| 4045 | +1F1F7 1F1FA ; fully-qualified # ๐ท๐บ flag: Russia | |
| 4046 | +1F1F7 1F1FC ; fully-qualified # ๐ท๐ผ flag: Rwanda | |
| 4047 | +1F1F8 1F1E6 ; fully-qualified # ๐ธ๐ฆ flag: Saudi Arabia | |
| 4048 | +1F1F8 1F1E7 ; fully-qualified # ๐ธ๐ง flag: Solomon Islands | |
| 4049 | +1F1F8 1F1E8 ; fully-qualified # ๐ธ๐จ flag: Seychelles | |
| 4050 | +1F1F8 1F1E9 ; fully-qualified # ๐ธ๐ฉ flag: Sudan | |
| 4051 | +1F1F8 1F1EA ; fully-qualified # ๐ธ๐ช flag: Sweden | |
| 4052 | +1F1F8 1F1EC ; fully-qualified # ๐ธ๐ฌ flag: Singapore | |
| 4053 | +1F1F8 1F1ED ; fully-qualified # ๐ธ๐ญ flag: St. Helena | |
| 4054 | +1F1F8 1F1EE ; fully-qualified # ๐ธ๐ฎ flag: Slovenia | |
| 4055 | +1F1F8 1F1EF ; fully-qualified # ๐ธ๐ฏ flag: Svalbard & Jan Mayen | |
| 4056 | +1F1F8 1F1F0 ; fully-qualified # ๐ธ๐ฐ flag: Slovakia | |
| 4057 | +1F1F8 1F1F1 ; fully-qualified # ๐ธ๐ฑ flag: Sierra Leone | |
| 4058 | +1F1F8 1F1F2 ; fully-qualified # ๐ธ๐ฒ flag: San Marino | |
| 4059 | +1F1F8 1F1F3 ; fully-qualified # ๐ธ๐ณ flag: Senegal | |
| 4060 | +1F1F8 1F1F4 ; fully-qualified # ๐ธ๐ด flag: Somalia | |
| 4061 | +1F1F8 1F1F7 ; fully-qualified # ๐ธ๐ท flag: Suriname | |
| 4062 | +1F1F8 1F1F8 ; fully-qualified # ๐ธ๐ธ flag: South Sudan | |
| 4063 | +1F1F8 1F1F9 ; fully-qualified # ๐ธ๐น flag: Sรฃo Tomรฉ & Prรญncipe | |
| 4064 | +1F1F8 1F1FB ; fully-qualified # ๐ธ๐ป flag: El Salvador | |
| 4065 | +1F1F8 1F1FD ; fully-qualified # ๐ธ๐ฝ flag: Sint Maarten | |
| 4066 | +1F1F8 1F1FE ; fully-qualified # ๐ธ๐พ flag: Syria | |
| 4067 | +1F1F8 1F1FF ; fully-qualified # ๐ธ๐ฟ flag: Eswatini | |
| 4068 | +1F1F9 1F1E6 ; fully-qualified # ๐น๐ฆ flag: Tristan da Cunha | |
| 4069 | +1F1F9 1F1E8 ; fully-qualified # ๐น๐จ flag: Turks & Caicos Islands | |
| 4070 | +1F1F9 1F1E9 ; fully-qualified # ๐น๐ฉ flag: Chad | |
| 4071 | +1F1F9 1F1EB ; fully-qualified # ๐น๐ซ flag: French Southern Territories | |
| 4072 | +1F1F9 1F1EC ; fully-qualified # ๐น๐ฌ flag: Togo | |
| 4073 | +1F1F9 1F1ED ; fully-qualified # ๐น๐ญ flag: Thailand | |
| 4074 | +1F1F9 1F1EF ; fully-qualified # ๐น๐ฏ flag: Tajikistan | |
| 4075 | +1F1F9 1F1F0 ; fully-qualified # ๐น๐ฐ flag: Tokelau | |
| 4076 | +1F1F9 1F1F1 ; fully-qualified # ๐น๐ฑ flag: Timor-Leste | |
| 4077 | +1F1F9 1F1F2 ; fully-qualified # ๐น๐ฒ flag: Turkmenistan | |
| 4078 | +1F1F9 1F1F3 ; fully-qualified # ๐น๐ณ flag: Tunisia | |
| 4079 | +1F1F9 1F1F4 ; fully-qualified # ๐น๐ด flag: Tonga | |
| 4080 | +1F1F9 1F1F7 ; fully-qualified # ๐น๐ท flag: Turkey | |
| 4081 | +1F1F9 1F1F9 ; fully-qualified # ๐น๐น flag: Trinidad & Tobago | |
| 4082 | +1F1F9 1F1FB ; fully-qualified # ๐น๐ป flag: Tuvalu | |
| 4083 | +1F1F9 1F1FC ; fully-qualified # ๐น๐ผ flag: Taiwan | |
| 4084 | +1F1F9 1F1FF ; fully-qualified # ๐น๐ฟ flag: Tanzania | |
| 4085 | +1F1FA 1F1E6 ; fully-qualified # ๐บ๐ฆ flag: Ukraine | |
| 4086 | +1F1FA 1F1EC ; fully-qualified # ๐บ๐ฌ flag: Uganda | |
| 4087 | +1F1FA 1F1F2 ; fully-qualified # ๐บ๐ฒ flag: U.S. Outlying Islands | |
| 4088 | +1F1FA 1F1F3 ; fully-qualified # ๐บ๐ณ flag: United Nations | |
| 4089 | +1F1FA 1F1F8 ; fully-qualified # ๐บ๐ธ flag: United States | |
| 4090 | +1F1FA 1F1FE ; fully-qualified # ๐บ๐พ flag: Uruguay | |
| 4091 | +1F1FA 1F1FF ; fully-qualified # ๐บ๐ฟ flag: Uzbekistan | |
| 4092 | +1F1FB 1F1E6 ; fully-qualified # ๐ป๐ฆ flag: Vatican City | |
| 4093 | +1F1FB 1F1E8 ; fully-qualified # ๐ป๐จ flag: St. Vincent & Grenadines | |
| 4094 | +1F1FB 1F1EA ; fully-qualified # ๐ป๐ช flag: Venezuela | |
| 4095 | +1F1FB 1F1EC ; fully-qualified # ๐ป๐ฌ flag: British Virgin Islands | |
| 4096 | +1F1FB 1F1EE ; fully-qualified # ๐ป๐ฎ flag: U.S. Virgin Islands | |
| 4097 | +1F1FB 1F1F3 ; fully-qualified # ๐ป๐ณ flag: Vietnam | |
| 4098 | +1F1FB 1F1FA ; fully-qualified # ๐ป๐บ flag: Vanuatu | |
| 4099 | +1F1FC 1F1EB ; fully-qualified # ๐ผ๐ซ flag: Wallis & Futuna | |
| 4100 | +1F1FC 1F1F8 ; fully-qualified # ๐ผ๐ธ flag: Samoa | |
| 4101 | +1F1FD 1F1F0 ; fully-qualified # ๐ฝ๐ฐ flag: Kosovo | |
| 4102 | +1F1FE 1F1EA ; fully-qualified # ๐พ๐ช flag: Yemen | |
| 4103 | +1F1FE 1F1F9 ; fully-qualified # ๐พ๐น flag: Mayotte | |
| 4104 | +1F1FF 1F1E6 ; fully-qualified # ๐ฟ๐ฆ flag: South Africa | |
| 4105 | +1F1FF 1F1F2 ; fully-qualified # ๐ฟ๐ฒ flag: Zambia | |
| 4106 | +1F1FF 1F1FC ; fully-qualified # ๐ฟ๐ผ flag: Zimbabwe | |
| 4107 | + | |
| 4108 | +# subgroup: subdivision-flag | |
| 4109 | +1F3F4 E0067 E0062 E0065 E006E E0067 E007F ; fully-qualified # ๐ด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ flag: England | |
| 4110 | +1F3F4 E0067 E0062 E0073 E0063 E0074 E007F ; fully-qualified # ๐ด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ flag: Scotland | |
| 4111 | +1F3F4 E0067 E0062 E0077 E006C E0073 E007F ; fully-qualified # ๐ด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ flag: Wales | |
| 4112 | + | |
| 4113 | +# Flags subtotal: 271 | |
| 4114 | +# Flags subtotal: 271 w/o modifiers | |
| 4115 | + | |
| 4116 | +# Status Counts | |
| 4117 | +# fully-qualified : 3010 | |
| 4118 | +# minimally-qualified : 571 | |
| 4119 | +# unqualified : 246 | |
| 4120 | +# component : 9 | |
| 4121 | + | |
| 4122 | +#EOF |
+110-0.oh-my-zsh/plugins/emoji/emoji.plugin.zsh
| @@ -0,0 +1,110 @@ | ||
| 1 | +# emoji plugin | |
| 2 | +# | |
| 3 | +# Makes emoji support available within ZSH | |
| 4 | +# | |
| 5 | +# See the README for documentation. | |
| 6 | + | |
| 7 | +# Handle $0 according to the standard: | |
| 8 | +# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html | |
| 9 | +0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" | |
| 10 | +0="${${(M)0:#/*}:-$PWD/$0}" | |
| 11 | + | |
| 12 | +_omz_emoji_plugin_dir="${0:h}" | |
| 13 | + | |
| 14 | +() { | |
| 15 | + | |
| 16 | +local LC_ALL=en_US.UTF-8 | |
| 17 | + | |
| 18 | +typeset -gAH emoji_skintone | |
| 19 | + | |
| 20 | +source "$_omz_emoji_plugin_dir/emoji-char-definitions.zsh" | |
| 21 | +unset _omz_emoji_plugin_dir | |
| 22 | + | |
| 23 | +# These additional emoji are not in the definition file, but are useful in conjunction with it | |
| 24 | + | |
| 25 | +# This is a combining character that can be placed after any other character to surround | |
| 26 | +# it in a "keycap" symbol. | |
| 27 | +# The digits 0-9 are already in the emoji table as keycap_digit_<N>, keycap_ten, etc. | |
| 28 | +# It's unclear whether this should be in the $emoji array, because those characters are all ones | |
| 29 | +# which can be displayed on their own. | |
| 30 | + | |
| 31 | +emoji[regional_indicator_symbol_letter_d_regional_indicator_symbol_letter_e]=$'\xF0\x9F\x87\xA9\xF0\x9F\x87\xAA' | |
| 32 | +emoji[regional_indicator_symbol_letter_g_regional_indicator_symbol_letter_b]=$'\xF0\x9F\x87\xAC\xF0\x9F\x87\xA7' | |
| 33 | +emoji[regional_indicator_symbol_letter_c_regional_indicator_symbol_letter_n]=$'\xF0\x9F\x87\xA8\xF0\x9F\x87\xB3' | |
| 34 | +emoji[regional_indicator_symbol_letter_j_regional_indicator_symbol_letter_p]=$'\xF0\x9F\x87\xAF\xF0\x9F\x87\xB5' | |
| 35 | +emoji[regional_indicator_symbol_letter_k_regional_indicator_symbol_letter_r]=$'\xF0\x9F\x87\xB0\xF0\x9F\x87\xB7' | |
| 36 | +emoji[regional_indicator_symbol_letter_f_regional_indicator_symbol_letter_r]=$'\xF0\x9F\x87\xAB\xF0\x9F\x87\xB7' | |
| 37 | +emoji[regional_indicator_symbol_letter_e_regional_indicator_symbol_letter_s]=$'\xF0\x9F\x87\xAA\xF0\x9F\x87\xB8' | |
| 38 | +emoji[regional_indicator_symbol_letter_i_regional_indicator_symbol_letter_t]=$'\xF0\x9F\x87\xAE\xF0\x9F\x87\xB9' | |
| 39 | +emoji[regional_indicator_symbol_letter_u_regional_indicator_symbol_letter_s]=$'\xF0\x9F\x87\xBA\xF0\x9F\x87\xB8' | |
| 40 | +emoji[regional_indicator_symbol_letter_r_regional_indicator_symbol_letter_u]=$'\xF0\x9F\x87\xB7\xF0\x9F\x87\xBA' | |
| 41 | + | |
| 42 | +# Easier access to skin tone modifiers | |
| 43 | +emoji_skintone[1_2]=$'\U1F3FB' | |
| 44 | +emoji_skintone[3]=$'\U1F3FC' | |
| 45 | +emoji_skintone[4]=$'\U1F3FD' | |
| 46 | +emoji_skintone[5]=$'\U1F3FE' | |
| 47 | +emoji_skintone[6]=$'\U1F3FF' | |
| 48 | +} | |
| 49 | + | |
| 50 | +# Prints a random emoji character | |
| 51 | +# | |
| 52 | +# random_emoji [group] | |
| 53 | +# | |
| 54 | +function random_emoji() { | |
| 55 | + local group=$1 | |
| 56 | + local names | |
| 57 | + if [[ -z "$group" || "$group" == "all" ]]; then | |
| 58 | + names=(${(k)emoji}) | |
| 59 | + else | |
| 60 | + names=(${=emoji_groups[$group]}) | |
| 61 | + fi | |
| 62 | + local list_size=${#names} | |
| 63 | + [[ $list_size -eq 0 ]] && return 1 | |
| 64 | + local random_index=$(( ( RANDOM % $list_size ) + 1 )) | |
| 65 | + local name=${names[$random_index]} | |
| 66 | + if [[ "$group" == "flags" ]]; then | |
| 67 | + echo ${emoji_flags[$name]} | |
| 68 | + else | |
| 69 | + echo ${emoji[$name]} | |
| 70 | + fi | |
| 71 | +} | |
| 72 | + | |
| 73 | +# Displays a listing of emoji with their names | |
| 74 | +# | |
| 75 | +# display_emoji [group] | |
| 76 | +# | |
| 77 | +function display_emoji() { | |
| 78 | + local group=$1 | |
| 79 | + local names | |
| 80 | + if [[ -z "$group" || "$group" == "all" ]]; then | |
| 81 | + names=(${(k)emoji}) | |
| 82 | + else | |
| 83 | + names=(${=emoji_groups[$group]}) | |
| 84 | + fi | |
| 85 | + # The extra spaces in output here are a hack for readability, since some | |
| 86 | + # terminals treat these emoji chars as single-width. | |
| 87 | + local counter=1 | |
| 88 | + for i in $names; do | |
| 89 | + if [[ "$group" == "flags" ]]; then | |
| 90 | + printf '%s ' "$emoji_flags[$i]" | |
| 91 | + else | |
| 92 | + printf '%s ' "$emoji[$i]" | |
| 93 | + fi | |
| 94 | + # New line every 20 emoji, to avoid weirdnesses | |
| 95 | + if (($counter % 20 == 0)); then | |
| 96 | + printf "\n" | |
| 97 | + fi | |
| 98 | + let counter=$counter+1 | |
| 99 | + done | |
| 100 | ||
| 101 | + for i in $names; do | |
| 102 | + if [[ "$group" == "flags" ]]; then | |
| 103 | + echo "${emoji_flags[$i]} = $i" | |
| 104 | + else | |
| 105 | + echo "${emoji[$i]} = $i" | |
| 106 | + fi | |
| 107 | + done | |
| 108 | +} | |
| 109 | + | |
| 110 | + |
+169-0.oh-my-zsh/plugins/emoji/gemoji_db.json
| @@ -0,0 +1,21538 @@ | ||
| 1 | +[ | |
| 2 | + { | |
| 3 | + "emoji": "๐" | |
| 4 | + , "description": "grinning face" | |
| 5 | + , "category": "Smileys & Emotion" | |
| 6 | + , "aliases": [ | |
| 7 | + "grinning" | |
| 8 | + ] | |
| 9 | + , "tags": [ | |
| 10 | + "smile" | |
| 11 | + , "happy" | |
| 12 | + ] | |
| 13 | + , "unicode_version": "6.1" | |
| 14 | + , "ios_version": "6.0" | |
| 15 | + } | |
| 16 | +, { | |
| 17 | + "emoji": "๐" | |
| 18 | + , "description": "grinning face with big eyes" | |
| 19 | + , "category": "Smileys & Emotion" | |
| 20 | + , "aliases": [ | |
| 21 | + "smiley" | |
| 22 | + ] | |
| 23 | + , "tags": [ | |
| 24 | + "happy" | |
| 25 | + , "joy" | |
| 26 | + , "haha" | |
| 27 | + ] | |
| 28 | + , "unicode_version": "6.0" | |
| 29 | + , "ios_version": "6.0" | |
| 30 | + } | |
| 31 | +, { | |
| 32 | + "emoji": "๐" | |
| 33 | + , "description": "grinning face with smiling eyes" | |
| 34 | + , "category": "Smileys & Emotion" | |
| 35 | + , "aliases": [ | |
| 36 | + "smile" | |
| 37 | + ] | |
| 38 | + , "tags": [ | |
| 39 | + "happy" | |
| 40 | + , "joy" | |
| 41 | + , "laugh" | |
| 42 | + , "pleased" | |
| 43 | + ] | |
| 44 | + , "unicode_version": "6.0" | |
| 45 | + , "ios_version": "6.0" | |
| 46 | + } | |
| 47 | +, { | |
| 48 | + "emoji": "๐" | |
| 49 | + , "description": "beaming face with smiling eyes" | |
| 50 | + , "category": "Smileys & Emotion" | |
| 51 | + , "aliases": [ | |
| 52 | + "grin" | |
| 53 | + ] | |
| 54 | + , "tags": [ | |
| 55 | + ] | |
| 56 | + , "unicode_version": "6.0" | |
| 57 | + , "ios_version": "6.0" | |
| 58 | + } | |
| 59 | +, { | |
| 60 | + "emoji": "๐" | |
| 61 | + , "description": "grinning squinting face" | |
| 62 | + , "category": "Smileys & Emotion" | |
| 63 | + , "aliases": [ | |
| 64 | + "laughing" | |
| 65 | + , "satisfied" | |
| 66 | + ] | |
| 67 | + , "tags": [ | |
| 68 | + "happy" | |
| 69 | + , "haha" | |
| 70 | + ] | |
| 71 | + , "unicode_version": "6.0" | |
| 72 | + , "ios_version": "6.0" | |
| 73 | + } | |
| 74 | +, { | |
| 75 | + "emoji": "๐ " | |
| 76 | + , "description": "grinning face with sweat" | |
| 77 | + , "category": "Smileys & Emotion" | |
| 78 | + , "aliases": [ | |
| 79 | + "sweat_smile" | |
| 80 | + ] | |
| 81 | + , "tags": [ | |
| 82 | + "hot" | |
| 83 | + ] | |
| 84 | + , "unicode_version": "6.0" | |
| 85 | + , "ios_version": "6.0" | |
| 86 | + } | |
| 87 | +, { | |
| 88 | + "emoji": "๐คฃ" | |
| 89 | + , "description": "rolling on the floor laughing" | |
| 90 | + , "category": "Smileys & Emotion" | |
| 91 | + , "aliases": [ | |
| 92 | + "rofl" | |
| 93 | + ] | |
| 94 | + , "tags": [ | |
| 95 | + "lol" | |
| 96 | + , "laughing" | |
| 97 | + ] | |
| 98 | + , "unicode_version": "9.0" | |
| 99 | + , "ios_version": "10.2" | |
| 100 | + } | |
| 101 | +, { | |
| 102 | + "emoji": "๐" | |
| 103 | + , "description": "face with tears of joy" | |
| 104 | + , "category": "Smileys & Emotion" | |
| 105 | + , "aliases": [ | |
| 106 | + "joy" | |
| 107 | + ] | |
| 108 | + , "tags": [ | |
| 109 | + "tears" | |
| 110 | + ] | |
| 111 | + , "unicode_version": "6.0" | |
| 112 | + , "ios_version": "6.0" | |
| 113 | + } | |
| 114 | +, { | |
| 115 | + "emoji": "๐" | |
| 116 | + , "description": "slightly smiling face" | |
| 117 | + , "category": "Smileys & Emotion" | |
| 118 | + , "aliases": [ | |
| 119 | + "slightly_smiling_face" | |
| 120 | + ] | |
| 121 | + , "tags": [ | |
| 122 | + ] | |
| 123 | + , "unicode_version": "7.0" | |
| 124 | + , "ios_version": "9.1" | |
| 125 | + } | |
| 126 | +, { | |
| 127 | + "emoji": "๐" | |
| 128 | + , "description": "upside-down face" | |
| 129 | + , "category": "Smileys & Emotion" | |
| 130 | + , "aliases": [ | |
| 131 | + "upside_down_face" | |
| 132 | + ] | |
| 133 | + , "tags": [ | |
| 134 | + ] | |
| 135 | + , "unicode_version": "8.0" | |
| 136 | + , "ios_version": "9.1" | |
| 137 | + } | |
| 138 | +, { | |
| 139 | + "emoji": "๐" | |
| 140 | + , "description": "winking face" | |
| 141 | + , "category": "Smileys & Emotion" | |
| 142 | + , "aliases": [ | |
| 143 | + "wink" | |
| 144 | + ] | |
| 145 | + , "tags": [ | |
| 146 | + "flirt" | |
| 147 | + ] | |
| 148 | + , "unicode_version": "6.0" | |
| 149 | + , "ios_version": "6.0" | |
| 150 | + } | |
| 151 | +, { | |
| 152 | + "emoji": "๐" | |
| 153 | + , "description": "smiling face with smiling eyes" | |
| 154 | + , "category": "Smileys & Emotion" | |
| 155 | + , "aliases": [ | |
| 156 | + "blush" | |
| 157 | + ] | |
| 158 | + , "tags": [ | |
| 159 | + "proud" | |
| 160 | + ] | |
| 161 | + , "unicode_version": "6.0" | |
| 162 | + , "ios_version": "6.0" | |
| 163 | + } | |
| 164 | +, { | |
| 165 | + "emoji": "๐" | |
| 166 | + , "description": "smiling face with halo" | |
| 167 | + , "category": "Smileys & Emotion" | |
| 168 | + , "aliases": [ | |
| 169 | + |