# ksh environment file

########################################################################
# ENVIRONMENT VARIABLES
########################################################################

### SEARCH PATHS
PATH=\
~/bin\
:~/.bin\
:/bin\
:/sbin\
:/usr/bin\
:/usr/sbin\
:/usr/local/bin\
:/usr/local/sbin\
:/usr/X11R6/bin\
:/usr/games\
:/usr/ports/infrastructure/bin\
:/usr/local/cobol/bin
export PATH

MANPATH=/usr/share/man:/usr/X11R6/man:/usr/local/man
export MANPATH

### LANGUAGE
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LC_MESSAGES=C
LC_NUMERIC=C
LC_TIME=en_US.UTF-8
export LANG LC_ALL LC_MESSAGES LC_NUMERIC LC_TIME

########################################################################
# STOP HERE IF NON INTERACTIVE
########################################################################

[[ $- != *i* ]] && return

########################################################################
# INTERACTIVE ENVIRONMENT
########################################################################

HOSTNAME=$(hostname)
set -A UNAME -- $(uname -a)
export HOSTNAME UNAME

case ${HOSTNAME} in
    *.home.codevoid.de)  PKGOPT="-Dsnap"; ;;
    openbsd.codevoid.de) PKGOPT="-Dsnap"; ;;
esac

### HISTORY
HISTCONTROL=ignoredups:ignorespace:erasedups
HISTFILE=$HOME/.ksh-history
HISTSIZE=2000
export HISTCONTROL HISTFILE HISTSIZE

### CDPATH
CDPATH=.:/usr/ports
export CDPATH

### SOFTWARE PREFERENCES
EDITOR="vim"
VISUAL="vim"
BROWSER="luakit"
TUIR_BROWSER="$BROWSER"
PAGER="less"
export EDITOR VISUAL BROWSER TUIR_BROWSER PAGER

### NNN
NNN_OPTS="cErxAJ"
NNN_OPENER="nnn.sh"
NNN_PLUG='o:-!mpv "$nnn";x:-!sh -x "$nnn";i:imgview;'
NNN_ARCHIVE="\\.(7z|bz2|gz|tar|tgz|zip)$"
NNN_SSHFS='doas sshfs -d -o reconnect -o uid=1000 -o gid=1000'
export NNN_OPTS NNN_OPENER NNN_PLUG NNN_ARCHIVE NNN_SSHFS

nzip() { zip -r "${nnn}.zip" "${nnn}"; }
ntar() { tar czf "${nnn}.tgz" "${nnn}"; }

# LESS
LESS="--buffers=-1 -g -i -J -M --tilde -R"
LESSHISTFILE="$HOME/.less-history"
export LESS LESSHISTFILE

### SLNR
SLRNPULL_ROOT=$HOME/.slrnpull
NNTPSERVER=read.news.tnib.de
export SLRNPULL_ROOT NNTPSERVER

### GOT
GOT_AUTHOR="Stefan Hagen <sh+got@codevoid.de>"
export GOT_AUTHOR
export TOG_COLORS=1

### PASSWORD-STORE
PASSWORD_STORE_ENABLE_EXTENSIONS=true
export PASSWORD_STORE_ENABLE_EXTENSIONS

########################################################################
# SHOW "LOGGED ON" HEADER
########################################################################

# local G=$(tput setaf 240 0 0)
# local O=$(tput setaf 208 0 0)
# local R=$(tput op)
# printf '%s>>>%s Logged on as %s%s%s on %s%s%s [%s%s%s/%s%s%s]\n' \
# 	"${G}" "${R}" "${O}" "${USER}" "${R}" "${O}" "${HOSTNAME}" \
# 	"${R}" "${O}" "${UNAME[0]}" "${R}" "${O}" "${UNAME[4]}" "${R}"

########################################################################
# PROMPT (SIMPLE)
########################################################################

PS1="\${?}\w\\$ "

########################################################################
# PROMPT (COLOR)
########################################################################

# local KG="\[$G\]"
# local KO="\[$O\]"
# local KR="\[$R\]"
# PS1="${KG}[${KO}\h${KG}](${KO}\${?}${KG})(${KO}\w${KG})\\$ ${KR}"

########################################################################
# SHELL SETTINGS
########################################################################

ulimit -c 0
stty -ixon -ixoff
set -o emacs
set bell-style none

########################################################################
# BC BASE CONVERTER
########################################################################

bc_bin2dec() { echo "ibase=2;obase=1010;$1" | bc; }
bc_bin2hex() { echo "ibase=2;obase=10000;$1" | bc; }
bc_dec2bin() { echo "ibase=10;obase=2;$1" | bc; }
bc_dec2hex() { echo "ibase=10;obase=16;$1" | bc; }
bc_hex2bin() { echo "ibase=16;obase=2;$1" | bc; }
bc_hex2dec() { echo "ibase=16;obase=A;$1" | bc; }

########################################################################
# ALIASES
########################################################################

# configuration files
alias ssh-config="gpg-edit ~/.ssh/config"
alias kshrc="vim ~/.kshrc"
alias muttrc="vim ~/.mutt/rc-common"
alias vimrc="vim ~/.vim/vimrc"
alias kludges="vim ~/.notion/cfg_kludges.lua"

# system
alias sudo="doas"
alias su="doas su"
alias nohistory="HISTFILE=/dev/null"
alias insecuresh="ssh -o HostKeyAlgorithms=+ssh-rsa -o KexAlgorithms=+diffie-hellman-group1-sha1 -o Ciphers=+aes256-cbc"

# translation
alias trans-en="trans -l de -s en -t de --no-ansi"
alias trans-de="trans -l en -s de -t en --no-ansi"

# packages
alias pkg_add="doas \pkg_add ${PKGOPT}"
alias pkg_delete="doas \pkg_delete ${PKGOPT}"
alias pkg_info="\pkg_info ${PKGOPT}"

# network
alias edit_dns="ssh -t sdk@dns.codevoid.de \"doas vim /var/nsd/zones/master/codevoid.de && doas nsd-control reload\""
alias edit_gopher="vim sftp://sdk@gopher.codevoid.de/../www/htdocs/gopher/makeindex.sh"
alias tor_ld_preload="export LD_PRELOAD=/usr/local/lib/torsocks/libtorsocks.so.1.0"
x() {
    printf "\033]0;\$ ssh home\007"
    ssh -t home.codevoid.de 'tmux -u attach || tmux -u'
}

alias x-noblank="xset -dpms; xset s off;"
alias g="ugrep -HIir"

cg() {
    test -z "${1}" \
        && echo "usage: cg <ChatNet>" \
        && return

    case ${1} in
        b) _net=Bitreich; ;;
        c) _net=CuffLink; ;;
        e) _net=EfNet; ;;
        h) _net=HackInt; ;;
        i) _net=IRCNet; ;;
        l) _net=LiberaChat; ;;
        o) _net=OFTC; ;;
        r) _net=RobustIRC; ;;
        u) _net=UUGRN; ;;
        *) _net=${1}; ;;
    esac

    catgirl \
        -C copy \
        -N notify-send \
        -O nnn.sh \
        -C xcoopy \
        -i "* [JPQ][OAU][IR][NT]" \
        -l \
        -h shell.codevoid.de \
        -p 40004 \
        -r x \
        -u sdk \
        -n sdk \
        -w "sdk@$(hostname -s)/${_net}:$(pass Internet/znc)"
}

# mount
alias mount_msdos="doas \mount_msdos -o nodev,nosuid,noatime -u 1000 -g 1000"
mount_tank()  { awk '$3=="nfs"{print $2}' /etc/fstab | xargs -n1 doas mount; }
umount_tank() { awk '$3=="nfs"{print $2}' /etc/fstab | xargs -n1 doas umount; }

# gopher bookmarks
alias fefe="sacc gopher://codevoid.de/1/fefe"
alias hn="sacc gopher://codevoid.de/1/hn"
alias cv="sacc gopher://codevoid.de"

# pim
alias notes="vim scp://sdk@shell.codevoid.de/work/notes/notes.txt"
alias events="vim scp://sdk@shell.codevoid.de/work/notes/events.txt"
caly() { ncal -C $(date +%Y); }

# music
alias music_psychedelik="mpg123 -b 1024 http://62.210.114.63:8000"
alias music_progressive="mpg123 -b 1024 http://62.210.114.63:8010"
alias music_drum-n-bass="mpg123 -b 1024 http://62.210.114.63:8030"
alias music_ambient="mpg123 http://62.210.114.63:8002/listen.mp3"
alias music_tilderadio="ogg123 https://tilderadio.org/listen"
alias music_bitreich="mpv gopher://bitreich.org/9/radio/listen"
alias flac_encode="flac -e --best --delete-input-file"

alias tmpv="mpv --really-quiet -vo tct"

amused_reload() { find ~/MusicSelection -type f \
                                     \( -iname "*.mp3" \
                                     -o -iname "*.ogg" \
                                     -o -iname "*.flac" \) \
                                     | sort | amused load; }
amused_select() {
local _FMT="Audio;
Duration: %Duration/String%
Bitrate: %BitRate_Mode/String% %BitRate/String%
"
    amused jump \
        "$(amused show \
            | sed 's|.*/MusicSelection/||g' \
            | fzf -e +s \
              --preview-window=right:30% \
              --preview='id3ed -i {}' )";
}

# video
alias cam='mpv --really-quiet \
        --x11-name="selfcam" \
        --no-osc \
        --framedrop=decoder+vo \
        --no-audio \
        --demuxer-lavf-o=video_size=640x480,input_format=mjpeg \
        --untimed \
        --profile=low-latency \
        --geometry="478x359" \
        av://v4l2:/dev/video0 &'
alias nocam="pkill -lf selfcam"

# security
alias gpa="gpa -k"
alias htpasswd-openssl="openssl passwd -apr1"

# backup
alias tarsnap="doas \tarsnap"

# games
alias quake="\vkquake +game id1"
alias quake-mp1-scourge_of_armagon="\vkquake +game hipnotic"
alias quake-mp2-dissolution_of_eternity="\vkquake +game rogue"
alias quake2="\quake2 +game baseq2"
alias quake2-mp1-the_reconning="\quake2 +game xatrix"
alias quake2-mp2-ground_zero="\quake2 +game rogue"
alias quake2-ex1-jaggernaut="\quake2 +game jaggernaut"
alias quake2-ex2-zaero="\quake2 +game zaero"
alias doom3="dhewm3 +set r_fullscreen 1 +set com_fixedtic -1"
alias steam-list="steamctl --user sdk82 apps list"
alias steam-download="steamctl --user sdk82 depot download -os linux64 -a"

# terminal services
alias terminal_map="telnet mapscii.me"
alias terminal_bofh="telnet towel.blinkenlights.nl 666"
alias terminal_starwars="telnet towel.blinkenlights.nl 23"
alias terminal_cnn="links http://lite.cnn.io/en"
alias terminal_8ball="lynx -width=300 --dump https://codevoid.de/8Ball"
alias terminal_weather="curl wttr.in/Hockenheim"
alias terminal_bbs="telnet gopher.su 1234"
alias terminal_unix50="ssh unix50@unix50.org"

alias ssh-keygen-ed25519="ssh-keygen -t ed25519 -a 420 -C sh@codevoid.de"
ssh-keygen-server() {
    _local="$(hostname)"
    _user="${1}"
    _remote="$(ssh ${_user}@${2} hostname)"
    echo ssh-keygen -t ed25519 -a 420 -f ~/.ssh/key-${_remote} -C "${_user}@${_local}-to-${_remote}"
    echo ssh-copy-id -i ~/.ssh/key-${_remote}.pub ${_remove}
    echo
    echo "Host ${2}"
    echo "      Hostname ${_remote}"
    echo "      User ${1}"
    echo "      IdentityFile ~/.ssh/key-${_remote}"
}

# monitoring
log() {
    if [ -z "$1" ]; then
        doas tail -f /var/log/{messages,daemon,secure,maillog}
    else
        ssh -t "$1" "doas tail -f /var/log/{messages,daemon,secure,maillog}"
    fi
}
l() {
    printf '\033]0;/var/log/messages\007';
    if [ -z "$1" ];
    then
        tail -n 2000 -f /var/log/messages
    else
        tail -n 2000 -f /var/log/messages | fgrep -i "$1"
    fi
}
ll() {
    printf '\033]0;/var/log/messages\007';
    if [ -z "$1" ];
    then
        cat /var/log/messages | less
    else
        fgrep -i "$1" /var/log/messages | less
    fi
}

# archives
alias innoextract="innoextract -g --no-gog-galaxy"

########################################################################
# EMAIL HANDLING
########################################################################

# mailboxes
MUTT_HOST="imaps://mail.codevoid.de"

# account aliases
alias mutt-acc-gmx="\mutt -F $HOME/.mutt/rc-account-gmx"
alias mutt-acc-priv="\mutt -F $HOME/.mutt/rc-account-private"
alias mutt-acc-work="\mutt -F $HOME/.mutt/rc-account-work"
alias mutt-acc-offl="\mutt -F $HOME/.mutt/rc-account-offline"
alias mutt-acc-mborg="\mutt -F $HOME/.mutt/rc-account-mborg"
alias mutt-acc-uugrn="\mutt -F $HOME/.mutt/rc-account-uugrn"

# default
alias mutt="mutt-acc-priv"
alias muttopen="\mutt -F ~/.mutt/rc-common -f"

# select mailbox
mutt-textmail() { mutt-acc-priv -f $MUTT_HOST/Mailboxes/textmail.me/$1; }
mutt-codevoid() { mutt-acc-priv -f $MUTT_HOST/Mailboxes/codevoid.de/sh+$1; }

# shortcuts
alias mutt-all="mutt -f $MUTT_HOST/Virtual/ALL"
alias mutt-amazon="mutt-textmail amazon"
alias mutt-ccc-intern="mutt-textmail ccc-intern"
alias mutt-last-day="mutt -f $MUTT_HOST/Virtual/LAST_DAY"
alias mutt-last-week="mutt -f $MUTT_HOST/Virtual/LAST_WEEK"
alias mutt-last-month="mutt -f $MUTT_HOST/Virtual/LAST_MONTH"
alias mutt-last-year="mutt -f $MUTT_HOST/Virtual/LAST_YEAR"
alias mutt-lieferando="mutt-textmail lieferando"
alias mutt-mutt-users="mutt-codevoid mutt-users"
alias mutt-openbsd-all="mutt -f $MUTT_HOST/Virtual/OpenBSD"
alias mutt-openbsd-bugs="mutt-codevoid openbsd-bugs"
alias mutt-openbsd-hackers="mutt-codevoid openbsd-hackers"
alias mutt-openbsd-misc="mutt-codevoid openbsd-misc"
alias mutt-openbsd-ports-bugs="mutt-codevoid openbsd-ports-bugs"
alias mutt-openbsd-ports-cvs="mutt-codevoid openbsd-ports-cvs"
alias mutt-openbsd-ports="mutt-codevoid openbsd-ports"
alias mutt-openbsd-sparc="mutt-codevoid openbsd-sparc"
alias mutt-openbsd-src-cvs="mutt-codevoid openbsd-src-cvs"
alias mutt-openbsd-tech="mutt-codevoid openbsd-tech"
alias mutt-paypal="mutt-textmail paypal"
alias mutt-uugrn="mutt-codevoid uugrn"
alias mutt-vorstand="mutt-codevoid vorstand"

########################################################################
# OPENBSD PORT TOOLS
########################################################################

alias cvs-diff='cvs -d /home/cvs diff -uNp'
alias cvs-diff-openbsd='cvs -d sdk@cvs.openbsd.org:/cvs diff -uNp'
cvs-update() {( set -x; doas cvs -d /home/cvs -q up -Pd -A; )}
alias cvs-checkout="doas cvs -qd /home/cvs checkout -P"
alias reposync-update="doas -u cvs reposync rsync://anoncvs.spacehopper.org/cvs /home/cvs"

cvs-commit() {
    doas cvs -d sdk@cvs.openbsd.org:/cvs commit $@
}

cvs-import-simulate() {(
     set -ex
    _dir=$(basename $PWD)
    _pwd=$(dirname $PWD)
    cvs -d sdk@cvs.openbsd.org:/cvs -n import \
                  ports/$_pwd/$_dir sdk sdk_$(date +"%Y%m%d")
)}

cvs-update-all() {(
    set -x
    cd /usr/ports && doas cvs -d /home/cvs -q up -Pd -A
    cd /usr/src && doas cvs -d /home/cvs -q up -Pd -A
    cd /usr/www && doas cvs -d /home/cvs -q up -Pd -A
    cd /usr/xenocara && doas cvs -d /home/cvs -q up -Pd -A
)}

alias pmark="port mark"
p() { cd "$(port src)" && echo $PWD; }
pj() { cd "$(port jump $1)" && echo $PWD; }
po() { cd "$(port obj)" && echo $PWD; }
alias portclean="port clean"
alias portsweep='doas find . \( -name "*.orig" -or -empty \) -delete'
alias portdiff="port diff"

alias port-modgo-update='make MODGO_VERSION=latest modgo-gen-modules > modules.inc'

alias proot-rebuild="doas proot -c /etc/proot.conf; doas chroot /home/dpb pkg_add ccache"
alias dmake="doas /usr/ports/infrastructure/bin/dpb -B /home/dpb -c -p 4 -j 4"

showdevs() {
    ssh sdk@cvs.openbsd.org 'fgrep -v ksh- /etc/passwd' \
        | egrep 111\|122 | cut -d: -f1,5 | tr -s ',' \
        | sed 's/,/, /g;s/,[, ]*$//g' | column -s":" -t | fzf -i -e
}
alias portroach-me="portroach-cli -m codevoid"
alias portroach-list="portroach-cli -Uo"

dlast() {
    doas -u build vim -c ':browse oldfiles'
}
dvim() {
    doas -u build vim
}
dcont() {
    f="$(cat /var/cache/dmark)"
    cd "$(dirname "$f")"
    doas vim "$f"
}
ddiff() {(
    cd /usr/src
    f="$(cat /var/cache/dmark | sed 's|/usr/src/||g')"
    cvs-diff "$f" | tee "/home/sdk/$(basename "$f").diff"
    readlink -f "/home/sdk/$(basename "$f").diff"
)}
dsys() {
    cd /usr/src/sys && doas -u build cscope -qR
}
dbase() {
    cd /usr/src && doas -u build cscope -qR
}
alias dscope="cscope -qR; rm -f cscope*.out"
dgrepsys() {
    ugrep --exclude-dir="CVS" \
          --include="*.h" \
          --include="*.c" \
          --include="*.txt" \
          --include="*.pl" \
          --include="*.pm" \
          --include="*.sh" \
          --recursive \
          "$1" \
          /usr/src/sys/
}
dgrep() {
    ugrep --exclude-dir="CVS" \
          --include="*.h" \
          --include="*.c" \
          --include="*.txt" \
          --include="*.pl" \
          --include="*.pm" \
          --include="*.sh" \
          --recursive \
          "$1" \
          /usr/src/
}

pack() {
    doas tar czvf "$1.tgz" "$1" \
        && readlink -f "$1.tgz"
}

########################################################################
# FOSSIL
########################################################################

fossil-clone() {
    local PASS="$(pass Internet/fossil.codevoid.de)"
    fossil clone "https://sdk:$PASS@${@}"
}

fossil-new-repo() {
    local USER=sdk
    local PASS="$(pass Internet/fossil.codevoid.de | head -1)"
    fossil init $1.fossil
    fossil open $1.fossil --keep
    fossil user password "$USER" "$PASS"
    fossil remote-url "https://$USER:$PASS@fossil.codevoid.de/$1"
    fossil set web-browser firefox
    fossil set editor vim
    fossil set diff-command diff
    fossil set crlf-glob '*'
    chmod 660 $1.fossil
    rsync -pv $1.fossil sdk@fossil.codevoid.de:/home/www/htdocs/
}

alias f="fossil"
alias fd="fossil diff"
alias fs="fossil status --edited --updated --changed --missing \
                        --added  --deleted --renamed --conflict"
alias fse="fs --extra"

########################################################################
# TWITCH FROM CLI
########################################################################

alias twitch-play="mpv https://www.twitch.tv/c0dev0id"
twitch-stream() {
    local API_KEY=$(pass Internet/Twitch | head -1)
    local RES=$(xrandr | grep "*+" | awk '{print $1}')
    local FAUX_OPTS="-d snd/default -m -vmic 5.0 -vmon 0.2 -r $RES -f 20 -b 4000"
    (
        set -x
        fauxstream $FAUX_OPTS rtmp://live-ams.twitch.tv/app/$API_KEY
    )
}

########################################################################
# DOTFILES WITH GIT
########################################################################

alias config='git --git-dir=$HOME/.cfg/ --work-tree=$HOME'

dotfiles_autoupdate() {
    config add -u && \
    config commit -m "Update $(date +"%Y-%m-%d %H:%M") \
        $(uname -s)/$(uname -m)" && config push
}

dotfiles_init() {
    git --no-replace-objects clone --bare --depth 1 \
        sdk@home.codevoid.de:.dotfiles.git $HOME/.cfg;
    config config --local status.showUntrackedFiles no;
    mkdir -p $HOME/.vim/undo $HOME/.vim/swapfiles $HOME/.vim/backup;
    config checkout -f
}

########################################################################
# FILE SHARING
########################################################################

dohttp_clean() {
    ssh sdk@codevoid.de rm -rvf "/home/www/htdocs/http/*";
}
dohttp_upload() {
    local _file=$(readlink -f "$1");
    local _name=$(cleanstring "$1");
    scp -r "$_file" sdk@codevoid.de:/home/www/htdocs/http/$_name
    ssh -t sdk@codevoid.de doas chown -R sdk:www "/home/www/htdocs/http/$_name"
    printf "https://codevoid.de/h/$_name\n";
}
cleanstring() {
    printf '%s' "$1" | tr "[:upper:]ÄÖÜ " "[:lower:]äöü_" \
        | sed 's/ä/ae/g;s/ö/oe/g;s/ü/ue/g;s/ß/ss/g';
}

########################################################################
# YOUTUBE-DL
########################################################################
YTDL_AGENT="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4506.0 Safari/537.36"
YTDL_OPTS="-i --no-part --abort-on-unavailable-fragment --buffer-size 16K --fragment-retries 100 --http-chunk-size 10M"
alias youtube-dl="yt-dlp"
ytdl() {
    local FMT="bestvideo[ext=mp4][height<=1080]+bestaudio[ext=m4a]/best[ext=mp4]/best"
    yt-dlp $YTDL_OPTS --user-agent "$YTDL_AGENT" -f "$FMT" "$@";
}

ytdl_playlist() { 
    local FMT="bestvideo[ext=mp4][height<=1080]+bestaudio[ext=m4a]/best[ext=mp4]/best"
    yt-dlp $YTDL_OPTS --user-agent "$YTDL_AGENT" -f "$FMT" -o '%(playlist_title)s/%(title)s.%(ext)s' "$@";
}

ytdl_channel()  {
    local FMT="bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best"
    yt-dlp $YTDL_OPTS --user-agent "$YTDL_AGENT" --download-archive ytdl_channel.txt -f "$FMT" \
        -o '%(upload_date)s - %(title)s.%(ext)s' "$@";
}
ytdl_bandcamp() {
    yt-dlp $YTDL_OPTS --user-agent "$YTDL_AGENT" -x --audio-format mp3 -i --embed-thumbnail \
        --add-metadata -o '%(artist)s/%(album)s/%(track_number)02d - %(track)s.%(ext)s' "$@";
}
ytdl_audio() {
    yt-dlp $YTDL_OPTS --user-agent "$YTDL_AGENT" -f bestaudio --extract-audio --embed-thumbnail \
        --add-metadata -o "%(title)s-%(id)s.%(ext)s" "$@";
}

########################################################################
# KSH COMPLETIONS
########################################################################

[ -f $HOME/.ksh-complete ] && . $HOME/.ksh-complete

########################################################################
# SCREEN CONFIGURATION
########################################################################

xr_primary() {
    xrandr --listmonitors | awk '/ 0:/{ print $4 }'
}
xr_secondary() {
    xrandr | awk '/ connected/ { print $1 }' | fgrep -v $(xr_primary)
}
xr_off() {
    xrandr | awk '/disconnected/ { print $1 }'
}
xrandr_set() {
    set -xe
    for scr in $(xr_secondary)
    do
        xrandr --output $scr --$1 $(xr_primary) --mode 1920x1080
    done
    for scr in $(xr_off)
    do
        xrandr --output $scr --off
    done
}
xrandr_mirror() {
    xrandr_set same-as
}
xrandr_extend_above() {
    xrandr_set above
}
xrandr_extend_right() {
    xrandr_set right-of
}
xrandr_extend_left() {
    xrandr_set left-of
}
xrandr_native() {
    xrandr --output $(xr_primary) --auto
}
xrandr_720p() {
    xrandr --output $(xr_primary) --mode 1280x720
}
xrandr_1080p() {
    xrandr --output $(xr_primary) --mode 1920x1080
}
xrandr_4k() {
    xrandr --output $(xr_primary) --mode 3840x2160
}

########################################################################
# GNUPG AGENT
########################################################################

if [ -f $HOME/.gnupg/pubring.gpg ];
then
    GPG_TTY=$(tty)
    SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
    SSH_AUTH_SOCK_EXTRA=${SSH_AUTH_SOCK%%.ssh}.extra
    export GPG_TTY SSH_AUTH_SOCK SSH_AUTH_SOCK_EXTRA
    pgrep -qu sdk gpg-agent || gpg-connect-agent -q /bye
fi
