#!/bin/bash ### Opts ### ulimit -n 10000 # Allows for more open files # shellcheck source=./.zstyle source ~/.zstyle . "$HOME/.cargo/env" ### Pathing ### export PATH="$HOME/.bin:$PATH" export PATH="$PATH:/opt/homebrew/Cellar/llvm/13.0.0_2/bin" # Python with pyenv export PYENV_ROOT="${HOME}/.pyenv" export PATH="${PATH}:${PYENV_ROOT}/bin" eval "$(pyenv init -)" # Mac pathing beneath if [[ "$OSTYPE" = "darwin"* ]]; then export PATH="/opt/homebrew/opt/coreutils/libexec/gnubin:$PATH" export PATH="/opt/homebrew/opt/gnu-sed/libexec/gnubin:$PATH" export PATH="/Applications/Firefox Developer Edition.app/Contents/MacOS:$PATH" export PATH="$HOME/.rustup/toolchains/stable-aarch64-apple-darwin/bin:$PATH" export MANPATH="/opt/homebrew/opt/coreutils/libexec/gnuman:$MANPATH" complete -o nospace -C /opt/homebrew/bin/terraform terraform # LLDB export PATH="/opt/homebrew/opt/llvm/bin:$PATH" fi ### OPTS ### setopt extendedglob setopt nullglob ### Environment Variables ### export LANG=en_US.UTF-8 if [[ -f "/usr/libexec/java_home" ]]; then export JAVA_HOME="$(/usr/libexec/java_home)" fi export AWS_CLI_AUTO_PROMPT=on export ZSH_HIGHLIGHT_MAXLENGTH=10000 export ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=2 export LANG=en_US.UTF-8 export NOTES_DIR="$HOME/.notes" export DOCKER_BUILDKIT=1 # Fzf Variables export FZF_DEFAULT_COMMAND='fd --hidden --exclude .git --color=always' export FZF_DEFAULT_OPTS="--height=80% --layout=reverse --info=inline --border --margin=1 --padding=1 --ansi" export FZF_CTRL_T_COMMAND="${FZF_DEFAULT_COMMAND}" # Gitlab export GITLAB_HOST="https://gitlab.orion-technologies.io" if command -v nvim >/dev/null 2>&1; then export EDITOR=nvim export VISUAL=nvim export MANPAGER="nvim +Man!" elif command -v vim >/dev/null 2>&1; then export EDITOR=vim export VISUAL=vim else export EDITOR=vi export VISUAL=less fi ### Terminal Specific Configuration ### # If using the kitty terminal we want to set our TERM var to be xterm as kitty will send # kitty-xterm which causes a fucking headache and a half due to ncurses not containing # that by default if [[ "$TERM" = *"xterm-kitty"* ]]; then alias ssh="TERM=xterm-256color ssh" alias icat="kitty +kitten icat" __kitty_complete fi if [[ "${TERM}" = "wezterm" ]]; then alias ssh="TERM=xterm-256color ssh" fi ### Zsh Vi-Mode Configuration ### # Makes the cursor change based on the mode export VI_MODE_SET_CURSOR=true # Set the editor to neovim for visual mode export ZVM_VI_EDITOR="$EDITOR" # This ensures that fzf completion works zvm_after_init_commands+=('[[ -r ~/.fzf.zsh ]] && source ~/.fzf.zsh') ### Aliases ### ## Exa ls Replacement Configuration ## if command -v exa >/dev/null 2>&1; then alias ls="exa --icons --group --group-directories-first --octal-permissions" alias l="ls -alh" alias ll="l" alias tree="ls --tree" fi ## Git Aliases ## if command -v git >/dev/null 2>&1; then alias gc="git commit" alias gcm="git commit -m" alias ga="git add" alias gp="git push" alias gb="git branch" alias gco="git checkout" alias gpl="git pull" alias gs="git status" alias gst="git stash" alias gstc="git stash clear" alias gsw="git switch" alias gd="git diff" alias gr="git remote" alias gl="git log" alias gw="git worktree" alias gwa="git worktree add" alias gwr="git worktree remove" alias git-remote="git config --get remote.origin.url" alias gbc="git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'" fi gbf() { local remote local default_branch remote="${1:=origin}" default_branch="$(git remote show "$remote" | awk '/HEAD branch/ {print $NF}')" git fetch "$remote" "$default_branch":"$default_branch" } ## Mac Specific Aliases ## if [[ "$OSTYPE" = "darwin"* ]]; then alias c="pbcopy" alias p="pbpaste" alias grep="ggrep" alias find="gfind" alias kill="gkill" alias sed="gsed" fi ## Neovim Aliases ## if command -v nvim >/dev/null 2>&1; then alias n="nvim" fi ## Bat (Alternative to Cat) Aliases ## if command -v bat >/dev/null 2>&1; then alias cat="bat" fi ## Misc Aliases ## alias e="$EDITOR" alias ghidra="ghidraRun" alias v="vim" alias :q="exit" alias Get-Public-IPV4="dig @resolver4.opendns.com myip.opendns.com +short -4" alias Get-Public-IPV6="dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6" alias :profile="$EDITOR $HOME/.profile" ### Completions ### _import_custom_bash_completions() { local custom_comps=( "az" ) for file in "${custom_comps[@]}"; do source "${HOMEBREW_PREFIX}/etc/bash_completion.d/${file}" done } # Homebrew completions if type brew &>/dev/null; then # Zsh FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}" _import_custom_bash_completions autoload -Uz compinit compinit fi # Completions from .zsh directory if [[ -d "$HOME/.zsh/completions" ]]; then FPATH="$HOME/.zsh/completions:${FPATH}" autoload -Uz compinit compinit fi ### Functions ### del() { local BASE_TRASH_DIR BASE_TRASH_DIR="$HOME/.Trash/" local trash_del_dir trash_del_dir="$BASE_TRASH_DIR/del-$(date +%Y-%m-%dT%H:%M:%S)" mkdir -p "$trash_del_dir" for i in "${@}"; do mv "$i" "$trash_del_dir" done } DAP-Python-Gen() { local module module="${1}" name="${2:=Local Module}" mkdir -p .vscode cat <<__EOF__ >.vscode/launch.json { "configurations": [ { "name": "Launch ${name}", "type": "python", "request": "launch", "module": "${module}" } ] } __EOF__ } TCPDump-Capture() { tcpdump -qns 0 -X -r "${1}" } Known-Hosts() { local prev_ifs prev_ifs="$IFS" while IFS=$'\n' read -r line; do echo "$line" | cut -d " " -f1 done <~/.ssh/known_hosts IFS="$prev_ifs" } Work-Hours() { local WORK_HOURS_PATH WORK_HOURS_PATH=~/Vircio/Work-Hours mkdir -p "$WORK_HOURS_PATH" "$EDITOR" "$WORK_HOURS_PATH/$(date +%Y-%m-%d)" } date_iso_8601() { date +%Y-%m-%dT%H:%M:%S } echo_rgb() { # Echo a colored string to the terminal based on rgb values # # NOTE: This function will only truly work with terminals that support TRUE COLOR, see: # https://gist.github.com/XVilka/8346728 # # Positional Arguments: # # message # - The message to be printed to stdout # red # - The red value from 0 to 255 # green # - The green value from 0 to 255 # blue # - The blue value from 0 to 255 # bg_red # - The background red value from 0 to 255 # bg_green # - The background green value from 0 to 255 # bg_blue # - The background blue value from 0 to 255 # # Usage: # echo_rgb "Yep" 10 80 30 # echo_rgb "DESTROY MY EYES" 255 0 255 0 255 0 # # POSIX Compliant: # N/A # local red local green local blue local input local bg_red local bg_green local bg_blue input="${1}" red="${2}" green="${3}" blue="${4}" bg_red="${5}" bg_green="${6}" bg_blue="${7}" for num in "${@:2}"; do [[ ! "$num" =~ [0-9] ]] && printf "%s\n" "Given RGB value was not a number, received $num" 1>&2 && return 1 [[ "$num" -gt 255 ]] && printf "%s\n" "Given RGB value must be less than 255, received $num" 1>&2 && return 1 [[ "$num" -lt 0 ]] && printf "%s\n" "Given RGB value must be more than 0, received $num" 1>&2 && return 1 done if [ -t 1 ]; then if [ "${5}" != "" ]; then [[ -z "${6}" ]] && echo "A value must be passed for bg_green" && return 1 [[ -z "${7}" ]] && echo "A value must be passed for bg_blue" && return 1 printf "\033[38;2;%s;%s;%s;48;2;%s;%s;%sm%s\033[m\n" \ "$red" "$green" "$blue" "$bg_red" "$bg_green" "$bg_blue" "$input" else printf "\033[0;38;2;%s;%s;%sm%s\033[m\n" "$red" "$green" "$blue" "$input" fi else printf "%s\n" "$input" fi } chr() { python3 -c "print(chr(int('${1}')))" } ord() { python3 -c "print(ord('${1}'))" } tmp() { ( export MY_SHLVL=tmp:$MY_SHLVL export od=$PWD tmp=$(mktemp -d) export tmp trap 'rm -rf ${tmp}' 0 if ! cd "$tmp"; then printf "%s \"%s\"\n" "Unable to cd into" "$tmp" exit 1 fi if [ "$1" = "" ]; then "$SHELL" -l else [ "$1" = "-l" ] && { shift set "${@}" ";" "$SHELL -l" } eval "${@}" fi ) } cdl() { if [[ -f "${1}" ]]; then cd "$(dirname "$(readlink -f "${1}")")" else echo_rgb "No such file: ${1}" 255 0 0 30 0 0 fi } nvim_env() { # If using ZSH uncomment the line below, requires emulate emulate -L ksh local nvim_env local nvim_env_path local nvim_env_full_path nvim_env="${1:-nvim-primary}" nvim_env_path="$HOME/nvim-environments" nvim_env_full_path="$nvim_env_path/$nvim_env" declare -A nvim_syml_paths=(["$HOME/.config/nvim"]="$nvim_env_full_path/config" ["$HOME/.local/share/nvim"]="$nvim_env_full_path/share") # Check that the given environment exists if [[ ! -d "$nvim_env_full_path" ]]; then printf "Error: Unable to locate environment, \"%s\"\n\t\"%s\"\n" "$nvim_env" "$nvim_env_full_path" >&2 return 1 fi local symlink_src local symlink_dst for syml_key in "${!nvim_syml_paths[@]}"; do symlink_src="${nvim_syml_paths[$syml_key]}" symlink_dst="$syml_key" # Check that the configuration path exist from our env if [[ ! -d "$symlink_src" ]]; then printf "ERROR: Unable to find configuration:\n\t\"%s\" in environment \"%s\"\n\tConsider creating it with \"mkdir -p %s\"\n" "$symlink_src" "$nvim_env" "$symlink_src" >&2 return 1 fi # If a directory (not a symlink) exists in where we want to write a symlink refuse to overwrite if [[ -r "$symlink_dst" ]] && [[ ! -L "$symlink_dst" ]]; then printf "ERROR: Neovim configuration to be replaced is not a symlink, please remove the files before proceeding, issue file:\n\t\"%s\"\n" "$symlink_dst" >&2 return 1 fi # If we find an existing symlink, try to delete it if [[ -L "$symlink_dst" ]]; then local linked_sym linked_sym="$(readlink "$symlink_dst")" printf "Attemping to remove symlink:\n\t%s -> %s\n" "$linked_sym" "$symlink_dst" if ! rm "$symlink_dst"; then printf "ERROR: Failed to remove symlink:\n\t%s -> %s\n" "$linked_sym" "$symlink_dst" >&2 return 1 else printf "Successfully removed symlink:\n\t%s -> %s\n" "$linked_sym" "$symlink_dst" fi fi # Actually write the env now we're past our guards printf "Linking:\n\t%s -> %s\n" "$symlink_src" "$symlink_dst" if ! ln -s "$symlink_src" "$symlink_dst"; then printf "ERROR: Failed to link:\n\t%s -> %s\n" "$symlink_src" "$symlink_dst" >&2 return 1 else printf "Successfully linked:\n\t%s -> %s\n" "$symlink_src" "$symlink_dst" fi printf "%.s-" "$(seq 1 "$(tput cols)")" printf "\n" done } ### Used to open firefox from terminal with search ### browser_search() { local browser local search_term browser="firefox" search_term="${*}" eval "$browser -search \"$search_term\"" } ### Search Aliases ### if command -v browser_search >/dev/null 2>&1; then alias s="browser_search" if ! which search >/dev/null 2>&1; then alias search="browser_search" fi fi watcher() { local command local sleep_time local exit_code command="${1}" sleep_time="${2:-5}" while :; do clear printf "%s | %s | %s\n" "Command: \"$command\"" "Every $sleep_time seconds" "$(date)" printf "%*s\n" "${COLUMNS:-$(tput cols)}" "" | tr " " - eval "$command" exit_code="${?}" if ((exit_code != 0)); then break fi sleep "$sleep_time" done return "$((exit_code))" } update_cargo_crates() { cargo install "$(cargo install --list | grep -E '^[a-z0-9_-]+ v[0-9.]+:$' | cut -f1 -d" ")" } wgrep() { local selection read -r selection < =(rg --color=always --line-number --no-heading --smart-case "${*:-}" | fzf --ansi \ --color "hl:-1:underline,hl+:-1:underline:reverse" \ --delimiter : \ --preview 'bat --color=always {1} --highlight-line {2}' \ --preview-window 'up,60%,border-bottom,+{2}+3/3,~3') # This crazy shit handles egde cases of files having colons (:) in them selection=$(rev <<< $selection | cut -d ':' -f 3- | rev) if [[ -n "${selection}" ]]; then [[ -r "${selection}" ]] && "${EDITOR}" "${selection}" || echo_rgb "Cannot open ${selection}" 255 0 0 80 0 0 fi } pods() { FZF_DEFAULT_COMMAND="kubectl get pods --all-namespaces" \ fzf --info=inline --layout=reverse --header-lines=1 \ --prompt "$(kubectl config current-context | sed 's/-context$//')> " \ --header $'╱ Enter (kubectl exec) ╱ CTRL-O (open log in editor) ╱ CTRL-R (reload) ╱\n\n' \ --bind 'ctrl-/:change-preview-window(80%,border-bottom|hidden|)' \ --bind 'enter:execute:kubectl exec -it --namespace {1} {2} -- bash > /dev/tty' \ --bind 'ctrl-o:execute:${EDITOR:-vim} <(kubectl logs --all-containers --namespace {1} {2}) > /dev/tty' \ --bind 'ctrl-r:reload:$FZF_DEFAULT_COMMAND' \ --preview-window up:follow \ --preview 'kubectl logs --follow --all-containers --tail=10000 --namespace {1} {2}' "$@" } ### FZF FUNCTIONS ### killer() { ( date ps -ef ) | fzf --bind='ctrl-r:reload(date; ps -ef)' \ --header=$'Press CTRL-R to reload\n\n' --header-lines=2 \ --preview='echo {}' --preview-window=down,3,wrap \ --layout=reverse --height=80% | awk '{print $2}' | xargs kill -"${1:-9}" } . "$HOME/.cargo/env"