#!/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" # 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 # Python with pyenv eval "$(pyenv init --path)" eval "$(pyenv init -)" # 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_OPTS="--height=80% --layout=reverse --info=inline --border --margin=1 --padding=1" if which nvim >/dev/null 2>&1; then export EDITOR=nvim export VISUAL=nvim export MANPAGER="nvim +Man!" elif which 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 ### 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 which 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 which 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 which nvim >/dev/null 2>&1; then alias n="nvim" fi ## Bat (Alternative to Cat) Aliases ## if which 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 ### # Homebrew completions if type brew &>/dev/null; then FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}" 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 [ -n "${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 [ -z "$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 which 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))" } ### 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"