Parent directory

emoji.plugin.zsh

3603 bytes
  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
  90="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
 100="${${(M)0:#/*}:-$PWD/$0}"
 11
 12_omz_emoji_plugin_dir="${0:h}"
 13
 14() {
 15
 16local LC_ALL=en_US.UTF-8
 17
 18typeset -gAH emoji_skintone
 19
 20source "$_omz_emoji_plugin_dir/emoji-char-definitions.zsh"
 21unset _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
 31emoji[regional_indicator_symbol_letter_d_regional_indicator_symbol_letter_e]=$'\xF0\x9F\x87\xA9\xF0\x9F\x87\xAA'
 32emoji[regional_indicator_symbol_letter_g_regional_indicator_symbol_letter_b]=$'\xF0\x9F\x87\xAC\xF0\x9F\x87\xA7'
 33emoji[regional_indicator_symbol_letter_c_regional_indicator_symbol_letter_n]=$'\xF0\x9F\x87\xA8\xF0\x9F\x87\xB3'
 34emoji[regional_indicator_symbol_letter_j_regional_indicator_symbol_letter_p]=$'\xF0\x9F\x87\xAF\xF0\x9F\x87\xB5'
 35emoji[regional_indicator_symbol_letter_k_regional_indicator_symbol_letter_r]=$'\xF0\x9F\x87\xB0\xF0\x9F\x87\xB7'
 36emoji[regional_indicator_symbol_letter_f_regional_indicator_symbol_letter_r]=$'\xF0\x9F\x87\xAB\xF0\x9F\x87\xB7'
 37emoji[regional_indicator_symbol_letter_e_regional_indicator_symbol_letter_s]=$'\xF0\x9F\x87\xAA\xF0\x9F\x87\xB8'
 38emoji[regional_indicator_symbol_letter_i_regional_indicator_symbol_letter_t]=$'\xF0\x9F\x87\xAE\xF0\x9F\x87\xB9'
 39emoji[regional_indicator_symbol_letter_u_regional_indicator_symbol_letter_s]=$'\xF0\x9F\x87\xBA\xF0\x9F\x87\xB8'
 40emoji[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
 43emoji_skintone[1_2]=$'\U1F3FB'
 44emoji_skintone[3]=$'\U1F3FC'
 45emoji_skintone[4]=$'\U1F3FD'
 46emoji_skintone[5]=$'\U1F3FE'
 47emoji_skintone[6]=$'\U1F3FF'
 48}
 49
 50# Prints a random emoji character
 51#
 52#  random_emoji [group]
 53#
 54function 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#
 77function 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  print
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