about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorEnsa <psychoticfervor@tuta.io>2019-12-20 00:14:09 -0800
committerEnsa <psychoticfervor@tuta.io>2019-12-20 00:14:09 -0800
commit4684d80b6271dd775cd23dabf2b91d6ce56fa33a (patch)
treeddb6c6219e213132b8500e016b1ce238aa71029d
parentf733ca7c8041866df27752c8e0c2610e0ecef6a7 (diff)
downloadcfg-4684d80b6271dd775cd23dabf2b91d6ce56fa33a.tar.gz
first significant commit
see README.md for information
-rw-r--r--DEPENDENCIES.md108
-rw-r--r--LICENSE2
-rw-r--r--README.md24
-rwxr-xr-xbin/comm-sel9
-rwxr-xr-xbin/lh37
-rwxr-xr-xbin/popmail71
-rwxr-xr-xbin/prompt10
-rwxr-xr-xbin/pw14
-rwxr-xr-xbin/rsschk16
-rwxr-xr-xbin/shenv6
-rwxr-xr-xbin/xbg14
-rw-r--r--config/lf/lfrc37
-rw-r--r--config/mimeapps.list10
-rw-r--r--config/mpd/mpd.conf9
-rw-r--r--config/ncmpcpp/bindings70
-rw-r--r--config/ncmpcpp/config532
-rw-r--r--config/newsboat/config38
-rw-r--r--config/nvim/colors/asmanian_blood.vim42
-rw-r--r--config/nvim/init.vim104
-rw-r--r--config/shrc34
-rw-r--r--config/user-dirs.dirs15
-rw-r--r--config/wal/templates/6cord.toml11
-rw-r--r--config/wal/templates/colors-wal-dmenu.h6
-rw-r--r--config/wal/templates/colors-wal-dwm.h13
-rw-r--r--config/wal/templates/colors.Xresources58
-rw-r--r--config/wal/templates/dunstrc93
-rw-r--r--config/wal/templates/zathurarc34
-rw-r--r--config/youtube-dl/config9
-rw-r--r--config/youtube-dl/config-music6
l---------config/zsh/.zshrc1
-rw-r--r--config/zsh/00-opts.zsh3
-rw-r--r--config/zsh/binds.zsh12
-rw-r--r--config/zsh/exports.zsh7
-rw-r--r--config/zsh/functions.zsh2
-rw-r--r--config/zsh/themes/p10k.zsh856
-rw-r--r--config/zsh/zshrc53
-rw-r--r--data/applications/doc.desktop4
-rw-r--r--data/applications/img.desktop4
-rw-r--r--data/applications/rss.desktop4
-rw-r--r--data/applications/text.desktop4
-rw-r--r--data/applications/weblight.desktop4
-rw-r--r--data/mailcap4
42 files changed, 2388 insertions, 2 deletions
diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md
new file mode 100644
index 0000000..9e1b086
--- /dev/null
+++ b/DEPENDENCIES.md
@@ -0,0 +1,108 @@
+# NOTE
+each and every file in this repository can be altered by anyone with any goal, including changing programs used. this, of course, will change the dependencies for every file that is altered.
+# KEY
+* `item`: a program
+  * NOTE: if `item` has a link, the link leads to either the official website if one exists, or its repository.
+  * if `item` does not have a link, it can likely be found in your OS's package manager.
+* `path/item`: one of the files in this repo
+* `$variable`: a shell variable set somewhere like shrc or .profile
+  * more specifically:
+  * `$TERMINAL`: value is the user's terminal of choice, e.g [st](https://st.suckless.org)
+  * `$EDITOR`: value is the user's terminal editor of choice, e.g [neovim](https://neovim.io)
+  * `$READER`: value is the user's ebook reader of choice, e.g [zathura](https://pwmt.org/projects/zathura)
+  * `$BROWSER`: value is the user's (non-terminal) web browser of choice, e.g [firefox](https://mozilla.org/firefox)
+  * `$XDG_CONFIG_HOME`: value is the user's config directory according to the [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html#variables), usually `$HOME/.config`
+  * `$XDG_DATA_HOME`: value is the user's data directory according to the [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html#variables), usually `$HOME/.local/share`
+* `opt: any of the previous bullets`: same meaning as before but optional
+* `(description)`: explains why it's necessary/what optional feature it enables if present
+# bin/
+* popmail: populate local maildirs and notify the user if there is new mail
+  * [isync](https://isync.sourceforge.net)
+  * properly configured `$HOME/.mbsync` (One Group per email account)
+  * libnotify (notifies the user for new mail and the subject line of said mail)
+  * `$XDG_DATA_HOME`
+* comm-sel: a handy menu for spawning communication clients
+  * [irssi](https://irssi.org)
+  * [6cord](https://gitlab.com/diamondburned/6cord)
+  * [scli](https://github.com/isamert/scli)
+  * [dmenu](https://dmenu.suckless.org) (provides a menu for selecting which client to start)
+  * notify-send (notifies the user that they made an invalid choice)
+  * `$TERMINAL`
+* lh: a script that takes a URL as input and does different things depending on what the URL links to
+  * [mpv](https://mpv.io) (video file streaming, streaming from sites like youtube, viewing livestreams from twitch)
+  * [youtube-dl](https://yt-dl.org) (hooked by mpv when streaming from the appropriate sites)
+  * [streamlink](https://streamlink.github.io) (used to view livestreams from twitch)
+  * [dmenu](https://dmenu.suckless.org) (used to pick stream quality when handling livestream URLs)
+  * [sxiv](https://github.com/muennich/sxiv) (used to view images)
+  * [curl](https://curl.haxx.se) (images, audio files, ebook files)
+  * `$TERMINAL`
+  * `$READER`
+  * `$EDITOR`
+  * `$BROWSER`
+* prompt: makes prompting the user for particular actions easier
+  * [dmenu](https://dmenu.suckless.org)
+* pw: generates a password of variable length
+  * opt: xclip (enables pw's mode copying the generated password to the clipboard)
+  * opt: libnotify (notifies the user that the password is generated, how long the password will be kept in the clipboard for, and when the clipboard is cleared.)
+* rsschk: takes a URL as an argument and adds it to newsboat's url file, with an optional second argument specifying a category
+  * libnotify (notifies the user of improper usage, and whether or not they should probably edit the url file manually to add a category.)
+  * [newsboat](https://newsboat.org)
+  * opt: `$XDG_CONFIG_HOME`
+* shenv: runs the shell with a specific environment file
+  * a shrc file located in `$XDG_CONFIG_HOME`, check config/shrc for an example
+* xbg: sets the background or changes the picture used for the background
+  * opt: xdg-user-dir (lets you change the directory bg.png has to be in)
+  * xwallpaper (sets the wallpaper)
+# config/
+* lfrc: configuration file for [lf](https://github.com/gokcehan/lf)
+  * opt: $EDITOR (viewing text files)
+  * opt: [gimp](https://gimp.org) (editing vector images)
+  * opt: [zathura](https://pwmt.org/projects/zathura) (viewing ebooks)
+  * opt: [sxiv](https://github.com/muennich/sxiv) (view images)
+  * opt: mpv (listening to audio files or viewing video files)
+  * opt: bin/lh (wildcard for opening files not detected by other MIME types)
+* shrc: shell environment, particularly for bin/shenv
+  * nvim (`$EDITOR`)
+  * lf (`$FILE`)
+  * st (`$TERMINAL`)
+  * firefox (`$BROWSER`)
+  * bin/comm-sel (`$COMM`)
+  * zathura (`$READER`)
+  * neomutt (`$MAILER`)
+  * ncmpcpp (`$MUSIC`)
+  * newsboat (`$RSS`)
+  * zsh (`$ISH` `$ZDOTDIR`)
+  * maim (`$SCR`)
+  * slock (`$LOCK`)
+  * opt: go (`$GOPATH`)
+  * opt: cargo (`$CARGO_HOME`)
+  * opt: mednafen (`$MEDNAFEN_HOME`)
+## zsh/
+configuration files for zsh
+* zshrc
+  * git (installing zplugin)
+* functions.zsh
+  * bin/pw (for pw() to work)
+* exports.zsh
+  * config/shrc (for the majority of variables set)
+  * opt: pfetch (`$PF_INFO`)
+* themes/p10k.zsh
+  * [Nerd Fonts font](https://nerdfonts.com)
+# data/
+* mailcap: helps neomutt figure out what to do with particular MIME types
+  * $EDITOR
+  * lynx
+  * [mpv](https://mpv.io)
+  * $READER
+## applications/
+* doc.desktop
+  * [zathura](https://pwmt.org/projects/zathura)
+* img.desktop
+  * [sxiv](https://github.com/muennich/sxiv)
+* rss.desktop
+  * bin/rsschk
+* text.desktop
+  * [st](https://st.suckless.org)
+  * [neovim](https://neovim.io)
+* weblight.desktop
+  * [surf](https://surf.suckless.org)
diff --git a/LICENSE b/LICENSE
index a4bac65..2cb1dd5 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,5 +1,5 @@
 ISC License:
-Copyright (c) Year(s), Company or Person's Name
+Copyright (c) 2019, Ensa
 
 Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
 
diff --git a/README.md b/README.md
index ac7b8c2..a12e442 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,25 @@
 # dots
 
-configuration files for various programs and convenience scripts.
\ No newline at end of file
+configuration files for various programs and convenience scripts.
+
+## INSTALL
+
+these dots can be installed in two different ways.
+NOTE: install script does not exist yet. please follow MANUAL for now.
+
+### MANUAL:
+
+to manually install, simply copy the contents of config/ to your `$XDG_CONFIG_HOME` (`$HOME/.config` by default) directory.
+the contents of the data/ folder corresponds with your `$XDG_DATA_HOME` (`$HOME/.local/share` by default) directory.
+the contents of the bin/ folder should be placed anywhere within your `$PATH` (likely `$HOME/.local/bin` or `$HOME/bin`)
+for the most part these should function fairly standalone, but please check DEPENDENCIES.md to see what each file needs if you were to use them. this may be other files in this repo, and sometimes specific programs outside this repo.
+if you want to preserve space or make updating the dotfiles easier, symlink the desired files to their destinations instead of copying them. this has the unfortunate side-effect of the user modifying files causing updates to break. however, this can be remedied if you maintain your modifications in a separate git branch. when you need to update, simply switch back to the master branch, update, switch back to your custom branch, and merge from master:
+```shell
+git checkout -b config
+# make edits to whatever files
+git commit -a your changed files
+git checkout master
+git pull
+git checkout config
+git merge master
+```
diff --git a/bin/comm-sel b/bin/comm-sel
new file mode 100755
index 0000000..f67787f
--- /dev/null
+++ b/bin/comm-sel
@@ -0,0 +1,9 @@
+#!/bin/sh
+# sends a list of communication TUIs (e.g irssi) to dmenu and allows the user to choose one.
+# class "comm" is added to enable window managers (e.g dwm) to do specific things with them.
+case "$(dmenu_path|grep -E "irssi|6cord|scli$"|dmenu -p "choose chat app:")" in
+	irssi) $TERMINAL -c comm -e irssi --home=$XDG_CONFIG_HOME/irssi&;;
+	6cord) $TERMINAL -c comm -e 6cord&;;
+	scli) $TERMINAL -c comm -e scli&;;
+	*) notify-send "comm-sel error" "invalid program selection"&&return 1;;
+esac
diff --git a/bin/lh b/bin/lh
new file mode 100755
index 0000000..e4bdf0c
--- /dev/null
+++ b/bin/lh
@@ -0,0 +1,37 @@
+#!/bin/sh
+# lh: the Link Handler
+# takes one path or URL as its argument, launches the appropriate program for this.
+### differs from Luke Smith's linkhandler in cleaner code, inclusion of epub/pdf handling, proper interpretation of twitch video URLs, and livestream handling with streamlink (twitch only for now, tipping me off to URL schemes to look for for other streaming sites would be appreciated.)
+
+# if $1 isn't provided, spawn $BROWSER and exit. this allows lh to be used as a pseudo-browser.
+[ -z "$1" ] && exec "$BROWSER"
+
+case "$1" in
+	*mkv|*webm|*mp4)
+		mpv --input-ipc-server=/tmp/mpv-socket$(date +%s) --quiet "$1" >/dev/null 2>&1 & ;;
+	*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*hooktube.com*|*bitchute.com*|*twitch.tv/videos/*)
+		mpv --input-ipc-server=/tmp/mpv-socket$(date +%s) --quiet --ytdl "$1" >/dev/null 2>&1 & ;;
+	*twitch.tv/*)
+		STREAMQUAL="$(streamlink "$1"|\
+			grep "Available streams"|tr " " "\n"|grep -E "[0-9]"|tr -d ,|\
+			dmenu -p "choose stream quality for $1")"
+		streamlink -p mpv $1 $STREAMQUAL >/dev/null 2>&1 & ;;
+	*png|*jpg|*jpe|*jpeg|*gif)
+		IMGPATH="/tmp/$(echo "$1"|sed "s/.*\\///")"
+		curl -sL "$1" >"$IMGPATH"&&sxiv -a "$IMGPATH">/dev/null 2>&1 & ;;
+	*mp3|*m4a|*flac|*aiff|*opus|*mp3?source*)
+		curl -LO "$1" >/dev/null 2>&1 & ;;
+	*epub|*pdf|*djvu)
+		BOOKPATH="/tmp/$(echo "$1"|sed "s/.*\\///")"
+		if [ -n "$READER" ]; then
+			curl -sL "$1" >"$BOOKPATH"&&$READER "$BOOKPATH">/dev/null 2>&1 &
+		else
+			curl -sL "$1" >"$BOOKPATH" &
+		fi ;;
+	*)
+		if [ -f "$1" ]; then
+			$TERMINAL -e "$EDITOR $1"
+		else
+			$BROWSER "$1" >/dev/null 2>&1 &
+		fi ;;
+esac
diff --git a/bin/popmail b/bin/popmail
new file mode 100755
index 0000000..d1bae9f
--- /dev/null
+++ b/bin/popmail
@@ -0,0 +1,71 @@
+#!/bin/sh
+# populate maildirs and give notification if there is new mail.
+# run only if all of the following is true:
+# 	user logged in (prevent cron errors)
+#	mbsync isn't already running
+#	there is an internet connection.
+if ! pgrep -u "${USER:=$LOGNAME}" >/dev/null; then
+	printf '%s not logged in. quitting...\n' "$USER" >/dev/stderr
+	exit
+elif pgrep -x mbsync >/dev/null; then
+	printf 'mbsync is already running. quitting...\n' >/dev/stderr
+	exit
+elif ! ping -q -c 1 1.1.1.1 >/dev/null; then
+	printf 'no internet connection, quitting...\n' >/dev/stderr
+fi
+
+export DISPLAY=:0
+# ensure touch file's directory exists
+if ! [ -d "$XDG_DATA_HOME/neomutt" ]; then
+	mkdir "$XDG_DATA_HOME/neomutt"
+fi
+# check account for new mail, notify for new content
+syncandnotify() {
+    # sanitize $account for use in function
+    acc="$(printf '%s\n' "$account" | sed "s/.*\///")"
+    mbsync "$acc">/dev/null 2>&1
+    # $new holds an index of all mail since the last time popmail ran
+    new=$(find "$XDG_DATA_HOME/mail/$acc/inbox/new/" -type f -newer "$XDG_DATA_HOME/neomutt/.popmail-last" 2> /dev/null)
+    # $newcount is the number of new mails
+    newcount=$(printf '%s\n' "$new" | sed '/^\s*$/d' | wc -l | tr -d " ")
+    # send $newcount to a file specific to $acc
+    # the preceding space makes generating a status bar string easier.
+    printf ' %s' "$newcount" > "$XDG_DATA_HOME/mail/$acc/note"
+    # don't notify if there isn't new mail
+    if [ "$newcount" -gt "0" ]; then
+        notify-send --app-name="popmail" "mail fetcher" "new mail for profile $acc! [$newcount]" &
+        for file in $new; do
+	    # broken lines, not sure what they're supposed to do
+            #from=$(awk '/^From: / && ++n ==1,/^\<.*\>:/' "$file" | perl -CS -MEncode -ne 'print decode("MIME-Header", $_)' | awk '{ $1=""; if (NF>=3)$NF=""; print $0 }' | sed 's/^[[:blank:]]*[\"'\''\<]*//;s/[\"'\''\>]*[[:blank:]]*$//')
+            #subject=$(awk '/^Subject: / && ++n == 1,/^\<.*\>: / && ++i == 2' "$file" | sed '$D' | perl -CS -MEncode -ne 'print decode("MIME-Header", $_)' | sed 's/^Subject: //' | sed 's/^{[[:blank:]]*[\"'\''\<]*//;s/[\"'\''\>]*[[:blank:]]*$//' | tr -d '\n')
+            # Extract subject and sender from mail.
+	    # modified version of broken $from variable, only prints the first from (so forwards are slightly unclear)
+	    from=$(awk '/^From: / && ++n ==1,/^\<.*\>:/' "$file" | awk '{ $1=""; if (NF>=3)$NF=""; print $0 }' | sed '1!d'| sed '1,/From/s/From: //')
+	    # modified version of broken $subject variable, only prints the first subject line (so forwards are slightly unclear)
+            subject=$(awk '/^Subject: / && ++n == 1,/^\<.*\>: / && ++i == 2' "$file" | sed '$D' | grep -m 1 '^Subject: ' | sed 's/Subject: //')
+            notify-send --app-name="popmail" "$from:" "$subject" &
+	    # sleep for half a second to avoid notification clog
+	    sleep .5
+        done
+    fi
+}
+
+# if popmail is given arguments, treat them as accounts to get mail from.
+# otherwise, scan the mbsync config to get account names
+if [ "$#" -eq "0" ]; then
+    accounts="$(awk '/^Group/ {print $2}' "$HOME/.mbsyncrc")"
+else
+    accounts=$*
+fi
+
+# call syncandnotify() for every account and background so it does all of them at once
+for account in $accounts
+do
+    syncandnotify &
+done
+
+wait
+# collect all previously created note files and collate them into a file that can be read by a status bar to notify the user of new mails
+printf "$(cat "$XDG_DATA_HOME"/mail/*/note|tr " " "|"|sed 's/|//')\n">"$XDG_DATA_HOME/mail/note"
+#create/update modification time on an empty file that indicates the time of the last run of popmail
+touch "$XDG_DATA_HOME/neomutt/.popmail-last"
diff --git a/bin/prompt b/bin/prompt
new file mode 100755
index 0000000..ac1a319
--- /dev/null
+++ b/bin/prompt
@@ -0,0 +1,10 @@
+#!/bin/sh
+# calls dmenu with $1 as the prompt and "no" and "yes" as the options.
+# if "yes" is chosen, call $2.
+if [ $# -eq 1 ]; then
+	case "$1" in
+		[!-]*|-*[!h]*) return 1 ;;
+		*h*) printf 'usage: %s [-h]|prompt cmd\n' "$(basename $0)">/dev/stderr&&return 1 ;;
+	esac
+fi
+[ "$(printf "no\\nyes"|dmenu -p "$1")" = "yes" ] && $2
diff --git a/bin/pw b/bin/pw
new file mode 100755
index 0000000..140f1dc
--- /dev/null
+++ b/bin/pw
@@ -0,0 +1,14 @@
+#!/bin/sh
+# generates a password of length $1, sends it to stdout if $2 isn't clip.
+# if it is clip, sends it to the X clipboard and clears it after 10 seconds.
+if [ "$1" = "-h" ]; then
+	printf 'usage: %s [-h]|LENGTH [clip]\n' "$(basename $0)">/dev/stderr&&return 1
+fi
+PW=$(tr -cd "[:alnum:][:punct:]"</dev/urandom|fold -w $1|head -1)
+if [ "$2" = "clip" ]; then
+	printf '%s' "$PW"|xclip -sel clip -i&&notify-send "Password Generated" "$1-character password generated. It will clear in 10 seconds."
+	sleep 10
+	printf "\0"|xclip -sel clip -i&&notify-send "Clipboard Cleared" "Generated password cleared from clipboard."
+else
+	printf '%s\n' "$PW"
+fi
diff --git a/bin/rsschk b/bin/rsschk
new file mode 100755
index 0000000..5a8de6e
--- /dev/null
+++ b/bin/rsschk
@@ -0,0 +1,16 @@
+#!/bin/sh
+# checks if $1 is a valid URL, and if so, checks to see if it's in newsboat's urls file, and if not, adds it to the file.
+if [ "$1" = "-h" ]; then
+	printf 'usage: rsschk [-h]|URL [\"category\"]\n'>/dev/stderr&&return 1
+fi
+XDG_CONFIG_HOME=${XDG_CONFIG_HOME:=~/.config}
+! echo "$1" | grep "http*://\S\+\.[A-Za-z]\+\S*" >/dev/null &&
+	notify-send "Invalid input. rsschk takes http(s) URLs as input." && exit
+RSSFILE="$XDG_CONFIG_HOME/newsboat/urls"
+if grep -E "^$1" "$RSSFILE"; then
+	if [ -z "$2" ]; then
+		echo "$1">>"$RSSFILE"&&notify-send "RSS feed added." "You may want to edit $RSSFILE now."
+	else
+		echo "$1 $2">>"$RSSFILE"&&notify-send "RSS feed added with one category."
+	fi
+fi
diff --git a/bin/shenv b/bin/shenv
new file mode 100755
index 0000000..b9428b8
--- /dev/null
+++ b/bin/shenv
@@ -0,0 +1,6 @@
+#!/bin/sh
+# simply sources the shrc and runs a shell with that as its environment.
+# passes through all arguments that sh takes. to be used instead of sh.
+XDG_CONFIG_DIR=${XDG_CONFIG_DIR:="$HOME/.config"}
+. $XDG_CONFIG_DIR/shrc
+exec sh "$@"
diff --git a/bin/xbg b/bin/xbg
new file mode 100755
index 0000000..bde015d
--- /dev/null
+++ b/bin/xbg
@@ -0,0 +1,14 @@
+#!/bin/sh
+# checks to see if .fehbg exists. if so, sources it and exits.
+# if there is an argument, forcibly symlink it to $PICPATH and set $PICPATH to the background using xwallpaper.
+# if there is not an argument, set the wallpaper through the aforementioned method without setting the symlink.
+# $PICPATH is by default $XDG_PICTURES_DIR/bg.png, determined by xdg-user-dir if available or assumed to be ~/Pictures/bg.png if unavailable. $PICPATH can be set by the user in shrc if they wish to use a different background location.
+[ -e "$HOME/.fehbg" ]&&. "$HOME/.fehbg"&&exit
+
+if command -v xdg-user-dir >/dev/null; then
+	PICPATH=${PICPATH:="$(xdg-user-dir PICTURES)/bg.png"}
+else
+	PICPATH=${PICPATH:="$HOME/Pictures/bg.png"}
+fi
+[ -n "$1" ]&&ln -sf "$1" "$PICPATH"
+xwallpaper --zoom "$PICPATH"
diff --git a/config/lf/lfrc b/config/lf/lfrc
new file mode 100644
index 0000000..21634d4
--- /dev/null
+++ b/config/lf/lfrc
@@ -0,0 +1,37 @@
+# sets
+set shell sh
+set shellopts '-eu'
+set ifs "\n"
+
+# cmds
+cmd open ${{
+    case $(file -bi $f) in
+	text/troff) man ./ $f;;
+        text/*) $EDITOR $fx;;
+	image/x-xcf|image/svg+xml) gimp $f >/dev/null 2>&1 & ;;
+	image/vnd.djvu|application/epub+zip|application/pdf) zathura $f >/dev/null 2>&1 & ;;
+	image/*) sxiv -ai >/dev/null 2>&1 & ;;
+	audio/*) mpv --input-ipc-server=/tmp/mpvsoc$(date +%%s) --quiet $f >/dev/null 2>&1 & ;;
+	video/*) mpv --input-ipc-server=/tmp/mpvsoc$(date +%%s) $f ;;
+        *) for f in $fx; do lh $f > /dev/null 2>&1 & done;;
+    esac
+}}
+
+cmd rename %[ -e $1 ] && printf "file exists" || mv $f $1
+
+cmd delete ${{
+	set -f
+	printf "%s\n\t" "$fx"
+	printf "delete?[y/n]"
+	read ans
+	[ $ans = "y" ] && rm -rf $fx
+}}
+
+# binds
+map D delete
+map a push %mkdir<space>
+map r push :rename<space>
+map <enter> shell
+map R reload
+map x $$f
+map X !$f
diff --git a/config/mimeapps.list b/config/mimeapps.list
new file mode 100644
index 0000000..31b382b
--- /dev/null
+++ b/config/mimeapps.list
@@ -0,0 +1,10 @@
+[Default Applications]
+text/html=weblight.desktop
+text/plain=text.desktop
+text/x-shellscript=text.desktop
+application/postscript=doc.desktop
+application/pdf=doc.desktop
+application/rss+xml=rss.desktop
+image/png=img.desktop
+image/jpeg=img.desktop
+image/gif=img.desktop
diff --git a/config/mpd/mpd.conf b/config/mpd/mpd.conf
new file mode 100644
index 0000000..59a1215
--- /dev/null
+++ b/config/mpd/mpd.conf
@@ -0,0 +1,9 @@
+playlist_directory	"~/.local/share/mpd/playlists" # playlist data
+db_file			"~/.local/share/mpd/database" # database file
+pid_file		"~/.local/share/mpd/pid" # tracks MPD's pid
+state_file		"~/.local/share/mpd/state" # tracks MPD's state while it's down
+sticker_file		"~/.local/share/mpd/sticker.sql" # auxillary stats
+
+bind_to_address		"localhost" # local daemon
+restore_paused		"yes" # starts paused if MPD is paused when it closes
+auto_update		"yes" # updates the database when the directory changes
diff --git a/config/ncmpcpp/bindings b/config/ncmpcpp/bindings
new file mode 100644
index 0000000..76f6796
--- /dev/null
+++ b/config/ncmpcpp/bindings
@@ -0,0 +1,70 @@
+def_key "+"
+    show_clock
+def_key "="
+    volume_up
+
+def_key "j"
+    scroll_down
+def_key "k"
+    scroll_up
+
+def_key "ctrl-u"
+    page_up
+def_key "ctrl-d"
+    page_down
+def_key "u"
+    page_up
+def_key "d"
+    page_down
+def_key "h"
+    previous_column
+def_key "l"
+    next_column
+
+def_key "."
+    show_lyrics
+
+def_key "n"
+    next_found_item
+def_key "N"
+    previous_found_item
+
+def_key "J"
+    move_sort_order_down
+def_key "K"
+    move_sort_order_up
+def_key "h"
+  jump_to_parent_directory
+def_key "l"
+  enter_directory
+def_key "l"
+  run_action
+def_key "l"
+  play_item
+def_key "m"
+  show_media_library
+def_key "m"
+  toggle_media_library_columns_mode
+def_key "t"
+  show_tag_editor
+def_key "v"
+  show_visualizer
+def_key "G"
+  move_end
+def_key "g"
+  move_home
+#jump_to_position_in_song
+def_key "U"
+  update_database
+def_key "s"
+  reset_search_engine
+def_key "s"
+  show_search_engine
+def_key "f"
+  show_browser
+def_key "f"
+  change_browse_mode
+def_key "x"
+  delete_playlist_items
+def_key "P"
+  show_playlist
diff --git a/config/ncmpcpp/config b/config/ncmpcpp/config
new file mode 100644
index 0000000..04c319f
--- /dev/null
+++ b/config/ncmpcpp/config
@@ -0,0 +1,532 @@
+ncmpcpp_directory = ~/.config/ncmpcpp
+#
+##
+## Directory for storing downloaded lyrics. It defaults to ~/.lyrics since other
+## MPD clients (eg. ncmpc) also use that location.
+##
+#
+lyrics_directory = ~/.local/share/lyrics
+#
+##### connection settings #####
+#
+mpd_host = 127.0.0.1
+#
+#mpd_port = 6600
+#
+#mpd_connection_timeout = 5
+#
+## Needed for tag editor and file operations to work.
+##
+mpd_music_dir = "~/mus"
+#
+#mpd_crossfade_time = 5
+#
+##### music visualizer #####
+##
+## Note: In order to make music visualizer work you'll need to use mpd fifo
+## output, whose format parameter has to be set to 44100:16:1 for mono
+## visualization or 44100:16:2 for stereo visualization. Example configuration
+## (it has to be put into mpd.conf):
+##
+## audio_output {
+##        type            "fifo"
+##        name            "Visualizer feed"
+##        path            "/tmp/mpd.fifo"
+##        format          "44100:16:2"
+## }
+##
+#
+#visualizer_fifo_path = /tmp/mpd.fifo
+#
+##
+## Note: Below parameter is needed for ncmpcpp to determine which output
+## provides data for visualizer and thus allow syncing between visualization and
+## sound as currently there are some problems with it.
+##
+#
+#visualizer_output_name = Visualizer feed
+#
+##
+## If you set format to 44100:16:2, make it 'yes'.
+##
+#visualizer_in_stereo = yes
+#
+##
+## Note: Below parameter defines how often ncmpcpp has to "synchronize"
+## visualizer and audio outputs.  30 seconds is optimal value, but if you
+## experience synchronization problems, set it to lower value.  Keep in mind
+## that sane values start with >=10.
+##
+#
+#visualizer_sync_interval = 30
+#
+##
+## Note: To enable spectrum frequency visualization you need to compile ncmpcpp
+## with fftw3 support.
+##
+#
+## Available values: spectrum, wave, wave_filled, ellipse.
+##
+#visualizer_type = wave
+#
+#visualizer_look = ●卐
+#visualizer_look = 卐
+#
+#visualizer_color = blue, cyan, green, yellow, magenta, red
+#
+## Alternative subset of 256 colors for terminals that support it.
+##
+#visualizer_color = 41, 83, 119, 155, 185, 215, 209, 203, 197, 161
+#
+##### system encoding #####
+##
+## ncmpcpp should detect your charset encoding but if it failed to do so, you
+## can specify charset encoding you are using here.
+##
+## Note: You can see whether your ncmpcpp build supports charset detection by
+## checking output of `ncmpcpp --version`.
+##
+## Note: Since MPD uses UTF-8 by default, setting this option makes sense only
+## if your encoding is different.
+##
+#
+#system_encoding = ""
+#
+##### delays #####
+#
+## Time of inactivity (in seconds) after playlist highlighting will be disabled
+## (0 = always on).
+##
+#playlist_disable_highlight_delay = 5
+#
+## Defines how long messages are supposed to be visible.
+##
+message_delay_time = 1
+#
+##### song format #####
+##
+## For a song format you can use:
+##
+## %l - length
+## %f - filename
+## %D - directory
+## %a - artist
+## %A - album artist
+## %t - title
+## %b - album
+## %y - date
+## %n - track number (01/12 -> 01)
+## %N - full track info (01/12 -> 01/12)
+## %g - genre
+## %c - composer
+## %p - performer
+## %d - disc
+## %C - comment
+## %P - priority
+## $R - begin right alignment
+##
+## If you want to make sure that a part of the format is displayed only when
+## certain tags are present, you can archieve it by grouping them with brackets,
+## e.g. '{%a - %t}' will be evaluated to 'ARTIST - TITLE' if both tags are
+## present or '' otherwise.  It is also possible to define a list of
+## alternatives by providing several groups and separating them with '|',
+## e.g. '{%t}|{%f}' will be evaluated to 'TITLE' or 'FILENAME' if the former is
+## not present.
+##
+## Note: If you want to set limit on maximal length of a tag, just put the
+## appropriate number between % and character that defines tag type, e.g. to
+## make album take max. 20 terminal cells, use '%20b'.
+##
+## In addition, formats support markers used for text attributes.  They are
+## followed by character '$'. After that you can put:
+##
+## - 0 - default window color (discards all other colors)
+## - 1 - black
+## - 2 - red
+## - 3 - green
+## - 4 - yellow
+## - 5 - blue
+## - 6 - magenta
+## - 7 - cyan
+## - 8 - white
+## - 9 - end of current color
+## - b - bold text
+## - u - underline text
+## - r - reverse colors
+## - a - use alternative character set
+##
+## If you don't want to use a non-color attribute anymore, just put it again,
+## but this time insert character '/' between '$' and attribute character,
+## e.g. {$b%t$/b}|{$r%f$/r} will display bolded title tag or filename with
+## reversed colors.
+##
+## If you want to use 256 colors and/or background colors in formats (the naming
+## scheme is described below in section about color definitions), it can be done
+## with the syntax $(COLOR), e.g. to set the artist tag to one of the
+## non-standard colors and make it have yellow background, you need to write
+## $(197_yellow)%a$(end). Note that for standard colors this is interchangable
+## with attributes listed above.
+##
+## Note: colors can be nested.
+##
+#
+song_list_format = {$4%a - }{%t}|{$8%f$9}$R{$3(%l)$9}
+#
+song_status_format = $b{{$8"%t"}} $3by {$4%a{ $3in $7%b{ (%y)}} $3}|{$8%f}
+#
+song_library_format = {%n - }{%t}|{%f}
+#
+alternative_header_first_line_format = $b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b
+#
+alternative_header_second_line_format = {{$4$b%a$/b$9}{ - $7%b$9}{ ($4%y$9)}}|{%D}
+#
+current_item_prefix = $(cyan)$r$b
+#
+current_item_suffix = $/r$(end)$/b
+#
+current_item_inactive_column_prefix = $(magenta)$r
+#
+current_item_inactive_column_suffix = $/r$(end)
+#
+#now_playing_prefix = $b
+#
+#now_playing_suffix = $/b
+#
+#browser_playlist_prefix = "$2playlist$9 "
+#
+#selected_item_prefix = $6
+#
+#selected_item_suffix = $9
+#
+#modified_item_prefix = $3> $9
+#
+##
+## Note: attributes are not supported for the following variables.
+##
+#song_window_title_format = {%a - }{%t}|{%f}
+##
+## Note: Below variables are used for sorting songs in browser.  The sort mode
+## determines how songs are sorted, and can be used in combination with a sort
+## format to specify a custom sorting format.  Available values for
+## browser_sort_mode are "name", "mtime", "format" and "noop".
+##
+#
+#browser_sort_mode = name
+#
+#browser_sort_format = {%a - }{%t}|{%f} {(%l)}
+#
+##### columns settings #####
+##
+## syntax of song columns list format is "column column etc."
+##
+## - syntax for each column is:
+##
+## (width of the column)[color of the column]{displayed tag}
+##
+## Note: Width is by default in %, if you want a column to have fixed size, add
+## 'f' after the value, e.g. (10)[white]{a} will be the column that take 10% of
+## screen (so the real width will depend on actual screen size), whereas
+## (10f)[white]{a} will take 10 terminal cells, no matter how wide the screen
+## is.
+##
+## - color is optional (if you want the default one, leave the field empty).
+##
+## Note: You can give a column additional attributes by putting appropriate
+## character after displayed tag character. Available attributes are:
+##
+## - r - column will be right aligned
+## - E - if tag is empty, empty tag marker won't be displayed
+##
+## You can also:
+##
+## - give a column custom name by putting it after attributes, separated with
+##   character ':', e.g. {lr:Length} gives you right aligned column of lengths
+##   named "Length".
+##
+## - define sequence of tags, that have to be displayed in case predecessor is
+##   empty in a way similar to the one in classic song format, i.e. using '|'
+##   character, e.g. {a|c|p:Owner} creates column named "Owner" that tries to
+##   display artist tag and then composer and performer if previous ones are not
+##   available.
+##
+#
+#song_columns_list_format = (20)[]{a} (6f)[green]{NE} (50)[white]{t|f:Title} (20)[cyan]{b} (7f)[magenta]{l}
+#
+##### various settings #####
+#
+##
+## Note: Custom command that will be executed each time song changes. Useful for
+## notifications etc.
+##
+execute_on_song_change = "notify-send --expire-time=3500 "MPD: Now Playing" "$(mpc current)""
+#
+##
+## Note: Custom command that will be executed each time player state
+## changes. The environment variable MPD_PLAYER_STATE is set to the current
+## state (either unknown, play, pause, or stop) for its duration.
+##
+#
+#execute_on_player_state_change =
+#
+#playlist_show_mpd_host = no
+#
+#playlist_show_remaining_time = no
+#
+#playlist_shorten_total_times = no
+#
+#playlist_separate_albums = no
+#
+##
+## Note: Possible display modes: classic, columns.
+##
+playlist_display_mode = columns
+#
+browser_display_mode = columns
+#
+#search_engine_display_mode = classic
+#
+#playlist_editor_display_mode = classic
+#
+#discard_colors_if_item_is_selected = yes
+#
+#show_duplicate_tags = true
+#
+#incremental_seeking = yes
+#
+#seek_time = 1
+#
+#volume_change_step = 2
+#
+#autocenter_mode = no
+#
+#centered_cursor = no
+#
+##
+## Note: You can specify third character which will be used to build 'empty'
+## part of progressbar.
+##
+progressbar_look = ->
+#
+## Available values: database, playlist.
+##
+#default_place_to_search_in = database
+#
+## Available values: classic, alternative.
+##
+#user_interface = classic
+#
+#data_fetching_delay = yes
+#
+## Available values: artist, album_artist, date, genre, composer, performer.
+##
+media_library_primary_tag = album_artist
+#
+media_library_albums_split_by_date = no
+#
+## Available values: wrapped, normal.
+##
+#default_find_mode = wrapped
+#
+#default_tag_editor_pattern = %n - %t
+#
+#header_visibility = yes
+#
+#statusbar_visibility = yes
+#
+#titles_visibility = yes
+#
+#header_text_scrolling = yes
+#
+#cyclic_scrolling = no
+#
+#lines_scrolled = 2
+#
+#lyrics_fetchers = lyricwiki, azlyrics, genius, sing365, lyricsmania, metrolyrics, justsomelyrics, jahlyrics, plyrics, tekstowo, internet
+#
+#follow_now_playing_lyrics = no
+#
+#fetch_lyrics_for_current_song_in_background = no
+#
+#store_lyrics_in_song_dir = no
+#
+#generate_win32_compatible_filenames = yes
+#
+#allow_for_physical_item_deletion = no
+#
+##
+## Note: If you set this variable, ncmpcpp will try to get info from last.fm in
+## language you set and if it fails, it will fall back to english. Otherwise it
+## will use english the first time.
+##
+## Note: Language has to be expressed as an ISO 639 alpha-2 code.
+##
+#lastfm_preferred_language = en
+#
+#space_add_mode = add_remove
+#
+#show_hidden_files_in_local_browser = no
+#
+##
+## How shall screen switcher work?
+##
+## - "previous" - switch between the current and previous screen.
+## - "screen1,...,screenN" - switch between given sequence of screens.
+##
+## Screens available for use: help, playlist, browser, search_engine,
+## media_library, playlist_editor, tag_editor, outputs, visualizer, clock,
+## lyrics, last_fm.
+##
+#screen_switcher_mode = playlist, browser
+#
+##
+## Note: You can define startup screen by choosing screen from the list above.
+##
+startup_screen = media_library
+#
+##
+## Note: You can define startup slave screen by choosing screen from the list
+## above or an empty value for no slave screen.
+##
+#startup_slave_screen = ""
+#
+#startup_slave_screen_focus = no
+#
+##
+## Default width of locked screen (in %).  Acceptable values are from 20 to 80.
+##
+#
+#locked_screen_width_part = 50
+#
+#ask_for_locked_screen_width_part = yes
+#
+#jump_to_now_playing_song_at_start = yes
+#
+#ask_before_clearing_playlists = yes
+#
+#clock_display_seconds = no
+#
+display_volume_level = no
+#
+#display_bitrate = no
+#
+#display_remaining_time = no
+#
+## Available values: none, basic, extended, perl.
+##
+#regular_expressions = perl
+#
+##
+## Note: if below is enabled, ncmpcpp will ignore leading "The" word while
+## sorting items in browser, tags in media library, etc.
+##
+ignore_leading_the = yes
+#
+##
+## Note: if below is enabled, ncmpcpp will ignore diacritics while searching and
+## filtering lists. This takes an effect only if boost was compiled with ICU
+## support.
+##
+#ignore_diacritics = no
+#
+#block_search_constraints_change_if_items_found = yes
+#
+#mouse_support = yes
+#
+#mouse_list_scroll_whole_page = yes
+#
+#empty_tag_marker = <empty>
+#
+#tags_separator = " | "
+#
+#tag_editor_extended_numeration = no
+#
+#media_library_sort_by_mtime = no
+#
+#enable_window_title = yes
+#
+##
+## Note: You can choose default search mode for search engine. Available modes
+## are:
+##
+## - 1 - use mpd built-in searching (no regexes, pattern matching)
+##
+## - 2 - use ncmpcpp searching (pattern matching with support for regexes, but
+##       if your mpd is on a remote machine, downloading big database to process
+##       it can take a while
+##
+## - 3 - match only exact values (this mode uses mpd function for searching in
+##       database and local one for searching in current playlist)
+##
+#
+#search_engine_default_search_mode = 1
+#
+external_editor = nvim
+#
+## Note: set to yes if external editor is a console application.
+##
+use_console_editor = yes
+#
+##### colors definitions #####
+##
+## It is possible to set a background color by setting a color value
+## "<foreground>_<background>", e.g. red_black will set foregound color to red
+## and background color to black.
+##
+## In addition, for terminals that support 256 colors it is possible to set one
+## of them by using a number in range [1, 256] instead of color name,
+## e.g. numerical value corresponding to red_black is 2_1. To find out if the
+## terminal supports 256 colors, run ncmpcpp and check out the bottom of the
+## help screen for list of available colors and their numerical values.
+##
+## What is more, there are two special values for the background color:
+## "transparent" and "current". The first one explicitly sets the background to
+## be transparent, while the second one allows you to preserve current
+## background color and change only the foreground one. It's used implicitly
+## when background color is not specified.
+##
+## Moreover, it is possible to attach format information to selected color
+## variables by appending to their end a colon followed by one or more format
+## flags, e.g. black:b or red:ur. The following variables support this syntax:
+## visualizer_color, color1, color2, empty_tag_color, volume_color,
+## state_line_color, state_flags_color, progressbar_color,
+## progressbar_elapsed_color, player_state_color, statusbar_time_color,
+## alternative_ui_separator_color.
+##
+## Note: due to technical limitations of older ncurses version, if 256 colors
+## are used there is a possibility that you'll be able to use only colors with
+## transparent background.
+#
+#colors_enabled = yes
+#
+empty_tag_color = magenta
+#
+#header_window_color = magenta
+#
+#volume_color = default
+#
+#state_line_color = default
+#
+#state_flags_color = default:b
+#
+main_window_color = white
+#
+#color1 = white
+#
+#color2 = green
+#
+progressbar_color = black:b
+#
+progressbar_elapsed_color = blue:b
+#
+statusbar_color = red
+#
+statusbar_time_color = cyan:b
+#
+#player_state_color = default:b
+#
+#alternative_ui_separator_color = black:b
+#
+#window_border_color = green
+#
+#active_window_border = red
+#
diff --git a/config/newsboat/config b/config/newsboat/config
new file mode 100644
index 0000000..aeb6ddf
--- /dev/null
+++ b/config/newsboat/config
@@ -0,0 +1,38 @@
+#show-read-feeds no
+auto-reload yes
+
+external-url-viewer "urlscan -dc -r 'lh {}'"
+
+bind-key j down
+bind-key k up
+bind-key j next articlelist
+bind-key k prev articlelist
+bind-key J next-feed articlelist
+bind-key K prev-feed articlelist
+bind-key G end
+bind-key g home
+bind-key d pagedown
+bind-key u pageup
+bind-key l open
+bind-key h quit
+bind-key a toggle-article-read
+bind-key n next-unread
+bind-key N prev-unread
+bind-key D pb-download
+bind-key U show-urls
+bind-key x pb-delete
+bind-key ^t next-unread
+
+color listnormal cyan default
+color listfocus black yellow standout bold
+color listnormal_unread blue default
+color listfocus_unread yellow default bold
+color info red black bold
+color article cyan default
+
+browser lh
+macro , open-in-browser
+macro t set browser "youtube-dl --add-metadata -ic"; open-in-browser ; set browser lh
+macro a set browser "youtube-dl --config-location ~/.config/youtube-dl/config-audio --add-metadata -xic -f bestaudio/best"; open-in-browser ; set browser lh
+macro v set browser "mpv"; open-in-browser ; set browser lh
+macro w set browser "w3m"; open-in-browser ; set browser lh
diff --git a/config/nvim/colors/asmanian_blood.vim b/config/nvim/colors/asmanian_blood.vim
new file mode 100644
index 0000000..90df688
--- /dev/null
+++ b/config/nvim/colors/asmanian_blood.vim
@@ -0,0 +1,42 @@
+
+set background=dark
+
+hi Normal       guifg=#b4b0b0 guibg=#080404 gui=none
+hi NonText      guifg=#b4b0b0 guibg=#181414 gui=none
+hi SpecialKey   guifg=#b4b0b0 guibg=#282424 gui=bold
+
+hi Comment      guifg=#686460 guibg=#080404 gui=none
+hi Todo         guifg=#686460 guibg=#080404 gui=underline,italic
+hi Search       guifg=#000000 guibg=#00f0f0 gui=underline,italic
+hi Visual                     guibg=#282020
+hi MatchParen   guifg=#ffffff guibg=#904030 gui=none
+
+hi Title        guifg=#ffffff guibg=#202020 gui=underline
+hi Underlined   guifg=#b4b0b0 guibg=#080404 gui=underline
+
+hi CursorColumn guifg=#f4f0f0 guibg=#201c1c gui=none
+hi CursorLine   guifg=#f4f0f0 guibg=#201c1c gui=none
+
+hi StatusLine   guifg=#f8e0d0 guibg=#301810 gui=bold
+hi StatusLineNC guifg=#503830 guibg=#200800 gui=none
+hi VertSplit    guifg=#200800 guibg=#301810 gui=none
+hi LineNr       guifg=#848070 guibg=#181414 gui=none
+hi Folded       guifg=#484040 guibg=#080404 gui=bold,italic
+
+hi Define       guifg=#607080 guibg=#080404 gui=italic
+hi Function     guifg=#60b050 guibg=#080404 gui=italic
+hi PreProc      guifg=#a090a0 guibg=#080404 gui=italic
+hi Define       guifg=#806080 guibg=#080404 gui=italic
+hi Identifier   guifg=#c0b060 guibg=#080404 gui=italic
+
+hi Statement    guifg=#506090 guibg=#080404 gui=underline
+hi Repeat       guifg=#906050 guibg=#080404 gui=underline
+hi Conditional  guifg=#609050 guibg=#080404 gui=underline
+hi Exception    guifg=#903020 guibg=#080404 gui=underline
+
+hi Type         guifg=#705850 guibg=#080404 gui=italic
+hi String       guifg=#a06050 guibg=#080404 gui=italic
+hi Special      guifg=#a06050 guibg=#181414 gui=italic
+hi Number       guifg=#60d060 guibg=#080404 gui=none
+hi Constant     guifg=#60d060 guibg=#080404 gui=none
+
diff --git a/config/nvim/init.vim b/config/nvim/init.vim
new file mode 100644
index 0000000..41450bb
--- /dev/null
+++ b/config/nvim/init.vim
@@ -0,0 +1,104 @@
+" PLUGINS
+" we plug now, babey
+if ! filereadable(expand('~/.config/nvim/autoload/plug.vim'))
+	echo "Downloading junegunn/vim-plug to manage plugins..."
+	silent !mkdir -p ~/.config/nvim/autoload/
+	silent !curl "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > ~/.config/nvim/autoload/plug.vim
+endif
+call plug#begin('~/.local/share/nvim/plugged')
+" MatchTag
+Plug 'gregsexton/matchtag'
+" lightline.vim
+Plug 'itchyny/lightline.vim'
+" wal.vim
+Plug 'dylanaraps/wal.vim'
+" vim-fugitive
+Plug 'tpope/vim-fugitive'
+" vim-gitgutter
+Plug 'airblade/vim-gitgutter'
+" vim-surround
+Plug 'tpope/vim-surround'
+" JsBeautify
+Plug 'maksimr/vim-jsbeautify'
+" recognize color tags
+Plug 'lilydjwg/colorizer'
+" syntax checking
+Plug 'vim-syntastic/syntastic'
+"" VimCompletesMe
+"Plug 'ajh17/VimCompletesMe'
+" END PLUGINS
+call plug#end()
+
+" end of vim-plug related lines
+
+"colo wal
+colo asmanian_blood
+set tgc
+
+" productivity binds
+
+" unbind arrow keys like some kind of neurotic chucklefuck
+noremap <Up> <NOP>
+noremap <Down> <NOP>
+noremap <Left> <NOP>
+noremap <Right> <NOP>
+inoremap <Up> <NOP>
+inoremap <Down> <NOP>
+inoremap <Left> <NOP>
+inoremap <Right> <NOP>
+
+"" JsBeautify binds
+autocmd FileType javascript noremap <buffer>  <c-f> :call JsBeautify()<cr>
+" for json
+autocmd FileType json noremap <buffer> <c-f> :call JsonBeautify()<cr>
+" for jsx
+autocmd FileType jsx noremap <buffer> <c-f> :call JsxBeautify()<cr>
+" for html
+autocmd FileType html noremap <buffer> <c-f> :call HtmlBeautify()<cr>
+" for css or scss
+autocmd FileType css noremap <buffer> <c-f> :call CSSBeautify()<cr>
+"" and for visual mode:
+autocmd FileType javascript vnoremap <buffer>  <c-f> :call RangeJsBeautify()<cr>
+" for json
+autocmd FileType json vnoremap <buffer> <c-f> :call RangeJsonBeautify()<cr>
+" for jsx
+autocmd FileType jsx vnoremap <buffer> <c-f> :call RangeJsxBeautify()<cr>
+" for html
+autocmd FileType html vnoremap <buffer> <c-f> :call RangeHtmlBeautify()<cr>
+" for css or scss
+autocmd FileType css vnoremap <buffer> <c-f> :call RangeCSSBeautify()<cr>
+
+" syntastic config
+set statusline+=%#warningmsg#
+set statusline+=%{SyntasticStatuslineFlag()}
+set statusline+=%*
+
+let g:syntastic_always_populate_loc_list = 1
+let g:syntastic_auto_loc_list = 1
+let g:syntastic_check_on_open = 1
+let g:syntastic_check_on_wq = 0
+
+let g:syntastic_c_checkers = ["cppcheck"]
+let g:syntastic_sh_checkers = ["shellcheck", "sh"]
+
+" lightline config
+set noshowmode
+let g:lightline = {
+	\ 'colorscheme': 'selenized_dark',
+	\ 'separator': {
+	\	'left': '',
+	\	'right': ''
+	\	},
+	\ 'subseparator': {
+	\	'left': '',
+	\	'right': ''
+	\	},
+	\ }
+
+" betterize
+set path+=**
+
+" add a ctags shortcut like a shitty goblin
+command! MakeTags !ectags -R .
+" make make work when im learning c
+autocmd BufRead $HOME/src/c-practice/*.c set makeprg=cc\ --std=c89\ %
diff --git a/config/shrc b/config/shrc
new file mode 100644
index 0000000..a3cc31c
--- /dev/null
+++ b/config/shrc
@@ -0,0 +1,34 @@
+#!/bin/sh
+# cleaner shell environment than .profile, used with shenv
+export XDG_CACHE_HOME="$HOME/.cache"
+export XDG_CONFIG_HOME="$HOME/.config"
+export XDG_DATA_HOME="$HOME/.local/share"
+
+export PATH="$HOME/.local/bin:$PATH"
+
+export EDITOR="nvim"
+export FILE="lf"
+export PAGER="less"
+export TERMINAL="st"
+export BROWSER="firefox"
+export COMM="comm-sel"
+export READER="zathura"
+export MAILER="neomutt"
+export MUSIC="ncmpcpp"
+export RSS="newsboat"
+export ISH="zsh"
+export SCR="maim"
+export LOCK="slock"
+export LESS='-iMRS -x2'
+export LANGUAGE="en"
+export LANG="POSIX.UTF-8"
+export LC_ALL="POSIX.UTF-8"
+export CLICOLOR=1
+
+#cleanup paths
+export GTK2_RC_FILES="$XDG_CONFIG_HOME/gtk-2.0/gtkrc-2.0"
+export LESSHISTFILE="-"
+export GOPATH="$HOME/.local/go"
+export CARGO_HOME="$XDG_DATA_HOME/cargo"
+export MEDNAFEN_HOME="$XDG_CONFIG_HOME/mednafen"
+export ZDOTDIR="$XDG_CONFIG_HOME/zsh"
diff --git a/config/user-dirs.dirs b/config/user-dirs.dirs
new file mode 100644
index 0000000..a442350
--- /dev/null
+++ b/config/user-dirs.dirs
@@ -0,0 +1,15 @@
+# This file is written by xdg-user-dirs-update
+# If you want to change or add directories, just edit the line you're
+# interested in. All local changes will be retained on the next run
+# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
+# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
+# absolute path. No other format is supported.
+# 
+XDG_DESKTOP_DIR="$HOME/"
+XDG_DOWNLOAD_DIR="$HOME/dl"
+XDG_TEMPLATES_DIR="$HOME"
+XDG_PUBLICSHARE_DIR="$HOME/pub"
+XDG_DOCUMENTS_DIR="$HOME/doc"
+XDG_MUSIC_DIR="$HOME/mus"
+XDG_PICTURES_DIR="$HOME/pic"
+XDG_VIDEOS_DIR="$HOME/vid"
diff --git a/config/wal/templates/6cord.toml b/config/wal/templates/6cord.toml
new file mode 100644
index 0000000..f267982
--- /dev/null
+++ b/config/wal/templates/6cord.toml
@@ -0,0 +1,11 @@
+[ properties ]
+	true-color = true
+	default-name-color = "{color7}"
+	mention-color = "{color5}"
+	mention-self-color = "{color14}"
+	compact-mode = false
+	syntax-highlight-colorscheme = "native"
+	show-emoji-urls = false
+	obfuscate-words = false
+	shorten-url = false
+
diff --git a/config/wal/templates/colors-wal-dmenu.h b/config/wal/templates/colors-wal-dmenu.h
new file mode 100644
index 0000000..afcbb8d
--- /dev/null
+++ b/config/wal/templates/colors-wal-dmenu.h
@@ -0,0 +1,6 @@
+static const char *colors[SchemeLast][2] = {{
+	/*     fg         bg       */
+	[SchemeNorm] = {{ "{color13}", "{color0}" }},
+	[SchemeSel] = {{ "{color13}", "{color4}" }},
+	[SchemeOut] = {{ "{color13}", "{color8}" }},
+}};
diff --git a/config/wal/templates/colors-wal-dwm.h b/config/wal/templates/colors-wal-dwm.h
new file mode 100644
index 0000000..133c7a3
--- /dev/null
+++ b/config/wal/templates/colors-wal-dwm.h
@@ -0,0 +1,13 @@
+static const char norm_fg[] = "{color13}";
+static const char norm_bg[] = "{color0}";
+static const char norm_border[] = "{color8}";
+
+static const char sel_fg[] = "{color13}";
+static const char sel_bg[] = "{color4}";
+static const char sel_border[] = "{color9}";
+
+static const char *colors[][3]      = {{
+    /*               fg           bg         border                         */
+    [SchemeNorm] = {{ norm_fg,     norm_bg,   norm_border }}, // unfocused wins
+    [SchemeSel]  = {{ sel_fg,      sel_bg,    sel_border }},  // the focused win
+}};
diff --git a/config/wal/templates/colors.Xresources b/config/wal/templates/colors.Xresources
new file mode 100644
index 0000000..480c104
--- /dev/null
+++ b/config/wal/templates/colors.Xresources
@@ -0,0 +1,58 @@
+! X colors.
+! Generated by 'wal'
+*foreground:        {foreground}
+*background:        {background}
+*.foreground:       {foreground}
+*.background:       {background}
+*cursorColor:       {cursor}
+*.cursorColor:      {cursor}
+XTerm*foreground:   {foreground}
+XTerm*background:   {background}
+XTerm*cursorColor:  {cursor}
+
+! Colors 0-15.
+*.color0: {color0}
+*color0:  {color0}
+*.color1: {color1}
+*color1:  {color1}
+*.color2: {color2}
+*color2:  {color2}
+*.color3: {color3}
+*color3:  {color3}
+*.color4: {color4}
+*color4:  {color4}
+*.color5: {color5}
+*color5:  {color5}
+*.color6: {color6}
+*color6:  {color6}
+*.color7: {color7}
+*color7:  {color7}
+*.color8: {color8}
+*color8:  {color8}
+*.color9: {color9}
+*color9:  {color9}
+*.color10: {color10}
+*color10:  {color10}
+*.color11: {color11}
+*color11:  {color11}
+*.color12: {color12}
+*color12:  {color12}
+*.color13: {color13}
+*color13:  {color13}
+*.color14: {color14}
+*color14:  {color14}
+*.color15: {color15}
+*color15:  {color15}
+
+! Black color that will not be affected by bold highlighting.
+*.color66: {color0}
+*color66:  {color0}
+
+! Xclock colors.
+XClock*foreground: {foreground}
+XClock*background: {background}
+XClock*majorColor:  rgba:{color15.xrgba}
+XClock*minorColor:  rgba:{color15.xrgba}
+XClock*hourColor:   rgba:{color15.xrgba}
+XClock*minuteColor: rgba:{color15.xrgba}
+XClock*secondColor: rgba:{color15.xrgba}
diff --git a/config/wal/templates/dunstrc b/config/wal/templates/dunstrc
new file mode 100644
index 0000000..cea407f
--- /dev/null
+++ b/config/wal/templates/dunstrc
@@ -0,0 +1,93 @@
+[colors]
+	background = "{color8}"
+	foreground = "{color15}"
+
+[global]
+    ### Display ###
+
+    monitor = 0
+    follow = mouse
+
+    geometry = "540x5-10+32"
+    indicate_hidden = yes
+    shrink = yes
+    transparency = 0
+    notification_height = 0
+    separator_height = 3
+    padding = 12
+    horizontal_padding = 12
+    frame_width = 3
+
+    frame_color = "{color10}"
+    separator_color = auto
+    sort = yes
+    idle_threshold = 120
+
+    ### Text ###
+    font = Terminus 9
+    line_height = 0
+
+    markup = full
+
+    # The format of the message.  Possible variables are:
+    #   %a  appname
+    #   %s  summary
+    #   %b  body
+    #   %i  iconname (including its path)
+    #   %I  iconname (without its path)
+    #   %p  progress value if set ([  0%] to [100%]) or nothing
+    #   %n  progress value if set without any extra characters
+    #   %%  Literal %
+    # Markup is allowed
+    format = "<b>%s </b>\n%b"
+    alignment = left
+    show_age_threshold = 60
+    word_wrap = yes
+    ellipsize = middle
+    ignore_newline = no
+    stack_duplicates = true
+    hide_duplicate_count = false
+    show_indicators = yes
+
+    ### Icons ###
+    icon_position = left
+    max_icon_size = 64
+    icon_path = /usr/local/share/icons/Adwaita/16x16/status/:/usr/local/share/icons/Adwaita/16x16/devices/
+
+    ### History ###
+    sticky_history = yes
+    history_length = 20
+
+    ### Misc/Advanced ###
+    dmenu = /usr/local/bin/dmenu -fn "Terminus:style=Regular:pixelsize=12" -nb "{color0}" -nf "{color13}" -sb "{color4}" -sf "{color13}" -p dunst:
+    browser = /usr/local/bin/firefox -new-tab
+    always_run_script = true
+    title = Dunst
+    class = Dunst
+    startup_notification = false
+    force_xinerama = false
+
+[experimental]
+    per_monitor_dpi = false
+
+[shortcuts]
+    close = ctrl+space
+    close_all = ctrl+shift+space
+    context = ctrl+shift+period
+
+[urgency_low]
+    background = colors.background
+    foreground = colors.foreground
+    timeout = 10
+
+[urgency_normal]
+    background = colors.background
+    foreground = colors.foreground
+    timeout = 10
+
+[urgency_critical]
+    background = colors.background
+    foreground = colors.foreground
+    frame_color = "{color9}"
+    timeout = 0
+# vim: ft=cfg
diff --git a/config/wal/templates/zathurarc b/config/wal/templates/zathurarc
new file mode 100644
index 0000000..ebfd44a
--- /dev/null
+++ b/config/wal/templates/zathurarc
@@ -0,0 +1,34 @@
+# actual zathura config
+set recolor "true"
+
+set completion-bg "{color0}"
+set completion-fg "{color15}"
+set completion-group-bg "{color0}"
+set completion-group-fg "{color2}"
+set completion-highlight-bg "{color15}"
+set completion-highlight-fg "{color0}"
+
+set recolor-lightcolor "{color0}"
+set recolor-darkcolor "{color15}"
+set default-bg "{color0}"
+
+set inputbar-bg "{color0}"
+set inputbar-fg "{color15}"
+set notification-bg "{color0}"
+set notification-fg "{color15}"
+set notification-error-bg "{color1}"
+set notification-error-fg "{color15}"
+set notification-warning-bg "{color1}"
+set notification-warning-fg "{color15}"
+set statusbar-bg "{color0}"
+set statusbar-fg "{color15}"
+set index-bg "{color0}"
+set index-fg "{color15}"
+set index-active-bg "{color15}"
+set index-active-fg "{color0}"
+set render-loading-bg "{color0}"
+set render-loading-fg "{color15}"
+
+set window-title-home-tilde true
+set statusbar-basename true
+set selection-clipboard clipboard
diff --git a/config/youtube-dl/config b/config/youtube-dl/config
new file mode 100644
index 0000000..46041ac
--- /dev/null
+++ b/config/youtube-dl/config
@@ -0,0 +1,9 @@
+--prefer-free-formats
+# always use axel
+--external-downloader axel
+# coherent output format
+--output ~/vid/%(uploader)s:%(title)s.%(ext)s
+# always merge into mkv
+--merge-output-format mkv
+# embed subtitles if they are to be written
+--embed-subs
diff --git a/config/youtube-dl/config-music b/config/youtube-dl/config-music
new file mode 100644
index 0000000..a5cf801
--- /dev/null
+++ b/config/youtube-dl/config-music
@@ -0,0 +1,6 @@
+# only download audio stream
+--format bestaudio
+# always use axel
+--external-downloader axel
+# coherent output format
+--output ~/mus/%(uploader)s/%(album)s/S%(track_number)s-%(track)s.%(ext)s
diff --git a/config/zsh/.zshrc b/config/zsh/.zshrc
new file mode 120000
index 0000000..c8b42f4
--- /dev/null
+++ b/config/zsh/.zshrc
@@ -0,0 +1 @@
+zshrc
\ No newline at end of file
diff --git a/config/zsh/00-opts.zsh b/config/zsh/00-opts.zsh
new file mode 100644
index 0000000..4573008
--- /dev/null
+++ b/config/zsh/00-opts.zsh
@@ -0,0 +1,3 @@
+setopt append_history auto_pushd hist_ignore_dups inc_append_history
+setopt interactive_comments list_packed no_auto_menu no_autocd
+setopt no_beep no_share_history pushd_ignore_dups
diff --git a/config/zsh/binds.zsh b/config/zsh/binds.zsh
new file mode 100644
index 0000000..02c0fc7
--- /dev/null
+++ b/config/zsh/binds.zsh
@@ -0,0 +1,12 @@
+autoload up-line-or-beginning-search down-line-or-beginning-search edit-command-line
+zle -N up-line-or-beginning-search
+zle -N down-line-or-beginning-search
+zle -N edit-command-line
+bindkey -v
+bindkey -a "!" edit-command-line
+[[ -n "$terminfo[kpp]"   ]] && bindkey "$terminfo[kpp]"   up-line-or-beginning-search   # PAGE UP
+[[ -n "$terminfo[knp]"   ]] && bindkey "$terminfo[knp]"   down-line-or-beginning-search # PAGE DOWN
+[[ -n "$terminfo[khome]" ]] && bindkey "$terminfo[khome]" beginning-of-line             # HOME
+[[ -n "$terminfo[kend]"  ]] && bindkey "$terminfo[kend]"  end-of-line                   # END
+[[ -n "$terminfo[kdch1]" ]] && bindkey "$terminfo[kdch1]" delete-char                   # DELETE
+[[ -n "$terminfo[kbs]"   ]] && bindkey "$terminfo[kbs]"   backward-delete-char          # BACKSPACE
diff --git a/config/zsh/exports.zsh b/config/zsh/exports.zsh
new file mode 100644
index 0000000..48ec72b
--- /dev/null
+++ b/config/zsh/exports.zsh
@@ -0,0 +1,7 @@
+. $XDG_CONFIG_HOME/shrc
+# exports for convenience
+export GITHUB="https://github.com"
+# make pfetch show what i want
+export PF_INFO="ascii title os host shell editor wm pkgs uptime palette"
+# fix manpath so local man pages work
+export MANPATH="/usr/share/man:/usr/X11R6/man:/usr/local/man:$XDG_DATA_HOME/man"
diff --git a/config/zsh/functions.zsh b/config/zsh/functions.zsh
new file mode 100644
index 0000000..fca5709
--- /dev/null
+++ b/config/zsh/functions.zsh
@@ -0,0 +1,2 @@
+mc() { mkdir $1 && cd $1 }
+pw() { "$(which -p pw)" "$1" "$2" & }
diff --git a/config/zsh/themes/p10k.zsh b/config/zsh/themes/p10k.zsh
new file mode 100644
index 0000000..db7e1a9
--- /dev/null
+++ b/config/zsh/themes/p10k.zsh
@@ -0,0 +1,856 @@
+# Generated by Powerlevel10k configuration wizard on 2019-10-24 at 12:41 PDT.
+# Based on romkatv/powerlevel10k/config/p10k-rainbow.zsh.
+# Wizard options: nerdfont-complete + powerline, small icons, rainbow,
+# slanted separators, slanted heads, flat tails, 2 lines, disconnected, no frame,
+# compact, few icons, concise.
+# Type `p10k configure` to generate another config.
+#
+# Config for Powerlevel10k with powerline prompt style with colorful background.
+# Type `p10k configure` to generate your own config based on it.
+#
+# Tip: Looking for a nice color? Here's a one-liner to print colormap.
+#
+#   for i in {0..255}; do print -Pn "%${i}F${(l:3::0:)i}%f " ${${(M)$((i%8)):#7}:+$'\n'}; done
+
+# Temporarily change options.
+'builtin' 'local' '-a' 'p10k_config_opts'
+[[ ! -o 'aliases'         ]] || p10k_config_opts+=('aliases')
+[[ ! -o 'sh_glob'         ]] || p10k_config_opts+=('sh_glob')
+[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand')
+'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand'
+
+() {
+  emulate -L zsh
+  setopt no_unset extended_glob
+  zmodload zsh/langinfo
+  if [[ ${langinfo[CODESET]:-} != (utf|UTF)(-|)8 ]]; then
+    local LC_ALL=${${(@M)$(locale -a):#*.(utf|UTF)(-|)8}[1]:-en_US.UTF-8}
+  fi
+
+  # Unset all configuration options. This allows you to apply configuration changes without
+  # restarting zsh. Edit ~/.p10k.zsh and type `source ~/.p10k.zsh`.
+  unset -m 'POWERLEVEL9K_*'
+
+  # The list of segments shown on the left. Fill it with the most important segments.
+  typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
+      # =========================[ Line #1 ]=========================
+      os_icon                 # os identifier
+      prompt_char             # prompt symbol
+      dir                     # current directory
+      vcs                     # git status
+      # =========================[ Line #2 ]=========================
+      newline
+      # prompt_char             # prompt symbol
+  )
+
+  # The list of segments shown on the right. Fill it with less important segments.
+  # Right prompt on the last prompt line (where you are typing your commands) gets
+  # automatically hidden when the input line reaches it. Right prompt above the
+  # last prompt line gets hidden if it would overlap with left prompt.
+  typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
+      # =========================[ Line #1 ]=========================
+      status                  # exit code of the last command
+      command_execution_time  # duration of the last command
+      background_jobs         # presence of background jobs
+      # virtualenv            # python virtual environment (https://docs.python.org/3/library/venv.html)
+      # anaconda              # conda environment (https://conda.io/)
+      # pyenv                 # python environment (https://github.com/pyenv/pyenv)
+      # nodenv                # node.js version from nodenv (https://github.com/nodenv/nodenv)
+      # nvm                   # node.js version from nvm (https://github.com/nvm-sh/nvm)
+      # nodeenv               # node.js environment (https://github.com/ekalinin/nodeenv)
+      # node_version          # node.js version
+      # go_version            # go version (https://golang.org)
+      # rust_version          # rustc version (https://www.rust-lang.org)
+      # dotnet_version        # .NET version (https://dotnet.microsoft.com)
+      # rbenv                 # ruby version from rbenv (https://github.com/rbenv/rbenv)
+      # rvm                   # ruby version from rvm (https://rvm.io)
+      # kubecontext           # current kubernetes context (https://kubernetes.io/)
+      # terraform             # terraform workspace (https://www.terraform.io)
+      # aws                   # aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)
+      # aws_eb_env            # aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/)
+      # azure                 # azure account name (https://docs.microsoft.com/en-us/cli/azure)
+      context                 # user@hostname
+      # nordvpn               # nordvpn connection status, linux only (https://nordvpn.com/)
+      # ranger                # ranger shell (https://github.com/ranger/ranger)
+      # vpn_ip                # virtual private network indicator
+      # ram                   # free RAM
+      # load                  # CPU load
+      # time                  # current time
+      # =========================[ Line #2 ]=========================
+      newline
+      # public_ip             # public IP address
+      # proxy                 # system-wide http/https/ftp proxy
+      # battery               # internal battery
+      # example               # example user-defined segment (see prompt_example function below)
+  )
+
+  # To disable default icons for all segments, set POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION=''.
+  #
+  # To enable default icons for all segments, don't define POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION
+  # or set it to '${P9K_VISUAL_IDENTIFIER}'.
+  #
+  # To remove trailing space from all default icons, set POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION
+  # to '${P9K_VISUAL_IDENTIFIER% }'.
+  #
+  # To enable default icons for one segment (e.g., dir), set
+  # POWERLEVEL9K_DIR_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER}'.
+  #
+  # To assign a specific icon to one segment (e.g., dir), set
+  # POWERLEVEL9K_DIR_VISUAL_IDENTIFIER_EXPANSION='⭐'.
+  #
+  # To assign a specific icon to a segment in a given state (e.g., dir in state NOT_WRITABLE),
+  # set POWERLEVEL9K_DIR_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐'.
+  #
+  # Note: You can use $'\u2B50' instead of '⭐'. It's especially convenient when specifying
+  # icons that your text editor cannot render. Don't forget to put $ and use single quotes when
+  # defining icons via Unicode codepoints.
+  #
+  # Note: Many default icons cannot be displayed with system fonts. You'll need to install a
+  # capable font to use them. See POWERLEVEL9K_MODE below.
+  typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER// }'
+
+  # This option makes a difference only when default icons are enabled for all or some prompt
+  # segments (see POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION above). LOCK_ICON can be printed as
+  # $'\uE0A2', $'\uE138' or $'\uF023' depending on POWERLEVEL9K_MODE. The correct value of this
+  # parameter depends on the provider of the font your terminal is using.
+  #
+  #   Font Provider                    | POWERLEVEL9K_MODE
+  #   ---------------------------------+-------------------
+  #   Powerline                        | powerline
+  #   Font Awesome                     | awesome-fontconfig
+  #   Adobe Source Code Pro            | awesome-fontconfig
+  #   Source Code Pro                  | awesome-fontconfig
+  #   Awesome-Terminal Fonts (regular) | awesome-fontconfig
+  #   Awesome-Terminal Fonts (patched) | awesome-patched
+  #   Nerd Fonts                       | nerdfont-complete
+  #   Other                            | compatible
+  #
+  # If this looks overwhelming, either stick with a preinstalled system font and set
+  # POWERLEVEL9K_MODE=compatible, or install the recommended Powerlevel10k font from
+  # https://github.com/romkatv/powerlevel10k/#recommended-meslo-nerd-font-patched-for-powerlevel10k
+  # and set POWERLEVEL9K_MODE=nerdfont-complete.
+  typeset -g POWERLEVEL9K_MODE=nerdfont-complete
+
+  # When set to true, icons appear before content on both sides of the prompt. When set
+  # to false, icons go after content. If empty or not set, icons go before content in the left
+  # prompt and after content in the right prompt.
+  #
+  # You can also override it for a specific segment:
+  #
+  #   POWERLEVEL9K_STATUS_ICON_BEFORE_CONTENT=false
+  #
+  # Or for a specific segment in specific state:
+  #
+  #   POWERLEVEL9K_DIR_NOT_WRITABLE_ICON_BEFORE_CONTENT=false
+  typeset -g POWERLEVEL9K_ICON_BEFORE_CONTENT=
+
+  # Add an empty line before each prompt.
+  typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=false
+
+  # Connect left prompt lines with these symbols. You'll probably want to use the same color
+  # as POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND below.
+  typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX=
+  typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX=
+  typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX=
+  # Connect right prompt lines with these symbols.
+  typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX=
+  typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX=
+  typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX=
+
+  # Filler between left and right prompt on the first prompt line. You can set it to ' ', '·' or
+  # '─'. The last two make it easier to see the alignment between left and right prompt and to
+  # separate prompt from command output. You might want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false
+  # for more compact prompt if using using this option.
+  typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' '
+  typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_BACKGROUND=
+  if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then
+    # The color of the filler. You'll probably want to match the color of POWERLEVEL9K_MULTILINE
+    # ornaments defined above.
+    typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=242
+    # Start filler from the edge of the screen if there are no left segments on the first line.
+    typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_FIRST_SEGMENT_END_SYMBOL='%{%}'
+    # End filler on the edge of the screen if there are no right segments on the first line.
+    typeset -g POWERLEVEL9K_EMPTY_LINE_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='%{%}'
+  fi
+
+  # Separator between same-color segments on the left.
+  typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR='\uE0B9'
+  # Separator between same-color segments on the right.
+  typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR='\uE0B9'
+  # Separator between different-color segments on the left.
+  typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\uE0B8'
+  # Separator between different-color segments on the right.
+  typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\uE0BE'
+  # The right end of left prompt.
+  typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uE0B8'
+  # The left end of right prompt.
+  typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uE0BE'
+  # The left end of left prompt.
+  typeset -g POWERLEVEL9K_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL=''
+  # The right end of right prompt.
+  typeset -g POWERLEVEL9K_RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL=''
+  # Left prompt terminator for lines without any segments.
+  typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL=
+
+  #################################[ os_icon: os identifier ]##################################
+  # OS identifier color.
+  # typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND=255
+  # typeset -g POWERLEVEL9K_OS_ICON_BACKGROUND=0
+  # Make the icon bold.
+  typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='${P9K_CONTENT// }'
+
+  ################################[ prompt_char: prompt symbol ]################################
+  # Transparent background.
+  typeset -g POWERLEVEL9K_PROMPT_CHAR_BACKGROUND=8
+  # Green prompt symbol if the last command succeeded.
+  typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS}_FOREGROUND=76
+  # Red prompt symbol if the last command failed.
+  typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS}_FOREGROUND=196
+  # Default prompt symbol.
+  # typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='❯'
+  typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION=' INSERT '
+  # Prompt symbol in command vi mode.
+  # typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='❮'
+  typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION=' NORMAL '
+  # Prompt symbol in visual vi mode.
+  # typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='Ⅴ'
+  typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION=' VISUAL '
+  # Prompt symbol in overwrite vi mode.
+  # typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION='▶'
+  typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION=' REPLACE '
+  typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=true
+  # No line terminator if prompt_char is the last segment.
+  typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL=
+  # No line introducer if prompt_char is the first segment.
+  typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL=
+  # No surrounding whitespace.
+  typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_{LEFT,RIGHT}_WHITESPACE=
+
+  ##################################[ dir: current directory ]##################################
+  # Current directory background color.
+  # typeset -g POWERLEVEL9K_DIR_BACKGROUND=4
+  # Default current directory foreground color.
+  typeset -g POWERLEVEL9K_DIR_FOREGROUND=254
+  # If directory is too long, shorten some of its segments to the shortest possible unique
+  # prefix. The shortened directory can be tab-completed to the original.
+  typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique
+  # Replace removed segment suffixes with this symbol.
+  typeset -g POWERLEVEL9K_SHORTEN_DELIMITER=
+  # Color of the shortened directory segments.
+  typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=250
+  # Color of the anchor directory segments. Anchor segments are never shortened. The first
+  # segment is always an anchor.
+  typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=255
+  # Display anchor directory segments in bold.
+  typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true
+  # Don't shorten directories that contain any of these files. They are anchors.
+  local anchor_files=(
+    .bzr
+    .citc
+    .git
+    .hg
+    .node-version
+    .python-version
+    .ruby-version
+    .shorten_folder_marker
+    .svn
+    .terraform
+    CVS
+    Cargo.toml
+    composer.json
+    go.mod
+    package.json
+  )
+  typeset -g POWERLEVEL9K_SHORTEN_FOLDER_MARKER="(${(j:|:)anchor_files})"
+  # Don't shorten this many last directory segments. They are anchors.
+  typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=1
+  # Shorten directory if it's longer than this even if there is space for it. The value can
+  # be either absolute (e.g., '80') or a percentage of terminal width (e.g, '50%'). If empty,
+  # directory will be shortened only when prompt doesn't fit or when other parameters demand it
+  # (see POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS and POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT below).
+  typeset -g POWERLEVEL9K_DIR_MAX_LENGTH=80
+  # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least this
+  # many columns for typing commands.
+  typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS=40
+  # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least
+  # COLUMNS * POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT * 0.01 columns for typing commands.
+  typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT=50
+  # If set to true, embed a hyperlink into the directory. Useful for quickly
+  # opening a directory in the file manager simply by clicking the link.
+  # Can also be handy when the directory is shortened, as it allows you to see
+  # the full directory that was used in previous commands.
+  typeset -g POWERLEVEL9K_DIR_HYPERLINK=false
+
+  # Enable special styling for non-writable directories.
+  typeset -g POWERLEVEL9K_DIR_SHOW_WRITABLE=true
+  # Show this icon when the current directory is not writable. POWERLEVEL9K_DIR_SHOW_WRITABLE
+  # above must be set to true for this parameter to have effect.
+  # typeset -g POWERLEVEL9K_DIR_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  # Custom prefix.
+  # typeset -g POWERLEVEL9K_DIR_PREFIX='in '
+
+  # POWERLEVEL9K_DIR_CLASSES allows you to specify custom icons for different directories.
+  # It must be an array with 3 * N elements. Each triplet consists of:
+  #
+  #   1. A pattern against which the current directory is matched. Matching is done with
+  #      extended_glob option enabled.
+  #   2. Directory class for the purpose of styling.
+  #   3. Icon.
+  #
+  # Triplets are tried in order. The first triplet whose pattern matches $PWD wins. If there
+  # are no matches, the directory will have no icon.
+  #
+  # Example:
+  #
+  #   typeset -g POWERLEVEL9K_DIR_CLASSES=(
+  #       '~/work(/*)#'  WORK     '(╯°□°)╯︵ ┻━┻'
+  #       '~(/*)#'       HOME     '⌂'
+  #       '*'            DEFAULT  '')
+  #
+  # With these settings, the current directory in the prompt may look like this:
+  #
+  #   (╯°□°)╯︵ ┻━┻ ~/work/projects/important/urgent
+  #
+  # Or like this:
+  #
+  #   ⌂ ~/best/powerlevel10k
+  #
+  # You can also set different colors for directories of different classes. Remember to override
+  # FOREGROUND, SHORTENED_FOREGROUND and ANCHOR_FOREGROUND for every directory class that you wish
+  # to have its own color.
+  #
+  #   typeset -g POWERLEVEL9K_DIR_WORK_BACKGROUND=4
+  #   typeset -g POWERLEVEL9K_DIR_WORK_FOREGROUND=254
+  #   typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=250
+  #   typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=255
+  #
+  typeset -g POWERLEVEL9K_DIR_CLASSES=()
+
+  #####################################[ vcs: git status ]######################################
+  # Versio control system colors.
+  # typeset -g POWERLEVEL9K_VCS_CLEAN_BACKGROUND=2
+  # typeset -g POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=3
+  # typeset -g POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=2
+  # typeset -g POWERLEVEL9K_VCS_CONFLICTED_BACKGROUND=3
+  # typeset -g POWERLEVEL9K_VCS_LOADING_BACKGROUND=8
+
+  # Branch icon. Set this parameter to '\uF126 ' for the popular Powerline branch icon.
+  typeset -g POWERLEVEL9K_VCS_BRANCH_ICON='\uF126 '
+  POWERLEVEL9K_VCS_BRANCH_ICON=${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}
+
+  # Untracked files icon. It's really a question mark, your font isn't broken.
+  # Change the value of this parameter to show a different icon.
+  typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?'
+  POWERLEVEL9K_VCS_UNTRACKED_ICON=${(g::)POWERLEVEL9K_VCS_UNTRACKED_ICON}
+
+  # Formatter for Git status.
+  #
+  # Example output: master ⇣42⇡42 *42 merge ~42 +42 !42 ?42.
+  #
+  # You can edit the function to customize how Git status looks.
+  #
+  # VCS_STATUS_* parameters are set by gitstatus plugin. See reference:
+  # https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh.
+  function my_git_formatter() {
+    emulate -L zsh
+
+    if [[ -n $P9K_CONTENT ]]; then
+      # If P9K_CONTENT is not empty, use it. It's either "loading" or from vcs_info (not from
+      # gitstatus plugin). VCS_STATUS_* parameters are not available in this case.
+      typeset -g my_git_format=$P9K_CONTENT
+      return
+    fi
+
+    # Styling for different parts of Git status.
+    local       meta='%7F' # white foreground
+    local      clean='%0F' # black foreground
+    local   modified='%0F' # black foreground
+    local  untracked='%0F' # black foreground
+    local conflicted='%1F' # red foreground
+
+    local res
+    local where  # branch name, tag or commit
+    if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then
+      res+="${clean}${POWERLEVEL9K_VCS_BRANCH_ICON}"
+      where=${(V)VCS_STATUS_LOCAL_BRANCH}
+    elif [[ -n $VCS_STATUS_TAG ]]; then
+      res+="${meta}#"
+      where=${(V)VCS_STATUS_TAG}
+    else
+      res+="${meta}@"
+      where=${VCS_STATUS_COMMIT[1,8]}
+    fi
+
+    # If local branch name or tag is at most 32 characters long, show it in full.
+    # Otherwise show the first 12 … the last 12.
+    (( $#where > 32 )) && where[13,-13]="…"
+    res+="${clean}${where//\%/%%}"  # escape %
+
+    # Show tracking branch name if it differs from local branch.
+    if [[ -n ${VCS_STATUS_REMOTE_BRANCH:#$VCS_STATUS_LOCAL_BRANCH} ]]; then
+      res+="${meta}:${clean}${(V)VCS_STATUS_REMOTE_BRANCH//\%/%%}"  # escape %
+    fi
+
+    # ⇣42 if behind the remote.
+    (( VCS_STATUS_COMMITS_BEHIND )) && res+=" ${clean}⇣${VCS_STATUS_COMMITS_BEHIND}"
+    # ⇡42 if ahead of the remote; no leading space if also behind the remote: ⇣42⇡42.
+    (( VCS_STATUS_COMMITS_AHEAD && !VCS_STATUS_COMMITS_BEHIND )) && res+=" "
+    (( VCS_STATUS_COMMITS_AHEAD  )) && res+="${clean}⇡${VCS_STATUS_COMMITS_AHEAD}"
+    # *42 if have stashes.
+    (( VCS_STATUS_STASHES        )) && res+=" ${clean}*${VCS_STATUS_STASHES}"
+    # 'merge' if the repo is in an unusual state.
+    [[ -n $VCS_STATUS_ACTION     ]] && res+=" ${conflicted}${VCS_STATUS_ACTION}"
+    # ~42 if have merge conflicts.
+    (( VCS_STATUS_NUM_CONFLICTED )) && res+=" ${conflicted}~${VCS_STATUS_NUM_CONFLICTED}"
+    # +42 if have staged changes.
+    (( VCS_STATUS_NUM_STAGED     )) && res+=" ${modified}+${VCS_STATUS_NUM_STAGED}"
+    # !42 if have unstaged changes.
+    (( VCS_STATUS_NUM_UNSTAGED   )) && res+=" ${modified}!${VCS_STATUS_NUM_UNSTAGED}"
+    # ?42 if have untracked files. It's really a question mark, your font isn't broken.
+    # See POWERLEVEL9K_VCS_UNTRACKED_ICON above if you want to use a different icon.
+    # Remove the next line if you don't want to see untracked files at all.
+    (( VCS_STATUS_NUM_UNTRACKED  )) && res+=" ${untracked}${POWERLEVEL9K_VCS_UNTRACKED_ICON}${VCS_STATUS_NUM_UNTRACKED}"
+
+    typeset -g my_git_format=$res
+  }
+  functions -M my_git_formatter 2>/dev/null
+
+  # Disable the default Git status formatting.
+  typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=true
+  # Install our own Git status formatter.
+  typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${$((my_git_formatter(1)))+${my_git_format}}'
+  # Enable counters for staged, unstaged, etc.
+  typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1
+
+  # Custom icon.
+  typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION=
+  # Custom prefix.
+  # typeset -g POWERLEVEL9K_VCS_PREFIX='on '
+
+  # Show status of repositories of these types. You can add svn and/or hg if you are
+  # using them. If you do, your prompt may become slow even when your current directory
+  # isn't in an svn or hg reposotiry.
+  typeset -g POWERLEVEL9K_VCS_BACKENDS=(git)
+
+  ##########################[ status: exit code of the last command ]###########################
+  # Enable OK_PIPE, ERROR_PIPE and ERROR_SIGNAL status states to allow us to enable, disable and
+  # style them independently from the regular OK and ERROR state.
+  typeset -g POWERLEVEL9K_STATUS_EXTENDED_STATES=true
+
+  # Status on success. No content, just an icon. No need to show it if prompt_char is enabled as
+  # it will signify success by turning green.
+  typeset -g POWERLEVEL9K_STATUS_OK=false
+  typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='✔'
+  # typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=2
+  # typeset -g POWERLEVEL9K_STATUS_OK_BACKGROUND=0
+
+  # Status when some part of a pipe command fails but the overall exit status is zero. It may look
+  # like this: 1|0.
+  typeset -g POWERLEVEL9K_STATUS_OK_PIPE=true
+  typeset -g POWERLEVEL9K_STATUS_OK_PIPE_VISUAL_IDENTIFIER_EXPANSION='✔'
+  # typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND=2
+  # typeset -g POWERLEVEL9K_STATUS_OK_PIPE_BACKGROUND=0
+
+  # Status when it's just an error code (e.g., '1'). No need to show it if prompt_char is enabled as
+  # it will signify error by turning red.
+  typeset -g POWERLEVEL9K_STATUS_ERROR=false
+  typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='↵'
+  # typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=3
+  # typeset -g POWERLEVEL9K_STATUS_ERROR_BACKGROUND=1
+
+  # Status when the last command was terminated by a signal.
+  typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true
+  # Use terse signal names: "INT" instead of "SIGINT(2)".
+  typeset -g POWERLEVEL9K_STATUS_VERBOSE_SIGNAME=false
+  typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_VISUAL_IDENTIFIER_EXPANSION='↵'
+  # typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=3
+  # typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_BACKGROUND=1
+
+  # Status when some part of a pipe command fails and the overall exit status is also non-zero.
+  # It may look like this: 1|0.
+  typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE=true
+  typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION='↵'
+  # typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND=3
+  # typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_BACKGROUND=1
+
+  ###################[ command_execution_time: duration of the last command ]###################
+  # Execution time color.
+  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=0
+  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=3
+  # Show duration of the last command if takes longer than this many seconds.
+  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3
+  # Show this many fractional digits. Zero means round to seconds.
+  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0
+  # Duration format: 1d 2h 3m 4s.
+  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s'
+  # Custom icon.
+  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_VISUAL_IDENTIFIER_EXPANSION=
+  # Custom prefix.
+  # typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PREFIX='took '
+
+  #######################[ background_jobs: presence of background jobs ]#######################
+  # Background jobs color.
+  # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=6
+  # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_BACKGROUND=0
+  # Don't show the number of background jobs.
+  typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false
+  # Icon to show when there are background jobs.
+  typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER// }'
+
+  ##########[ nordvpn: nordvpn connection status, linux only (https://nordvpn.com/) ]###########
+  # NordVPN connection indicator color.
+  # typeset -g POWERLEVEL9K_NORDVPN_FOREGROUND=7
+  # typeset -g POWERLEVEL9K_NORDVPN_BACKGROUND=4
+  # Hide NordVPN connection indicator when not connected.
+  typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_CONTENT_EXPANSION=
+  typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_VISUAL_IDENTIFIER_EXPANSION=
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_NORDVPN_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  #################[ ranger: ranger shell (https://github.com/ranger/ranger) ]##################
+  # Ranger shell color.
+  # typeset -g POWERLEVEL9K_RANGER_FOREGROUND=3
+  # typeset -g POWERLEVEL9K_RANGER_BACKGROUND=0
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ######################################[ ram: free RAM ]#######################################
+  # RAM color.
+  # typeset -g POWERLEVEL9K_RAM_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_RAM_BACKGROUND=3
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ######################################[ load: CPU load ]######################################
+  # Show average CPU load over this many last minutes. Valid values are 1, 5 and 15.
+  typeset -g POWERLEVEL9K_LOAD_WHICH=5
+  # Load color when load is under 50%.
+  # typeset -g POWERLEVEL9K_LOAD_NORMAL_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_LOAD_NORMAL_BACKGROUND=2
+  # Load color when load is between 50% and 70%.
+  # typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_LOAD_WARNING_BACKGROUND=3
+  # Load color when load is over 70%.
+  # typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_LOAD_CRITICAL_BACKGROUND=1
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_LOAD_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ##################################[ context: user@hostname ]##################################
+  # Default context color.
+  typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=3
+  typeset -g POWERLEVEL9K_CONTEXT_BACKGROUND=0
+  # Default context format: %n is username, %m is hostname.
+  typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%n@%m'
+
+  # Context color when running with privileges.
+  typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=1
+  typeset -g POWERLEVEL9K_CONTEXT_ROOT_BACKGROUND=0
+  # Context format when running with privileges: %n is username, %m is hostname.
+  typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%n@%m'
+
+  # Don't show context unless running with privileges or in SSH.
+  # Tip: Remove the next line to always show context.
+  typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION=
+
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_CONTEXT_VISUAL_IDENTIFIER_EXPANSION='⭐'
+  # Custom prefix.
+  # typeset -g POWERLEVEL9K_CONTEXT_PREFIX='with '
+
+  ###[ virtualenv: python virtual environment (https://docs.python.org/3/library/venv.html) ]###
+  # Python virtual environment color.
+  # typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_VIRTUALENV_BACKGROUND=4
+  # Don't show Python version next to the virtual environment name.
+  typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false
+  # Separate environment name from Python version only with a space.
+  typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER=
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_VIRTUALENV_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  #####################[ anaconda: conda environment (https://conda.io/) ]######################
+  # Anaconda environment color.
+  # typeset -g POWERLEVEL9K_ANACONDA_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_ANACONDA_BACKGROUND=4
+  # Don't show Python version next to the anaconda environment name.
+  typeset -g POWERLEVEL9K_ANACONDA_SHOW_PYTHON_VERSION=false
+  # Separate environment name from Python version only with a space.
+  typeset -g POWERLEVEL9K_ANACONDA_{LEFT,RIGHT}_DELIMITER=
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_ANACONDA_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ################[ pyenv: python environment (https://github.com/pyenv/pyenv) ]################
+  # Pyenv color.
+  # typeset -g POWERLEVEL9K_PYENV_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_PYENV_BACKGROUND=4
+  # Don't show the current Python version if it's the same as global.
+  typeset -g POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW=false
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_PYENV_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ##########[ nodenv: node.js version from nodenv (https://github.com/nodenv/nodenv) ]##########
+  # Nodenv color.
+  # typeset -g POWERLEVEL9K_NODENV_FOREGROUND=2
+  # typeset -g POWERLEVEL9K_NODENV_BACKGROUND=0
+  # Don't show node version if it's the same as global: $(nodenv version-name) == $(nodenv global).
+  typeset -g POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW=false
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_NODENV_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ##############[ nvm: node.js version from nvm (https://github.com/nvm-sh/nvm) ]###############
+  # Nvm color.
+  # typeset -g POWERLEVEL9K_NVM_FOREGROUND=70
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_NVM_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ############[ nodeenv: node.js environment (https://github.com/ekalinin/nodeenv) ]############
+  # Nodeenv color.
+  # typeset -g POWERLEVEL9K_NODEENV_FOREGROUND=2
+  # typeset -g POWERLEVEL9K_NODEENV_BACKGROUND=0
+  # Don't show Node version next to the environment name.
+  typeset -g POWERLEVEL9K_NODEENV_SHOW_NODE_VERSION=false
+  # Separate environment name from Node version only with a space.
+  typeset -g POWERLEVEL9K_NODEENV_{LEFT,RIGHT}_DELIMITER=
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_NODEENV_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ##############################[ node_version: node.js version ]###############################
+  # Node version color.
+  # typeset -g POWERLEVEL9K_NODE_VERSION_FOREGROUND=7
+  # typeset -g POWERLEVEL9K_NODE_VERSION_BACKGROUND=2
+  # Show node version only when in a directory tree containing package.json.
+  typeset -g POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY=true
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_NODE_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  #######################[ go_version: go version (https://golang.org) ]########################
+  # Go version color.
+  # typeset -g POWERLEVEL9K_GO_VERSION_FOREGROUND=255
+  # typeset -g POWERLEVEL9K_GO_VERSION_BACKGROUND=2
+  # Show go version only when in a go project subdirectory.
+  typeset -g POWERLEVEL9K_GO_VERSION_PROJECT_ONLY=true
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_GO_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  #################[ rust_version: rustc version (https://www.rust-lang.org) ]##################
+  # Rust version color.
+  # typeset -g POWERLEVEL9K_RUST_VERSION_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_RUST_VERSION_BACKGROUND=208
+  # Show rust version only when in a rust project subdirectory.
+  typeset -g POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY=true
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_RUST_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ###############[ dotnet_version: .NET version (https://dotnet.microsoft.com) ]################
+  # .NET version color.
+  # typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND=7
+  # typeset -g POWERLEVEL9K_DOTNET_VERSION_BACKGROUND=5
+  # Show .NET version only when in a .NET project subdirectory.
+  typeset -g POWERLEVEL9K_DOTNET_VERSION_PROJECT_ONLY=true
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_DOTNET_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  #############[ rbenv: ruby version from rbenv (https://github.com/rbenv/rbenv) ]##############
+  # Rbenv color.
+  # typeset -g POWERLEVEL9K_RBENV_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_RBENV_BACKGROUND=1
+  # Don't show ruby version if it's the same as global: $(rbenv version-name) == $(rbenv global).
+  typeset -g POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW=false
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_RBENV_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  #######################[ rvm: ruby version from rvm (https://rvm.io) ]########################
+  # Rvm color.
+  # typeset -g POWERLEVEL9K_RVM_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_RVM_BACKGROUND=240
+  # Don't show @gemset at the end.
+  typeset -g POWERLEVEL9K_RVM_SHOW_GEMSET=false
+  # Don't show ruby- at the front.
+  typeset -g POWERLEVEL9K_RVM_SHOW_PREFIX=false
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_RVM_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ################[ terraform: terraform workspace (https://www.terraform.io) ]#################
+  # Terraform color.
+  # typeset -g POWERLEVEL9K_TERRAFORM_FOREGROUND=4
+  # typeset -g POWERLEVEL9K_TERRAFORM_BACKGROUND=0
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_TERRAFORM_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  #[ aws: aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) ]#
+  # AWS profile color.
+  # typeset -g POWERLEVEL9K_AWS_FOREGROUND=7
+  # typeset -g POWERLEVEL9K_AWS_BACKGROUND=1
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_AWS_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  #[ aws_eb_env: aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) ]#
+  # AWS Elastic Beanstalk environment color.
+  # typeset -g POWERLEVEL9K_AWS_EB_ENV_FOREGROUND=2
+  # typeset -g POWERLEVEL9K_AWS_EB_ENV_BACKGROUND=0
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_AWS_EB_ENV_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ##########[ azure: azure account name (https://docs.microsoft.com/en-us/cli/azure) ]##########
+  # Azure account name color.
+  # typeset -g POWERLEVEL9K_AZURE_FOREGROUND=7
+  # typeset -g POWERLEVEL9K_AZURE_BACKGROUND=4
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_AZURE_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  #############[ kubecontext: current kubernetes context (https://kubernetes.io/) ]#############
+  # Kubernetes context classes for the purpose of using different colors, icons and expansions with
+  # different contexts.
+  #
+  # POWERLEVEL9K_KUBECONTEXT_CLASSES is an array with even number of elements. The first element
+  # in each pair defines a pattern against which the current kubernetes context gets matched.
+  # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below)
+  # that gets matched. If you unset all POWERLEVEL9K_KUBECONTEXT_*CONTENT_EXPANSION parameters,
+  # you'll see this value in your prompt. The second element of each pair in
+  # POWERLEVEL9K_KUBECONTEXT_CLASSES defines the context class. Patterns are tried in order. The
+  # first match wins.
+  #
+  # For example, given these settings:
+  #
+  #   typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=(
+  #     '*prod*'  PROD
+  #     '*test*'  TEST
+  #     '*'       DEFAULT)
+  #
+  # If your current kubernetes context is "deathray-testing/default", its class is TEST
+  # because "deathray-testing/default" doesn't match the pattern '*prod*' but does match '*test*'.
+  #
+  # You can define different colors, icons and content expansions for different classes:
+  #
+  #   typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_FOREGROUND=0
+  #   typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_BACKGROUND=2
+  #   typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐'
+  #   typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <'
+  typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=(
+      # '*prod*'  PROD    # These values are examples that are unlikely
+      # '*test*'  TEST    # to match your needs. Customize them as needed.
+      '*'       DEFAULT)
+  typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_FOREGROUND=7
+  typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_BACKGROUND=5
+  # typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  # Use POWERLEVEL9K_KUBECONTEXT_CONTENT_EXPANSION to specify the content displayed by kubecontext
+  # segment. Parameter expansions are very flexible and fast, too. See reference:
+  # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion.
+  #
+  # Within the expansion the following parameters are always available:
+  #
+  # - P9K_CONTENT                The content that would've been displayed if there was no content
+  #                              expansion defined.
+  # - P9K_KUBECONTEXT_NAME       The current context's name. Corresponds to column NAME in the
+  #                              output of `kubectl config get-contexts`.
+  # - P9K_KUBECONTEXT_CLUSTER    The current context's cluster. Corresponds to column CLUSTER in the
+  #                              output of `kubectl config get-contexts`.
+  # - P9K_KUBECONTEXT_NAMESPACE  The current context's namespace. Corresponds to column NAMESPACE
+  #                              in the output of `kubectl config get-contexts`. If there is no
+  #                              namespace, the parameter is set to "default".
+  #
+  # If the context points to Google Kubernetes Engine (GKE) or Elastic Kubernetes Service (EKS),
+  # the following extra parameters are available:
+  #
+  # - P9K_KUBECONTEXT_CLOUD_NAME     Either "gke" or "eks".
+  # - P9K_KUBECONTEXT_CLOUD_ACCOUNT  Account/project ID.
+  # - P9K_KUBECONTEXT_CLOUD_ZONE     Availability zone.
+  # - P9K_KUBECONTEXT_CLOUD_CLUSTER  Cluster.
+  #
+  # P9K_KUBECONTEXT_CLOUD_* parameters are derived from P9K_KUBECONTEXT_CLUSTER. For example,
+  # if P9K_KUBECONTEXT_CLUSTER is "gke_my-account_us-east1-a_my-cluster-01":
+  #
+  #   - P9K_KUBECONTEXT_CLOUD_NAME=gke
+  #   - P9K_KUBECONTEXT_CLOUD_ACCOUNT=my-account
+  #   - P9K_KUBECONTEXT_CLOUD_ZONE=us-east1-a
+  #   - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01
+  #
+  # If P9K_KUBECONTEXT_CLUSTER is "arn:aws:eks:us-east-1:123456789012:cluster/my-cluster-01":
+  #
+  #   - P9K_KUBECONTEXT_CLOUD_NAME=eks
+  #   - P9K_KUBECONTEXT_CLOUD_ACCOUNT=123456789012
+  #   - P9K_KUBECONTEXT_CLOUD_ZONE=us-east-1
+  #   - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01
+  typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION=
+  # Show P9K_KUBECONTEXT_CLOUD_CLUSTER if it's not empty and fall back to P9K_KUBECONTEXT_NAME.
+  POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${P9K_KUBECONTEXT_CLOUD_CLUSTER:-${P9K_KUBECONTEXT_NAME}}'
+  # Append the current context's namespace if it's not "default".
+  POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${${:-/$P9K_KUBECONTEXT_NAMESPACE}:#/default}'
+
+  # Custom prefix.
+  # typeset -g POWERLEVEL9K_KUBECONTEXT_PREFIX='at '
+
+  ###############################[ public_ip: public IP address ]###############################
+  # Public IP color.
+  # typeset -g POWERLEVEL9K_PUBLIC_IP_FOREGROUND=7
+  # typeset -g POWERLEVEL9K_PUBLIC_IP_BACKGROUND=0
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_PUBLIC_IP_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ########################[ vpn_ip: virtual private network indicator ]#########################
+  # VPN IP color.
+  # typeset -g POWERLEVEL9K_VPN_IP_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_VPN_IP_BACKGROUND=6
+  # When on VPN, show just an icon without the IP address.
+  typeset -g POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION=
+  # Regular expression for the VPN network interface. Run ifconfig while on VPN to see the
+  # name of the interface.
+  typeset -g POWERLEVEL9K_VPN_IP_INTERFACE='(wg|(.*tun))[0-9]*'
+  # Icon to show when on VPN.
+  typeset -g POWERLEVEL9K_VPN_IP_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER// }'
+
+  #########################[ proxy: system-wide http/https/ftp proxy ]##########################
+  # Proxy color.
+  # typeset -g POWERLEVEL9K_PROXY_FOREGROUND=4
+  # typeset -g POWERLEVEL9K_PROXY_BACKGROUND=0
+  # Custom icon.
+  # typeset -g POWERLEVEL9K_PROXY_VISUAL_IDENTIFIER_EXPANSION='⭐'
+
+  ################################[ battery: internal battery ]#################################
+  # Show battery in red when it's below this level and not connected to power supply.
+  typeset -g POWERLEVEL9K_BATTERY_LOW_THRESHOLD=20
+  typeset -g POWERLEVEL9K_BATTERY_LOW_FOREGROUND=1
+  # Show battery in green when it's charging or fully charged.
+  typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=2
+  # Show battery in yellow when it's discharging.
+  typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=3
+  # Battery pictograms going from low to high level of charge.
+  typeset -g POWERLEVEL9K_BATTERY_STAGES=$'\uf58d\uf579\uf57a\uf57b\uf57c\uf57d\uf57e\uf57f\uf580\uf581\uf578'
+  # Don't show the remaining time to charge/discharge.
+  typeset -g POWERLEVEL9K_BATTERY_VERBOSE=false
+  # typeset -g POWERLEVEL9K_BATTERY_BACKGROUND=0
+
+  ####################################[ time: current time ]####################################
+  # Current time color.
+  # typeset -g POWERLEVEL9K_TIME_FOREGROUND=0
+  # typeset -g POWERLEVEL9K_TIME_BACKGROUND=7
+  # Format for the current time: 09:51:02. See `man 3 strftime`.
+  typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}'
+  # If set to true, time will update when you hit enter. This way prompts for the past
+  # commands will contain the start times of their commands as opposed to the default
+  # behavior where they contain the end times of their preceding commands.
+  typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false
+  # Custom icon.
+  typeset -g POWERLEVEL9K_TIME_VISUAL_IDENTIFIER_EXPANSION=
+  # Custom prefix.
+  # typeset -g POWERLEVEL9K_TIME_PREFIX='at '
+
+  # Example of a user-defined prompt segment. Function prompt_example will be called on every
+  # prompt if `example` prompt segment is added to POWERLEVEL9K_LEFT_PROMPT_ELEMENTS or
+  # POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. It displays an icon and orange text greeting the user.
+  #
+  # Type `p10k help segment` for documentation and a more sophisticated example.
+  function prompt_example() {
+    p10k segment -b red -f yellow -i '⭐' -t 'hello, %n'
+  }
+
+  # User-defined prompt segments can be customized the same way as built-in segments.
+  # typeset -g POWERLEVEL9K_EXAMPLE_FOREGROUND=4
+  typeset -g POWERLEVEL9K_EXAMPLE_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER}'
+}
+
+(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]}
+'builtin' 'unset' 'p10k_config_opts'
diff --git a/config/zsh/zshrc b/config/zsh/zshrc
new file mode 100644
index 0000000..559b1ca
--- /dev/null
+++ b/config/zsh/zshrc
@@ -0,0 +1,53 @@
+export XDG_CACHE_HOME=${XDG_CACHE_HOME:=~/.cache}
+export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:=~/.config}
+export XDG_DATA_HOME=${XDG_DATA_HOME:=~/.local/share}
+if printf "$PATH"|grep -q ".local/bin"; then
+	export PATH="$PATH:$HOME/.local/bin"
+fi
+
+HISTFILE=$XDG_DATA_HOME/zsh/histfile
+HISTSIZE=5000
+SAVEHIST=5000
+
+typeset -A ZPLGM
+ZPLG_HOME=$XDG_CACHE_HOME/zsh/zplugin
+ZPLGM[HOME_DIR]=$ZPLG_HOME
+ZPLGM[ZCOMPDUMP_PATH]=$XDG_CACHE_HOME/zsh/zcompdump
+ZPLGM[COMPLETIONS_DIR]=$XDG_DATA_HOME/zsh/completions
+if [[ ! -f $ZPLG_HOME/bin/zplugin.zsh ]]; then
+	git clone https://github.com/zdharma/zplugin $ZPLG_HOME/bin
+	zcompile $ZPLG_HOME/bin/zplugin.zsh
+fi
+autoload -Uz _zplugin
+(( ${+_comps} )) && _comps[zplugin]=_zplugin
+source $ZPLG_HOME/bin/zplugin.zsh
+load=light
+
+#load zsh external configs
+for file in $ZDOTDIR/*.zsh; do
+	source "$file"
+done
+#make fpath not contain all the completions I don't use (enable completions using "zplugin creinstall [PATH_TO_COMPLETIONS_FOLDER]")
+if [[ -d /usr/local/share/zsh ]]; then
+fpath=($XDG_DATA_HOME/zsh/completions /usr/local/share/zsh/site-functions /usr/local/share/zsh/$ZSH_VERSION/functions/Calendar /usr/local/share/zsh/$ZSH_VERSION/functions/Chpwd /usr/local/share/zsh/$ZSH_VERSION/functions/Completion /usr/local/share/zsh/$ZSH_VERSION/functions/Exceptions /usr/local/share/zsh/$ZSH_VERSION/functions/MIME /usr/local/share/zsh/$ZSH_VERSION/functions/Exceptions /usr/local/share/zsh/$ZSH_VERSION/functions/Math /usr/local/share/zsh/$ZSH_VERSION/functions/Exceptions /usr/local/share/zsh/$ZSH_VERSION/functions/Misc /usr/local/share/zsh/$ZSH_VERSION/functions/TCP /usr/local/share/zsh/$ZSH_VERSION/functions/VCS_Info /usr/local/share/zsh/$ZSH_VERSION/functions/VCS_Info/Backends /usr/local/share/zsh/$ZSH_VERSION/functions/Zftp /usr/local/share/zsh/$ZSH_VERSION/functions/Zle)
+else
+fpath=($XDG_DATA_HOME/zsh/completions /usr/share/zsh/site-functions /usr/share/zsh/$ZSH_VERSION/functions/Calendar /usr/share/zsh/$ZSH_VERSION/functions/Chpwd /usr/share/zsh/$ZSH_VERSION/functions/Completion /usr/share/zsh/$ZSH_VERSION/functions/Exceptions /usr/share/zsh/$ZSH_VERSION/functions/MIME /usr/share/zsh/$ZSH_VERSION/functions/Exceptions /usr/share/zsh/$ZSH_VERSION/functions/Math /usr/share/zsh/$ZSH_VERSION/functions/Exceptions /usr/share/zsh/$ZSH_VERSION/functions/Misc /usr/share/zsh/$ZSH_VERSION/functions/TCP /usr/share/zsh/$ZSH_VERSION/functions/VCS_Info /usr/share/zsh/$ZSH_VERSION/functions/VCS_Info/Backends /usr/share/zsh/$ZSH_VERSION/functions/Zftp /usr/share/zsh/$ZSH_VERSION/functions/Zle)
+fi
+# load shortcutrc and aliasrc to grab cross-shell niceties
+[ -f "$XDG_CONFIG_HOME/shortcutrc" ] && source "$XDG_CONFIG_HOME/shortcutrc"
+[ -f "$XDG_CONFIG_HOME/aliasrc" ] && source "$XDG_CONFIG_HOME/aliasrc"
+# plugin loading goes here:
+# theme
+zplugin ice silent depth=1
+zplugin $load romkatv/powerlevel10k
+# Ctrl-R functionality
+zplugin $load zdharma/history-search-multi-word
+# completions
+zplugin ice blockf
+zplugin $load zsh-users/zsh-completions
+# good, fast syntax highlighting
+zplugin ice silent wait!1 atload"ZPLGM[COMPINIT_OPTS]=-C; zpcompinit"
+zplugin $load zdharma/fast-syntax-highlighting
+
+# theme config loading
+[ -f "$ZDOTDIR/themes/p10k.zsh" ] && source "$ZDOTDIR/themes/p10k.zsh"
diff --git a/data/applications/doc.desktop b/data/applications/doc.desktop
new file mode 100644
index 0000000..49a399b
--- /dev/null
+++ b/data/applications/doc.desktop
@@ -0,0 +1,4 @@
+[Desktop Entry]
+Type=Application
+Name=Non-raw document reader
+Exec=/usr/bin/env zathura %u
diff --git a/data/applications/img.desktop b/data/applications/img.desktop
new file mode 100644
index 0000000..d754e1a
--- /dev/null
+++ b/data/applications/img.desktop
@@ -0,0 +1,4 @@
+[Desktop Entry]
+Type=Application
+Name=Image viewer
+Exec=/usr/bin/env sxiv -a %u
diff --git a/data/applications/rss.desktop b/data/applications/rss.desktop
new file mode 100644
index 0000000..20ed292
--- /dev/null
+++ b/data/applications/rss.desktop
@@ -0,0 +1,4 @@
+[Desktop Entry]
+Type=Application
+Name=RSS feed addition
+Exec=/usr/bin/env rsschk %U
diff --git a/data/applications/text.desktop b/data/applications/text.desktop
new file mode 100644
index 0000000..44afc9a
--- /dev/null
+++ b/data/applications/text.desktop
@@ -0,0 +1,4 @@
+[Desktop Entry]
+Type=Application
+Name=Text editor
+Exec=/usr/bin/env st -e nvim %u
diff --git a/data/applications/weblight.desktop b/data/applications/weblight.desktop
new file mode 100644
index 0000000..651d75a
--- /dev/null
+++ b/data/applications/weblight.desktop
@@ -0,0 +1,4 @@
+[Desktop Entry]
+Type=Application
+Name=Light Web Browser
+Exec=/usr/bin/env surf %u
diff --git a/data/mailcap b/data/mailcap
new file mode 100644
index 0000000..d57b783
--- /dev/null
+++ b/data/mailcap
@@ -0,0 +1,4 @@
+text/plain; $EDITOR %s ;
+text/html; lynx -assume_charset=%{charset} -display_charset=utf-8 -dump %s; nametemplate=%s.html; copiousoutput;
+video/*; mpv --quiet %s &; copiousoutput
+application/pdf; $READER %s ;