Dot_Files/.profile

510 lines
14 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 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 <type: string> <position: 1> <required: true>
# - The message to be printed to stdout
# red <type: int> <position: 2> <required: true>
# - The red value from 0 to 255
# green <type: int> <position: 3> <required: true>
# - The green value from 0 to 255
# blue <type: int> <position: 4> <required: true>
# - The blue value from 0 to 255
# bg_red <type: int> <position: 5> <required: false>
# - The background red value from 0 to 255
# bg_green <type: int> <position: 6> <required: false>
# - The background green value from 0 to 255
# bg_blue <type: int> <position: 7> <required: false>
# - 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" ")"
}
### FZF FUNCTIONS ###
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}' "$@"
}
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"