diff --git a/.config/lf/clean b/.config/lf/clean
index 08c54ef..91a9aa5 100755
--- a/.config/lf/clean
+++ b/.config/lf/clean
@@ -1,3 +1,3 @@
 #!/usr/bin/env bash
-kitty +icat --clear --silent --transfer-mode file
+kitty +kitten icat --clear --transfer-mode file
 
diff --git a/.config/lf/lfrc b/.config/lf/lfrc
index 293ee41..7f15071 100644
--- a/.config/lf/lfrc
+++ b/.config/lf/lfrc
@@ -2,75 +2,64 @@
 set ratios 1:2:4
 set shellopts '-eu'
 set ifs "\n"
+set findlen 1
 set scrolloff 10
 set icons
 set wrapscroll
 set period 1
-set findlen 2
 set previewer ~/.config/lf/preview
 set cleaner ~/.config/lf/clean
 set promptfmt "\033[34;1m%u\033[36m@\033[34m%h \033[35m[\033[0;1m%d\033[33m%f\033[35m]\033[0m"
 
 cmd open ${{
   case $(file --mime-type "$(readlink -f $f)" -b) in
-  	application/vnd.openxmlformats-officedocument.spreadsheetml.sheet) localc $fx ;;
-  	image/vnd.djvu|application/pdf|application/octet-stream|application/postscript) setsid -f zathura $fx >/dev/null 2>&1 ;;
     text/*|application/json|inode/x-empty) $EDITOR $fx;;
-  	image/x-xcf) setsid -f gimp $f >/dev/null 2>&1 ;;
-  	image/svg+xml) display -- $f ;;
-  	image/*) rotdir $f | grep -i "\.\(png\|jpg\|jpeg\|gif\|webp\|tif\|ico\)\(_large\)*$" |
-  		setsid -f sxiv -aio 2>/dev/null | while read -r file; do
-  			[ -z "$file" ] && continue
-  			lf -remote "send select \"$file\""
-  			lf -remote "send toggle"
-  		done &
-  		;;
-  	audio/*) mpv --audio-display=no $f ;;
-  	video/*) setsid -f mpv $f -quiet >/dev/null 2>&1 ;;
-  	application/pdf|application/vnd*|application/epub*) setsid -f zathura $fx >/dev/null 2>&1 ;;
-  	application/pgp-encrypted) $EDITOR $fx ;;
-    *) for f in $fx; do setsid -f $OPENER $f >/dev/null 2>&1; done;;
+    application/pgp-encrypted) $EDITOR $fx ;;
   esac
 }}
 
 cmd mkdir $mkdir -p "$(echo $* | tr ' ' '\ ')"
 
 cmd extract ${{
-	clear; tput cup $(($(tput lines)/3)); tput bold
-	set -f
-	printf "%s\n\t" "$fx"
-	printf "extract?[y/N]"
-	read ans
-	[ $ans = "y" ] && aunpack $fx
+    clear; tput cup $(($(tput lines)/3)); tput bold
+    set -f
+    printf "%s\n\t" "$fx"
+    printf "extract?[y/N]"
+    read ans
+    [ $ans = "y" ] && aunpack $fx
 }}
 
 cmd delete ${{
-	clear; tput cup $(($(tput lines)/3)); tput bold
-	set -f
-	printf "%s\n\t" "$fx"
-	printf "delete?[y/N]"
-	read ans
-	[ $ans = "y" ] && rm -rf -- $fx
+    clear; tput cup $(($(tput lines)/3)); tput bold
+    set -f
+    printf "%s\n\t" "$fx"
+    printf "delete?[y/N]"
+    read ans
+    [ $ans = "y" ] && rm -rf -- $fx
 }}
 
 cmd trash ${{
-	clear; tput cup $(($(tput lines)/3)); tput bold
-	set -f
-	printf "%s\n\t" "$fx"
-	printf "trash?[y/N]"
-	read ans
-	[ $ans = "y" ] && trash-put $fx
+    clear; tput cup $(($(tput lines)/3)); tput bold
+    set -f
+    printf "%s\n\t" "$fx"
+    printf "trash?[y/N]"
+    read ans
+    if [ $ans = "y" ]; then 
+        for f in $fx; do
+            echo $f
+            trash-put $f
+        done
+    fi
 }}
 
-cmd rsyncto ${{
-  clear; tput cup $(($(tput lines)/3)); tput bold
-  set -f
-  clear; echo "rsync to where?"
-  read dest
-  for x in $fx; do
+cmd rsyncto %{{
+    clear; tput cup $(($(tput lines)/3)); tput bold
+    set -f
+    clear; echo "rsync to where?"
+    read dest
+    for x in $fx; do
           eval rsync -aAXHv \"$x\" \"$dest\"
-  done &&
-	notify-send "File(s) rsynced." "File(s) copies to $dest."
+    done
 }}
 
 # y (select for copy) and P to paste soft-link
@@ -93,21 +82,11 @@ cmd link %{{
     lf -remote "send clear"
 }}
 
-cmd setbg "$1"
 cmd bulkrename $vidir
 
-cmd git_branch ${{
-    git branch | fzf | xargs git checkout
-    pwd_shell=$(pwd)
-    lf -remote "send $id updir"
-    lf -remote "send $id cd \"$pwd_shell\""
-}}
-
-
-
 cmd on-cd &{{
     DIR=$(echo $PWD | sed "s|$HOME|~|")
-    printf "\033]0;$(hostname):  $DIR\007" > /dev/tty
+    printf "\033]0; $DIR\007" > /dev/tty
 }}
 on-cd
 
@@ -137,31 +116,42 @@ cmd paste &{{
 cmd share $curl -F"file=@$fx" https://0x0.snaile.de | xclip -r -selection c
 
 # Bindings
-map <c-f> $lf -remote "send $id select '$(fzf)'"
+map <c-c>a $lf -remote "send $id select '$(fzf)'"
+map <c-c>t $lf -remote "send $id select '$(cat ${XDG_DATA_HOME:-$HOME/.local/share}/lf/tags | sed 's/:\*$//' | fzf)'"
+map <c-c>f $lf -remote "send $id select '$(cat ${XDG_DATA_HOME:-$HOME/.local/share}/lf/shortcut-files | fzf)'"
+map <c-c>d $lf -remote "send $id cd '$(cat ${XDG_DATA_HOME:-$HOME/.local/share}/lf/shortcut-dirs | fzf)'"
 map J $dir=$(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf) && lf -remote "send $id cd $(eval echo $dir)"
 map D trash
 map <c-d> delete
-map E extract
+map T $trash-restore $PWD
+map <c-e> extract
 map R rsyncto
 map P link
 map S share
 map <c-g> $lazygit
-map V push :!$EDITOR<space>
+map <c-v> push :!$EDITOR<space>
 map <c-n> push :mkdir<space>
+map <c-t> push :&touch<space>
 map <c-r> reload
 map <c-s> set hidden!
 map <enter> shell
 map x $$f
 map X !$f
 map o &mimeopen $f
-map O $mimeopen --ask $f
-
+map O $mimeopen -a $f
 map A rename # at the very end
 map a push A<c-a> # at the very beginning
 map I push A<a-b> # after extension
 map i push A<a-b><a-b><a-f> # before extension
 map c push A<c-u> # new rename
 map B bulkrename
+map b dupe
+map u :clear; unselect
+map n &echo $f | xclip -r -selection c
+map <esc> quit
+map N
+map g/ cd "/" 
+map W &setsid $TERMINAL -e $SHELL -c "lf; $SHELL"
 
-# source directory shortcuts
+# Load bookmark shortcuts
 source "~/.config/lf/shortcutrc"
diff --git a/.config/lf/preview b/.config/lf/preview
index 79b9838..7499826 100755
--- a/.config/lf/preview
+++ b/.config/lf/preview
@@ -1,73 +1,61 @@
 #!/usr/bin/env bash
 image() {
-    file=$1
+    f=$1
     w=$2
     h=$3
     x=$4
     y=$5
-    kitty +icat --silent --transfer-mode file --place "${w}x${h}@${x}x${y}" "$file"
+    chafa "$f" -f symbols -s "$((w-2))x$h" && exit 1
+    echo -e "\e[31mImage previewer not installed\e[0m"
     exit 1
 }
 
 video() {
-    file=$1
+    f=$1
     w=$2
     h=$3
     x=$4
     y=$5
-    thumb="$(vidthumb "$file")"
-    if [ "$thumb" != "" ]; then
-      kitty +icat --silent --transfer-mode file --place "${w}x${h}@${x}x${y}" "$thumb" 
-      exit 1
-    fi
-    mediainfo "$file"
-    exit 1
+    thumb="$(vidthumb "$f")" || ( echo -e "\e[31mvidthumb script not in path\e[0m" && return 1 )
+    image "$thumb" "$w" "$h" "$x" "$y" 
+    return 1
 }
 
 batorcat() {
-	file="$1"
-	shift
-	if command -v bat > /dev/null 2>&1; then
-		bat --color=always --style=plain --pager=never "$file" "$@"
-  elif command -v batcat > /dev/null 2>&1; then 
-		batcat --color=always --style=plain --pager=never "$file" "$@"
-	else
-		cat "$file"
-	fi
+	f=$1
+    w=$2
+	command -v bat > /dev/null 2>&1 && bat --color=always --style=plain --pager=never --terminal-width "$((w-2))" "$f" && exit 0
+    command -v batcat > /dev/null 2>&1 && batcat --color=always --style=plain --pager=never --terminal-width "$((w-2))" "$f" && exit 0
+	cat "$f" && exit 0
 }
 
 CACHE="$HOME/.cache/lf/thumbnail.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | awk '{print $1}'))"
 
-case "$(printf "%s\n" "$(readlink -f "$1")" | awk '{print tolower($0)}')" in
-  *.md) glow "$1"  && exit 0 ;;
-  *.xml|*.html) w3m -dump "$1" && exit 0 ;;
-	*.[1-8]) man "$1" | col -b && exit 0 ;;
-	*.o) nm "$1" && exit 0 ;;
-esac
-
-case "$(file -bL --mime-type $1)" in
-  application/gzip) tar tzf "$1" ;;
-  application/x-bzip2) tar tjf "$1" ;;
-  application/x-xz) xz --list "$1" ;;
-  application/x-tar) tar tf "$1" ;;
-  application/zip) unzip -l "$1" ;;
-  application/java-archive) unzip -l "$1" ;;
-  application/x-rar) unrar l "$1" ;;
-  application/x-7z-compressed) 7z l "$1" ;;
-  application/x-iso9660-image) iso-info --no-header -l "$1" ;;
-  application/x-bittorrent) transmission-show "$1" ;;
-  application/vnd.sun.xml.writer) odt2txt "$1" ;;
-  application/msword) catdoc "$1" ;;
-  application/vnd.openxmlformats-officedocument.wordprocessingml.document) docx2txt < "$1" ;;
-  application/vnd.ms-excel) ssconvert --export-type=Gnumeric_stf:stf_csv "$1" "fd://1" | batorcat --language=csv  ;;
-  application/vnd.openxmlformats-officedocument.spreadsheetml.sheet) ssconvert --export-type=Gnumeric_stf:stf_csv "$1" "fd://1" | batorcat --language=csv ;;
-  application/epub+zip) [ ! -f "$CACHE" ] && epub-thumbnailer "$1" "$CACHE" 1024; image "$CACHE" "$2" "$3" "$4" "$5" ;;
-  application/pgp-encrypted) gpg -d -- "$1" ;;
+case "$(xdg-mime query filetype "$1")" in
+  */x-bzip-compressed-tar|*/x-compressed-tar|*/x-xz-compressed-tar) als -- "$1" && exit 0 || echo -e "\e[31matools not installed\e[0m" && exit 1;;
+  */x-7z-compressed|*/vnd.rar|*/x-tar|*/zip|*/x-java-archive|*/x-xz) 7z l "$1" | sed 1,11d && exit 0 || echo -e "\e[31m7zip not installed\e[0m" && exit 1;;
+  */x-cd-image) iso-info --no-header -l "$1" && exit 0 || echo -e "\e[31mlibcdio not installed\e[0m" && exit 1;;
+  */x-bittorrent) transmission-show "$1" && exit 0 || echo -e "\e[31mtransmission-cli not installed\e[0m" && exit 1;;
+  */vnd.sun.xml.writer) odt2txt "$1" && exit 0 || echo -e "\e[31modt2txt not installed\e[0m" && exit 1;;
+  */msword) catdoc "$1" && exit 0 || echo -e "\e[31mcatdoc not installed\e[0m" && exit 1;;
+  */vnd.openxmlformats-officedocument.wordprocessingml.document) docx2txt < "$1" && exit 0 || echo -e "\e[31mdocx2txt not installed\e[0m" && exit 1;;
+  */vnd.ms-excel) ssconvert --export-type=Gnumeric_stf:stf_csv "$1" "fd://1" | batorcat --language=csv  && exit 0 || echo -e "\e[31mgnumeric not installed\e[0m" && exit 1;;
+  */vnd.openxmlformats-officedocument.spreadsheetml.sheet) ssconvert --export-type=Gnumeric_stf:stf_csv "$1" "fd://1" | batorcat --language=csv && exit 0 || echo -e "\e[31mgnumeric not installed\e[0m" && exit 1;;
+  */epub+zip) [ ! -f "$CACHE" ] && epub-thumbnailer "$1" "$CACHE" 1024; image "$CACHE" "$2" "$3" "$4" "$5" && exit 0 || echo -e "\e[31mepubthumbnailer not installed (https://github.com/marianosimone/epub-thumbnailer)\e[0m" && exit 1;;
+  */pgp-encrypted) gpg -d -- "$1" && exit 0 || echo -e "\e[31mgpg not installed\e[0m" && exit 1;;
+  */pkix-cert) openssl x509 -text -noout -in "$1" && exit 0 || echo -e "\e[31mopenssl not installed\e[0m" && exit 1;;
   image/*) image "$1" "$2" "$3" "$4" "$5" ;;
   video/*) video "$1" "$2" "$3" "$4" "$5" ;;
-  *opendocument*) odt2txt "$1" ;;
-  text/*|*/xml|application/json) batorcat "$1" ;;
-  */pdf) [ ! -f "${CACHE}.jpg" ] && pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE"; image "${CACHE}.jpg" "$2" "$3" "$4" "$5" ;;
-  *) mediainfo "$1" || exit 1 ;;
+  *opendocument*) odt2txt "$1" && exit 0 || echo -e "\e[31modt2txt not installed\e[0m" && exit 1;;
+  */markdown) lowdown -Tterm "$1" && exit 0 || echo -e "\e[31mlowdown not installed \e[0m" && exit 1;;
+  */html) lynx -dump "$1" && exit 0 || w3m -dump "$1" && exit 0 || echo -e "\e[31neither lynx nor w3m installed\e[0m" && exit 1;;
+  text/*|*/json|*/xml) batorcat "$1" "$2" ;;
+  */pdf) [ ! -f "${CACHE}.jpg" ] && pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE"; image "${CACHE}.jpg" "$2" "$3" "$4" "$5" && exit 0  || echo -e "\e[31mpoppler-utils/poppler not installed\e[0m" && exit 1;;
 esac
-exit 0
+case "$(file -bL --mime-type "$1")" in
+  text/*) batorcat "$1" "$2" ;;
+esac
+xdg-mime query filetype "$1"
+mediainfo "$1"
+exit 1
+
diff --git a/.config/lf/shortcutrc b/.config/lf/shortcutrc
index 3167866..b471d6e 100644
--- a/.config/lf/shortcutrc
+++ b/.config/lf/shortcutrc
@@ -1,28 +1,5 @@
-map Cch cd "/home/luca/.cache" 
-map Ccf cd "/home/luca/.config" 
-map Cdt cd "/home/luca/.local/share" 
-map Crr cd "/home/luca/.local/src" 
-map Csc cd "/home/luca/.local/bin" 
-map Cmn cd "/mnt" 
-map Cdl cd "/home/luca/Downloads" 
-map Cdm cd "/home/luca/Documents" 
-map Cms cd "/home/luca/Music" 
-map Cpc cd "/home/luca/Pictures" 
-map Cvd cd "/home/luca/Videos" 
-map Cdot cd "/home/luca/.local/share/dotfiles" 
-map Ebf $$EDITOR "/home/luca/.config/shell/bm-files" 
-map Ebd $$EDITOR "/home/luca/.config/shell/bm-dirs" 
-map Ecfx $$EDITOR "/home/luca/.config/x11/xresources" 
-map Ecfb $$EDITOR "/home/luca/.local/src/dwmblocks/config.h" 
-map Ecfv $$EDITOR "/home/luca/.config/nvim/init.vim" 
-map Ecfz $$EDITOR "/.zshrc" 
-map Ecfa $$EDITOR "/home/luca/.config/shell/aliasrc" 
-map Ecfp $$EDITOR "/home/luca/.config/shell/profile" 
-map Ecfm $$EDITOR "/home/luca/.config/mutt/muttrc" 
-map Ecfn $$EDITOR "/home/luca/.config/newsboat/config" 
-map Ecfu $$EDITOR "/home/luca/.config/newsboat/urls" 
-map Ecfmb $$EDITOR "/home/luca/.config/ncmpcpp/bindings" 
-map Ecfmc $$EDITOR "/home/luca/.config/ncmpcpp/config" 
-map Ecfl $$EDITOR "/home/luca/.config/lf/lfrc" 
-map EcfL $$EDITOR "/home/luca/.config/lf/scope" 
-map EcfX $$EDITOR "/home/luca/.config/sxiv/exec/key-handler" 
+map gh cd "/home/luca" 
+map gmn cd "/mnt" 
+map g/ cd "/"
+map go cd "/opt"
+map ge cd "/etc"
diff --git a/.config/shell/aliasrc b/.config/shell/aliasrc
index 7f8937f..ae2bbb7 100644
--- a/.config/shell/aliasrc
+++ b/.config/shell/aliasrc
@@ -1,32 +1,42 @@
 #!/bin/sh
 
-for command in apt su pkill ; do
+for command in apt su ; do
 	alias $command="sudo $command"
 done; unset command
 
 # Verbosity and settings that you pretty much just always are going to want.
 alias \
-	cp="cp -iv" \
-	mv="mv -iv" \
-	rm="rm -vI" \
-	mkd="mkdir -pv" \
-	exa="exa -abghHliS" \
-  duf="duf -all" \
-  ls="ls -hN --color=auto --group-directories-first" \
-	grep="grep --color=auto" \
-	diff="diff --color=auto" \
-	ccat="highlight --out-format=ansi" \
-  ip="ip -color=auto"
+    cp="cp -iv" \
+    mv="mv -iv" \
+    rm="rm -vI" \
+    bc="bc -ql" \
+    mkd="mkdir -pv" \
+    ffmpeg="ffmpeg -hide_banner" \
+    exa="exa -abghHliS" \
+    duf="duf -all" \
+    ls="ls -hN --color=auto --group-directories-first" \
+    grep="grep --color=auto" \
+    diff="diff --color=auto" \
+
+# Colorize commands when possible.
+alias \
+    ls="ls -hN --color=auto --group-directories-first" \
+    grep="grep --color=auto" \
+    diff="diff --color=auto" \
+    ccat="highlight --out-format=ansi" \
+    ip="ip -color=auto"
 
 # These common commands are just too long! Abbreviate them.
 alias \
-	ka="killall" \
-  e="$EDITOR" \
-  au="apt uninstall" \
-  ar="apt reinstall" \
-  ai="apt install" \
-  aur="apt autoremove" \
+    ka="killall" \
+    e="$EDITOR" \
+    ar="apt remove" \
+    are="apt reinstall" \
+    ai="apt install" \
+    aur="apt autoremove" \
+    au="apt upgrade" \
 
 # Misc.
 alias \
-	vim="nvim" \
+    ref="shortcuts >/dev/null; source ${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc ; source ${XDG_CONFIG_HOME:-$HOME/.config}/shell/zshnameddirrc" \
+    vim="nvim" \
diff --git a/.config/shell/profile b/.config/shell/profile
index c5da78e..0ff7687 100644
--- a/.config/shell/profile
+++ b/.config/shell/profile
@@ -8,6 +8,8 @@ export PATH="$PATH:${$(find -L ~/.local/bin -type d -printf %p:)%%:}"
 # Adds `~/.local/share/npm-global` to $PATH
 export PATH=~/.npm-global/bin:$PATH
 
+unsetopt PROMPT_SP
+
 # Default programs:
 export EDITOR="nvim"
 
@@ -22,7 +24,6 @@ export INPUTRC="${XDG_CONFIG_HOME:-$HOME/.config}/shell/inputrc"
 export ZDOTDIR="${XDG_CONFIG_HOME:-$HOME/.config}/zsh"
 export ZSH_COMPDUMP="${XDG_CACHE_HOME:-$HOME/.cache}/zcompdump"
 export GNUPGHOME="${XDG_CONFIG_HOME:-$HOME/.config}/gnupg"
-export PASSWORD_STORE_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/password-store"
 export TMUX_TMPDIR="$XDG_RUNTIME_DIR"
 export CARGO_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/cargo"
 export GOPATH="${XDG_DATA_HOME:-$HOME/.local/share}/go"
@@ -39,7 +40,7 @@ export LESS_TERMCAP_se="$(printf '%b' '')"
 export LESS_TERMCAP_us="$(printf '%b' '')"
 export LESS_TERMCAP_ue="$(printf '%b' '')"
 export LESSOPEN="| /usr/bin/highlight -O ansi %s 2>/dev/null"
-export VIRTUAL_ENV_DISABLE_PROMPT=1
+# export VIRTUAL_ENV_DISABLE_PROMPT=1
 export PYENV_PROMPT=" %F{yellow\}%F{reset\} "
 
 # This is the list for lf icons:
diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc
index d40c694..45564da 100644
--- a/.config/zsh/.zshrc
+++ b/.config/zsh/.zshrc
@@ -1,5 +1,8 @@
-# Enable colors and change prompt:
-autoload -U colors && colors	# Load colors
+autoload -U colors && colors
+autoload edit-command-line && zle -N edit-command-line
+autoload -U add-zsh-hook
+autoload -U compinit
+autoload -Uz edit-command-line
 PS1="%B%F{blue}%n%F{cyan}@%F{blue}%m %F{magenta}[%f%3~%F{magenta}] %(?.%F{green}.%F{red})»%f%b "
 RPS1="%(?..%F{red}%?)"
 stty stop undef		# Disable ctrl-s to freeze terminal.
@@ -8,19 +11,20 @@ setopt HIST_IGNORE_ALL_DUPS HIST_REDUCE_BLANKS HIST_VERIFY BANG_HIST interactive
 # History in cache directory:
 HISTSIZE=10000000
 SAVEHIST=10000000
+HISTFILE="${XDG_CACHE_HOME:-$HOME/.cache}/zsh/history"
 
-# Load aliases if existent.
+# Load aliases and shortcuts if existent.
+[ -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc" ] && source "${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc"
 [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/aliasrc" ] && source "${XDG_CONFIG_HOME:-$HOME/.config}/shell/aliasrc"
+[ -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/zshnameddirrc" ] && source "${XDG_CONFIG_HOME:-$HOME/.config}/shell/zshnameddirrc"
 
 # Basic auto/tab complete:
-autoload -U compinit
 zstyle ':completion:*' menu select
 zmodload zsh/complist
 compinit
 _comp_options+=(globdots)		# Include hidden files.
 
 # vi mode
-autoload -Uz edit-command-line
 zle -N edit-command-line
 bindkey -M vicmd v edit-command-line
 bindkey -v
@@ -80,17 +84,12 @@ bindkey '^o' _lfcd
 
 # bind lazygit to ctrl-g
 lg () {
-  lazygit
-  tput cuu1;tput el
+  [ ! -d "$(pwd)/.git" ] && [[ $(read -ek "?Not in a git repository. Create a new git repository? (y/n): ") =~ ^[Yy]$ ]] && git init
+  [ -d "$(pwd)/.git" ] && lazygit -p $(pwd)
+  zle reset-prompt
 }
-
-_lazygit () {
-  BUFFER="lg"
-  zle accept-line
-}
-
-zle -N _lazygit
-bindkey '^g' _lazygit
+zle -N lg{,}
+bindkey '^g' lg
 
 # Edit line in vim with ctrl-e:
 autoload edit-command-line; zle -N edit-command-line
@@ -104,7 +103,8 @@ bindkey '^[[F' end-of-line
 bindkey '^[[1;5C' forward-word
 bindkey '^[[1;5D' backward-word 
 
-
-[ -f "${XDG_DATA_HOME:-$HOME/.local/share}/zsh/plugins/fzf/key-bindings.zsh" ] && source "${XDG_DATA_HOME:-$HOME/.local/share}/zsh/plugins/fzf/key-bindings.zsh"
-[ -f "${XDG_DATA_HOME:-$HOME/.local/share}/zsh/plugins/autopyenv/autopyenv.plugin.zsh" ] && source "${XDG_DATA_HOME:-$HOME/.local/share}/zsh/plugins/autopyenv/autopyenv.plugin.zsh"
-
+# plugins
+PLUGINS_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/plugins"
+[ -f "$PLUGINS_HOME/fzf/key-bindings.zsh" ]                                         && source "$PLUGINS_HOME/fzf/key-bindings.zsh"
+[ -f "$PLUGINS_HOME/fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh" ] && source "$PLUGINS_HOME/fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh"
+[ -f "$PLUGINS_HOME/autopyenv/autopyenv.plugin.zsh" ]                               && source "$PLUGINS_HOME/autopyenv/autopyenv.plugin.zsh"
diff --git a/.local/bin/trash-put b/.local/bin/trash-put
new file mode 100755
index 0000000..5bce53b
--- /dev/null
+++ b/.local/bin/trash-put
@@ -0,0 +1,28 @@
+#!/bin/sh
+set -e
+[ -e "$1" ] || exit 1
+getfsroot() {
+  printf "%s" "$(df "$1" --output=target | tail -1)"
+}
+
+filepath="$(realpath "$1")"
+filename="$(basename "$1")"
+fsroot="$(getfsroot "$1")"
+[ "$fsroot" = "$(getfsroot "${XDG_DATA_HOME:-$HOME/.local/share}")" ] \
+  && basedir="${XDG_DATA_HOME:-$HOME/.local/share}/Trash" \
+  || basedir="${fsroot}/.Trash"
+infodir="$basedir/info"
+filedir="$basedir/files"
+
+mkdir -p "$infodir" 1>/dev/null 2>&1
+mkdir -p "$filedir" 1>/dev/null 2>&1
+find "$filedir" -regex ".*$filename.*" | grep -oP '(?<=.\.~)\d+(?=~$)' | sort -n | tail -1 | (
+ext=$(($(cat /dev/stdin)+1))
+filedest="$filedir/$filename.~$ext~"
+command mv -f "$filepath" "$filedest"
+cat <<EOF > "$infodir/$(basename "$filedest")"
+[Trash Info]
+Path=$filepath
+DeletionDate=$(date +%Y%m%dT%T)
+EOF
+)
diff --git a/.local/bin/trash-restore b/.local/bin/trash-restore
new file mode 100755
index 0000000..b850c40
--- /dev/null
+++ b/.local/bin/trash-restore
@@ -0,0 +1,31 @@
+#!/bin/sh
+set -e
+getfsroot() {
+  printf "%s" "$(df "$1" --output=target | tail -1)"
+}
+list() {
+  # 1st arg is trash files directory
+  # 2nd arg is directory to match trash files for
+  [ ! "$(ls -A "$1")" ] && exit 1
+  for file in "$1"/* ; do
+    [ "$(head -1 "$file")" = "[Trash Info]" ] && \
+    fpath=$(grep Path "$file" | cut -d '=' -f2) && \
+    echo "$fpath" | grep -qP "^$2/[^/]+$" && \
+    printf "%s %s %s\n" \
+      "$(basename "$file")" \
+      "$fpath" \
+      "$(date -d "$(grep Date "$file" | cut -d '=' -f2)" +'%x %X')"
+  done
+}
+
+[ -n "$1" ] && dir="$(realpath "$1")" || dir="$(getfsroot "$PWD")"
+fsroot="$(getfsroot "$dir")"
+[ "$fsroot" = "$(getfsroot "${XDG_DATA_HOME:-$HOME/.local/share}")" ] \
+  && basedir="${XDG_DATA_HOME:-$HOME/.local/share}/Trash" \
+  || basedir="${fsroot}/.Trash"
+
+sel="$(list "$basedir/info" "$dir" | fzf)"
+file="$basedir/files/$(echo "$sel" | cut -d ' ' -f1)"
+dest="$(echo "$sel" | cut -d ' ' -f2)"
+command mv -ib "$file" "$dest"
+command rm "$basedir/info/$(echo "$sel" | cut -d ' ' -f1)"