diff --git a/.config/firefox/larbs.js b/.config/firefox/larbs.js new file mode 100644 index 00000000..8328357e --- /dev/null +++ b/.config/firefox/larbs.js @@ -0,0 +1,47 @@ +// These are changes made on top of the Arkenfox JS file to tweak it as +// desired. Any of these settings can be overridden by the user. + +// Disable the Twitter/R*ddit/Faceberg ads in the URL bar: +user_pref("browser.urlbar.quicksuggest.enabled", false); +user_pref("browser.urlbar.suggest.topsites", false); // [FF78+] + +// Do not suggest web history in the URL bar: +user_pref("browser.urlbar.suggest.history", false); + +// Do not prefil forms: +user_pref("signon.prefillForms", false); + +// Do not autocomplete in the URL bar: +user_pref("browser.urlbar.autoFill", false); + +// Enable the addition of search keywords: +user_pref("keyword.enabled", true); + +// Allow access to http (i.e. not https) sites: +user_pref("dom.security.https_only_mode", false); + +// Keep cookies until expiration or user deletion: +user_pref("network.cookie.lifetimePolicy", 0); + +user_pref("dom.webnotifications.serviceworker.enabled", false); + +// Disable push notifications: +user_pref("dom.push.enabled", false); + +// Disable the pocket antifeature: +user_pref("extensions.pocket.enabled", false); + +// Don't autodelete cookies on shutdown: +user_pref("privacy.clearOnShutdown.cookies", false); + +// Enable custom userChrome.js: +user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); + +// This could otherwise cause some issues on bank logins and other annoying sites: +user_pref("network.http.referer.XOriginPolicy", 0); + +// Disable Firefox sync and its menu entries +user_pref("identity.fxaccounts.enabled", false); + +// Fix the issue where right mouse button instantly clicks +user_pref("ui.context_menus.after_mouseup", true); diff --git a/.config/fontconfig/fonts.conf b/.config/fontconfig/fonts.conf index be47e011..761ae00a 100755 --- a/.config/fontconfig/fonts.conf +++ b/.config/fontconfig/fonts.conf @@ -4,32 +4,36 @@ serif - Linux Libertine + Libertinus Serif Joy Pixels Noto Color Emoji + FontAwesome sans-serif - Linux Biolinum + Libertinus Sans Joy Pixels Noto Color Emoji + FontAwesome sans - Linux Biolinum + Libertinus Sans Joy Pixels Noto Color Emoji + FontAwesome monospace Noto Sans Mono - Liberation Mono + Libertinus Mono + FontAwesome Braille diff --git a/.config/lf/icons b/.config/lf/icons new file mode 100644 index 00000000..aad068ce --- /dev/null +++ b/.config/lf/icons @@ -0,0 +1,77 @@ +di ๐Ÿ“ +fi ๐Ÿ“ƒ +tw ๐Ÿค +ow ๐Ÿ“‚ +ln โ›“ +or โŒ +ex ๐ŸŽฏ +*.txt โœ +*.mom โœ +*.me โœ +*.ms โœ +*.avif ๐Ÿ–ผ +*.png ๐Ÿ–ผ +*.webp ๐Ÿ–ผ +*.ico ๐Ÿ–ผ +*.jpg ๐Ÿ“ธ +*.jpe ๐Ÿ“ธ +*.jpeg ๐Ÿ“ธ +*.gif ๐Ÿ–ผ +*.svg ๐Ÿ—บ +*.tif ๐Ÿ–ผ +*.tiff ๐Ÿ–ผ +*.xcf ๐Ÿ–Œ +*.html ๐ŸŒŽ +*.xml ๐Ÿ“ฐ +*.gpg ๐Ÿ”’ +*.css ๐ŸŽจ +*.pdf ๐Ÿ“š +*.djvu ๐Ÿ“š +*.epub ๐Ÿ“š +*.csv ๐Ÿ““ +*.xlsx ๐Ÿ““ +*.tex ๐Ÿ“œ +*.md ๐Ÿ“˜ +*.r ๐Ÿ“Š +*.R ๐Ÿ“Š +*.rmd ๐Ÿ“Š +*.Rmd ๐Ÿ“Š +*.m ๐Ÿ“Š +*.mp3 ๐ŸŽต +*.opus ๐ŸŽต +*.ogg ๐ŸŽต +*.m4a ๐ŸŽต +*.flac ๐ŸŽผ +*.wav ๐ŸŽผ +*.mkv ๐ŸŽฅ +*.mp4 ๐ŸŽฅ +*.webm ๐ŸŽฅ +*.mpeg ๐ŸŽฅ +*.avi ๐ŸŽฅ +*.mov ๐ŸŽฅ +*.mpg ๐ŸŽฅ +*.wmv ๐ŸŽฅ +*.m4b ๐ŸŽฅ +*.flv ๐ŸŽฅ +*.zip ๐Ÿ“ฆ +*.rar ๐Ÿ“ฆ +*.7z ๐Ÿ“ฆ +*.tar ๐Ÿ“ฆ +*.z64 ๐ŸŽฎ +*.v64 ๐ŸŽฎ +*.n64 ๐ŸŽฎ +*.gba ๐ŸŽฎ +*.nes ๐ŸŽฎ +*.gdi ๐ŸŽฎ +*.1 โ„น +*.nfo โ„น +*.info โ„น +*.log ๐Ÿ“™ +*.iso ๐Ÿ“€ +*.img ๐Ÿ“€ +*.bib ๐ŸŽ“ +*.ged ๐Ÿ‘ช +*.part ๐Ÿ’” +*.torrent ๐Ÿ”ฝ +*.jar โ™จ +*.java โ™จ diff --git a/.config/lf/lfrc b/.config/lf/lfrc index b9264821..e783d728 100644 --- a/.config/lf/lfrc +++ b/.config/lf/lfrc @@ -1,2 +1,168 @@ -set previewer ~/.config/lf/preview -set cleaner ~/.config/lf/cleaner +# Luke's lf settings + + +# Note on Image Previews +# For those wanting image previews, like this system, there are four steps to +# set it up. These are done automatically for LARBS users, but I will state +# them here for others doing it manually. +# +# 1. ueberzug must be installed. +# 2. The scope file (~/.config/lf/scope for me), must have a command similar to +# mine to generate ueberzug images. +# 3. A `set cleaner` line as below is a cleaner script. +# 4. lf should be started through a wrapper script (~/.local/bin/lfub for me) +# that creates the environment for ueberzug. This command can be be aliased +# in your shellrc (`alias lf="lfub") or if set to a binding, should be +# called directly instead of normal lf. + +# Basic vars +set shellopts '-eu' +set ifs "\n" +set scrolloff 10 +set icons +set period 1 +set hiddenfiles ".*:*.aux:*.log:*.bbl:*.bcf:*.blg:*.run.xml" +set cleaner '~/.config/lf/cleaner' +set previewer '~/.config/lf/scope' +set autoquit true + +# cmds/functions +cmd open ${{ + case $(file --mime-type "$(readlink -f $f)" -b) in + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet) localc $fx ;; + image/vnd.djvu|application/pdf|application/octet-stream|application/postscript) setsid -f zathura $fx >/dev/null 2>&1 ;; + text/*|application/json|inode/x-empty|application/x-subrip) $EDITOR $fx;; + image/x-xcf) setsid -f gimp $f >/dev/null 2>&1 ;; + image/svg+xml) display -- $f ;; + image/*) rotdir $f | grep -i "\.\(png\|jpg\|jpeg\|gif\|webp\|avif\|tif\|ico\)\(_large\)*$" | + setsid -f nsxiv -aio 2>/dev/null | while read -r file; do + [ -z "$file" ] && continue + lf -remote "send select \"$file\"" + lf -remote "send toggle" + done & + ;; + audio/*|video/x-ms-asf) mpv --audio-display=no $f ;; + video/*) setsid -f mpv $f -quiet >/dev/null 2>&1 ;; + application/pdf|application/vnd.djvu|application/epub*) setsid -f zathura $fx >/dev/null 2>&1 ;; + application/pgp-encrypted) $EDITOR $fx ;; + application/vnd.openxmlformats-officedocument.wordprocessingml.document|application/vnd.oasis.opendocument.text|application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|application/octet-stream|application/vnd.oasis.opendocument.spreadsheet|application/vnd.oasis.opendocument.spreadsheet-template|application/vnd.openxmlformats-officedocument.presentationml.presentation|application/vnd.oasis.opendocument.presentation-template|application/vnd.oasis.opendocument.presentation|application/vnd.ms-powerpoint|application/vnd.oasis.opendocument.graphics|application/vnd.oasis.opendocument.graphics-template|application/vnd.oasis.opendocument.formula|application/vnd.oasis.opendocument.database) setsid -f libreoffice $fx >/dev/null 2>&1 ;; + *) for f in $fx; do setsid -f $OPENER $f >/dev/null 2>&1; done;; + esac +}} + +cmd mkdir $mkdir -p "$@" + +cmd extract ${{ + clear; tput cup $(($(tput lines)/3)); tput bold + set -f + printf "%s\n\t" "$fx" + printf "extract?[y/N]" + read ans + [ $ans = "y" ] && { + case $fx in + *.tar.bz2) tar xjf $fx ;; + *.tar.gz) tar xzf $fx ;; + *.bz2) bunzip2 $fx ;; + *.rar) unrar e $fx ;; + *.gz) gunzip $fx ;; + *.tar) tar xf $fx ;; + *.tbz2) tar xjf $fx ;; + *.tgz) tar xzf $fx ;; + *.zip) unzip $fx ;; + *.Z) uncompress $fx ;; + *.7z) 7z x $fx ;; + *.tar.xz) tar xf $fx ;; + esac + } +}} + +cmd delete ${{ + clear; tput cup $(($(tput lines)/3)); tput bold + set -f + printf "%s\n\t" "$fx" + printf "delete?[y/N]" + read ans + [ $ans = "y" ] && rm -rf -- $fx +}} + +cmd moveto ${{ + clear; tput cup $(($(tput lines)/3)); tput bold + set -f + clear; echo "Move to where?" + dest="$(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf | sed 's|~|$HOME|')" && + for x in $fx; do + eval mv -iv \"$x\" \"$dest\" + done && + notify-send "๐Ÿšš File(s) moved." "File(s) moved to $dest." +}} + +cmd copyto ${{ + clear; tput cup $(($(tput lines)/3)); tput bold + set -f + clear; echo "Copy to where?" + dest="$(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf | sed 's|~|$HOME|')" && + for x in $fx; do + eval cp -ivr \"$x\" \"$dest\" + done && + notify-send "๐Ÿ“‹ File(s) copied." "File(s) copies to $dest." +}} + +cmd setbg "$1" + +cmd bulkrename ${{ + tmpfile_old="$(mktemp)" + tmpfile_new="$(mktemp)" + + [ -n "$fs" ] && fs=$(basename -a $fs) || fs=$(ls) + + echo "$fs" > "$tmpfile_old" + echo "$fs" > "$tmpfile_new" + $EDITOR "$tmpfile_new" + + [ "$(wc -l < "$tmpfile_old")" -eq "$(wc -l < "$tmpfile_new")" ] || { rm -f "$tmpfile_old" "$tmpfile_new"; exit 1; } + + paste "$tmpfile_old" "$tmpfile_new" | while IFS="$(printf '\t')" read -r src dst + do + [ "$src" = "$dst" ] || [ -e "$dst" ] || mv -- "$src" "$dst" + done + + rm -f "$tmpfile_old" "$tmpfile_new" + lf -remote "send $id unselect" +}} + +# Bindings +map $lf -remote "send $id select \"$(fzf)\"" +map J $lf -remote "send $id cd $(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf)" +map gh +map g top +map D delete +map E extract +map C copyto +map M moveto +map push :mkdir"" +map reload +map set hidden! +map shell +map x $$f +map X !$f +map o &mimeopen "$f" +map O $mimeopen --ask "$f" + +map A :rename; cmd-end # at the very end +map c push A # new rename +map I :rename; cmd-home # at the very beginning +map i :rename # before extension +map a :rename; cmd-right # after extension +map B bulkrename +map b $setbg $f + +map down +map up +map V push :!nvim + +map W $setsid -f $TERMINAL >/dev/null 2>&1 + +map Y $printf "%s" "$fx" | xclip -selection clipboard + +# Source Bookmarks +source "~/.config/lf/shortcutrc" diff --git a/.config/lf/scope b/.config/lf/scope index 180c2947..8265a879 100755 --- a/.config/lf/scope +++ b/.config/lf/scope @@ -13,20 +13,27 @@ image() { fi } -ifub() { - [ -n "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && command -V ueberzug >/dev/null 2>&1 -} - # Note that the cache file name is a function of file information, meaning if # an image appears in multiple places across the machine, it will not have to # be regenerated once seen. case "$(file --dereference --brief --mime-type -- "$1")" in + image/avif) CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" + [ ! -f "$CACHE" ] && convert "$1" "$CACHE.jpg" + image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" ;; + image/vnd.djvu) + CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" + [ ! -f "$CACHE" ] && djvused "$1" -e 'select 1; save-page-with /dev/stdout' | convert -density 200 - "$CACHE.jpg" > /dev/null 2>&1 + image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" ;; +image/svg+xml) + CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" + [ ! -f "$CACHE" ] && inkscape --convert-dpi-method=none -o "$CACHE.png" --export-overwrite -D --export-png-color-mode=RGBA_16 "$1" + image "$CACHE.png" "$2" "$3" "$4" "$5" "$1" + ;; image/*) image "$1" "$2" "$3" "$4" "$5" "$1" ;; text/html) lynx -width="$4" -display_charset=utf-8 -dump "$1" ;; text/troff) man ./ "$1" | col -b ;; - text/* | */xml | application/json) bat --terminal-width "$(($4-2))" -f "$1" ;; - application/zip) atool --list -- "$1" ;; + text/* | */xml | application/json | application/x-ndjson) bat -p --theme ansi --terminal-width "$(($4-2))" -f "$1" ;; audio/* | application/octet-stream) mediainfo "$1" || exit 1 ;; video/* ) CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" @@ -38,6 +45,12 @@ case "$(file --dereference --brief --mime-type -- "$1")" in [ ! -f "$CACHE.jpg" ] && pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE" image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" ;; + */epub+zip|*/mobi*) + CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" + [ ! -f "$CACHE.jpg" ] && gnome-epub-thumbnailer "$1" "$CACHE.jpg" + image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" + ;; + application/*zip) atool --list -- "$1" ;; *opendocument*) odt2txt "$1" ;; application/pgp-encrypted) gpg -d -- "$1" ;; esac diff --git a/.config/mimeapps.list b/.config/mimeapps.list new file mode 100644 index 00000000..9124fcec --- /dev/null +++ b/.config/mimeapps.list @@ -0,0 +1,20 @@ +[Default Applications] + +# xdg-open will use these settings to determine how to open filetypes. +# These .desktop entries can also be seen and changed in ~/.local/share/applications/ + +text/x-shellscript=text.desktop; +x-scheme-handler/magnet=torrent.desktop; +application/x-bittorrent=torrent.desktop; +x-scheme-handler/mailto=mail.desktop; +text/plain=text.desktop; +application/postscript=pdf.desktop; +application/pdf=pdf.desktop; +image/png=img.desktop; +image/jpeg=img.desktop; +image/gif=img.desktop; +application/rss+xml=rss.desktop +video/x-matroska=video.desktop +video/mp4=video.desktop +x-scheme-handler/lbry=lbry.desktop +inode/directory=file.desktop diff --git a/.config/ncmpcpp/config b/.config/ncmpcpp/config index 36324960..1e2a8b02 100644 --- a/.config/ncmpcpp/config +++ b/.config/ncmpcpp/config @@ -30,3 +30,5 @@ progressbar_color = black:b progressbar_elapsed_color = blue:b statusbar_color = red statusbar_time_color = cyan:b +execute_on_song_change="pkill -RTMIN+11 dwmblocks" +execute_on_player_state_change="pkill -RTMIN+11 dwmblocks" diff --git a/.config/newsboat/config b/.config/newsboat/config index b7a78dae..d8dbecd5 100644 --- a/.config/newsboat/config +++ b/.config/newsboat/config @@ -32,7 +32,7 @@ color article white default bold browser linkhandler macro , open-in-browser macro t set browser "qndl" ; open-in-browser ; set browser linkhandler -macro a set browser "tsp yt-dlp --embed-metadata -xic -f bestaudio/best" ; open-in-browser ; set browser linkhandler +macro a set browser "tsp yt-dlp --embed-metadata -xic -f bestaudio/best --restrict-filenames" ; open-in-browser ; set browser linkhandler macro v set browser "setsid -f mpv" ; open-in-browser ; set browser linkhandler macro w set browser "lynx" ; open-in-browser ; set browser linkhandler macro d set browser "dmenuhandler" ; open-in-browser ; set browser linkhandler diff --git a/.config/newsboat/urls b/.config/newsboat/urls index ad1d119a..497e4946 100644 --- a/.config/newsboat/urls +++ b/.config/newsboat/urls @@ -1,7 +1,10 @@ https://lukesmith.xyz/rss.xml -https://notrelated.xyz/rss +https://videos.lukesmith.xyz/feeds/videos.xml?videoChannelId=2 "~Luke Smith (Videos)" https://www.youtube.com/feeds/videos.xml?channel_id=UC2eYFnH61tmytImy1mTYvhA "~Luke Smith (YouTube)" +https://lindypress.net/rss +https://notrelated.xyz/rss https://landchad.net/rss.xml https://based.cooking/index.xml https://artixlinux.org/feed.php "tech" https://www.archlinux.org/feeds/news/ "tech" +https://github.com/LukeSmithxyz/voidrice/commits/master.atom "~LARBS dotfiles" diff --git a/.config/sxiv/exec/key-handler b/.config/nsxiv/exec/key-handler similarity index 68% rename from .config/sxiv/exec/key-handler rename to .config/nsxiv/exec/key-handler index f3dd7dca..4c78f18b 100755 --- a/.config/sxiv/exec/key-handler +++ b/.config/nsxiv/exec/key-handler @@ -4,12 +4,12 @@ do case "$1" in "w") setbg "$file" & ;; "c") - [ -z "$destdir" ] && destdir="$(sed "s/\s.*#.*$//;/^\s*$/d" ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | awk '{print $2}' | dmenu -l 20 -i -p "Copy file(s) to where?" | sed "s|~|$HOME|g")" + [ -z "$destdir" ] && destdir="$(sed "s/#.*$//;/^\s*$/d" ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | awk '{print $2}' | dmenu -l 20 -i -p "Copy file(s) to where?" | sed "s|~|$HOME|g")" [ ! -d "$destdir" ] && notify-send "$destdir is not a directory, cancelled." && exit cp "$file" "$destdir" && notify-send -i "$(readlink -f "$file")" "$file copied to $destdir." & ;; "m") - [ -z "$destdir" ] && destdir="$(sed "s/\s.*#.*$//;/^\s*$/d" ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | awk '{print $2}' | dmenu -l 20 -i -p "Move file(s) to where?" | sed "s|~|$HOME|g")" + [ -z "$destdir" ] && destdir="$(sed "s/#.*$//;/^\s*$/d" ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | awk '{print $2}' | dmenu -l 20 -i -p "Move file(s) to where?" | sed "s|~|$HOME|g")" [ ! -d "$destdir" ] && notify-send "$destdir is not a directory, cancelled." && exit mv "$file" "$destdir" && notify-send -i "$(readlink -f "$file")" "$file moved to $destdir." & ;; @@ -28,6 +28,6 @@ do "d") [ "$(printf "No\\nYes" | dmenu -i -p "Really delete $file?")" = "Yes" ] && rm "$file" && notify-send "$file deleted." ;; "g") ifinstalled gimp && setsid -f gimp "$file" ;; - "i") notify-send "File information" "$(mediainfo "$file")" ;; + "i") notify-send "File information" "$(mediainfo "$file" | sed "s/[ ]\+:/:/g;s/: /: /;s/$/<\/b>/" | grep "")" ;; esac done diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim index 5ccee981..88c222f7 100644 --- a/.config/nvim/init.vim +++ b/.config/nvim/init.vim @@ -8,13 +8,15 @@ if ! filereadable(system('echo -n "${XDG_CONFIG_HOME:-$HOME/.config}/nvim/autolo autocmd VimEnter * PlugInstall endif +map ,, :keepp /<++>ca< +imap ,, :keepp /<++>ca< + call plug#begin(system('echo -n "${XDG_CONFIG_HOME:-$HOME/.config}/nvim/plugged"')) Plug 'tpope/vim-surround' Plug 'windwp/nvim-autopairs' Plug 'preservim/nerdtree' Plug 'junegunn/goyo.vim' Plug 'jreybert/vimagit' -Plug 'lukesmithxyz/vimling' Plug 'vimwiki/vimwiki' Plug 'itchyny/lightline.vim' Plug 'tpope/vim-commentary' @@ -224,11 +226,19 @@ EOF endif " vimling: - nm d :call ToggleDeadKeys() - imap d :call ToggleDeadKeys()a - nm i :call ToggleIPA() - imap i :call ToggleIPA()a - nm q :call ToggleProse() + nm d :call ToggleDeadKeys() + imap d :call ToggleDeadKeys()a + nm i :call ToggleIPA() + imap i :call ToggleIPA()a + nm q :call ToggleProse() + +" vim-airline + if !exists('g:airline_symbols') + let g:airline_symbols = {} + endif + let g:airline_symbols.colnr = ' C:' + let g:airline_symbols.linenr = ' L:' + let g:airline_symbols.maxlinenr = 'โ˜ฐ ' " Shortcutting split navigation, saving a keypress: map h @@ -250,10 +260,10 @@ EOF nnoremap S :%s//g " Compile document, be it groff/LaTeX/markdown/etc. - map c :w! \| !compiler "%" + map c :w! \| !compiler "%:p" " Open corresponding .pdf/.html or preview - map p :!opout % + map p :!opout "%:p" " Runs a script that cleans out tex build files whenever I close out of a .tex file. autocmd VimLeave *.tex !texclear % @@ -267,7 +277,7 @@ EOF autocmd BufRead,BufNewFile *.tex set filetype=tex " Save file as sudo on files that require root permission - cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' edit! + cabbrev w!! execute 'silent! write !sudo tee % >/dev/null' edit! " Enable Goyo by default for mutt writing autocmd BufRead,BufNewFile /tmp/neomutt* let g:goyo_width=80 @@ -279,7 +289,8 @@ EOF autocmd BufWritePre * let currPos = getpos(".") autocmd BufWritePre * %s/\s\+$//e autocmd BufWritePre * %s/\n\+\%$//e - autocmd BufWritePre *.[ch] %s/\%$/\r/e + autocmd BufWritePre *.[ch] %s/\%$/\r/e " add trailing newline for ANSI C standard + autocmd BufWritePre *neomutt* %s/^--$/-- /e " dash-dash-space signature delimiter in emails autocmd BufWritePre * cal cursor(currPos[1], currPos[2]) " When shortcut files are updated, renew bash and ranger configs with new material: @@ -312,3 +323,8 @@ function! ToggleHiddenAll() endif endfunction nnoremap h :call ToggleHiddenAll() +" Load command shortcuts generated from bm-dirs and bm-files via shortcuts script. +" Here leader is ";". +" So ":vs ;cfz" will expand into ":vs /home//.config/zsh/.zshrc" +" if typed fast without the timeout. +silent! source ~/.config/nvim/shortcuts.vim diff --git a/.config/python/pythonrc b/.config/python/pythonrc new file mode 100644 index 00000000..b32e6b6f --- /dev/null +++ b/.config/python/pythonrc @@ -0,0 +1,2 @@ +import readline +readline.write_history_file = lambda *args: None diff --git a/.config/shell/aliasrc b/.config/shell/aliasrc index 0cea1c51..10a256b9 100644 --- a/.config/shell/aliasrc +++ b/.config/shell/aliasrc @@ -9,20 +9,29 @@ # Use $XINITRC variable if file exists. [ -f "$XINITRC" ] && alias startx="startx $XINITRC" +[ -f "$MBSYNCRC" ] && alias mbsync="mbsync -c $MBSYNCRC" + # sudo not required for some system commands for command in mount umount sv pacman updatedb su shutdown poweroff reboot ; do alias $command="sudo $command" done; unset command +se() { + choice="$(find ~/.local/bin -mindepth 1 -printf '%P\n' | fzf)" + [ -f "$HOME/.local/bin/$choice" ] && $EDITOR "$HOME/.local/bin/$choice" + ;} + # Verbosity and settings that you pretty much just always are going to want. alias \ cp="cp -iv" \ mv="mv -iv" \ rm="rm -vI" \ bc="bc -ql" \ + rsync="rsync -vrPlu" \ mkd="mkdir -pv" \ yt="yt-dlp --embed-metadata -i" \ yta="yt -x -f bestaudio/best" \ + ytt="yt --skip-download --write-thumbnail" \ ffmpeg="ffmpeg -hide_banner" # Colorize commands when possible. @@ -52,4 +61,4 @@ alias \ lf="lfub" \ magit="nvim -c MagitOnly" \ ref="shortcuts >/dev/null; source ${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc ; source ${XDG_CONFIG_HOME:-$HOME/.config}/shell/zshnameddirrc" \ - weath="less -S ${XDG_DATA_HOME:-$HOME/.local/share}/weatherreport" \ + weath="less -S ${XDG_CACHE_HOME:-$HOME/.cache}/weatherreport" \ diff --git a/.config/shell/bm-files b/.config/shell/bm-files index 7acbb666..2e8864b1 100644 --- a/.config/shell/bm-files +++ b/.config/shell/bm-files @@ -20,4 +20,4 @@ cfmb ${XDG_CONFIG_HOME:-$HOME/.config}/ncmpcpp/bindings # ncmpcpp (music player) cfmc ${XDG_CONFIG_HOME:-$HOME/.config}/ncmpcpp/config # ncmpcpp (music player) config cfl ${XDG_CONFIG_HOME:-$HOME/.config}/lf/lfrc # lf (file browser) config cfL ${XDG_CONFIG_HOME:-$HOME/.config}/lf/scope # lf's scope/preview file -cfX ${XDG_CONFIG_HOME:-$HOME/.config}/sxiv/exec/key-handler # sxiv (image viewer) key/script handler +cfX ${XDG_CONFIG_HOME:-$HOME/.config}/nsxiv/exec/key-handler # nsxiv (image viewer) key/script handler diff --git a/.config/shell/profile b/.config/shell/profile index e40e01ec..4ba5ae45 100644 --- a/.config/shell/profile +++ b/.config/shell/profile @@ -1,9 +1,10 @@ -#!/bin/zsh +#!/bin/sh +# shellcheck disable=SC2155 -# profile file. Runs on login. Environmental variables are set here. +# Profile file, runs on login. Environmental variables are set here. -# If you don't plan on reverting to bash, you can remove the link in ~/.profile -# to clean up. +# Add all directories in `~/.local/bin` to $PATH +export PATH="$PATH:$(find ~/.local/bin -type d | paste -sd ':' -)" # Adds `~/.local/bin` to $PATH export PATH="$PATH:${$(find ~/.local/bin -type d -printf %p:)%%:}" @@ -12,48 +13,53 @@ export PATH="$PATH:${$(find ~/.local/share/cargo/bin -type d -printf %p:)%%:}" # Adds `/usr/bin/vendor_perl` to $PATH export PATH="$PATH:${$(find /usr/bin/vendor_perl -type d -printf %p:)%%:}" -unsetopt PROMPT_SP +unsetopt PROMPT_SP 2>/dev/null # Default programs: export EDITOR="nvim" export TERMINAL="kitty" +export TERMINAL_PROG="kitty" export BROWSER="firefox" export READER="zathura" export FILE="lf" +# Change the default crypto/weather monitor sites. +# export CRYPTOURL="rate.sx" +# export WTTRURL="wttr.in" + # ~/ Clean-up: export XDG_CONFIG_HOME="$HOME/.config" export XDG_DATA_HOME="$HOME/.local/share" export XDG_CACHE_HOME="$HOME/.cache" -export XINITRC="${XDG_CONFIG_HOME:-$HOME/.config}/x11/xinitrc" +export XINITRC="$XDG_CONFIG_HOME/x11/xinitrc" #export XAUTHORITY="$XDG_RUNTIME_DIR/Xauthority" # This line will break some DMs. -export NOTMUCH_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/notmuch-config" -export GTK2_RC_FILES="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-2.0/gtkrc-2.0" -export LESSHISTFILE="-" -export WGETRC="${XDG_CONFIG_HOME:-$HOME/.config}/wget/wgetrc" -export INPUTRC="${XDG_CONFIG_HOME:-$HOME/.config}/shell/inputrc" -export ZDOTDIR="${XDG_CONFIG_HOME:-$HOME/.config}/zsh" -#export ALSA_CONFIG_PATH="$XDG_CONFIG_HOME/alsa/asoundrc" -#export GNUPGHOME="${XDG_DATA_HOME:-$HOME/.local/share}/gnupg" -export WINEPREFIX="${XDG_DATA_HOME:-$HOME/.local/share}/wineprefixes/default" -export KODI_DATA="${XDG_DATA_HOME:-$HOME/.local/share}/kodi" -export PASSWORD_STORE_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/password-store" +export NOTMUCH_CONFIG="$XDG_CONFIG_HOME/notmuch-config" +export GTK2_RC_FILES="$XDG_CONFIG_HOME/gtk-2.0/gtkrc-2.0" +export WGETRC="$XDG_CONFIG_HOME/wget/wgetrc" +export INPUTRC="$XDG_CONFIG_HOME/shell/inputrc" +export ZDOTDIR="$XDG_CONFIG_HOME/zsh" +#export GNUPGHOME="$XDG_DATA_HOME/gnupg" +export WINEPREFIX="$XDG_DATA_HOME/wineprefixes/default" +export KODI_DATA="$XDG_DATA_HOME/kodi" +export PASSWORD_STORE_DIR="$XDG_DATA_HOME/password-store" export TMUX_TMPDIR="$XDG_RUNTIME_DIR" -export ANDROID_SDK_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/android" -export CARGO_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/cargo" -export GOPATH="${XDG_DATA_HOME:-$HOME/.local/share}/go" -export ANSIBLE_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/ansible/ansible.cfg" -export UNISON="${XDG_DATA_HOME:-$HOME/.local/share}/unison" -export HISTFILE="${XDG_DATA_HOME:-$HOME/.local/share}/history" -export WEECHAT_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/weechat" -export MBSYNCRC="${XDG_CONFIG_HOME:-$HOME/.config}/mbsync/config" -export ELECTRUMDIR="${XDG_DATA_HOME:-$HOME/.local/share}/electrum" +export ANDROID_SDK_HOME="$XDG_CONFIG_HOME/android" +export CARGO_HOME="$XDG_DATA_HOME/cargo" +export GOPATH="$XDG_DATA_HOME/go" +export GOMODCACHE="$XDG_CACHE_HOME/go/mod" +export ANSIBLE_CONFIG="$XDG_CONFIG_HOME/ansible/ansible.cfg" +export UNISON="$XDG_DATA_HOME/unison" +export HISTFILE="$XDG_DATA_HOME/history" +export MBSYNCRC="$XDG_CONFIG_HOME/mbsync/config" +export ELECTRUMDIR="$XDG_DATA_HOME/electrum" +export PYTHONSTARTUP="$XDG_CONFIG_HOME/python/pythonrc" +export SQLITE_HISTORY="$XDG_DATA_HOME/sqlite_history" # Other program settings: export DICS="/usr/share/stardict/dic/" export SUDO_ASKPASS="$HOME/.local/bin/dmenupass" export FZF_DEFAULT_OPTS="--layout=reverse --height 40%" -export LESS=-R +export LESS="R" export LESS_TERMCAP_mb="$(printf '%b' '')" export LESS_TERMCAP_md="$(printf '%b' '')" export LESS_TERMCAP_me="$(printf '%b' '')" @@ -62,101 +68,15 @@ export LESS_TERMCAP_se="$(printf '%b' '')" export LESS_TERMCAP_us="$(printf '%b' '')" export LESS_TERMCAP_ue="$(printf '%b' '')" export LESSOPEN="| /usr/bin/highlight -O ansi %s 2>/dev/null" -export QT_QPA_PLATFORMTHEME="gtk2" # Have QT use gtk2 theme. -export MOZ_USE_XINPUT2="1" # Mozilla smooth scrolling/touchpads. -export AWT_TOOLKIT="MToolkit wmname LG3D" #May have to install wmname -export _JAVA_AWT_WM_NONREPARENTING=1 # Fix for Java applications in dwm +export QT_QPA_PLATFORMTHEME="gtk2" # Have QT use gtk2 theme. +export MOZ_USE_XINPUT2=1 # Mozilla smooth scrolling/touchpads. +export AWT_TOOLKIT="MToolkit wmname LG3D" # May have to install wmname +export _JAVA_AWT_WM_NONREPARENTING=1 # Fix for Java applications in dwm -# This is the list for lf icons: -export LF_ICONS="di=๐Ÿ“:\ -fi=๐Ÿ“ƒ:\ -tw=๐Ÿค:\ -ow=๐Ÿ“‚:\ -ln=โ›“:\ -or=โŒ:\ -ex=๐ŸŽฏ:\ -*.txt=โœ:\ -*.mom=โœ:\ -*.me=โœ:\ -*.ms=โœ:\ -*.png=๐Ÿ–ผ:\ -*.webp=๐Ÿ–ผ:\ -*.ico=๐Ÿ–ผ:\ -*.jpg=๐Ÿ“ธ:\ -*.jpe=๐Ÿ“ธ:\ -*.jpeg=๐Ÿ“ธ:\ -*.gif=๐Ÿ–ผ:\ -*.svg=๐Ÿ—บ:\ -*.tif=๐Ÿ–ผ:\ -*.tiff=๐Ÿ–ผ:\ -*.xcf=๐Ÿ–Œ:\ -*.html=๐ŸŒŽ:\ -*.xml=๐Ÿ“ฐ:\ -*.gpg=๐Ÿ”’:\ -*.css=๐ŸŽจ:\ -*.pdf=๐Ÿ“š:\ -*.djvu=๐Ÿ“š:\ -*.epub=๐Ÿ“š:\ -*.csv=๐Ÿ““:\ -*.xlsx=๐Ÿ““:\ -*.tex=๐Ÿ“œ:\ -*.md=๐Ÿ“˜:\ -*.r=๐Ÿ“Š:\ -*.R=๐Ÿ“Š:\ -*.rmd=๐Ÿ“Š:\ -*.Rmd=๐Ÿ“Š:\ -*.m=๐Ÿ“Š:\ -*.mp3=๐ŸŽต:\ -*.opus=๐ŸŽต:\ -*.ogg=๐ŸŽต:\ -*.m4a=๐ŸŽต:\ -*.flac=๐ŸŽผ:\ -*.wav=๐ŸŽผ:\ -*.mkv=๐ŸŽฅ:\ -*.mp4=๐ŸŽฅ:\ -*.webm=๐ŸŽฅ:\ -*.mpeg=๐ŸŽฅ:\ -*.avi=๐ŸŽฅ:\ -*.mov=๐ŸŽฅ:\ -*.mpg=๐ŸŽฅ:\ -*.wmv=๐ŸŽฅ:\ -*.m4b=๐ŸŽฅ:\ -*.flv=๐ŸŽฅ:\ -*.zip=๐Ÿ“ฆ:\ -*.rar=๐Ÿ“ฆ:\ -*.7z=๐Ÿ“ฆ:\ -*.tar.gz=๐Ÿ“ฆ:\ -*.z64=๐ŸŽฎ:\ -*.v64=๐ŸŽฎ:\ -*.n64=๐ŸŽฎ:\ -*.gba=๐ŸŽฎ:\ -*.nes=๐ŸŽฎ:\ -*.gdi=๐ŸŽฎ:\ -*.1=โ„น:\ -*.nfo=โ„น:\ -*.info=โ„น:\ -*.log=๐Ÿ“™:\ -*.iso=๐Ÿ“€:\ -*.img=๐Ÿ“€:\ -*.bib=๐ŸŽ“:\ -*.ged=๐Ÿ‘ช:\ -*.part=๐Ÿ’”:\ -*.torrent=๐Ÿ”ฝ:\ -*.jar=โ™จ:\ -*.java=โ™จ:\ -" +[ ! -f "$XDG_CONFIG_HOME/shell/shortcutrc" ] && setsid -f shortcuts >/dev/null 2>&1 -[ ! -f ${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc ] && shortcuts >/dev/null 2>&1 & - -if pacman -Qs libxft-bgra >/dev/null 2>&1; then - # Start graphical server on user's current tty if not already running. - [ "$(tty)" = "/dev/tty1" ] && ! pidof -s Xorg >/dev/null 2>&1 && exec startx "$XINITRC" -else - echo "\033[31mIMPORTANT\033[0m: Note that \033[32m\`libxft-bgra\`\033[0m must be installed for this build of dwm. -Please run: - \033[32myay -S libxft-bgra-git\033[0m -and replace \`libxft\`. Afterwards, you may start the graphical server by running \`startx\`." -fi +# Start graphical server on user's current tty if not already running. +[ "$(tty)" = "/dev/tty1" ] && ! pidof -s Xorg >/dev/null 2>&1 && exec startx "$XINITRC" # Switch escape and caps if tty and no passwd required: -sudo -n loadkeys ${XDG_DATA_HOME:-$HOME/.local/share}/larbs/ttymaps.kmap 2>/dev/null +sudo -n loadkeys "$XDG_DATA_HOME/larbs/ttymaps.kmap" 2>/dev/null diff --git a/.config/sxiv b/.config/sxiv new file mode 120000 index 00000000..42529649 --- /dev/null +++ b/.config/sxiv @@ -0,0 +1 @@ +nsxiv \ No newline at end of file diff --git a/.config/wal/templates/zathurarc b/.config/wal/templates/zathurarc index a12bbd3c..8f0b16fa 100644 --- a/.config/wal/templates/zathurarc +++ b/.config/wal/templates/zathurarc @@ -12,6 +12,7 @@ map K zoom in map J zoom out map i recolor map p print +map g goto top set default-bg "{background}" set default-fg "{foreground}" diff --git a/.config/x11/xinitrc b/.config/x11/xinitrc index 2debc017..b183f251 100755 --- a/.config/x11/xinitrc +++ b/.config/x11/xinitrc @@ -13,5 +13,6 @@ if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/x11/xprofile" ]; then else . "$HOME/.xprofile" fi - -ssh-agent dwm +# Activate dbus variables +dbus-update-activation-environment --all +dbus-launch ssh-agent dwm diff --git a/.config/x11/xprofile b/.config/x11/xprofile index 21f87421..c1b5e6dd 100755 --- a/.config/x11/xprofile +++ b/.config/x11/xprofile @@ -8,12 +8,11 @@ if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/x11/xrandr" ]; then fi setbg & # set the background with the `setbg` script #xrdb ${XDG_CONFIG_HOME:-$HOME/.config}/x11/xresources & # Uncomment to use Xresources colors/settings on startup -remaps & # run the remaps script, switching caps/esc and more; check it for more info -autostart="mpd xcompmgr dunst unclutter" +autostart="mpd xcompmgr dunst unclutter remapd" for program in $autostart; do - pidof -s "$program" || "$program" & + pidof -sx "$program" || "$program" & done >/dev/null 2>&1 # Ensure that xrdb has finished running before moving on to start the WM/DE. diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc index 461e9648..763cc16d 100644 --- a/.config/zsh/.zshrc +++ b/.config/zsh/.zshrc @@ -29,6 +29,18 @@ plugins=(git colored-man-pages) source $ZSH/oh-my-zsh.sh +# Use lf to switch directories and bind it to ctrl-o +lfcd () { + tmp="$(mktemp -uq)" + trap 'rm -f $tmp >/dev/null 2>&1 && trap - HUP INT QUIT TERM PWR EXIT' HUP INT QUIT TERM PWR EXIT + lf -last-dir-path="$tmp" "$@" + if [ -f "$tmp" ]; then + dir="$(cat "$tmp")" + [ -d "$dir" ] && [ "$dir" != "$(pwd)" ] && cd "$dir" + fi +} +bindkey -s '^o' '^ulfcd\n' + _comp_options+=(globdots) motdmaker && cat ~/.cache/motd diff --git a/.local/bin/arkenfox-auto-update b/.local/bin/arkenfox-auto-update new file mode 100755 index 00000000..7664a4fc --- /dev/null +++ b/.local/bin/arkenfox-auto-update @@ -0,0 +1,23 @@ +#!/bin/sh + +# A wrapper for the arkenfox-updater that runs it on all pre-existing Arkenfox +# user.js files on the machine. + +# On installation of LARBS, this file is copied to /usr/local/lib/ where it is +# run by a pacman hook set up. The user should not have to run this manually. + +# Search for all Firefox and Librewolf profiles using Arkenfox. +profiles="$(grep -sH "arkenfox user.js" \ + /home/*/.librewolf/*.default-release/user.js \ + /home/*/.mozilla/firefox/*.default-release/user.js)" + +IFS=' +' + +# Update each found profile. +for profile in $profiles; do + userjs=${profile%%/user.js*} + user=$(stat -c '%U' "$userjs") || continue + + su -l "$user" -c "arkenfox-updater -c -p $userjs -s" +done diff --git a/.local/bin/booksplit b/.local/bin/booksplit index 69e4f36c..079d85f2 100755 --- a/.local/bin/booksplit +++ b/.local/bin/booksplit @@ -9,10 +9,10 @@ echo "Enter the artist/author:"; read -r author echo "Enter the publication year:"; read -r year inputaudio="$1" -ext="${1#*.}" +ext="${1##*.}" # Get a safe file name from the book. -escbook="$(echo "$booktitle" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")" +escbook="$(echo "$booktitle" | iconv -c -f UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")" ! mkdir -p "$escbook" && echo "Do you have write access in this directory?" && @@ -31,7 +31,7 @@ do cmd="$cmd -metadata artist=\"$author\" -metadata title=\"$title\" -metadata album=\"$booktitle\" -metadata year=\"$year\" -metadata track=\"$track\" -metadata total=\"$total\" -ss \"$start\" -to \"$end\" -vn -c:a copy \"$file\" " fi title="$(echo "$x" | cut -d' ' -f2-)" - esctitle="$(echo "$title" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")" + esctitle="$(echo "$title" | iconv -c -f UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")" track="$((track+1))" start="$end" done < "$2" diff --git a/.local/bin/compiler b/.local/bin/compiler index 67992be8..8420e25f 100755 --- a/.local/bin/compiler +++ b/.local/bin/compiler @@ -17,13 +17,15 @@ ext="${file##*.}" cd "$dir" || exit 1 textype() { \ + textarget="$(getcomproot "$file" || echo "$file")" + echo "$textarget" command="pdflatex" - ( head -n5 "$file" | grep -qi 'xelatex' ) && command="xelatex" - $command --output-directory="$dir" "$base" && - grep -qi addbibresource "$file" && - biber --input-directory "$dir" "$base" && - $command --output-directory="$dir" "$base" && - $command --output-directory="$dir" "$base" + ( head -n5 "$textarget" | grep -qi 'xelatex' ) && command="xelatex" + $command --output-directory="${textarget%/*}" "${textarget%.*}" + grep -qi addbibresource "$textarget" && + biber --input-directory "${textarget%/*}" "${textarget%.*}" && + $command --output-directory="${textarget%/*}" "${textarget%.*}" && + $command --output-directory="${textarget%/*}" "${textarget%.*}" } case "$ext" in @@ -37,9 +39,9 @@ case "$ext" in java) javac -d classes "$file" && java -cp classes "${1%.*}" ;; m) octave "$file" ;; md) if [ -x "$(command -v lowdown)" ]; then - lowdown --parse-no-intraemph "$file" -Tms | groff -mpdfmark -ms -kept > "$base".pdf + lowdown --parse-no-intraemph "$file" -Tms | groff -mpdfmark -ms -kept -T pdf > "$base".pdf elif [ -x "$(command -v groffdown)" ]; then - groffdown -i "$file" | groff > "$base.pdf" + groffdown -i "$file" | groff -T pdf > "$base".pdf else pandoc -t ms --highlight-style=kate -s -o "$base".pdf "$file" fi ; ;; @@ -49,7 +51,7 @@ case "$ext" in py) python "$file" ;; [rR]md) Rscript -e "rmarkdown::render('$file', quiet=TRUE)" ;; rs) cargo build ;; - sass) sassc -a "$file" "$base.css" ;; + sass) sassc -a "$file" "$base".css ;; scad) openscad -o "$base".stl "$file" ;; sent) setsid -f sent "$file" 2>/dev/null ;; tex) textype "$file" ;; diff --git a/.local/bin/cron/crontog b/.local/bin/cron/crontog index 5aba5e65..c9a640fc 100755 --- a/.local/bin/cron/crontog +++ b/.local/bin/cron/crontog @@ -1,6 +1,6 @@ #!/bin/sh # Toggles all cronjobs off/on. -# Stores disabled crontabs in ~/.consaved until restored. +# Stores disabled crontabs in ~/.config/cronsaved until restored. ([ -f "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved ] && crontab - < "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && rm "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && notify-send "๐Ÿ•“ Cronjobs re-enabled.") || ( crontab -l > "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && crontab -r && notify-send "๐Ÿ•“ Cronjobs saved and disabled.") diff --git a/.local/bin/displayselect b/.local/bin/displayselect index f9e80628..0227a32b 100755 --- a/.local/bin/displayselect +++ b/.local/bin/displayselect @@ -58,7 +58,6 @@ onescreen() { # If only one output available or chosen. postrun() { # Stuff to run to clean up. setbg # Fix background if screen size/arangement has changed. - remaps # Re-remap keys if keyboard added (for laptop bases) { killall dunst ; setsid -f dunst ;} >/dev/null 2>&1 # Restart dunst to ensure proper location on screen } diff --git a/.local/bin/dmenuhandler b/.local/bin/dmenuhandler index 3e5055f1..e50178ac 100755 --- a/.local/bin/dmenuhandler +++ b/.local/bin/dmenuhandler @@ -2,19 +2,19 @@ # Feed this script a link and it will give dmenu # some choice programs to use to open it. -feed="${1:-$(printf "%s" | dmenu -p 'Paste URL or file path')}" +feed="${1:-$(true | dmenu -p 'Paste URL or file path')}" -case "$(printf "Copy URL\\nsxiv\\nsetbg\\nPDF\\nbrowser\\nlynx\\nvim\\nmpv\\nmpv loop\\nmpv float\\nqueue download\\nqueue yt-dlp\\nqueue yt-dlp audio" | dmenu -i -p "Open it with?")" in - "Copy URL") echo "$feed" | xclip -selection clipboard ;; +case "$(printf "copy url\\nnsxiv\\nsetbg\\nPDF\\nbrowser\\nlynx\\nvim\\nmpv\\nmpv loop\\nmpv float\\nqueue download\\nqueue yt-dlp\\nqueue yt-dlp audio" | dmenu -i -p "Open it with?")" in + "copy url") echo "$feed" | xclip -selection clipboard ;; mpv) setsid -f mpv -quiet "$feed" >/dev/null 2>&1 ;; "mpv loop") setsid -f mpv -quiet --loop "$feed" >/dev/null 2>&1 ;; "mpv float") setsid -f "$TERMINAL" -e mpv --geometry=+0-0 --autofit=30% --title="mpvfloat" "$feed" >/dev/null 2>&1 ;; "queue yt-dlp") qndl "$feed" >/dev/null 2>&1 ;; - "queue yt-dlp audio") qndl "$feed" 'yt-dlp --embed-metadata -icx -f bestaudio/best' >/dev/null 2>&1 ;; + "queue yt-dlp audio") qndl "$feed" 'yt-dlp -o "%(title)s.%(ext)s" -f bestaudio --embed-metadata --restrict-filenames' ;; "queue download") qndl "$feed" 'curl -LO' >/dev/null 2>&1 ;; - PDF) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;; - sxiv) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;; - vim) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && setsid -f "$TERMINAL" -e "$EDITOR" "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;; + PDF) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && zathura "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;; + nsxiv) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && nsxiv -a "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;; + vim) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && setsid -f "$TERMINAL" -e "$EDITOR" "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;; setbg) curl -L "$feed" > $XDG_CACHE_HOME/pic ; xwallpaper --zoom $XDG_CACHE_HOME/pic >/dev/null 2>&1 ;; browser) setsid -f "$BROWSER" "$feed" >/dev/null 2>&1 ;; lynx) lynx "$feed" >/dev/null 2>&1 ;; diff --git a/.local/bin/dmenumount b/.local/bin/dmenumount deleted file mode 100755 index 3cb1f814..00000000 --- a/.local/bin/dmenumount +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh - -# Gives a dmenu prompt to mount unmounted drives and Android phones. If -# they're in /etc/fstab, they'll be mounted automatically. Otherwise, you'll -# be prompted to give a mountpoint from already existsing directories. If you -# input a novel directory, it will prompt you to create that directory. - -getmount() { \ - [ -z "$chosen" ] && exit 1 - # shellcheck disable=SC2086 - mp="$(find $1 2>/dev/null | dmenu -i -p "Type in mount point.")" || exit 1 - test -z "$mp" && exit 1 - if [ ! -d "$mp" ]; then - mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?") || exit 1 - [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp") - fi - } - -mountusb() { \ - chosen="$(echo "$usbdrives" | dmenu -i -p "Mount which drive?")" || exit 1 - chosen="$(echo "$chosen" | awk '{print $1}')" - sudo -A mount "$chosen" 2>/dev/null && notify-send "๐Ÿ’ป USB mounting" "$chosen mounted." && exit 0 - alreadymounted=$(lsblk -nrpo "name,type,mountpoint" | awk '$3!~/\/boot|\/home$|SWAP/&&length($3)>1{printf "-not ( -path *%s -prune ) ",$3}') - getmount "/mnt /media /mount /home -maxdepth 5 -type d $alreadymounted" - partitiontype="$(lsblk -no "fstype" "$chosen")" - case "$partitiontype" in - "vfat") sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000;; - "exfat") sudo -A mount "$chosen" "$mp" -o uid="$(id -u)",gid="$(id -g)";; - *) sudo -A mount "$chosen" "$mp"; user="$(whoami)"; ug="$(groups | awk '{print $1}')"; sudo -A chown "$user":"$ug" "$mp";; - esac - notify-send "๐Ÿ’ป USB mounting" "$chosen mounted to $mp." - } - -mountandroid() { \ - chosen="$(echo "$anddrives" | dmenu -i -p "Which Android device?")" || exit 1 - chosen="$(echo "$chosen" | cut -d : -f 1)" - getmount "$HOME -maxdepth 3 -type d" - simple-mtpfs --device "$chosen" "$mp" - echo "OK" | dmenu -i -p "Tap Allow on your phone if it asks for permission and then press enter" || exit 1 - simple-mtpfs --device "$chosen" "$mp" - notify-send "๐Ÿค– Android Mounting" "Android device mounted to $mp." - } - -asktype() { \ - choice="$(printf "USB\\nAndroid" | dmenu -i -p "Mount a USB drive or Android device?")" || exit 1 - case $choice in - USB) mountusb ;; - Android) mountandroid ;; - esac - } - -anddrives=$(simple-mtpfs -l 2>/dev/null) -usbdrives="$(lsblk -rpo "name,type,size,mountpoint" | grep 'part\|rom' | awk '$4==""{printf "%s (%s)\n",$1,$3}')" - -if [ -z "$usbdrives" ]; then - [ -z "$anddrives" ] && echo "No USB drive or Android device detected" && exit - echo "Android device(s) detected." - mountandroid -else - if [ -z "$anddrives" ]; then - echo "USB drive(s) detected." - mountusb - else - echo "Mountable USB drive(s) and Android device(s) detected." - asktype - fi -fi diff --git a/.local/bin/dmenurecord b/.local/bin/dmenurecord index b83a7c52..ca6b0117 100755 --- a/.local/bin/dmenurecord +++ b/.local/bin/dmenurecord @@ -9,6 +9,8 @@ # # If there is already a running instance, user will be prompted to end it. +getdim() { xrandr | grep -oP '(?<=current ).*(?=,)' | tr -d ' ' ;} + updateicon() { \ echo "$1" > /tmp/recordingicon pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}" @@ -16,26 +18,23 @@ updateicon() { \ killrecording() { recpid="$(cat /tmp/recordingpid)" - # kill with SIGTERM, allowing finishing touches. kill -15 "$recpid" rm -f /tmp/recordingpid updateicon "" pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}" - # even after SIGTERM, ffmpeg may still run, so SIGKILL it. - sleep 3 - kill -9 "$recpid" - exit } screencast() { \ ffmpeg -y \ -f x11grab \ - -framerate 60 \ - -s "$(xdpyinfo | awk '/dimensions/ {print $2;}')" \ + -framerate 30 \ + -s "$(getdim)" \ -i "$DISPLAY" \ - -f alsa -i default \ - -r 30 \ - -c:v h264 -crf 0 -preset ultrafast -c:a aac \ + -r 24 \ + -use_wallclock_as_timestamps 1 \ + -f alsa -thread_queue_size 1024 -i default \ + -c:v h264 \ + -crf 0 -preset ultrafast -c:a aac \ "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" & echo $! > /tmp/recordingpid updateicon "โบ๏ธ๐ŸŽ™๏ธ" @@ -43,7 +42,8 @@ screencast() { \ video() { ffmpeg \ -f x11grab \ - -s "$(xdpyinfo | awk '/dimensions/ {print $2;}')" \ + -framerate 30 \ + -s "$(getdim)" \ -i "$DISPLAY" \ -c:v libx264 -qp 0 -r 30 \ "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" & @@ -104,7 +104,7 @@ videoselected() ffmpeg \ -f x11grab \ - -framerate 60 \ + -framerate 30 \ -video_size "$W"x"$H" \ -i :0.0+"$X,$Y" \ -c:v libx264 -qp 0 -r 30 \ diff --git a/.local/bin/dmenuumount b/.local/bin/dmenuumount deleted file mode 100755 index 946d12c3..00000000 --- a/.local/bin/dmenuumount +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh - -# A dmenu prompt to unmount drives. -# Provides you with mounted partitions, select one to unmount. -# Drives mounted at /, /boot and /home will not be options to unmount. - -unmountusb() { - [ -z "$drives" ] && exit - chosen="$(echo "$drives" | dmenu -i -p "Unmount which drive?")" || exit 1 - chosen="$(echo "$chosen" | awk '{print $1}')" - [ -z "$chosen" ] && exit - sudo -A umount "$chosen" && notify-send "๐Ÿ’ป USB unmounting" "$chosen unmounted." - } - -unmountandroid() { \ - chosen="$(awk '/simple-mtpfs/ {print $2}' /etc/mtab | dmenu -i -p "Unmount which device?")" || exit 1 - [ -z "$chosen" ] && exit - sudo -A umount -l "$chosen" && notify-send "๐Ÿค– Android unmounting" "$chosen unmounted." - } - -asktype() { \ - choice="$(printf "USB\\nAndroid" | dmenu -i -p "Unmount a USB drive or Android device?")" || exit 1 - case "$choice" in - USB) unmountusb ;; - Android) unmountandroid ;; - esac - } - -drives=$(lsblk -nrpo "name,type,size,mountpoint,label" | awk -F':' '{gsub(/ /,":")}$4!~/\/boot|\/efi|\/home$|SWAP/&&length($4)>1{printf "%s (%s) %s\n",$4,$3,$5}') - -if ! grep simple-mtpfs /etc/mtab; then - [ -z "$drives" ] && echo "No drives to unmount." && exit - echo "Unmountable USB drive detected." - unmountusb -else - if [ -z "$drives" ] - then - echo "Unmountable Android device detected." - unmountandroid - else - echo "Unmountable USB drive(s) and Android device(s) detected." - asktype - fi -fi diff --git a/.local/bin/dmenuunicode b/.local/bin/dmenuunicode index 7d9a4ea6..dd12bc3d 100755 --- a/.local/bin/dmenuunicode +++ b/.local/bin/dmenuunicode @@ -3,7 +3,7 @@ # The famous "get a menu of emojis to copy" script. # Get user selection via dmenu from emoji file. -chosen=$(cut -d ';' -f1 ~/.local/share/larbs/emoji | dmenu -i -l 30 | sed "s/ .*//") +chosen=$(cut -d ';' -f1 ~/.local/share/larbs/chars/* | dmenu -i -l 30 | sed "s/ .*//") # Exit if none chosen. [ -z "$chosen" ] && exit @@ -13,6 +13,6 @@ chosen=$(cut -d ';' -f1 ~/.local/share/larbs/emoji | dmenu -i -l 30 | sed "s/ .* if [ -n "$1" ]; then xdotool type "$chosen" else - printf "$chosen" | xclip -selection clipboard + printf "%s" "$chosen" | xclip -selection clipboard notify-send "'$chosen' copied to clipboard." & fi diff --git a/.local/bin/getbib b/.local/bin/getbib index 8675aae8..121dd6ee 100755 --- a/.local/bin/getbib +++ b/.local/bin/getbib @@ -4,7 +4,7 @@ if [ -f "$1" ]; then # Try to get DOI from pdfinfo or pdftotext output. doi=$(pdfinfo "$1" | grep -io "doi:.*") || - doi=$(pdftotext "$1" 2>/dev/null - | grep -io "doi:.*" -m 1) || + doi=$(pdftotext "$1" 2>/dev/null - | sed -n '/[dD][oO][iI]:/{s/.*[dD][oO][iI]:\s*\(\S\+[[:alnum:]]\).*/\1/p;q}') || exit 1 else doi="$1" diff --git a/.local/bin/getcomproot b/.local/bin/getcomproot new file mode 100755 index 00000000..d34a2e42 --- /dev/null +++ b/.local/bin/getcomproot @@ -0,0 +1,12 @@ +#!/bin/bash + +# A helper script for LaTeX/groff files used by `compiler` and `opout`. +# The user can add the root file of a larger project as a comment as below: +# % root = mainfile.tex +# And the compiler script will run on that instead of the opened file. + +texroot="$(grep -i "^.\+\s*root\s*=\s*\S\+" "$1")" +texroot="${texroot##*=}" +texroot="${texroot//[\"\' ]}" + +[ -f "$texroot" ] && readlink -f "$texroot" || exit 1 diff --git a/.local/bin/lfub b/.local/bin/lfub index 9012f506..f9bb2df9 100755 --- a/.local/bin/lfub +++ b/.local/bin/lfub @@ -1,6 +1,6 @@ #!/bin/sh -# This is a wrapper script for lb that allows it to create image previews with +# This is a wrapper script for lf that allows it to create image previews with # ueberzug. This works in concert with the lf configuration file and the # lf-cleaner script. diff --git a/.local/bin/linkhandler b/.local/bin/linkhandler index fa74cafb..d372d84c 100755 --- a/.local/bin/linkhandler +++ b/.local/bin/linkhandler @@ -1,23 +1,26 @@ #!/bin/sh # Feed script a url or file location. -# If an image, it will view in sxiv, +# If an image, it will view in nsxiv, # if a video or gif, it will view in mpv # if a music file or pdf, it will download, # otherwise it opens link in browser. -# If no url given. Opens browser. For using script as $BROWSER. -[ -z "$1" ] && { "$BROWSER"; exit; } +if [ -z "$1" ]; then + url="$(xclip -o)" +else + url="$1" +fi -case "$1" in - *mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*hooktube.com*|*bitchute.com*|*videos.lukesmith.xyz*|*odysee.com*) - setsid -f mpv -quiet "$1" >/dev/null 2>&1 ;; - *png|*jpg|*jpe|*jpeg|*gif) - curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;; +case "$url" in + *mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtube.com/shorts*|*youtu.be*|*hooktube.com*|*bitchute.com*|*videos.lukesmith.xyz*|*odysee.com*) + setsid -f mpv -quiet "$url" >/dev/null 2>&1 ;; + *png|*jpg|*jpe|*jpeg|*gif|*webp) + curl -sL "$url" > "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" && nsxiv -a "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;; *pdf|*cbz|*cbr) - curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;; + curl -sL "$url" > "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;; *mp3|*flac|*opus|*mp3?source*) - qndl "$1" 'curl -LO' >/dev/null 2>&1 ;; + qndl "$url" 'curl -LO' >/dev/null 2>&1 ;; *) - [ -f "$1" ] && setsid -f "$TERMINAL" -e "$EDITOR" "$1" >/dev/null 2>&1 || setsid -f "$BROWSER" "$1" >/dev/null 2>&1 + [ -f "$url" ] && setsid -f "$TERMINAL" -e "$EDITOR" "$url" >/dev/null 2>&1 || setsid -f "$BROWSER" "$url" >/dev/null 2>&1 esac diff --git a/.local/bin/maimpick b/.local/bin/maimpick index 7125e615..5de26c17 100755 --- a/.local/bin/maimpick +++ b/.local/bin/maimpick @@ -4,11 +4,15 @@ # choose the kind of screenshot to take, including copying the image or even # highlighting an area to copy. scrotcucks on suicidewatch right now. +# variables +output="$(date '+%y%m%d-%H%M-%S').png" +xclip_cmd="xclip -sel clip -t image/png" + case "$(printf "a selected area\\ncurrent window\\nfull screen\\na selected area (copy)\\ncurrent window (copy)\\nfull screen (copy)" | dmenu -l 6 -i -p "Screenshot which area?")" in - "a selected area") maim -s pic-selected-"$(date '+%y%m%d-%H%M-%S').png" ;; - "current window") maim -i "$(xdotool getactivewindow)" pic-window-"$(date '+%y%m%d-%H%M-%S').png" ;; - "full screen") maim pic-full-"$(date '+%y%m%d-%H%M-%S').png" ;; - "a selected area (copy)") maim -s | xclip -selection clipboard -t image/png ;; - "current window (copy)") maim -i "$(xdotool getactivewindow)" | xclip -selection clipboard -t image/png ;; - "full screen (copy)") maim | xclip -selection clipboard -t image/png ;; + "a selected area") maim -u -s pic-selected-"${output}" ;; + "current window") maim -q -d 0.2 -i "$(xdotool getactivewindow)" pic-window-"${output}" ;; + "full screen") maim -q -d 0.2 pic-full-"${output}" ;; + "a selected area (copy)") maim -u -s | ${xclip_cmd} ;; + "current window (copy)") maim -q -d 0.2 -i "$(xdotool getactivewindow)" | ${xclip_cmd} ;; + "full screen (copy)") maim -q -d 0.2 | ${xclip_cmd} ;; esac diff --git a/.local/bin/mounter b/.local/bin/mounter new file mode 100755 index 00000000..756d04db --- /dev/null +++ b/.local/bin/mounter @@ -0,0 +1,114 @@ +#!/bin/bash + +# Mounts Android Phones and USB drives (encrypted or not). This script will +# replace the older `dmenumount` which had extra steps and couldn't handle +# encrypted drives. +# TODO: Try decrypt for drives in crtypttab +# TODO: Add some support for connecting iPhones (although they are annoying). + +IFS=' +' +# Function for escaping cell-phone names. +escape(){ echo "$@" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g" ;} + +# Check for phones. +phones="$(simple-mtpfs -l 2>/dev/null | sed "s/^/๐Ÿ“ฑ/")" +mountedphones="$(grep "simple-mtpfs" /etc/mtab)" +# If there are already mounted phones, remove them from the list of mountables. +[ -n "$mountedphones" ] && phones="$(for phone in $phones; do + for mounted in $mountedphones; do + escphone="$(escape "$phone")" + [[ "$mounted" =~ "$escphone" ]] && break 1 + done && continue 1 + echo "$phone" +done)" + +# Check for drives. +lsblkoutput="$(lsblk -rpo "uuid,name,type,size,label,mountpoint,fstype")" +# Get all LUKS drives +allluks="$(echo "$lsblkoutput" | grep crypto_LUKS)" +# Get a list of the LUKS drive UUIDs already decrypted. +decrypted="$(find /dev/disk/by-id/dm-uuid-CRYPT-LUKS2-* | sed "s|.*LUKS2-||;s|-.*||")" +# Functioning for formatting drives correctly for dmenu: +filter() { sed "s/ /:/g" | awk -F':' '$7==""{printf "%s%s (%s) %s\n",$1,$3,$5,$6}' ; } + +# Get only LUKS drives that are not decrypted. +unopenedluks="$(for drive in $allluks; do + uuid="${drive%% *}" + uuid="${uuid//-}" # This is a bashism. + [ -n "$decrypted" ] && for open in $decrypted; do + [ "$uuid" = "$open" ] && break 1 + done && continue 1 + echo "๐Ÿ”’ $drive" +done | filter)" + +# Get all normal, non-encrypted or decrypted partitions that are not mounted. +normalparts="$(echo "$lsblkoutput"| grep -v crypto_LUKS | grep 'part\|rom\|crypt' | sed "s/^/๐Ÿ’พ /" | filter )" + +# Add all to one variable. If no mountable drives found, exit. +alldrives="$(echo "$phones +$unopenedluks +$normalparts" | sed "/^$/d;s/ *$//")" + +# Quit the script if a sequential command fails. +set -e + +test -n "$alldrives" + +# Feed all found drives to dmenu and get user choice. +chosen="$(echo "$alldrives" | dmenu -p "Mount which drive?" -i)" + +# Function for prompting user for a mountpoint. +getmount(){ + mp="$(find /mnt /media /mount /home -maxdepth 1 -type d 2>/dev/null | dmenu -i -p "Mount this drive where?")" + test -n "$mp" + if [ ! -d "$mp" ]; then + mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?") + [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp") + fi +} + +attemptmount(){ + # Attempt to mount without a mountpoint, to see if drive is in fstab. + sudo -A mount "$chosen" || return 1 + notify-send "๐Ÿ’พDrive Mounted." "$chosen mounted." + exit +} + +case "$chosen" in + ๐Ÿ’พ*) + chosen="${chosen%% *}" + chosen="${chosen:1}" # This is a bashism. + attemptmount || getmount + sudo -A mount "$chosen" "$mp" -o uid="$(id -u)",gid="$(id -g)" + notify-send "๐Ÿ’พDrive Mounted." "$chosen mounted to $mp." + ;; + + ๐Ÿ”’*) + chosen="${chosen%% *}" + chosen="${chosen:1}" # This is a bashism. + # Number the drive. + while true; do + [ -f "/dev/mapper/usb$num" ] || break + num="$(printf "%02d" "$((num +1))")" + done + + # Decrypt in a terminal window + ${TERMINAL:-st} -n floatterm -g 60x1 -e sudo cryptsetup open "$chosen" "usb$num" + # Check if now decrypted. + test -b "/dev/mapper/usb$num" + + attemptmount || getmount + sudo -A mount "/dev/mapper/usb$num" "$mp" -o uid="$(id -u)",gid="$(id -g)" + notify-send "๐Ÿ”“Decrypted drive Mounted." "$chosen decrypted and mounted to $mp." + ;; + + ๐Ÿ“ฑ*) + notify-send "โ—Note" "Remember to allow file access on your phone now." + getmount + number="${chosen%%:*}" + number="${chosen:1}" # This is a bashism. + sudo -A simple-mtpfs -o allow_other -o fsname="simple-mtpfs-$(escape "$chosen")" --device "$number" "$mp" + notify-send "๐Ÿค– Android Mounted." "Android device mounted to $mp." + ;; +esac diff --git a/.local/bin/opout b/.local/bin/opout index faf65753..d2b447a1 100755 --- a/.local/bin/opout +++ b/.local/bin/opout @@ -7,7 +7,7 @@ basename="${1%.*}" case "${*}" in - *.tex|*.m[dse]|*.[rR]md|*.mom|*.[0-9]) setsid -f xdg-open "$basename".pdf >/dev/null 2>&1 ;; + *.tex|*.sil|*.m[dse]|*.[rR]md|*.mom|*.[0-9]) target="$(getcomproot "$1" || echo "$1")" ; setsid -f xdg-open "${target%.*}".pdf >/dev/null 2>&1 ;; *.html) setsid -f "$BROWSER" "$basename".html >/dev/null 2>&1 ;; *.sent) setsid -f sent "$1" >/dev/null 2>&1 ;; esac diff --git a/.local/bin/otp b/.local/bin/otp index 1726b1a6..7e471db5 100755 --- a/.local/bin/otp +++ b/.local/bin/otp @@ -9,31 +9,29 @@ # computer to have its time properly synced. This can be done with the command # below which requires the package `ntp`. -ifinstalled pass pass-otp +ifinstalled pass pass-otp || exit 1 dir="${PASSWORD_STORE_DIR}" -choice="$({ echo "๐Ÿ†•add" ; echo "๐Ÿ•™sync-time" ; ls ${dir}/*-otp.gpg ;} | sed "s/.*\///;s/-otp.gpg//" | dmenu -p "Pick a 2FA:")" +choice="$({ echo "๐Ÿ†•add" ; echo "๐Ÿ•™sync-time" ; ls "$dir"/*-otp.gpg ;} | sed "s/.*\///;s/-otp.gpg//" | dmenu -p "Pick a 2FA:")" case $choice in ๐Ÿ†•add ) - ifinstalled maim zbar xclip || exit 1 + ifinstalled maim zbar || exit 1 - temp="$dir/temp.png" + temp=$(mktemp -p "$XDG_RUNTIME_DIR" --suffix=.png) otp="otp-test-script" - trap 'shred -fu $temp; pass rm $otp' HUP INT QUIT TERM PWR EXIT + trap 'rm -f $temp; pass rm -f $otp' HUP INT QUIT TERM PWR EXIT notify-send "Scan the image." "Scan the OTP QR code." maim -s "$temp" || exit 1 info="$(zbarimg -q "$temp")" info="${info#QR-Code:}" - issuer="$(echo "$info" | grep -o "issuer=[A-z0-9]\+")" - name="${issuer#issuer=}" if echo "$info" | pass otp insert "$otp"; then while true ; do - export name="$(dmenu -p "Give this One Time Password a one-word name:")" + export name="$(echo | dmenu -p "Give this One Time Password a one-word name:")" echo "$name" | grep -q -- "^[A-z0-9-]\+$" && break done pass mv "$otp" "$name-otp" @@ -41,7 +39,6 @@ case $choice in else notify-send "No OTP data found." "Try to scan the image again more precisely." fi - ;; ๐Ÿ•™sync-time ) ifinstalled ntp || exit 1 diff --git a/.local/bin/peertubetorrent b/.local/bin/peertubetorrent index e89b1c01..4d8f6301 100755 --- a/.local/bin/peertubetorrent +++ b/.local/bin/peertubetorrent @@ -3,7 +3,7 @@ # first argument is the video link, second is the quality (360, 480 or 1080) # 13/07/20 - Arthur Bais -instance=$(echo "$1" | sed "s/\/w.\+//") -vidid=$(echo "$1" | sed "s/.\+\///") +instance=$(echo "$1" | sed "s|/w.\+||") +vidid=$(echo "$1" | sed "s|.\+/||") link=$(curl -s "$instance/api/v1/videos/$vidid" | grep -o "$instance/download/torrents/.\{37\}$2.torrent") transadd "$link" diff --git a/.local/bin/prompt b/.local/bin/prompt deleted file mode 100755 index 666434fb..00000000 --- a/.local/bin/prompt +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -# A dmenu binary prompt script. -# Gives a dmenu prompt labeled with $1 to perform command $2. -# For example: -# `./prompt "Do you want to shutdown?" "shutdown -h now"` - -[ "$(printf "No\\nYes" | dmenu -i -p "$1" -nb darkred -sb red -sf white -nf gray )" = "Yes" ] && $2 diff --git a/.local/bin/remapd b/.local/bin/remapd new file mode 100755 index 00000000..ee4cf396 --- /dev/null +++ b/.local/bin/remapd @@ -0,0 +1,8 @@ +#!/bin/bash + +# Rerun the remaps script whenever a new input device is added. + +while :; do + remaps + grep -qP -m1 '[^un]bind.+\/[^:]+\(usb\)' <(udevadm monitor -u -t seat -s input -s usb) +done diff --git a/.local/bin/remaps b/.local/bin/remaps index c95ac841..6d7d54e9 100755 --- a/.local/bin/remaps +++ b/.local/bin/remaps @@ -8,4 +8,4 @@ setxkbmap -option caps:super,altwin:menu_win # When caps lock is pressed only once, treat it as escape. killall xcape 2>/dev/null ; xcape -e 'Super_L=Escape' # Turn off caps lock if on since there is no longer a key for it. -xset -q | grep "Caps Lock:\s*on" && xdotool key Caps_Lock +xset -q | grep -q "Caps Lock:\s*on" && xdotool key Caps_Lock diff --git a/.local/bin/rotdir b/.local/bin/rotdir index 86da6dbe..d171f299 100755 --- a/.local/bin/rotdir +++ b/.local/bin/rotdir @@ -1,11 +1,11 @@ #!/bin/sh -# When I open an image from the file manager in sxiv (the image viewer), I want +# When I open an image from the file manager in nsxiv (the image viewer), I want # to be able to press the next/previous keys to key through the rest of the # images in the same directory. This script "rotates" the content of a # directory based on the first chosen file, so that if I open the 15th image, # if I press next, it will go to the 16th etc. Autistic, I know, but this is -# one of the reasons that sxiv is great for being able to read standard input. +# one of the reasons that nsxiv is great for being able to read standard input. [ -z "$1" ] && echo "usage: rotdir regex 2>&1" && exit 1 base="$(basename "$1")" diff --git a/.local/bin/samedir b/.local/bin/samedir deleted file mode 100755 index 0a19707e..00000000 --- a/.local/bin/samedir +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -# Open a terminal window in the same directory as the currently active window. - -PID=$(xprop -id "$(xprop -root | xprop -root | sed -n "/_NET_ACTIVE_WINDOW/ s/^.*# // p")" | sed -n "/PID/ s/^.*= // p") -PID="$(pstree -lpA "$PID")" -PID="${PID##*(}" -PID="${PID%)}" -cd "$(readlink /proc/"$PID"/cwd)" || return 1 -"$TERMINAL" diff --git a/.local/bin/sd b/.local/bin/sd new file mode 100755 index 00000000..a0ff84c2 --- /dev/null +++ b/.local/bin/sd @@ -0,0 +1,22 @@ +#!/bin/sh + +# Open a terminal window in the same directory as the currently active window. + +windowPID=$(xprop -id "$(xprop -root | sed -n "/_NET_ACTIVE_WINDOW/ s/^.*# // p")" | sed -n "/PID/ s/^.*= // p") +PIDlist=$(pstree -lpATna "$windowPID" | sed -En 's/.*,([0-9]+).*/\1/p' | tac) +for PID in $PIDlist; do + cmdline=$(ps -o args= -p "$PID") + process_group_leader=$(ps -o comm= -p "$(ps -o pgid= -p "$PID" | tr -d ' ')") + cwd=$(readlink /proc/"$PID"/cwd) + # zsh and lf won't be ignored even if it shows ~ or / + case "$cmdline" in + 'lf -server') continue ;; + "${SHELL##*/}"|'lf'|'lf '*) break ;; + esac + # git (and its sub-processes) will show the root of a repository instead of the actual cwd, so they're ignored + [ "$process_group_leader" = 'git' ] || [ ! -d "$cwd" ] && continue + # This is to ignore programs that show ~ or / instead of the actual working directory + [ "$cwd" != "$HOME" ] && [ "$cwd" != '/' ] && break +done +[ "$PWD" != "$cwd" ] && [ -d "$cwd" ] && { cd "$cwd" || exit 1; } +"$TERMINAL" diff --git a/.local/bin/setbg b/.local/bin/setbg index 28298960..c2888958 100755 --- a/.local/bin/setbg +++ b/.local/bin/setbg @@ -13,17 +13,23 @@ bgloc="${XDG_DATA_HOME:-$HOME/.local/share}/bg" dunstconf="${XDG_CONFIG_HOME:-$HOME/.config}/dunst/dunstrc" zathuraconf="${XDG_CONFIG_HOME:-$HOME/.config}/zathura/zathurarc" +# Give -s as parameter to make notifications silent. +while getopts "s" o; do case "${o}" in + s) silent='1' ;; +esac done + +shift $((OPTIND - 1)) + trueloc="$(readlink -f "$1")" && case "$(file --mime-type -b "$trueloc")" in - image/* ) ln -sf "$(readlink -f "$1")" "$bgloc" && notify-send -i "$bgloc" "Changing wallpaper..." ;; - inode/directory ) ln -sf "$(find "$trueloc" -iregex '.*.\(jpg\|jpeg\|png\|gif\)' -type f | shuf -n 1)" "$bgloc" && notify-send -i "$bgloc" "Random Wallpaper chosen." ;; - *) notify-send "Error" "Not a valid image." ; exit 1;; + image/* ) ln -sf "$trueloc" "$bgloc" && [ -z "$silent" ] && notify-send -i "$bgloc" "Changing wallpaper..." ;; + inode/directory ) ln -sf "$(find "$trueloc" -iregex '.*.\(jpg\|jpeg\|png\|gif\)' -type f | shuf -n 1)" "$bgloc" && [ -z "$silent" ] && notify-send -i "$bgloc" "Random Wallpaper chosen." ;; + *) [ -z "$silent" ] && notify-send "๐Ÿ–ผ๏ธ Error" "Not a valid image or directory." ; exit 1;; esac # If pywal is installed, use it. if command -v wal >/dev/null 2>&1 ; then - wal -i "$(readlink -f $bgloc)" -o "${XDG_CONFIG_HOME:-$HOME/.config}/wal/postrun" >/dev/null 2>&1 && - pidof dwm >/dev/null && xdotool key super+F12 + wal -n -i "$(readlink -f $bgloc)" -o "${XDG_CONFIG_HOME:-$HOME/.config}/wal/postrun" >/dev/null 2>&1 # If pywal is removed, return config files to normal. else [ -f "$dunstconf.bak" ] && unlink "$dunstconf" && mv "$dunstconf.bak" "$dunstconf" @@ -31,3 +37,5 @@ else fi xwallpaper --zoom "$bgloc" +# If running, dwm hit the key to refresh the color scheme. +pidof dwm >/dev/null && xdotool key super+F5 diff --git a/.local/bin/shortcuts b/.local/bin/shortcuts index 8fecea28..7d7a1904 100755 --- a/.local/bin/shortcuts +++ b/.local/bin/shortcuts @@ -22,9 +22,9 @@ printf "\" vim: filetype=vim\\n" > "$vifm_shortcuts" # Format the `directories` file in the correct syntax and sent it to all three configs. eval "echo \"$(cat "$bmdirs")\"" | \ awk "!/^\s*#/ && !/^\s*\$/ {gsub(\"\\\s*#.*$\",\"\"); - printf(\"%s=\42cd %s && ls -a\42 \\\\\n\",\$1,\$2) >> \"$shell_shortcuts\" ; + printf(\"%s=\42cd %s && ls -A\42 \\\\\n\",\$1,\$2) >> \"$shell_shortcuts\" ; printf(\"hash -d %s=%s \n\",\$1,\$2) >> \"$zsh_named_dirs\" ; - printf(\"abbr %s \42cd %s; and ls -a\42\n\",\$1,\$2) >> \"$fish_shortcuts\" ; + printf(\"abbr %s \42cd %s; and ls -A\42\n\",\$1,\$2) >> \"$fish_shortcuts\" ; printf(\"map g%s :cd %s\nmap t%s :cd %s\nmap M%s :cd %s:mo\nmap Y%s :cd %s:co \n\",\$1,\$2, \$1, \$2, \$1, \$2, \$1, \$2) >> \"$vifm_shortcuts\" ; printf(\"config.bind(';%s', \42set downloads.location.directory %s ;; hint links download\42) \n\",\$1,\$2) >> \"$qute_shortcuts\" ; printf(\"map g%s cd %s\nmap t%s tab_new %s\nmap m%s shell mv -v %%s %s\nmap Y%s shell cp -rv %%s %s \n\",\$1,\$2,\$1,\$2, \$1, \$2, \$1, \$2) >> \"$ranger_shortcuts\" ; diff --git a/.local/bin/slider b/.local/bin/slider index 674781a4..3460c777 100755 --- a/.local/bin/slider +++ b/.local/bin/slider @@ -9,7 +9,7 @@ # Application cache if not stated elsewhere. cache="${XDG_CACHE_HOME:-$HOME/.cache}/slider" -while getopts "hvrpi:c:a:o:d:f:t:e:x:" o; do case "${o}" in +while getopts "hvrpi:c:a:o:d:f:t:e:x:s:" o; do case "${o}" in c) bgc="$OPTARG" ;; t) fgc="$OPTARG" ;; f) font="$OPTARG" ;; diff --git a/.local/bin/statusbar/sb-battery b/.local/bin/statusbar/sb-battery index 93cbe088..79030bcc 100755 --- a/.local/bin/statusbar/sb-battery +++ b/.local/bin/statusbar/sb-battery @@ -13,7 +13,7 @@ case $BLOCK_BUTTON in - Scroll to change adjust xbacklight." ;; 4) xbacklight -inc 10 ;; 5) xbacklight -dec 10 ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac # Loop through all attached batteries and format the info diff --git a/.local/bin/statusbar/sb-clock b/.local/bin/statusbar/sb-clock index cac019f6..8e08e331 100755 --- a/.local/bin/statusbar/sb-clock +++ b/.local/bin/statusbar/sb-clock @@ -19,11 +19,11 @@ case "$clock" in esac case $BLOCK_BUTTON in - 1) notify-send "This Month" "$(cal --color=always | sed "s/..7m//;s/..27m/<\/span><\/b>/")" && notify-send "Appointments" "$(calcurse -d3)" ;; + 1) notify-send "This Month" "$(cal | sed "s/\<$(date +'%e')\>/&<\/span><\/b>/")" && notify-send "Appointments" "$(calcurse -d3)" ;; 2) setsid -f "$TERMINAL" -e calcurse ;; 3) notify-send "๐Ÿ“… Time/date module" "\- Left click to show upcoming appointments for the next three days via \`calcurse -d3\` and show the month via \`cal\` - Middle click opens calcurse if installed" ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac date "+%Y %b %d (%a) $icon%I:%M:%S%p" diff --git a/.local/bin/statusbar/sb-cpu b/.local/bin/statusbar/sb-cpu index 1572b527..5b8fb933 100755 --- a/.local/bin/statusbar/sb-cpu +++ b/.local/bin/statusbar/sb-cpu @@ -6,7 +6,7 @@ case $BLOCK_BUTTON in 3) notify-send "๐Ÿ–ฅ CPU module " "\- Shows CPU temperature. - Click to show intensive processes. - Middle click to open htop." ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac sensors | awk '/Core 0/ {print "๐ŸŒก" $3}' diff --git a/.local/bin/statusbar/sb-cpubars b/.local/bin/statusbar/sb-cpubars index 297424e7..40158934 100755 --- a/.local/bin/statusbar/sb-cpubars +++ b/.local/bin/statusbar/sb-cpubars @@ -12,7 +12,7 @@ case $BLOCK_BUTTON in 2) setsid -f "$TERMINAL" -e htop ;; 3) notify-send "๐Ÿชจ CPU load module" "Each bar represents one CPU core";; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac # id total idle diff --git a/.local/bin/statusbar/sb-disk b/.local/bin/statusbar/sb-disk index e947509d..7f3ff798 100755 --- a/.local/bin/statusbar/sb-disk +++ b/.local/bin/statusbar/sb-disk @@ -11,7 +11,7 @@ case $BLOCK_BUTTON in 1) notify-send "๐Ÿ’ฝ Disk space" "$(df -h --output=target,used,size)" ;; 3) notify-send "๐Ÿ’ฝ Disk module" "\- Shows used hard drive space. - Click to show all disk info." ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac case "$location" in diff --git a/.local/bin/statusbar/sb-doppler b/.local/bin/statusbar/sb-doppler index dabf18b2..a687c681 100755 --- a/.local/bin/statusbar/sb-doppler +++ b/.local/bin/statusbar/sb-doppler @@ -6,7 +6,8 @@ secs=600 # Download a new doppler radar if one hasn't been downloaded in $secs s radarloc="${XDG_CACHE_HOME:-$HOME/.cache}/radar" doppler="${XDG_CACHE_HOME:-$HOME/.cache}/doppler.gif" -pickloc() { chosen="$(echo "US: Northeast +pickloc() { chosen="$(echo "US: CONUS: Continental United States +US: Northeast US: Southeast US: PacNorthWest US: PacSouthWest @@ -55,7 +56,7 @@ US: KUDX: Rapid City, SD US: KRIW: Riverton, WY US: KSGF: Springfield, MO US: KLSX: St. LOUIS, MO -US: KFSD: Sioux Falls, IA +US: KFSD: Sioux Falls, SD US: KTWX: Topeka, KS US: KICT: Wichita, KS US: KVWX: Paducah, KY @@ -183,7 +184,7 @@ US: KVNX: Norman, OK US: KVBX: Vandenberg Afb: Orcutt, CA EU: Europe EU: GB: Great Brittain -EU: SCAN: Scandinavia +EU: SCAN: Scandinavia. Norway, Sweden And Denmark EU: ALPS: The Alps EU: NL: The Netherlands EU: DE: Germany @@ -222,26 +223,45 @@ AF: TZ: Tanzania AF: TN: Tunisia AF: ZM: Zambia AF: KE: Kenya -AF: AO: Angola" | dmenu -r -i -l 50 -p "Select a radar to use as default:" | tr "[:lower:]" "[:upper:]")" +AF: AO: Angola +DE: BAW: Baden-Wรผrttemberg +DE: BAY: Bavaria +DE: BBB: Berlin +DE: BBB: Brandenburg +DE: HES: Hesse +DE: MVP: Mecklenburg-Western Pomerania +DE: NIB: Lower Saxony +DE: NIB: Bremen +DE: NRW: North Rhine-Westphalia +DE: RPS: Rhineland-Palatinate +DE: RPS: Saarland +DE: SAC: Saxony +DE: SAA: Saxony-Anhalt +DE: SHH: Schleswig-Holstein +DE: SHH: Hamburg +DE: THU: Thuringia" | dmenu -r -i -l 50 -p "Select a radar to use as default:" | tr "[:lower:]" "[:upper:]")" + +# Ensure user did not escape. +[ -z "$chosen" ] && exit 1 # Set continent code and radar code. -continentcode=$(echo "$chosen" | sed "s/:.*//") -radarcode=$(echo "$chosen" | sed "s/..: // ; s/:.*//") +continentcode=${chosen%%:*} +radarcode=${chosen#* } radarcode=${radarcode%:*} -# Sanity check of selection and ensure user did not escape. -echo "$radarcode" | grep -q "^[A-Z]\+$" && printf "%s,%s\\n" "$continentcode" "$radarcode" > "$radarloc" ;} +# Print codes to $radarloc file. + printf "%s,%s\\n" "$continentcode" "$radarcode" > "$radarloc" ;} getdoppler() { - cont="$(sed "s/,.*//" "$radarloc")" - loc="$(cut -c 4- "$radarloc")" + cont=$(cut -c -2 "$radarloc") + loc=$(cut -c 4- "$radarloc") notify-send "๐ŸŒฆ๏ธ Doppler RADAR" "Pulling most recent Doppler RADAR for $loc." - if [ "$cont" = "US" ] ; then - curl -sL "https://radar.weather.gov/ridge/lite/${loc}_loop.gif" > "$doppler" ; - elif [ "$cont" = "EU" ] ; then - curl -sL "https://api.sat24.com/animated/${loc}/rainTMC/2/" > "$doppler" ; - elif [ "$cont" = "AF" ] ; then - curl -sL "https://api.sat24.com/animated/${loc}/rain/2/" > "$doppler" ; - fi + case "$cont" in + "US") curl -sL "https://radar.weather.gov/ridge/standard/${loc}_loop.gif" > "$doppler" ;; + "EU") curl -sL "https://api.sat24.com/animated/${loc}/rainTMC/2/" > "$doppler" ;; + "AF") curl -sL "https://api.sat24.com/animated/${loc}/rain/2/" > "$doppler" ;; + "DE") loc="$(echo "$loc" | tr "[:upper:]" "[:lower:]")" + curl -sL "https://www.dwd.de/DWD/wetter/radar/radfilm_${loc}_akt.gif" > "$doppler" ;; + esac } showdoppler() { setsid -f mpv --no-osc --loop=inf --no-terminal "$doppler" ;} @@ -254,7 +274,7 @@ case $BLOCK_BUTTON in 3) notify-send "๐Ÿ—บ๏ธ Doppler RADAR module" "\- Left click for local Doppler RADAR. - Middle click to update RADAR location. After $secs seconds, new clicks will also automatically update the doppler RADAR." ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac -echo ๐Ÿ—บ๏ธ +echo ๐ŸŒ… diff --git a/.local/bin/statusbar/sb-forecast b/.local/bin/statusbar/sb-forecast index 7b8416ec..52256019 100755 --- a/.local/bin/statusbar/sb-forecast +++ b/.local/bin/statusbar/sb-forecast @@ -1,35 +1,53 @@ #!/bin/sh -# Displays todays precipication chance (โ˜”) and daily low (๐Ÿฅถ) and high (๐ŸŒž). +# Displays today's precipication chance (โ˜”), and daily low (๐Ÿฅถ) and high (๐ŸŒž). # Usually intended for the statusbar. -# If we have internet, get a weather report from wttr.in and store it locally. -# You could set up a shell alias to view the full file in a pager in the -# terminal if desired. This function will only be run once a day when needed. -weatherreport="${XDG_DATA_HOME:-$HOME/.local/share}/weatherreport" -getforecast() { curl -sf "wttr.in/$LOCATION" > "$weatherreport" || exit 1 ;} +url="${WTTRURL:-wttr.in}" +weatherreport="${XDG_CACHE_HOME:-$HOME/.cache}/weatherreport" -# Some very particular and terse stream manipulation. We get the maximum -# precipitation chance and the daily high and low from the downloaded file and -# display them with coresponding emojis. -showweather() { printf "%s" "$(sed '16q;d' "$weatherreport" | - grep -wo "[0-9]*%" | sort -rn | sed "s/^/โ˜”/g;1q" | tr -d '\n')" -sed '13q;d' "$weatherreport" | grep -o "m\\([-+]\\)*[0-9]\\+" | sed 's/+//g' | sort -n -t 'm' -k 2n | sed -e 1b -e '$!d' | tr '\n|m' ' ' | awk '{print " ๐Ÿฅถ" $1 "ยฐ","๐ŸŒž" $2 "ยฐ"}' ;} +# Get a weather report from 'wttr.in' and save it locally. +getforecast() { timeout --signal=1 2s curl -sf "$url/$LOCATION" > "$weatherreport" || exit 1; } + +# Forecast should be updated only once a day. +checkforecast() { + [ -s "$weatherreport" ] && [ "$(stat -c %y "$weatherreport" 2>/dev/null | + cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] +} + +getprecipchance() { + echo "$weatherdata" | sed '16q;d' | # Extract line 16 from file + grep -wo "[0-9]*%" | # Find a sequence of digits followed by '%' + sort -rn | # Sort in descending order + head -1q # Extract first line +} + +getdailyhighlow() { + echo "$weatherdata" | sed '13q;d' | # Extract line 13 from file + grep -o "m\\([-+]\\)*[0-9]\\+" | # Find temperatures in the format "m" + sed 's/[+m]//g' | # Remove '+' and 'm' + sort -g | # Sort in ascending order + sed -e 1b -e '$!d' # Extract the first and last lines +} + +readfile() { weatherdata="$(cat "$weatherreport")" ;} + +showweather() { + readfile + printf "โ˜”%s ๐Ÿฅถ%sยฐ ๐ŸŒž%sยฐ\n" "$(getprecipchance)" $(getdailyhighlow) +} case $BLOCK_BUTTON in - 1) setsid -f "$TERMINAL" -e less -Srf "$weatherreport" ;; + 1) setsid -f "$TERMINAL" -e less -Sf "$weatherreport" ;; 2) getforecast && showweather ;; 3) notify-send "๐ŸŒˆ Weather module" "\- Left click for full forecast. - Middle click to update forecast. โ˜”: Chance of rain/snow ๐Ÿฅถ: Daily low ๐ŸŒž: Daily high" ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac -# The test if our forcecast is updated to the day. If it isn't download a new -# weather report from wttr.in with the above function. -[ "$(stat -c %y "$weatherreport" 2>/dev/null | cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] || - getforecast +checkforecast || getforecast showweather diff --git a/.local/bin/statusbar/sb-help-icon b/.local/bin/statusbar/sb-help-icon index 8fa4a52c..8372e6f8 100755 --- a/.local/bin/statusbar/sb-help-icon +++ b/.local/bin/statusbar/sb-help-icon @@ -13,5 +13,5 @@ case $BLOCK_BUTTON in 2) restartwm ;; 3) notify-send "โ“ Help module" "\- Left click to open LARBS guide. - Middle click to refresh window manager." ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac; echo "โ“" diff --git a/.local/bin/statusbar/sb-internet b/.local/bin/statusbar/sb-internet index 94b7da27..6d0c5133 100755 --- a/.local/bin/statusbar/sb-internet +++ b/.local/bin/statusbar/sb-internet @@ -14,13 +14,20 @@ case $BLOCK_BUTTON in ๐ŸŒ: ethernet working ๐Ÿ”’: vpn is active " ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac -if grep -xq 'up' /sys/class/net/w*/operstate 2>/dev/null ; then +# Wifi +if [ "$(cat /sys/class/net/w*/operstate 2>/dev/null)" = 'up' ] ; then wifiicon="$(awk '/^\s*w/ { print "๐Ÿ“ถ", int($3 * 100 / 70) "% " }' /proc/net/wireless)" -elif grep -xq 'down' /sys/class/net/w*/operstate 2>/dev/null ; then - grep -xq '0x1003' /sys/class/net/w*/flags && wifiicon="๐Ÿ“ก " || wifiicon="โŒ " +elif [ "$(cat /sys/class/net/w*/operstate 2>/dev/null)" = 'down' ] ; then + [ "$(cat /sys/class/net/w*/flags 2>/dev/null)" = '0x1003' ] && wifiicon="๐Ÿ“ก " || wifiicon="โŒ " fi -printf "%s%s%s\n" "$wifiicon" "$(sed "s/down/โŽ/;s/up/๐ŸŒ/" /sys/class/net/e*/operstate 2>/dev/null)" "$(sed "s/.*/๐Ÿ”’/" /sys/class/net/tun*/operstate 2>/dev/null)" +# Ethernet +[ "$(cat /sys/class/net/e*/operstate 2>/dev/null)" = 'up' ] && ethericon="๐ŸŒ" || ethericon="โŽ" + +# TUN +[ -n "$(cat /sys/class/net/tun*/operstate 2>/dev/null)" ] && tunicon=" ๐Ÿ”’" + +printf "%s%s%s\n" "$wifiicon" "$ethericon" "$tunicon" diff --git a/.local/bin/statusbar/sb-iplocate b/.local/bin/statusbar/sb-iplocate index 02adab8d..a9043e32 100755 --- a/.local/bin/statusbar/sb-iplocate +++ b/.local/bin/statusbar/sb-iplocate @@ -5,6 +5,11 @@ # # https://www.maketecheasier.com/ip-address-geolocation-lookups-linux/ -ifinstalled "geoip" || exit -addr="$(curl ifconfig.me 2>/dev/null)" || exit -grep "flag: " "${XDG_DATA_HOME:-$HOME/.local/share}/larbs/emoji" | grep "$(geoiplookup "$addr" | sed 's/.*, //')" | sed "s/flag: //;s/;.*//" +set -e + +ifinstalled "geoip" +addr="$(geoiplookup "$(curl -sfm 1 ifconfig.me 2>/dev/null)")" +name="${addr##*, }" +flag="$(grep "flag: $name" "${XDG_DATA_HOME:-$HOME/.local/share}/larbs/emoji")" +flag="${flag%% *}" +printf "%s %s\\n" "$flag" "$name" diff --git a/.local/bin/statusbar/sb-kbselect b/.local/bin/statusbar/sb-kbselect index f0c923f5..df455c14 100755 --- a/.local/bin/statusbar/sb-kbselect +++ b/.local/bin/statusbar/sb-kbselect @@ -5,12 +5,13 @@ kb="$(setxkbmap -query | grep -oP 'layout:\s*\K\w+')" || exit 1 case $BLOCK_BUTTON in 1) kb_choice="$(awk '/! layout/{flag=1; next} /! variant/{flag=0} flag {print $2, "- " $1}' /usr/share/X11/xkb/rules/base.lst | dmenu -l 15)" + [ -z "$kb_choice" ] && exit 0 kb="$(echo "$kb_choice" | awk '{print $3}')" setxkbmap "$kb" pkill -RTMIN+30 "${STATUSBAR:-dwmblocks}";; 3) notify-send "โŒจ Keyboard/language module" "$(printf "%s" "\- Current layout: $(setxkbmap -query | grep -oP 'layout:\s*\K\w+')") - Left click to change keyboard.";; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac echo "$kb" diff --git a/.local/bin/statusbar/sb-mailbox b/.local/bin/statusbar/sb-mailbox index 2132184c..7483aa48 100755 --- a/.local/bin/statusbar/sb-mailbox +++ b/.local/bin/statusbar/sb-mailbox @@ -4,13 +4,13 @@ # When clicked, brings up `neomutt`. case $BLOCK_BUTTON in - 1) setsid -f "$TERMINAL" -e neomutt ;; + 1) setsid -w -f "$TERMINAL" -e neomutt; pkill -RTMIN+12 "${STATUSBAR:-dwmblocks}" ;; 2) setsid -f mw -Y >/dev/null ;; 3) notify-send "๐Ÿ“ฌ Mail module" "\- Shows unread mail - Shows ๐Ÿ”ƒ if syncing mail - Left click opens neomutt - Middle click syncs mail" ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac unread="$(find "${XDG_DATA_HOME:-$HOME/.local/share}"/mail/*/[Ii][Nn][Bb][Oo][Xx]/new/* -type f | wc -l 2>/dev/null)" diff --git a/.local/bin/statusbar/sb-memory b/.local/bin/statusbar/sb-memory index 01d3daf9..8178b10b 100755 --- a/.local/bin/statusbar/sb-memory +++ b/.local/bin/statusbar/sb-memory @@ -6,7 +6,7 @@ case $BLOCK_BUTTON in 3) notify-send "๐Ÿง  Memory module" "\- Shows Memory Used/Total. - Click to show memory hogs. - Middle click to open htop." ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac free --mebi | sed -n '2{p;q}' | awk '{printf ("๐Ÿง %2.2fGiB/%2.2fGiB\n", ( $3 / 1024), ($2 / 1024))}' diff --git a/.local/bin/statusbar/sb-moonphase b/.local/bin/statusbar/sb-moonphase index fab8b4da..d496ae22 100755 --- a/.local/bin/statusbar/sb-moonphase +++ b/.local/bin/statusbar/sb-moonphase @@ -4,7 +4,7 @@ moonfile="${XDG_DATA_HOME:-$HOME/.local/share}/moonphase" -[ "$(stat -c %y "$moonfile" 2>/dev/null | cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] || +[ -s "$moonfile" ] && [ "$(stat -c %y "$moonfile" 2>/dev/null | cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] || { curl -sf "wttr.in/?format=%m" > "$moonfile" || exit 1 ;} icon="$(cat "$moonfile")" @@ -33,5 +33,5 @@ case $BLOCK_BUTTON in - ๐ŸŒ–: Waning Gibbous - ๐ŸŒ—: Last Quarter - ๐ŸŒ˜: Waning Crescent" ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac diff --git a/.local/bin/statusbar/sb-music b/.local/bin/statusbar/sb-music index 7ea70320..6734eeb7 100755 --- a/.local/bin/statusbar/sb-music +++ b/.local/bin/statusbar/sb-music @@ -1,6 +1,6 @@ #!/bin/sh -filter() { mpc | sed "/^volume:/d;s/\\&/&/g;s/\\[paused\\].*/โธ/g;/\\[playing\\].*/d;/^ERROR/Q" | paste -sd ' ' -;} +filter() { sed "/^volume:/d;s/\\[paused\\].*/โธ/g;/\\[playing\\].*/d;/^ERROR/Q" | paste -sd ' ' -;} pidof -x sb-mpdup >/dev/null 2>&1 || sb-mpdup >/dev/null 2>&1 & @@ -14,6 +14,6 @@ case $BLOCK_BUTTON in - Scroll changes track.";; # right click, pause/unpause 4) mpc prev | filter ;; # scroll up, previous 5) mpc next | filter ;; # scroll down, next - 6) mpc status | filter ; "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) mpc status | filter ; setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; *) mpc status | filter ;; esac diff --git a/.local/bin/statusbar/sb-nettraf b/.local/bin/statusbar/sb-nettraf index c71d38e9..08cb8299 100755 --- a/.local/bin/statusbar/sb-nettraf +++ b/.local/bin/statusbar/sb-nettraf @@ -8,7 +8,7 @@ case $BLOCK_BUTTON in 1) setsid -f "$TERMINAL" -e bmon ;; 3) notify-send "๐ŸŒ Network traffic module" "๐Ÿ”ป: Traffic received ๐Ÿ”บ: Traffic transmitted" ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac update() { @@ -17,7 +17,7 @@ update() { read -r i < "$arg" sum=$(( sum + i )) done - cache=${XDG_CACHE_HOME:-$HOME/.cache}/${1##*/} + cache=/tmp/${1##*/} [ -f "$cache" ] && read -r old < "$cache" || old=0 printf %d\\n "$sum" > "$cache" printf %d\\n $(( sum - old )) diff --git a/.local/bin/statusbar/sb-news b/.local/bin/statusbar/sb-news index fe701db6..cc481e1e 100755 --- a/.local/bin/statusbar/sb-news +++ b/.local/bin/statusbar/sb-news @@ -5,13 +5,13 @@ case $BLOCK_BUTTON in 1) setsid "$TERMINAL" -e newsboat ;; - 2) setsid -f newsup >/dev/null exit ;; + 2) setsid -f newsup >/dev/null && exit ;; 3) notify-send "๐Ÿ“ฐ News module" "\- Shows unread news items - Shows ๐Ÿ”ƒ if updating with \`newsup\` - Left click opens newsboat - Middle click syncs RSS feeds Note: Only one instance of newsboat (including updates) may be running at a time." ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac cat /tmp/newsupdate 2>/dev/null || echo "$(newsboat -x print-unread | awk '{ if($1>0) print "๐Ÿ“ฐ" $1}')$(cat "${XDG_CONFIG_HOME:-$HOME/.config}"/newsboat/.update 2>/dev/null)" diff --git a/.local/bin/statusbar/sb-pacpackages b/.local/bin/statusbar/sb-pacpackages index 37ebed32..6acdce68 100755 --- a/.local/bin/statusbar/sb-pacpackages +++ b/.local/bin/statusbar/sb-pacpackages @@ -23,7 +23,7 @@ case $BLOCK_BUTTON in 3) notify-send "๐ŸŽ Upgrade module" "๐Ÿ“ฆ: number of upgradable packages - Left click to upgrade packages - Middle click to show upgradable packages" ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac pacman -Qu | grep -Fcv "[ignored]" | sed "s/^/๐Ÿ“ฆ/;s/^๐Ÿ“ฆ0$//g" diff --git a/.local/bin/statusbar/sb-price b/.local/bin/statusbar/sb-price index 42c84c11..611ec36f 100755 --- a/.local/bin/statusbar/sb-price +++ b/.local/bin/statusbar/sb-price @@ -1,50 +1,56 @@ #!/bin/sh # Usage: -# price -# price bat "Basic Attention Token" ๐Ÿฆ +# price +# price bat-btc "Basic Attention Token" ๐Ÿฆ 24 +# This will give the price of BAT denominated in BTC and will update on +# signal 24. # When the name of the currency is multi-word, put it in quotes. -[ -z "$3" ] && exit 1 +[ -z "$1" ] && exit 1 -# use $4 as currency, if not passed in use "usd" as default -currency="${4:-usd}" +url="${CRYPTOURL:-rate.sx}" +target="${1%%-*}" +denom="${1##*-}" +name="${2:-$1}" +icon="${3:-๐Ÿ’ฐ}" +case "$denom" in + "$target"|usd) denom="usd"; symb="$" ;; + gbp) symb="ยฃ" ;; + eur) symb="โ‚ฌ" ;; + btc) symb="๏…š" ;; +esac interval="@14d" # History contained in chart preceded by '@' (7d = 7 days) -dir="${XDG_DATA_HOME:-$HOME/.local/share}/crypto-prices" -pricefile="$dir/$1-$currency" -chartfile="$dir/$1-$currency-chart" - -updateprice() { temp="$(mktemp)" - curl -s "$currency.rate.sx/1$1" > "$temp" && - mv -f "$temp" "$pricefile" && - curl -s "$currency.rate.sx/$1$interval" > "$temp" && - mv -f "$temp" "$chartfile" ;} +dir="${XDG_CACHE_HOME:-$HOME/.cache}/crypto-prices" +pricefile="$dir/$target-$denom" +chartfile="$dir/$target-$denom-chart" +filestat="$(stat -c %x "$pricefile" 2>/dev/null)" [ -d "$dir" ] || mkdir -p "$dir" -[ "$(stat -c %x "$pricefile" 2>/dev/null | cut -d' ' -f1)" != "$(date '+%Y-%m-%d')" ] && - updateprice "$1" +updateprice() { curl -sf -m 1 --fail-early $denom.$url/{1$target,$target$interval} --output "$pricefile" --output "$chartfile" || + rm -f "$pricefile" "$chartfile" ;} + +[ "${filestat%% *}" != "$(date '+%Y-%m-%d')" ] && + updateme="1" case $BLOCK_BUTTON in 1) setsid "$TERMINAL" -e less -Srf "$chartfile" ;; - 2) notify-send -u low "$3 Updating..." "Updating $2 price..." - updateprice "$1" && notify-send "$3 Update complete." "$2 price is now -\$$(cat "$pricefile")" ;; - 3) uptime="$(date -d "$(stat -c %x "$pricefile")" '+%D at %T' | sed "s|$(date '+%D')|Today|")" - notify-send "$3 $2 module" "\- Exact price: \$$(cat "$pricefile") + 2) notify-send -u low "$icon Updating..." "Updating $name price..." ; updateme="1" ; showupdate="1" ;; + 3) uptime="$(date -d "$filestat" '+%D at %T' | sed "s|$(date '+%D')|Today|")" + notify-send "$icon $name module" "\- Exact price: \$$(cat "$pricefile") - Left click for chart of changes. - Middle click to update. - Shows ๐Ÿ”ƒ if updating prices. - Last updated: $uptime" ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac -case "$currency" in - usd) symb="$" ;; - gbp) symb="ยฃ" ;; - eur) symb="โ‚ฌ" ;; - btc) symb="โ‚ฟ" ;; -esac +[ -n "$updateme" ] && + updateprice "$target" && + [ -n "$showupdate" ] && + notify-send "$icon Update complete." "$name price is now +\$$(cat "$pricefile")" -printf "$3$symb%0.2f$after" "$(cat "$pricefile")" +[ -f "$pricefile" ] && printf "%s%s%0.2f" "$icon" "$symb" "$(cat "$pricefile")" diff --git a/.local/bin/statusbar/sb-tasks b/.local/bin/statusbar/sb-tasks index 586300ee..4beb2d09 100755 --- a/.local/bin/statusbar/sb-tasks +++ b/.local/bin/statusbar/sb-tasks @@ -13,7 +13,7 @@ case $BLOCK_BUTTON in 1) setsid -f "$TERMINAL" -e tsp -l ;; 3) notify-send "Tasks module" "๐Ÿค–: number of running/queued background tasks - Left click opens tsp" ;; # Right click - 2) $EDITOR "$0" ;; # Middle click + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac [ "$num" != "0(0)" ] && diff --git a/.local/bin/statusbar/sb-torrent b/.local/bin/statusbar/sb-torrent index 65270050..493631bc 100755 --- a/.local/bin/statusbar/sb-torrent +++ b/.local/bin/statusbar/sb-torrent @@ -11,9 +11,9 @@ transmission-remote -l | grep % | sort -h | uniq -c | awk '{print $3 $1}' | paste -sd ' ' - case $BLOCK_BUTTON in - 1) setsid -f "$TERMINAL" -e tremc ;; + 1) setsid -f "$TERMINAL" -e stig ;; 2) td-toggle ;; - 3) notify-send "๐ŸŒฑ Torrent module" "\- Left click to open tremc. + 3) notify-send "๐ŸŒฑ Torrent module" "\- Left click to open stig. - Middle click to toggle transmission. - Shift click to edit script. Module shows number of torrents: @@ -23,5 +23,5 @@ Module shows number of torrents: ๐Ÿ”ฝ: downloading โœ…: done ๐ŸŒฑ: done and seeding" ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac diff --git a/.local/bin/statusbar/sb-volume b/.local/bin/statusbar/sb-volume index 3cfdc457..e66dea77 100755 --- a/.local/bin/statusbar/sb-volume +++ b/.local/bin/statusbar/sb-volume @@ -3,28 +3,37 @@ # Prints the current volume or ๐Ÿ”‡ if muted. case $BLOCK_BUTTON in - 1) setsid -f "$TERMINAL" -e pulsemixer ;; - 2) pamixer -t ;; - 4) pamixer --allow-boost -i 1 ;; - 5) pamixer --allow-boost -d 1 ;; + 1) setsid -w -f "$TERMINAL" -e pulsemixer; pkill -RTMIN+10 "${STATUSBAR:-dwmblocks}" ;; + 2) wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle ;; + 4) wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%+ ;; + 5) wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%- ;; 3) notify-send "๐Ÿ“ข Volume module" "\- Shows volume ๐Ÿ”Š, ๐Ÿ”‡ if muted. - Middle click to mute. - Scroll to change." ;; - 6) "$TERMINAL" -e "$EDITOR" "$0" ;; + 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac -[ $(pamixer --get-mute) = true ] && echo ๐Ÿ”‡ && exit +vol="$(wpctl get-volume @DEFAULT_AUDIO_SINK@)" -vol="$(pamixer --get-volume)" +# If muted, print ๐Ÿ”‡ and exit. +[ "$vol" != "${vol%\[MUTED\]}" ] && echo ๐Ÿ”‡ && exit -if [ "$vol" -gt "70" ]; then - icon="๐Ÿ”Š" -elif [ "$vol" -gt "30" ]; then - icon="๐Ÿ”‰" -elif [ "$vol" -gt "0" ]; then - icon="๐Ÿ”ˆ" -else - echo ๐Ÿ”‡ && exit -fi +vol="${vol#Volume: }" + +split() { + # For ommiting the . without calling and external program. + IFS=$2 + set -- $1 + printf '%s' "$@" +} + +vol="$(printf "%.0f" "$(split "$vol" ".")")" + +case 1 in + $((vol >= 70)) ) icon="๐Ÿ”Š" ;; + $((vol >= 30)) ) icon="๐Ÿ”‰" ;; + $((vol >= 1)) ) icon="๐Ÿ”ˆ" ;; + * ) echo ๐Ÿ”‡ && exit ;; +esac echo "$icon$vol%" diff --git a/.local/bin/sysact b/.local/bin/sysact index ca91b665..64c2f320 100755 --- a/.local/bin/sysact +++ b/.local/bin/sysact @@ -17,7 +17,7 @@ case "$(printf "๐Ÿ”’ lock\n๐Ÿšช leave $WM\nโ™ป๏ธ renew $WM\n๐Ÿป hibernate\n '๐Ÿ”’ lock') slock ;; "๐Ÿšช leave $WM") kill -TERM "$(wmpid)" ;; "โ™ป๏ธ renew $WM") kill -HUP "$(wmpid)" ;; - '๐Ÿป hibernate') slock $ctl hibernate ;; + '๐Ÿป hibernate') slock $ctl hibernate -i ;; '๐Ÿ’ค sleep') slock $ctl suspend -i ;; '๐Ÿ”ƒ reboot') $ctl reboot -i ;; '๐Ÿ–ฅ๏ธshutdown') $ctl poweroff -i ;; diff --git a/.local/bin/tag b/.local/bin/tag index 8462b99a..92d6323d 100755 --- a/.local/bin/tag +++ b/.local/bin/tag @@ -13,7 +13,7 @@ Options: -c: comment You will be prompted for title, artist, album and track if not given." && exit 1 ;} -while getopts "a:t:A:n:N:d:g:c:f:" o; do case "${o}" in +while getopts "a:t:A:n:N:d:g:c:" o; do case "${o}" in a) artist="${OPTARG}" ;; t) title="${OPTARG}" ;; A) album="${OPTARG}" ;; @@ -22,7 +22,6 @@ while getopts "a:t:A:n:N:d:g:c:f:" o; do case "${o}" in d) date="${OPTARG}" ;; g) genre="${OPTARG}" ;; c) comment="${OPTARG}" ;; - f) file="${OPTARG}" ;; *) printf "Invalid option: -%s\\n" "$OPTARG" && err ;; esac done @@ -30,38 +29,21 @@ shift $((OPTIND - 1)) file="$1" -[ ! -f "$file" ] && echo "Provide file to tag." && err +temp="$(mktemp -p "$(dirname "$file")")" +trap 'rm -f $temp' HUP INT QUIT TERM PWR EXIT -[ -z "$title" ] && echo "Enter a title." && read -r title -[ -z "$artist" ] && echo "Enter an artist." && read -r artist -[ -z "$album" ] && echo "Enter an album." && read -r album -[ -z "$track" ] && echo "Enter a track number." && read -r track +[ ! -f "$file" ] && echo 'Provide file to tag.' && err -case "$file" in - *.ogg) echo "Title=$title -Artist=$artist -Album=$album -Track=$track -Total=$total -Date=$date -Genre=$genre -Comment=$comment" | vorbiscomment -w "$file" ;; - *.opus) echo "Title=$title -Artist=$artist -Album=$album -Track=$track -Total=$total -Date=$date -Genre=$genre -Comment=$comment" | opustags -i -S "$file" ;; - *.mp3) eyeD3 -Q --remove-all -a "$artist" -A "$album" -t "$title" -n "$track" -N "$total" -Y "$date" "$file" ;; - *.flac) echo "TITLE=$title -ARTIST=$artist -ALBUM=$album -TRACKNUMBER=$track -TOTALTRACKS=$total -DATE=$date -GENRE=$genre -DESCRIPTION=$comment" | metaflac --remove-all-tags --import-tags-from=- "$file" ;; - *) echo "File type not implemented yet." ;; -esac +[ -z "$title" ] && echo 'Enter a title.' && read -r title +[ -z "$artist" ] && echo 'Enter an artist.' && read -r artist +[ -z "$album" ] && echo 'Enter an album.' && read -r album +[ -z "$track" ] && echo 'Enter a track number.' && read -r track + +cp -f "$file" "$temp" && ffmpeg -i "$temp" -map 0 -y -codec copy \ + -metadata title="$title" \ + -metadata album="$album" \ + -metadata artist="$artist" \ + -metadata track="${track}${total:+/"$total"}" \ + ${date:+-metadata date="$date"} \ + ${genre:+-metadata genre="$genre"} \ + ${comment:+-metadata comment="$comment"} "$file" diff --git a/.local/bin/td-toggle b/.local/bin/td-toggle index 3c20ea19..de1a0e6e 100755 --- a/.local/bin/td-toggle +++ b/.local/bin/td-toggle @@ -4,7 +4,7 @@ if pidof transmission-daemon >/dev/null ; then - [ "$(printf "No\\nYes" | dmenu -i -p "Turn off transmission-daemon?")" = "Yes" ] && killall transmission-da && notify-send "transmission-daemon disabled." + [ "$(printf "No\\nYes" | dmenu -i -p "Turn off transmission-daemon?")" = "Yes" ] && killall transmission-daemon && notify-send "transmission-daemon disabled." else ifinstalled transmission-cli || exit [ "$(printf "No\\nYes" | dmenu -i -p "Turn on transmission daemon?")" = "Yes" ] && transmission-daemon && notify-send "transmission-daemon enabled." diff --git a/.local/bin/texclear b/.local/bin/texclear index f38f7bef..4cdb02e2 100755 --- a/.local/bin/texclear +++ b/.local/bin/texclear @@ -9,7 +9,7 @@ case "$1" in dir=$(dirname "$file") base="${file%.*}" find "$dir" -maxdepth 1 -type f -regextype gnu-awk -regex "^$base\\.(4tc|xref|tmp|pyc|pyg|pyo|fls|vrb|fdb_latexmk|bak|swp|aux|log|synctex\\(busy\\)|lof|lot|maf|idx|mtc|mtc0|nav|out|snm|toc|bcf|run\\.xml|synctex\\.gz|blg|bbl)" -delete - rm -rdf "$dir/_minted-$(basename -- $base)" + rm -rdf "$dir/_minted-$(basename -- "$base")" ;; *) printf "Give .tex file as argument.\\n" ;; esac diff --git a/.local/bin/torwrap b/.local/bin/torwrap index 8b20ad4f..39f89b0f 100755 --- a/.local/bin/torwrap +++ b/.local/bin/torwrap @@ -1,7 +1,7 @@ #!/bin/sh -ifinstalled tremc transmission-cli || exit +ifinstalled stig transmission-cli || exit 1 ! pidof transmission-daemon >/dev/null && transmission-daemon && notify-send "Starting torrent daemon..." -$TERMINAL -e tremc; pkill -RTMIN+7 "${STATUSBAR:-dwmblocks}" +$TERMINAL -e stig; pkill -RTMIN+7 "${STATUSBAR:-dwmblocks}" diff --git a/.local/bin/tutorialvids b/.local/bin/tutorialvids index 6d4914bd..1bac3df9 100755 --- a/.local/bin/tutorialvids +++ b/.local/bin/tutorialvids @@ -6,21 +6,21 @@ vidlist=" dwm (window manager) https://videos.lukesmith.xyz/videos/watch/f6b78db7-b368-4647-bc64-28c08fff1988 +dwmblocks (status bar) https://videos.lukesmith.xyz/w/mmxHMbqZZEr5FManB57Yy1 pacman (installing/managing programs) https://videos.lukesmith.xyz/videos/watch/8e7cadb9-0fed-47ce-a2a8-6635fa48614b -status bar https://videos.lukesmith.xyz/videos/watch/a4d5326b-0aac-496e-bfc3-5acd5cee89f0 -sxiv (image viewer) https://videos.lukesmith.xyz/videos/watch/ad4c8d85-90c3-4f3d-a1f3-89129e64a3c2 -st (terminal) https://videos.lukesmith.xyz/videos/watch/efddd39d-bac5-4599-b572-177beb4ce6e8 +sxiv/nsxiv (image viewer) https://videos.lukesmith.xyz/videos/watch/ad4c8d85-90c3-4f3d-a1f3-89129e64a3c2 +st (terminal) https://videos.lukesmith.xyz/videos/watch/efddd39d-bac5-4599-b572-177beb4ce6e8 i3 (old window manager) https://videos.lukesmith.xyz/videos/watch/b861525c-7ada-40ee-a2bb-b5e1ffe0f48b neomutt (email) https://videos.lukesmith.xyz/videos/watch/83122e83-52d9-4278-ae1a-7d1beeb50c8e -ncmpcpp (music player) https://videos.lukesmith.xyz/videos/watch/b5ac6f0d-a220-4433-88e3-e98fc791dc0a +ncmpcpp (music player) https://videos.lukesmith.xyz/videos/watch/b5ac6f0d-a220-4433-88e3-e98fc791dc0a newsboat (RSS reader) https://videos.lukesmith.xyz/videos/watch/bd2c3fff-40fa-47ea-aa98-5b1ec0c903b6 lf (file manager) https://videos.lukesmith.xyz/w/rKeHsF5ZHDNDbR1buUKB1c -zathura (pdf viewer) https://videos.lukesmith.xyz/videos/watch/c780f75a-11f6-48a9-a191-d079ebc36ea4 -gpg keys https://videos.lukesmith.xyz/videos/watch/040f5530-4830-4583-9ddc-2080b421531b +zathura (pdf viewer) https://videos.lukesmith.xyz/videos/watch/c780f75a-11f6-48a9-a191-d079ebc36ea4 +gpg keys https://videos.lukesmith.xyz/videos/watch/040f5530-4830-4583-9ddc-2080b421531b calcurse (calendar) https://videos.lukesmith.xyz/videos/watch/4b937e8b-7654-46e3-8d01-79392ec5b3d1 -urlview https://videos.lukesmith.xyz/videos/watch/31a4918f-633b-4bd6-b08e-956ac75d0324 +urlview https://videos.lukesmith.xyz/videos/watch/31a4918f-633b-4bd6-b08e-956ac75d0324 colorschemes with pywal https://videos.lukesmith.xyz/videos/watch/1b476003-61b2-4609-ac4b-820c3d128643 vi mode in shell https://videos.lukesmith.xyz/videos/watch/228aa50c-836f-456f-9f0d-a45157fe4313 -pass (password manager) https://videos.lukesmith.xyz/videos/watch/432fc942-5e28-4682-9beb-f5cb237a1dd6 +pass (password manager) https://videos.lukesmith.xyz/videos/watch/432fc942-5e28-4682-9beb-f5cb237a1dd6 " echo "$vidlist" | grep -P "^$(echo "$vidlist" | grep "https:" | sed 's/\t.*//g' | dmenu -i -p "Learn about what? (ESC to cancel)" -l 20 | awk '{print $1}')\s" | sed 's/.*\t//' | xargs -r mpv diff --git a/.local/bin/unmounter b/.local/bin/unmounter new file mode 100755 index 00000000..7f1dbf5d --- /dev/null +++ b/.local/bin/unmounter @@ -0,0 +1,28 @@ +#!/bin/sh + +# Unmount USB drives or Android phones. Replaces the older `dmenuumount`. Fewer +# prompt and also de-decrypts LUKS drives that are unmounted. + +set -e + +mounteddroids="$(grep simple-mtpfs /etc/mtab | awk '{print "๐Ÿ“ฑ" $2}')" +lsblkoutput="$(lsblk -nrpo "name,type,size,mountpoint")" +mounteddrives="$(echo "$lsblkoutput" | awk '($2=="part"||$2="crypt")&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "๐Ÿ’พ%s (%s)\n",$4,$3}')" + +allunmountable="$(echo "$mounteddroids +$mounteddrives" | sed "/^$/d;s/ *$//")" +test -n "$allunmountable" + +chosen="$(echo "$allunmountable" | dmenu -i -p "Unmount which drive?")" +chosen="${chosen%% *}" +test -n "$chosen" + +sudo -A umount -l "/${chosen#*/}" +notify-send "Device unmounted." "$chosen has been unmounted." + +# Close the chosen drive if decrypted. +cryptid="$(echo "$lsblkoutput" | grep "/${chosen#*/}$")" +cryptid="${cryptid%% *}" +test -b /dev/mapper/"${cryptid##*/}" +sudo -A cryptsetup close "$cryptid" +notify-send "๐Ÿ”’Device dencryption closed." "Drive is now securely locked again." diff --git a/.local/bin/xdg-terminal-exec b/.local/bin/xdg-terminal-exec new file mode 100755 index 00000000..12b18ffc --- /dev/null +++ b/.local/bin/xdg-terminal-exec @@ -0,0 +1,3 @@ +#!/bin/sh + +"$TERMINAL" -e "$@" diff --git a/.local/share/applications/img.desktop b/.local/share/applications/img.desktop index 42aa81e0..57831070 100644 --- a/.local/share/applications/img.desktop +++ b/.local/share/applications/img.desktop @@ -1,4 +1,4 @@ [Desktop Entry] Type=Application Name=Image viewer -Exec=/usr/bin/sxiv -a %f +Exec=/usr/bin/nsxiv -a %f diff --git a/.local/share/applications/video.desktop b/.local/share/applications/video.desktop new file mode 100644 index 00000000..a29a0b12 --- /dev/null +++ b/.local/share/applications/video.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=Video viewer +Exec=/usr/bin/mpv -quiet %f diff --git a/.local/share/larbs/chars/emoji b/.local/share/larbs/chars/emoji new file mode 100644 index 00000000..6803731f --- /dev/null +++ b/.local/share/larbs/chars/emoji @@ -0,0 +1,1630 @@ +๐Ÿ˜€ 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 +๐Ÿ™† person gesturing OK +๐Ÿ’ person tipping hand +๐Ÿ™‹ person raising hand +๐Ÿง 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 +๐Ÿต 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: * +0๏ธโƒฃ keycap: 0 +1๏ธโƒฃ keycap: 1 +2๏ธโƒฃ keycap: 2 +3๏ธโƒฃ keycap: 3 +4๏ธโƒฃ keycap: 4 +5๏ธโƒฃ keycap: 5 +6๏ธโƒฃ keycap: 6 +7๏ธโƒฃ keycap: 7 +8๏ธโƒฃ keycap: 8 +9๏ธโƒฃ keycap: 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 +๐Ÿ‡ฆ๐Ÿ‡จ flag: Ascension Island +๐Ÿ‡ฆ๐Ÿ‡ฉ flag: Andorra +๐Ÿ‡ฆ๐Ÿ‡ช flag: United Arab Emirates +๐Ÿ‡ฆ๐Ÿ‡ซ flag: Afghanistan +๐Ÿ‡ฆ๐Ÿ‡ฌ flag: Antigua & Barbuda +๐Ÿ‡ฆ๐Ÿ‡ฎ flag: Anguilla +๐Ÿ‡ฆ๐Ÿ‡ฑ flag: Albania +๐Ÿ‡ฆ๐Ÿ‡ฒ flag: Armenia +๐Ÿ‡ฆ๐Ÿ‡ด flag: Angola +๐Ÿ‡ฆ๐Ÿ‡ถ flag: Antarctica +๐Ÿ‡ฆ๐Ÿ‡ท flag: Argentina +๐Ÿ‡ฆ๐Ÿ‡ธ flag: American Samoa +๐Ÿ‡ฆ๐Ÿ‡น flag: Austria +๐Ÿ‡ฆ๐Ÿ‡บ flag: Australia +๐Ÿ‡ฆ๐Ÿ‡ผ flag: Aruba +๐Ÿ‡ฆ๐Ÿ‡ฝ flag: ร…land Islands +๐Ÿ‡ฆ๐Ÿ‡ฟ flag: Azerbaijan +๐Ÿ‡ง๐Ÿ‡ฆ flag: Bosnia & Herzegovina +๐Ÿ‡ง๐Ÿ‡ง flag: Barbados +๐Ÿ‡ง๐Ÿ‡ฉ flag: Bangladesh +๐Ÿ‡ง๐Ÿ‡ช flag: Belgium +๐Ÿ‡ง๐Ÿ‡ซ flag: Burkina Faso +๐Ÿ‡ง๐Ÿ‡ฌ flag: Bulgaria +๐Ÿ‡ง๐Ÿ‡ญ flag: Bahrain +๐Ÿ‡ง๐Ÿ‡ฎ flag: Burundi +๐Ÿ‡ง๐Ÿ‡ฏ flag: Benin +๐Ÿ‡ง๐Ÿ‡ฑ flag: St. Barthรฉlemy +๐Ÿ‡ง๐Ÿ‡ฒ flag: Bermuda +๐Ÿ‡ง๐Ÿ‡ณ flag: Brunei +๐Ÿ‡ง๐Ÿ‡ด flag: Bolivia +๐Ÿ‡ง๐Ÿ‡ถ flag: Caribbean Netherlands +๐Ÿ‡ง๐Ÿ‡ท flag: Brazil +๐Ÿ‡ง๐Ÿ‡ธ flag: Bahamas +๐Ÿ‡ง๐Ÿ‡น flag: Bhutan +๐Ÿ‡ง๐Ÿ‡ป flag: Bouvet Island +๐Ÿ‡ง๐Ÿ‡ผ flag: Botswana +๐Ÿ‡ง๐Ÿ‡พ flag: Belarus +๐Ÿ‡ง๐Ÿ‡ฟ flag: Belize +๐Ÿ‡จ๐Ÿ‡ฆ flag: Canada +๐Ÿ‡จ๐Ÿ‡จ flag: Cocos (Keeling) Islands +๐Ÿ‡จ๐Ÿ‡ฉ flag: Congo - Kinshasa +๐Ÿ‡จ๐Ÿ‡ซ flag: Central African Republic +๐Ÿ‡จ๐Ÿ‡ฌ flag: Congo - Brazzaville +๐Ÿ‡จ๐Ÿ‡ญ flag: Switzerland +๐Ÿ‡จ๐Ÿ‡ฎ flag: Cรดte dโ€™Ivoire +๐Ÿ‡จ๐Ÿ‡ฐ flag: Cook Islands +๐Ÿ‡จ๐Ÿ‡ฑ flag: Chile +๐Ÿ‡จ๐Ÿ‡ฒ flag: Cameroon +๐Ÿ‡จ๐Ÿ‡ณ flag: China +๐Ÿ‡จ๐Ÿ‡ด flag: Colombia +๐Ÿ‡จ๐Ÿ‡ต flag: Clipperton Island +๐Ÿ‡จ๐Ÿ‡ท flag: Costa Rica +๐Ÿ‡จ๐Ÿ‡บ flag: Cuba +๐Ÿ‡จ๐Ÿ‡ป flag: Cape Verde +๐Ÿ‡จ๐Ÿ‡ผ flag: Curaรงao +๐Ÿ‡จ๐Ÿ‡ฝ flag: Christmas Island +๐Ÿ‡จ๐Ÿ‡พ flag: Cyprus +๐Ÿ‡จ๐Ÿ‡ฟ flag: Czechia +๐Ÿ‡ฉ๐Ÿ‡ช flag: Germany +๐Ÿ‡ฉ๐Ÿ‡ฌ flag: Diego Garcia +๐Ÿ‡ฉ๐Ÿ‡ฏ flag: Djibouti +๐Ÿ‡ฉ๐Ÿ‡ฐ flag: Denmark +๐Ÿ‡ฉ๐Ÿ‡ฒ flag: Dominica +๐Ÿ‡ฉ๐Ÿ‡ด flag: Dominican Republic +๐Ÿ‡ฉ๐Ÿ‡ฟ flag: Algeria +๐Ÿ‡ช๐Ÿ‡ฆ flag: Ceuta & Melilla +๐Ÿ‡ช๐Ÿ‡จ flag: Ecuador +๐Ÿ‡ช๐Ÿ‡ช flag: Estonia +๐Ÿ‡ช๐Ÿ‡ฌ flag: Egypt +๐Ÿ‡ช๐Ÿ‡ญ flag: Western Sahara +๐Ÿ‡ช๐Ÿ‡ท flag: Eritrea +๐Ÿ‡ช๐Ÿ‡ธ flag: Spain +๐Ÿ‡ช๐Ÿ‡น flag: Ethiopia +๐Ÿ‡ช๐Ÿ‡บ flag: European Union +๐Ÿ‡ซ๐Ÿ‡ฎ flag: Finland +๐Ÿ‡ซ๐Ÿ‡ฏ flag: Fiji +๐Ÿ‡ซ๐Ÿ‡ฐ flag: Falkland Islands +๐Ÿ‡ซ๐Ÿ‡ฒ flag: Micronesia +๐Ÿ‡ซ๐Ÿ‡ด flag: Faroe Islands +๐Ÿ‡ซ๐Ÿ‡ท flag: France +๐Ÿ‡ฌ๐Ÿ‡ฆ flag: Gabon +๐Ÿ‡ฌ๐Ÿ‡ง flag: United Kingdom +๐Ÿ‡ฌ๐Ÿ‡ฉ flag: Grenada +๐Ÿ‡ฌ๐Ÿ‡ช flag: Georgia +๐Ÿ‡ฌ๐Ÿ‡ซ flag: French Guiana +๐Ÿ‡ฌ๐Ÿ‡ฌ flag: Guernsey +๐Ÿ‡ฌ๐Ÿ‡ญ flag: Ghana +๐Ÿ‡ฌ๐Ÿ‡ฎ flag: Gibraltar +๐Ÿ‡ฌ๐Ÿ‡ฑ flag: Greenland +๐Ÿ‡ฌ๐Ÿ‡ฒ flag: Gambia +๐Ÿ‡ฌ๐Ÿ‡ณ flag: Guinea +๐Ÿ‡ฌ๐Ÿ‡ต flag: Guadeloupe +๐Ÿ‡ฌ๐Ÿ‡ถ flag: Equatorial Guinea +๐Ÿ‡ฌ๐Ÿ‡ท flag: Greece +๐Ÿ‡ฌ๐Ÿ‡ธ flag: South Georgia & South Sandwich Islands +๐Ÿ‡ฌ๐Ÿ‡น flag: Guatemala +๐Ÿ‡ฌ๐Ÿ‡บ flag: Guam +๐Ÿ‡ฌ๐Ÿ‡ผ flag: Guinea-Bissau +๐Ÿ‡ฌ๐Ÿ‡พ flag: Guyana +๐Ÿ‡ญ๐Ÿ‡ฐ flag: Hong Kong SAR China +๐Ÿ‡ญ๐Ÿ‡ฒ flag: Heard & McDonald Islands +๐Ÿ‡ญ๐Ÿ‡ณ flag: Honduras +๐Ÿ‡ญ๐Ÿ‡ท flag: Croatia +๐Ÿ‡ญ๐Ÿ‡น flag: Haiti +๐Ÿ‡ญ๐Ÿ‡บ flag: Hungary +๐Ÿ‡ฎ๐Ÿ‡จ flag: Canary Islands +๐Ÿ‡ฎ๐Ÿ‡ฉ flag: Indonesia +๐Ÿ‡ฎ๐Ÿ‡ช flag: Ireland +๐Ÿ‡ฎ๐Ÿ‡ฑ flag: Israel +๐Ÿ‡ฎ๐Ÿ‡ฒ flag: Isle of Man +๐Ÿ‡ฎ๐Ÿ‡ณ flag: India +๐Ÿ‡ฎ๐Ÿ‡ด flag: British Indian Ocean Territory +๐Ÿ‡ฎ๐Ÿ‡ถ flag: Iraq +๐Ÿ‡ฎ๐Ÿ‡ท flag: Iran +๐Ÿ‡ฎ๐Ÿ‡ธ flag: Iceland +๐Ÿ‡ฎ๐Ÿ‡น flag: Italy +๐Ÿ‡ฏ๐Ÿ‡ช flag: Jersey +๐Ÿ‡ฏ๐Ÿ‡ฒ flag: Jamaica +๐Ÿ‡ฏ๐Ÿ‡ด flag: Jordan +๐Ÿ‡ฏ๐Ÿ‡ต flag: Japan +๐Ÿ‡ฐ๐Ÿ‡ช flag: Kenya +๐Ÿ‡ฐ๐Ÿ‡ฌ flag: Kyrgyzstan +๐Ÿ‡ฐ๐Ÿ‡ญ flag: Cambodia +๐Ÿ‡ฐ๐Ÿ‡ฎ flag: Kiribati +๐Ÿ‡ฐ๐Ÿ‡ฒ flag: Comoros +๐Ÿ‡ฐ๐Ÿ‡ณ flag: St. Kitts & Nevis +๐Ÿ‡ฐ๐Ÿ‡ต flag: North Korea +๐Ÿ‡ฐ๐Ÿ‡ท flag: South Korea +๐Ÿ‡ฐ๐Ÿ‡ผ flag: Kuwait +๐Ÿ‡ฐ๐Ÿ‡พ flag: Cayman Islands +๐Ÿ‡ฐ๐Ÿ‡ฟ flag: Kazakhstan +๐Ÿ‡ฑ๐Ÿ‡ฆ flag: Laos +๐Ÿ‡ฑ๐Ÿ‡ง flag: Lebanon +๐Ÿ‡ฑ๐Ÿ‡จ flag: St. Lucia +๐Ÿ‡ฑ๐Ÿ‡ฎ flag: Liechtenstein +๐Ÿ‡ฑ๐Ÿ‡ฐ flag: Sri Lanka +๐Ÿ‡ฑ๐Ÿ‡ท flag: Liberia +๐Ÿ‡ฑ๐Ÿ‡ธ flag: Lesotho +๐Ÿ‡ฑ๐Ÿ‡น flag: Lithuania +๐Ÿ‡ฑ๐Ÿ‡บ flag: Luxembourg +๐Ÿ‡ฑ๐Ÿ‡ป flag: Latvia +๐Ÿ‡ฑ๐Ÿ‡พ flag: Libya +๐Ÿ‡ฒ๐Ÿ‡ฆ flag: Morocco +๐Ÿ‡ฒ๐Ÿ‡จ flag: Monaco +๐Ÿ‡ฒ๐Ÿ‡ฉ flag: Moldova +๐Ÿ‡ฒ๐Ÿ‡ช flag: Montenegro +๐Ÿ‡ฒ๐Ÿ‡ซ flag: St. Martin +๐Ÿ‡ฒ๐Ÿ‡ฌ flag: Madagascar +๐Ÿ‡ฒ๐Ÿ‡ญ flag: Marshall Islands +๐Ÿ‡ฒ๐Ÿ‡ฐ flag: North Macedonia +๐Ÿ‡ฒ๐Ÿ‡ฑ flag: Mali +๐Ÿ‡ฒ๐Ÿ‡ฒ flag: Myanmar (Burma) +๐Ÿ‡ฒ๐Ÿ‡ณ flag: Mongolia +๐Ÿ‡ฒ๐Ÿ‡ด flag: Macao SAR China +๐Ÿ‡ฒ๐Ÿ‡ต flag: Northern Mariana Islands +๐Ÿ‡ฒ๐Ÿ‡ถ flag: Martinique +๐Ÿ‡ฒ๐Ÿ‡ท flag: Mauritania +๐Ÿ‡ฒ๐Ÿ‡ธ flag: Montserrat +๐Ÿ‡ฒ๐Ÿ‡น flag: Malta +๐Ÿ‡ฒ๐Ÿ‡บ flag: Mauritius +๐Ÿ‡ฒ๐Ÿ‡ป flag: Maldives +๐Ÿ‡ฒ๐Ÿ‡ผ flag: Malawi +๐Ÿ‡ฒ๐Ÿ‡ฝ flag: Mexico +๐Ÿ‡ฒ๐Ÿ‡พ flag: Malaysia +๐Ÿ‡ฒ๐Ÿ‡ฟ flag: Mozambique +๐Ÿ‡ณ๐Ÿ‡ฆ flag: Namibia +๐Ÿ‡ณ๐Ÿ‡จ flag: New Caledonia +๐Ÿ‡ณ๐Ÿ‡ช flag: Niger +๐Ÿ‡ณ๐Ÿ‡ซ flag: Norfolk Island +๐Ÿ‡ณ๐Ÿ‡ฌ flag: Nigeria +๐Ÿ‡ณ๐Ÿ‡ฎ flag: Nicaragua +๐Ÿ‡ณ๐Ÿ‡ฑ flag: Netherlands +๐Ÿ‡ณ๐Ÿ‡ด flag: Norway +๐Ÿ‡ณ๐Ÿ‡ต flag: Nepal +๐Ÿ‡ณ๐Ÿ‡ท flag: Nauru +๐Ÿ‡ณ๐Ÿ‡บ flag: Niue +๐Ÿ‡ณ๐Ÿ‡ฟ flag: New Zealand +๐Ÿ‡ด๐Ÿ‡ฒ flag: Oman +๐Ÿ‡ต๐Ÿ‡ฆ flag: Panama +๐Ÿ‡ต๐Ÿ‡ช flag: Peru +๐Ÿ‡ต๐Ÿ‡ซ flag: French Polynesia +๐Ÿ‡ต๐Ÿ‡ฌ flag: Papua New Guinea +๐Ÿ‡ต๐Ÿ‡ญ flag: Philippines +๐Ÿ‡ต๐Ÿ‡ฐ flag: Pakistan +๐Ÿ‡ต๐Ÿ‡ฑ flag: Poland +๐Ÿ‡ต๐Ÿ‡ฒ flag: St. Pierre & Miquelon +๐Ÿ‡ต๐Ÿ‡ณ flag: Pitcairn Islands +๐Ÿ‡ต๐Ÿ‡ท flag: Puerto Rico +๐Ÿ‡ต๐Ÿ‡ธ flag: Palestinian Territories +๐Ÿ‡ต๐Ÿ‡น flag: Portugal +๐Ÿ‡ต๐Ÿ‡ผ flag: Palau +๐Ÿ‡ต๐Ÿ‡พ flag: Paraguay +๐Ÿ‡ถ๐Ÿ‡ฆ flag: Qatar +๐Ÿ‡ท๐Ÿ‡ช flag: Rรฉunion +๐Ÿ‡ท๐Ÿ‡ด flag: Romania +๐Ÿ‡ท๐Ÿ‡ธ flag: Serbia +๐Ÿ‡ท๐Ÿ‡บ flag: Russia +๐Ÿ‡ท๐Ÿ‡ผ flag: Rwanda +๐Ÿ‡ธ๐Ÿ‡ฆ flag: Saudi Arabia +๐Ÿ‡ธ๐Ÿ‡ง flag: Solomon Islands +๐Ÿ‡ธ๐Ÿ‡จ flag: Seychelles +๐Ÿ‡ธ๐Ÿ‡ฉ flag: Sudan +๐Ÿ‡ธ๐Ÿ‡ช flag: Sweden +๐Ÿ‡ธ๐Ÿ‡ฌ flag: Singapore +๐Ÿ‡ธ๐Ÿ‡ญ flag: St. Helena +๐Ÿ‡ธ๐Ÿ‡ฎ flag: Slovenia +๐Ÿ‡ธ๐Ÿ‡ฏ flag: Svalbard & Jan Mayen +๐Ÿ‡ธ๐Ÿ‡ฐ flag: Slovakia +๐Ÿ‡ธ๐Ÿ‡ฑ flag: Sierra Leone +๐Ÿ‡ธ๐Ÿ‡ฒ flag: San Marino +๐Ÿ‡ธ๐Ÿ‡ณ flag: Senegal +๐Ÿ‡ธ๐Ÿ‡ด flag: Somalia +๐Ÿ‡ธ๐Ÿ‡ท flag: Suriname +๐Ÿ‡ธ๐Ÿ‡ธ flag: South Sudan +๐Ÿ‡ธ๐Ÿ‡น flag: Sรฃo Tomรฉ & Prรญncipe +๐Ÿ‡ธ๐Ÿ‡ป flag: El Salvador +๐Ÿ‡ธ๐Ÿ‡ฝ flag: Sint Maarten +๐Ÿ‡ธ๐Ÿ‡พ flag: Syria +๐Ÿ‡ธ๐Ÿ‡ฟ flag: Eswatini +๐Ÿ‡น๐Ÿ‡ฆ flag: Tristan da Cunha +๐Ÿ‡น๐Ÿ‡จ flag: Turks & Caicos Islands +๐Ÿ‡น๐Ÿ‡ฉ flag: Chad +๐Ÿ‡น๐Ÿ‡ซ flag: French Southern Territories +๐Ÿ‡น๐Ÿ‡ฌ flag: Togo +๐Ÿ‡น๐Ÿ‡ญ flag: Thailand +๐Ÿ‡น๐Ÿ‡ฏ flag: Tajikistan +๐Ÿ‡น๐Ÿ‡ฐ flag: Tokelau +๐Ÿ‡น๐Ÿ‡ฑ flag: Timor-Leste +๐Ÿ‡น๐Ÿ‡ฒ flag: Turkmenistan +๐Ÿ‡น๐Ÿ‡ณ flag: Tunisia +๐Ÿ‡น๐Ÿ‡ด flag: Tonga +๐Ÿ‡น๐Ÿ‡ท flag: Turkey +๐Ÿ‡น๐Ÿ‡น flag: Trinidad & Tobago +๐Ÿ‡น๐Ÿ‡ป flag: Tuvalu +๐Ÿ‡น๐Ÿ‡ผ flag: Taiwan +๐Ÿ‡น๐Ÿ‡ฟ flag: Tanzania +๐Ÿ‡บ๐Ÿ‡ฆ flag: Ukraine +๐Ÿ‡บ๐Ÿ‡ฌ flag: Uganda +๐Ÿ‡บ๐Ÿ‡ฒ flag: U.S. Outlying Islands +๐Ÿ‡บ๐Ÿ‡ณ flag: United Nations +๐Ÿ‡บ๐Ÿ‡ธ flag: United States +๐Ÿ‡บ๐Ÿ‡พ flag: Uruguay +๐Ÿ‡บ๐Ÿ‡ฟ flag: Uzbekistan +๐Ÿ‡ป๐Ÿ‡ฆ flag: Vatican City +๐Ÿ‡ป๐Ÿ‡จ flag: St. Vincent & Grenadines +๐Ÿ‡ป๐Ÿ‡ช flag: Venezuela +๐Ÿ‡ป๐Ÿ‡ฌ flag: British Virgin Islands +๐Ÿ‡ป๐Ÿ‡ฎ flag: U.S. Virgin Islands +๐Ÿ‡ป๐Ÿ‡ณ flag: Vietnam +๐Ÿ‡ป๐Ÿ‡บ flag: Vanuatu +๐Ÿ‡ผ๐Ÿ‡ซ flag: Wallis & Futuna +๐Ÿ‡ผ๐Ÿ‡ธ flag: Samoa +๐Ÿ‡ฝ๐Ÿ‡ฐ flag: Kosovo +๐Ÿ‡พ๐Ÿ‡ช flag: Yemen +๐Ÿ‡พ๐Ÿ‡น flag: Mayotte +๐Ÿ‡ฟ๐Ÿ‡ฆ flag: South Africa +๐Ÿ‡ฟ๐Ÿ‡ฒ flag: Zambia +๐Ÿ‡ฟ๐Ÿ‡ผ flag: Zimbabwe +๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ flag: England +๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ flag: Scotland +๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ flag: Wales diff --git a/.local/share/larbs/chars/font-awesome b/.local/share/larbs/chars/font-awesome new file mode 100644 index 00000000..3283be3d --- /dev/null +++ b/.local/share/larbs/chars/font-awesome @@ -0,0 +1,1456 @@ +๏‰ฎ 500px; f26e +๏จ accessible-icon; f368 +๏ฉ accusoft; f369 +๏šฏ acquisitions-incorporated; f6af +๏™ ad; f641 +๏Šน address-book; f2b9 +๏Šป address-card; f2bb +๏‚ adjust; f042 +๏…ฐ adn; f170 +๏ช adversal; f36a +๏ซ affiliatetheme; f36b +๏— air-freshener; f5d0 +๏ ด airbnb; f834 +๏ฌ algolia; f36c +๏€ท align-center; f037 +๏€น align-justify; f039 +๏€ถ align-left; f036 +๏€ธ align-right; f038 +๏™‚ alipay; f642 +๏‘ก allergies; f461 +๏‰ฐ amazon; f270 +๏ฌ amazon-pay; f42c +๏ƒน ambulance; f0f9 +๏Šฃ american-sign-language-interpreting; f2a3 +๏ญ amilia; f36d +๏„ฝ anchor; f13d +๏…ป android; f17b +๏ˆ‰ angellist; f209 +๏„ƒ angle-double-down; f103 +๏„€ angle-double-left; f100 +๏„ angle-double-right; f101 +๏„‚ angle-double-up; f102 +๏„‡ angle-down; f107 +๏„„ angle-left; f104 +๏„… angle-right; f105 +๏„† angle-up; f106 +๏•– angry; f556 +๏ฎ angrycreative; f36e +๏  angular; f420 +๏™„ ankh; f644 +๏ฏ app-store; f36f +๏ฐ app-store-ios; f370 +๏ฑ apper; f371 +๏…น apple; f179 +๏—‘ apple-alt; f5d1 +๏• apple-pay; f415 +๏†‡ archive; f187 +๏•— archway; f557 +๏˜ arrow-alt-circle-down; f358 +๏™ arrow-alt-circle-left; f359 +๏š arrow-alt-circle-right; f35a +๏› arrow-alt-circle-up; f35b +๏‚ซ arrow-circle-down; f0ab +๏‚จ arrow-circle-left; f0a8 +๏‚ฉ arrow-circle-right; f0a9 +๏‚ช arrow-circle-up; f0aa +๏ฃ arrow-down; f063 +๏  arrow-left; f060 +๏ก arrow-right; f061 +๏ข arrow-up; f062 +๏‚ฒ arrows-alt; f0b2 +๏Œท arrows-alt-h; f337 +๏Œธ arrows-alt-v; f338 +๏บ artstation; f77a +๏Šข assistive-listening-systems; f2a2 +๏ฉ asterisk; f069 +๏ฒ asymmetrik; f372 +๏‡บ at; f1fa +๏•˜ atlas; f558 +๏ป atlassian; f77b +๏—’ atom; f5d2 +๏ณ audible; f373 +๏Šž audio-description; f29e +๏œ autoprefixer; f41c +๏ด avianex; f374 +๏ก aviato; f421 +๏•™ award; f559 +๏ต aws; f375 +๏ผ baby; f77c +๏ฝ baby-carriage; f77d +๏•š backspace; f55a +๏Š backward; f04a +๏Ÿฅ bacon; f7e5 +๎™ bacteria e059 +๎š bacterium e05a +๏™ฆ bahai; f666 +๏‰Ž balance-scale; f24e +๏”• balance-scale-left; f515 +๏”– balance-scale-right; f516 +๏ž ban; f05e +๏‘ข band-aid; f462 +๏‹• bandcamp; f2d5 +๏€ช barcode; f02a +๏ƒ‰ bars; f0c9 +๏ณ baseball-ball; f433 +๏ด basketball-ball; f434 +๏‹ bath; f2cd +๏‰„ battery-empty; f244 +๏‰€ battery-full; f240 +๏‰‚ battery-half; f242 +๏‰ƒ battery-quarter; f243 +๏‰ battery-three-quarters; f241 +๏ ต battle-net; f835 +๏ˆถ bed; f236 +๏ƒผ beer; f0fc +๏†ด behance; f1b4 +๏†ต behance-square; f1b5 +๏ƒณ bell; f0f3 +๏‡ถ bell-slash; f1f6 +๏•› bezier-curve; f55b +๏™‡ bible; f647 +๏ˆ† bicycle; f206 +๏กŠ biking; f84a +๏ธ bimobject; f378 +๏‡ฅ binoculars; f1e5 +๏ž€ biohazard; f780 +๏‡ฝ birthday-cake; f1fd +๏…ฑ bitbucket; f171 +๏น bitcoin; f379 +๏บ bity; f37a +๏‰พ black-tie; f27e +๏ป blackberry; f37b +๏”— blender; f517 +๏šถ blender-phone; f6b6 +๏Š blind; f29d +๏ž blog; f781 +๏ผ blogger; f37c +๏ฝ blogger-b; f37d +๏Š“ bluetooth; f293 +๏Š” bluetooth-b; f294 +๏€ฒ bold; f032 +๏ƒง bolt; f0e7 +๏‡ข bomb; f1e2 +๏—— bone; f5d7 +๏•œ bong; f55c +๏€ญ book; f02d +๏šท book-dead; f6b7 +๏Ÿฆ book-medical; f7e6 +๏”˜ book-open; f518 +๏—š book-reader; f5da +๏€ฎ bookmark; f02e +๏ ถ bootstrap; f836 +๏กŒ border-all; f84c +๏ก border-none; f850 +๏ก“ border-style; f853 +๏ถ bowling-ball; f436 +๏‘ฆ box; f466 +๏’ž box-open; f49e +๎› box-tissue e05b +๏‘จ boxes; f468 +๏Šก braille; f2a1 +๏—œ brain; f5dc +๏Ÿฌ bread-slice; f7ec +๏‚ฑ briefcase; f0b1 +๏‘ฉ briefcase-medical; f469 +๏”™ broadcast-tower; f519 +๏”š broom; f51a +๏• brush; f55d +๏…š btc; f15a +๏ ท buffer; f837 +๏†ˆ bug; f188 +๏†ญ building; f1ad +๏‚ก bullhorn; f0a1 +๏…€ bullseye; f140 +๏‘ช burn; f46a +๏ฟ buromobelexperte; f37f +๏ˆ‡ bus; f207 +๏•ž bus-alt; f55e +๏™Š business-time; f64a +๏ขฆ buy-n-large; f8a6 +๏‡ฌ calculator; f1ec +๏„ณ calendar; f133 +๏ณ calendar-alt; f073 +๏‰ด calendar-check; f274 +๏žƒ calendar-day; f783 +๏‰ฒ calendar-minus; f272 +๏‰ฑ calendar-plus; f271 +๏‰ณ calendar-times; f273 +๏ž„ calendar-week; f784 +๏€ฐ camera; f030 +๏‚ƒ camera-retro; f083 +๏šป campground; f6bb +๏ž… canadian-maple-leaf; f785 +๏ž† candy-cane; f786 +๏•Ÿ cannabis; f55f +๏‘ซ capsules; f46b +๏†น car; f1b9 +๏—ž car-alt; f5de +๏—Ÿ car-battery; f5df +๏—ก car-crash; f5e1 +๏—ค car-side; f5e4 +๏ฃฟ caravan; f8ff +๏ƒ— caret-down; f0d7 +๏ƒ™ caret-left; f0d9 +๏ƒš caret-right; f0da +๏… caret-square-down; f150 +๏†‘ caret-square-left; f191 +๏…’ caret-square-right; f152 +๏…‘ caret-square-up; f151 +๏ƒ˜ caret-up; f0d8 +๏ž‡ carrot; f787 +๏ˆ˜ cart-arrow-down; f218 +๏ˆ— cart-plus; f217 +๏žˆ cash-register; f788 +๏šพ cat; f6be +๏ญ cc-amazon-pay; f42d +๏‡ณ cc-amex; f1f3 +๏– cc-apple-pay; f416 +๏‰Œ cc-diners-club; f24c +๏‡ฒ cc-discover; f1f2 +๏‰‹ cc-jcb; f24b +๏‡ฑ cc-mastercard; f1f1 +๏‡ด cc-paypal; f1f4 +๏‡ต cc-stripe; f1f5 +๏‡ฐ cc-visa; f1f0 +๏Ž€ centercode; f380 +๏ž‰ centos; f789 +๏‚ฃ certificate; f0a3 +๏›€ chair; f6c0 +๏”› chalkboard; f51b +๏”œ chalkboard-teacher; f51c +๏—ง charging-station; f5e7 +๏‡พ chart-area; f1fe +๏‚€ chart-bar; f080 +๏ˆ chart-line; f201 +๏ˆ€ chart-pie; f200 +๏€Œ check; f00c +๏˜ check-circle; f058 +๏•  check-double; f560 +๏…Š check-square; f14a +๏Ÿฏ cheese; f7ef +๏น chess; f439 +๏บ chess-bishop; f43a +๏ผ chess-board; f43c +๏ฟ chess-king; f43f +๏‘ chess-knight; f441 +๏‘ƒ chess-pawn; f443 +๏‘… chess-queen; f445 +๏‘‡ chess-rook; f447 +๏„บ chevron-circle-down; f13a +๏„ท chevron-circle-left; f137 +๏„ธ chevron-circle-right; f138 +๏„น chevron-circle-up; f139 +๏ธ chevron-down; f078 +๏“ chevron-left; f053 +๏” chevron-right; f054 +๏ท chevron-up; f077 +๏†ฎ child; f1ae +๏‰จ chrome; f268 +๏ ธ chromecast; f838 +๏” church; f51d +๏„‘ circle; f111 +๏‡Ž circle-notch; f1ce +๏™ city; f64f +๏Ÿฒ clinic-medical; f7f2 +๏Œจ clipboard; f328 +๏‘ฌ clipboard-check; f46c +๏‘ญ clipboard-list; f46d +๏€— clock; f017 +๏‰ clone; f24d +๏ˆŠ closed-captioning; f20a +๏ƒ‚ cloud; f0c2 +๏ށ cloud-download-alt; f381 +๏œป cloud-meatball; f73b +๏›ƒ cloud-moon; f6c3 +๏œผ cloud-moon-rain; f73c +๏œฝ cloud-rain; f73d +๏€ cloud-showers-heavy; f740 +๏›„ cloud-sun; f6c4 +๏ƒ cloud-sun-rain; f743 +๏Ž‚ cloud-upload-alt; f382 +๎ฝ cloudflare e07d +๏Žƒ cloudscale; f383 +๏Ž„ cloudsmith; f384 +๏Ž… cloudversify; f385 +๏•ก cocktail; f561 +๏„ก code; f121 +๏„ฆ code-branch; f126 +๏‡‹ codepen; f1cb +๏Š„ codiepie; f284 +๏ƒด coffee; f0f4 +๏€“ cog; f013 +๏‚… cogs; f085 +๏”ž coins; f51e +๏ƒ› columns; f0db +๏ต comment; f075 +๏‰บ comment-alt; f27a +๏™‘ comment-dollar; f651 +๏’ญ comment-dots; f4ad +๏Ÿต comment-medical; f7f5 +๏’ณ comment-slash; f4b3 +๏‚† comments; f086 +๏™“ comments-dollar; f653 +๏”Ÿ compact-disc; f51f +๏…Ž compass; f14e +๏ฆ compress; f066 +๏ข compress-alt; f422 +๏žŒ compress-arrows-alt; f78c +๏•ข concierge-bell; f562 +๏ž confluence; f78d +๏ˆŽ connectdevelop; f20e +๏‰ญ contao; f26d +๏•ฃ cookie; f563 +๏•ค cookie-bite; f564 +๏ƒ… copy; f0c5 +๏‡น copyright; f1f9 +๏ขž cotton-bureau; f89e +๏’ธ couch; f4b8 +๏Žˆ cpanel; f388 +๏‰ž creative-commons; f25e +๏“ง creative-commons-by; f4e7 +๏“จ creative-commons-nc; f4e8 +๏“ฉ creative-commons-nc-eu; f4e9 +๏“ช creative-commons-nc-jp; f4ea +๏“ซ creative-commons-nd; f4eb +๏“ฌ creative-commons-pd; f4ec +๏“ญ creative-commons-pd-alt; f4ed +๏“ฎ creative-commons-remix; f4ee +๏“ฏ creative-commons-sa; f4ef +๏“ฐ creative-commons-sampling; f4f0 +๏“ฑ creative-commons-sampling-plus; f4f1 +๏“ฒ creative-commons-share; f4f2 +๏“ณ creative-commons-zero; f4f3 +๏‚ credit-card; f09d +๏›‰ critical-role; f6c9 +๏„ฅ crop; f125 +๏•ฅ crop-alt; f565 +๏™” cross; f654 +๏› crosshairs; f05b +๏”  crow; f520 +๏”ก crown; f521 +๏Ÿท crutch; f7f7 +๏„ผ css3; f13c +๏Ž‹ css3-alt; f38b +๏†ฒ cube; f1b2 +๏†ณ cubes; f1b3 +๏ƒ„ cut; f0c4 +๏ŽŒ cuttlefish; f38c +๏Ž d-and-d; f38d +๏›Š d-and-d-beyond; f6ca +๎’ dailymotion e052 +๏ˆ dashcube; f210 +๏‡€ database; f1c0 +๏Šค deaf; f2a4 +๎ท deezer e077 +๏†ฅ delicious; f1a5 +๏‡ democrat; f747 +๏ŽŽ deploydog; f38e +๏Ž deskpro; f38f +๏„ˆ desktop; f108 +๏›Œ dev; f6cc +๏†ฝ deviantart; f1bd +๏™• dharmachakra; f655 +๏ž dhl; f790 +๏‘ฐ diagnoses; f470 +๏ž‘ diaspora; f791 +๏”ข dice; f522 +๏› dice-d20; f6cf +๏›‘ dice-d6; f6d1 +๏”ฃ dice-five; f523 +๏”ค dice-four; f524 +๏”ฅ dice-one; f525 +๏”ฆ dice-six; f526 +๏”ง dice-three; f527 +๏”จ dice-two; f528 +๏†ฆ digg; f1a6 +๏Ž‘ digital-ocean; f391 +๏•ฆ digital-tachograph; f566 +๏—ซ directions; f5eb +๏Ž’ discord; f392 +๏Ž“ discourse; f393 +๏Ÿบ disease; f7fa +๏”ฉ divide; f529 +๏•ง dizzy; f567 +๏‘ฑ dna; f471 +๏Ž” dochub; f394 +๏Ž• docker; f395 +๏›“ dog; f6d3 +๏…• dollar-sign; f155 +๏‘ฒ dolly; f472 +๏‘ด dolly-flatbed; f474 +๏’น donate; f4b9 +๏”ช door-closed; f52a +๏”ซ door-open; f52b +๏†’ dot-circle; f192 +๏’บ dove; f4ba +๏€™ download; f019 +๏Ž– draft2digital; f396 +๏•จ drafting-compass; f568 +๏›• dragon; f6d5 +๏—ฎ draw-polygon; f5ee +๏…ฝ dribbble; f17d +๏Ž— dribbble-square; f397 +๏…ซ dropbox; f16b +๏•ฉ drum; f569 +๏•ช drum-steelpan; f56a +๏›— drumstick-bite; f6d7 +๏†ฉ drupal; f1a9 +๏‘‹ dumbbell; f44b +๏ž“ dumpster; f793 +๏ž” dumpster-fire; f794 +๏›™ dungeon; f6d9 +๏Ž™ dyalog; f399 +๏Žš earlybirds; f39a +๏“ด ebay; f4f4 +๏Š‚ edge; f282 +๎ธ edge-legacy e078 +๏„ edit; f044 +๏Ÿป egg; f7fb +๏’ eject; f052 +๏ฐ elementor; f430 +๏… ellipsis-h; f141 +๏…‚ ellipsis-v; f142 +๏—ฑ ello; f5f1 +๏ฃ ember; f423 +๏‡‘ empire; f1d1 +๏ƒ  envelope; f0e0 +๏Šถ envelope-open; f2b6 +๏™˜ envelope-open-text; f658 +๏†™ envelope-square; f199 +๏Š™ envira; f299 +๏”ฌ equals; f52c +๏„ญ eraser; f12d +๏Ž erlang; f39d +๏ฎ ethereum; f42e +๏ž– ethernet; f796 +๏‹— etsy; f2d7 +๏…“ euro-sign; f153 +๏ น evernote; f839 +๏ข exchange-alt; f362 +๏„ช exclamation; f12a +๏ช exclamation-circle; f06a +๏ฑ exclamation-triangle; f071 +๏ฅ expand; f065 +๏ค expand-alt; f424 +๏Œž expand-arrows-alt; f31e +๏ˆพ expeditedssl; f23e +๏ external-link-alt; f35d +๏  external-link-square-alt; f360 +๏ฎ eye; f06e +๏‡ป eye-dropper; f1fb +๏ฐ eye-slash; f070 +๏‚š ; facebook; f09a +๏Žž ; facebook-f; f39e +๏ŽŸ ; facebook-messenger; f39f +๏‚‚ ; facebook-square; f082 +๏กฃ ; fan; f863 +๏›œ ; fantasy-flight-games; f6dc +๏‰ ; fast-backward; f049 +๏ ; fast-forward; f050 +๎€… ; faucet e005 +๏†ฌ ; fax; f1ac +๏”ญ ; feather; f52d +๏•ซ ; feather-alt; f56b +๏ž— ; fedex; f797 +๏ž˜ ; fedora; f798 +๏†‚ ; female; f182 +๏ƒป ; fighter-jet; f0fb +๏ž™ ; figma; f799 +๏…› ; file; f15b +๏…œ ; file-alt; f15c +๏‡† ; file-archive; f1c6 +๏‡‡ ; file-audio; f1c7 +๏‡‰ ; file-code; f1c9 +๏•ฌ ; file-contract; f56c +๏› ; file-csv; f6dd +๏•ญ ; file-download; f56d +๏‡ƒ ; file-excel; f1c3 +๏•ฎ ; file-export; f56e +๏‡… ; file-image; f1c5 +๏•ฏ ; file-import; f56f +๏•ฐ ; file-invoice; f570 +๏•ฑ ; file-invoice-dollar; f571 +๏‘ท ; file-medical; f477 +๏‘ธ ; file-medical-alt; f478 +๏‡ ; file-pdf; f1c1 +๏‡„ ; file-powerpoint; f1c4 +๏•ฒ ; file-prescription; f572 +๏•ณ ; file-signature; f573 +๏•ด ; file-upload; f574 +๏‡ˆ ; file-video; f1c8 +๏‡‚ ; file-word; f1c2 +๏•ต ; fill; f575 +๏•ถ ; fill-drip; f576 +๏€ˆ ; film; f008 +๏‚ฐ ; filter; f0b0 +๏•ท ; fingerprint; f577 +๏ญ ; fire; f06d +๏Ÿค ; fire-alt; f7e4 +๏„ด ; fire-extinguisher; f134 +๏‰ฉ ; firefox; f269 +๎€‡ ; firefox-browser e007 +๏‘น ; first-aid; f479 +๏Šฐ ; first-order; f2b0 +๏”Š ; first-order-alt; f50a +๏Žก ; firstdraft; f3a1 +๏•ธ ; fish; f578 +๏›ž ; fist-raised; f6de +๏€ค ; flag; f024 +๏„ž ; flag-checkered; f11e +๏ ; flag-usa; f74d +๏ƒƒ ; flask; f0c3 +๏…ฎ ; flickr; f16e +๏‘ ; flipboard; f44d +๏•น ; flushed; f579 +๏— ; fly; f417 +๏ป ; folder; f07b +๏™ ; folder-minus; f65d +๏ผ ; folder-open; f07c +๏™ž ; folder-plus; f65e +๏€ฑ ; font; f031 +๏Šด ; font-awesome; f2b4 +๏œ ; font-awesome-alt; f35c +๏ฅ ; font-awesome-flag; f425 +๏Š€ ; fonticons; f280 +๏Žข ; fonticons-fi; f3a2 +๏‘Ž ; football-ball; f44e +๏І ; fort-awesome; f286 +๏Žฃ ; fort-awesome-alt; f3a3 +๏ˆ‘ ; forumbee; f211 +๏Ž ; forward; f04e +๏†€ ; foursquare; f180 +๏‹… ; free-code-camp; f2c5 +๏Žค ; freebsd; f3a4 +๏”ฎ ; frog; f52e +๏„™ ; frown; f119 +๏•บ ; frown-open; f57a +๏”‹ ; fulcrum; f50b +๏™ข ; funnel-dollar; f662 +๏‡ฃ ; futbol; f1e3 +๏”Œ galactic-republic; f50c +๏” galactic-senate; f50d +๏„› gamepad; f11b +๏”ฏ gas-pump; f52f +๏ƒฃ gavel; f0e3 +๏Žฅ gem; f3a5 +๏ˆญ genderless; f22d +๏‰ฅ get-pocket; f265 +๏‰  gg; f260 +๏‰ก gg-circle; f261 +๏›ข ghost; f6e2 +๏ซ gift; f06b +๏žœ gifts; f79c +๏‡“ git; f1d3 +๏ก git-alt; f841 +๏‡’ git-square; f1d2 +๏‚› github; f09b +๏„“ github-alt; f113 +๏‚’ github-square; f092 +๏Žฆ gitkraken; f3a6 +๏Š– gitlab; f296 +๏ฆ gitter; f426 +๏žŸ glass-cheers; f79f +๏€€ glass-martini; f000 +๏•ป glass-martini-alt; f57b +๏ž  glass-whiskey; f7a0 +๏”ฐ glasses; f530 +๏Šฅ glide; f2a5 +๏Šฆ glide-g; f2a6 +๏‚ฌ globe; f0ac +๏•ผ globe-africa; f57c +๏•ฝ globe-americas; f57d +๏•พ globe-asia; f57e +๏žข globe-europe; f7a2 +๏Žง gofore; f3a7 +๏‘ golf-ball; f450 +๏Žจ goodreads; f3a8 +๏Žฉ goodreads-g; f3a9 +๏†  google; f1a0 +๏Žช google-drive; f3aa +๎น google-pay e079 +๏Žซ google-play; f3ab +๏Šณ google-plus; f2b3 +๏ƒ• google-plus-g; f0d5 +๏ƒ” google-plus-square; f0d4 +๏‡ฎ google-wallet; f1ee +๏™ค gopuram; f664 +๏† graduation-cap; f19d +๏†„ gratipay; f184 +๏‹– grav; f2d6 +๏”ฑ greater-than; f531 +๏”ฒ greater-than-equal; f532 +๏•ฟ grimace; f57f +๏–€ grin; f580 +๏– grin-alt; f581 +๏–‚ grin-beam; f582 +๏–ƒ grin-beam-sweat; f583 +๏–„ grin-hearts; f584 +๏–… grin-squint; f585 +๏–† grin-squint-tears; f586 +๏–‡ grin-stars; f587 +๏–ˆ grin-tears; f588 +๏–‰ grin-tongue; f589 +๏–Š grin-tongue-squint; f58a +๏–‹ grin-tongue-wink; f58b +๏–Œ grin-wink; f58c +๏– grip-horizontal; f58d +๏žค grip-lines; f7a4 +๏žฅ grip-lines-vertical; f7a5 +๏–Ž grip-vertical; f58e +๏Žฌ gripfire; f3ac +๏Žญ grunt; f3ad +๎พ guilded e07e +๏žฆ guitar; f7a6 +๏Žฎ gulp; f3ae +๏ƒฝ h-square; f0fd +๏‡” hacker-news; f1d4 +๏Žฏ hacker-news-square; f3af +๏—ท hackerrank; f5f7 +๏ … hamburger; f805 +๏›ฃ hammer; f6e3 +๏™ฅ hamsa; f665 +๏’ฝ hand-holding; f4bd +๏’พ hand-holding-heart; f4be +๎œ hand-holding-medical e05c +๏“€ hand-holding-usd; f4c0 +๏“ hand-holding-water; f4c1 +๏‰˜ hand-lizard; f258 +๏ † hand-middle-finger; f806 +๏‰– hand-paper; f256 +๏‰› hand-peace; f25b +๏‚ง hand-point-down; f0a7 +๏‚ฅ hand-point-left; f0a5 +๏‚ค hand-point-right; f0a4 +๏‚ฆ hand-point-up; f0a6 +๏‰š hand-pointer; f25a +๏‰• hand-rock; f255 +๏‰— hand-scissors; f257 +๎ hand-sparkles e05d +๏‰™ hand-spock; f259 +๏“‚ hands; f4c2 +๏“„ hands-helping; f4c4 +๎ž hands-wash e05e +๏Šต handshake; f2b5 +๎Ÿ handshake-alt-slash e05f +๎  handshake-slash e060 +๏›ฆ hanukiah; f6e6 +๏ ‡ hard-hat; f807 +๏Š’ hashtag; f292 +๏ฃ€ hat-cowboy; f8c0 +๏ฃ hat-cowboy-side; f8c1 +๏›จ hat-wizard; f6e8 +๏‚  hdd; f0a0 +๎ก head-side-cough e061 +๎ข head-side-cough-slash e062 +๎ฃ head-side-mask e063 +๎ค head-side-virus e064 +๏‡œ heading; f1dc +๏€ฅ headphones; f025 +๏– headphones-alt; f58f +๏– headset; f590 +๏€„ heart; f004 +๏žฉ heart-broken; f7a9 +๏ˆž heartbeat; f21e +๏”ณ helicopter; f533 +๏–‘ highlighter; f591 +๏›ฌ hiking; f6ec +๏›ญ hippo; f6ed +๏‘’ hips; f452 +๏Žฐ hire-a-helper; f3b0 +๏‡š history; f1da +๎ฟ hive e07f +๏‘“ hockey-puck; f453 +๏žช holly-berry; f7aa +๏€• home; f015 +๏ง hooli; f427 +๏–’ hornbill; f592 +๏›ฐ horse; f6f0 +๏žซ horse-head; f7ab +๏ƒธ hospital; f0f8 +๏‘ฝ hospital-alt; f47d +๏‘พ hospital-symbol; f47e +๏  hospital-user; f80d +๏–“ hot-tub; f593 +๏  hotdog; f80f +๏–” hotel; f594 +๏Žฑ hotjar; f3b1 +๏‰” hourglass; f254 +๏‰“ hourglass-end; f253 +๏‰’ hourglass-half; f252 +๏‰‘ hourglass-start; f251 +๏›ฑ house-damage; f6f1 +๎ฅ house-user e065 +๏‰ผ houzz; f27c +๏›ฒ hryvnia; f6f2 +๏„ป html5; f13b +๏Žฒ hubspot; f3b2 +๏‰† i-cursor; f246 +๏  ice-cream; f810 +๏žญ icicles; f7ad +๏กญ icons; f86d +๏‹ id-badge; f2c1 +๏‹‚ id-card; f2c2 +๏‘ฟ id-card-alt; f47f +๎€“ ideal e013 +๏žฎ igloo; f7ae +๏€พ image; f03e +๏Œ‚ images; f302 +๏‹˜ imdb; f2d8 +๏€œ inbox; f01c +๏€ผ indent; f03c +๏‰ต industry; f275 +๏”ด infinity; f534 +๏„ฉ info; f129 +๏š info-circle; f05a +๎‚€ innosoft e080 +๏…ญ instagram; f16d +๎• instagram-square e055 +๎‚ instalod e081 +๏žฏ intercom; f7af +๏‰ซ internet-explorer; f26b +๏žฐ invision; f7b0 +๏ˆˆ ioxhost; f208 +๏€ณ italic; f033 +๏ บ itch-io; f83a +๏Žด itunes; f3b4 +๏Žต itunes-note; f3b5 +๏“ค java; f4e4 +๏™ฉ jedi; f669 +๏”Ž jedi-order; f50e +๏Žถ jenkins; f3b6 +๏žฑ jira; f7b1 +๏Žท joget; f3b7 +๏–• joint; f595 +๏†ช joomla; f1aa +๏™ช journal-whills; f66a +๏Žธ js; f3b8 +๏Žน js-square; f3b9 +๏‡Œ jsfiddle; f1cc +๏™ซ kaaba; f66b +๏—บ kaggle; f5fa +๏‚„ key; f084 +๏“ต keybase; f4f5 +๏„œ keyboard; f11c +๏Žบ keycdn; f3ba +๏™ญ khanda; f66d +๏Žป kickstarter; f3bb +๏Žผ kickstarter-k; f3bc +๏–– kiss; f596 +๏–— kiss-beam; f597 +๏–˜ kiss-wink-heart; f598 +๏”ต kiwi-bird; f535 +๏ฏ korvue; f42f +๏™ฏ landmark; f66f +๏†ซ language; f1ab +๏„‰ laptop; f109 +๏—ผ laptop-code; f5fc +๎ฆ laptop-house e066 +๏ ’ laptop-medical; f812 +๏Žฝ laravel; f3bd +๏ˆ‚ lastfm; f202 +๏ˆƒ lastfm-square; f203 +๏–™ laugh; f599 +๏–š laugh-beam; f59a +๏–› laugh-squint; f59b +๏–œ laugh-wink; f59c +๏—ฝ layer-group; f5fd +๏ฌ leaf; f06c +๏ˆ’ leanpub; f212 +๏‚” lemon; f094 +๏ less; f41d +๏”ถ less-than; f536 +๏”ท less-than-equal; f537 +๏Žพ level-down-alt; f3be +๏Žฟ level-up-alt; f3bf +๏‡ life-ring; f1cd +๏ƒซ lightbulb; f0eb +๏€ line; f3c0 +๏ƒ link; f0c1 +๏‚Œ linkedin; f08c +๏ƒก linkedin-in; f0e1 +๏Šธ linode; f2b8 +๏…ผ linux; f17c +๏†• lira-sign; f195 +๏€บ list; f03a +๏€ข list-alt; f022 +๏ƒ‹ list-ol; f0cb +๏ƒŠ list-ul; f0ca +๏„ค location-arrow; f124 +๏€ฃ lock; f023 +๏ lock-open; f3c1 +๏Œ‰ long-arrow-alt-down; f309 +๏ŒŠ long-arrow-alt-left; f30a +๏Œ‹ long-arrow-alt-right; f30b +๏ŒŒ long-arrow-alt-up; f30c +๏Šจ low-vision; f2a8 +๏– luggage-cart; f59d +๏˜„ lungs; f604 +๎ง lungs-virus e067 +๏ƒ lyft; f3c3 +๏„ magento; f3c4 +๏ƒ magic; f0d0 +๏ถ magnet; f076 +๏™ด mail-bulk; f674 +๏–ž mailchimp; f59e +๏†ƒ male; f183 +๏” mandalorian; f50f +๏‰น map; f279 +๏–Ÿ map-marked; f59f +๏–  map-marked-alt; f5a0 +๏ map-marker; f041 +๏… map-marker-alt; f3c5 +๏‰ถ map-pin; f276 +๏‰ท map-signs; f277 +๏˜ markdown; f60f +๏–ก marker; f5a1 +๏ˆข mars; f222 +๏ˆง mars-double; f227 +๏ˆฉ mars-stroke; f229 +๏ˆซ mars-stroke-h; f22b +๏ˆช mars-stroke-v; f22a +๏›บ mask; f6fa +๏“ถ mastodon; f4f6 +๏„ถ maxcdn; f136 +๏ฃŠ mdb; f8ca +๏–ข medal; f5a2 +๏† medapps; f3c6 +๏ˆบ medium; f23a +๏‡ medium-m; f3c7 +๏ƒบ medkit; f0fa +๏ˆ medrt; f3c8 +๏‹  meetup; f2e0 +๏–ฃ megaport; f5a3 +๏„š meh; f11a +๏–ค meh-blank; f5a4 +๏–ฅ meh-rolling-eyes; f5a5 +๏”ธ memory; f538 +๏žณ mendeley; f7b3 +๏™ถ menorah; f676 +๏ˆฃ mercury; f223 +๏“ meteor; f753 +๎€š microblog e01a +๏‹› microchip; f2db +๏„ฐ microphone; f130 +๏‰ microphone-alt; f3c9 +๏”น microphone-alt-slash; f539 +๏„ฑ microphone-slash; f131 +๏˜ microscope; f610 +๏Š microsoft; f3ca +๏จ minus; f068 +๏– minus-circle; f056 +๏…† minus-square; f146 +๏žต mitten; f7b5 +๏‹ mix; f3cb +๏Љ mixcloud; f289 +๎– mixer e056 +๏Œ mizuni; f3cc +๏„‹ mobile; f10b +๏ mobile-alt; f3cd +๏Š… modx; f285 +๏ monero; f3d0 +๏ƒ– money-bill; f0d6 +๏‘ money-bill-alt; f3d1 +๏”บ money-bill-wave; f53a +๏”ป money-bill-wave-alt; f53b +๏”ผ money-check; f53c +๏”ฝ money-check-alt; f53d +๏–ฆ monument; f5a6 +๏†† moon; f186 +๏–ง mortar-pestle; f5a7 +๏™ธ mosque; f678 +๏ˆœ motorcycle; f21c +๏›ผ mountain; f6fc +๏ฃŒ mouse; f8cc +๏‰… mouse-pointer; f245 +๏žถ mug-hot; f7b6 +๏€ music; f001 +๏’ napster; f3d2 +๏˜’ neos; f612 +๏›ฟ network-wired; f6ff +๏ˆฌ neuter; f22c +๏‡ช newspaper; f1ea +๏–จ nimblr; f5a8 +๏™ node; f419 +๏“ node-js; f3d3 +๏”พ not-equal; f53e +๏’ notes-medical; f481 +๏” npm; f3d4 +๏• ns8; f3d5 +๏– nutritionix; f3d6 +๏‰‡ object-group; f247 +๏‰ˆ object-ungroup; f248 +๎‚‚ octopus-deploy e082 +๏‰ฃ odnoklassniki; f263 +๏‰ค odnoklassniki-square; f264 +๏˜“ oil-can; f613 +๏” old-republic; f510 +๏™น om; f679 +๏ˆฝ opencart; f23d +๏†› openid; f19b +๏‰ช opera; f26a +๏ˆผ optin-monster; f23c +๏ฃ’ orcid; f8d2 +๏š osi; f41a +๏œ€ otter; f700 +๏€ป outdent; f03b +๏— page4; f3d7 +๏†Œ pagelines; f18c +๏ • pager; f815 +๏‡ผ paint-brush; f1fc +๏–ช paint-roller; f5aa +๏”ฟ palette; f53f +๏˜ palfed; f3d8 +๏’‚ pallet; f482 +๏‡˜ paper-plane; f1d8 +๏ƒ† paperclip; f0c6 +๏“ parachute-box; f4cd +๏‡ paragraph; f1dd +๏•€ parking; f540 +๏–ซ passport; f5ab +๏™ป pastafarianism; f67b +๏ƒช paste; f0ea +๏™ patreon; f3d9 +๏Œ pause; f04c +๏Š‹ pause-circle; f28b +๏†ฐ paw; f1b0 +๏‡ญ paypal; f1ed +๏™ผ peace; f67c +๏Œ„ pen; f304 +๏Œ… pen-alt; f305 +๏–ฌ pen-fancy; f5ac +๏–ญ pen-nib; f5ad +๏…‹ pen-square; f14b +๏Œƒ pencil-alt; f303 +๏–ฎ pencil-ruler; f5ae +๏œ„ penny-arcade; f704 +๎จ people-arrows e068 +๏“Ž people-carry; f4ce +๏ – pepper-hot; f816 +๎‚ƒ perbyte e083 +๏Š• percent; f295 +๏• percentage; f541 +๏š periscope; f3da +๏– person-booth; f756 +๏› phabricator; f3db +๏œ phoenix-framework; f3dc +๏”‘ phoenix-squadron; f511 +๏‚• phone; f095 +๏กน phone-alt; f879 +๏ phone-slash; f3dd +๏‚˜ phone-square; f098 +๏กป phone-square-alt; f87b +๏Š  phone-volume; f2a0 +๏กผ photo-video; f87c +๏‘— php; f457 +๏Šฎ pied-piper; f2ae +๏†จ pied-piper-alt; f1a8 +๏“ฅ pied-piper-hat; f4e5 +๏†ง pied-piper-pp; f1a7 +๎€ž pied-piper-square e01e +๏““ piggy-bank; f4d3 +๏’„ pills; f484 +๏ƒ’ pinterest; f0d2 +๏ˆฑ pinterest-p; f231 +๏ƒ“ pinterest-square; f0d3 +๏ ˜ pizza-slice; f818 +๏™ฟ place-of-worship; f67f +๏ฒ plane; f072 +๏–ฏ plane-arrival; f5af +๏–ฐ plane-departure; f5b0 +๎ฉ plane-slash e069 +๏‹ play; f04b +๏…„ play-circle; f144 +๏Ÿ playstation; f3df +๏‡ฆ plug; f1e6 +๏ง plus; f067 +๏• plus-circle; f055 +๏ƒพ plus-square; f0fe +๏‹Ž podcast; f2ce +๏š poll; f681 +๏š‚ poll-h; f682 +๏‹พ poo; f2fe +๏š poo-storm; f75a +๏˜™ poop; f619 +๏  portrait; f3e0 +๏…” pound-sign; f154 +๏€‘ power-off; f011 +๏šƒ pray; f683 +๏š„ praying-hands; f684 +๏–ฑ prescription; f5b1 +๏’… prescription-bottle; f485 +๏’† prescription-bottle-alt; f486 +๏€ฏ print; f02f +๏’‡ procedures; f487 +๏Šˆ product-hunt; f288 +๏•‚ project-diagram; f542 +๎ช pump-medical e06a +๎ซ pump-soap e06b +๏ก pushed; f3e1 +๏„ฎ puzzle-piece; f12e +๏ข python; f3e2 +๏‡– qq; f1d6 +๏€ฉ qrcode; f029 +๏„จ question; f128 +๏™ question-circle; f059 +๏‘˜ quidditch; f458 +๏‘™ quinscape; f459 +๏‹„ quora; f2c4 +๏„ quote-left; f10d +๏„Ž quote-right; f10e +๏š‡ quran; f687 +๏“ท r-project; f4f7 +๏žน radiation; f7b9 +๏žบ radiation-alt; f7ba +๏› rainbow; f75b +๏ด random; f074 +๏žป raspberry-pi; f7bb +๏‹™ ravelry; f2d9 +๏› react; f41b +๏ reacteurope; f75d +๏“• readme; f4d5 +๏‡ rebel; f1d0 +๏•ƒ receipt; f543 +๏ฃ™ record-vinyl; f8d9 +๏†ธ recycle; f1b8 +๏ฃ red-river; f3e3 +๏†ก reddit; f1a1 +๏Ё reddit-alien; f281 +๏†ข reddit-square; f1a2 +๏žผ redhat; f7bc +๏€ž redo; f01e +๏‹น redo-alt; f2f9 +๏‰ registered; f25d +๏กฝ remove-format; f87d +๏†‹ renren; f18b +๏ฅ reply; f3e5 +๏„ข reply-all; f122 +๏ฆ replyd; f3e6 +๏ž republican; f75e +๏“ธ researchgate; f4f8 +๏ง resolving; f3e7 +๏žฝ restroom; f7bd +๏น retweet; f079 +๏–ฒ rev; f5b2 +๏“– ribbon; f4d6 +๏œ‹ ring; f70b +๏€˜ road; f018 +๏•„ robot; f544 +๏„ต rocket; f135 +๏จ rocketchat; f3e8 +๏ฉ rockrms; f3e9 +๏“— route; f4d7 +๏‚ž rss; f09e +๏…ƒ rss-square; f143 +๏…˜ ruble-sign; f158 +๏•… ruler; f545 +๏•† ruler-combined; f546 +๏•‡ ruler-horizontal; f547 +๏•ˆ ruler-vertical; f548 +๏œŒ running; f70c +๏…– rupee-sign; f156 +๎บ rust e07a +๏–ณ sad-cry; f5b3 +๏–ด sad-tear; f5b4 +๏‰ง safari; f267 +๏ ป salesforce; f83b +๏ž sass; f41e +๏žฟ satellite; f7bf +๏Ÿ€ satellite-dish; f7c0 +๏ƒ‡ save; f0c7 +๏ช schlix; f3ea +๏•‰ school; f549 +๏•Š screwdriver; f54a +๏ŠŠ scribd; f28a +๏œŽ scroll; f70e +๏Ÿ‚ sd-card; f7c2 +๏€‚ search; f002 +๏šˆ search-dollar; f688 +๏š‰ search-location; f689 +๏€ search-minus; f010 +๏€Ž search-plus; f00e +๏ซ searchengin; f3eb +๏“˜ seedling; f4d8 +๏‹š sellcast; f2da +๏ˆ“ sellsy; f213 +๏ˆณ server; f233 +๏ฌ servicestack; f3ec +๏˜Ÿ shapes; f61f +๏ค share; f064 +๏‡  share-alt; f1e0 +๏‡ก share-alt-square; f1e1 +๏… share-square; f14d +๏ˆ‹ shekel-sign; f20b +๏ญ shield-alt; f3ed +๎ฌ shield-virus e06c +๏ˆš ship; f21a +๏’‹ shipping-fast; f48b +๏ˆ” shirtsinbulk; f214 +๏•‹ shoe-prints; f54b +๎— shopify e057 +๏А shopping-bag; f290 +๏Š‘ shopping-basket; f291 +๏บ shopping-cart; f07a +๏–ต shopware; f5b5 +๏‹Œ shower; f2cc +๏–ถ shuttle-van; f5b6 +๏“™ sign; f4d9 +๏‹ถ sign-in-alt; f2f6 +๏Šง sign-language; f2a7 +๏‹ต sign-out-alt; f2f5 +๏€’ signal; f012 +๏–ท signature; f5b7 +๏Ÿ„ sim-card; f7c4 +๏ˆ• simplybuilt; f215 +๎ญ sink e06d +๏ฎ sistrix; f3ee +๏ƒจ sitemap; f0e8 +๏”’ sith; f512 +๏Ÿ… skating; f7c5 +๏Ÿ† sketch; f7c6 +๏Ÿ‰ skiing; f7c9 +๏ŸŠ skiing-nordic; f7ca +๏•Œ skull; f54c +๏œ” skull-crossbones; f714 +๏ˆ– skyatlas; f216 +๏…พ skype; f17e +๏†˜ slack; f198 +๏ฏ slack-hash; f3ef +๏œ• slash; f715 +๏ŸŒ sleigh; f7cc +๏‡ž sliders-h; f1de +๏‡ง slideshare; f1e7 +๏„˜ smile; f118 +๏–ธ smile-beam; f5b8 +๏“š smile-wink; f4da +๏Ÿ smog; f75f +๏’ smoking; f48d +๏• smoking-ban; f54d +๏Ÿ sms; f7cd +๏Šซ snapchat; f2ab +๏Šฌ snapchat-ghost; f2ac +๏Šญ snapchat-square; f2ad +๏ŸŽ snowboarding; f7ce +๏‹œ snowflake; f2dc +๏Ÿ snowman; f7d0 +๏Ÿ’ snowplow; f7d2 +๎ฎ soap e06e +๏š– socks; f696 +๏–บ solar-panel; f5ba +๏ƒœ sort; f0dc +๏… sort-alpha-down; f15d +๏ข sort-alpha-down-alt; f881 +๏…ž sort-alpha-up; f15e +๏ข‚ sort-alpha-up-alt; f882 +๏…  sort-amount-down; f160 +๏ข„ sort-amount-down-alt; f884 +๏…ก sort-amount-up; f161 +๏ข… sort-amount-up-alt; f885 +๏ƒ sort-down; f0dd +๏…ข sort-numeric-down; f162 +๏ข† sort-numeric-down-alt; f886 +๏…ฃ sort-numeric-up; f163 +๏ข‡ sort-numeric-up-alt; f887 +๏ƒž sort-up; f0de +๏†พ soundcloud; f1be +๏Ÿ“ sourcetree; f7d3 +๏–ป spa; f5bb +๏†— space-shuttle; f197 +๏ณ speakap; f3f3 +๏ ผ speaker-deck; f83c +๏ข‘ spell-check; f891 +๏œ— spider; f717 +๏„ spinner; f110 +๏–ผ splotch; f5bc +๏†ผ spotify; f1bc +๏–ฝ spray-can; f5bd +๏ƒˆ square; f0c8 +๏‘œ square-full; f45c +๏š˜ square-root-alt; f698 +๏–พ squarespace; f5be +๏† stack-exchange; f18d +๏…ฌ stack-overflow; f16c +๏ก‚ stackpath; f842 +๏–ฟ stamp; f5bf +๏€… star; f005 +๏š™ star-and-crescent; f699 +๏‚‰ star-half; f089 +๏—€ star-half-alt; f5c0 +๏šš star-of-david; f69a +๏˜ก star-of-life; f621 +๏ต staylinked; f3f5 +๏†ถ steam; f1b6 +๏†ท steam-square; f1b7 +๏ถ steam-symbol; f3f6 +๏ˆ step-backward; f048 +๏‘ step-forward; f051 +๏ƒฑ stethoscope; f0f1 +๏ท sticker-mule; f3f7 +๏‰‰ sticky-note; f249 +๏ stop; f04d +๏Š stop-circle; f28d +๏‹ฒ stopwatch; f2f2 +๎ฏ stopwatch-20 e06f +๏•Ž store; f54e +๏• store-alt; f54f +๎ฐ store-alt-slash e070 +๎ฑ store-slash e071 +๏จ strava; f428 +๏• stream; f550 +๏ˆ street-view; f21d +๏ƒŒ strikethrough; f0cc +๏ฉ stripe; f429 +๏ช stripe-s; f42a +๏•‘ stroopwafel; f551 +๏ธ studiovinari; f3f8 +๏†ค stumbleupon; f1a4 +๏†ฃ stumbleupon-circle; f1a3 +๏„ฌ subscript; f12c +๏ˆน subway; f239 +๏ƒฒ suitcase; f0f2 +๏— suitcase-rolling; f5c1 +๏†… sun; f185 +๏‹ superpowers; f2dd +๏„ซ superscript; f12b +๏น supple; f3f9 +๏—‚ surprise; f5c2 +๏Ÿ– suse; f7d6 +๏—ƒ swatchbook; f5c3 +๏ฃก swift; f8e1 +๏—„ swimmer; f5c4 +๏—… swimming-pool; f5c5 +๏ ฝ symfony; f83d +๏š› synagogue; f69b +๏€ก sync; f021 +๏‹ฑ sync-alt; f2f1 +๏’Ž syringe; f48e +๏ƒŽ table; f0ce +๏‘ table-tennis; f45d +๏„Š tablet; f10a +๏บ tablet-alt; f3fa +๏’ tablets; f490 +๏ฝ tachometer-alt; f3fd +๏€ซ tag; f02b +๏€ฌ tags; f02c +๏“› tape; f4db +๏‚ฎ tasks; f0ae +๏†บ taxi; f1ba +๏“น teamspeak; f4f9 +๏˜ฎ teeth; f62e +๏˜ฏ teeth-open; f62f +๏‹† telegram; f2c6 +๏พ telegram-plane; f3fe +๏ฉ temperature-high; f769 +๏ซ temperature-low; f76b +๏‡• tencent-weibo; f1d5 +๏Ÿ— tenge; f7d7 +๏„  terminal; f120 +๏€ด text-height; f034 +๏€ต text-width; f035 +๏€Š th; f00a +๏€‰ th-large; f009 +๏€‹ th-list; f00b +๏š the-red-yeti; f69d +๏˜ฐ theater-masks; f630 +๏—† themeco; f5c6 +๏Šฒ themeisle; f2b2 +๏’‘ thermometer; f491 +๏‹‹ thermometer-empty; f2cb +๏‹‡ thermometer-full; f2c7 +๏‹‰ thermometer-half; f2c9 +๏‹Š thermometer-quarter; f2ca +๏‹ˆ thermometer-three-quarters; f2c8 +๏œฑ think-peaks; f731 +๏…ฅ thumbs-down; f165 +๏…ค thumbs-up; f164 +๏‚ thumbtack; f08d +๏ฟ ticket-alt; f3ff +๎ป tiktok e07b +๏€ times; f00d +๏— times-circle; f057 +๏ƒ tint; f043 +๏—‡ tint-slash; f5c7 +๏—ˆ tired; f5c8 +๏ˆ„ toggle-off; f204 +๏ˆ… toggle-on; f205 +๏Ÿ˜ toilet; f7d8 +๏œž toilet-paper; f71e +๎ฒ toilet-paper-slash e072 +๏•’ toolbox; f552 +๏Ÿ™ tools; f7d9 +๏—‰ tooth; f5c9 +๏š  torah; f6a0 +๏šก torii-gate; f6a1 +๏œข tractor; f722 +๏”“ trade-federation; f513 +๏‰œ trademark; f25c +๏˜ท traffic-light; f637 +๎ trailer e041 +๏ˆธ train; f238 +๏Ÿš tram; f7da +๏ˆค transgender; f224 +๏ˆฅ transgender-alt; f225 +๏‡ธ trash; f1f8 +๏‹ญ trash-alt; f2ed +๏ ฉ trash-restore; f829 +๏ ช trash-restore-alt; f82a +๏†ป tree; f1bb +๏† trello; f181 +๏‚‘ trophy; f091 +๏ƒ‘ truck; f0d1 +๏“ž truck-loading; f4de +๏˜ป truck-monster; f63b +๏“Ÿ truck-moving; f4df +๏˜ผ truck-pickup; f63c +๏•“ tshirt; f553 +๏‡ค tty; f1e4 +๏…ณ tumblr; f173 +๏…ด tumblr-square; f174 +๏‰ฌ tv; f26c +๏‡จ twitch; f1e8 +๏‚™ twitter; f099 +๏‚ twitter-square; f081 +๏ซ typo3; f42b +๏‚ uber; f402 +๏ŸŸ ubuntu; f7df +๏ƒ uikit; f403 +๏ฃจ umbraco; f8e8 +๏ƒฉ umbrella; f0e9 +๏—Š umbrella-beach; f5ca +๎‚„ uncharted e084 +๏ƒ underline; f0cd +๏ƒข undo; f0e2 +๏‹ช undo-alt; f2ea +๏„ uniregistry; f404 +๎‰ unity e049 +๏Šš universal-access; f29a +๏†œ university; f19c +๏„ง unlink; f127 +๏‚œ unlock; f09c +๏„พ unlock-alt; f13e +๎ผ unsplash e07c +๏… untappd; f405 +๏‚“ upload; f093 +๏Ÿ  ups; f7e0 +๏Ї usb; f287 +๏€‡ user; f007 +๏† user-alt; f406 +๏“บ user-alt-slash; f4fa +๏“ป user-astronaut; f4fb +๏“ผ user-check; f4fc +๏Šฝ user-circle; f2bd +๏“ฝ user-clock; f4fd +๏“พ user-cog; f4fe +๏“ฟ user-edit; f4ff +๏”€ user-friends; f500 +๏” user-graduate; f501 +๏œจ user-injured; f728 +๏”‚ user-lock; f502 +๏ƒฐ user-md; f0f0 +๏”ƒ user-minus; f503 +๏”„ user-ninja; f504 +๏ ฏ user-nurse; f82f +๏ˆด user-plus; f234 +๏ˆ› user-secret; f21b +๏”… user-shield; f505 +๏”† user-slash; f506 +๏”‡ user-tag; f507 +๏”ˆ user-tie; f508 +๏ˆต user-times; f235 +๏ƒ€ users; f0c0 +๏”‰ users-cog; f509 +๎ณ users-slash e073 +๏Ÿก usps; f7e1 +๏‡ ussunnah; f407 +๏‹ฅ utensil-spoon; f2e5 +๏‹ง utensils; f2e7 +๏ˆ vaadin; f408 +๏—‹ vector-square; f5cb +๏ˆก venus; f221 +๏ˆฆ venus-double; f226 +๏ˆจ venus-mars; f228 +๎‚… vest e085 +๎‚† vest-patches e086 +๏ˆท viacoin; f237 +๏Šฉ viadeo; f2a9 +๏Šช viadeo-square; f2aa +๏’’ vial; f492 +๏’“ vials; f493 +๏‰ viber; f409 +๏€ฝ video; f03d +๏“ข video-slash; f4e2 +๏šง vihara; f6a7 +๏Š vimeo; f40a +๏†” vimeo-square; f194 +๏‰ฝ vimeo-v; f27d +๏‡Š vine; f1ca +๎ด virus e074 +๎ต virus-slash e075 +๎ถ viruses e076 +๏†‰ vk; f189 +๏‹ vnv; f40b +๏ข— voicemail; f897 +๏‘Ÿ volleyball-ball; f45f +๏€ง volume-down; f027 +๏šฉ volume-mute; f6a9 +๏€ฆ volume-off; f026 +๏€จ volume-up; f028 +๏ฒ vote-yea; f772 +๏œฉ vr-cardboard; f729 +๏Ÿ vuejs; f41f +๏•” walking; f554 +๏•• wallet; f555 +๏’” warehouse; f494 +๎‚‡ watchman-monitoring e087 +๏ณ water; f773 +๏ พ wave-square; f83e +๏ ฟ waze; f83f +๏—Œ weebly; f5cc +๏†Š weibo; f18a +๏’– weight; f496 +๏— weight-hanging; f5cd +๏‡— weixin; f1d7 +๏ˆฒ whatsapp; f232 +๏Œ whatsapp-square; f40c +๏†“ wheelchair; f193 +๏ whmcs; f40d +๏‡ซ wifi; f1eb +๏‰ฆ wikipedia-w; f266 +๏œฎ wind; f72e +๏ window-close; f410 +๏‹ window-maximize; f2d0 +๏‹‘ window-minimize; f2d1 +๏‹’ window-restore; f2d2 +๏…บ windows; f17a +๏œฏ wine-bottle; f72f +๏“ฃ wine-glass; f4e3 +๏—Ž wine-glass-alt; f5ce +๏— wix; f5cf +๏œฐ wizards-of-the-coast; f730 +๎‚ˆ wodu e088 +๏”” wolf-pack-battalion; f514 +๏…™ won-sign; f159 +๏†š wordpress; f19a +๏‘ wordpress-simple; f411 +๏Š— wpbeginner; f297 +๏‹ž wpexplorer; f2de +๏Š˜ wpforms; f298 +๏ค wpressr; f3e4 +๏‚ญ wrench; f0ad +๏’— x-ray; f497 +๏’ xbox; f412 +๏…จ xing; f168 +๏…ฉ xing-square; f169 +๏ˆป y-combinator; f23b +๏†ž yahoo; f19e +๏ก€ yammer; f840 +๏“ yandex; f413 +๏” yandex-international; f414 +๏Ÿฃ yarn; f7e3 +๏‡ฉ yelp; f1e9 +๏…— yen-sign; f157 +๏šญ yin-yang; f6ad +๏Šฑ yoast; f2b1 +๏…ง youtube; f167 +๏ฑ youtube-square; f431 +๏˜ฟ zhihu; f63f diff --git a/.local/share/larbs/getkeys/sxiv b/.local/share/larbs/getkeys/nsxiv similarity index 50% rename from .local/share/larbs/getkeys/sxiv rename to .local/share/larbs/getkeys/nsxiv index df5cb1e0..176a65a7 100644 --- a/.local/share/larbs/getkeys/sxiv +++ b/.local/share/larbs/getkeys/nsxiv @@ -1,9 +1,8 @@ - _ - _____ _(_)_ __ -/ __\ \/ / \ \ / / -\__ \> <| |\ V / -|___/_/\_\_| \_/ -sxiv is the image viewer. + _ __ _____ _(_)_ __ +| '_ \/ __\ \/ / \ \ / / +| | | \__ \> <| |\ V / +|_| |_|___/_/\_\_| \_/ +nsxiv is the image viewer. h/j/k/l - Pan image -/+ - Zoom out/in Enter - Toggle thumbnail mode @@ -12,4 +11,4 @@ sxiv is the image viewer. r - Reload image if changed m - Mark/unmark image w - Zoom to fit window - ctrl-x - Run external command (see ~/.config/sxiv/exec/key-handler for options) + ctrl-x - Run external command (see ~/.config/nsxiv/exec/key-handler for options) diff --git a/README.md b/README.md index 419eb61f..eaa53713 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ These are the dotfiles deployed by [LARBS](https://github.com/quadcerebrumal/LAR - zsh (shell) - lf (file manager) - mpd/ncmpcpp (music) - - sxiv (image/gif viewer) + - nsxiv (image/gif viewer) - mpv (video player) - other stuff like xdg default programs, inputrc and more, etc. - I try to minimize what's directly in `~` so: @@ -41,4 +41,4 @@ curl -LO raw.githubusercontent.com/quadcerebrumal/LARBS/master/larbs.sh ``` or clone the repo files directly to your home directory and install the -[dependencies](https://github.com/quadcerebrumal/LARBS/blob/master/progs.csv). +[dependencies](https://github.com/raketexyz/LARBS/blob/master/progs.csv).