# General
alias ls="ls -F"
alias l="ls -F"
alias ll="l -Fl"
alias la="l -Fa"
alias lla="ll -Fa"
alias c="cd"
alias pg="ps auxww|grep"
alias pd="pwd"
cl() { cd $@ && ls }
bellme() { echo "Done! (bellme)" ; while :; do echo -ne '\a' ; sleep 2 ; done }
#old linux aliases
alias s="TERM=xterm;ssh serenity.cat.pdx.edu"
#alias s="TERM=xterm ssh hunner@destiny.cat.pdx.edu"
#alias f="TERM=xterm ssh hunner@firefly.cat.pdx.edu"
alias f="find . | grep"
alias z="TERM=xterm ssh hunner@zabava.cat.pdx.edu"
alias o="TERM=xterm ssh hunner@osiris.cat.pdx.edu"
alias m="TERM=xterm ssh hunner@mint.cic.pdx.edu"
alias p="ping 8.8.8.8"
alias pi="ping google.com"
alias ph="ping pi.hole"
alias pa="ping ads.google.com"
alias pipe=pip # typos
alias chandra="TERM=xterm ssh hunner@chandra.cs.pdx.edu"
export CS=cs.pdx.edu
alias odin="TERM=xterm ssh hunner@odin.pdx.edu"
alias budda="ssh hunnur@budda.dreamhost.com"
alias kvar="ssh hunner@131.252.134.134"
alias kvin="ssh hunner@131.252.135.22"
alias mutt="TERM=xterm-256color mutt"
alias x="exit"
alias v="vagrant"
alias w="cd ~/Documents/work/git"
alias cem="cd ~/Documents/work/git/cem"
alias forge="cd ~/Documents/work/git/forge"
alias ssh-gpg="ssh -R ~/.gnupg/S.gpg-agent.extra:~/.gnupg/S-gpg-agent.extra -o 'StreamLocalBindUnlink=yes'"
alias gpg-add="/usr/libexec/gpg-preset-passphrase"
alias rsync="rsync -azPHe ssh" #-a equals -rlptgoD
alias mang="cd ~/zips/mangband ; DISPLAY=\"\" ./mangclient"
alias nh="export HISTFILE=/dev/null"
#alias cl="co -l"
alias cu="ci -u"
alias sl="screen -ls"
alias sr="screen -r"
alias sx="screen -x"
alias srd="screen -rd"
alias t="TERM=xterm-256color tmux at"
alias tl="tmux ls"
alias ta="tmux at -t"
alias tn="tmux new -s"
alias bc="bc -q"
alias fm="fmstatus.sh&;shell-fm"
alias apl="gvim -font 'APL385 Unicode 14' -c 'set keymap=uniapl385'"
alias d="dtach -a ~/.dtach"
alias wd="dtach -a ~/.dtach-weechat"
alias eo="xmodmap ~/keymaps/eo_dv_hunner.pke"
alias vt="export TERM=vt220"
alias rm=rm; unalias rm #hack
alias be="bundle exec"
alias bi="bundle install"
alias bu="bundle update"
alias jr="JAVA_OPTS='--add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED' jruby --server -J-Xms1g -J-Xmx1g -S "
alias uzbl="uzbl-browser"
alias hide="SetFile -a V"
alias show="SetFile -a v"
base64url::encode () { base64 -w0 | tr '+/' '-_' | tr -d '='; }
base64url::decode () { awk '{ if (length($0) % 4 == 3) print $0"="; else if (length($0) % 4 == 2) print $0"=="; else print $0; }' | tr -- '-_' '+/' | base64 -d; }
jwtio() {
  [ -z "$1" ] && echo "usage: jwtio '<jwt>'" && return 1

  local token="$1"
  local header_b64="${token%%.*}"
  local rest="${token#*.}"
  local payload_b64="${rest%%.*}"
  local signature=""
  [ "$rest" != "$payload_b64" ] && signature="${rest#*.}"

  if [ -z "$header_b64" ] || [ -z "$payload_b64" ]; then
    echo "invalid jwt: expected <header>.<payload>[.<signature>]" >&2
    return 1
  fi

  local header_json payload_json
  header_json=$(print -rn -- "$header_b64" | base64url::decode) || return 1
  payload_json=$(print -rn -- "$payload_b64" | base64url::decode) || return 1

  jq -n \
    --argjson header "$header_json" \
    --argjson payload "$payload_json" \
    --arg signature "$signature" \
    '{header: $header, payload: $payload, signature: $signature}'
}
alias whyfail="tmux copy-mode && tmux send-keys -X search-backward 'FAIL'"
alias m4b-tool='docker run -it --rm -u $(id -u):$(id -g) -v "$(pwd)":/mnt m4b-tool'
alias morserunner="docker-wine --as-me --force-owner --sound=default --cache --volume=/home/hunner/Downloads/morserunner:/data --workdir=/data wine MorseRunner.exe"
alias ry="vim -R +'set ft=yaml'"
alias superscript="tr '+−=()0123456789AaÆᴂɐɑɒBbcɕDdðEeƎəɛɜɜfGgɡɣhHɦIiɪɨᵻɩjJʝɟKklLʟᶅɭMmɱNnɴɲɳŋOoɔᴖᴗɵȢPpɸrRɹɻʁsʂʃTtƫUuᴜᴝʉɥɯɰʊvVʋʌwWxyzʐʑʒꝯᴥβγδθφχнნʕⵡ' \
                      '⁺⁻⁼⁽⁾⁰¹²³⁴⁵⁶⁷⁸⁹ᴬᵃᴭᵆᵄᵅᶛᴮᵇᶜᶝᴰᵈᶞᴱᵉᴲᵊᵋᶟᵌᶠᴳᵍᶢˠʰᴴʱᴵⁱᶦᶤᶧᶥʲᴶᶨᶡᴷᵏˡᴸᶫᶪᶩᴹᵐᶬᴺⁿᶰᶮᶯᵑᴼᵒᵓᵔᵕᶱᴽᴾᵖᶲʳᴿʴʵʶˢᶳᶴᵀᵗᶵᵁᵘᶸᵙᶶᶣᵚᶭᶷᵛⱽᶹᶺʷᵂˣʸᶻᶼᶽᶾꝰᵜᵝᵞᵟᶿᵠᵡᵸჼˤⵯ';"
alias resize="printf '\33]50;%s%d\007' 'xft:DroidSansMonoDotted:pixelsize=' $1" # ':antialias=true'"
alias amp="npx @sourcegraph/amp@latest"
#alias asdf="xkbcomp -w0 ~/keymaps/xkb/hunner.xkb $DISPLAY"
alias asdfg="setxkbmap us dvorak ctrl:nocaps"
kinesis_activate() {
  xmodmap -e "keycode 124 = NoSymbol Insert"
  xmodmap -e "keycode 62 = Scroll_Lock Scroll_Lock"
  xmodmap -e "keycode 37 = Control_R Control_R"
  xset r rate 220 32
}
leopold_activate() {
  kinesis_activate
  remote_ids=($(xinput list | sed -n 's/.*Cypress.*id=\([0-9]*\).*keyboard.*/\1/p'))
  if [ "$remote_ids" ] ; then
#    mkdir -p /tmp/xkb/symbols
#    cat > /tmp/xkb/symbols/custom <<EOF
#xkb_symbols "leopold" {
#  key <LALT> { [ Super_L       ] };
#  key <LWIN> { [ Alt_L, Meta_L ] };
#  key <RALT> { [ Super_R       ] };
#  key <RWIN> { [ Alt_R, Meta_R ] };
#};
#EOF
    for remote_id in $remote_ids ; do
      echo Setting $remote_id
      setxkbmap -device $remote_id us dvorak ctrl:nocaps altwin:swap_lalt_lwin
#      setxkbmap -device $remote_id -print | sed 's/\(xkb_symbols.*\)"/\1+custom(leopold)"/' | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null
    done
  fi
}
alias auie="xkbcomp -w0 ~/keymaps/xkb/hunner.xkb $DISPLAY"
alias aoeu='setxkbmap us'
alias bepo='setxkbmap fr bepo "ctrl:swapcaps"'
alias notes='vi ~/Dropbox/Notes/vim*'
alias 256colors='(x=`tput op` y=`printf %80s`;for i in {0..256};do o=00$i;echo -e ${o:${#o}-3:3} `tput setaf $i;tput setab $i`${y// /=}$x;done)'
alias hibernateon='sudo pmset -a hibernatemode 25'
alias hibernateoff='sudo pmset -a hibernatemode 3'
alias hibernate='pmset -g|grep hibernatemode'
type7() {
    if [ `uname -s` = "SunOS" ] ; then
        xmodmap ~/keymaps/eo_dv_hunner_type7_sol.pke
    else
        xmodmap ~/keymaps/nu_type7.pke
    fi
}
zpush() {
    for host in $zshhosts ; do
        files=(.zshrc .vim .vimrc)
        if [ x$(hostname) = x$host ] ; then
            continue
        fi
        if [ $(uname) = "Linux" ] ; then
            ping -c1 -W1 ${host#*@} > /dev/null
        else
            ping -c1 -t1 ${host#*@} > /dev/null
        fi
        if [ $status -eq 0 ] ; then
            echo -n "$host: copying"
            for file in $files ; do
                echo -n .
                if ! rsync -azPH $file $host:~ > /dev/null ; then continue 2 ; fi
            done
            echo "done"
            #rsync .zshenv $host:~ > /dev/null
        else
            echo "$host: unpings"
        fi
    done;
}
function r() {
    if [[ -n $TMUX ]]; then
        NEW_SSH_AUTH_SOCK=`tmux showenv|grep '^SSH_AUTH_SOCK'|cut -d = -f 2`
        if [[ -n $NEW_SSH_AUTH_SOCK ]] && [[ -S $NEW_SSH_AUTH_SOCK ]]; then
            SSH_AUTH_SOCK=$NEW_SSH_AUTH_SOCK
        fi
    fi
}
ex () {
    if whence gtar > /dev/null ; then
        TAR=gtar
    else
        TAR=tar
    fi
    if [ -f $1 ] ; then
        case $1 in
            *.tar.bz2)   $TAR xvjf $1  ;;
            *.tar.gz)    $TAR xvzf $1  ;;
            *.tar.xz)    $TAR xvJf $1  ;;
            *.bz2)       bunzip2 $1    ;;
            *.rar)       unrar x $1    ;;
            *.gz)        gunzip $1     ;;
            *.xz)        unxz $1       ;;
            *.tar)       $TAR xvf $1   ;;
            *.tbz2)      $TAR xvjf $1  ;;
            *.tbz)       $TAR xvjf $1  ;;
            *.tgz)       $TAR xvzf $1  ;;
            *.txz)       $TAR xvJf $1  ;;
            *.zip)       unzip $1      ;;
            *.Z)         uncompress $1 ;;
            *.7z)        7z x $1       ;;
            *)           echo "don't know how to extract '$1'..." ;;
        esac
    else
        echo "'$1' is not a valid file!"
    fi
}


# Startup aliases
alias -s pdf="zathura"
alias -s txt="vi"
alias -s flv="mplayer"
alias -s avi="mplayer"
alias -s mkv="mplayer"
alias -s mpg="mplayer"

# stolen from eric0
# if rust stuff is found, use it
RBIN=$HOME/.cargo/bin
if [[ -d $RBIN ]]; then
  [[ -f $RBIN/bat ]] && for f in less more cat ; do
    alias $f=bat;
  done
  [[ -f $RBIN/dua ]] && alias du=dua
  [[ -f $RBIN/rg  ]] && alias grep=rg
  [[ -f $RBIN/exa ]] && alias ls=exa
  [[ -f $RBIN/fd  ]] && alias find=fd
else
  if whence bat > /dev/null ; then
    alias cat=bat
  fi
  if whence exa > /dev/null ; then
    alias ls=exa
  fi
fi

# Vim
if whence nvim > /dev/null ; then
    VIM=nvim
elif whence vim > /dev/null ; then
    VIM=vim
else
    VIM=vi
fi
export VISUAL="$VIM -f"
export EDITOR="$VIM -f"
alias vh="mvim -c 'au VimLeave * maca hide:'"
alias vi=$VIM
alias vim=$VIM
alias vr="$VIM --remote-tab"
alias vl="$VIM --serverlist"
vs() { $VIM --servername $1 --remote-tab $argv[2,$] }
alias vd=${VIM}diff
alias vir=vr
alias vis=vs
alias gvim="gvim -font 'APL385 Unicode 8' -c 'set keymap=uniapl385'"
#alias n=lvim
alias n=nvim
export NVIM_TUI_ENABLE_TRUE_COLOR=1
alias j=just
alias song="yt-dlp -x --audio-format mp3 --audio-quality 0 --embed-thumbnail"


# Emacs
alias eh="echo 'e          -- emacs -nw -- in terminal
eq         -- emacs -nw -q -- no init file
et         -- emacsclient -t -- terminal
ec         -- emacsclient -c -- new frame
ed         -- emacsclient --eval (x-display-list) -- list displays
ecx        -- emacsclient --eval (make-frame-on-display \"$DISPLAY\")'"
alias e="TERM=xterm-256color emacs -nw"
alias eq="e -q"
alias et="TERM=xterm-256color emacsclient -t"
#alias ec="emacsclient -c --eval '(set-background-color \"black\")'"
alias ec="emacsclient -c"
alias ed="emacsclient --alternate-editor '' --eval '(x-display-list)'"
alias ecx="emacsclient --eval '(make-frame-on-display \"$DISPLAY\")'"


# Git
alias gh="echo 'ga <file>     -- git add file
gb            -- git branch
gc            -- git commit
gca           -- git commit --amend
gd            -- git diff
gdc           -- git diff --cached
gdf           -- git diff --stat
gdw           -- git diff --color-words
ge <branch>   -- git checkout branch
geb <branch>  -- git checkout -b branch
gfa           -- git fetch --all --prune
gl            -- git short log
gla           -- git short log all
glf           -- git short log just file names
gp            -- git push
gr            -- git remote -v show
grs <file>    -- git restore --staged file
gs            -- git status
gst           -- git stash
gstp          -- git stash pop
gu            -- git pull'"
#alias git="hub"
alias gs="git status"
alias gl="git lg"
alias gla="git lg --all"
alias glf="git lg --stat"
alias ge="git checkout"
alias gesp="git checkout --patch"
alias geb="git checkout -b"
alias gb="git branch"
alias ga="git add"
alias gasp="git add --patch"
alias gd="git diff"
alias gdc="git diff --cached"
alias gdf="git diff --stat"
alias gc="git commit"
alias gca="git commit --amend"
alias gfa="git fetch --all --prune"
alias gr="git remote -v show"
alias gp="git push"
alias gu="git pull"
alias gst="git stash"
alias gstp="git stash pop"
alias gdw="git diff --color-words"
alias gk="gitk --all&"
alias gx="gitx --all"
alias grs="git restore --staged "

alias dvh="echo 'dvt <lang> -- create a local dev template
dva <lang> -- add a dev template
dvr <lang> -- remove a dev template
dvl        -- list dev templates'
dvs        -- create a dev shell"
function dvt() {
  [ -z $1 ] && echo 'usage: dvt <lang>' && return 1
  [ -f ".envrc" ] && echo "Already using a dev template." && return 1
  nix flake init -t "github:the-nix-way/dev-templates#$1"
  direnv allow
}
function dva() {
  [ -z $1 ] && echo 'usage: dva <lang>' && return 1
  [ -z $(dvl $1) ] && echo "Dev template $1 not found." && return 1
  echo "use flake \"github:the-nix-way/dev-templates?dir=$1\" --no-write-lock-file" >> .envrc
  direnv allow
}
function dvr() {
  [ -z $1 ] && echo 'usage: dvr <lang>' && return 1
  [ ! -f ".envrc" ] && echo "No dev template found." && return 1
  if ! grep -q "github:the-nix-way/dev-templates?dir=$1" .envrc; then
    echo "Dev template $1 not found." && return 1
  fi
  sed -i "/use flake \"github:the-nix-way\/dev-templates?dir=$1\" --no-write-lock-file/d" .envrc
  direnv allow
}
function dve() {
  if [ -f ".envrc" ]; then
    grep -o 'github:the-nix-way/dev-templates?dir=[^"]*' .envrc | sed 's/github:the-nix-way\/dev-templates?dir=//g'
  fi
}
function dvl() {
  local enabled_templates=()
  if [ -f ".envrc" ]; then
    enabled_templates=($(grep -o 'github:the-nix-way/dev-templates?dir=[^"]*' .envrc | sed 's/github:the-nix-way\/dev-templates?dir=//g'))
  fi

  local templates
  templates=$(curl -s https://api.github.com/repos/the-nix-way/dev-templates/contents | \
    jq -r '.[] | select(.type == "dir") | select(.name != ".github") | .name')

  if [ -z "$1" ]; then
    echo "$templates" | while read -r template; do
      [[ " ${enabled_templates[*]} " == *" $template "* ]] && echo "* $template" || echo "  $template"
    done
  else
    echo "$templates" | grep -x "$1"
  fi
}
function dvs() {
  if [ -f "shell.nix" -o -f ".envrc" ]; then
    echo "Dev shell already exists"
    return 1
  fi
  echo "use nix" > .envrc
  cat > shell.nix <<EOF
let
  pkgs = import <nixpkgs> { config.allowUnfree = true; };
  #unstable = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixpkgs-unstable.tar.gz") { 
  #  config.allowUnfree = true;
  #};
in pkgs.mkShell {
  packages = with pkgs; [
  ];
}
EOF
  direnv allow
}

# Docker
#alias docker="podman"
alias d="docker"
alias dh="echo 'dl                       -- list containers
da [container] [command] -- attach to running container
dr <image> [command]     -- run an image
drm <image>              -- remove a containers
drma                     -- remove all containers
drmf                     -- force remove all containers'"
alias drm="docker rm"
alias drma="docker rm \$(docker ps -qa)"
alias drmf="docker rm -f \$(docker ps -qa)"
alias dl="docker ps -a"
function da() {
  container_id=$1 && [ -z $1 ] && container_id=$(docker ps -qa | head -n 1)
  [ -z "$container_id" ] && echo "No running container found to attach." && return 1
  shift
  [ -z "$1" ] && set -- bash
  docker exec -it $container_id $@
}
function dr() {
  [ -z $1 ] && echo 'usage: dr <image> [command]' && return 1
  cmd=$2 && [ -z $2 ] && cmd="/bin/bash"
  docker run -it --rm $1 $cmd ${@:3}
}
alias d-c="docker-compose"

# Terraform
alias tfh="echo 'tf  -- terraform
tfw -- terraform workspace 
tfp -- terraform plan
tfs -- terraform state'"
alias tf="terraform"
alias tfw="terraform workspace"
alias tfp="terraform plan"
alias tfs="terraform state"


# K8s
alias kubectl="kubectl --context \${KUBE_CONTEXT:-\$(command kubectl config current-context 2>/dev/null)}"
alias kh="echo 'k               -- kubectl
kg <obj>        -- kubectl get obj
kgp <pod>       -- kubectl get pod
kgj <obj>       -- kubectl get obj in json
kgs <secret> <name> -- kubectl get secret by name
kd <obj>        -- kubectl describe obj
kga             -- kubectl get all
kgan            -- kubectl get all in all namespaces
kxl             -- list contexts
knl             -- list namespaces
kx <context>    -- switch context ...
kxs <context>   -- set \$KUBE_CONTEXT
kn <namespace>  -- switch namespace ...
klf <pod>       -- follow logs
klfj <pod>      -- follow logs with json formatting
kat <pod> [cmd] -- attach and run cmd in pod
ks [image] [cmd -- start a new temporary pod'"
alias k="kubectl"
alias kg="kubectl get --show-kind"
alias kgp="kubectl get pod --show-kind"
function kgs() {
  [ -z $1 ] && echo 'usage: kgs <secret> <name>' && return 1
  kubectl get secret $1 -o jsonpath="{.data.$2}" | base64url::decode
}
function kgj() { kubectl get -o json $@ | jq . | bat -pl json }
function kd() { kubectl describe ${1} | bat -pl yaml }
alias kga="kubectl get all"
alias kgan="kubectl --all-namespaces=true get all"
alias kxl="kubectl config get-contexts"
alias knl="kubectl get namespaces"
alias kx="kubectl config use-context"
function kxs() { export KUBE_CONTEXT="${1}" }
alias kn="kubectl config set-context --current --namespace"
alias klf="kubectl logs -f "
function klfj() {
  [ -z $1 ] && echo 'usage: klfj <pod>' && return 1
  kubectl logs -f $@ | bat -ppl json
}
function kat() {
  [ -z $1 ] && echo 'usage: kat <pod> [cmd]' && return 1
  cmd=$2 && [ -z $2 ] && cmd="/bin/sh"
  kubectl exec --stdin --tty $1 -- $cmd ${@:3}
}
function ks() {
  kubectl run my-shell --rm -i --tty --image ${1:-alpine} -- ${2:-sh}
}
#alias im='eval $(minikube docker-env)'
alias rdk="relay dev kubectl"
alias openapi="echo 'Serving ReDoc at http://localhost:8080' && docker run -it --rm -p 8080:80 -v ~/src/relay-api/openapi/latest.yaml:/usr/share/nginx/html/latest.yaml -e SPEC_URL=latest.yaml redocly/redoc"


# Pathing
export GO_DEV_ROOT="${DEV_ROOT}/go/src/github.com/puppetlabs"
alias gor="cd $GO_DEV_ROOT"
alias rapi="cd $GO_DEV_ROOT/relay-api"
alias rui="cd $GO_DEV_ROOT/relay-ui"
alias rcli="cd $GO_DEV_ROOT/relay"
alias djm="cd $DEV_ROOT/DistelliJavaModels"
alias k8s="cd $DEV_ROOT/K8SDashboard"
alias pwf="cd $DEV_ROOT/pfc-web-framework"
alias pvs="cd $DEV_ROOT/pipelines-version-set"
alias pfc="cd $DEV_ROOT/PipelinesForContainers"
alias apm="cd $DEV_ROOT/AppPipelineManager"
alias aem="cd $DEV_ROOT/AppEventsManager"
alias dwu="cd $DEV_ROOT/DistelliWebUi"
alias pac="cd $DEV_ROOT/PipelinesAsCode"
alias hm="cd $DEV_ROOT/HelmManager"
