summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rwxr-xr-xbin/common/ask28
-rwxr-xr-xbin/common/autofetch13
-rwxr-xr-xbin/common/fzfdir2
-rwxr-xr-xbin/common/fzfdirfile2
-rwxr-xr-xbin/common/fzffile2
-rwxr-xr-xbin/common/gign2
-rwxr-xr-xbin/common/hextorgb7
-rwxr-xr-xbin/common/wt10
-rwxr-xr-xbin/dmscripts/dmapimg6
-rwxr-xr-xbin/dmscripts/dmclip83
-rwxr-xr-xbin/dmscripts/dmdsktp12
-rwxr-xr-xbin/dmscripts/dmemoji1423
-rwxr-xr-xbin/dmscripts/dmfm17
-rwxr-xr-xbin/dmscripts/dmhelp26
-rwxr-xr-xbin/dmscripts/dminw4
-rwxr-xr-xbin/dmscripts/dmlang7
-rwxr-xr-xbin/dmscripts/dmpass11
-rwxr-xr-xbin/dmscripts/dmpassgen20
-rwxr-xr-xbin/dmscripts/dmpdf21
-rwxr-xr-xbin/dmscripts/dmpower3
-rwxr-xr-xbin/dmscripts/dmpsbm2
-rwxr-xr-xbin/dmscripts/dmpsclip3
-rwxr-xr-xbin/dmscripts/dmvid17
-rwxr-xr-xbin/dmscripts/dmyt-not6
-rwxr-xr-xbin/extra/arr_hjkl17
-rwxr-xr-xbin/extra/cht.sh796
-rwxr-xr-xbin/extra/colorscript40
-rwxr-xr-xbin/extra/cycleKB11
-rwxr-xr-xbin/extra/ehbtodl9
-rw-r--r--bin/extra/keyboards.txt2
-rwxr-xr-xbin/extra/vimastp12
31 files changed, 2614 insertions, 0 deletions
diff --git a/bin/common/ask b/bin/common/ask
new file mode 100755
index 0000000..85b5f9e
--- /dev/null
+++ b/bin/common/ask
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+# Depends on passmenu
+if [ -z "$1" ]
+then
+ echo -n ">"
+ read prompt
+else
+ prompt="$@"
+fi
+
+API_KEY="$(pass tokens/openai-api)"
+
+data=$(echo \
+'{
+ "prompt": "'"$prompt"'",
+ "model": "text-davinci-003",
+ "max_tokens": 1024,
+ "temperature": 0
+}')
+
+output=$(curl -s -X POST \
+ -H 'Content-Type: application/json' \
+ -H "Authorization: Bearer $API_KEY" \
+ -d "$data" \
+ https://api.openai.com/v1/completions \
+ | jq -r '.choices[0].text')
+
+echo "${output:1}"
diff --git a/bin/common/autofetch b/bin/common/autofetch
new file mode 100755
index 0000000..3dcdc15
--- /dev/null
+++ b/bin/common/autofetch
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+GREEN='\033[0;32m'
+NC='\033[0m'
+# Fetches for git repos, meant to run at startup
+for directory in "." "installdrier" ".config" ".password-store"
+do
+ if cd ~/$directory
+ then
+ echo -ne "Fetching in ${GREEN}'~/${directory}'${NC}"
+ git fetch origin || exit 1
+ echo ", done."
+ fi
+done
diff --git a/bin/common/fzfdir b/bin/common/fzfdir
new file mode 100755
index 0000000..6ae8f6a
--- /dev/null
+++ b/bin/common/fzfdir
@@ -0,0 +1,2 @@
+#!/usr/bin/env sh
+find "${1:-$HOME}" -type \d 2> /dev/null | fzf
diff --git a/bin/common/fzfdirfile b/bin/common/fzfdirfile
new file mode 100755
index 0000000..df0e51a
--- /dev/null
+++ b/bin/common/fzfdirfile
@@ -0,0 +1,2 @@
+#!/usr/bin/env sh
+dirname "$(find "${1:-$HOME}" -type f 2> /dev/null | fzf)"
diff --git a/bin/common/fzffile b/bin/common/fzffile
new file mode 100755
index 0000000..03e39be
--- /dev/null
+++ b/bin/common/fzffile
@@ -0,0 +1,2 @@
+#!/usr/bin/env sh
+find "${1:-$HOME}" -type f 2> /dev/null | fzf
diff --git a/bin/common/gign b/bin/common/gign
new file mode 100755
index 0000000..e3ba12a
--- /dev/null
+++ b/bin/common/gign
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+git status --porcelain=v1 | grep "^??" | cut -d' ' -f2- | sed -r 's/^["](.*)["]$/\1/' >> .gitignore
diff --git a/bin/common/hextorgb b/bin/common/hextorgb
new file mode 100755
index 0000000..b268db5
--- /dev/null
+++ b/bin/common/hextorgb
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+cat /dev/stdin \
+ | tr -d '#' | tr '[:lower:]' '[:upper:]' \
+ | sed -r 's/([0-9A-F]{2})/\1\n/g ; i ibase=16' \
+ | bc \
+ | tr '\n' ',' \
+ | sed 's/.$// ; s/.*/rgb(&)/'
diff --git a/bin/common/wt b/bin/common/wt
new file mode 100755
index 0000000..81081c8
--- /dev/null
+++ b/bin/common/wt
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+echo "$@" > /tmp/truewhile.tmp
+while true
+do
+ bash /tmp/truewhile.tmp
+ sleep 1
+ clear
+done
+rm /tmp/truewhile.tmp
diff --git a/bin/dmscripts/dmapimg b/bin/dmscripts/dmapimg
new file mode 100755
index 0000000..25c414b
--- /dev/null
+++ b/bin/dmscripts/dmapimg
@@ -0,0 +1,6 @@
+#!/bin/bash
+appimage="$(\
+ find ~/.local/share/appimages -type f -printf "%f\n" \
+ | sed 's/\.[Aa]pp[Ii]mage$//g' \
+ | dmenu -x -l 10 -g 1 -p "AppImage:")"
+setsid ~/AppImages/"${appimage:-NOSEL}"*
diff --git a/bin/dmscripts/dmclip b/bin/dmscripts/dmclip
new file mode 100755
index 0000000..5282b35
--- /dev/null
+++ b/bin/dmscripts/dmclip
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+NotImage () {
+ echo -n "" | dmenu -p "NOT AN IMAGE"
+ exit
+}
+
+# Display clipboard max length
+
+selection="$(echo -e "primary\nclipboard\nswap" | dmenu -l 1 -g 3 -p "selection:")"
+if [[ "${selection}" == "swap" ]]
+then
+ clipboard="$(xclip -o)"
+ xclip -o | xclip -sel c
+ echo -n "${clipboard}" | xclip -sel c
+ exit
+elif [[ "${selection}" == "" ]]
+then
+ exit 1
+fi
+if "${selection}" == "primary" ]]
+then
+ selection2="clipboard"
+else
+ selection2="primary"
+fi
+
+
+clipboard="$(xclip -out -sel "${selection}" -r)"
+
+DICL_LEN=48
+if [[ "$(xclip -sel ${selection} -o | head -n1 | cut -c 2-4)" == "PNG" ]]
+then
+ disp_clip="IMAGE"
+else
+ disp_clip="$(echo -n "${clipboard}" | tr -d '\n' | cut -c -"${DICL_LEN}")"
+fi
+
+menu_option="$(\
+ echo -e "save\nload\nimage\nreplace" \
+ | dmenu -l 1 -g 4 -p "'${disp_clip}'" \
+)"
+[[ "${menu_option}" ]] || exit
+
+case "${menu_option}" in
+
+ replace)
+ replace_text="$(echo -n "" | dmenu -l 0 -p "replace:")"
+ [[ "${replace_text}" ]] || exit
+ replace_by_text="$(echo -n "" | dmenu -l 0 -p "by:")"
+ [[ "${replace_by_text}" ]] || exit
+ echo "${clipboard}" \
+ | sed "s/${replace_text}/${replace_by_text}/g" \
+ | xclip -r -sel "${selection}"
+ ;;
+
+ save)
+ echo "${clipboard}" >> /tmp/tmpclip.txt
+ ;;
+ load)
+ choice="$(\
+ sort /tmp/tmpclip.txt \
+ | uniq \
+ | dmenu -g 1 -l 5 || exit \
+ )"
+ echo -n "${choice}" | xclip -sel "${selection}"
+ ;;
+
+ image)
+ # Menu
+ # 1: line from paragraph
+ # 2: param
+ #
+ file_name="tmp_xclip"
+ xclip -o -sel c > "/tmp/${file_name}.png"
+ file "/tmp/${file_name}.png" \
+ | cut -d ':' -f 2 \
+ | grep "image" || NotImage
+ # sed so that dmenu doesn't skip if one line
+ tesseract "/tmp/${file_name}.png" stdout > "/tmp/${file_name}"
+ sed "1i\ " "/tmp/${file_name}" | dmenu -l 10 -g 1 -p "PREVIEW:" -l 20 || exit
+ xclip -sel "${selection}" -in "/tmp/${file_name}"
+ ;;
+esac
diff --git a/bin/dmscripts/dmdsktp b/bin/dmscripts/dmdsktp
new file mode 100755
index 0000000..2e0ef24
--- /dev/null
+++ b/bin/dmscripts/dmdsktp
@@ -0,0 +1,12 @@
+#!/bin/bash
+# Searches through .desktop files and prompt to launch them via dmenu
+gtk-launch \
+ "$(\
+ find ~/.local/share/applications \
+ -maxdepth 1 \
+ -type f \
+ -not -iname "wine-extension*" -a -iname "*.desktop" \
+ -printf "%f\n" \
+ | cut -d. -f1 \
+ | dmenu -i -p "app:" -g 1 \
+ )"
diff --git a/bin/dmscripts/dmemoji b/bin/dmscripts/dmemoji
new file mode 100755
index 0000000..6211463
--- /dev/null
+++ b/bin/dmscripts/dmemoji
@@ -0,0 +1,1423 @@
+#!/bin/bash
+# This files comes from:
+# https://github.com/porras/dmenu-emoji
+#
+# If this file includes emojis below "__DATA__" it is generated.
+# This file was generated: 2022-04-21 12:38:03+00:00
+
+set -e
+
+case "$1" in
+ "list")
+ data=$(sed '0,/^__DATA__$/d' "$0")
+ echo "$data"
+ ;;
+ "copy")
+ input=$(tee)
+ if [ ! -z "$input" ]; then
+ emoji=${input: -1}
+ echo -n "$emoji" | xclip -selection c
+ dunstify "dmemoji" "$emoji copied!"
+ fi
+ ;;
+ "")
+ bash $0 list | dmenu -p 'Emoji: ' | bash $0 copy
+ ;;
+esac
+
+exit
+
+__DATA__
+grinning face ๐Ÿ˜€
+grinning face with big eyes ๐Ÿ˜ƒ
+grinning face with smiling eyes ๐Ÿ˜„
+beaming face with smiling eyes ๐Ÿ˜
+grinning squinting face ๐Ÿ˜†
+grinning face with sweat ๐Ÿ˜…
+rolling on the floor laughing ๐Ÿคฃ
+face with tears of joy ๐Ÿ˜‚
+slightly smiling face ๐Ÿ™‚
+upside-down face ๐Ÿ™ƒ
+melting face ๐Ÿซ 
+winking face ๐Ÿ˜‰
+smiling face with smiling eyes ๐Ÿ˜Š
+smiling face with halo ๐Ÿ˜‡
+smiling face with hearts ๐Ÿฅฐ
+smiling face with heart-eyes ๐Ÿ˜
+star-struck ๐Ÿคฉ
+face blowing a kiss ๐Ÿ˜˜
+kissing face ๐Ÿ˜—
+smiling face โ˜บ
+kissing face with closed eyes ๐Ÿ˜š
+kissing face with smiling eyes ๐Ÿ˜™
+smiling face with tear ๐Ÿฅฒ
+face savoring food ๐Ÿ˜‹
+face with tongue ๐Ÿ˜›
+winking face with tongue ๐Ÿ˜œ
+zany face ๐Ÿคช
+squinting face with tongue ๐Ÿ˜
+money-mouth face ๐Ÿค‘
+smiling face with open hands ๐Ÿค—
+face with hand over mouth ๐Ÿคญ
+face with open eyes and hand over mouth ๐Ÿซข
+face with peeking eye ๐Ÿซฃ
+shushing face ๐Ÿคซ
+thinking face ๐Ÿค”
+saluting face ๐Ÿซก
+zipper-mouth face ๐Ÿค
+face with raised eyebrow ๐Ÿคจ
+neutral face ๐Ÿ˜
+expressionless face ๐Ÿ˜‘
+face without mouth ๐Ÿ˜ถ
+dotted line face ๐Ÿซฅ
+smirking face ๐Ÿ˜
+unamused face ๐Ÿ˜’
+face with rolling eyes ๐Ÿ™„
+grimacing face ๐Ÿ˜ฌ
+lying face ๐Ÿคฅ
+relieved face ๐Ÿ˜Œ
+pensive face ๐Ÿ˜”
+sleepy face ๐Ÿ˜ช
+drooling face ๐Ÿคค
+sleeping face ๐Ÿ˜ด
+face with medical mask ๐Ÿ˜ท
+face with thermometer ๐Ÿค’
+face with head-bandage ๐Ÿค•
+nauseated face ๐Ÿคข
+face vomiting ๐Ÿคฎ
+sneezing face ๐Ÿคง
+hot face ๐Ÿฅต
+cold face ๐Ÿฅถ
+woozy face ๐Ÿฅด
+face with crossed-out eyes ๐Ÿ˜ต
+exploding head ๐Ÿคฏ
+cowboy hat face ๐Ÿค 
+partying face ๐Ÿฅณ
+disguised face ๐Ÿฅธ
+smiling face with sunglasses ๐Ÿ˜Ž
+nerd face ๐Ÿค“
+face with monocle ๐Ÿง
+confused face ๐Ÿ˜•
+face with diagonal mouth ๐Ÿซค
+worried face ๐Ÿ˜Ÿ
+slightly frowning face ๐Ÿ™
+frowning face โ˜น
+face with open mouth ๐Ÿ˜ฎ
+hushed face ๐Ÿ˜ฏ
+astonished face ๐Ÿ˜ฒ
+flushed face ๐Ÿ˜ณ
+pleading face ๐Ÿฅบ
+face holding back tears ๐Ÿฅน
+frowning face with open mouth ๐Ÿ˜ฆ
+anguished face ๐Ÿ˜ง
+fearful face ๐Ÿ˜จ
+anxious face with sweat ๐Ÿ˜ฐ
+sad but relieved face ๐Ÿ˜ฅ
+crying face ๐Ÿ˜ข
+loudly crying face ๐Ÿ˜ญ
+face screaming in fear ๐Ÿ˜ฑ
+confounded face ๐Ÿ˜–
+persevering face ๐Ÿ˜ฃ
+disappointed face ๐Ÿ˜ž
+downcast face with sweat ๐Ÿ˜“
+weary face ๐Ÿ˜ฉ
+tired face ๐Ÿ˜ซ
+yawning face ๐Ÿฅฑ
+face with steam from nose ๐Ÿ˜ค
+pouting face ๐Ÿ˜ก
+angry face ๐Ÿ˜ 
+face with symbols on mouth ๐Ÿคฌ
+smiling face with horns ๐Ÿ˜ˆ
+angry face with horns ๐Ÿ‘ฟ
+skull ๐Ÿ’€
+skull and crossbones โ˜ 
+pile of poo ๐Ÿ’ฉ
+clown face ๐Ÿคก
+ogre ๐Ÿ‘น
+goblin ๐Ÿ‘บ
+ghost ๐Ÿ‘ป
+alien ๐Ÿ‘ฝ
+alien monster ๐Ÿ‘พ
+robot ๐Ÿค–
+grinning cat ๐Ÿ˜บ
+grinning cat with smiling eyes ๐Ÿ˜ธ
+cat with tears of joy ๐Ÿ˜น
+smiling cat with heart-eyes ๐Ÿ˜ป
+cat with wry smile ๐Ÿ˜ผ
+kissing cat ๐Ÿ˜ฝ
+weary cat ๐Ÿ™€
+crying cat ๐Ÿ˜ฟ
+pouting cat ๐Ÿ˜พ
+see-no-evil monkey ๐Ÿ™ˆ
+hear-no-evil monkey ๐Ÿ™‰
+speak-no-evil monkey ๐Ÿ™Š
+kiss mark ๐Ÿ’‹
+love letter ๐Ÿ’Œ
+heart with arrow ๐Ÿ’˜
+heart with ribbon ๐Ÿ’
+sparkling heart ๐Ÿ’–
+growing heart ๐Ÿ’—
+beating heart ๐Ÿ’“
+revolving hearts ๐Ÿ’ž
+two hearts ๐Ÿ’•
+heart decoration ๐Ÿ’Ÿ
+heart exclamation โฃ
+broken heart ๐Ÿ’”
+red heart โค
+orange heart ๐Ÿงก
+yellow heart ๐Ÿ’›
+green heart ๐Ÿ’š
+blue heart ๐Ÿ’™
+purple heart ๐Ÿ’œ
+brown heart ๐ŸคŽ
+black heart ๐Ÿ–ค
+white heart ๐Ÿค
+hundred points ๐Ÿ’ฏ
+anger symbol ๐Ÿ’ข
+collision ๐Ÿ’ฅ
+dizzy ๐Ÿ’ซ
+sweat droplets ๐Ÿ’ฆ
+dashing away ๐Ÿ’จ
+hole ๐Ÿ•ณ
+bomb ๐Ÿ’ฃ
+speech balloon ๐Ÿ’ฌ
+left speech bubble ๐Ÿ—จ
+right anger bubble ๐Ÿ—ฏ
+thought balloon ๐Ÿ’ญ
+zzz ๐Ÿ’ค
+waving hand ๐Ÿ‘‹
+raised back of hand ๐Ÿคš
+hand with fingers splayed ๐Ÿ–
+raised hand โœ‹
+vulcan salute ๐Ÿ––
+rightwards hand ๐Ÿซฑ
+leftwards hand ๐Ÿซฒ
+palm down hand ๐Ÿซณ
+palm up hand ๐Ÿซด
+OK hand ๐Ÿ‘Œ
+pinched fingers ๐ŸคŒ
+pinching hand ๐Ÿค
+victory hand โœŒ
+crossed fingers ๐Ÿคž
+hand with index finger and thumb crossed ๐Ÿซฐ
+love-you gesture ๐ŸคŸ
+sign of the horns ๐Ÿค˜
+call me hand ๐Ÿค™
+backhand index pointing left ๐Ÿ‘ˆ
+backhand index pointing right ๐Ÿ‘‰
+backhand index pointing up ๐Ÿ‘†
+middle finger ๐Ÿ–•
+backhand index pointing down ๐Ÿ‘‡
+index pointing up โ˜
+index pointing at the viewer ๐Ÿซต
+thumbs up ๐Ÿ‘
+thumbs down ๐Ÿ‘Ž
+raised fist โœŠ
+oncoming fist ๐Ÿ‘Š
+left-facing fist ๐Ÿค›
+right-facing fist ๐Ÿคœ
+clapping hands ๐Ÿ‘
+raising hands ๐Ÿ™Œ
+heart hands ๐Ÿซถ
+open hands ๐Ÿ‘
+palms up together ๐Ÿคฒ
+handshake ๐Ÿค
+folded hands ๐Ÿ™
+writing hand โœ
+nail polish ๐Ÿ’…
+selfie ๐Ÿคณ
+flexed biceps ๐Ÿ’ช
+mechanical arm ๐Ÿฆพ
+mechanical leg ๐Ÿฆฟ
+leg ๐Ÿฆต
+foot ๐Ÿฆถ
+ear ๐Ÿ‘‚
+ear with hearing aid ๐Ÿฆป
+nose ๐Ÿ‘ƒ
+brain ๐Ÿง 
+anatomical heart ๐Ÿซ€
+lungs ๐Ÿซ
+tooth ๐Ÿฆท
+bone ๐Ÿฆด
+eyes ๐Ÿ‘€
+eye ๐Ÿ‘
+tongue ๐Ÿ‘…
+mouth ๐Ÿ‘„
+biting lip ๐Ÿซฆ
+baby ๐Ÿ‘ถ
+child ๐Ÿง’
+boy ๐Ÿ‘ฆ
+girl ๐Ÿ‘ง
+person ๐Ÿง‘
+person: blond hair ๐Ÿ‘ฑ
+man ๐Ÿ‘จ
+person: beard ๐Ÿง”
+woman ๐Ÿ‘ฉ
+older person ๐Ÿง“
+old man ๐Ÿ‘ด
+old woman ๐Ÿ‘ต
+person frowning ๐Ÿ™
+person pouting ๐Ÿ™Ž
+person gesturing NO ๐Ÿ™…
+deaf person ๐Ÿง
+person bowing ๐Ÿ™‡
+person facepalming ๐Ÿคฆ
+person shrugging ๐Ÿคท
+police officer ๐Ÿ‘ฎ
+detective ๐Ÿ•ต
+guard ๐Ÿ’‚
+ninja ๐Ÿฅท
+construction worker ๐Ÿ‘ท
+person with crown ๐Ÿซ…
+prince ๐Ÿคด
+princess ๐Ÿ‘ธ
+person wearing turban ๐Ÿ‘ณ
+person with skullcap ๐Ÿ‘ฒ
+woman with headscarf ๐Ÿง•
+person in tuxedo ๐Ÿคต
+person with veil ๐Ÿ‘ฐ
+pregnant woman ๐Ÿคฐ
+pregnant man ๐Ÿซƒ
+pregnant person ๐Ÿซ„
+breast-feeding ๐Ÿคฑ
+baby angel ๐Ÿ‘ผ
+Santa Claus ๐ŸŽ…
+Mrs. Claus ๐Ÿคถ
+superhero ๐Ÿฆธ
+supervillain ๐Ÿฆน
+mage ๐Ÿง™
+fairy ๐Ÿงš
+vampire ๐Ÿง›
+merperson ๐Ÿงœ
+elf ๐Ÿง
+genie ๐Ÿงž
+zombie ๐ŸงŸ
+troll ๐ŸงŒ
+person getting massage ๐Ÿ’†
+person getting haircut ๐Ÿ’‡
+person walking ๐Ÿšถ
+person standing ๐Ÿง
+person kneeling ๐ŸงŽ
+person running ๐Ÿƒ
+woman dancing ๐Ÿ’ƒ
+man dancing ๐Ÿ•บ
+person in suit levitating ๐Ÿ•ด
+people with bunny ears ๐Ÿ‘ฏ
+person in steamy room ๐Ÿง–
+person climbing ๐Ÿง—
+person fencing ๐Ÿคบ
+horse racing ๐Ÿ‡
+skier โ›ท
+snowboarder ๐Ÿ‚
+person golfing ๐ŸŒ
+person surfing ๐Ÿ„
+person rowing boat ๐Ÿšฃ
+person swimming ๐ŸŠ
+person bouncing ball โ›น
+person lifting weights ๐Ÿ‹
+person biking ๐Ÿšด
+person mountain biking ๐Ÿšต
+person cartwheeling ๐Ÿคธ
+people wrestling ๐Ÿคผ
+person playing water polo ๐Ÿคฝ
+person playing handball ๐Ÿคพ
+person juggling ๐Ÿคน
+person in lotus position ๐Ÿง˜
+person taking bath ๐Ÿ›€
+person in bed ๐Ÿ›Œ
+women holding hands ๐Ÿ‘ญ
+woman and man holding hands ๐Ÿ‘ซ
+men holding hands ๐Ÿ‘ฌ
+kiss ๐Ÿ’
+couple with heart ๐Ÿ’‘
+family ๐Ÿ‘ช
+speaking head ๐Ÿ—ฃ
+bust in silhouette ๐Ÿ‘ค
+busts in silhouette ๐Ÿ‘ฅ
+people hugging ๐Ÿซ‚
+footprints ๐Ÿ‘ฃ
+red hair ๐Ÿฆฐ
+curly hair ๐Ÿฆฑ
+white hair ๐Ÿฆณ
+bald ๐Ÿฆฒ
+monkey face ๐Ÿต
+monkey ๐Ÿ’
+gorilla ๐Ÿฆ
+orangutan ๐Ÿฆง
+dog face ๐Ÿถ
+dog ๐Ÿ•
+guide dog ๐Ÿฆฎ
+poodle ๐Ÿฉ
+wolf ๐Ÿบ
+fox ๐ŸฆŠ
+raccoon ๐Ÿฆ
+cat face ๐Ÿฑ
+cat ๐Ÿˆ
+lion ๐Ÿฆ
+tiger face ๐Ÿฏ
+tiger ๐Ÿ…
+leopard ๐Ÿ†
+horse face ๐Ÿด
+horse ๐ŸŽ
+unicorn ๐Ÿฆ„
+zebra ๐Ÿฆ“
+deer ๐ŸฆŒ
+bison ๐Ÿฆฌ
+cow face ๐Ÿฎ
+ox ๐Ÿ‚
+water buffalo ๐Ÿƒ
+cow ๐Ÿ„
+pig face ๐Ÿท
+pig ๐Ÿ–
+boar ๐Ÿ—
+pig nose ๐Ÿฝ
+ram ๐Ÿ
+ewe ๐Ÿ‘
+goat ๐Ÿ
+camel ๐Ÿช
+two-hump camel ๐Ÿซ
+llama ๐Ÿฆ™
+giraffe ๐Ÿฆ’
+elephant ๐Ÿ˜
+mammoth ๐Ÿฆฃ
+rhinoceros ๐Ÿฆ
+hippopotamus ๐Ÿฆ›
+mouse face ๐Ÿญ
+mouse ๐Ÿ
+rat ๐Ÿ€
+hamster ๐Ÿน
+rabbit face ๐Ÿฐ
+rabbit ๐Ÿ‡
+chipmunk ๐Ÿฟ
+beaver ๐Ÿฆซ
+hedgehog ๐Ÿฆ”
+bat ๐Ÿฆ‡
+bear ๐Ÿป
+koala ๐Ÿจ
+panda ๐Ÿผ
+sloth ๐Ÿฆฅ
+otter ๐Ÿฆฆ
+skunk ๐Ÿฆจ
+kangaroo ๐Ÿฆ˜
+badger ๐Ÿฆก
+paw prints ๐Ÿพ
+turkey ๐Ÿฆƒ
+chicken ๐Ÿ”
+rooster ๐Ÿ“
+hatching chick ๐Ÿฃ
+baby chick ๐Ÿค
+front-facing baby chick ๐Ÿฅ
+bird ๐Ÿฆ
+penguin ๐Ÿง
+dove ๐Ÿ•Š
+eagle ๐Ÿฆ…
+duck ๐Ÿฆ†
+swan ๐Ÿฆข
+owl ๐Ÿฆ‰
+dodo ๐Ÿฆค
+feather ๐Ÿชถ
+flamingo ๐Ÿฆฉ
+peacock ๐Ÿฆš
+parrot ๐Ÿฆœ
+frog ๐Ÿธ
+crocodile ๐ŸŠ
+turtle ๐Ÿข
+lizard ๐ŸฆŽ
+snake ๐Ÿ
+dragon face ๐Ÿฒ
+dragon ๐Ÿ‰
+sauropod ๐Ÿฆ•
+T-Rex ๐Ÿฆ–
+spouting whale ๐Ÿณ
+whale ๐Ÿ‹
+dolphin ๐Ÿฌ
+seal ๐Ÿฆญ
+fish ๐ŸŸ
+tropical fish ๐Ÿ 
+blowfish ๐Ÿก
+shark ๐Ÿฆˆ
+octopus ๐Ÿ™
+spiral shell ๐Ÿš
+coral ๐Ÿชธ
+snail ๐ŸŒ
+butterfly ๐Ÿฆ‹
+bug ๐Ÿ›
+ant ๐Ÿœ
+honeybee ๐Ÿ
+beetle ๐Ÿชฒ
+lady beetle ๐Ÿž
+cricket ๐Ÿฆ—
+cockroach ๐Ÿชณ
+spider ๐Ÿ•ท
+spider web ๐Ÿ•ธ
+scorpion ๐Ÿฆ‚
+mosquito ๐ŸฆŸ
+fly ๐Ÿชฐ
+worm ๐Ÿชฑ
+microbe ๐Ÿฆ 
+bouquet ๐Ÿ’
+cherry blossom ๐ŸŒธ
+white flower ๐Ÿ’ฎ
+lotus ๐Ÿชท
+rosette ๐Ÿต
+rose ๐ŸŒน
+wilted flower ๐Ÿฅ€
+hibiscus ๐ŸŒบ
+sunflower ๐ŸŒป
+blossom ๐ŸŒผ
+tulip ๐ŸŒท
+seedling ๐ŸŒฑ
+potted plant ๐Ÿชด
+evergreen tree ๐ŸŒฒ
+deciduous tree ๐ŸŒณ
+palm tree ๐ŸŒด
+cactus ๐ŸŒต
+sheaf of rice ๐ŸŒพ
+herb ๐ŸŒฟ
+shamrock โ˜˜
+four leaf clover ๐Ÿ€
+maple leaf ๐Ÿ
+fallen leaf ๐Ÿ‚
+leaf fluttering in wind ๐Ÿƒ
+empty nest ๐Ÿชน
+nest with eggs ๐Ÿชบ
+grapes ๐Ÿ‡
+melon ๐Ÿˆ
+watermelon ๐Ÿ‰
+tangerine ๐ŸŠ
+lemon ๐Ÿ‹
+banana ๐ŸŒ
+pineapple ๐Ÿ
+mango ๐Ÿฅญ
+red apple ๐ŸŽ
+green apple ๐Ÿ
+pear ๐Ÿ
+peach ๐Ÿ‘
+cherries ๐Ÿ’
+strawberry ๐Ÿ“
+blueberries ๐Ÿซ
+kiwi fruit ๐Ÿฅ
+tomato ๐Ÿ…
+olive ๐Ÿซ’
+coconut ๐Ÿฅฅ
+avocado ๐Ÿฅ‘
+eggplant ๐Ÿ†
+potato ๐Ÿฅ”
+carrot ๐Ÿฅ•
+ear of corn ๐ŸŒฝ
+hot pepper ๐ŸŒถ
+bell pepper ๐Ÿซ‘
+cucumber ๐Ÿฅ’
+leafy green ๐Ÿฅฌ
+broccoli ๐Ÿฅฆ
+garlic ๐Ÿง„
+onion ๐Ÿง…
+mushroom ๐Ÿ„
+peanuts ๐Ÿฅœ
+beans ๐Ÿซ˜
+chestnut ๐ŸŒฐ
+bread ๐Ÿž
+croissant ๐Ÿฅ
+baguette bread ๐Ÿฅ–
+flatbread ๐Ÿซ“
+pretzel ๐Ÿฅจ
+bagel ๐Ÿฅฏ
+pancakes ๐Ÿฅž
+waffle ๐Ÿง‡
+cheese wedge ๐Ÿง€
+meat on bone ๐Ÿ–
+poultry leg ๐Ÿ—
+cut of meat ๐Ÿฅฉ
+bacon ๐Ÿฅ“
+hamburger ๐Ÿ”
+french fries ๐ŸŸ
+pizza ๐Ÿ•
+hot dog ๐ŸŒญ
+sandwich ๐Ÿฅช
+taco ๐ŸŒฎ
+burrito ๐ŸŒฏ
+tamale ๐Ÿซ”
+stuffed flatbread ๐Ÿฅ™
+falafel ๐Ÿง†
+egg ๐Ÿฅš
+cooking ๐Ÿณ
+shallow pan of food ๐Ÿฅ˜
+pot of food ๐Ÿฒ
+fondue ๐Ÿซ•
+bowl with spoon ๐Ÿฅฃ
+green salad ๐Ÿฅ—
+popcorn ๐Ÿฟ
+butter ๐Ÿงˆ
+salt ๐Ÿง‚
+canned food ๐Ÿฅซ
+bento box ๐Ÿฑ
+rice cracker ๐Ÿ˜
+rice ball ๐Ÿ™
+cooked rice ๐Ÿš
+curry rice ๐Ÿ›
+steaming bowl ๐Ÿœ
+spaghetti ๐Ÿ
+roasted sweet potato ๐Ÿ 
+oden ๐Ÿข
+sushi ๐Ÿฃ
+fried shrimp ๐Ÿค
+fish cake with swirl ๐Ÿฅ
+moon cake ๐Ÿฅฎ
+dango ๐Ÿก
+dumpling ๐ŸฅŸ
+fortune cookie ๐Ÿฅ 
+takeout box ๐Ÿฅก
+crab ๐Ÿฆ€
+lobster ๐Ÿฆž
+shrimp ๐Ÿฆ
+squid ๐Ÿฆ‘
+oyster ๐Ÿฆช
+soft ice cream ๐Ÿฆ
+shaved ice ๐Ÿง
+ice cream ๐Ÿจ
+doughnut ๐Ÿฉ
+cookie ๐Ÿช
+birthday cake ๐ŸŽ‚
+shortcake ๐Ÿฐ
+cupcake ๐Ÿง
+pie ๐Ÿฅง
+chocolate bar ๐Ÿซ
+candy ๐Ÿฌ
+lollipop ๐Ÿญ
+custard ๐Ÿฎ
+honey pot ๐Ÿฏ
+baby bottle ๐Ÿผ
+glass of milk ๐Ÿฅ›
+hot beverage โ˜•
+teapot ๐Ÿซ–
+teacup without handle ๐Ÿต
+sake ๐Ÿถ
+bottle with popping cork ๐Ÿพ
+wine glass ๐Ÿท
+cocktail glass ๐Ÿธ
+tropical drink ๐Ÿน
+beer mug ๐Ÿบ
+clinking beer mugs ๐Ÿป
+clinking glasses ๐Ÿฅ‚
+tumbler glass ๐Ÿฅƒ
+pouring liquid ๐Ÿซ—
+cup with straw ๐Ÿฅค
+bubble tea ๐Ÿง‹
+beverage box ๐Ÿงƒ
+mate ๐Ÿง‰
+ice ๐ŸงŠ
+chopsticks ๐Ÿฅข
+fork and knife with plate ๐Ÿฝ
+fork and knife ๐Ÿด
+spoon ๐Ÿฅ„
+kitchen knife ๐Ÿ”ช
+jar ๐Ÿซ™
+amphora ๐Ÿบ
+globe showing Europe-Africa ๐ŸŒ
+globe showing Americas ๐ŸŒŽ
+globe showing Asia-Australia ๐ŸŒ
+globe with meridians ๐ŸŒ
+world map ๐Ÿ—บ
+map of Japan ๐Ÿ—พ
+compass ๐Ÿงญ
+snow-capped mountain ๐Ÿ”
+mountain โ›ฐ
+volcano ๐ŸŒ‹
+mount fuji ๐Ÿ—ป
+camping ๐Ÿ•
+beach with umbrella ๐Ÿ–
+desert ๐Ÿœ
+desert island ๐Ÿ
+national park ๐Ÿž
+stadium ๐ŸŸ
+classical building ๐Ÿ›
+building construction ๐Ÿ—
+brick ๐Ÿงฑ
+rock ๐Ÿชจ
+wood ๐Ÿชต
+hut ๐Ÿ›–
+houses ๐Ÿ˜
+derelict house ๐Ÿš
+house ๐Ÿ 
+house with garden ๐Ÿก
+office building ๐Ÿข
+Japanese post office ๐Ÿฃ
+post office ๐Ÿค
+hospital ๐Ÿฅ
+bank ๐Ÿฆ
+hotel ๐Ÿจ
+love hotel ๐Ÿฉ
+convenience store ๐Ÿช
+school ๐Ÿซ
+department store ๐Ÿฌ
+factory ๐Ÿญ
+Japanese castle ๐Ÿฏ
+castle ๐Ÿฐ
+wedding ๐Ÿ’’
+Tokyo tower ๐Ÿ—ผ
+Statue of Liberty ๐Ÿ—ฝ
+church โ›ช
+mosque ๐Ÿ•Œ
+hindu temple ๐Ÿ›•
+synagogue ๐Ÿ•
+shinto shrine โ›ฉ
+kaaba ๐Ÿ•‹
+fountain โ›ฒ
+tent โ›บ
+foggy ๐ŸŒ
+night with stars ๐ŸŒƒ
+cityscape ๐Ÿ™
+sunrise over mountains ๐ŸŒ„
+sunrise ๐ŸŒ…
+cityscape at dusk ๐ŸŒ†
+sunset ๐ŸŒ‡
+bridge at night ๐ŸŒ‰
+hot springs โ™จ
+carousel horse ๐ŸŽ 
+playground slide ๐Ÿ›
+ferris wheel ๐ŸŽก
+roller coaster ๐ŸŽข
+barber pole ๐Ÿ’ˆ
+circus tent ๐ŸŽช
+locomotive ๐Ÿš‚
+railway car ๐Ÿšƒ
+high-speed train ๐Ÿš„
+bullet train ๐Ÿš…
+train ๐Ÿš†
+metro ๐Ÿš‡
+light rail ๐Ÿšˆ
+station ๐Ÿš‰
+tram ๐ŸšŠ
+monorail ๐Ÿš
+mountain railway ๐Ÿšž
+tram car ๐Ÿš‹
+bus ๐ŸšŒ
+oncoming bus ๐Ÿš
+trolleybus ๐ŸšŽ
+minibus ๐Ÿš
+ambulance ๐Ÿš‘
+fire engine ๐Ÿš’
+police car ๐Ÿš“
+oncoming police car ๐Ÿš”
+taxi ๐Ÿš•
+oncoming taxi ๐Ÿš–
+automobile ๐Ÿš—
+oncoming automobile ๐Ÿš˜
+sport utility vehicle ๐Ÿš™
+pickup truck ๐Ÿ›ป
+delivery truck ๐Ÿšš
+articulated lorry ๐Ÿš›
+tractor ๐Ÿšœ
+racing car ๐ŸŽ
+motorcycle ๐Ÿ
+motor scooter ๐Ÿ›ต
+manual wheelchair ๐Ÿฆฝ
+motorized wheelchair ๐Ÿฆผ
+auto rickshaw ๐Ÿ›บ
+bicycle ๐Ÿšฒ
+kick scooter ๐Ÿ›ด
+skateboard ๐Ÿ›น
+roller skate ๐Ÿ›ผ
+bus stop ๐Ÿš
+motorway ๐Ÿ›ฃ
+railway track ๐Ÿ›ค
+oil drum ๐Ÿ›ข
+fuel pump โ›ฝ
+wheel ๐Ÿ›ž
+police car light ๐Ÿšจ
+horizontal traffic light ๐Ÿšฅ
+vertical traffic light ๐Ÿšฆ
+stop sign ๐Ÿ›‘
+construction ๐Ÿšง
+anchor โš“
+ring buoy ๐Ÿ›Ÿ
+sailboat โ›ต
+canoe ๐Ÿ›ถ
+speedboat ๐Ÿšค
+passenger ship ๐Ÿ›ณ
+ferry โ›ด
+motor boat ๐Ÿ›ฅ
+ship ๐Ÿšข
+airplane โœˆ
+small airplane ๐Ÿ›ฉ
+airplane departure ๐Ÿ›ซ
+airplane arrival ๐Ÿ›ฌ
+parachute ๐Ÿช‚
+seat ๐Ÿ’บ
+helicopter ๐Ÿš
+suspension railway ๐ŸšŸ
+mountain cableway ๐Ÿš 
+aerial tramway ๐Ÿšก
+satellite ๐Ÿ›ฐ
+rocket ๐Ÿš€
+flying saucer ๐Ÿ›ธ
+bellhop bell ๐Ÿ›Ž
+luggage ๐Ÿงณ
+hourglass done โŒ›
+hourglass not done โณ
+watch โŒš
+alarm clock โฐ
+stopwatch โฑ
+timer clock โฒ
+mantelpiece clock ๐Ÿ•ฐ
+twelve oโ€™clock ๐Ÿ•›
+twelve-thirty ๐Ÿ•ง
+one oโ€™clock ๐Ÿ•
+one-thirty ๐Ÿ•œ
+two oโ€™clock ๐Ÿ•‘
+two-thirty ๐Ÿ•
+three oโ€™clock ๐Ÿ•’
+three-thirty ๐Ÿ•ž
+four oโ€™clock ๐Ÿ•“
+four-thirty ๐Ÿ•Ÿ
+five oโ€™clock ๐Ÿ•”
+five-thirty ๐Ÿ• 
+six oโ€™clock ๐Ÿ••
+six-thirty ๐Ÿ•ก
+seven oโ€™clock ๐Ÿ•–
+seven-thirty ๐Ÿ•ข
+eight oโ€™clock ๐Ÿ•—
+eight-thirty ๐Ÿ•ฃ
+nine oโ€™clock ๐Ÿ•˜
+nine-thirty ๐Ÿ•ค
+ten oโ€™clock ๐Ÿ•™
+ten-thirty ๐Ÿ•ฅ
+eleven oโ€™clock ๐Ÿ•š
+eleven-thirty ๐Ÿ•ฆ
+new moon ๐ŸŒ‘
+waxing crescent moon ๐ŸŒ’
+first quarter moon ๐ŸŒ“
+waxing gibbous moon ๐ŸŒ”
+full moon ๐ŸŒ•
+waning gibbous moon ๐ŸŒ–
+last quarter moon ๐ŸŒ—
+waning crescent moon ๐ŸŒ˜
+crescent moon ๐ŸŒ™
+new moon face ๐ŸŒš
+first quarter moon face ๐ŸŒ›
+last quarter moon face ๐ŸŒœ
+thermometer ๐ŸŒก
+sun โ˜€
+full moon face ๐ŸŒ
+sun with face ๐ŸŒž
+ringed planet ๐Ÿช
+star โญ
+glowing star ๐ŸŒŸ
+shooting star ๐ŸŒ 
+milky way ๐ŸŒŒ
+cloud โ˜
+sun behind cloud โ›…
+cloud with lightning and rain โ›ˆ
+sun behind small cloud ๐ŸŒค
+sun behind large cloud ๐ŸŒฅ
+sun behind rain cloud ๐ŸŒฆ
+cloud with rain ๐ŸŒง
+cloud with snow ๐ŸŒจ
+cloud with lightning ๐ŸŒฉ
+tornado ๐ŸŒช
+fog ๐ŸŒซ
+wind face ๐ŸŒฌ
+cyclone ๐ŸŒ€
+rainbow ๐ŸŒˆ
+closed umbrella ๐ŸŒ‚
+umbrella โ˜‚
+umbrella with rain drops โ˜”
+umbrella on ground โ›ฑ
+high voltage โšก
+snowflake โ„
+snowman โ˜ƒ
+snowman without snow โ›„
+comet โ˜„
+fire ๐Ÿ”ฅ
+droplet ๐Ÿ’ง
+water wave ๐ŸŒŠ
+jack-o-lantern ๐ŸŽƒ
+Christmas tree ๐ŸŽ„
+fireworks ๐ŸŽ†
+sparkler ๐ŸŽ‡
+firecracker ๐Ÿงจ
+sparkles โœจ
+balloon ๐ŸŽˆ
+party popper ๐ŸŽ‰
+confetti ball ๐ŸŽŠ
+tanabata tree ๐ŸŽ‹
+pine decoration ๐ŸŽ
+Japanese dolls ๐ŸŽŽ
+carp streamer ๐ŸŽ
+wind chime ๐ŸŽ
+moon viewing ceremony ๐ŸŽ‘
+red envelope ๐Ÿงง
+ribbon ๐ŸŽ€
+wrapped gift ๐ŸŽ
+reminder ribbon ๐ŸŽ—
+admission tickets ๐ŸŽŸ
+ticket ๐ŸŽซ
+military medal ๐ŸŽ–
+trophy ๐Ÿ†
+sports medal ๐Ÿ…
+1st place medal ๐Ÿฅ‡
+2nd place medal ๐Ÿฅˆ
+3rd place medal ๐Ÿฅ‰
+soccer ball โšฝ
+baseball โšพ
+softball ๐ŸฅŽ
+basketball ๐Ÿ€
+volleyball ๐Ÿ
+american football ๐Ÿˆ
+rugby football ๐Ÿ‰
+tennis ๐ŸŽพ
+flying disc ๐Ÿฅ
+bowling ๐ŸŽณ
+cricket game ๐Ÿ
+field hockey ๐Ÿ‘
+ice hockey ๐Ÿ’
+lacrosse ๐Ÿฅ
+ping pong ๐Ÿ“
+badminton ๐Ÿธ
+boxing glove ๐ŸฅŠ
+martial arts uniform ๐Ÿฅ‹
+goal net ๐Ÿฅ…
+flag in hole โ›ณ
+ice skate โ›ธ
+fishing pole ๐ŸŽฃ
+diving mask ๐Ÿคฟ
+running shirt ๐ŸŽฝ
+skis ๐ŸŽฟ
+sled ๐Ÿ›ท
+curling stone ๐ŸฅŒ
+bullseye ๐ŸŽฏ
+yo-yo ๐Ÿช€
+kite ๐Ÿช
+pool 8 ball ๐ŸŽฑ
+crystal ball ๐Ÿ”ฎ
+magic wand ๐Ÿช„
+nazar amulet ๐Ÿงฟ
+hamsa ๐Ÿชฌ
+video game ๐ŸŽฎ
+joystick ๐Ÿ•น
+slot machine ๐ŸŽฐ
+game die ๐ŸŽฒ
+puzzle piece ๐Ÿงฉ
+teddy bear ๐Ÿงธ
+piรฑata ๐Ÿช…
+mirror ball ๐Ÿชฉ
+nesting dolls ๐Ÿช†
+spade suit โ™ 
+heart suit โ™ฅ
+diamond suit โ™ฆ
+club suit โ™ฃ
+chess pawn โ™Ÿ
+joker ๐Ÿƒ
+mahjong red dragon ๐Ÿ€„
+flower playing cards ๐ŸŽด
+performing arts ๐ŸŽญ
+framed picture ๐Ÿ–ผ
+artist palette ๐ŸŽจ
+thread ๐Ÿงต
+sewing needle ๐Ÿชก
+yarn ๐Ÿงถ
+knot ๐Ÿชข
+glasses ๐Ÿ‘“
+sunglasses ๐Ÿ•ถ
+goggles ๐Ÿฅฝ
+lab coat ๐Ÿฅผ
+safety vest ๐Ÿฆบ
+necktie ๐Ÿ‘”
+t-shirt ๐Ÿ‘•
+jeans ๐Ÿ‘–
+scarf ๐Ÿงฃ
+gloves ๐Ÿงค
+coat ๐Ÿงฅ
+socks ๐Ÿงฆ
+dress ๐Ÿ‘—
+kimono ๐Ÿ‘˜
+sari ๐Ÿฅป
+one-piece swimsuit ๐Ÿฉฑ
+briefs ๐Ÿฉฒ
+shorts ๐Ÿฉณ
+bikini ๐Ÿ‘™
+womanโ€™s clothes ๐Ÿ‘š
+purse ๐Ÿ‘›
+handbag ๐Ÿ‘œ
+clutch bag ๐Ÿ‘
+shopping bags ๐Ÿ›
+backpack ๐ŸŽ’
+thong sandal ๐Ÿฉด
+manโ€™s shoe ๐Ÿ‘ž
+running shoe ๐Ÿ‘Ÿ
+hiking boot ๐Ÿฅพ
+flat shoe ๐Ÿฅฟ
+high-heeled shoe ๐Ÿ‘ 
+womanโ€™s sandal ๐Ÿ‘ก
+ballet shoes ๐Ÿฉฐ
+womanโ€™s boot ๐Ÿ‘ข
+crown ๐Ÿ‘‘
+womanโ€™s hat ๐Ÿ‘’
+top hat ๐ŸŽฉ
+graduation cap ๐ŸŽ“
+billed cap ๐Ÿงข
+military helmet ๐Ÿช–
+rescue workerโ€™s helmet โ›‘
+prayer beads ๐Ÿ“ฟ
+lipstick ๐Ÿ’„
+ring ๐Ÿ’
+gem stone ๐Ÿ’Ž
+muted speaker ๐Ÿ”‡
+speaker low volume ๐Ÿ”ˆ
+speaker medium volume ๐Ÿ”‰
+speaker high volume ๐Ÿ”Š
+loudspeaker ๐Ÿ“ข
+megaphone ๐Ÿ“ฃ
+postal horn ๐Ÿ“ฏ
+bell ๐Ÿ””
+bell with slash ๐Ÿ”•
+musical score ๐ŸŽผ
+musical note ๐ŸŽต
+musical notes ๐ŸŽถ
+studio microphone ๐ŸŽ™
+level slider ๐ŸŽš
+control knobs ๐ŸŽ›
+microphone ๐ŸŽค
+headphone ๐ŸŽง
+radio ๐Ÿ“ป
+saxophone ๐ŸŽท
+accordion ๐Ÿช—
+guitar ๐ŸŽธ
+musical keyboard ๐ŸŽน
+trumpet ๐ŸŽบ
+violin ๐ŸŽป
+banjo ๐Ÿช•
+drum ๐Ÿฅ
+long drum ๐Ÿช˜
+mobile phone ๐Ÿ“ฑ
+mobile phone with arrow ๐Ÿ“ฒ
+telephone โ˜Ž
+telephone receiver ๐Ÿ“ž
+pager ๐Ÿ“Ÿ
+fax machine ๐Ÿ“ 
+battery ๐Ÿ”‹
+low battery ๐Ÿชซ
+electric plug ๐Ÿ”Œ
+laptop ๐Ÿ’ป
+desktop computer ๐Ÿ–ฅ
+printer ๐Ÿ–จ
+keyboard โŒจ
+computer mouse ๐Ÿ–ฑ
+trackball ๐Ÿ–ฒ
+computer disk ๐Ÿ’ฝ
+floppy disk ๐Ÿ’พ
+optical disk ๐Ÿ’ฟ
+dvd ๐Ÿ“€
+abacus ๐Ÿงฎ
+movie camera ๐ŸŽฅ
+film frames ๐ŸŽž
+film projector ๐Ÿ“ฝ
+clapper board ๐ŸŽฌ
+television ๐Ÿ“บ
+camera ๐Ÿ“ท
+camera with flash ๐Ÿ“ธ
+video camera ๐Ÿ“น
+videocassette ๐Ÿ“ผ
+magnifying glass tilted left ๐Ÿ”
+magnifying glass tilted right ๐Ÿ”Ž
+candle ๐Ÿ•ฏ
+light bulb ๐Ÿ’ก
+flashlight ๐Ÿ”ฆ
+red paper lantern ๐Ÿฎ
+diya lamp ๐Ÿช”
+notebook with decorative cover ๐Ÿ“”
+closed book ๐Ÿ“•
+open book ๐Ÿ“–
+green book ๐Ÿ“—
+blue book ๐Ÿ“˜
+orange book ๐Ÿ“™
+books ๐Ÿ“š
+notebook ๐Ÿ““
+ledger ๐Ÿ“’
+page with curl ๐Ÿ“ƒ
+scroll ๐Ÿ“œ
+page facing up ๐Ÿ“„
+newspaper ๐Ÿ“ฐ
+rolled-up newspaper ๐Ÿ—ž
+bookmark tabs ๐Ÿ“‘
+bookmark ๐Ÿ”–
+label ๐Ÿท
+money bag ๐Ÿ’ฐ
+coin ๐Ÿช™
+yen banknote ๐Ÿ’ด
+dollar banknote ๐Ÿ’ต
+euro banknote ๐Ÿ’ถ
+pound banknote ๐Ÿ’ท
+money with wings ๐Ÿ’ธ
+credit card ๐Ÿ’ณ
+receipt ๐Ÿงพ
+chart increasing with yen ๐Ÿ’น
+envelope โœ‰
+e-mail ๐Ÿ“ง
+incoming envelope ๐Ÿ“จ
+envelope with arrow ๐Ÿ“ฉ
+outbox tray ๐Ÿ“ค
+inbox tray ๐Ÿ“ฅ
+package ๐Ÿ“ฆ
+closed mailbox with raised flag ๐Ÿ“ซ
+closed mailbox with lowered flag ๐Ÿ“ช
+open mailbox with raised flag ๐Ÿ“ฌ
+open mailbox with lowered flag ๐Ÿ“ญ
+postbox ๐Ÿ“ฎ
+ballot box with ballot ๐Ÿ—ณ
+pencil โœ
+black nib โœ’
+fountain pen ๐Ÿ–‹
+pen ๐Ÿ–Š
+paintbrush ๐Ÿ–Œ
+crayon ๐Ÿ–
+memo ๐Ÿ“
+briefcase ๐Ÿ’ผ
+file folder ๐Ÿ“
+open file folder ๐Ÿ“‚
+card index dividers ๐Ÿ—‚
+calendar ๐Ÿ“…
+tear-off calendar ๐Ÿ“†
+spiral notepad ๐Ÿ—’
+spiral calendar ๐Ÿ—“
+card index ๐Ÿ“‡
+chart increasing ๐Ÿ“ˆ
+chart decreasing ๐Ÿ“‰
+bar chart ๐Ÿ“Š
+clipboard ๐Ÿ“‹
+pushpin ๐Ÿ“Œ
+round pushpin ๐Ÿ“
+paperclip ๐Ÿ“Ž
+linked paperclips ๐Ÿ–‡
+straight ruler ๐Ÿ“
+triangular ruler ๐Ÿ“
+scissors โœ‚
+card file box ๐Ÿ—ƒ
+file cabinet ๐Ÿ—„
+wastebasket ๐Ÿ—‘
+locked ๐Ÿ”’
+unlocked ๐Ÿ”“
+locked with pen ๐Ÿ”
+locked with key ๐Ÿ”
+key ๐Ÿ”‘
+old key ๐Ÿ—
+hammer ๐Ÿ”จ
+axe ๐Ÿช“
+pick โ›
+hammer and pick โš’
+hammer and wrench ๐Ÿ› 
+dagger ๐Ÿ—ก
+crossed swords โš”
+water pistol ๐Ÿ”ซ
+boomerang ๐Ÿชƒ
+bow and arrow ๐Ÿน
+shield ๐Ÿ›ก
+carpentry saw ๐Ÿชš
+wrench ๐Ÿ”ง
+screwdriver ๐Ÿช›
+nut and bolt ๐Ÿ”ฉ
+gear โš™
+clamp ๐Ÿ—œ
+balance scale โš–
+white cane ๐Ÿฆฏ
+link ๐Ÿ”—
+chains โ›“
+hook ๐Ÿช
+toolbox ๐Ÿงฐ
+magnet ๐Ÿงฒ
+ladder ๐Ÿชœ
+alembic โš—
+test tube ๐Ÿงช
+petri dish ๐Ÿงซ
+dna ๐Ÿงฌ
+microscope ๐Ÿ”ฌ
+telescope ๐Ÿ”ญ
+satellite antenna ๐Ÿ“ก
+syringe ๐Ÿ’‰
+drop of blood ๐Ÿฉธ
+pill ๐Ÿ’Š
+adhesive bandage ๐Ÿฉน
+crutch ๐Ÿฉผ
+stethoscope ๐Ÿฉบ
+x-ray ๐Ÿฉป
+door ๐Ÿšช
+elevator ๐Ÿ›—
+mirror ๐Ÿชž
+window ๐ŸชŸ
+bed ๐Ÿ›
+couch and lamp ๐Ÿ›‹
+chair ๐Ÿช‘
+toilet ๐Ÿšฝ
+plunger ๐Ÿช 
+shower ๐Ÿšฟ
+bathtub ๐Ÿ›
+mouse trap ๐Ÿชค
+razor ๐Ÿช’
+lotion bottle ๐Ÿงด
+safety pin ๐Ÿงท
+broom ๐Ÿงน
+basket ๐Ÿงบ
+roll of paper ๐Ÿงป
+bucket ๐Ÿชฃ
+soap ๐Ÿงผ
+bubbles ๐Ÿซง
+toothbrush ๐Ÿชฅ
+sponge ๐Ÿงฝ
+fire extinguisher ๐Ÿงฏ
+shopping cart ๐Ÿ›’
+cigarette ๐Ÿšฌ
+coffin โšฐ
+headstone ๐Ÿชฆ
+funeral urn โšฑ
+moai ๐Ÿ—ฟ
+placard ๐Ÿชง
+identification card ๐Ÿชช
+ATM sign ๐Ÿง
+litter in bin sign ๐Ÿšฎ
+potable water ๐Ÿšฐ
+wheelchair symbol โ™ฟ
+menโ€™s room ๐Ÿšน
+womenโ€™s room ๐Ÿšบ
+restroom ๐Ÿšป
+baby symbol ๐Ÿšผ
+water closet ๐Ÿšพ
+passport control ๐Ÿ›‚
+customs ๐Ÿ›ƒ
+baggage claim ๐Ÿ›„
+left luggage ๐Ÿ›…
+warning โš 
+children crossing ๐Ÿšธ
+no entry โ›”
+prohibited ๐Ÿšซ
+no bicycles ๐Ÿšณ
+no smoking ๐Ÿšญ
+no littering ๐Ÿšฏ
+non-potable water ๐Ÿšฑ
+no pedestrians ๐Ÿšท
+no mobile phones ๐Ÿ“ต
+no one under eighteen ๐Ÿ”ž
+radioactive โ˜ข
+biohazard โ˜ฃ
+up arrow โฌ†
+up-right arrow โ†—
+right arrow โžก
+down-right arrow โ†˜
+down arrow โฌ‡
+down-left arrow โ†™
+left arrow โฌ…
+up-left arrow โ†–
+up-down arrow โ†•
+left-right arrow โ†”
+right arrow curving left โ†ฉ
+left arrow curving right โ†ช
+right arrow curving up โคด
+right arrow curving down โคต
+clockwise vertical arrows ๐Ÿ”ƒ
+counterclockwise arrows button ๐Ÿ”„
+BACK arrow ๐Ÿ”™
+END arrow ๐Ÿ”š
+ON! arrow ๐Ÿ”›
+SOON arrow ๐Ÿ”œ
+TOP arrow ๐Ÿ”
+place of worship ๐Ÿ›
+atom symbol โš›
+om ๐Ÿ•‰
+star of David โœก
+wheel of dharma โ˜ธ
+yin yang โ˜ฏ
+latin cross โœ
+orthodox cross โ˜ฆ
+star and crescent โ˜ช
+peace symbol โ˜ฎ
+menorah ๐Ÿ•Ž
+dotted six-pointed star ๐Ÿ”ฏ
+Aries โ™ˆ
+Taurus โ™‰
+Gemini โ™Š
+Cancer โ™‹
+Leo โ™Œ
+Virgo โ™
+Libra โ™Ž
+Scorpio โ™
+Sagittarius โ™
+Capricorn โ™‘
+Aquarius โ™’
+Pisces โ™“
+Ophiuchus โ›Ž
+shuffle tracks button ๐Ÿ”€
+repeat button ๐Ÿ”
+repeat single button ๐Ÿ”‚
+play button โ–ถ
+fast-forward button โฉ
+next track button โญ
+play or pause button โฏ
+reverse button โ—€
+fast reverse button โช
+last track button โฎ
+upwards button ๐Ÿ”ผ
+fast up button โซ
+downwards button ๐Ÿ”ฝ
+fast down button โฌ
+pause button โธ
+stop button โน
+record button โบ
+eject button โ
+cinema ๐ŸŽฆ
+dim button ๐Ÿ”…
+bright button ๐Ÿ”†
+antenna bars ๐Ÿ“ถ
+vibration mode ๐Ÿ“ณ
+mobile phone off ๐Ÿ“ด
+female sign โ™€
+male sign โ™‚
+transgender symbol โšง
+multiply โœ–
+plus โž•
+minus โž–
+divide โž—
+heavy equals sign ๐ŸŸฐ
+infinity โ™พ
+double exclamation mark โ€ผ
+exclamation question mark โ‰
+red question mark โ“
+white question mark โ”
+white exclamation mark โ•
+red exclamation mark โ—
+wavy dash ใ€ฐ
+currency exchange ๐Ÿ’ฑ
+heavy dollar sign ๐Ÿ’ฒ
+medical symbol โš•
+recycling symbol โ™ป
+fleur-de-lis โšœ
+trident emblem ๐Ÿ”ฑ
+name badge ๐Ÿ“›
+Japanese symbol for beginner ๐Ÿ”ฐ
+hollow red circle โญ•
+check mark button โœ…
+check box with check โ˜‘
+check mark โœ”
+cross mark โŒ
+cross mark button โŽ
+curly loop โžฐ
+double curly loop โžฟ
+part alternation mark ใ€ฝ
+eight-spoked asterisk โœณ
+eight-pointed star โœด
+sparkle โ‡
+copyright ยฉ
+registered ยฎ
+trade mark โ„ข
+keycap: # #๏ธโƒฃ
+keycap: * *๏ธโƒฃ
+keycap: 0 0๏ธโƒฃ
+keycap: 1 1๏ธโƒฃ
+keycap: 2 2๏ธโƒฃ
+keycap: 3 3๏ธโƒฃ
+keycap: 4 4๏ธโƒฃ
+keycap: 5 5๏ธโƒฃ
+keycap: 6 6๏ธโƒฃ
+keycap: 7 7๏ธโƒฃ
+keycap: 8 8๏ธโƒฃ
+keycap: 9 9๏ธโƒฃ
+keycap: 10 ๐Ÿ”Ÿ
+input latin uppercase ๐Ÿ” 
+input latin lowercase ๐Ÿ”ก
+input numbers ๐Ÿ”ข
+input symbols ๐Ÿ”ฃ
+input latin letters ๐Ÿ”ค
+A button (blood type) ๐Ÿ…ฐ
+AB button (blood type) ๐Ÿ†Ž
+B button (blood type) ๐Ÿ…ฑ
+CL button ๐Ÿ†‘
+COOL button ๐Ÿ†’
+FREE button ๐Ÿ†“
+information โ„น
+ID button ๐Ÿ†”
+circled M โ“‚
+NEW button ๐Ÿ†•
+NG button ๐Ÿ†–
+O button (blood type) ๐Ÿ…พ
+OK button ๐Ÿ†—
+P button ๐Ÿ…ฟ
+SOS button ๐Ÿ†˜
+UP! button ๐Ÿ†™
+VS button ๐Ÿ†š
+Japanese โ€œhereโ€ button ๐Ÿˆ
+Japanese โ€œservice chargeโ€ button ๐Ÿˆ‚
+Japanese โ€œmonthly amountโ€ button ๐Ÿˆท
+Japanese โ€œnot free of chargeโ€ button ๐Ÿˆถ
+Japanese โ€œreservedโ€ button ๐Ÿˆฏ
+Japanese โ€œbargainโ€ button ๐Ÿ‰
+Japanese โ€œdiscountโ€ button ๐Ÿˆน
+Japanese โ€œfree of chargeโ€ button ๐Ÿˆš
+Japanese โ€œprohibitedโ€ button ๐Ÿˆฒ
+Japanese โ€œacceptableโ€ button ๐Ÿ‰‘
+Japanese โ€œapplicationโ€ button ๐Ÿˆธ
+Japanese โ€œpassing gradeโ€ button ๐Ÿˆด
+Japanese โ€œvacancyโ€ button ๐Ÿˆณ
+Japanese โ€œcongratulationsโ€ button ใŠ—
+Japanese โ€œsecretโ€ button ใŠ™
+Japanese โ€œopen for businessโ€ button ๐Ÿˆบ
+Japanese โ€œno vacancyโ€ button ๐Ÿˆต
+red circle ๐Ÿ”ด
+orange circle ๐ŸŸ 
+yellow circle ๐ŸŸก
+green circle ๐ŸŸข
+blue circle ๐Ÿ”ต
+purple circle ๐ŸŸฃ
+brown circle ๐ŸŸค
+black circle โšซ
+white circle โšช
+red square ๐ŸŸฅ
+orange square ๐ŸŸง
+yellow square ๐ŸŸจ
+green square ๐ŸŸฉ
+blue square ๐ŸŸฆ
+purple square ๐ŸŸช
+brown square ๐ŸŸซ
+black large square โฌ›
+white large square โฌœ
+black medium square โ—ผ
+white medium square โ—ป
+black medium-small square โ—พ
+white medium-small square โ—ฝ
+black small square โ–ช
+white small square โ–ซ
+large orange diamond ๐Ÿ”ถ
+large blue diamond ๐Ÿ”ท
+small orange diamond ๐Ÿ”ธ
+small blue diamond ๐Ÿ”น
+red triangle pointed up ๐Ÿ”บ
+red triangle pointed down ๐Ÿ”ป
+diamond with a dot ๐Ÿ’ 
+radio button ๐Ÿ”˜
+white square button ๐Ÿ”ณ
+black square button ๐Ÿ”ฒ
+chequered flag ๐Ÿ
+triangular flag ๐Ÿšฉ
+crossed flags ๐ŸŽŒ
+black flag ๐Ÿด
+white flag ๐Ÿณ
+letter a ๐Ÿ‡ฆ
+letter b ๐Ÿ‡ง
+letter c ๐Ÿ‡จ
+letter d ๐Ÿ‡ฉ
+letter e ๐Ÿ‡ช
+letter f ๐Ÿ‡ซ
+letter g ๐Ÿ‡ฌ
+letter h ๐Ÿ‡ญ
+letter i ๐Ÿ‡ฎ
+letter j ๐Ÿ‡ฏ
+letter k ๐Ÿ‡ฐ
+letter l ๐Ÿ‡ฑ
+letter m ๐Ÿ‡ฒ
+letter n ๐Ÿ‡ณ
+letter o ๐Ÿ‡ด
+letter p ๐Ÿ‡ต
+letter r ๐Ÿ‡ท
+letter s ๐Ÿ‡ธ
+letter t ๐Ÿ‡น
+letter u ๐Ÿ‡บ
+letter v ๐Ÿ‡ป
+letter y ๐Ÿ‡พ
+letter z ๐Ÿ‡ฟ
diff --git a/bin/dmscripts/dmfm b/bin/dmscripts/dmfm
new file mode 100755
index 0000000..34a9e2c
--- /dev/null
+++ b/bin/dmscripts/dmfm
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+file=1
+while [ "$file" ]; do
+ file=$(ls -1 --group-directories-first | dmenu -i -l 8 -g 1 -p "$(basename $(pwd)):")
+ if [ -e "$file" ]; then
+ owd=$(pwd)
+ if [ -d "$file" ]; then
+ cd "$file"
+ else [ -f "$file" ]
+ if which xdg-open &> /dev/null; then
+ exec xdg-open "$owd/$file" &
+ unset file
+ fi
+ fi
+ fi
+done
diff --git a/bin/dmscripts/dmhelp b/bin/dmscripts/dmhelp
new file mode 100755
index 0000000..653fa1f
--- /dev/null
+++ b/bin/dmscripts/dmhelp
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+program="${1:-$(dmenu_path | dmenu -l 4 -g 5)}"
+opfil="/tmp/dmh_options.txt"
+test -z "${program}" && exit 1
+
+if ${program} --help > "${opfil}"
+then
+ option="$(\
+ grep -E "^ *-[-a-Z]* " "${opfil}" \
+ | tr -s ' ' \
+ | sort | uniq \
+ | column -l 2 -t \
+ | dmenu -x -l 20 -g 1 -p "${program}" \
+ | awk '{print $1}' \
+ )"
+elif man $program > "${opfil}"
+then
+ echo lesgo
+else
+ echo "No options found for '${program}'" > /dev/stderr
+ exit 1
+fi
+test -z "${option}" && exit 1
+
+rm -f "${opfil}"
+${program} ${option}
diff --git a/bin/dmscripts/dminw b/bin/dmscripts/dminw
new file mode 100755
index 0000000..2ff32a1
--- /dev/null
+++ b/bin/dmscripts/dminw
@@ -0,0 +1,4 @@
+#!/bin/bash
+WINDOWID=${1:-$(xdotool getwindowfocus)}
+WIDTH=$(xdotool getwindowgeometry -s ${WINDOWID} | grep WIDTH | cut -d ' ' -f 2)
+dmenu_run -w ${1:-$(xdotool getwindowfocus)} -z ${WIDTH}
diff --git a/bin/dmscripts/dmlang b/bin/dmscripts/dmlang
new file mode 100755
index 0000000..0009704
--- /dev/null
+++ b/bin/dmscripts/dmlang
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+choice="$(\
+ echo -e "us\ngb\nbe" \
+ | dmenu \
+ -p "($(setxkbmap -query | awk 'NR==3 {print $2}'))" \
+)"
+setxkbmap "${choice:-us}"
diff --git a/bin/dmscripts/dmpass b/bin/dmscripts/dmpass
new file mode 100755
index 0000000..2af798b
--- /dev/null
+++ b/bin/dmscripts/dmpass
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+store="$HOME/.password-store"
+lscmd="ls --group-directories-first"
+dmenucmd="dmenu -l 4 -g 2"
+while [ -d "${store}/${file}" ]
+do
+ choice="$($lscmd "${store}/${file}" | awk -F'.gpg' '{print $1}' | $dmenucmd)"
+ [ "$choice" ] || break
+ file="${file}/${choice}"
+done
+pass show -c "${file}"
diff --git a/bin/dmscripts/dmpassgen b/bin/dmscripts/dmpassgen
new file mode 100755
index 0000000..c627a1d
--- /dev/null
+++ b/bin/dmscripts/dmpassgen
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+choice="$(echo -ne "multiline\nsingle" | dmenu -l 1 -g 2)"
+test -z "${choice}" && exit 1
+
+password="$(echo -n "" | dmenu -p "name:")"
+test -z "${password}" && exit 1
+
+if [[ "${choice}" == "multiline" ]]
+then
+ logins="$(ls -1 ~/.password-store/e-mails | awk -F '.gpg' '{print $1}')"
+ login="$(echo "$logins" | dmenu -g 1 -l 8 -p "login:")"
+ test -z "${login}" && exit 1
+ url="$(echo -n "" | dmenu -p "url:")"
+ test -z "${url}" && exit 1
+ echo -e "${password}\nlogin: ${login}\nurl: ${url}" | pass insert -mf "${password}"
+ pass generate -ci "${password}"
+else
+ pass generate -cf "${password}"
+fi
+
diff --git a/bin/dmscripts/dmpdf b/bin/dmscripts/dmpdf
new file mode 100755
index 0000000..6137e1a
--- /dev/null
+++ b/bin/dmscripts/dmpdf
@@ -0,0 +1,21 @@
+#!/bin/bash
+directory="${1:-$PWD}"
+choice="$(\
+ find "${directory}" \
+ -type f \
+ -iname "*.pdf" \
+ -printf "%p\n" \
+ | awk -F '/' '{print $(NF - 1) "/" $NF}' \
+ | sort \
+ | uniq \
+ | dmenu -i -x -p "pdf:" -l 10 -g 2 \
+ | awk -F '/' '{print $2}' \
+)"
+
+# find matching file
+file="$(\
+ find "$directory" -name "*$choice*" \
+)"
+
+[[ -f "$file" ]] || exit 1
+evince "$file" &
diff --git a/bin/dmscripts/dmpower b/bin/dmscripts/dmpower
new file mode 100755
index 0000000..bd847d6
--- /dev/null
+++ b/bin/dmscripts/dmpower
@@ -0,0 +1,3 @@
+#!/bin/sh
+choice="$(echo -e "poweroff\nreboot\nhibernate" | dmenu -l 1 -g 3)"
+test -z "$choice" || systemctl "$choice"
diff --git a/bin/dmscripts/dmpsbm b/bin/dmscripts/dmpsbm
new file mode 100755
index 0000000..3b00b2c
--- /dev/null
+++ b/bin/dmscripts/dmpsbm
@@ -0,0 +1,2 @@
+#!/bin/sh
+grep -v '^#' ~/.local/share/bookmarks | dmenu -c -x -g 1 -l 10 | cut -f1 -d' ' | xclip -sel c && xdotool key Ctrl+Shift+v
diff --git a/bin/dmscripts/dmpsclip b/bin/dmscripts/dmpsclip
new file mode 100755
index 0000000..8577e91
--- /dev/null
+++ b/bin/dmscripts/dmpsclip
@@ -0,0 +1,3 @@
+#!/bin/sh
+dmenu -l 10 -g 1 -c -x < /tmp/tmpclip.txt | xclip -sel c
+xdotool key Ctrl+Shift+v
diff --git a/bin/dmscripts/dmvid b/bin/dmscripts/dmvid
new file mode 100755
index 0000000..08dbb6b
--- /dev/null
+++ b/bin/dmscripts/dmvid
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+find ${1:-~/movies ~/Downloads} 2> /dev/null | grep -E ".+\.(webm|mp4|mpeg|mkv)$" | sort > /tmp/dmvids
+choice="$(\
+ sed 's|^/home/aluc|\~| ; s|\([^/]\)[^/]*/|\1/|g' /tmp/dmvids \
+ | tr '\n' '\0' \
+ | xargs -0 -I {} echo "๏€ฝ {}" \
+ | tr '\0' '\n' \
+ | awk '{printf "%-3s %s\n", NR ":", $0}' \
+ | dmenu -l 10 -g 1 -x -i \
+ | grep -zoE "^[0-9]+:" \
+)"
+if [ -z "$choice" ]; then
+ exit
+fi
+vid="$(sed -n "${choice::-1}p" /tmp/dmvids)"
+mpv "$vid"
diff --git a/bin/dmscripts/dmyt-not b/bin/dmscripts/dmyt-not
new file mode 100755
index 0000000..4783a8d
--- /dev/null
+++ b/bin/dmscripts/dmyt-not
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+# Open a video from channels.yt-not by selecting the channel
+channel="$(awk '{print $2}' ~/.local/share/yt-not/channels.yt-not | dmenu -l 2 -g 4)"
+video_id="$(awk "/$channel/ {print \$3}" ~/.local/share/yt-not/channels.yt-not )"
+video="https://youtube.com/watch?v=${video_id}"
+mpv $video
diff --git a/bin/extra/arr_hjkl b/bin/extra/arr_hjkl
new file mode 100755
index 0000000..0ef542e
--- /dev/null
+++ b/bin/extra/arr_hjkl
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+if [ "$(xmodmap -pke | grep ' = h')" ]
+then
+ xmodmap -e 'keycode 43 = Left'
+ xmodmap -e 'keycode 44 = Down Return'
+ xmodmap -e 'keycode 45 = Up'
+ xmodmap -e 'keycode 46 = Right'
+ dunstify "arr hjkl" "arrows <b>on</b>"
+else
+ export ARRKEYMODE="hjkl"
+ xmodmap -e 'keycode 43 = h'
+ xmodmap -e 'keycode 44 = j'
+ xmodmap -e 'keycode 45 = k'
+ xmodmap -e 'keycode 46 = l'
+ dunstify "arr hjkl" "arrows <b>off</b>"
+fi
diff --git a/bin/extra/cht.sh b/bin/extra/cht.sh
new file mode 100755
index 0000000..7cd4892
--- /dev/null
+++ b/bin/extra/cht.sh
@@ -0,0 +1,796 @@
+#!/bin/bash
+# shellcheck disable=SC1117,SC2001
+#
+# [X] open section
+# [X] one shot mode
+# [X] usage info
+# [X] dependencies check
+# [X] help
+# [X] yank/y/copy/c
+# [X] Y/C
+# [X] eof problem
+# [X] more
+# [X] stealth mode
+#
+# here are several examples for the stealth mode:
+#
+# zip lists
+# list permutation
+# random list element
+# reverse a list
+# read json from file
+# append string to a file
+# run process in background
+# count words in text counter
+# group elements list
+
+__CHTSH_VERSION=0.0.4
+__CHTSH_DATETIME="2021-04-25 12:30:30 +0200"
+
+# cht.sh configuration loading
+#
+# configuration is stored in ~/.cht.sh/ (can be overridden with CHTSH env var.)
+#
+CHTSH_HOME=${CHTSH:-"$HOME"/.cht.sh}
+[ -z "$CHTSH_CONF" ] && CHTSH_CONF=$CHTSH_HOME/cht.sh.conf
+# shellcheck disable=SC1090,SC2002
+[ -e "$CHTSH_CONF" ] && source "$CHTSH_CONF"
+[ -z "$CHTSH_URL" ] && CHTSH_URL=https://cht.sh
+
+# currently we support only two modes:
+# * lite = access the server using curl
+# * auto = try standalone usage first
+CHTSH_MODE="$(cat "$CHTSH_HOME"/mode 2> /dev/null)"
+[ "$CHTSH_MODE" != lite ] && CHTSH_MODE=auto
+CHEATSH_INSTALLATION="$(cat "$CHTSH_HOME/standalone" 2> /dev/null)"
+
+
+export LESSSECURE=1
+STEALTH_MAX_SELECTION_LENGTH=5
+
+case "$(uname -s)" in
+ Darwin) is_macos=yes ;;
+ *) is_macos=no ;;
+esac
+
+# for KSH93
+# shellcheck disable=SC2034,SC2039,SC2168
+if echo "$KSH_VERSION" | grep -q ' 93' && ! local foo 2>/dev/null; then
+ alias local=typeset
+fi
+
+fatal()
+{
+ echo "ERROR: $*" >&2
+ exit 1
+}
+
+_say_what_i_do()
+{
+ [ -n "$LOG" ] && echo "$(date '+[%Y-%m-%d %H:%M%S]') $*" >> "$LOG"
+
+ local this_prompt="\033[0;1;4;32m>>\033[0m"
+ printf "\n${this_prompt}%s\033[0m\n" " $* "
+}
+
+cheatsh_standalone_install()
+{
+ # the function installs cheat.sh with the upstream repositories
+ # in the standalone mode
+ local installdir; installdir="$1"
+ local default_installdir="$HOME/.cheat.sh"
+
+ [ -z "$installdir" ] && installdir=${default_installdir}
+
+ if [ "$installdir" = help ]; then
+ cat <<EOF
+Install cheat.sh in the standalone mode.
+
+After the installation, cheat.sh can be used locally, without accessing
+the public cheat.sh service, or it can be used in the server mode,
+where the newly installed server could be accessed by external clients
+in the same fashion as the public cheat.sh server.
+
+During the installation, cheat.sh code as well as the cheat.sh upstream
+cheat sheets repositories will be fetched.
+
+It takes approximately 1G of the disk space.
+
+Default installation location: ~/.cheat.sh/
+It can be overridden by a command line parameter to this script:
+
+ ${0##*/} --standalone-install DIR
+
+See cheat.sh/:standalone or https://github.com/chubin/cheat.sh/README.md
+for more information:
+
+ cht.sh :standalone
+ curl cheat.sh/:standalone
+
+After the installation is finished, the cht.sh shell client is switched
+to the auto mode, where it uses the local cheat.sh installation if possible.
+You can switch the mode with the --mode switch:
+
+ cht.sh --mode lite # use https://cheat.sh/ only
+ cht.sh --mode auto # use local installation
+
+For intallation and standalone usage, you need \`git\`, \`python\`,
+and \`virtualenv\` to be installed locally.
+EOF
+ return
+ fi
+
+ local _exit_code=0
+
+ local dependencies=(python git virtualenv)
+ for dep in "${dependencies[@]}"; do
+ command -v "$dep" >/dev/null || \
+ { echo "DEPENDENCY: \"$dep\" is needed to install cheat.sh in the standalone mode" >&2; _exit_code=1; }
+ done
+ [ "$_exit_code" -ne 0 ] && return "$_exit_code"
+
+ while true; do
+ local _installdir
+ echo -n "Where should cheat.sh be installed [$installdir]? "; read -r _installdir
+ [ -n "$_installdir" ] && installdir=$_installdir
+
+ if [ "$installdir" = y ] \
+ || [ "$installdir" = Y ] \
+ || [ "$(echo "$installdir" | tr "[:upper:]" "[:lower:]")" = yes ]
+ then
+ echo Please enter the directory name
+ echo If it was the directory name already, please prepend it with \"./\": "./$installdir"
+ else
+ break
+ fi
+ done
+
+ if [ -e "$installdir" ]; then
+ echo "ERROR: Installation directory [$installdir] exists already"
+ echo "Please remove it first before continuing"
+ return 1
+ fi
+
+ if ! mkdir -p "$installdir"; then
+ echo "ERROR: Could not create the installation directory \"$installdir\""
+ echo "ERROR: Please check the permissions and start the script again"
+ return 1
+ fi
+
+ local space_needed=700
+ local space_available; space_available=$(($(df -k "$installdir" | awk '{print $4}' | tail -1)/1024))
+
+ if [ "$space_available" -lt "$space_needed" ]; then
+ echo "ERROR: Installation directory has no enough space (needed: ${space_needed}M, available: ${space_available}M"
+ echo "ERROR: Please clean up and start the script again"
+ rmdir "$installdir"
+ return 1
+ fi
+
+ _say_what_i_do Cloning cheat.sh locally
+ local url=https://github.com/chubin/cheat.sh
+ rmdir "$installdir"
+ git clone "$url" "$installdir" || fatal Could not clone "$url" with git into "$installdir"
+ cd "$installdir" || fatal "Cannot cd into $installdir"
+
+ # after the repository cloned, we may have the log directory
+ # and we can write our installation log into it
+ mkdir -p "log/"
+ LOG="$PWD/log/install.log"
+
+ # we use tee everywhere so we should set -o pipefail
+ set -o pipefail
+
+ # currently the script uses python 2,
+ # but cheat.sh supports python 3 too
+ # if you want to switch it to python 3
+ # set PYTHON2 to NO:
+ # PYTHON2=NO
+ #
+ PYTHON2=NO
+ if [[ $PYTHON2 = YES ]]; then
+ python="python2"
+ pip="pip"
+ virtualenv_python3_option=()
+ else
+ python="python3"
+ pip="pip3"
+ virtualenv_python3_option=(-p python3)
+ fi
+
+ _say_what_i_do Creating virtual environment
+ virtualenv "${virtualenv_python3_option[@]}" ve \
+ || fatal "Could not create virtual environment with 'virtualenv ve'"
+
+ export CHEATSH_PATH_WORKDIR=$PWD
+
+ # rapidfuzz does not support Python 2,
+ # so if we are using Python 2, install fuzzywuzzy instead
+ if [[ $PYTHON2 = YES ]]; then
+ sed -i s/rapidfuzz/fuzzywuzzy/ requirements.txt
+ echo "python-Levenshtein" >> requirements.txt
+ fi
+
+ _say_what_i_do Installing python requirements into the virtual environment
+ ve/bin/"$pip" install -r requirements.txt > "$LOG" \
+ || {
+
+ echo "ERROR:"
+ echo "---"
+ tail -n 10 "$LOG"
+ echo "---"
+ echo "See $LOG for more"
+ fatal Could not install python dependencies into the virtual environment
+ }
+ echo "$(ve/bin/"$pip" freeze | wc -l) dependencies were successfully installed"
+
+ _say_what_i_do Fetching the upstream cheat sheets repositories
+ ve/bin/python lib/fetch.py fetch-all | tee -a "$LOG"
+
+ _say_what_i_do Running self-tests
+ (
+ cd tests || exit
+
+ if CHEATSH_TEST_STANDALONE=YES \
+ CHEATSH_TEST_SKIP_ONLINE=NO \
+ CHEATSH_TEST_SHOW_DETAILS=NO \
+ PYTHON=../ve/bin/python bash run-tests.sh | tee -a "$LOG"
+ then
+ printf "\033[0;32m%s\033[0m\n" "SUCCESS"
+ else
+ printf "\033[0;31m%s\033[0m\n" "FAILED"
+ echo "Some tests were failed. Run the tests manually for further investigation:"
+ echo " cd $PWD; bash run-tests.sh)"
+ fi
+ )
+
+ mkdir -p "$CHTSH_HOME"
+ echo "$installdir" > "$CHTSH_HOME/standalone"
+ echo auto > "$CHTSH_HOME/mode"
+
+ _say_what_i_do Done
+
+ local v1; v1=$(printf "\033[0;1;32m")
+ local v2; v2=$(printf "\033[0m")
+
+ cat <<EOF | sed "s/{/$v1/; s/}/$v2/"
+
+{ _ }
+{ \\ \\ } The installation is successfully finished.
+{ \\ \\ }
+{ / / } Now you can use cheat.sh in the standalone mode,
+{ /_/ } or you can start your own cheat.sh server.
+
+
+Now the cht.sh shell client is switched to the auto mode, where it uses
+the local cheat.sh installation if possible.
+You can switch the mode with the --mode switch:
+
+ cht.sh --mode lite # use https://cheat.sh/ only
+ cht.sh --mode auto # use local installation
+
+You can add your own cheat sheets repository (config is in \`etc/config.yaml\`),
+or create new cheat sheets adapters (in \`lib/adapters\`).
+
+To update local copies of cheat sheets repositores on a regular basis,
+add the following line to your user crontab (crontab -e):
+
+ 10 * * * * $installdir/ve/bin/python $installdir/lib/fetch.py update-all
+
+All cheat sheets will be automatically actualized each hour.
+
+If you are running a server reachable from the Internet, it can be instantly
+notified via a HTTP request about any cheat sheets changes. For that, please
+open an issue on the cheat.sh project repository [github.com/chubin/cheat.sh]
+with the ENTRY-POINT from the URL https://ENTRY-POINT/:actualize specified
+EOF
+}
+
+chtsh_mode()
+{
+ local mode="$1"
+
+ local text; text=$(
+ echo " auto use the standalone installation first"
+ echo " lite use the cheat sheets server directly"
+ )
+
+ if [ -z "$mode" ]; then
+ echo "current mode: $CHTSH_MODE ($(printf "%s" "$text" | grep "$CHTSH_MODE" | sed "s/$CHTSH_MODE//; s/^ *//; s/ \+/ /"))"
+ if [ -d "$CHEATSH_INSTALLATION" ]; then
+ echo "cheat.sh standalone installation: $CHEATSH_INSTALLATION"
+ else
+ echo 'cheat.sh standalone installation not found; falling back to the "lite" mode'
+ fi
+ elif [ "$mode" = auto ] || [ "$mode" = lite ]; then
+ if [ "$mode" = "$CHTSH_MODE" ]; then
+ echo "The configured mode was \"$CHTSH_MODE\"; nothing changed"
+ else
+ mkdir -p "$CHTSH_HOME"
+ echo "$mode" > "$CHTSH_HOME/mode"
+ echo "Configured mode: $mode"
+ fi
+ else
+ echo "Unknown mode: $mode"
+ echo Supported modes:
+ echo " auto use the standalone installation first"
+ echo " lite use the cheat sheets server directly"
+ fi
+}
+
+get_query_options()
+{
+ local query="$*"
+ if [ -n "$CHTSH_QUERY_OPTIONS" ]; then
+ case $query in
+ *\?*) query="$query&${CHTSH_QUERY_OPTIONS}";;
+ *) query="$query?${CHTSH_QUERY_OPTIONS}";;
+ esac
+ fi
+ printf "%s" "$query"
+}
+
+do_query()
+{
+ local query="$*"
+ local b_opts=
+ local uri="${CHTSH_URL}/\"\$(get_query_options $query)\""
+
+ if [ -e "$CHTSH_HOME/id" ]; then
+ b_opts="-b \"\$CHTSH_HOME/id\""
+ fi
+
+ eval curl "$b_opts" -s "$uri" > "$TMP1"
+
+ if [ -z "$lines" ] || [ "$(wc -l "$TMP1" | awk '{print $1}')" -lt "$lines" ]; then
+ cat "$TMP1"
+ else
+ ${PAGER:-$defpager} "$TMP1"
+ fi
+}
+
+prepare_query()
+{
+ local section="$1"; shift
+ local input="$1"; shift
+ local arguments="$1"
+
+ local query
+ if [ -z "$section" ] || [ x"${input}" != x"${input#/}" ]; then
+ query=$(printf %s "$input" | sed 's@ @/@; s@ @+@g')
+ else
+ query=$(printf %s "$section/$input" | sed 's@ @+@g')
+ fi
+
+ [ -n "$arguments" ] && arguments="?$arguments"
+ printf %s "$query$arguments"
+}
+
+get_list_of_sections()
+{
+ curl -s "${CHTSH_URL}"/:list | grep -v '/.*/' | grep '/$' | xargs
+}
+
+gen_random_str()
+(
+ len=$1
+ if command -v openssl >/dev/null; then
+ openssl rand -base64 $((len*3/4)) | awk -v ORS='' //
+ else
+ rdev=/dev/urandom
+ for d in /dev/{srandom,random,arandom}; do
+ test -r "$d" && rdev=$d
+ done
+ if command -v hexdump >/dev/null; then
+ hexdump -vn $((len/2)) -e '1/1 "%02X" 1 ""' "$rdev"
+ elif command -v xxd >/dev/null; then
+ xxd -l $((len/2)) -ps "$rdev" | awk -v ORS='' //
+ else
+ cd /tmp || { echo Cannot cd into /tmp >&2; exit 1; }
+ s=
+ # shellcheck disable=SC2000
+ while [ "$(echo "$s" | wc -c)" -lt "$len" ]; do
+ s="$s$(mktemp -u XXXXXXXXXX)"
+ done
+ printf "%.${len}s" "$s"
+ fi
+ fi
+)
+
+if [ "$CHTSH_MODE" = auto ] && [ -d "$CHEATSH_INSTALLATION" ]; then
+ curl() {
+ # ignoring all options
+ # currently the standalone.py does not support them anyway
+ local opt
+ while getopts "b:s" opt; do
+ :
+ done
+ shift $((OPTIND - 1))
+
+ local url; url="$1"; shift
+ PYTHONIOENCODING=UTF-8 "$CHEATSH_INSTALLATION/ve/bin/python" "$CHEATSH_INSTALLATION/lib/standalone.py" "${url#"$CHTSH_URL"}" "$@"
+ }
+elif [ "$(uname -s)" = OpenBSD ] && [ -x /usr/bin/ftp ]; then
+ # any better test not involving either OS matching or actual query?
+ curl() {
+ local opt args="-o -"
+ while getopts "b:s" opt; do
+ case $opt in
+ b) args="$args -c $OPTARG";;
+ s) args="$args -M -V";;
+ *) echo "internal error: unsupported cURL option '$opt'" >&2; exit 1;;
+ esac
+ done
+ shift $((OPTIND - 1))
+ /usr/bin/ftp "$args" "$@"
+ }
+else
+ command -v curl >/dev/null || { echo 'DEPENDENCY: install "curl" to use cht.sh' >&2; exit 1; }
+ _CURL=$(command -v curl)
+ if [ x"$CHTSH_CURL_OPTIONS" != x ]; then
+ curl() {
+ $_CURL "${CHTSH_CURL_OPTIONS}" "$@"
+ }
+ fi
+fi
+
+if [ "$1" = --read ]; then
+ read -r a || a="exit"
+ printf "%s\n" "$a"
+ exit 0
+elif [ x"$1" = x--help ] || [ -z "$1" ]; then
+
+ n=${0##*/}
+ s=$(echo "$n" | sed "s/./ /"g)
+
+ cat <<EOF
+Usage:
+
+ $n [OPTIONS|QUERY]
+
+Options:
+
+ QUERY process QUERY and exit
+
+ --help show this help
+ --shell [LANG] shell mode (open LANG if specified)
+
+ --standalone-install [DIR|help]
+ install cheat.sh in the standalone mode
+ (by default, into ~/.cheat.sh/)
+
+ --mode [auto|lite] set (or display) mode of operation
+ * auto - prefer the local installation
+ * lite - use the cheat sheet server
+
+EOF
+ exit 0
+elif [ x"$1" = x--shell ]; then
+ shell_mode=yes
+ shift
+elif [ x"$1" = x--standalone-install ]; then
+ shift
+ cheatsh_standalone_install "$@"
+ exit "$?"
+elif [ x"$1" = x--mode ]; then
+ shift
+ chtsh_mode "$@"
+ exit "$?"
+fi
+
+prompt="cht.sh"
+opts=""
+input=""
+for o; do
+ if [ x"$o" != x"${o#-}" ]; then
+ opts="${opts}${o#-}"
+ else
+ input="$input $o"
+ fi
+done
+query=$(echo "$input" | sed 's@ *$@@; s@^ *@@; s@ @/@; s@ @+@g')
+
+if [ "$shell_mode" != yes ]; then
+ curl -s "${CHTSH_URL}"/"$(get_query_options "$query")"
+ exit 0
+else
+ new_section="$1"
+ valid_sections=$(get_list_of_sections)
+ valid=no; for q in $valid_sections; do [ "$q" = "$new_section/" ] && { valid=yes; break; }; done
+
+ if [ "$valid" = yes ]; then
+ section="$new_section"
+ # shellcheck disable=SC2001
+ this_query="$(echo "$input" | sed 's@ *[^ ]* *@@')"
+ this_prompt="\033[0;32mcht.sh/$section>\033[0m "
+ else
+ this_query="$input"
+ this_prompt="\033[0;32mcht.sh>\033[0m "
+ fi
+ if [ -n "$this_query" ] && [ -z "$CHEATSH_RESTART" ]; then
+ printf "$this_prompt$this_query\n"
+ curl -s "${CHTSH_URL}"/"$(get_query_options "$query")"
+ fi
+fi
+
+if [ "$is_macos" != yes ]; then
+ if [ "$XDG_SESSION_TYPE" = wayland ]; then
+ command -v wl-copy >/dev/null || echo 'DEPENDENCY: please install "wl-copy" for "copy"' >&2
+ else
+ command -v xclip >/dev/null || echo 'DEPENDENCY: please install "xclip" for "copy"' >&2
+ fi
+fi
+command -v rlwrap >/dev/null || { echo 'DEPENDENCY: install "rlwrap" to use cht.sh in the shell mode' >&2; exit 1; }
+
+mkdir -p "$CHTSH_HOME/"
+lines=$(tput lines)
+
+if command -v less >/dev/null; then
+ defpager="less -R"
+elif command -v more >/dev/null; then
+ defpager="more"
+else
+ defpager="cat"
+fi
+
+cmd_cd() {
+ if [ $# -eq 0 ]; then
+ section=""
+ else
+ new_section=$(echo "$input" | sed 's/cd *//; s@/*$@@; s@^/*@@')
+ if [ -z "$new_section" ] || [ ".." = "$new_section" ]; then
+ section=""
+ else
+ valid_sections=$(get_list_of_sections)
+ valid=no; for q in $valid_sections; do [ "$q" = "$new_section/" ] && { valid=yes; break; }; done
+ if [ "$valid" = no ]; then
+ echo "Invalid section: $new_section"
+ echo "Valid sections:"
+ echo "$valid_sections" \
+ | xargs printf "%-10s\n" \
+ | tr ' ' . \
+ | xargs -n 10 \
+ | sed 's/\./ /g; s/^/ /'
+ else
+ section="$new_section"
+ fi
+ fi
+ fi
+}
+
+cmd_copy() {
+ if [ -z "$DISPLAY" ]; then
+ echo copy: supported only in the Desktop version
+ elif [ -z "$input" ]; then
+ echo copy: Make at least one query first.
+ else
+ curl -s "${CHTSH_URL}"/"$(get_query_options "$query"?T)" > "$TMP1"
+ if [ "$is_macos" != yes ]; then
+ if [ "$XDG_SESSION_TYPE" = wayland ]; then
+ wl-copy < "$TMP1"
+ else
+ xclip -sel c -i < "$TMP1"
+ fi
+ else
+ pbcopy < "$TMP1"
+ fi
+ echo "copy: $(wc -l "$TMP1" | awk '{print $1}') lines copied to the selection"
+ fi
+}
+
+cmd_ccopy() {
+ if [ -z "$DISPLAY" ]; then
+ echo copy: supported only in the Desktop version
+ elif [ -z "$input" ]; then
+ echo copy: Make at least one query first.
+ else
+ curl -s "${CHTSH_URL}"/"$(get_query_options "$query"?TQ)" > "$TMP1"
+ if [ "$is_macos" != yes ]; then
+ if [ "$XDG_SESSION_TYPE" = wayland ]; then
+ wl-copy < "$TMP1"
+ else
+ xclip -sel c -i < "$TMP1"
+ fi
+ else
+ pbcopy < "$TMP1"
+ fi
+ echo "copy: $(wc -l "$TMP1" | awk '{print $1}') lines copied to the selection"
+ fi
+}
+
+cmd_exit() {
+ exit 0
+}
+
+cmd_help() {
+ cat <<EOF
+help - show this help
+hush - do not show the 'help' string at start anymore
+cd LANG - change the language context
+copy - copy the last answer in the clipboard (aliases: yank, y, c)
+ccopy - copy the last answer w/o comments (cut comments; aliases: cc, Y, C)
+exit - exit the cheat shell (aliases: quit, ^D)
+id [ID] - set/show an unique session id ("reset" to reset, "remove" to remove)
+stealth - stealth mode (automatic queries for selected text)
+update - self update (only if the scriptfile is writeable)
+version - show current cht.sh version
+/:help - service help
+QUERY - space separated query staring (examples are below)
+ cht.sh> python zip list
+ cht.sh/python> zip list
+ cht.sh/go> /python zip list
+EOF
+}
+
+cmd_hush() {
+ mkdir -p "$CHTSH_HOME/" && touch "$CHTSH_HOME/.hushlogin" && echo "Initial 'use help' message was disabled"
+}
+
+cmd_id() {
+ id_file="$CHTSH_HOME/id"
+
+ if [ id = "$input" ]; then
+ new_id=""
+ else
+ new_id=$(echo "$input" | sed 's/id *//; s/ *$//; s/ /+/g')
+ fi
+ if [ "$new_id" = remove ]; then
+ if [ -e "$id_file" ]; then
+ rm -f -- "$id_file" && echo "id is removed"
+ else
+ echo "id was not set, so you can't remove it"
+ fi
+ return
+ fi
+ if [ -n "$new_id" ] && [ reset != "$new_id" ] && [ "$(/bin/echo -n "$new_id" | wc -c)" -lt 16 ]; then
+ echo "ERROR: $new_id: Too short id. Minimal id length is 16. Use 'id reset' for a random id"
+ return
+ fi
+ if [ -z "$new_id" ]; then
+ # if new_id is not specified check if we have some id already
+ # if yes, just show it
+ # if not, generate a new id
+ if [ -e "$id_file" ]; then
+ awk '$6 == "id" {print $NF}' <"$id_file" | tail -n 1
+ return
+ else
+ new_id=reset
+ fi
+ fi
+ if [ "$new_id" = reset ]; then
+ new_id=$(gen_random_str 12)
+ else
+ echo WARNING: if someone gueses your id, he can read your cht.sh search history
+ fi
+ if [ -e "$id_file" ] && grep -q '\tid\t[^\t][^\t]*$' "$id_file" 2> /dev/null; then
+ sed -i 's/\tid\t[^\t][^\t]*$/ id '"$new_id"'/' "$id_file"
+ else
+ if ! [ -e "$id_file" ]; then
+ printf '#\n\n' > "$id_file"
+ fi
+ printf ".cht.sh\tTRUE\t/\tTRUE\t0\tid\t$new_id\n" >> "$id_file"
+ fi
+ echo "$new_id"
+}
+
+cmd_query() {
+ query=$(prepare_query "$section" "$input")
+ do_query "$query"
+}
+
+cmd_stealth() {
+ if [ "$input" != stealth ]; then
+ arguments=$(echo "$input" | sed 's/stealth //; s/ /\&/')
+ fi
+ trap break INT
+ if [ "$is_macos" = yes ]; then
+ past=$(pbpaste)
+ else
+ if [ "$XDG_SESSION_TYPE" = wayland ]; then
+ past=$(wl-paste -p)
+ else
+ past=$(xclip -sel c -o)
+ fi
+ fi
+ printf "\033[0;31mstealth:\033[0m you are in the stealth mode; select any text in any window for a query\n"
+ printf "\033[0;31mstealth:\033[0m selections longer than $STEALTH_MAX_SELECTION_LENGTH words are ignored\n"
+ if [ -n "$arguments" ]; then
+ printf "\033[0;31mstealth:\033[0m query arguments: ?$arguments\n"
+ fi
+ printf "\033[0;31mstealth:\033[0m use ^C to leave this mode\n"
+ while true; do
+ if [ "$is_macos" = yes ]; then
+ current=$(pbpaste)
+ else
+ if [ "$XDG_SESSION_TYPE" = wayland ]; then
+ current=$(wl-paste -p)
+ else
+ current=$(xclip -sel c -o)
+ fi
+ fi
+ if [ "$past" != "$current" ]; then
+ past=$current
+ current_text="$(echo $current | tr -c '[a-zA-Z0-9]' ' ')"
+ if [ "$(echo "$current_text" | wc -w)" -gt "$STEALTH_MAX_SELECTION_LENGTH" ]; then
+ printf "\033[0;31mstealth:\033[0m selection length is longer than $STEALTH_MAX_SELECTION_LENGTH words; ignoring\n"
+ continue
+ else
+ printf "\n\033[0;31mstealth: \033[7m $current_text\033[0m\n"
+ query=$(prepare_query "$section" "$current_text" "$arguments")
+ do_query "$query"
+ fi
+ fi
+ sleep 1;
+ done
+ trap - INT
+}
+
+cmd_update() {
+ [ -w "$0" ] || { echo "The script is readonly; please update manually: curl -s ${CHTSH_URL}/:cht.sh | sudo tee $0"; return; }
+ TMP2=$(mktemp /tmp/cht.sh.XXXXXXXXXXXXX)
+ curl -s "${CHTSH_URL}"/:cht.sh > "$TMP2"
+ if ! cmp "$0" "$TMP2" > /dev/null 2>&1; then
+ if grep -q ^__CHTSH_VERSION= "$TMP2"; then
+ # section was vaildated by us already
+ args=(--shell "$section")
+ cp "$TMP2" "$0" && echo "Updated. Restarting..." && rm "$TMP2" && CHEATSH_RESTART=1 exec "$0" "${args[@]}"
+ else
+ echo "Something went wrong. Please update manually"
+ fi
+ else
+ echo "cht.sh is up to date. No update needed"
+ fi
+ rm -f "$TMP2" > /dev/null 2>&1
+}
+
+cmd_version() {
+ insttime=$(ls -l -- "$0" | sed 's/ */ /g' | cut -d ' ' -f 6-8)
+ echo "cht.sh version $__CHTSH_VERSION of $__CHTSH_DATETIME; installed at: $insttime"
+ TMP2=$(mktemp /tmp/cht.sh.XXXXXXXXXXXXX)
+ if curl -s "${CHTSH_URL}"/:cht.sh > "$TMP2"; then
+ if ! cmp "$0" "$TMP2" > /dev/null 2>&1; then
+ echo "Update needed (type 'update' for that)".
+ else
+ echo "Up to date. No update needed"
+ fi
+ fi
+ rm -f "$TMP2" > /dev/null 2>&1
+}
+
+TMP1=$(mktemp /tmp/cht.sh.XXXXXXXXXXXXX)
+trap 'rm -f $TMP1 $TMP2' EXIT
+trap 'true' INT
+
+if ! [ -e "$CHTSH_HOME/.hushlogin" ] && [ -z "$this_query" ]; then
+ echo "type 'help' for the cht.sh shell help"
+fi
+
+while true; do
+ if [ "$section" != "" ]; then
+ full_prompt="$prompt/$section> "
+ else
+ full_prompt="$prompt> "
+ fi
+
+ input=$(
+ rlwrap -H "$CHTSH_HOME/history" -pgreen -C cht.sh -S "$full_prompt" bash "$0" --read | sed 's/ *#.*//'
+ )
+
+ cmd_name=${input%% *}
+ cmd_args=${input#* }
+ case $cmd_name in
+ "") continue;; # skip empty input lines
+ '?'|h|help) cmd_name=help;;
+ hush) cmd_name=hush;;
+ cd) cmd_name="cd";;
+ exit|quit) cmd_name="exit";;
+ copy|yank|c|y) cmd_name=copy;;
+ ccopy|cc|C|Y) cmd_name=ccopy;;
+ id) cmd_name=id;;
+ stealth) cmd_name=stealth;;
+ update) cmd_name=update;;
+ version) cmd_name=version;;
+ *) cmd_name="query"; cmd_args="$input";;
+ esac
+ "cmd_$cmd_name" $cmd_args
+done
diff --git a/bin/extra/colorscript b/bin/extra/colorscript
new file mode 100755
index 0000000..90dacb1
--- /dev/null
+++ b/bin/extra/colorscript
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+counter=0
+var1="$(seq 30 38)"
+var2="$(seq 39 47)"
+var3="$(seq 0 5) $(seq 7 9)"
+
+
+echo
+echo " ________________________________________________________"
+echo " |"
+echo -n " | "
+
+for j in $var2
+do
+ echo -ne "\e[0;37;${j}m ${j} \e[0m"
+done
+
+echo
+echo " |"
+echo -n " |"
+
+for j in $var1
+do
+ echo -n " $j "
+done
+
+echo
+echo -n " |________________________________________________________"
+
+for k in $var3
+do
+ echo
+ echo -n "$k| "
+ for i in $var1
+ do
+ echo -ne " \e[${k};${i}m[${i}]\e[0m "
+ done
+done
+echo
diff --git a/bin/extra/cycleKB b/bin/extra/cycleKB
new file mode 100755
index 0000000..5674786
--- /dev/null
+++ b/bin/extra/cycleKB
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+keyboards_file="/home/aluc/bin/keyboards.txt"
+cur_keyboard="$(setxkbmap -print | grep "xkb_symbols" | cut -f 2 -d "+")"
+# Get line number of match
+line="$(awk "/${cur_keyboard}/ {print NR}" "${keyboards_file}")"
+lines="$(wc -l "${keyboards_file}" | cut -f 1 -d ' ')"
+# cycle back to first line
+[[ "$line" == "$lines" ]] && line=1 || ((line++))
+new_keyboard="$(sed -n "${line}p" "${keyboards_file}")"
+setxkbmap "${new_keyboard}"
+dunstify "cycleKB" "keyboard: <b>${new_keyboard}</b>"
diff --git a/bin/extra/ehbtodl b/bin/extra/ehbtodl
new file mode 100755
index 0000000..39d8621
--- /dev/null
+++ b/bin/extra/ehbtodl
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+echo "$1" | sed 's/-H/\\\n\t&/g' | sed '/gzip/d' > /tmp/curlcommand.sh
+sh /tmp/curlcommand.sh > /tmp/ehbso.html
+vids="$(grep -oE "youtube\.com/embed/.{11}" /tmp/ehbso.html | cut -d'/' -f 3 | tr '\n' ' ')"
+for i in $vids
+do
+ echo "https://www.youtube.com/watch?v=$i"
+done > /tmp/todownload
+# yt-dlp -P "$HOME/Downloads/vids" -o "%(title)s" -a /tmp/todownload
diff --git a/bin/extra/keyboards.txt b/bin/extra/keyboards.txt
new file mode 100644
index 0000000..03ec74b
--- /dev/null
+++ b/bin/extra/keyboards.txt
@@ -0,0 +1,2 @@
+be
+us
diff --git a/bin/extra/vimastp b/bin/extra/vimastp
new file mode 100755
index 0000000..f4ae6b5
--- /dev/null
+++ b/bin/extra/vimastp
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+for var in name vcpus memory cdrom disk_size osinfo
+do
+ read -p "${var}:" "$var"
+done
+echo "virt-install --name=$name \
+--vcpus ${vcpus:-4} \
+--memory ${memory:-4096} \
+--cdrom ${cdrom} \
+--disk size=${disk_size-30},pool=VMs \
+--osinfo ${osinfo:-detect=on}\
+--boot cdrom,hd,network"